sonamu 0.7.53 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/dist/api/config.d.ts +9 -1
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +21 -1
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +159 -65
  7. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +10 -0
  8. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -0
  9. package/dist/auth/plugins/entity-definitions/anonymous.js +23 -0
  10. package/dist/auth/plugins/entity-definitions/api-key.d.ts +9 -0
  11. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -0
  12. package/dist/auth/plugins/entity-definitions/api-key.js +199 -0
  13. package/dist/auth/plugins/entity-definitions/index.d.ts +6 -0
  14. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  15. package/dist/auth/plugins/entity-definitions/index.js +20 -2
  16. package/dist/auth/plugins/entity-definitions/jwt.d.ts +9 -0
  17. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -0
  18. package/dist/auth/plugins/entity-definitions/jwt.js +67 -0
  19. package/dist/auth/plugins/entity-definitions/organization.d.ts +9 -0
  20. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -0
  21. package/dist/auth/plugins/entity-definitions/organization.js +424 -0
  22. package/dist/auth/plugins/entity-definitions/passkey.d.ts +10 -0
  23. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -0
  24. package/dist/auth/plugins/entity-definitions/passkey.js +129 -0
  25. package/dist/auth/plugins/entity-definitions/sso.d.ts +10 -0
  26. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -0
  27. package/dist/auth/plugins/entity-definitions/sso.js +110 -0
  28. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  29. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  30. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  31. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  32. package/dist/auth/plugins/wrappers/admin.js +2 -4
  33. package/dist/auth/plugins/wrappers/anonymous.d.ts +18 -0
  34. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -0
  35. package/dist/auth/plugins/wrappers/anonymous.js +26 -0
  36. package/dist/auth/plugins/wrappers/api-key.d.ts +18 -0
  37. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -0
  38. package/dist/auth/plugins/wrappers/api-key.js +38 -0
  39. package/dist/auth/plugins/wrappers/index.d.ts +6 -0
  40. package/dist/auth/plugins/wrappers/index.d.ts.map +1 -1
  41. package/dist/auth/plugins/wrappers/index.js +7 -1
  42. package/dist/auth/plugins/wrappers/jwt.d.ts +18 -0
  43. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -0
  44. package/dist/auth/plugins/wrappers/jwt.js +30 -0
  45. package/dist/auth/plugins/wrappers/organization.d.ts +18 -0
  46. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -0
  47. package/dist/auth/plugins/wrappers/organization.js +67 -0
  48. package/dist/auth/plugins/wrappers/passkey.d.ts +18 -0
  49. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -0
  50. package/dist/auth/plugins/wrappers/passkey.js +32 -0
  51. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  52. package/dist/auth/plugins/wrappers/phone-number.js +2 -4
  53. package/dist/auth/plugins/wrappers/sso.d.ts +853 -0
  54. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -0
  55. package/dist/auth/plugins/wrappers/sso.js +36 -0
  56. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  57. package/dist/auth/plugins/wrappers/two-factor.js +2 -4
  58. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  59. package/dist/auth/plugins/wrappers/username.js +2 -4
  60. package/dist/bin/build-config.d.ts +2 -2
  61. package/dist/bin/build-config.js +6 -7
  62. package/dist/bin/cli.js +417 -32
  63. package/dist/bin/fixture.d.ts +27 -0
  64. package/dist/bin/fixture.d.ts.map +1 -0
  65. package/dist/bin/fixture.js +245 -0
  66. package/dist/cache/decorator.d.ts +4 -3
  67. package/dist/cache/decorator.d.ts.map +1 -1
  68. package/dist/cache/decorator.js +5 -4
  69. package/dist/cone/cone-generator.d.ts +33 -0
  70. package/dist/cone/cone-generator.d.ts.map +1 -0
  71. package/dist/cone/cone-generator.js +286 -0
  72. package/dist/database/_batch_update.d.ts.map +1 -1
  73. package/dist/database/_batch_update.js +16 -2
  74. package/dist/database/puri-subset.test-d.js +1 -1
  75. package/dist/database/puri-subset.types.d.ts +1 -1
  76. package/dist/database/puri-subset.types.d.ts.map +1 -1
  77. package/dist/database/puri-subset.types.js +1 -1
  78. package/dist/database/puri.d.ts +4 -0
  79. package/dist/database/puri.d.ts.map +1 -1
  80. package/dist/database/puri.js +20 -2
  81. package/dist/database/upsert-builder.d.ts.map +1 -1
  82. package/dist/database/upsert-builder.js +19 -3
  83. package/dist/dict/en.d.ts +15 -0
  84. package/dist/dict/en.d.ts.map +1 -1
  85. package/dist/dict/en.js +2 -1
  86. package/dist/dict/ko.d.ts +15 -0
  87. package/dist/dict/ko.d.ts.map +1 -1
  88. package/dist/dict/ko.js +2 -1
  89. package/dist/dict/rc-keys.d.ts +28 -0
  90. package/dist/dict/rc-keys.d.ts.map +1 -1
  91. package/dist/dict/rc-keys.js +31 -1
  92. package/dist/dict/sd.d.ts.map +1 -1
  93. package/dist/dict/sd.js +20 -4
  94. package/dist/entity/entity-manager.d.ts +298 -2
  95. package/dist/entity/entity-manager.d.ts.map +1 -1
  96. package/dist/entity/entity-manager.js +4 -1
  97. package/dist/entity/entity-template-cone.d.ts +14 -0
  98. package/dist/entity/entity-template-cone.d.ts.map +1 -0
  99. package/dist/entity/entity-template-cone.js +222 -0
  100. package/dist/entity/entity.d.ts +47 -2
  101. package/dist/entity/entity.d.ts.map +1 -1
  102. package/dist/entity/entity.js +161 -14
  103. package/dist/ssr/renderer.js +3 -3
  104. package/dist/syncer/api-parser.js +12 -1
  105. package/dist/syncer/checksum.d.ts +0 -14
  106. package/dist/syncer/checksum.d.ts.map +1 -1
  107. package/dist/syncer/checksum.js +1 -23
  108. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  109. package/dist/syncer/syncer-actions.js +8 -2
  110. package/dist/syncer/syncer.d.ts +1 -1
  111. package/dist/syncer/syncer.d.ts.map +1 -1
  112. package/dist/syncer/syncer.js +17 -10
  113. package/dist/tasks/workflow-manager.d.ts +13 -1
  114. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  115. package/dist/tasks/workflow-manager.js +18 -1
  116. package/dist/template/entity-converter.js +4 -4
  117. package/dist/template/helpers.d.ts +10 -0
  118. package/dist/template/helpers.d.ts.map +1 -1
  119. package/dist/template/helpers.js +48 -1
  120. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  121. package/dist/template/implementations/entry-server.template.js +7 -2
  122. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  123. package/dist/template/implementations/generated.template.js +5 -1
  124. package/dist/template/implementations/generated_http.template.d.ts +1 -0
  125. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  126. package/dist/template/implementations/generated_http.template.js +6 -2
  127. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  128. package/dist/template/implementations/generated_sso.template.js +29 -8
  129. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  130. package/dist/template/implementations/queries.template.js +9 -1
  131. package/dist/template/implementations/sd.template.d.ts +1 -1
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +28 -4
  134. package/dist/template/implementations/services.template.d.ts.map +1 -1
  135. package/dist/template/implementations/services.template.js +12 -12
  136. package/dist/template/implementations/view_form.template.d.ts +11 -7
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_form.template.js +97 -87
  139. package/dist/template/implementations/view_list.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  141. package/dist/template/implementations/view_list.template.js +115 -109
  142. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  143. package/dist/template/implementations/view_search_input.template.js +18 -14
  144. package/dist/template/zod-converter.d.ts.map +1 -1
  145. package/dist/template/zod-converter.js +95 -7
  146. package/dist/testing/_relation-graph.js +1 -1
  147. package/dist/testing/data-explorer.d.ts +61 -0
  148. package/dist/testing/data-explorer.d.ts.map +1 -0
  149. package/dist/testing/data-explorer.js +274 -0
  150. package/dist/testing/faker-mappings.d.ts +20 -0
  151. package/dist/testing/faker-mappings.d.ts.map +1 -0
  152. package/dist/testing/faker-mappings.js +421 -0
  153. package/dist/testing/fixture-generator.d.ts +161 -0
  154. package/dist/testing/fixture-generator.d.ts.map +1 -0
  155. package/dist/testing/fixture-generator.js +954 -0
  156. package/dist/testing/fixture-manager.d.ts +6 -1
  157. package/dist/testing/fixture-manager.d.ts.map +1 -1
  158. package/dist/testing/fixture-manager.js +72 -4
  159. package/dist/testing/index.d.ts +3 -0
  160. package/dist/testing/index.d.ts.map +1 -1
  161. package/dist/testing/index.js +4 -1
  162. package/dist/types/types.d.ts +1520 -26
  163. package/dist/types/types.d.ts.map +1 -1
  164. package/dist/types/types.js +136 -22
  165. package/dist/ui/ai-client.d.ts.map +1 -1
  166. package/dist/ui/ai-client.js +9 -4
  167. package/dist/ui/api.d.ts.map +1 -1
  168. package/dist/ui/api.js +303 -24
  169. package/dist/ui-web/assets/index-CsUr-_pV.js +254 -0
  170. package/dist/ui-web/assets/index-T42zzs1K.css +1 -0
  171. package/dist/ui-web/index.html +2 -2
  172. package/dist/utils/fs-utils.d.ts +2 -1
  173. package/dist/utils/fs-utils.d.ts.map +1 -1
  174. package/dist/utils/fs-utils.js +14 -3
  175. package/package.json +19 -11
  176. package/src/api/config.ts +12 -1
  177. package/src/api/sonamu.ts +179 -65
  178. package/src/auth/plugins/entity-definitions/anonymous.ts +17 -0
  179. package/src/auth/plugins/entity-definitions/api-key.ts +93 -0
  180. package/src/auth/plugins/entity-definitions/index.ts +18 -0
  181. package/src/auth/plugins/entity-definitions/jwt.ts +35 -0
  182. package/src/auth/plugins/entity-definitions/organization.ts +215 -0
  183. package/src/auth/plugins/entity-definitions/passkey.ts +64 -0
  184. package/src/auth/plugins/entity-definitions/sso.ts +62 -0
  185. package/src/auth/plugins/entity-definitions/types.ts +11 -1
  186. package/src/auth/plugins/wrappers/admin.ts +1 -3
  187. package/src/auth/plugins/wrappers/anonymous.ts +30 -0
  188. package/src/auth/plugins/wrappers/api-key.ts +42 -0
  189. package/src/auth/plugins/wrappers/index.ts +6 -0
  190. package/src/auth/plugins/wrappers/jwt.ts +34 -0
  191. package/src/auth/plugins/wrappers/organization.ts +73 -0
  192. package/src/auth/plugins/wrappers/passkey.ts +36 -0
  193. package/src/auth/plugins/wrappers/phone-number.ts +1 -3
  194. package/src/auth/plugins/wrappers/sso.ts +40 -0
  195. package/src/auth/plugins/wrappers/two-factor.ts +1 -3
  196. package/src/auth/plugins/wrappers/username.ts +1 -3
  197. package/src/bin/build-config.ts +6 -6
  198. package/src/bin/cli.ts +452 -31
  199. package/src/bin/fixture.ts +302 -0
  200. package/src/cache/decorator.ts +4 -3
  201. package/src/cone/cone-generator.ts +363 -0
  202. package/src/database/_batch_update.ts +11 -0
  203. package/src/database/puri-subset.test-d.ts +13 -13
  204. package/src/database/puri-subset.types.ts +1 -1
  205. package/src/database/puri.ts +43 -1
  206. package/src/database/upsert-builder.ts +16 -2
  207. package/src/dict/en.ts +1 -0
  208. package/src/dict/ko.ts +1 -0
  209. package/src/dict/rc-keys.ts +32 -0
  210. package/src/dict/sd.ts +23 -3
  211. package/src/entity/entity-manager.ts +4 -0
  212. package/src/entity/entity-template-cone.ts +298 -0
  213. package/src/entity/entity.ts +189 -13
  214. package/src/shared/app.shared.ts.txt +5 -0
  215. package/src/shared/web.shared.ts.txt +9 -5
  216. package/src/skills/project/README.md +21 -0
  217. package/src/skills/project/architecture.md +373 -0
  218. package/src/skills/project/business-logic.md +270 -0
  219. package/src/skills/project/requirements.md +160 -0
  220. package/src/skills/sonamu/SKILL.md +168 -3
  221. package/src/skills/sonamu/api.md +102 -0
  222. package/src/skills/sonamu/database.md +220 -1
  223. package/src/skills/sonamu/entity-relations.md +89 -1
  224. package/src/skills/sonamu/fixture-cli.md +501 -0
  225. package/src/skills/sonamu/frontend.md +214 -0
  226. package/src/skills/sonamu/i18n.md +95 -0
  227. package/src/skills/sonamu/model.md +153 -0
  228. package/src/skills/sonamu/project-init.md +178 -8
  229. package/src/skills/sonamu/scaffolding.md +112 -0
  230. package/src/skills/sonamu/subset.md +9 -3
  231. package/src/skills/sonamu/testing.md +287 -2
  232. package/src/skills/sonamu/workflow.md +70 -5
  233. package/src/ssr/renderer.ts +2 -2
  234. package/src/syncer/api-parser.ts +12 -0
  235. package/src/syncer/checksum.ts +0 -38
  236. package/src/syncer/syncer-actions.ts +7 -1
  237. package/src/syncer/syncer.ts +16 -5
  238. package/src/tasks/workflow-manager.ts +29 -8
  239. package/src/template/entity-converter.ts +3 -3
  240. package/src/template/helpers.ts +49 -0
  241. package/src/template/implementations/entry-server.template.ts +1 -1
  242. package/src/template/implementations/generated.template.ts +4 -0
  243. package/src/template/implementations/generated_http.template.ts +1 -0
  244. package/src/template/implementations/generated_sso.template.ts +40 -11
  245. package/src/template/implementations/queries.template.ts +8 -0
  246. package/src/template/implementations/sd.template.ts +22 -3
  247. package/src/template/implementations/services.template.ts +11 -10
  248. package/src/template/implementations/view_form.template.ts +111 -101
  249. package/src/template/implementations/view_list.template.ts +120 -119
  250. package/src/template/implementations/view_search_input.template.ts +17 -13
  251. package/src/template/zod-converter.ts +103 -6
  252. package/src/testing/_relation-graph.ts +1 -1
  253. package/src/testing/data-explorer.ts +427 -0
  254. package/src/testing/faker-mappings.ts +434 -0
  255. package/src/testing/fixture-generator.ts +1166 -0
  256. package/src/testing/fixture-manager.ts +91 -6
  257. package/src/testing/index.ts +3 -0
  258. package/src/types/types.ts +222 -26
  259. package/src/ui/ai-client.ts +9 -1
  260. package/src/ui/api.ts +429 -23
  261. package/src/utils/fs-utils.ts +14 -1
  262. package/dist/template/implementations/view_enums_select.template.d.ts +0 -17
  263. package/dist/template/implementations/view_enums_select.template.d.ts.map +0 -1
  264. package/dist/template/implementations/view_enums_select.template.js +0 -62
  265. package/dist/template/implementations/view_id_async_select.template.d.ts +0 -17
  266. package/dist/template/implementations/view_id_async_select.template.d.ts.map +0 -1
  267. package/dist/template/implementations/view_id_async_select.template.js +0 -125
  268. package/dist/ui-web/assets/index-Bd_2AkLb.css +0 -1
  269. package/dist/ui-web/assets/index-BpSbhQWo.js +0 -225
  270. package/src/template/implementations/view_enums_select.template.ts +0 -65
  271. package/src/template/implementations/view_id_async_select.template.ts +0 -139
package/dist/ui/api.js CHANGED
@@ -4,6 +4,8 @@ import inflection from "inflection";
4
4
  import path from "path";
5
5
  import { range } from "radashi";
6
6
  import { Sonamu } from "../api/sonamu.js";
7
+ import { DB } from "../database/db.js";
8
+ import { createKnexInstance } from "../database/knex.js";
7
9
  import { SD } from "../dict/sd.js";
8
10
  import { sonamuDictionary } from "../dict/sonamu-dictionary.js";
9
11
  import { EntityManager } from "../entity/entity-manager.js";
@@ -11,6 +13,8 @@ import { BadRequestException, isSoException, ServiceUnavailableException } from
11
13
  import { Migrator } from "../migration/migrator.js";
12
14
  import { SlackConfirm } from "../migration/slack-confirm.js";
13
15
  import { TemplateManager } from "../template/template-manager.js";
16
+ import { DataExplorer } from "../testing/data-explorer.js";
17
+ import { FixtureGenerator } from "../testing/fixture-generator.js";
14
18
  import { FixtureManager } from "../testing/fixture-manager.js";
15
19
  import { BUILT_IN_TYPE_IDS, TemplateKey } from "../types/types.js";
16
20
  import { nonNullable } from "../utils/utils.js";
@@ -550,6 +554,76 @@ export async function sonamuUIApiPlugin(fastify) {
550
554
  await entity.save();
551
555
  });
552
556
  });
557
+ server.post("/api/entity/updateCone", async (request)=>{
558
+ return await waitForHMRCompleted(async ()=>{
559
+ const { entityId, target, propName, enumId, subsetKey, cone } = request.body;
560
+ const entity = EntityManager.get(entityId);
561
+ if (target === "entity") {
562
+ entity.cone = cone;
563
+ } else if (target === "prop" && propName) {
564
+ const prop = entity.props.find((p)=>p.name === propName);
565
+ if (prop) {
566
+ prop.cone = cone;
567
+ }
568
+ } else if (target === "enum" && enumId) {
569
+ entity.enumCones[enumId] = cone;
570
+ } else if (target === "subset" && subsetKey) {
571
+ entity.subsetCones[subsetKey] = cone;
572
+ }
573
+ await entity.save();
574
+ return true;
575
+ });
576
+ });
577
+ server.post("/api/entity/generateCones", async (request, reply)=>{
578
+ return await waitForHMRCompleted(async ()=>{
579
+ const { entityId, preserveExisting, onlyEmpty, locale } = request.body;
580
+ try {
581
+ // Entity 존재 여부 확인
582
+ const entity = EntityManager.get(entityId);
583
+ // locale 기본값: Sonamu.config.i18n.defaultLocale 사용
584
+ const effectiveLocale = locale ?? Sonamu.config.i18n.defaultLocale;
585
+ // Cone 생성
586
+ const result = await entity.generateCones({
587
+ preserveExisting: preserveExisting ?? true,
588
+ onlyEmpty: onlyEmpty ?? false,
589
+ locale: effectiveLocale
590
+ });
591
+ return result;
592
+ } catch (error) {
593
+ const message = error instanceof Error ? error.message : String(error);
594
+ // Entity not found
595
+ if (message.includes("존재하지 않는 Entity")) {
596
+ reply.status(404);
597
+ return {
598
+ success: false,
599
+ error: `Entity not found: ${entityId}`
600
+ };
601
+ }
602
+ // API 키 없음
603
+ if (message.includes("ANTHROPIC_API_KEY not found")) {
604
+ reply.status(500);
605
+ return {
606
+ success: false,
607
+ error: "API key not configured"
608
+ };
609
+ }
610
+ // Rate limit
611
+ if (message.includes("Rate limit exceeded")) {
612
+ reply.status(429);
613
+ return {
614
+ success: false,
615
+ error: "Rate limit exceeded. Please try again later."
616
+ };
617
+ }
618
+ // 기타 에러
619
+ reply.status(500);
620
+ return {
621
+ success: false,
622
+ error: `Cone generation failed: ${message}`
623
+ };
624
+ }
625
+ });
626
+ });
553
627
  server.get("/api/entity/getTableColumns", async (request)=>{
554
628
  const { entityId } = request.query;
555
629
  const entity = EntityManager.get(entityId);
@@ -667,43 +741,26 @@ export async function sonamuUIApiPlugin(fastify) {
667
741
  return await migrator.generatePreparedCodes();
668
742
  });
669
743
  server.post("/api/scaffolding/getStatus", async (request)=>{
670
- const { templateGroupName, entityIds, templateKeys: _templateKeys, enumIds } = request.body;
744
+ const { entityIds, templateKeys: _templateKeys } = request.body;
671
745
  if ((entityIds ?? []).length === 0) {
672
746
  throw new BadRequestException(SD("sonamu.error.entityIdsRequired"));
673
747
  } else if ((_templateKeys ?? []).length === 0) {
674
748
  throw new BadRequestException(SD("sonamu.error.templateKeysRequired"));
675
- } else if (templateGroupName === "Enums" && (enumIds ?? []).length === 0) {
676
- throw new BadRequestException(SD("sonamu.error.enumIdsRequired"));
677
749
  }
678
750
  // sorting
679
751
  entityIds.sort((a, b)=>a < b ? -1 : a > b ? 1 : 0);
680
752
  const templateKeys = TemplateKey.options.filter((tk)=>_templateKeys.includes(tk));
681
753
  const combinations = entityIds.flatMap((entityId)=>{
682
- if (templateGroupName === "Enums") {
683
- const entityIds = [
754
+ return templateKeys.map((templateKey)=>[
684
755
  entityId,
685
- ...EntityManager.getChildrenIds(entityId)
686
- ];
687
- const allEnumIds = entityIds.flatMap((entityId)=>Object.keys(EntityManager.get(entityId).enumLabels));
688
- return templateKeys.flatMap((templateKey)=>allEnumIds.filter((enumId)=>enumIds.includes(enumId)).map((enumId)=>[
689
- entityId,
690
- templateKey,
691
- enumId
692
- ]));
693
- } else {
694
- return templateKeys.map((templateKey)=>[
695
- entityId,
696
- templateKey
697
- ]);
698
- }
756
+ templateKey
757
+ ]);
699
758
  });
700
- const statuses = await Promise.all(combinations.map(async ([entityId, templateKey, enumId])=>{
701
- const { subPath, fullPath, isExists } = await Sonamu.syncer.checkExistsGenCode(entityId, templateKey, enumId);
759
+ const statuses = await Promise.all(combinations.map(async ([entityId, templateKey])=>{
760
+ const { subPath, fullPath, isExists } = await Sonamu.syncer.checkExistsGenCode(entityId, templateKey);
702
761
  return {
703
762
  entityId,
704
- templateGroupName,
705
763
  templateKey,
706
- enumId,
707
764
  subPath,
708
765
  fullPath,
709
766
  isExists
@@ -811,6 +868,228 @@ export async function sonamuUIApiPlugin(fastify) {
811
868
  server.post("/api/i18n/checkUsage", async (request)=>{
812
869
  return sonamuDictionary.checkUsage(request.body.keys);
813
870
  });
871
+ // Tasks API
872
+ server.get("/api/tasks/status", async ()=>{
873
+ try {
874
+ Sonamu.workflows;
875
+ return {
876
+ active: true
877
+ };
878
+ } catch {
879
+ return {
880
+ active: false
881
+ };
882
+ }
883
+ });
884
+ server.get("/api/tasks/workflowDefinitions", async ()=>{
885
+ const definitions = Sonamu.workflows.workflowDefinitions;
886
+ return {
887
+ definitions
888
+ };
889
+ });
890
+ server.get("/api/tasks/workflowRuns", async (request)=>{
891
+ const backend = Sonamu.workflows.backend;
892
+ const { limit, after, before, order, status, workflowName, createdAfter, createdBefore } = request.query;
893
+ return backend.listWorkflowRuns({
894
+ limit: limit ? Number.parseInt(limit, 10) : undefined,
895
+ after,
896
+ before,
897
+ order,
898
+ status: status ? status.split(",") : undefined,
899
+ workflowName: workflowName || undefined,
900
+ createdAfter: createdAfter ? new Date(createdAfter) : undefined,
901
+ createdBefore: createdBefore ? new Date(createdBefore) : undefined
902
+ });
903
+ });
904
+ server.get("/api/tasks/workflowRuns/:id", async (request)=>{
905
+ const backend = Sonamu.workflows.backend;
906
+ const workflowRun = await backend.getWorkflowRun({
907
+ workflowRunId: request.params.id
908
+ });
909
+ if (!workflowRun) {
910
+ throw new Error(`Workflow run not found: ${request.params.id}`);
911
+ }
912
+ return workflowRun;
913
+ });
914
+ server.post("/api/tasks/workflowRuns/:id/cancel", async (request)=>{
915
+ const backend = Sonamu.workflows.backend;
916
+ return backend.cancelWorkflowRun({
917
+ workflowRunId: request.params.id
918
+ });
919
+ });
920
+ server.post("/api/tasks/workflowRuns/:id/pause", async (request)=>{
921
+ const backend = Sonamu.workflows.backend;
922
+ return backend.pauseWorkflowRun({
923
+ workflowRunId: request.params.id
924
+ });
925
+ });
926
+ server.post("/api/tasks/workflowRuns/:id/resume", async (request)=>{
927
+ const backend = Sonamu.workflows.backend;
928
+ return backend.resumeWorkflowRun({
929
+ workflowRunId: request.params.id
930
+ });
931
+ });
932
+ server.get("/api/tasks/workflowRuns/:id/steps", async (request)=>{
933
+ const backend = Sonamu.workflows.backend;
934
+ const { limit, after, before } = request.query;
935
+ return backend.listStepAttempts({
936
+ workflowRunId: request.params.id,
937
+ limit: limit ? Number.parseInt(limit, 10) : undefined,
938
+ after,
939
+ before
940
+ });
941
+ });
942
+ /**
943
+ * Health Check API
944
+ * MCP 도구가 Sonamu 서버를 자동 감지하기 위한 엔드포인트
945
+ */ server.get("/api/sonamu/health", async (request)=>{
946
+ const address = request.server.server.address();
947
+ const port = address && typeof address === "object" ? address.port : 0;
948
+ return {
949
+ ok: true,
950
+ project: process.cwd().split("/").pop() || "unknown",
951
+ port,
952
+ timestamp: new Date().toISOString()
953
+ };
954
+ });
955
+ /**
956
+ * Fixture 생성 API
957
+ */ server.post("/api/sonamu/fixture/generate", async (request, reply)=>{
958
+ const { entity, count = 1, overrides, targetDb = "fixture" } = request.body;
959
+ try {
960
+ // 타겟 DB 설정 가져오기
961
+ const dbConfig = targetDb === "fixture" ? Sonamu.dbConfig.fixture : Sonamu.dbConfig.test;
962
+ // Knex 인스턴스 생성
963
+ const db = createKnexInstance(dbConfig);
964
+ // FixtureGenerator 생성
965
+ const generator = new FixtureGenerator(db, db, targetDb, EntityManager);
966
+ // 단일 Entity 배치 생성
967
+ const fixtures = await generator.generateBatch([
968
+ {
969
+ entity,
970
+ count,
971
+ overrides: overrides ?? {}
972
+ }
973
+ ]);
974
+ // Knex 연결 종료
975
+ await db.destroy();
976
+ return {
977
+ success: true,
978
+ entity,
979
+ count: fixtures.length,
980
+ fixtures,
981
+ targetDb
982
+ };
983
+ } catch (error) {
984
+ reply.status(400);
985
+ return {
986
+ success: false,
987
+ error: error instanceof Error ? error.message : String(error)
988
+ };
989
+ }
990
+ });
991
+ /**
992
+ * Fixture 데이터 탐색 API
993
+ */ server.post("/api/sonamu/fixture/explore", async (request, reply)=>{
994
+ const { entity, strategy, limit = 10, where } = request.body;
995
+ try {
996
+ // Fixture DB 설정 가져오기
997
+ const fixtureDbConfig = Sonamu.dbConfig.fixture;
998
+ // Knex 인스턴스 생성
999
+ const fixtureDb = createKnexInstance(fixtureDbConfig);
1000
+ // DataExplorer 생성
1001
+ const explorer = new DataExplorer(fixtureDb, EntityManager);
1002
+ const data = await explorer.explore(entity, {
1003
+ strategy,
1004
+ limit,
1005
+ where
1006
+ });
1007
+ // Knex 연결 종료
1008
+ await fixtureDb.destroy();
1009
+ return {
1010
+ success: true,
1011
+ entity,
1012
+ strategy,
1013
+ count: data.length,
1014
+ data
1015
+ };
1016
+ } catch (error) {
1017
+ reply.status(400);
1018
+ return {
1019
+ success: false,
1020
+ error: error instanceof Error ? error.message : String(error)
1021
+ };
1022
+ }
1023
+ });
1024
+ /**
1025
+ * Fixture 데이터 가져오기 (fetch) API
1026
+ * production/development DB에서 실제 데이터를 fixture DB로 import
1027
+ */ server.post("/api/sonamu/fixture/fetch", async (request, reply)=>{
1028
+ const { entity, strategy = "recent", limit = 10, includeRelations = true, maxDepth = 2 } = request.body;
1029
+ try {
1030
+ // Source DB (production/development) - 읽기 전용
1031
+ const sourceDb = DB.getDB("r");
1032
+ // Target DB (fixture)
1033
+ const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
1034
+ // FixtureGenerator 생성
1035
+ const generator = new FixtureGenerator(sourceDb, fixtureDb, "fixture", EntityManager);
1036
+ // production 데이터를 fixture DB로 import
1037
+ const results = await generator.importFromSource(entity, {
1038
+ strategy,
1039
+ limit,
1040
+ includeRelations,
1041
+ maxDepth
1042
+ });
1043
+ // Knex 연결 종료 (sourceDb는 Sonamu가 관리하므로 destroy하지 않음)
1044
+ await fixtureDb.destroy();
1045
+ return {
1046
+ success: true,
1047
+ entity,
1048
+ strategy,
1049
+ count: results.length,
1050
+ imported: results
1051
+ };
1052
+ } catch (error) {
1053
+ reply.status(400);
1054
+ return {
1055
+ success: false,
1056
+ error: error instanceof Error ? error.message : String(error)
1057
+ };
1058
+ }
1059
+ });
1060
+ /**
1061
+ * Fixture 데이터 삭제 (clean) API
1062
+ * FK 순서를 고려하여 안전하게 삭제
1063
+ */ server.post("/api/sonamu/fixture/clean", async (request, reply)=>{
1064
+ const { entities } = request.body;
1065
+ try {
1066
+ // Fixture DB 연결
1067
+ const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
1068
+ // 삭제할 Entity 목록 결정
1069
+ const targetEntities = entities && entities.length > 0 ? entities : EntityManager.getAllIds();
1070
+ // Entity ID를 테이블명으로 변환 (snake_case 복수형)
1071
+ const tableNames = targetEntities.map((entityId)=>{
1072
+ const entity = EntityManager.get(entityId);
1073
+ return entity.table;
1074
+ });
1075
+ // PostgreSQL: TRUNCATE CASCADE로 FK 순서 무관하게 안전하게 삭제
1076
+ // CASCADE 옵션으로 의존성 있는 데이터도 함께 삭제
1077
+ await fixtureDb.raw(`TRUNCATE TABLE ${tableNames.map((t)=>`"${t}"`).join(", ")} RESTART IDENTITY CASCADE`);
1078
+ // Knex 연결 종료
1079
+ await fixtureDb.destroy();
1080
+ return {
1081
+ success: true,
1082
+ cleaned: tableNames,
1083
+ count: tableNames.length
1084
+ };
1085
+ } catch (error) {
1086
+ reply.status(400);
1087
+ return {
1088
+ success: false,
1089
+ error: error instanceof Error ? error.message : String(error)
1090
+ };
1091
+ }
1092
+ });
814
1093
  // ui-web 빌드 파일 서빙
815
1094
  const uiDistPath = path.resolve(import.meta.dirname, "../ui-web");
816
1095
  // 정적 파일 서빙: 루트 폴더 전체 (assets, setting.svg 등)
@@ -831,4 +1110,4 @@ export async function sonamuUIApiPlugin(fastify) {
831
1110
  });
832
1111
  }
833
1112
 
834
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByYW5nZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgc29uYW11RGljdGlvbmFyeSB9IGZyb20gXCIuLi9kaWN0L3NvbmFtdS1kaWN0aW9uYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgaXNTb0V4Y2VwdGlvbixcbiAgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uLFxufSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCwgTWlncmF0b3IgfSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRHVwbGljYXRlQ2hlY2tPcHRpb25zLCBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQlVJTFRfSU5fVFlQRV9JRFMsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgdHlwZSBGbGF0dGVuU3Vic2V0Um93LFxuICB0eXBlIFBhdGhBbmRDb2RlLFxuICBUZW1wbGF0ZUtleSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgc2V0QWlBcGkgfSBmcm9tIFwiLi9haS1hcGlcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNvbmFtdVVJQXBpUGx1Z2luKGZhc3RpZnk6IEZhc3RpZnlJbnN0YW5jZSkge1xuICBmYXN0aWZ5LnJlZ2lzdGVyKFxuICAgIGFzeW5jIChzZXJ2ZXIpID0+IHtcbiAgICAgIC8vIG1pZ3JhdG9yXG4gICAgICBjb25zdCBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcigpO1xuXG4gICAgICAvLyB3YWl0Rm9ySE1SQ29tcGxldGVkXG4gICAgICBhc3luYyBmdW5jdGlvbiB3YWl0Rm9ySE1SQ29tcGxldGVkPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHdhaXRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSwgMTUwMCk7XG5cbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgU29uYW11LnN5bmNlci5ldmVudEVtaXR0ZXIub2ZmKFwib25ITVJDb21wbGV0ZWRcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIFNvbmFtdS5zeW5jZXIuZXZlbnRFbWl0dGVyLm9uY2UoXCJvbkhNUkNvbXBsZXRlZFwiLCBoYW5kbGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICAgICAgYXdhaXQgd2FpdFByb21pc2U7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNldEFpQXBpKHNlcnZlcik7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL3NvbmFtdS9jb25maWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gU29uYW11LmNvbmZpZztcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBlbnRpdHlJZD86IHN0cmluZztcbiAgICAgICAgICBwcmVzZXQ/OiBcInR5cGVzXCIgfCBcImVudGl0eS5qc29uXCIgfCBcImdlbmVyYXRlZFwiO1xuICAgICAgICAgIGFic1BhdGg/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdG9vbHMvb3BlblZzY29kZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBwcmVzZXQsIGFic1BhdGggfSA9IHJlcXVlc3QucXVlcnk7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9ICgoKSA9PiB7XG4gICAgICAgICAgaWYgKGVudGl0eUlkICYmIHByZXNldCkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgY29uc3QgeyBuYW1lcyB9ID0gZW50aXR5O1xuXG4gICAgICAgICAgICBjb25zdCB7IGFwaVJvb3RQYXRoIH0gPSBTb25hbXU7XG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgIHN3aXRjaCAocHJlc2V0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInR5cGVzXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmFtZXMuZnN9LnR5cGVzLnRzYDtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW50aXR5Lmpzb25cIjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lcy5mc30uZW50aXR5Lmpzb25gO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJnZW5lcmF0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lcy5mc30uZ2VuZXJhdGVkLnRzYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiBgJHthcGlSb290UGF0aH0vc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLnBhcmVudEZzfS8ke2ZpbGVuYW1lfWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghYWJzUGF0aCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5wcmVzZXRPckFic1BhdGhSZXF1aXJlZFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWJzUGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGV4ZWNTeW5jKGBjb2RlICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBvcmlnaW46IHN0cmluZztcbiAgICAgICAgICBlbnRpdHlJZD86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS90b29scy9nZXRTdWdnZXN0aW9uXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb3JpZ2luLCBlbnRpdHlJZCB9ID0gcmVxdWVzdC5xdWVyeTtcblxuICAgICAgICAvLyDsuZjtmZgg7Jqp7Ja07KeRXG4gICAgICAgIGNvbnN0IGdsb3NzYXJ5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oW1xuICAgICAgICAgIFtcInN0YXR1c1wiLCBcIuyDge2DnFwiXSxcbiAgICAgICAgICBbXCJ0eXBlXCIsIFwi7YOA7J6FXCJdLFxuICAgICAgICAgIFtcImltYWdlXCIsIFwi7J2066+47KeAXCJdLFxuICAgICAgICAgIFtcImltYWdlc1wiLCBcIuydtOuvuOyngOumrOyKpO2KuFwiXSxcbiAgICAgICAgICBbXCJ1cmxcIiwgXCJVUkxcIl0sXG4gICAgICAgICAgW1wiaWRcIiwgXCJJRFwiXSxcbiAgICAgICAgICBbXCJuYW1lXCIsIGB7RW50aXR5SUR966qFYF0sXG4gICAgICAgICAgW1widGl0bGVcIiwgXCJ7RW50aXR5SUR966qFXCJdLFxuICAgICAgICAgIFtcInBhcmVudFwiLCBcIuyDgeychHtFbnRpdHlJRH1cIl0sXG4gICAgICAgICAgW1wiZGVzY1wiLCBcIuyEpOuqhVwiXSxcbiAgICAgICAgICBbXCJhdFwiLCBcIuydvOyLnFwiXSxcbiAgICAgICAgICBbXCJjcmVhdGVkXCIsIFwi65Ox66GdXCJdLFxuICAgICAgICAgIFtcInVwZGF0ZWRcIiwgXCLsiJjsoJVcIl0sXG4gICAgICAgICAgW1wiZGVsZXRlZFwiLCBcIuyCreygnFwiXSxcbiAgICAgICAgICBbXCJieVwiLCBcIuycoOyggFwiXSxcbiAgICAgICAgICBbXCJkYXRlXCIsIFwi7J287J6QXCJdLFxuICAgICAgICAgIFtcInRpbWVcIiwgXCLsi5zqsIRcIl0sXG4gICAgICAgICAgW1wia29cIiwgXCIo7ZWc6riAKVwiXSxcbiAgICAgICAgICBbXCJlblwiLCBcIijsmIHrrLgpXCJdLFxuICAgICAgICAgIFtcImtyd1wiLCBcIijsm5ApXCJdLFxuICAgICAgICAgIFtcInVzZFwiLCBcIihVU0QpXCJdLFxuICAgICAgICAgIFtcImNvbG9yXCIsIFwi7Lus65+sXCJdLFxuICAgICAgICAgIFtcImNvZGVcIiwgXCLsvZTrk5xcIl0sXG4gICAgICAgICAgW1wieFwiLCBcIljsooztkZxcIl0sXG4gICAgICAgICAgW1wieVwiLCBcIlnsooztkZxcIl0sXG4gICAgICAgICAgW1wiY3VycmVudFwiLCBcIu2YhOyerFwiXSxcbiAgICAgICAgICBbXCJzdG9ja1wiLCBcIuyerOqzoFwiXSxcbiAgICAgICAgICBbXCJ0b3RhbFwiLCBcIuy0nVwiXSxcbiAgICAgICAgICBbXCJhZG1pblwiLCBcIuq0gOumrOyekFwiXSxcbiAgICAgICAgICBbXCJncm91cFwiLCBcIuq3uOujuVwiXSxcbiAgICAgICAgICBbXCJpdGVtXCIsIFwi7JWE7J207YWcXCJdLFxuICAgICAgICAgIFtcImNudFwiLCBcIuyImOufiVwiXSxcbiAgICAgICAgICBbXCJwcmljZVwiLCBcIuqwgOqyqVwiXSxcbiAgICAgICAgICBbXCJwcmVzZXRcIiwgXCLtlITrpqzshYtcIl0sXG4gICAgICAgICAgW1wiYWNjdFwiLCBcIuqzhOyijFwiXSxcbiAgICAgICAgICBbXCJ0ZWxcIiwgXCLsoITtmZTrsojtmLhcIl0sXG4gICAgICAgICAgW1wibm9cIiwgXCLrsojtmLhcIl0sXG4gICAgICAgICAgW1wiYm9keVwiLCBcIuuCtOyaqVwiXSxcbiAgICAgICAgICBbXCJjb250ZW50XCIsIFwi64K07JqpXCJdLFxuICAgICAgICAgIFtcIm9yZGVybm9cIiwgXCLsoJXroKzsiJzshJxcIl0sXG4gICAgICAgICAgW1wicHJpb3JpdHlcIiwgXCLsmrDshKDsiJzsnIRcIl0sXG4gICAgICAgICAgW1widGV4dFwiLCBcIu2FjeyKpO2KuFwiXSxcbiAgICAgICAgICBbXCJrZXlcIiwgXCLtgqRcIl0sXG4gICAgICAgICAgW1wic3VtXCIsIFwi7ZWp7IKwXCJdLFxuICAgICAgICAgIFtcImV4cGVjdGVkXCIsIFwi7JiI7IOBXCJdLFxuICAgICAgICAgIFtcImFjdHVhbFwiLCBcIuyLpOygnFwiXSxcbiAgICAgICAgXSk7XG4gICAgICAgIC8vIOyghOyytCDsl5Tti7Dti7Ag7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7Ag7YOA7J207YuA6rO8IO2UhOuhrSDshKTrqoXsnYQg7LmY7ZmYIOyaqeyWtOynkeyXkCDstpTqsIBcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmICgoZW50aXR5LnRpdGxlID8/IFwiXCIpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBnbG9zc2FyeS5zZXQoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eS5pZCksIGVudGl0eS50aXRsZSk7XG4gICAgICAgICAgICBnbG9zc2FyeS5zZXQoXG4gICAgICAgICAgICAgIGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShlbnRpdHkuaWQpKSxcbiAgICAgICAgICAgICAgYCR7ZW50aXR5LnRpdGxlfeumrOyKpO2KuGAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVudGl0eS5wcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2xvc3NhcnkuaGFzKHByb3AubmFtZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3AuZGVzYykge1xuICAgICAgICAgICAgICBnbG9zc2FyeS5zZXQocHJvcC5uYW1lLCBwcm9wLmRlc2MucmVwbGFjZShlbnRpdHkudGl0bGUgPz8gXCJcIiwgXCJ7RW50aXR5SUR9XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZCA9ICgoKSA9PiB7XG4gICAgICAgICAgLy8g64uo7Ja0IOu2hOumrCwg6rCA64ql7ZWcIOyhsO2VqSDsg53shLFcbiAgICAgICAgICBjb25zdCB3b3JkcyA9IG9yaWdpbi5zcGxpdChcIl9cIik7XG4gICAgICAgICAgY29uc3QgY29tYmluYXRpb25zID0gWy4uLnJhbmdlKHdvcmRzLmxlbmd0aCwgMCwgLTEpXS5mbGF0TWFwKChsZW4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIC4uLnJhbmdlKDAsIHdvcmRzLmxlbmd0aCAtIGxlbiArIDEsIChpZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbGVuLFxuICAgICAgICAgICAgICAgICAgdzogd29yZHMuc2xpY2UoaWR4LCBpZHggKyBsZW4pLmpvaW4oXCJfXCIpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyhsO2VqeydhCDsiJztmoztlZjrqbAsIOy5mO2ZmCDsmqnslrTsp5Hsl5Ag7J6I64qUIOuLqOyWtOqwgCDtj6ztlajrkJwg6rK97JqwLCDsuZjtmZgg7Jqp7Ja066GcIOy5mO2ZmFxuICAgICAgICAgIGNvbnN0IFJFUExBQ0VEX1BSRUZJWCA9IFwiI1JFUExBQ0VELy9cIjsgLy8g7LmY7ZmY65CcIOuLqOyWtOulvCBqb2luIOydtO2bhOyXkOuPhCDsi53rs4TtlZjquLAg7JyE7ZW0IHByZWZpeCDstpTqsIBcbiAgICAgICAgICBsZXQgcmVtYWluQXJyOiBzdHJpbmdbXSA9IFsuLi53b3Jkc107XG4gICAgICAgICAgZm9yIChjb25zdCBjb21iIG9mIGNvbWJpbmF0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluU3RyID0gcmVtYWluQXJyLmpvaW4oXCJfXCIpO1xuICAgICAgICAgICAgaWYgKHJlbWFpblN0ci5pbmNsdWRlcyhjb21iLncpICYmIGdsb3NzYXJ5Lmhhcyhjb21iLncpKSB7XG4gICAgICAgICAgICAgIHJlbWFpbkFyciA9IHJlbWFpblN0clxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNvbWIudywgUkVQTEFDRURfUFJFRklYICsgZ2xvc3NhcnkuZ2V0KGNvbWIudykpXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVtYWluQXJyXG4gICAgICAgICAgICAubWFwKChyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyLnN0YXJ0c1dpdGgoUkVQTEFDRURfUFJFRklYKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnJlcGxhY2UoUkVQTEFDRURfUFJFRklYLCBcIlwiKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCJcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC97RW50aXR5SUR9L2csIGVudGl0eUlkID8gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnRpdGxlIDogXCJcIik7XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgcmV0dXJuIHsgc3VnZ2VzdGVkIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvZW50aXR5L2ZpbmRNYW55XCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgICAgICBmdW5jdGlvbiBmbGF0dGVuU3Vic2V0Um93cyhzdWJzZXRSb3dzOiBFbnRpdHlTdWJzZXRSb3dbXSk6IEZsYXR0ZW5TdWJzZXRSb3dbXSB7XG4gICAgICAgICAgcmV0dXJuIHN1YnNldFJvd3MuZmxhdE1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNoaWxkcmVuLCAuLi5zUm93IH0gPSBzdWJzZXRSb3c7XG4gICAgICAgICAgICByZXR1cm4gW3NSb3csIC4uLmZsYXR0ZW5TdWJzZXRSb3dzKGNoaWxkcmVuKV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRpdGllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGVudGl0eUlkcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICBjb25zdCBzdWJzZXRSb3dzID0gZW50aXR5LmdldFN1YnNldFJvd3MoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAgICAgICBmbGF0dGVuU3Vic2V0Um93czogZmxhdHRlblN1YnNldFJvd3Moc3Vic2V0Um93cyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGVudGl0aWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBhSWQgPSBhLnBhcmVudElkID8/IGEuaWQ7XG4gICAgICAgICAgY29uc3QgYklkID0gYi5wYXJlbnRJZCA/PyBiLmlkO1xuICAgICAgICAgIGlmIChhSWQgPCBiSWQpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYUlkID4gYklkKSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoYUlkID09PSBiSWQpIHtcbiAgICAgICAgICAgIGlmIChhLnBhcmVudElkID09PSB1bmRlZmluZWQpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChiLnBhcmVudElkID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgZW50aXRpZXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBmaWx0ZXI/OiBcImVudW1zXCIgfCBcInR5cGVzXCI7XG4gICAgICAgICAgcmVsb2FkPzogXCIxXCI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L3R5cGVJZHNcIiwgYXN5bmMgKHJlcXVlc3QpOiBQcm9taXNlPHsgdHlwZUlkczogc3RyaW5nW10gfT4gPT4ge1xuICAgICAgICBjb25zdCB7IGZpbHRlciwgcmVsb2FkIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuXG4gICAgICAgIGlmIChyZWxvYWQgPT09IFwiMVwiKSB7XG4gICAgICAgICAgYXdhaXQgU29uYW11LnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlSWRzID0gKCgpID0+IHtcbiAgICAgICAgICAvLyDtlITroZzsoJ3tirjsl5DshJwg7KCV7J2Y7ZWcIO2DgOyeheuTpFxuICAgICAgICAgIGNvbnN0IHByb2plY3RUeXBlSWRzID0gT2JqZWN0LmVudHJpZXMoU29uYW11LnN5bmNlci50eXBlcylcbiAgICAgICAgICAgIC5maWx0ZXIoKFtfdHlwZUlkLCB6b2RUeXBlXSkgPT4gKHpvZFR5cGUuX3pvZC5kZWYudHlwZSBhcyBzdHJpbmcpICE9PSBcImVudW1cIilcbiAgICAgICAgICAgIC5tYXAoKFt0eXBlSWQsIF96b2RUeXBlXSkgPT4gdHlwZUlkKTtcblxuICAgICAgICAgIC8vIOuCtOyepSDtg4DsnoXrk6QgKHNvbmFtdSDsvZTslrTsl5DshJwg7KCc6rO1KVxuICAgICAgICAgIGNvbnN0IGJ1aWx0SW5UeXBlSWRzID0gWy4uLkJVSUxUX0lOX1RZUEVfSURTXTtcblxuICAgICAgICAgIC8vIOuqqOuToCDtg4DsnoUg67OR7ZWpXG4gICAgICAgICAgY29uc3QgYWxsVHlwZUlkcyA9IFsuLi5idWlsdEluVHlwZUlkcywgLi4ucHJvamVjdFR5cGVJZHNdO1xuXG4gICAgICAgICAgaWYgKGZpbHRlciA9PT0gXCJ0eXBlc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsVHlwZUlkcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbnVtSWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5mbGF0TWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChmaWx0ZXIgPT09IFwiZW51bXNcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVudW1JZHM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWxsVHlwZUlkcywgLi4uZW51bUlkc107XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZUlkcyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBmb3JtOiB7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgdGl0bGU6IHN0cmluZztcbiAgICAgICAgICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJlbnRJZD86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZm9ybSB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgLi4uZm9ybSwgZW50aXR5SWQ6IGZvcm0uaWQgfSk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IFNvbmFtdS5zeW5jZXIuZGVsRW50aXR5KGVudGl0eUlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdWYWx1ZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgICAgICAgICB0YWJsZTogc3RyaW5nO1xuICAgICAgICAgICAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5RW50aXR5QmFzZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgbmV3VmFsdWVzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS50aXRsZSA9IG5ld1ZhbHVlcy50aXRsZTtcbiAgICAgICAgICBlbnRpdHkudGFibGUgPSBuZXdWYWx1ZXMudGFibGU7XG4gICAgICAgICAgZW50aXR5LnBhcmVudElkID0gbmV3VmFsdWVzLnBhcmVudElkO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBzdWJzZXRLZXk6IHN0cmluZztcbiAgICAgICAgICBmaWVsZHM6IHN0cmluZ1tdO1xuICAgICAgICAgIGZpZWxkc0ludGVybmFsPzogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeVN1YnNldFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgc3Vic2V0S2V5LCBmaWVsZHMsIGZpZWxkc0ludGVybmFsIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBmaWVsZHM7XG4gICAgICAgICAgaWYgKGZpZWxkc0ludGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHNJbnRlcm5hbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGVudGl0eS5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA9IGZpZWxkc0ludGVybmFsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGVudGl0eS5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiB7IHVwZGF0ZWQ6IGZpZWxkcywgdXBkYXRlZEludGVybmFsOiBmaWVsZHNJbnRlcm5hbCB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIHN1YnNldEtleTogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9kZWxTdWJzZXRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHN1YnNldEtleSB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdQcm9wOiBFbnRpdHlQcm9wO1xuICAgICAgICAgIGF0PzogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCwgbmV3UHJvcCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuY3JlYXRlUHJvcChuZXdQcm9wLCBhdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgbmV3UHJvcDogRW50aXR5UHJvcDtcbiAgICAgICAgICBhdDogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCwgbmV3UHJvcCB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5tb2RpZnlQcm9wKG5ld1Byb3AsIGF0KTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGF0OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2RlbFByb3BcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGF0IH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LmRlbFByb3AoYXQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGF0OiBudW1iZXI7XG4gICAgICAgICAgdG86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW92ZVByb3BcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGF0LCB0byB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5tb3ZlUHJvcChhdCwgdG8pO1xuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5SW5kZXhlc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgaW5kZXhlcyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuaW5kZXhlcyA9IGluZGV4ZXM7XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiB7IHVwZGF0ZWQ6IGluZGV4ZXMgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtTGFiZWxzOiBFbnRpdHlbXCJlbnVtTGFiZWxzXCJdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlFbnVtTGFiZWxzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBlbnVtTGFiZWxzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzID0gZW51bUxhYmVscztcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHsgdXBkYXRlZDogZW51bUxhYmVscyB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIG5ld0VudW1JZDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVFbnVtSWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIG5ld0VudW1JZCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1tuZXdFbnVtSWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOydtOuvuCDsobTsnqztlZjripQgZW51bUlk7J6F64uI64ukOiAke25ld0VudW1JZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1tuZXdFbnVtSWRdID0ge1xuICAgICAgICAgICAgLi4uKG5ld0VudW1JZC5lbmRzV2l0aChcIlN0YXR1c1wiKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZTogXCLrhbjstpxcIixcbiAgICAgICAgICAgICAgICAgIGhpZGRlbjogXCLsiKjquYBcIixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgXCJcIjogXCJcIixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtSWQ6IHtcbiAgICAgICAgICAgIGJlZm9yZTogc3RyaW5nO1xuICAgICAgICAgICAgYWZ0ZXI6IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlFbnVtSWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGVudW1JZCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICAgICAgY29uc3QgaXNFeGlzdHMgPSBlbnRpdHlJZHMuc29tZSgoZW50aXR5SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVscykuaW5jbHVkZXMoZW51bUlkLmFmdGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNFeGlzdHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J2066+4IOyhtOyerO2VmOuKlCBFbnVtSWTsnoXri4jri6Q6ICR7ZW51bUlkLmFmdGVyfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWQuYWZ0ZXJdID0gZW50aXR5LmVudW1MYWJlbHNbZW51bUlkLmJlZm9yZV07XG4gICAgICAgICAgZGVsZXRlIGVudGl0eS5lbnVtTGFiZWxzW2VudW1JZC5iZWZvcmVdO1xuXG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiICYmIHByb3AuaWQgPT09IGVudW1JZC5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICBwcm9wLmlkID0gZW51bUlkLmFmdGVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtSWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsZXRlRW51bUlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBlbnVtSWQgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICAgICAgY29uc3QgaXNSZWZlcmVuY2VkID0gZW50aXR5SWRzXG4gICAgICAgICAgICAuZmxhdE1hcCgoZW50aXR5SWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcylcbiAgICAgICAgICAgIC5zb21lKChwcm9wKSA9PiBwcm9wLnR5cGUgPT09IFwiZW51bVwiICYmIHByb3AuaWQgPT09IGVudW1JZCk7XG4gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudW1JZH3rpbwg7LC47KGw7ZWY64qUIO2UhOuhnO2NvO2LsOqwgCDsobTsnqztlanri4jri6QuYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWRdO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBRdWVyeXN0cmluZzoge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2dldFRhYmxlQ29sdW1uc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eUlkIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBlbnRpdHkuZ2V0VGFibGVDb2x1bW5zKCk7XG4gICAgICAgIHJldHVybiB7IGNvbHVtbnMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9taWdyYXRpb25zL3N0YXR1c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuXG4gICAgICAgIHJldHVybiB7IHN0YXR1cyB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiIHwgXCJzaGFkb3dcIjtcbiAgICAgICAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgICAgICAgZm9yY2U/OiBib29sZWFuO1xuICAgICAgICAgIGZvcmNlUmVhc29uPzogc3RyaW5nO1xuICAgICAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFxuICAgICAgICBcIi9hcGkvbWlncmF0aW9ucy9ydW5BY3Rpb25cIixcbiAgICAgICAgYXN5bmMgKHJlcXVlc3QpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdCB8IFNsYWNrQ29uZmlybVBlbmRpbmdSZXN1bHQ+ID0+IHtcbiAgICAgICAgICBjb25zdCB7IGFjdGlvbiwgdGFyZ2V0cywgZm9yY2UsIGZvcmNlUmVhc29uLCByZXF1ZXN0b3IgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGlmIChhY3Rpb24gPT09IFwic2hhZG93XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBtaWdyYXRvci5ydW5TaGFkb3dUZXN0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2xhY2sg7Iq57J24IOyytO2BrCAoYXBwbHkg7Iuc7JeQ66eMKVxuICAgICAgICAgIGlmIChhY3Rpb24gPT09IFwiYXBwbHlcIikge1xuICAgICAgICAgICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZXNBcHByb3ZhbCA9IHRhcmdldHMuc29tZSgodCkgPT4gc2xhY2tDb25maXJtLmlzVGFyZ2V0UmVxdWlyZXNBcHByb3ZhbCh0KSk7XG5cbiAgICAgICAgICAgIC8vIOuhnOy7rCBEQuyduCDqsr3smrAg7Iq57J24IOyKpO2CtVxuICAgICAgICAgICAgY29uc3QgbG9jYWxIb3N0cyA9IFtcImxvY2FsaG9zdFwiLCBcIjEyNy4wLjAuMVwiLCBcIjAuMC4wLjBcIiwgXCI6OjFcIl07XG4gICAgICAgICAgICBjb25zdCBpc0xvY2FsVGFyZ2V0ID0gdGFyZ2V0cy5ldmVyeSgodGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldENvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXRdO1xuICAgICAgICAgICAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSG9zdHMuaW5jbHVkZXMoaG9zdC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmVxdWlyZXNBcHByb3ZhbCAmJiBzbGFja0NvbmZpcm0uaXNDb25maWd1cmVkKCkgJiYgIWlzTG9jYWxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBjb25ucyB9ID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG5cbiAgICAgICAgICAgICAgLy8g66qo65OgIO2DgOqynyBEQuyXkOyEnCBwZW5kaW5n7J24IOuniOydtOq3uOugiOydtOyFmOydmCDtlansp5HtlansnYQg6rWs7ZWp64uI64ukLlxuICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nTWlncmF0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAuLi5uZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgY29ubnNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoY29ubikgPT4gdGFyZ2V0cy5pbmNsdWRlcyhjb25uLmNvbm5LZXkgYXMga2V5b2YgU29uYW11REJDb25maWcpKVxuICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcCgoY29ubikgPT4gY29ubi5wZW5kaW5nKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nTWlncmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8g6riw7KG0IOyKueyduCDsmpTssq0g7ZmV7J24XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFja0NvbmZpcm0uZ2V0RXhpc3RpbmdSZXF1ZXN0KHBlbmRpbmdNaWdyYXRpb25zKTtcblxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgLy8g6riw7KG0IOyalOyyreydtCDsnojsnLzrqbQg7Iq57J24IOyDge2DnCDtmZXsnbhcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHsgYXBwcm92ZWQsIHJlamVjdGVkIH0gPSBhd2FpdCBzbGFja0NvbmZpcm0uY2hlY2tBcHByb3ZhbChcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoYXBwcm92ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7Iq57J2465CoIOKGkiDsi6TtlolcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKGFjdGlvbiwgdGFyZ2V0cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5sb2dFeGVjdXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5taWdyYXRpb25SZWplY3RlZFwiKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIOynhO2WiVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0uZm9yY2VBcHByb3ZhbChcbiAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUmVhc29uID8/IFwi7IKs7JygIOyXhuydjFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RvcixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKGFjdGlvbiwgdGFyZ2V0cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5sb2dFeGVjdXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g64yA6riw7KSRXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwZW5kaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICB0czogZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyDiCDsirnsnbgg7JqU7LKtIOuwnOyGoVxuICAgICAgICAgICAgICAgICAgY29uc3QgeyBjaGFubmVsLCB0cyB9ID0gYXdhaXQgc2xhY2tDb25maXJtLnBvc3RBcHByb3ZhbFJlcXVlc3QoXG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdNaWdyYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLnNhdmVSZXF1ZXN0KHBlbmRpbmdNaWdyYXRpb25zLCBjaGFubmVsLCB0cyk7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicGVuZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICB0cyxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1bkFjdGlvbihhY3Rpb24sIHRhcmdldHMpO1xuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgY2hhbm5lbDogc3RyaW5nO1xuICAgICAgICAgIHRzOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvbWlncmF0aW9ucy9jaGVja0FwcHJvdmFsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2hhbm5lbCwgdHMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuXG4gICAgICAgIGlmICghc2xhY2tDb25maXJtLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgYXBwcm92ZWQ6IHRydWUsIHJlamVjdGVkOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNsYWNrQ29uZmlybS5jaGVja0FwcHJvdmFsKGNoYW5uZWwsIHRzKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBjaGFubmVsOiBzdHJpbmc7XG4gICAgICAgICAgdHM6IHN0cmluZztcbiAgICAgICAgICByZWFzb246IHN0cmluZztcbiAgICAgICAgICByZXF1ZXN0b3I/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvbWlncmF0aW9ucy9mb3JjZUFwcHJvdmFsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2hhbm5lbCwgdHMsIHJlYXNvbiwgcmVxdWVzdG9yIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIGNvbnN0IHNsYWNrQ29uZmlybSA9IG5ldyBTbGFja0NvbmZpcm0oKTtcblxuICAgICAgICBpZiAoIXNsYWNrQ29uZmlybS5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLmZvcmNlQXBwcm92YWwoY2hhbm5lbCwgdHMsIHJlYXNvbiwgcmVxdWVzdG9yKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGNvZGVOYW1lczogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvbWlncmF0aW9ucy9kZWxDb2Rlc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNvZGVOYW1lcyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICByZXR1cm4gYXdhaXQgbWlncmF0b3IuZGVsQ29kZXMoY29kZU5hbWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvbWlncmF0aW9ucy9nZW5lcmF0ZVByZXBhcmVkQ29kZXNcIiwgYXN5bmMgKF9yZXF1ZXN0dCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbWlncmF0b3IuZ2VuZXJhdGVQcmVwYXJlZENvZGVzKCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgdGVtcGxhdGVHcm91cE5hbWU6IFwiRW50aXR5XCIgfCBcIkVudW1zXCI7XG4gICAgICAgICAgZW50aXR5SWRzOiBzdHJpbmdbXTtcbiAgICAgICAgICB0ZW1wbGF0ZUtleXM6IHN0cmluZ1tdO1xuICAgICAgICAgIGVudW1JZHM6IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NjYWZmb2xkaW5nL2dldFN0YXR1c1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IHRlbXBsYXRlR3JvdXBOYW1lLCBlbnRpdHlJZHMsIHRlbXBsYXRlS2V5czogX3RlbXBsYXRlS2V5cywgZW51bUlkcyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBpZiAoKGVudGl0eUlkcyA/PyBbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuZW50aXR5SWRzUmVxdWlyZWRcIikpO1xuICAgICAgICB9IGVsc2UgaWYgKChfdGVtcGxhdGVLZXlzID8/IFtdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci50ZW1wbGF0ZUtleXNSZXF1aXJlZFwiKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGVtcGxhdGVHcm91cE5hbWUgPT09IFwiRW51bXNcIiAmJiAoZW51bUlkcyA/PyBbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuZW51bUlkc1JlcXVpcmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvcnRpbmdcbiAgICAgICAgZW50aXR5SWRzLnNvcnQoKGEsIGIpID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZUtleXMgPSBUZW1wbGF0ZUtleS5vcHRpb25zLmZpbHRlcigodGspID0+IF90ZW1wbGF0ZUtleXMuaW5jbHVkZXModGspKTtcblxuICAgICAgICBjb25zdCBjb21iaW5hdGlvbnMgPSBlbnRpdHlJZHMuZmxhdE1hcCgoZW50aXR5SWQpID0+IHtcbiAgICAgICAgICBpZiAodGVtcGxhdGVHcm91cE5hbWUgPT09IFwiRW51bXNcIikge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5SWRzID0gW2VudGl0eUlkLCAuLi5FbnRpdHlNYW5hZ2VyLmdldENoaWxkcmVuSWRzKGVudGl0eUlkKV07XG4gICAgICAgICAgICBjb25zdCBhbGxFbnVtSWRzID0gZW50aXR5SWRzLmZsYXRNYXAoKGVudGl0eUlkKSA9PlxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkuZW51bUxhYmVscyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlS2V5cy5mbGF0TWFwKCh0ZW1wbGF0ZUtleSkgPT5cbiAgICAgICAgICAgICAgYWxsRW51bUlkc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGVudW1JZCkgPT4gZW51bUlkcy5pbmNsdWRlcyhlbnVtSWQpKVxuICAgICAgICAgICAgICAgIC5tYXAoKGVudW1JZCkgPT4gW2VudGl0eUlkLCB0ZW1wbGF0ZUtleSwgZW51bUlkXSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVLZXlzLm1hcCgodGVtcGxhdGVLZXkpID0+IFtlbnRpdHlJZCwgdGVtcGxhdGVLZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgY29tYmluYXRpb25zLm1hcChhc3luYyAoW2VudGl0eUlkLCB0ZW1wbGF0ZUtleSwgZW51bUlkXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzdWJQYXRoLCBmdWxsUGF0aCwgaXNFeGlzdHMgfSA9IGF3YWl0IFNvbmFtdS5zeW5jZXIuY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgdGVtcGxhdGVLZXkgYXMgVGVtcGxhdGVLZXksXG4gICAgICAgICAgICAgIGVudW1JZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgdGVtcGxhdGVHcm91cE5hbWUsXG4gICAgICAgICAgICAgIHRlbXBsYXRlS2V5LFxuICAgICAgICAgICAgICBlbnVtSWQsXG4gICAgICAgICAgICAgIHN1YlBhdGgsXG4gICAgICAgICAgICAgIGZ1bGxQYXRoLFxuICAgICAgICAgICAgICBpc0V4aXN0cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1c2VzIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHRlbXBsYXRlS2V5OiBzdHJpbmc7XG4gICAgICAgICAgICBlbnVtSWQ/OiBzdHJpbmc7XG4gICAgICAgICAgICBvdmVyd3JpdGU/OiBib29sZWFuO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zY2FmZm9sZGluZy9nZW5lcmF0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iub3B0aW9uc1JlcXVpcmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIOuqqOuToCDthZztlIzrpr/sl5DshJwg7ZWE7JqU7ZWcIGRpY3Qg7YKk66W8IOyImOynkVxuICAgICAgICBjb25zdCBrZXlzID0gb3B0aW9ucy5mbGF0TWFwKCh7IHRlbXBsYXRlS2V5IH0pID0+IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5nZXRSZXF1aXJlZERpY3RLZXlzKCkgPz8gW107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDIuIHRhcmdldOuzhOuhnCBlbnN1cmVEaWN0S2V5cyDtmLjstpwgKOyInOywqCDsspjrpqwpXG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZW5zdXJlRGljdEtleXMoWy4uLm5ldyBTZXQoa2V5cyldKTtcblxuICAgICAgICAvLyAzLiDthZztlIzrpr8g7IOd7ISxICjrs5HroKwg7LKY66asKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBvcHRpb25zLm1hcChhc3luYyAoeyBlbnRpdHlJZCwgdGVtcGxhdGVLZXksIGVudW1JZCwgb3ZlcndyaXRlIH0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVLZXkgYXMgVGVtcGxhdGVLZXksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgICBlbnVtSWQsXG4gICAgICAgICAgICAgICAgfSBhcyB7XG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgZW51bUlkPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmIChpc1NvRXhjZXB0aW9uKGUpICYmIGUuc3RhdHVzQ29kZSA9PT0gNTQxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5maWx0ZXIobm9uTnVsbGFibGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuYWxsRmlsZXNHZW5lcmF0ZWRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgb3B0aW9uOiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdGVtcGxhdGVLZXk6IHN0cmluZztcbiAgICAgICAgICAgIGVudW1JZD86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NjYWZmb2xkaW5nL3ByZXZpZXdcIiwgYXN5bmMgKHJlcXVlc3QpOiBQcm9taXNlPHsgcGF0aEFuZENvZGVzOiBQYXRoQW5kQ29kZVtdIH0+ID0+IHtcbiAgICAgICAgY29uc3QgeyBvcHRpb24gfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgdGVtcGxhdGVLZXksIC4uLnRlbXBsYXRlT3B0aW9ucyB9ID0gb3B0aW9uO1xuICAgICAgICAgIGNvbnN0IHBhdGhBbmRDb2RlcyA9IGF3YWl0IFNvbmFtdS5zeW5jZXIucmVuZGVyVGVtcGxhdGUoXG4gICAgICAgICAgICB0ZW1wbGF0ZUtleSBhcyBUZW1wbGF0ZUtleSxcbiAgICAgICAgICAgIHRlbXBsYXRlT3B0aW9ucyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHsgcGF0aEFuZENvZGVzIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvZml4dHVyZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IHNvdXJjZURCLCB0YXJnZXREQiwgc2VhcmNoLCBkdXBsaWNhdGVDaGVjayB9ID0gcmVxdWVzdC5ib2R5IGFzIHtcbiAgICAgICAgICBzb3VyY2VEQjoga2V5b2YgU29uYW11REJDb25maWc7XG4gICAgICAgICAgdGFyZ2V0REI6IGtleW9mIFNvbmFtdURCQ29uZmlnO1xuICAgICAgICAgIHNlYXJjaDogRml4dHVyZVNlYXJjaE9wdGlvbnM7XG4gICAgICAgICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnM7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIEZpeHR1cmVNYW5hZ2VyLmdldEZpeHR1cmVzKHNvdXJjZURCLCB0YXJnZXREQiwgc2VhcmNoLCBkdXBsaWNhdGVDaGVjayk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL2ZpeHR1cmUvaW1wb3J0XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZGIsIGZpeHR1cmVzIH0gPSByZXF1ZXN0LmJvZHkgYXMge1xuICAgICAgICAgIGRiOiBrZXlvZiBTb25hbXVEQkNvbmZpZztcbiAgICAgICAgICBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyhkYiwgZml4dHVyZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9maXh0dXJlL2FkZEZpeHR1cmVMb2FkZXJcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSByZXF1ZXN0LmJvZHkgYXMgeyBjb2RlOiBzdHJpbmcgfTtcblxuICAgICAgICByZXR1cm4gRml4dHVyZU1hbmFnZXIuYWRkRml4dHVyZUxvYWRlcihjb2RlKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9pMThuL2RpY3Rpb25hcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5nZXREaWN0aW9uYXJ5KCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvaTE4bi9leHBvcnRcIiwgYXN5bmMgKF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbGVuYW1lLCBidWZmZXIgfSA9IGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZXhwb3J0VG9FeGNlbCgpO1xuICAgICAgICByZXBseVxuICAgICAgICAgIC5oZWFkZXIoXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiLFxuICAgICAgICAgIClcbiAgICAgICAgICAuaGVhZGVyKFwiQ29udGVudC1EaXNwb3NpdGlvblwiLCBgYXR0YWNobWVudDsgZmlsZW5hbWU9XCIke2ZpbGVuYW1lfVwiYClcbiAgICAgICAgICAuc2VuZChidWZmZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9pMThuL2ltcG9ydFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdC5maWxlKCk7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmZpbGVOb3RVcGxvYWRlZFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZGF0YS50b0J1ZmZlcigpO1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5pbXBvcnRGcm9tRXhjZWwoYnVmZmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBvbGRLZXk6IHN0cmluZztcbiAgICAgICAgICBuZXdLZXk6IHN0cmluZztcbiAgICAgICAgICBzb3VyY2U6IFwiZW50aXR5XCIgfCBcInByb2plY3RcIiB8IFwic29uYW11XCI7XG4gICAgICAgICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2kxOG4vdXBkYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkudXBkYXRlRW50cnkocmVxdWVzdC5ib2R5KTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGtleTogc3RyaW5nO1xuICAgICAgICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9pMThuL2NyZWF0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmNyZWF0ZUVudHJ5KHJlcXVlc3QuYm9keSk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBrZXk6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9pMThuL2RlbGV0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmRlbGV0ZUVudHJ5KHJlcXVlc3QuYm9keS5rZXkpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGtleXM6IHN0cmluZ1tdIH0gfT4oXCIvYXBpL2kxOG4vY2hlY2tVc2FnZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5jaGVja1VzYWdlKHJlcXVlc3QuYm9keS5rZXlzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyB1aS13ZWIg67mM65OcIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IHVpRGlzdFBhdGggPSBwYXRoLnJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi91aS13ZWJcIik7XG5cbiAgICAgIC8vIOygleyggSDtjIzsnbwg7ISc67mZOiDro6jtirgg7Y+0642UIOyghOyytCAoYXNzZXRzLCBzZXR0aW5nLnN2ZyDrk7EpXG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvc3RhdGljXCIpLCB7XG4gICAgICAgIHJvb3Q6IHVpRGlzdFBhdGgsXG4gICAgICAgIHByZWZpeDogXCIvXCIsXG4gICAgICAgIGRlY29yYXRlUmVwbHk6IGZhbHNlLFxuICAgICAgICB3aWxkY2FyZDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gU1BBIGZhbGxiYWNrIC0g7KCV7KCBIO2MjOydvOydtCDsl4bripQg66qo65OgIOqyveuhnOuKlCBpbmRleC5odG1s66GcXG4gICAgICBzZXJ2ZXIuZ2V0KFwiKlwiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIHJlcGx5LmhlYWRlcnMoeyBcIkNvbnRlbnQtdHlwZVwiOiBcInRleHQvaHRtbFwiIH0pLnNlbmQoXG4gICAgICAgICAgZnNcbiAgICAgICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHVpRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKSlcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAucmVwbGFjZShcInt7cHJvamVjdE5hbWV9fVwiLCBTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiVW5rbm93blNvbmFtdVByb2plY3RcIiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgcHJlZml4OiBcIi9zb25hbXUtdWlcIiB9LFxuICApO1xufVxuIl0sIm5hbWVzIjpbImV4ZWNTeW5jIiwiZnMiLCJpbmZsZWN0aW9uIiwicGF0aCIsInJhbmdlIiwiU29uYW11IiwiU0QiLCJzb25hbXVEaWN0aW9uYXJ5IiwiRW50aXR5TWFuYWdlciIsIkJhZFJlcXVlc3RFeGNlcHRpb24iLCJpc1NvRXhjZXB0aW9uIiwiU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIiwiTWlncmF0b3IiLCJTbGFja0NvbmZpcm0iLCJUZW1wbGF0ZU1hbmFnZXIiLCJGaXh0dXJlTWFuYWdlciIsIkJVSUxUX0lOX1RZUEVfSURTIiwiVGVtcGxhdGVLZXkiLCJub25OdWxsYWJsZSIsInNldEFpQXBpIiwic29uYW11VUlBcGlQbHVnaW4iLCJmYXN0aWZ5IiwicmVnaXN0ZXIiLCJzZXJ2ZXIiLCJtaWdyYXRvciIsIndhaXRGb3JITVJDb21wbGV0ZWQiLCJmbiIsIndhaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsImhhbmRsZXIiLCJjbGVhclRpbWVvdXQiLCJzeW5jZXIiLCJldmVudEVtaXR0ZXIiLCJvZmYiLCJvbmNlIiwicmVzdWx0IiwiZ2V0IiwiY29uZmlnIiwicmVxdWVzdCIsImVudGl0eUlkIiwicHJlc2V0IiwiYWJzUGF0aCIsInF1ZXJ5IiwidGFyZ2V0UGF0aCIsImVudGl0eSIsIm5hbWVzIiwiYXBpUm9vdFBhdGgiLCJmaWxlbmFtZSIsInBhcmVudEZzIiwib3JpZ2luIiwiZ2xvc3NhcnkiLCJNYXAiLCJnZXRBbGxJZHMiLCJ0aXRsZSIsInNldCIsInVuZGVyc2NvcmUiLCJpZCIsInBsdXJhbGl6ZSIsInByb3BzIiwiZm9yRWFjaCIsInByb3AiLCJoYXMiLCJuYW1lIiwiZGVzYyIsInJlcGxhY2UiLCJzdWdnZXN0ZWQiLCJ3b3JkcyIsInNwbGl0IiwiY29tYmluYXRpb25zIiwibGVuZ3RoIiwiZmxhdE1hcCIsImxlbiIsImlkeCIsInciLCJzbGljZSIsImpvaW4iLCJSRVBMQUNFRF9QUkVGSVgiLCJyZW1haW5BcnIiLCJjb21iIiwicmVtYWluU3RyIiwiaW5jbHVkZXMiLCJtYXAiLCJyIiwic3RhcnRzV2l0aCIsInRvVXBwZXJDYXNlIiwiZW50aXR5SWRzIiwiZmxhdHRlblN1YnNldFJvd3MiLCJzdWJzZXRSb3dzIiwic3Vic2V0Um93IiwiY2hpbGRyZW4iLCJzUm93IiwiZW50aXRpZXMiLCJhbGwiLCJnZXRTdWJzZXRSb3dzIiwic29ydCIsImEiLCJiIiwiYUlkIiwicGFyZW50SWQiLCJiSWQiLCJ1bmRlZmluZWQiLCJmaWx0ZXIiLCJyZWxvYWQiLCJhdXRvbG9hZFR5cGVzIiwidHlwZUlkcyIsInByb2plY3RUeXBlSWRzIiwiT2JqZWN0IiwiZW50cmllcyIsInR5cGVzIiwiX3R5cGVJZCIsInpvZFR5cGUiLCJfem9kIiwiZGVmIiwidHlwZSIsInR5cGVJZCIsIl96b2RUeXBlIiwiYnVpbHRJblR5cGVJZHMiLCJhbGxUeXBlSWRzIiwiZW51bUlkcyIsImtleXMiLCJlbnVtTGFiZWxzIiwicG9zdCIsImZvcm0iLCJib2R5IiwiY3JlYXRlRW50aXR5IiwiZGVsRW50aXR5IiwibmV3VmFsdWVzIiwidGFibGUiLCJzYXZlIiwic3Vic2V0S2V5IiwiZmllbGRzIiwiZmllbGRzSW50ZXJuYWwiLCJzdWJzZXRzIiwic3Vic2V0c0ludGVybmFsIiwidXBkYXRlZCIsInVwZGF0ZWRJbnRlcm5hbCIsImF0IiwibmV3UHJvcCIsImNyZWF0ZVByb3AiLCJtb2RpZnlQcm9wIiwiZGVsUHJvcCIsInRvIiwibW92ZVByb3AiLCJpbmRleGVzIiwibmV3RW51bUlkIiwiRXJyb3IiLCJlbmRzV2l0aCIsImFjdGl2ZSIsImhpZGRlbiIsImVudW1JZCIsImlzRXhpc3RzIiwic29tZSIsImFmdGVyIiwiYmVmb3JlIiwiaXNSZWZlcmVuY2VkIiwiY29sdW1ucyIsImdldFRhYmxlQ29sdW1ucyIsInN0YXR1cyIsImdldFN0YXR1cyIsImFjdGlvbiIsInRhcmdldHMiLCJmb3JjZSIsImZvcmNlUmVhc29uIiwicmVxdWVzdG9yIiwicnVuU2hhZG93VGVzdCIsInNsYWNrQ29uZmlybSIsInJlcXVpcmVzQXBwcm92YWwiLCJ0IiwiaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsIiwibG9jYWxIb3N0cyIsImlzTG9jYWxUYXJnZXQiLCJldmVyeSIsInRhcmdldCIsInRhcmdldENvbmZpZyIsImRiQ29uZmlnIiwiaG9zdCIsImNvbm5lY3Rpb24iLCJ0b0xvd2VyQ2FzZSIsImlzQ29uZmlndXJlZCIsImNvbm5zIiwicGVuZGluZ01pZ3JhdGlvbnMiLCJTZXQiLCJjb25uIiwiY29ubktleSIsInBlbmRpbmciLCJleGlzdGluZyIsImdldEV4aXN0aW5nUmVxdWVzdCIsImFwcHJvdmVkIiwicmVqZWN0ZWQiLCJjaGVja0FwcHJvdmFsIiwiY2hhbm5lbCIsInRzIiwicnVuQWN0aW9uIiwibG9nRXhlY3V0aW9uIiwiZm9yY2VBcHByb3ZhbCIsInBvc3RBcHByb3ZhbFJlcXVlc3QiLCJzYXZlUmVxdWVzdCIsInJlYXNvbiIsInN1Y2Nlc3MiLCJjb2RlTmFtZXMiLCJkZWxDb2RlcyIsIl9yZXF1ZXN0dCIsImdlbmVyYXRlUHJlcGFyZWRDb2RlcyIsInRlbXBsYXRlR3JvdXBOYW1lIiwidGVtcGxhdGVLZXlzIiwiX3RlbXBsYXRlS2V5cyIsIm9wdGlvbnMiLCJ0ayIsImdldENoaWxkcmVuSWRzIiwiYWxsRW51bUlkcyIsInRlbXBsYXRlS2V5Iiwic3RhdHVzZXMiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJjaGVja0V4aXN0c0dlbkNvZGUiLCJ0ZW1wbGF0ZSIsImdldFJlcXVpcmVkRGljdEtleXMiLCJlbnN1cmVEaWN0S2V5cyIsIm92ZXJ3cml0ZSIsImdlbmVyYXRlVGVtcGxhdGUiLCJlIiwic3RhdHVzQ29kZSIsImNvbnNvbGUiLCJlcnJvciIsIm9wdGlvbiIsInRlbXBsYXRlT3B0aW9ucyIsInBhdGhBbmRDb2RlcyIsInJlbmRlclRlbXBsYXRlIiwic291cmNlREIiLCJ0YXJnZXREQiIsInNlYXJjaCIsImR1cGxpY2F0ZUNoZWNrIiwiZ2V0Rml4dHVyZXMiLCJkYiIsImZpeHR1cmVzIiwiaW5zZXJ0Rml4dHVyZXMiLCJjb2RlIiwiYWRkRml4dHVyZUxvYWRlciIsImdldERpY3Rpb25hcnkiLCJfcmVxdWVzdCIsInJlcGx5IiwiYnVmZmVyIiwiZXhwb3J0VG9FeGNlbCIsImhlYWRlciIsInNlbmQiLCJkYXRhIiwiZmlsZSIsInRvQnVmZmVyIiwiaW1wb3J0RnJvbUV4Y2VsIiwidXBkYXRlRW50cnkiLCJjcmVhdGVFbnRyeSIsImRlbGV0ZUVudHJ5Iiwia2V5IiwiY2hlY2tVc2FnZSIsInVpRGlzdFBhdGgiLCJkaXJuYW1lIiwicm9vdCIsInByZWZpeCIsImRlY29yYXRlUmVwbHkiLCJ3aWxkY2FyZCIsImhlYWRlcnMiLCJyZWFkRmlsZVN5bmMiLCJ0b1N0cmluZyIsInByb2plY3ROYW1lIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLFFBQVEsZ0JBQWdCO0FBRXpDLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsS0FBSyxRQUFRLFVBQVU7QUFDaEMsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUV2QyxTQUFTQyxFQUFFLFFBQVEsZ0JBQWE7QUFDaEMsU0FBU0MsZ0JBQWdCLFFBQVEsK0JBQTRCO0FBRTdELFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FDRUMsbUJBQW1CLEVBQ25CQyxhQUFhLEVBQ2JDLDJCQUEyQixRQUN0QixpQ0FBOEI7QUFDckMsU0FBK0JDLFFBQVEsUUFBUSwyQkFBd0I7QUFDdkUsU0FBU0MsWUFBWSxRQUF3QyxnQ0FBNkI7QUFDMUYsU0FBU0MsZUFBZSxRQUFRLGtDQUErQjtBQUMvRCxTQUFxQ0MsY0FBYyxRQUFRLGdDQUE2QjtBQUN4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
1113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgQWRkcmVzc0luZm8gfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCLCB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgc29uYW11RGljdGlvbmFyeSB9IGZyb20gXCIuLi9kaWN0L3NvbmFtdS1kaWN0aW9uYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgaXNTb0V4Y2VwdGlvbixcbiAgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uLFxufSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCwgTWlncmF0b3IgfSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IEZpeHR1cmVHZW5lcmF0b3IgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgdHlwZSBEdXBsaWNhdGVDaGVja09wdGlvbnMsIEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5U3Vic2V0Um93LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIHR5cGUgRmxhdHRlblN1YnNldFJvdyxcbiAgdHlwZSBQYXRoQW5kQ29kZSxcbiAgVGVtcGxhdGVLZXksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHNldEFpQXBpIH0gZnJvbSBcIi4vYWktYXBpXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzb25hbXVVSUFwaVBsdWdpbihmYXN0aWZ5OiBGYXN0aWZ5SW5zdGFuY2UpIHtcbiAgZmFzdGlmeS5yZWdpc3RlcihcbiAgICBhc3luYyAoc2VydmVyKSA9PiB7XG4gICAgICAvLyBtaWdyYXRvclxuICAgICAgY29uc3QgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcblxuICAgICAgLy8gd2FpdEZvckhNUkNvbXBsZXRlZFxuICAgICAgYXN5bmMgZnVuY3Rpb24gd2FpdEZvckhNUkNvbXBsZXRlZDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB3YWl0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sIDE1MDApO1xuXG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIFNvbmFtdS5zeW5jZXIuZXZlbnRFbWl0dGVyLm9mZihcIm9uSE1SQ29tcGxldGVkXCIsIGhhbmRsZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBTb25hbXUuc3luY2VyLmV2ZW50RW1pdHRlci5vbmNlKFwib25ITVJDb21wbGV0ZWRcIiwgaGFuZGxlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgICAgIGF3YWl0IHdhaXRQcm9taXNlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzZXRBaUFwaShzZXJ2ZXIpO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9zb25hbXUvY29uZmlnXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFNvbmFtdS5jb25maWc7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgZW50aXR5SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgcHJlc2V0PzogXCJ0eXBlc1wiIHwgXCJlbnRpdHkuanNvblwiIHwgXCJnZW5lcmF0ZWRcIjtcbiAgICAgICAgICBhYnNQYXRoPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3Rvb2xzL29wZW5Wc2NvZGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgcHJlc2V0LCBhYnNQYXRoIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuXG4gICAgICAgIGNvbnN0IHRhcmdldFBhdGggPSAoKCkgPT4ge1xuICAgICAgICAgIGlmIChlbnRpdHlJZCAmJiBwcmVzZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZXMgfSA9IGVudGl0eTtcblxuICAgICAgICAgICAgY29uc3QgeyBhcGlSb290UGF0aCB9ID0gU29uYW11O1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBzd2l0Y2ggKHByZXNldCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0eXBlc1wiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWVzLmZzfS50eXBlcy50c2A7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudGl0eS5qc29uXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmFtZXMuZnN9LmVudGl0eS5qc29uYDtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ2VuZXJhdGVkXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmFtZXMuZnN9LmdlbmVyYXRlZC50c2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gYCR7YXBpUm9vdFBhdGh9L3NyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5wYXJlbnRGc30vJHtmaWxlbmFtZX1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWFic1BhdGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IucHJlc2V0T3JBYnNQYXRoUmVxdWlyZWRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFic1BhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICBleGVjU3luYyhgY29kZSAke3RhcmdldFBhdGh9YCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgb3JpZ2luOiBzdHJpbmc7XG4gICAgICAgICAgZW50aXR5SWQ/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdG9vbHMvZ2V0U3VnZ2VzdGlvblwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IG9yaWdpbiwgZW50aXR5SWQgfSA9IHJlcXVlc3QucXVlcnk7XG5cbiAgICAgICAgLy8g7LmY7ZmYIOyaqeyWtOynkVxuICAgICAgICBjb25zdCBnbG9zc2FyeSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgICAgICAgICBbXCJzdGF0dXNcIiwgXCLsg4Htg5xcIl0sXG4gICAgICAgICAgW1widHlwZVwiLCBcIu2DgOyehVwiXSxcbiAgICAgICAgICBbXCJpbWFnZVwiLCBcIuydtOuvuOyngFwiXSxcbiAgICAgICAgICBbXCJpbWFnZXNcIiwgXCLsnbTrr7jsp4DrpqzsiqTtirhcIl0sXG4gICAgICAgICAgW1widXJsXCIsIFwiVVJMXCJdLFxuICAgICAgICAgIFtcImlkXCIsIFwiSURcIl0sXG4gICAgICAgICAgW1wibmFtZVwiLCBge0VudGl0eUlEfeuqhWBdLFxuICAgICAgICAgIFtcInRpdGxlXCIsIFwie0VudGl0eUlEfeuqhVwiXSxcbiAgICAgICAgICBbXCJwYXJlbnRcIiwgXCLsg4HsnIR7RW50aXR5SUR9XCJdLFxuICAgICAgICAgIFtcImRlc2NcIiwgXCLshKTrqoVcIl0sXG4gICAgICAgICAgW1wiYXRcIiwgXCLsnbzsi5xcIl0sXG4gICAgICAgICAgW1wiY3JlYXRlZFwiLCBcIuuTseuhnVwiXSxcbiAgICAgICAgICBbXCJ1cGRhdGVkXCIsIFwi7IiY7KCVXCJdLFxuICAgICAgICAgIFtcImRlbGV0ZWRcIiwgXCLsgq3soJxcIl0sXG4gICAgICAgICAgW1wiYnlcIiwgXCLsnKDsoIBcIl0sXG4gICAgICAgICAgW1wiZGF0ZVwiLCBcIuydvOyekFwiXSxcbiAgICAgICAgICBbXCJ0aW1lXCIsIFwi7Iuc6rCEXCJdLFxuICAgICAgICAgIFtcImtvXCIsIFwiKO2VnOq4gClcIl0sXG4gICAgICAgICAgW1wiZW5cIiwgXCIo7JiB66y4KVwiXSxcbiAgICAgICAgICBbXCJrcndcIiwgXCIo7JuQKVwiXSxcbiAgICAgICAgICBbXCJ1c2RcIiwgXCIoVVNEKVwiXSxcbiAgICAgICAgICBbXCJjb2xvclwiLCBcIuy7rOufrFwiXSxcbiAgICAgICAgICBbXCJjb2RlXCIsIFwi7L2U65OcXCJdLFxuICAgICAgICAgIFtcInhcIiwgXCJY7KKM7ZGcXCJdLFxuICAgICAgICAgIFtcInlcIiwgXCJZ7KKM7ZGcXCJdLFxuICAgICAgICAgIFtcImN1cnJlbnRcIiwgXCLtmITsnqxcIl0sXG4gICAgICAgICAgW1wic3RvY2tcIiwgXCLsnqzqs6BcIl0sXG4gICAgICAgICAgW1widG90YWxcIiwgXCLstJ1cIl0sXG4gICAgICAgICAgW1wiYWRtaW5cIiwgXCLqtIDrpqzsnpBcIl0sXG4gICAgICAgICAgW1wiZ3JvdXBcIiwgXCLqt7jro7lcIl0sXG4gICAgICAgICAgW1wiaXRlbVwiLCBcIuyVhOydtO2FnFwiXSxcbiAgICAgICAgICBbXCJjbnRcIiwgXCLsiJjrn4lcIl0sXG4gICAgICAgICAgW1wicHJpY2VcIiwgXCLqsIDqsqlcIl0sXG4gICAgICAgICAgW1wicHJlc2V0XCIsIFwi7ZSE66as7IWLXCJdLFxuICAgICAgICAgIFtcImFjY3RcIiwgXCLqs4TsooxcIl0sXG4gICAgICAgICAgW1widGVsXCIsIFwi7KCE7ZmU67KI7Zi4XCJdLFxuICAgICAgICAgIFtcIm5vXCIsIFwi67KI7Zi4XCJdLFxuICAgICAgICAgIFtcImJvZHlcIiwgXCLrgrTsmqlcIl0sXG4gICAgICAgICAgW1wiY29udGVudFwiLCBcIuuCtOyaqVwiXSxcbiAgICAgICAgICBbXCJvcmRlcm5vXCIsIFwi7KCV66Cs7Iic7IScXCJdLFxuICAgICAgICAgIFtcInByaW9yaXR5XCIsIFwi7Jqw7ISg7Iic7JyEXCJdLFxuICAgICAgICAgIFtcInRleHRcIiwgXCLthY3siqTtirhcIl0sXG4gICAgICAgICAgW1wia2V5XCIsIFwi7YKkXCJdLFxuICAgICAgICAgIFtcInN1bVwiLCBcIu2VqeyCsFwiXSxcbiAgICAgICAgICBbXCJleHBlY3RlZFwiLCBcIuyYiOyDgVwiXSxcbiAgICAgICAgICBbXCJhY3R1YWxcIiwgXCLsi6TsoJxcIl0sXG4gICAgICAgIF0pO1xuICAgICAgICAvLyDsoITssrQg7JeU7Yuw7YuwIOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwIO2DgOydtO2LgOqzvCDtlITroa0g7ISk66qF7J2EIOy5mO2ZmCDsmqnslrTsp5Hsl5Ag7LaU6rCAXG4gICAgICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKSkge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBpZiAoKGVudGl0eS50aXRsZSA/PyBcIlwiKSAhPT0gXCJcIikge1xuICAgICAgICAgICAgZ2xvc3Nhcnkuc2V0KGluZmxlY3Rpb24udW5kZXJzY29yZShlbnRpdHkuaWQpLCBlbnRpdHkudGl0bGUpO1xuICAgICAgICAgICAgZ2xvc3Nhcnkuc2V0KFxuICAgICAgICAgICAgICBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5LmlkKSksXG4gICAgICAgICAgICAgIGAke2VudGl0eS50aXRsZX3rpqzsiqTtirhgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbnRpdHkucHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdsb3NzYXJ5Lmhhcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wLmRlc2MpIHtcbiAgICAgICAgICAgICAgZ2xvc3Nhcnkuc2V0KHByb3AubmFtZSwgcHJvcC5kZXNjLnJlcGxhY2UoZW50aXR5LnRpdGxlID8/IFwiXCIsIFwie0VudGl0eUlEfVwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWdnZXN0ZWQgPSAoKCkgPT4ge1xuICAgICAgICAgIC8vIOuLqOyWtCDrtoTrpqwsIOqwgOuKpe2VnCDsobDtlakg7IOd7ISxXG4gICAgICAgICAgY29uc3Qgd29yZHMgPSBvcmlnaW4uc3BsaXQoXCJfXCIpO1xuICAgICAgICAgIGNvbnN0IGNvbWJpbmF0aW9ucyA9IFsuLi5yYW5nZSh3b3Jkcy5sZW5ndGgsIDAsIC0xKV0uZmxhdE1hcCgobGVuKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAuLi5yYW5nZSgwLCB3b3Jkcy5sZW5ndGggLSBsZW4gKyAxLCAoaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGxlbixcbiAgICAgICAgICAgICAgICAgIHc6IHdvcmRzLnNsaWNlKGlkeCwgaWR4ICsgbGVuKS5qb2luKFwiX1wiKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsobDtlansnYQg7Iic7ZqM7ZWY66mwLCDsuZjtmZgg7Jqp7Ja07KeR7JeQIOyeiOuKlCDri6jslrTqsIAg7Y+s7ZWo65CcIOqyveyasCwg7LmY7ZmYIOyaqeyWtOuhnCDsuZjtmZhcbiAgICAgICAgICBjb25zdCBSRVBMQUNFRF9QUkVGSVggPSBcIiNSRVBMQUNFRC8vXCI7IC8vIOy5mO2ZmOuQnCDri6jslrTrpbwgam9pbiDsnbTtm4Tsl5Drj4Qg7Iud67OE7ZWY6riwIOychO2VtCBwcmVmaXgg7LaU6rCAXG4gICAgICAgICAgbGV0IHJlbWFpbkFycjogc3RyaW5nW10gPSBbLi4ud29yZHNdO1xuICAgICAgICAgIGZvciAoY29uc3QgY29tYiBvZiBjb21iaW5hdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpblN0ciA9IHJlbWFpbkFyci5qb2luKFwiX1wiKTtcbiAgICAgICAgICAgIGlmIChyZW1haW5TdHIuaW5jbHVkZXMoY29tYi53KSAmJiBnbG9zc2FyeS5oYXMoY29tYi53KSkge1xuICAgICAgICAgICAgICByZW1haW5BcnIgPSByZW1haW5TdHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZShjb21iLncsIFJFUExBQ0VEX1BSRUZJWCArIGdsb3NzYXJ5LmdldChjb21iLncpKVxuICAgICAgICAgICAgICAgIC5zcGxpdChcIl9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlbWFpbkFyclxuICAgICAgICAgICAgLm1hcCgocikgPT4ge1xuICAgICAgICAgICAgICBpZiAoci5zdGFydHNXaXRoKFJFUExBQ0VEX1BSRUZJWCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci5yZXBsYWNlKFJFUExBQ0VEX1BSRUZJWCwgXCJcIik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXCIpXG4gICAgICAgICAgICAucmVwbGFjZSgve0VudGl0eUlEfS9nLCBlbnRpdHlJZCA/IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS50aXRsZSA6IFwiXCIpO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHJldHVybiB7IHN1Z2dlc3RlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2VudGl0eS9maW5kTWFueVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICAgICAgZnVuY3Rpb24gZmxhdHRlblN1YnNldFJvd3Moc3Vic2V0Um93czogRW50aXR5U3Vic2V0Um93W10pOiBGbGF0dGVuU3Vic2V0Um93W10ge1xuICAgICAgICAgIHJldHVybiBzdWJzZXRSb3dzLmZsYXRNYXAoKHN1YnNldFJvdykgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjaGlsZHJlbiwgLi4uc1JvdyB9ID0gc3Vic2V0Um93O1xuICAgICAgICAgICAgcmV0dXJuIFtzUm93LCAuLi5mbGF0dGVuU3Vic2V0Um93cyhjaGlsZHJlbildO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50aXRpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlbnRpdHlJZHMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0Um93cyA9IGVudGl0eS5nZXRTdWJzZXRSb3dzKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmVudGl0eSxcbiAgICAgICAgICAgICAgZmxhdHRlblN1YnNldFJvd3M6IGZsYXR0ZW5TdWJzZXRSb3dzKHN1YnNldFJvd3MpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBlbnRpdGllcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgYUlkID0gYS5wYXJlbnRJZCA/PyBhLmlkO1xuICAgICAgICAgIGNvbnN0IGJJZCA9IGIucGFyZW50SWQgPz8gYi5pZDtcbiAgICAgICAgICBpZiAoYUlkIDwgYklkKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKGFJZCA+IGJJZCkgcmV0dXJuIDE7XG4gICAgICAgICAgaWYgKGFJZCA9PT0gYklkKSB7XG4gICAgICAgICAgICBpZiAoYS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gLTE7XG4gICAgICAgICAgICBpZiAoYi5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGVudGl0aWVzIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgZmlsdGVyPzogXCJlbnVtc1wiIHwgXCJ0eXBlc1wiO1xuICAgICAgICAgIHJlbG9hZD86IFwiMVwiO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS90eXBlSWRzXCIsIGFzeW5jIChyZXF1ZXN0KTogUHJvbWlzZTx7IHR5cGVJZHM6IHN0cmluZ1tdIH0+ID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWx0ZXIsIHJlbG9hZCB9ID0gcmVxdWVzdC5xdWVyeTtcblxuICAgICAgICBpZiAocmVsb2FkID09PSBcIjFcIikge1xuICAgICAgICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHlwZUlkcyA9ICgoKSA9PiB7XG4gICAgICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoXrk6RcbiAgICAgICAgICBjb25zdCBwcm9qZWN0VHlwZUlkcyA9IE9iamVjdC5lbnRyaWVzKFNvbmFtdS5zeW5jZXIudHlwZXMpXG4gICAgICAgICAgICAuZmlsdGVyKChbX3R5cGVJZCwgem9kVHlwZV0pID0+ICh6b2RUeXBlLl96b2QuZGVmLnR5cGUgYXMgc3RyaW5nKSAhPT0gXCJlbnVtXCIpXG4gICAgICAgICAgICAubWFwKChbdHlwZUlkLCBfem9kVHlwZV0pID0+IHR5cGVJZCk7XG5cbiAgICAgICAgICAvLyDrgrTsnqUg7YOA7J6F65OkIChzb25hbXUg7L2U7Ja07JeQ7IScIOygnOqztSlcbiAgICAgICAgICBjb25zdCBidWlsdEluVHlwZUlkcyA9IFsuLi5CVUlMVF9JTl9UWVBFX0lEU107XG5cbiAgICAgICAgICAvLyDrqqjrk6Ag7YOA7J6FIOuzke2VqVxuICAgICAgICAgIGNvbnN0IGFsbFR5cGVJZHMgPSBbLi4uYnVpbHRJblR5cGVJZHMsIC4uLnByb2plY3RUeXBlSWRzXTtcblxuICAgICAgICAgIGlmIChmaWx0ZXIgPT09IFwidHlwZXNcIikge1xuICAgICAgICAgICAgcmV0dXJuIGFsbFR5cGVJZHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW51bUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkuZmxhdE1hcCgoZW50aXR5SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVscyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoZmlsdGVyID09PSBcImVudW1zXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnVtSWRzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWy4uLmFsbFR5cGVJZHMsIC4uLmVudW1JZHNdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGVJZHMsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZm9ybToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgICAgICAgICB0YWJsZTogc3RyaW5nO1xuICAgICAgICAgICAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvY3JlYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGZvcm0gfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBhd2FpdCBTb25hbXUuc3luY2VyLmNyZWF0ZUVudGl0eSh7IC4uLmZvcm0sIGVudGl0eUlkOiBmb3JtLmlkIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2RlbFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIHJldHVybiBhd2FpdCBTb25hbXUuc3luY2VyLmRlbEVudGl0eShlbnRpdHlJZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgbmV3VmFsdWVzOiB7XG4gICAgICAgICAgICB0aXRsZTogc3RyaW5nO1xuICAgICAgICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgICAgICAgIHBhcmVudElkPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeUVudGl0eUJhc2VcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIG5ld1ZhbHVlcyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkudGl0bGUgPSBuZXdWYWx1ZXMudGl0bGU7XG4gICAgICAgICAgZW50aXR5LnRhYmxlID0gbmV3VmFsdWVzLnRhYmxlO1xuICAgICAgICAgIGVudGl0eS5wYXJlbnRJZCA9IG5ld1ZhbHVlcy5wYXJlbnRJZDtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgc3Vic2V0S2V5OiBzdHJpbmc7XG4gICAgICAgICAgZmllbGRzOiBzdHJpbmdbXTtcbiAgICAgICAgICBmaWVsZHNJbnRlcm5hbD86IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlTdWJzZXRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHN1YnNldEtleSwgZmllbGRzLCBmaWVsZHNJbnRlcm5hbCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gZmllbGRzO1xuICAgICAgICAgIGlmIChmaWVsZHNJbnRlcm5hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoZmllbGRzSW50ZXJuYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPSBmaWVsZHNJbnRlcm5hbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4geyB1cGRhdGVkOiBmaWVsZHMsIHVwZGF0ZWRJbnRlcm5hbDogZmllbGRzSW50ZXJuYWwgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBzdWJzZXRLZXk6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsU3Vic2V0XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBzdWJzZXRLZXkgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZGVsZXRlIGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgICAgZGVsZXRlIGVudGl0eS5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgbmV3UHJvcDogRW50aXR5UHJvcDtcbiAgICAgICAgICBhdD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvY3JlYXRlUHJvcFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgYXQsIG5ld1Byb3AgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgYXdhaXQgZW50aXR5LmNyZWF0ZVByb3AobmV3UHJvcCwgYXQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIG5ld1Byb3A6IEVudGl0eVByb3A7XG4gICAgICAgICAgYXQ6IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5UHJvcFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgYXQsIG5ld1Byb3AgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkubW9kaWZ5UHJvcChuZXdQcm9wLCBhdCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBhdDogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9kZWxQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5kZWxQcm9wKGF0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBhdDogbnVtYmVyO1xuICAgICAgICAgIHRvOiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vdmVQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCwgdG8gfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkubW92ZVByb3AoYXQsIHRvKTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeUluZGV4ZXNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGluZGV4ZXMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LmluZGV4ZXMgPSBpbmRleGVzO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4geyB1cGRhdGVkOiBpbmRleGVzIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgZW51bUxhYmVsczogRW50aXR5W1wiZW51bUxhYmVsc1wiXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5RW51bUxhYmVsc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZW51bUxhYmVscyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscyA9IGVudW1MYWJlbHM7XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiB7IHVwZGF0ZWQ6IGVudW1MYWJlbHMgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdFbnVtSWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvY3JlYXRlRW51bUlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBuZXdFbnVtSWQgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICBpZiAoZW50aXR5LmVudW1MYWJlbHNbbmV3RW51bUlkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnbTrr7gg7KG07J6s7ZWY64qUIGVudW1JZOyeheuLiOuLpDogJHtuZXdFbnVtSWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZW50aXR5LmVudW1MYWJlbHNbbmV3RW51bUlkXSA9IHtcbiAgICAgICAgICAgIC4uLihuZXdFbnVtSWQuZW5kc1dpdGgoXCJTdGF0dXNcIilcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBhY3RpdmU6IFwi64W47LacXCIsXG4gICAgICAgICAgICAgICAgICBoaWRkZW46IFwi7Iio6rmAXCIsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIFwiXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgZW51bUlkOiB7XG4gICAgICAgICAgICBiZWZvcmU6IHN0cmluZztcbiAgICAgICAgICAgIGFmdGVyOiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5RW51bUlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBlbnVtSWQgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgICAgIGNvbnN0IGlzRXhpc3RzID0gZW50aXR5SWRzLnNvbWUoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHMpLmluY2x1ZGVzKGVudW1JZC5hZnRlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzRXhpc3RzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOydtOuvuCDsobTsnqztlZjripQgRW51bUlk7J6F64uI64ukOiAke2VudW1JZC5hZnRlcn1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LmVudW1MYWJlbHNbZW51bUlkLmFmdGVyXSA9IGVudGl0eS5lbnVtTGFiZWxzW2VudW1JZC5iZWZvcmVdO1xuICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWQuYmVmb3JlXTtcblxuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGVudGl0eUlkIG9mIGVudGl0eUlkcykge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICAgICAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIiAmJiBwcm9wLmlkID09PSBlbnVtSWQuYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgcHJvcC5pZCA9IGVudW1JZC5hZnRlcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgZW51bUlkOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2RlbGV0ZUVudW1JZFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZW51bUlkIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgICAgIGNvbnN0IGlzUmVmZXJlbmNlZCA9IGVudGl0eUlkc1xuICAgICAgICAgICAgLmZsYXRNYXAoKGVudGl0eUlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMpXG4gICAgICAgICAgICAuc29tZSgocHJvcCkgPT4gcHJvcC50eXBlID09PSBcImVudW1cIiAmJiBwcm9wLmlkID09PSBlbnVtSWQpO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnVtSWR966W8IOywuOyhsO2VmOuKlCDtlITroZztjbzti7DqsIAg7KG07J6s7ZWp64uI64ukLmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LmVudW1MYWJlbHNbZW51bUlkXTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIHRhcmdldDogXCJlbnRpdHlcIiB8IFwicHJvcFwiIHwgXCJlbnVtXCIgfCBcInN1YnNldFwiO1xuICAgICAgICAgIHByb3BOYW1lPzogc3RyaW5nO1xuICAgICAgICAgIGVudW1JZD86IHN0cmluZztcbiAgICAgICAgICBzdWJzZXRLZXk/OiBzdHJpbmc7XG4gICAgICAgICAgY29uZTogQ29uZTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvdXBkYXRlQ29uZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgdGFyZ2V0LCBwcm9wTmFtZSwgZW51bUlkLCBzdWJzZXRLZXksIGNvbmUgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0ID09PSBcImVudGl0eVwiKSB7XG4gICAgICAgICAgICBlbnRpdHkuY29uZSA9IGNvbmU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09IFwicHJvcFwiICYmIHByb3BOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gXCJlbnVtXCIgJiYgZW51bUlkKSB7XG4gICAgICAgICAgICBlbnRpdHkuZW51bUNvbmVzW2VudW1JZF0gPSBjb25lO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSBcInN1YnNldFwiICYmIHN1YnNldEtleSkge1xuICAgICAgICAgICAgZW50aXR5LnN1YnNldENvbmVzW3N1YnNldEtleV0gPSBjb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgICAgICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICAgICAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2dlbmVyYXRlQ29uZXNcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBwcmVzZXJ2ZUV4aXN0aW5nLCBvbmx5RW1wdHksIGxvY2FsZSB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eSDsobTsnqwg7Jes67aAIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAgICAgICAvLyBsb2NhbGUg6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDsgqzsmqlcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUxvY2FsZSA9XG4gICAgICAgICAgICAgIGxvY2FsZSA/PyAoU29uYW11LmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGUgYXMgXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTtcblxuICAgICAgICAgICAgLy8gQ29uZSDsg53shLFcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgICAgICAgcHJlc2VydmVFeGlzdGluZzogcHJlc2VydmVFeGlzdGluZyA/PyB0cnVlLFxuICAgICAgICAgICAgICBvbmx5RW1wdHk6IG9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgbG9jYWxlOiBlZmZlY3RpdmVMb2NhbGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblxuICAgICAgICAgICAgLy8gRW50aXR5IG5vdCBmb3VuZFxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCLsobTsnqztlZjsp4Ag7JWK64qUIEVudGl0eVwiKSkge1xuICAgICAgICAgICAgICByZXBseS5zdGF0dXMoNDA0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQVBJIO2CpCDsl4bsnYxcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiQU5USFJPUElDX0FQSV9LRVkgbm90IGZvdW5kXCIpKSB7XG4gICAgICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBcIkFQSSBrZXkgbm90IGNvbmZpZ3VyZWRcIixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmF0ZSBsaW1pdFxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJSYXRlIGxpbWl0IGV4Y2VlZGVkXCIpKSB7XG4gICAgICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MjkpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBcIlJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOq4sO2DgCDsl5Drn6xcbiAgICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIGVycm9yOiBgQ29uZSBnZW5lcmF0aW9uIGZhaWxlZDogJHttZXNzYWdlfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZ2V0VGFibGVDb2x1bW5zXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5SWQgfSA9IHJlcXVlc3QucXVlcnk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IGVudGl0eS5nZXRUYWJsZUNvbHVtbnMoKTtcbiAgICAgICAgcmV0dXJuIHsgY29sdW1ucyB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL21pZ3JhdGlvbnMvc3RhdHVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG5cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgYWN0aW9uOiBcImFwcGx5XCIgfCBcInJvbGxiYWNrXCIgfCBcInNoYWRvd1wiO1xuICAgICAgICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXTtcbiAgICAgICAgICBmb3JjZT86IGJvb2xlYW47XG4gICAgICAgICAgZm9yY2VSZWFzb24/OiBzdHJpbmc7XG4gICAgICAgICAgcmVxdWVzdG9yPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXG4gICAgICAgIFwiL2FwaS9taWdyYXRpb25zL3J1bkFjdGlvblwiLFxuICAgICAgICBhc3luYyAocmVxdWVzdCk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0IHwgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdD4gPT4ge1xuICAgICAgICAgIGNvbnN0IHsgYWN0aW9uLCB0YXJnZXRzLCBmb3JjZSwgZm9yY2VSZWFzb24sIHJlcXVlc3RvciB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgaWYgKGFjdGlvbiA9PT0gXCJzaGFkb3dcIikge1xuICAgICAgICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTbGFjayDsirnsnbgg7LK07YGsIChhcHBseSDsi5zsl5Drp4wpXG4gICAgICAgICAgaWYgKGFjdGlvbiA9PT0gXCJhcHBseVwiKSB7XG4gICAgICAgICAgICBjb25zdCBzbGFja0NvbmZpcm0gPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGFyZ2V0cy5zb21lKCh0KSA9PiBzbGFja0NvbmZpcm0uaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKHQpKTtcblxuICAgICAgICAgICAgLy8g66Gc7LusIERC7J24IOqyveyasCDsirnsnbgg7Iqk7YK1XG4gICAgICAgICAgICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgICAgICAgICAgIGNvbnN0IGlzTG9jYWxUYXJnZXQgPSB0YXJnZXRzLmV2ZXJ5KCh0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q29uZmlnID0gU29uYW11LmRiQ29uZmlnW3RhcmdldF07XG4gICAgICAgICAgICAgIGNvbnN0IGhvc3QgPSAodGFyZ2V0Q29uZmlnPy5jb25uZWN0aW9uIGFzIHsgaG9zdD86IHN0cmluZyB9KT8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgICAgICAgICAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChyZXF1aXJlc0FwcHJvdmFsICYmIHNsYWNrQ29uZmlybS5pc0NvbmZpZ3VyZWQoKSAmJiAhaXNMb2NhbFRhcmdldCkge1xuICAgICAgICAgICAgICBjb25zdCB7IGNvbm5zIH0gPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcblxuICAgICAgICAgICAgICAvLyDrqqjrk6Ag7YOA6rKfIERC7JeQ7IScIHBlbmRpbmfsnbgg66eI7J206re466CI7J207IWY7J2YIO2Vqeynke2VqeydhCDqtaztlanri4jri6QuXG4gICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdNaWdyYXRpb25zID0gW1xuICAgICAgICAgICAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICBjb25uc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChjb25uKSA9PiB0YXJnZXRzLmluY2x1ZGVzKGNvbm4uY29ubktleSBhcyBrZXlvZiBTb25hbXVEQkNvbmZpZykpXG4gICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKChjb25uKSA9PiBjb25uLnBlbmRpbmcpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgaWYgKHBlbmRpbmdNaWdyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyDquLDsobQg7Iq57J24IOyalOyyrSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHNsYWNrQ29uZmlybS5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZ01pZ3JhdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAvLyDquLDsobQg7JqU7LKt7J20IOyeiOycvOuptCDsirnsnbgg7IOB7YOcIO2ZleyduFxuICAgICAgICAgICAgICAgICAgY29uc3QgeyBhcHByb3ZlZCwgcmVqZWN0ZWQgfSA9IGF3YWl0IHNsYWNrQ29uZmlybS5jaGVja0FwcHJvdmFsKFxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChhcHByb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyDsirnsnbjrkKgg4oaSIOyLpO2WiVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oYWN0aW9uLCB0YXJnZXRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLmxvZ0V4ZWN1dGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RvcixcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm1pZ3JhdGlvblJlamVjdGVkXCIpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yY2Ug7KeE7ZaJXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5mb3JjZUFwcHJvdmFsKFxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICAgICAgZm9yY2VSZWFzb24gPz8gXCLsgqzsnKAg7JeG7J2MXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oYWN0aW9uLCB0YXJnZXRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLmxvZ0V4ZWN1dGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RvcixcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyDrjIDquLDspJFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInBlbmRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgIHRzOiBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8g7IOIIOyKueyduCDsmpTssq0g67Cc7IahXG4gICAgICAgICAgICAgICAgICBjb25zdCB7IGNoYW5uZWwsIHRzIH0gPSBhd2FpdCBzbGFja0NvbmZpcm0ucG9zdEFwcHJvdmFsUmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ01pZ3JhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldHMsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RvcixcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0uc2F2ZVJlcXVlc3QocGVuZGluZ01pZ3JhdGlvbnMsIGNoYW5uZWwsIHRzKTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwZW5kaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgIHRzLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbWlncmF0b3IucnVuQWN0aW9uKGFjdGlvbiwgdGFyZ2V0cyk7XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBjaGFubmVsOiBzdHJpbmc7XG4gICAgICAgICAgdHM6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9taWdyYXRpb25zL2NoZWNrQXBwcm92YWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjaGFubmVsLCB0cyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBjb25zdCBzbGFja0NvbmZpcm0gPSBuZXcgU2xhY2tDb25maXJtKCk7XG5cbiAgICAgICAgaWYgKCFzbGFja0NvbmZpcm0uaXNDb25maWd1cmVkKCkpIHtcbiAgICAgICAgICByZXR1cm4geyBhcHByb3ZlZDogdHJ1ZSwgcmVqZWN0ZWQ6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2xhY2tDb25maXJtLmNoZWNrQXBwcm92YWwoY2hhbm5lbCwgdHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGNoYW5uZWw6IHN0cmluZztcbiAgICAgICAgICB0czogc3RyaW5nO1xuICAgICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9taWdyYXRpb25zL2ZvcmNlQXBwcm92YWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjaGFubmVsLCB0cywgcmVhc29uLCByZXF1ZXN0b3IgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuXG4gICAgICAgIGlmICghc2xhY2tDb25maXJtLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0uZm9yY2VBcHByb3ZhbChjaGFubmVsLCB0cywgcmVhc29uLCByZXF1ZXN0b3IpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgY29kZU5hbWVzOiBzdHJpbmdbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9taWdyYXRpb25zL2RlbENvZGVzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29kZU5hbWVzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIHJldHVybiBhd2FpdCBtaWdyYXRvci5kZWxDb2Rlcyhjb2RlTmFtZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9taWdyYXRpb25zL2dlbmVyYXRlUHJlcGFyZWRDb2Rlc1wiLCBhc3luYyAoX3JlcXVlc3R0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBtaWdyYXRvci5nZW5lcmF0ZVByZXBhcmVkQ29kZXMoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZHM6IHN0cmluZ1tdO1xuICAgICAgICAgIHRlbXBsYXRlS2V5czogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc2NhZmZvbGRpbmcvZ2V0U3RhdHVzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5SWRzLCB0ZW1wbGF0ZUtleXM6IF90ZW1wbGF0ZUtleXMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgaWYgKChlbnRpdHlJZHMgPz8gW10pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmVudGl0eUlkc1JlcXVpcmVkXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmICgoX3RlbXBsYXRlS2V5cyA/PyBbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IudGVtcGxhdGVLZXlzUmVxdWlyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc29ydGluZ1xuICAgICAgICBlbnRpdHlJZHMuc29ydCgoYSwgYikgPT4gKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKSk7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlS2V5cyA9IFRlbXBsYXRlS2V5Lm9wdGlvbnMuZmlsdGVyKCh0aykgPT4gX3RlbXBsYXRlS2V5cy5pbmNsdWRlcyh0aykpO1xuXG4gICAgICAgIGNvbnN0IGNvbWJpbmF0aW9ucyA9IGVudGl0eUlkcy5mbGF0TWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUtleXMubWFwKCh0ZW1wbGF0ZUtleSkgPT4gW2VudGl0eUlkLCB0ZW1wbGF0ZUtleV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGNvbWJpbmF0aW9ucy5tYXAoYXN5bmMgKFtlbnRpdHlJZCwgdGVtcGxhdGVLZXldKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHN1YlBhdGgsIGZ1bGxQYXRoLCBpc0V4aXN0cyB9ID0gYXdhaXQgU29uYW11LnN5bmNlci5jaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZUtleSBhcyBUZW1wbGF0ZUtleSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgdGVtcGxhdGVLZXksXG4gICAgICAgICAgICAgIHN1YlBhdGgsXG4gICAgICAgICAgICAgIGZ1bGxQYXRoLFxuICAgICAgICAgICAgICBpc0V4aXN0cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1c2VzIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHRlbXBsYXRlS2V5OiBzdHJpbmc7XG4gICAgICAgICAgICBlbnVtSWQ/OiBzdHJpbmc7XG4gICAgICAgICAgICBvdmVyd3JpdGU/OiBib29sZWFuO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zY2FmZm9sZGluZy9nZW5lcmF0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iub3B0aW9uc1JlcXVpcmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIOuqqOuToCDthZztlIzrpr/sl5DshJwg7ZWE7JqU7ZWcIGRpY3Qg7YKk66W8IOyImOynkVxuICAgICAgICBjb25zdCBrZXlzID0gb3B0aW9ucy5mbGF0TWFwKCh7IHRlbXBsYXRlS2V5IH0pID0+IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5nZXRSZXF1aXJlZERpY3RLZXlzKCkgPz8gW107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDIuIHRhcmdldOuzhOuhnCBlbnN1cmVEaWN0S2V5cyDtmLjstpwgKOyInOywqCDsspjrpqwpXG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZW5zdXJlRGljdEtleXMoWy4uLm5ldyBTZXQoa2V5cyldKTtcblxuICAgICAgICAvLyAzLiDthZztlIzrpr8g7IOd7ISxICjrs5HroKwg7LKY66asKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBvcHRpb25zLm1hcChhc3luYyAoeyBlbnRpdHlJZCwgdGVtcGxhdGVLZXksIGVudW1JZCwgb3ZlcndyaXRlIH0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVLZXkgYXMgVGVtcGxhdGVLZXksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgICBlbnVtSWQsXG4gICAgICAgICAgICAgICAgfSBhcyB7XG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgZW51bUlkPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmIChpc1NvRXhjZXB0aW9uKGUpICYmIGUuc3RhdHVzQ29kZSA9PT0gNTQxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5maWx0ZXIobm9uTnVsbGFibGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuYWxsRmlsZXNHZW5lcmF0ZWRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgb3B0aW9uOiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdGVtcGxhdGVLZXk6IHN0cmluZztcbiAgICAgICAgICAgIGVudW1JZD86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NjYWZmb2xkaW5nL3ByZXZpZXdcIiwgYXN5bmMgKHJlcXVlc3QpOiBQcm9taXNlPHsgcGF0aEFuZENvZGVzOiBQYXRoQW5kQ29kZVtdIH0+ID0+IHtcbiAgICAgICAgY29uc3QgeyBvcHRpb24gfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgdGVtcGxhdGVLZXksIC4uLnRlbXBsYXRlT3B0aW9ucyB9ID0gb3B0aW9uO1xuICAgICAgICAgIGNvbnN0IHBhdGhBbmRDb2RlcyA9IGF3YWl0IFNvbmFtdS5zeW5jZXIucmVuZGVyVGVtcGxhdGUoXG4gICAgICAgICAgICB0ZW1wbGF0ZUtleSBhcyBUZW1wbGF0ZUtleSxcbiAgICAgICAgICAgIHRlbXBsYXRlT3B0aW9ucyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHsgcGF0aEFuZENvZGVzIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvZml4dHVyZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IHNvdXJjZURCLCB0YXJnZXREQiwgc2VhcmNoLCBkdXBsaWNhdGVDaGVjayB9ID0gcmVxdWVzdC5ib2R5IGFzIHtcbiAgICAgICAgICBzb3VyY2VEQjoga2V5b2YgU29uYW11REJDb25maWc7XG4gICAgICAgICAgdGFyZ2V0REI6IGtleW9mIFNvbmFtdURCQ29uZmlnO1xuICAgICAgICAgIHNlYXJjaDogRml4dHVyZVNlYXJjaE9wdGlvbnM7XG4gICAgICAgICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnM7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIEZpeHR1cmVNYW5hZ2VyLmdldEZpeHR1cmVzKHNvdXJjZURCLCB0YXJnZXREQiwgc2VhcmNoLCBkdXBsaWNhdGVDaGVjayk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL2ZpeHR1cmUvaW1wb3J0XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZGIsIGZpeHR1cmVzIH0gPSByZXF1ZXN0LmJvZHkgYXMge1xuICAgICAgICAgIGRiOiBrZXlvZiBTb25hbXVEQkNvbmZpZztcbiAgICAgICAgICBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyhkYiwgZml4dHVyZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9maXh0dXJlL2FkZEZpeHR1cmVMb2FkZXJcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSByZXF1ZXN0LmJvZHkgYXMgeyBjb2RlOiBzdHJpbmcgfTtcblxuICAgICAgICByZXR1cm4gRml4dHVyZU1hbmFnZXIuYWRkRml4dHVyZUxvYWRlcihjb2RlKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9pMThuL2RpY3Rpb25hcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5nZXREaWN0aW9uYXJ5KCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvaTE4bi9leHBvcnRcIiwgYXN5bmMgKF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbGVuYW1lLCBidWZmZXIgfSA9IGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZXhwb3J0VG9FeGNlbCgpO1xuICAgICAgICByZXBseVxuICAgICAgICAgIC5oZWFkZXIoXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiLFxuICAgICAgICAgIClcbiAgICAgICAgICAuaGVhZGVyKFwiQ29udGVudC1EaXNwb3NpdGlvblwiLCBgYXR0YWNobWVudDsgZmlsZW5hbWU9XCIke2ZpbGVuYW1lfVwiYClcbiAgICAgICAgICAuc2VuZChidWZmZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9pMThuL2ltcG9ydFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdC5maWxlKCk7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmZpbGVOb3RVcGxvYWRlZFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZGF0YS50b0J1ZmZlcigpO1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5pbXBvcnRGcm9tRXhjZWwoYnVmZmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBvbGRLZXk6IHN0cmluZztcbiAgICAgICAgICBuZXdLZXk6IHN0cmluZztcbiAgICAgICAgICBzb3VyY2U6IFwiZW50aXR5XCIgfCBcInByb2plY3RcIiB8IFwic29uYW11XCI7XG4gICAgICAgICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2kxOG4vdXBkYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkudXBkYXRlRW50cnkocmVxdWVzdC5ib2R5KTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGtleTogc3RyaW5nO1xuICAgICAgICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9pMThuL2NyZWF0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmNyZWF0ZUVudHJ5KHJlcXVlc3QuYm9keSk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBrZXk6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9pMThuL2RlbGV0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmRlbGV0ZUVudHJ5KHJlcXVlc3QuYm9keS5rZXkpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGtleXM6IHN0cmluZ1tdIH0gfT4oXCIvYXBpL2kxOG4vY2hlY2tVc2FnZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5jaGVja1VzYWdlKHJlcXVlc3QuYm9keS5rZXlzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUYXNrcyBBUElcbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL3Rhc2tzL3N0YXR1c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgU29uYW11LndvcmtmbG93cztcbiAgICAgICAgICByZXR1cm4geyBhY3RpdmU6IHRydWUgfTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvdGFza3Mvd29ya2Zsb3dEZWZpbml0aW9uc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb25zID0gU29uYW11LndvcmtmbG93cy53b3JrZmxvd0RlZmluaXRpb25zO1xuICAgICAgICByZXR1cm4geyBkZWZpbml0aW9ucyB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBRdWVyeXN0cmluZzoge1xuICAgICAgICAgIGxpbWl0Pzogc3RyaW5nO1xuICAgICAgICAgIGFmdGVyPzogc3RyaW5nO1xuICAgICAgICAgIGJlZm9yZT86IHN0cmluZztcbiAgICAgICAgICBvcmRlcj86IFwiYXNjXCIgfCBcImRlc2NcIjtcbiAgICAgICAgICBzdGF0dXM/OiBzdHJpbmc7XG4gICAgICAgICAgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuICAgICAgICAgIGNyZWF0ZWRBZnRlcj86IHN0cmluZztcbiAgICAgICAgICBjcmVhdGVkQmVmb3JlPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVuc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICBjb25zdCB7IGxpbWl0LCBhZnRlciwgYmVmb3JlLCBvcmRlciwgc3RhdHVzLCB3b3JrZmxvd05hbWUsIGNyZWF0ZWRBZnRlciwgY3JlYXRlZEJlZm9yZSB9ID1cbiAgICAgICAgICByZXF1ZXN0LnF1ZXJ5O1xuICAgICAgICByZXR1cm4gYmFja2VuZC5saXN0V29ya2Zsb3dSdW5zKHtcbiAgICAgICAgICBsaW1pdDogbGltaXQgPyBOdW1iZXIucGFyc2VJbnQobGltaXQsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBhZnRlcixcbiAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgb3JkZXIsXG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPyBzdGF0dXMuc3BsaXQoXCIsXCIpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBjcmVhdGVkQWZ0ZXI6IGNyZWF0ZWRBZnRlciA/IG5ldyBEYXRlKGNyZWF0ZWRBZnRlcikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY3JlYXRlZEJlZm9yZTogY3JlYXRlZEJlZm9yZSA/IG5ldyBEYXRlKGNyZWF0ZWRCZWZvcmUpIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnMvOmlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93UnVuID0gYXdhaXQgYmFja2VuZC5nZXRXb3JrZmxvd1J1bih7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcmVxdWVzdC5wYXJhbXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXb3JrZmxvdyBydW4gbm90IGZvdW5kOiAke3JlcXVlc3QucGFyYW1zLmlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3b3JrZmxvd1J1bjtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZC9jYW5jZWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQuY2FuY2VsV29ya2Zsb3dSdW4oe1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJlcXVlc3QucGFyYW1zLmlkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZC9wYXVzZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5wYXVzZVdvcmtmbG93UnVuKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBQYXJhbXM6IHsgaWQ6IHN0cmluZyB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVucy86aWQvcmVzdW1lXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLnJlc3VtZVdvcmtmbG93UnVuKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgbGltaXQ/OiBzdHJpbmc7XG4gICAgICAgICAgYWZ0ZXI/OiBzdHJpbmc7XG4gICAgICAgICAgYmVmb3JlPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVucy86aWQvc3RlcHNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgY29uc3QgeyBsaW1pdCwgYWZ0ZXIsIGJlZm9yZSB9ID0gcmVxdWVzdC5xdWVyeTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubGlzdFN0ZXBBdHRlbXB0cyh7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcmVxdWVzdC5wYXJhbXMuaWQsXG4gICAgICAgICAgbGltaXQ6IGxpbWl0ID8gTnVtYmVyLnBhcnNlSW50KGxpbWl0LCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYWZ0ZXIsXG4gICAgICAgICAgYmVmb3JlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEhlYWx0aCBDaGVjayBBUElcbiAgICAgICAqIE1DUCDrj4TqtazqsIAgU29uYW11IOyEnOuyhOulvCDsnpDrj5kg6rCQ7KeA7ZWY6riwIOychO2VnCDsl5Trk5ztj6zsnbjtirhcbiAgICAgICAqL1xuICAgICAgc2VydmVyLmdldChcIi9hcGkvc29uYW11L2hlYWx0aFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gcmVxdWVzdC5zZXJ2ZXIuc2VydmVyLmFkZHJlc3MoKTtcbiAgICAgICAgY29uc3QgcG9ydCA9IGFkZHJlc3MgJiYgdHlwZW9mIGFkZHJlc3MgPT09IFwib2JqZWN0XCIgPyAoYWRkcmVzcyBhcyBBZGRyZXNzSW5mbykucG9ydCA6IDA7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICBwcm9qZWN0OiBwcm9jZXNzLmN3ZCgpLnNwbGl0KFwiL1wiKS5wb3AoKSB8fCBcInVua25vd25cIixcbiAgICAgICAgICBwb3J0LFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8qKlxuICAgICAgICogRml4dHVyZSDsg53shLEgQVBJXG4gICAgICAgKi9cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eTogc3RyaW5nO1xuICAgICAgICAgIGNvdW50PzogbnVtYmVyO1xuICAgICAgICAgIG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIHRhcmdldERiPzogXCJmaXh0dXJlXCIgfCBcInRlc3RcIjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zb25hbXUvZml4dHVyZS9nZW5lcmF0ZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHksIGNvdW50ID0gMSwgb3ZlcnJpZGVzLCB0YXJnZXREYiA9IFwiZml4dHVyZVwiIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDtg4Dqsp8gREIg7ISk7KCVIOqwgOyguOyYpOq4sFxuICAgICAgICAgIGNvbnN0IGRiQ29uZmlnID0gdGFyZ2V0RGIgPT09IFwiZml4dHVyZVwiID8gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUgOiBTb25hbXUuZGJDb25maWcudGVzdDtcblxuICAgICAgICAgIC8vIEtuZXgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgICAgICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcblxuICAgICAgICAgIC8vIEZpeHR1cmVHZW5lcmF0b3Ig7IOd7ISxXG4gICAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3IoZGIsIGRiLCB0YXJnZXREYiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICAgICAgICAvLyDri6jsnbwgRW50aXR5IOuwsOy5mCDsg53shLFcbiAgICAgICAgICBjb25zdCBmaXh0dXJlcyA9IGF3YWl0IGdlbmVyYXRvci5nZW5lcmF0ZUJhdGNoKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgb3ZlcnJpZGVzOiBvdmVycmlkZXMgPz8ge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgLy8gS25leCDsl7DqsrAg7KKF66OMXG4gICAgICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICBjb3VudDogZml4dHVyZXMubGVuZ3RoLFxuICAgICAgICAgICAgZml4dHVyZXMsXG4gICAgICAgICAgICB0YXJnZXREYixcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8qKlxuICAgICAgICogRml4dHVyZSDrjbDsnbTthLAg7YOQ7IOJIEFQSVxuICAgICAgICovXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHk6IHN0cmluZztcbiAgICAgICAgICBzdHJhdGVneTogXCJzYW1wbGVcIiB8IFwicmVjZW50XCIgfCBcInJhbmRvbVwiIHwgXCJxdWVyeVwiO1xuICAgICAgICAgIGxpbWl0PzogbnVtYmVyO1xuICAgICAgICAgIHdoZXJlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc29uYW11L2ZpeHR1cmUvZXhwbG9yZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHksIHN0cmF0ZWd5LCBsaW1pdCA9IDEwLCB3aGVyZSB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRml4dHVyZSBEQiDshKTsoJUg6rCA7KC47Jik6riwXG4gICAgICAgICAgY29uc3QgZml4dHVyZURiQ29uZmlnID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmU7XG5cbiAgICAgICAgICAvLyBLbmV4IOyduOyKpO2EtOyKpCDsg53shLFcbiAgICAgICAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoZml4dHVyZURiQ29uZmlnKTtcblxuICAgICAgICAgIC8vIERhdGFFeHBsb3JlciDsg53shLFcbiAgICAgICAgICBjb25zdCBleHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoZml4dHVyZURiLCBFbnRpdHlNYW5hZ2VyKTtcblxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBleHBsb3Jlci5leHBsb3JlKGVudGl0eSwge1xuICAgICAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIHdoZXJlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gS25leCDsl7DqsrAg7KKF66OMXG4gICAgICAgICAgYXdhaXQgZml4dHVyZURiLmRlc3Ryb3koKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgICAgICBjb3VudDogZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwMCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaXh0dXJlIOuNsOydtO2EsCDqsIDsoLjsmKTquLAgKGZldGNoKSBBUElcbiAgICAgICAqIHByb2R1Y3Rpb24vZGV2ZWxvcG1lbnQgRELsl5DshJwg7Iuk7KCcIOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydFxuICAgICAgICovXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHk6IHN0cmluZztcbiAgICAgICAgICBzdHJhdGVneT86IFwic2FtcGxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIiB8IFwicXVlcnlcIjtcbiAgICAgICAgICBsaW1pdD86IG51bWJlcjtcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgICAgICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zb25hbXUvZml4dHVyZS9mZXRjaFwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICBzdHJhdGVneSA9IFwicmVjZW50XCIsXG4gICAgICAgICAgbGltaXQgPSAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zID0gdHJ1ZSxcbiAgICAgICAgICBtYXhEZXB0aCA9IDIsXG4gICAgICAgIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTb3VyY2UgREIgKHByb2R1Y3Rpb24vZGV2ZWxvcG1lbnQpIC0g7J296riwIOyghOyaqVxuICAgICAgICAgIGNvbnN0IHNvdXJjZURiID0gREIuZ2V0REIoXCJyXCIpO1xuXG4gICAgICAgICAgLy8gVGFyZ2V0IERCIChmaXh0dXJlKVxuICAgICAgICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG5cbiAgICAgICAgICAvLyBGaXh0dXJlR2VuZXJhdG9yIOyDneyEsVxuICAgICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKHNvdXJjZURiLCBmaXh0dXJlRGIsIFwiZml4dHVyZVwiLCBFbnRpdHlNYW5hZ2VyKTtcblxuICAgICAgICAgIC8vIHByb2R1Y3Rpb24g642w7J207YSw66W8IGZpeHR1cmUgRELroZwgaW1wb3J0XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdlbmVyYXRvci5pbXBvcnRGcm9tU291cmNlKGVudGl0eSwge1xuICAgICAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnMsXG4gICAgICAgICAgICBtYXhEZXB0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEtuZXgg7Jew6rKwIOyiheujjCAoc291cmNlRGLripQgU29uYW116rCAIOq0gOumrO2VmOuvgOuhnCBkZXN0cm957ZWY7KeAIOyViuydjClcbiAgICAgICAgICBhd2FpdCBmaXh0dXJlRGIuZGVzdHJveSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICBzdHJhdGVneSxcbiAgICAgICAgICAgIGNvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgICAgIGltcG9ydGVkOiByZXN1bHRzLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwMCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaXh0dXJlIOuNsOydtO2EsCDsgq3soJwgKGNsZWFuKSBBUElcbiAgICAgICAqIEZLIOyInOyEnOulvCDqs6DroKTtlZjsl6wg7JWI7KCE7ZWY6rKMIOyCreygnFxuICAgICAgICovXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdGllcz86IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NvbmFtdS9maXh0dXJlL2NsZWFuXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0aWVzIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBGaXh0dXJlIERCIOyXsOqysFxuICAgICAgICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG5cbiAgICAgICAgICAvLyDsgq3soJztlaAgRW50aXR5IOuqqeuhnSDqsrDsoJVcbiAgICAgICAgICBjb25zdCB0YXJnZXRFbnRpdGllcyA9XG4gICAgICAgICAgICBlbnRpdGllcyAmJiBlbnRpdGllcy5sZW5ndGggPiAwID8gZW50aXRpZXMgOiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuXG4gICAgICAgICAgLy8gRW50aXR5IElE66W8IO2FjOydtOu4lOuqheycvOuhnCDrs4DtmZggKHNuYWtlX2Nhc2Ug67O17IiY7ZiVKVxuICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZXMgPSB0YXJnZXRFbnRpdGllcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICByZXR1cm4gZW50aXR5LnRhYmxlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gUG9zdGdyZVNRTDogVFJVTkNBVEUgQ0FTQ0FEReuhnCBGSyDsiJzshJwg66y06rSA7ZWY6rKMIOyViOyghO2VmOqyjCDsgq3soJxcbiAgICAgICAgICAvLyBDQVNDQURFIOyYteyFmOycvOuhnCDsnZjsobTshLEg7J6I64qUIOuNsOydtO2EsOuPhCDtlajqu5gg7IKt7KCcXG4gICAgICAgICAgYXdhaXQgZml4dHVyZURiLnJhdyhcbiAgICAgICAgICAgIGBUUlVOQ0FURSBUQUJMRSAke3RhYmxlTmFtZXMubWFwKCh0KSA9PiBgXCIke3R9XCJgKS5qb2luKFwiLCBcIil9IFJFU1RBUlQgSURFTlRJVFkgQ0FTQ0FERWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEtuZXgg7Jew6rKwIOyiheujjFxuICAgICAgICAgIGF3YWl0IGZpeHR1cmVEYi5kZXN0cm95KCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGNsZWFuZWQ6IHRhYmxlTmFtZXMsXG4gICAgICAgICAgICBjb3VudDogdGFibGVOYW1lcy5sZW5ndGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyB1aS13ZWIg67mM65OcIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IHVpRGlzdFBhdGggPSBwYXRoLnJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi91aS13ZWJcIik7XG5cbiAgICAgIC8vIOygleyggSDtjIzsnbwg7ISc67mZOiDro6jtirgg7Y+0642UIOyghOyytCAoYXNzZXRzLCBzZXR0aW5nLnN2ZyDrk7EpXG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvc3RhdGljXCIpLCB7XG4gICAgICAgIHJvb3Q6IHVpRGlzdFBhdGgsXG4gICAgICAgIHByZWZpeDogXCIvXCIsXG4gICAgICAgIGRlY29yYXRlUmVwbHk6IGZhbHNlLFxuICAgICAgICB3aWxkY2FyZDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gU1BBIGZhbGxiYWNrIC0g7KCV7KCBIO2MjOydvOydtCDsl4bripQg66qo65OgIOqyveuhnOuKlCBpbmRleC5odG1s66GcXG4gICAgICBzZXJ2ZXIuZ2V0KFwiKlwiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIHJlcGx5LmhlYWRlcnMoeyBcIkNvbnRlbnQtdHlwZVwiOiBcInRleHQvaHRtbFwiIH0pLnNlbmQoXG4gICAgICAgICAgZnNcbiAgICAgICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHVpRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKSlcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAucmVwbGFjZShcInt7cHJvamVjdE5hbWV9fVwiLCBTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiVW5rbm93blNvbmFtdVByb2plY3RcIiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgcHJlZml4OiBcIi9zb25hbXUtdWlcIiB9LFxuICApO1xufVxuIl0sIm5hbWVzIjpbImV4ZWNTeW5jIiwiZnMiLCJpbmZsZWN0aW9uIiwicGF0aCIsInJhbmdlIiwiU29uYW11IiwiREIiLCJjcmVhdGVLbmV4SW5zdGFuY2UiLCJTRCIsInNvbmFtdURpY3Rpb25hcnkiLCJFbnRpdHlNYW5hZ2VyIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsImlzU29FeGNlcHRpb24iLCJTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24iLCJNaWdyYXRvciIsIlNsYWNrQ29uZmlybSIsIlRlbXBsYXRlTWFuYWdlciIsIkRhdGFFeHBsb3JlciIsIkZpeHR1cmVHZW5lcmF0b3IiLCJGaXh0dXJlTWFuYWdlciIsIkJVSUxUX0lOX1RZUEVfSURTIiwiVGVtcGxhdGVLZXkiLCJub25OdWxsYWJsZSIsInNldEFpQXBpIiwic29uYW11VUlBcGlQbHVnaW4iLCJmYXN0aWZ5IiwicmVnaXN0ZXIiLCJzZXJ2ZXIiLCJtaWdyYXRvciIsIndhaXRGb3JITVJDb21wbGV0ZWQiLCJmbiIsIndhaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsImhhbmRsZXIiLCJjbGVhclRpbWVvdXQiLCJzeW5jZXIiLCJldmVudEVtaXR0ZXIiLCJvZmYiLCJvbmNlIiwicmVzdWx0IiwiZ2V0IiwiY29uZmlnIiwicmVxdWVzdCIsImVudGl0eUlkIiwicHJlc2V0IiwiYWJzUGF0aCIsInF1ZXJ5IiwidGFyZ2V0UGF0aCIsImVudGl0eSIsIm5hbWVzIiwiYXBpUm9vdFBhdGgiLCJmaWxlbmFtZSIsInBhcmVudEZzIiwib3JpZ2luIiwiZ2xvc3NhcnkiLCJNYXAiLCJnZXRBbGxJZHMiLCJ0aXRsZSIsInNldCIsInVuZGVyc2NvcmUiLCJpZCIsInBsdXJhbGl6ZSIsInByb3BzIiwiZm9yRWFjaCIsInByb3AiLCJoYXMiLCJuYW1lIiwiZGVzYyIsInJlcGxhY2UiLCJzdWdnZXN0ZWQiLCJ3b3JkcyIsInNwbGl0IiwiY29tYmluYXRpb25zIiwibGVuZ3RoIiwiZmxhdE1hcCIsImxlbiIsImlkeCIsInciLCJzbGljZSIsImpvaW4iLCJSRVBMQUNFRF9QUkVGSVgiLCJyZW1haW5BcnIiLCJjb21iIiwicmVtYWluU3RyIiwiaW5jbHVkZXMiLCJtYXAiLCJyIiwic3RhcnRzV2l0aCIsInRvVXBwZXJDYXNlIiwiZW50aXR5SWRzIiwiZmxhdHRlblN1YnNldFJvd3MiLCJzdWJzZXRSb3dzIiwic3Vic2V0Um93IiwiY2hpbGRyZW4iLCJzUm93IiwiZW50aXRpZXMiLCJhbGwiLCJnZXRTdWJzZXRSb3dzIiwic29ydCIsImEiLCJiIiwiYUlkIiwicGFyZW50SWQiLCJiSWQiLCJ1bmRlZmluZWQiLCJmaWx0ZXIiLCJyZWxvYWQiLCJhdXRvbG9hZFR5cGVzIiwidHlwZUlkcyIsInByb2plY3RUeXBlSWRzIiwiT2JqZWN0IiwiZW50cmllcyIsInR5cGVzIiwiX3R5cGVJZCIsInpvZFR5cGUiLCJfem9kIiwiZGVmIiwidHlwZSIsInR5cGVJZCIsIl96b2RUeXBlIiwiYnVpbHRJblR5cGVJZHMiLCJhbGxUeXBlSWRzIiwiZW51bUlkcyIsImtleXMiLCJlbnVtTGFiZWxzIiwicG9zdCIsImZvcm0iLCJib2R5IiwiY3JlYXRlRW50aXR5IiwiZGVsRW50aXR5IiwibmV3VmFsdWVzIiwidGFibGUiLCJzYXZlIiwic3Vic2V0S2V5IiwiZmllbGRzIiwiZmllbGRzSW50ZXJuYWwiLCJzdWJzZXRzIiwic3Vic2V0c0ludGVybmFsIiwidXBkYXRlZCIsInVwZGF0ZWRJbnRlcm5hbCIsImF0IiwibmV3UHJvcCIsImNyZWF0ZVByb3AiLCJtb2RpZnlQcm9wIiwiZGVsUHJvcCIsInRvIiwibW92ZVByb3AiLCJpbmRleGVzIiwibmV3RW51bUlkIiwiRXJyb3IiLCJlbmRzV2l0aCIsImFjdGl2ZSIsImhpZGRlbiIsImVudW1JZCIsImlzRXhpc3RzIiwic29tZSIsImFmdGVyIiwiYmVmb3JlIiwiaXNSZWZlcmVuY2VkIiwidGFyZ2V0IiwicHJvcE5hbWUiLCJjb25lIiwiZmluZCIsInAiLCJlbnVtQ29uZXMiLCJzdWJzZXRDb25lcyIsInJlcGx5IiwicHJlc2VydmVFeGlzdGluZyIsIm9ubHlFbXB0eSIsImxvY2FsZSIsImVmZmVjdGl2ZUxvY2FsZSIsImkxOG4iLCJkZWZhdWx0TG9jYWxlIiwiZ2VuZXJhdGVDb25lcyIsImVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsInN0YXR1cyIsInN1Y2Nlc3MiLCJjb2x1bW5zIiwiZ2V0VGFibGVDb2x1bW5zIiwiZ2V0U3RhdHVzIiwiYWN0aW9uIiwidGFyZ2V0cyIsImZvcmNlIiwiZm9yY2VSZWFzb24iLCJyZXF1ZXN0b3IiLCJydW5TaGFkb3dUZXN0Iiwic2xhY2tDb25maXJtIiwicmVxdWlyZXNBcHByb3ZhbCIsInQiLCJpc1RhcmdldFJlcXVpcmVzQXBwcm92YWwiLCJsb2NhbEhvc3RzIiwiaXNMb2NhbFRhcmdldCIsImV2ZXJ5IiwidGFyZ2V0Q29uZmlnIiwiZGJDb25maWciLCJob3N0IiwiY29ubmVjdGlvbiIsInRvTG93ZXJDYXNlIiwiaXNDb25maWd1cmVkIiwiY29ubnMiLCJwZW5kaW5nTWlncmF0aW9ucyIsIlNldCIsImNvbm4iLCJjb25uS2V5IiwicGVuZGluZyIsImV4aXN0aW5nIiwiZ2V0RXhpc3RpbmdSZXF1ZXN0IiwiYXBwcm92ZWQiLCJyZWplY3RlZCIsImNoZWNrQXBwcm92YWwiLCJjaGFubmVsIiwidHMiLCJydW5BY3Rpb24iLCJsb2dFeGVjdXRpb24iLCJmb3JjZUFwcHJvdmFsIiwicG9zdEFwcHJvdmFsUmVxdWVzdCIsInNhdmVSZXF1ZXN0IiwicmVhc29uIiwiY29kZU5hbWVzIiwiZGVsQ29kZXMiLCJfcmVxdWVzdHQiLCJnZW5lcmF0ZVByZXBhcmVkQ29kZXMiLCJ0ZW1wbGF0ZUtleXMiLCJfdGVtcGxhdGVLZXlzIiwib3B0aW9ucyIsInRrIiwidGVtcGxhdGVLZXkiLCJzdGF0dXNlcyIsInN1YlBhdGgiLCJmdWxsUGF0aCIsImNoZWNrRXhpc3RzR2VuQ29kZSIsInRlbXBsYXRlIiwiZ2V0UmVxdWlyZWREaWN0S2V5cyIsImVuc3VyZURpY3RLZXlzIiwib3ZlcndyaXRlIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsImUiLCJzdGF0dXNDb2RlIiwiY29uc29sZSIsIm9wdGlvbiIsInRlbXBsYXRlT3B0aW9ucyIsInBhdGhBbmRDb2RlcyIsInJlbmRlclRlbXBsYXRlIiwic291cmNlREIiLCJ0YXJnZXREQiIsInNlYXJjaCIsImR1cGxpY2F0ZUNoZWNrIiwiZ2V0Rml4dHVyZXMiLCJkYiIsImZpeHR1cmVzIiwiaW5zZXJ0Rml4dHVyZXMiLCJjb2RlIiwiYWRkRml4dHVyZUxvYWRlciIsImdldERpY3Rpb25hcnkiLCJfcmVxdWVzdCIsImJ1ZmZlciIsImV4cG9ydFRvRXhjZWwiLCJoZWFkZXIiLCJzZW5kIiwiZGF0YSIsImZpbGUiLCJ0b0J1ZmZlciIsImltcG9ydEZyb21FeGNlbCIsInVwZGF0ZUVudHJ5IiwiY3JlYXRlRW50cnkiLCJkZWxldGVFbnRyeSIsImtleSIsImNoZWNrVXNhZ2UiLCJ3b3JrZmxvd3MiLCJkZWZpbml0aW9ucyIsIndvcmtmbG93RGVmaW5pdGlvbnMiLCJiYWNrZW5kIiwibGltaXQiLCJvcmRlciIsIndvcmtmbG93TmFtZSIsImNyZWF0ZWRBZnRlciIsImNyZWF0ZWRCZWZvcmUiLCJsaXN0V29ya2Zsb3dSdW5zIiwiTnVtYmVyIiwicGFyc2VJbnQiLCJEYXRlIiwid29ya2Zsb3dSdW4iLCJnZXRXb3JrZmxvd1J1biIsIndvcmtmbG93UnVuSWQiLCJwYXJhbXMiLCJjYW5jZWxXb3JrZmxvd1J1biIsInBhdXNlV29ya2Zsb3dSdW4iLCJyZXN1bWVXb3JrZmxvd1J1biIsImxpc3RTdGVwQXR0ZW1wdHMiLCJhZGRyZXNzIiwicG9ydCIsIm9rIiwicHJvamVjdCIsInByb2Nlc3MiLCJjd2QiLCJwb3AiLCJ0aW1lc3RhbXAiLCJ0b0lTT1N0cmluZyIsImNvdW50Iiwib3ZlcnJpZGVzIiwidGFyZ2V0RGIiLCJmaXh0dXJlIiwidGVzdCIsImdlbmVyYXRvciIsImdlbmVyYXRlQmF0Y2giLCJkZXN0cm95Iiwic3RyYXRlZ3kiLCJ3aGVyZSIsImZpeHR1cmVEYkNvbmZpZyIsImZpeHR1cmVEYiIsImV4cGxvcmVyIiwiZXhwbG9yZSIsImluY2x1ZGVSZWxhdGlvbnMiLCJtYXhEZXB0aCIsInNvdXJjZURiIiwiZ2V0REIiLCJyZXN1bHRzIiwiaW1wb3J0RnJvbVNvdXJjZSIsImltcG9ydGVkIiwidGFyZ2V0RW50aXRpZXMiLCJ0YWJsZU5hbWVzIiwicmF3IiwiY2xlYW5lZCIsInVpRGlzdFBhdGgiLCJkaXJuYW1lIiwicm9vdCIsInByZWZpeCIsImRlY29yYXRlUmVwbHkiLCJ3aWxkY2FyZCIsImhlYWRlcnMiLCJyZWFkRmlsZVN5bmMiLCJ0b1N0cmluZyIsInByb2plY3ROYW1lIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLFFBQVEsZ0JBQWdCO0FBRXpDLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxnQkFBZ0IsYUFBYTtBQUVwQyxPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsS0FBSyxRQUFRLFVBQVU7QUFDaEMsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxFQUFFLFFBQTZCLG9CQUFpQjtBQUN6RCxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFDdEQsU0FBU0MsRUFBRSxRQUFRLGdCQUFhO0FBQ2hDLFNBQVNDLGdCQUFnQixRQUFRLCtCQUE0QjtBQUU3RCxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FB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