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
@@ -26,13 +26,18 @@ export declare class FixtureManagerClass {
26
26
  pg_dump로 원격 DB를 덤프하고, pg_restore로 로컬에 복원합니다.
27
27
  */
28
28
  sync(): Promise<void>;
29
+ /**
30
+ * 모든 테이블의 시퀀스를 현재 MAX(id)로 리셋합니다.
31
+ * fixture sync 후 시퀀스가 실제 데이터와 맞지 않는 문제를 해결합니다.
32
+ */
33
+ private resetSequences;
29
34
  private visitedRecords;
30
35
  importFixture(entityId: string, ids: number[]): Promise<void>;
31
36
  getImportQueries(entityId: string, field: string, id: number): Promise<string[]>;
32
37
  destroy(): Promise<void>;
33
38
  getFixtures(sourceDBName: keyof SonamuDBConfig, targetDBName: keyof SonamuDBConfig, searchOptions: FixtureSearchOptions, duplicateCheck?: DuplicateCheckOptions): Promise<FixtureRecord[]>;
34
39
  createFixtureRecord(entity: Entity, row: {
35
- id: number;
40
+ id: number | string;
36
41
  [key: string]: string | number | boolean | null;
37
42
  }, options?: {
38
43
  singleRecord?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAS1B,MAAM,gBAAgB,CAAC;AAGxB,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE;QACR,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAG5C,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,eAAe,CAAoE;IAE3F,IAAI;IAuBJ;;;MAGE;IACI,IAAI;IAsCV,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAoB7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyEhF,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB,EACnC,cAAc,CAAC,EAAE,qBAAqB;IAmFlC,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;KACjD,EACD,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAoF3B;;;;;;;;;OASG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA8JjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAqFvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAqBZ,0BAA0B;IAgFxC;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;YA+Dd,oBAAoB;YA6CpB,uBAAuB;IA8B/B,gBAAgB,CAAC,IAAI,EAAE,MAAM;CAepC;AAED,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
1
+ {"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAS1B,MAAM,gBAAgB,CAAC;AAGxB,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE;QACR,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAG5C,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,eAAe,CACX;IAEZ,IAAI;IAuBJ;;;MAGE;IACI,IAAI;IAyCV;;;OAGG;YACW,cAAc;IAgC5B,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAoB7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyEhF,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB,EACnC,cAAc,CAAC,EAAE,qBAAqB;IAmFlC,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;KACjD,EACD,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAwF3B;;;;;;;;;OASG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAuMjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAqFvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAqBZ,0BAA0B;IAgFxC;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;YA+Dd,oBAAoB;YA6CpB,uBAAuB;IA8B/B,gBAAgB,CAAC,IAAI,EAAE,MAAM;CAepC;AAED,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
@@ -103,6 +103,38 @@ export class FixtureManagerClass {
103
103
  },
104
104
  shell: "/bin/bash"
105
105
  });
106
+ // 3. 시퀀스 리셋 (데이터 복사 후 시퀀스를 MAX(id)로 정렬)
107
+ await this.resetSequences(Sonamu.dbConfig.test);
108
+ }
109
+ /**
110
+ * 모든 테이블의 시퀀스를 현재 MAX(id)로 리셋합니다.
111
+ * fixture sync 후 시퀀스가 실제 데이터와 맞지 않는 문제를 해결합니다.
112
+ */ async resetSequences(dbConfig) {
113
+ const testDb = createKnexInstance(dbConfig);
114
+ const entities = EntityManager.getAllEntities();
115
+ try {
116
+ for (const entity of entities){
117
+ const tableName = entity.table || entity.id.toLowerCase();
118
+ // id 필드의 타입을 확인합니다
119
+ const idProp = entity.props.find((p)=>p.name === "id");
120
+ const idType = idProp?.type;
121
+ // integer나 bigInteger가 아닌 경우 sequence reset을 스킵합니다 (text, uuid 등)
122
+ if (!idType || idType !== "integer" && idType !== "bigInteger") {
123
+ console.log(`Skipping sequence reset for ${tableName} (id type: ${idType || "unknown"})`);
124
+ continue;
125
+ }
126
+ // PostgreSQL 시퀀스를 현재 테이블의 MAX(id)로 리셋합니다.
127
+ // 세 번째 인자를 생략하면 기본값 true가 적용되어, 다음 INSERT 시 MAX(id)+1부터 시작합니다.
128
+ await testDb.raw(`
129
+ SELECT setval(
130
+ pg_get_serial_sequence('public.${tableName}', 'id'),
131
+ COALESCE((SELECT MAX(id) FROM ${tableName}), 1)
132
+ )
133
+ `);
134
+ }
135
+ } finally{
136
+ await testDb.destroy();
137
+ }
106
138
  }
107
139
  visitedRecords = new Set();
108
140
  async importFixture(entityId, ids) {
@@ -279,10 +311,14 @@ export class FixtureManagerClass {
279
311
  const relatedIds = await db(relatedEntity.table).where(prop.joinColumn, row.id).pluck("id");
280
312
  record.columns[prop.name].value = relatedIds;
281
313
  } else if (isOneToOneRelationProp(prop) && !prop.hasJoinColumn) {
314
+ // 역방향 OneToOne: FK를 가진 관련 엔티티를 찾습니다
315
+ // 예시: User OneToOne Employee (Employee가 user_id FK를 가짐)
282
316
  const relatedEntity = EntityManager.get(prop.with);
283
317
  const relatedProp = relatedEntity.props.find((p)=>isRelationProp(p) && p.with === entity.id);
284
- if (relatedProp) {
285
- const relatedRow = await db(relatedEntity.table).where("id", row.id).first();
318
+ if (relatedProp && isRelationProp(relatedProp)) {
319
+ // 관련 엔티티에서 FK 컬럼으로 쿼리합니다 (id 아님)
320
+ const fkColumn = `${relatedProp.name}_id`;
321
+ const relatedRow = await db(relatedEntity.table).where(fkColumn, row.id).first();
286
322
  record.columns[prop.name].value = relatedRow?.id;
287
323
  }
288
324
  } else if (isRelationProp(prop)) {
@@ -393,7 +429,39 @@ export class FixtureManagerClass {
393
429
  }
394
430
  // 5. ManyToMany 관계 처리
395
431
  await this.processManyToManyRelations(trx, fixtures, insertedIdsByTable);
396
- // 6. 결과 수집
432
+ // 6. PostgreSQL 시퀀스 리셋
433
+ // Fixture 삽입 후 각 테이블의 ID 시퀀스를 최대 ID 값으로 업데이트합니다.
434
+ // 이렇게 하지 않으면 다음 INSERT 시 ID가 2000번대로 생성될 수 있습니다.
435
+ console.log(chalk.blue("Resetting sequences..."));
436
+ for (const tableName of tableOrder){
437
+ try {
438
+ // Entity를 찾아서 id 타입 확인
439
+ const entity = EntityManager.getAllEntities().find((e)=>e.table === tableName || e.id.toLowerCase() === tableName);
440
+ if (entity) {
441
+ const idProp = entity.props.find((p)=>p.name === "id");
442
+ const idType = idProp?.type;
443
+ // integer나 bigInteger가 아닌 경우 sequence reset을 스킵합니다
444
+ if (!idType || idType !== "integer" && idType !== "bigInteger") {
445
+ console.log(chalk.gray(`Skipped sequence reset for ${tableName} (id type: ${idType || "unknown"})`));
446
+ continue;
447
+ }
448
+ }
449
+ // 테이블의 최대 ID 조회
450
+ const maxIdResult = await trx(tableName).max("id as max_id").first();
451
+ const maxId = maxIdResult?.max_id;
452
+ if (maxId !== null && maxId !== undefined) {
453
+ // 시퀀스를 최대 ID로 설정
454
+ await trx.raw(`SELECT setval('${tableName}_id_seq', ?)`, [
455
+ maxId
456
+ ]);
457
+ console.log(chalk.green(`Reset sequence for ${tableName}: ${maxId}`));
458
+ }
459
+ } catch (_err) {
460
+ // 시퀀스가 없는 테이블(join table 등)은 무시
461
+ console.log(chalk.gray(`Skipped sequence reset for ${tableName}`));
462
+ }
463
+ }
464
+ // 7. 결과 수집
397
465
  for (const fixture of fixtures){
398
466
  const entity = EntityManager.get(fixture.entityId);
399
467
  // 스킵된 fixture는 기존 레코드 정보로 결과 추가
@@ -688,4 +756,4 @@ export class FixtureManagerClass {
688
756
  }
689
757
  export const FixtureManager = new FixtureManagerClass();
690
758
 
691
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgdHlwZSBNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IFJlbGF0aW9uR3JhcGggfSBmcm9tIFwiLi9fcmVsYXRpb24tZ3JhcGhcIjtcblxuLyoqIOyCrOyaqeyekCDsp4DsoJUg7KSR67O1IO2ZleyduCDsu6zrn7wgKGVudGl0eUlk67OE66GcIOyngOyglSkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlQ2hlY2tPcHRpb25zIHtcbiAgY29sdW1ucz86IHtcbiAgICBbZW50aXR5SWQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRml4dHVyZU1hbmFnZXJDbGFzcyB7XG4gIHByaXZhdGUgX3RkYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgdGRiKHRkYjogS25leCkge1xuICAgIHRoaXMuX3RkYiA9IHRkYjtcbiAgfVxuICBnZXQgdGRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLl90ZGIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpeHR1cmVNYW5hZ2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3RkYjtcbiAgfVxuXG4gIHByaXZhdGUgX2ZkYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgZmRiKGZkYjogS25leCkge1xuICAgIHRoaXMuX2ZkYiA9IGZkYjtcbiAgfVxuICBnZXQgZmRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLl9mZGIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpeHR1cmVNYW5hZ2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZkYjtcbiAgfVxuICBjYWNoZWRUYWJsZU5hbWVzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVsYXRpb25HcmFwaCA9IG5ldyBSZWxhdGlvbkdyYXBoKCk7XG5cbiAgLy8gVXBzZXJ0QnVpbGRlciDquLDrsJggaW1wb3J066W8IOychO2VnCDsg4Htg5xcbiAgcHJpdmF0ZSBidWlsZGVyOiBVcHNlcnRCdWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgcHJpdmF0ZSBmaXh0dXJlUmVmTWFwOiBNYXA8c3RyaW5nLCBVQlJlZj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2tpcHBlZEZpeHR1cmVzOiBNYXA8c3RyaW5nLCB7IGVudGl0eUlkOiBzdHJpbmc7IGV4aXN0aW5nSWQ6IG51bWJlciB9PiA9IG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpeHR1cmVSZWNvcmQpIHtcbiAgICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5maXh0dXJlSWQgIT09IGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZpeHR1cmVJZClcbiAgICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpeHR1cmUudGFyZ2V0ID0gcmVjb3JkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuaXF1ZSBpbmRleCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgZml4dHVyZS51bmlxdWVcbiAgICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRhcmdldERCLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHNvdXJjZURCLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJvdy5pZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkUm93Py5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByb3dbYCR7cHJvcC5uYW1lfV9pZGBdO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgcmVjb3JkLmJlbG9uZ3NSZWNvcmRzLnB1c2goYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiYgcmVsYXRlZElkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJlbGF0ZWRJZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGVkUm93KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZShyZWxhdGVkRW50aXR5LCByZWxhdGVkUm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShlbnRpdHksIHJvdyk7XG5cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwIChzZWxmLXJlZmVyZW5jZSDtj6ztlagpXG4gICAqIDIuIO2FjOydtOu4lOuzhCDroIjrsqjrs4TroZwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ0g67CPIHVwc2VydCDsi6TtlolcbiAgICogMy4g7Iic7IScIOq4sOuwmCB1dWlk4oaSaWQg66ek7ZWRIChVcHNlcnRCdWlsZGVy6rCAIHV1aWTrpbwgRELsl5Ag7KCA7J6l7ZWY7KeAIOyViuycvOuvgOuhnClcbiAgICpcbiAgICogVXBzZXJ0QnVpbGRlcuuKlCBzZWxmLXJlZmVyZW5jZeqwgCDsnojsnLzrqbQgYnVpbGRJbnNlcnRMZXZlbHMoKeuhnCDsnqzsoJXroKztlZjsl6xcbiAgICog65Ox66GdIOyInOyEnOyZgCDrsJjtmZgg7Iic7ISc6rCAIOuLrOudvOyniCDsiJgg7J6I7Iq164uI64ukLiDsnbTrpbwg67Cp7KeA7ZWY6riwIOychO2VtFxuICAgKiBGaXh0dXJlTWFuYWdlcuqwgCDroIjrsqjrs4TroZwg64KY64ig7IScIOyymOumrO2VmOyXrCDqsIEgdXBzZXJ0IO2YuOy2nOyXkOyEnOuKlFxuICAgKiBzZWxmLXJlZmVyZW5jZeqwgCDsl4brj4TroZ0g7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Rml4dHVyZXMoXG4gICAgZGJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICBfZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBmaXh0dXJlcyA9IHVuaXF1ZShfZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG5cbiAgICAvLyDstIjquLDtmZRcbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnNraXBwZWRGaXh0dXJlcyA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tkYk5hbWVdKTtcbiAgICBjb25zdCByZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwXG4gICAgICB0aGlzLnJlbGF0aW9uR3JhcGguYnVpbGRHcmFwaChmaXh0dXJlcyk7XG4gICAgICBjb25zdCBpbnNlcnRpb25PcmRlciA9IHRoaXMucmVsYXRpb25HcmFwaC5nZXRJbnNlcnRpb25PcmRlcigpO1xuXG4gICAgICAvLyAyLiDsiqTtgrXtlaAgZml4dHVyZSDrqLzsoIAg7LKY66asIChvdmVycmlkZSDssrTtgawpXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaGFzVGFyZ2V0ID0gISFmaXh0dXJlLnRhcmdldDtcbiAgICAgICAgY29uc3QgaGFzVW5pcXVlID0gISFmaXh0dXJlLnVuaXF1ZTtcbiAgICAgICAgY29uc3QgaGFzRHVwbGljYXRlID0gaGFzVGFyZ2V0IHx8IGhhc1VuaXF1ZTtcblxuICAgICAgICAvLyDspJHrs7XsnbQg7J6I6rOgIG92ZXJyaWRlPWZhbHNl7J24IOqyveyasDog7Iqk7YK1XG4gICAgICAgIGlmIChoYXNEdXBsaWNhdGUgJiYgIWZpeHR1cmUub3ZlcnJpZGUpIHtcbiAgICAgICAgICAvLyDquLDsobQg66CI7L2U65OcIElEIOyggOyepSAodW5pcXVlIOyasOyEoCwg7JeG7Jy866m0IHRhcmdldClcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gZml4dHVyZS51bmlxdWU/LmlkID8/IGZpeHR1cmUudGFyZ2V0Py5pZDtcbiAgICAgICAgICBhc3NlcnQoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5za2lwcGVkRml4dHVyZXMuc2V0KGZpeHR1cmVJZCwge1xuICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICBleGlzdGluZ0lkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSAoZXhpc3Rpbmc6ICMke2V4aXN0aW5nSWR9LCBvdmVycmlkZTogZmFsc2UpYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgZml4dHVyZSDqt7jro7ntmZQgKGluc2VydGlvbk9yZGVyIOyInOyEnCDquLDrsJgpXG4gICAgICBjb25zdCBmaXh0dXJlc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgRml4dHVyZVJlY29yZFtdPigpO1xuICAgICAgY29uc3QgdGFibGVPcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmUg7KCc7Jm4XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWRGaXh0dXJlcy5oYXMoZml4dHVyZUlkKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGU7XG5cbiAgICAgICAgaWYgKCFmaXh0dXJlc0J5VGFibGUuaGFzKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICBmaXh0dXJlc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgW10pO1xuICAgICAgICAgIHRhYmxlT3JkZXIucHVzaCh0YWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKT8ucHVzaChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4oKTtcblxuICAgICAgICAvLyA0LiDthYzsnbTruJTrs4Qg66CI67Ko67OEIOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaXh0dXJlcyA9IGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmdyb3VwRml4dHVyZXNCeUxldmVsKHRhYmxlRml4dHVyZXMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsZXZlbEZpeHR1cmVzIG9mIGxldmVscykge1xuICAgICAgICAgICAgLy8g7ZW064u5IOugiOuyqOydmCBmaXh0dXJl65OkIHJlZ2lzdGVyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgbGV2ZWxGaXh0dXJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUpYCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB1cHNlcnQg7Iuk7ZaJIOyghCB1dWlkIOuqqeuhnSDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5idWlsZGVyLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCB1dWlkcyA9IHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvdy51dWlkIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgIGBVcHNlcnRpbmcgJHt0YWJsZU5hbWV9IHdpdGggJHt1dWlkcy5sZW5ndGh9IHJvd3MgKGxldmVsICR7bGV2ZWxzLmluZGV4T2YobGV2ZWxGaXh0dXJlcykgKyAxfS8ke2xldmVscy5sZW5ndGh9KWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gKGF3YWl0IHRoaXMuYnVpbGRlci51cHNlcnQoXG4gICAgICAgICAgICAgIHRyeCxcbiAgICAgICAgICAgICAgdGFibGVOYW1lIGFzIGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kLFxuICAgICAgICAgICAgKSkgYXMgKG51bWJlciB8IHN0cmluZylbXTtcblxuICAgICAgICAgICAgLy8g7Iic7IScIOq4sOuwmCB1dWlkIC0+IGlkIOunpO2VkVxuICAgICAgICAgICAgLy8gc2VsZi1yZWZlcmVuY2XqsIAg7JeG7Jy866+A66GcIOuTseuhnSDsiJzshJwgPSDrsJjtmZgg7Iic7IScIOuztOyepVxuICAgICAgICAgICAgaWYgKHV1aWRzLmxlbmd0aCA+IDAgJiYgdXVpZHMubGVuZ3RoID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWFwID1cbiAgICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHRhYmxlTmFtZSkgPz8gbmV3IE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1dWlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nTWFwLnNldCh1dWlkc1tpXSwgaWRzW2ldKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgZXhpc3RpbmdNYXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1dWlkcy5sZW5ndGggIT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgIGBXYXJuaW5nOiB1dWlkIGNvdW50ICgke3V1aWRzLmxlbmd0aH0pICE9IGlkIGNvdW50ICgke2lkcy5sZW5ndGh9KSBmb3IgJHt0YWJsZU5hbWV9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIE1hbnlUb01hbnkg6rSA6rOEIOyymOumrFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKHRyeCwgZml4dHVyZXMsIGluc2VydGVkSWRzQnlUYWJsZSk7XG5cbiAgICAgICAgLy8gNi4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oYEluc2VydGVkIGludG8gJHtlbnRpdHkudGFibGV9OiAjJHtmaXh0dXJlLmlkfSAtPiAjJHtpbnNlcnRlZElkfWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlKHJlc3VsdHMsIChyKSA9PiBgJHtyLmVudGl0eUlkfSMke3IuZGF0YS5pZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlUmVjb3Jk66W8IFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdXG4gICAqIEBwYXJhbSBpbnNlcnRlZElkc0J5VGFibGUg7J2066+4IHVwc2VydOuQnCDthYzsnbTruJTsnZggdXVpZOKGkmlkIOunpO2VkSAo66CI67Ko67OEIOyymOumrCDsi5wg7IKs7JqpKVxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckZpeHR1cmUoXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PixcbiAgKTogVUJSZWYge1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgIGNvbnN0IHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIE92ZXJyaWRlIOuqqOuTnCDtjJDri6g6IHRhcmdldCDrmJDripQgdW5pcXVl6rCAIOyeiOqzoCBvdmVycmlkZT10cnVl7J24IOqyveyasFxuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gZml4dHVyZS50YXJnZXQgPz8gZml4dHVyZS51bmlxdWU7XG4gICAgY29uc3QgaXNPdmVycmlkZU1vZGUgPSBmaXh0dXJlLm92ZXJyaWRlICYmIGV4aXN0aW5nUmVjb3JkO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgY29uc3QgcHJvcCA9IGNvbHVtbi5wcm9wO1xuXG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGVkIGNvbHVtbuydgCBJTlNFUlTsl5DshJwg7KCc7Jm4IChEQuqwgCDsnpDrj5kg7IOd7ISxKVxuICAgICAgaWYgKFwiZ2VuZXJhdGVkXCIgaW4gcHJvcCAmJiBwcm9wLmdlbmVyYXRlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWQg7LKY66asOiBPdmVycmlkZSDrqqjrk5zsnbwg65WM66eMIOq4sOyhtCDqsJIg7IKs7JqpXG4gICAgICBpZiAocHJvcE5hbWUgPT09IFwiaWRcIikge1xuICAgICAgICBpZiAoaXNPdmVycmlkZU1vZGUgJiYgZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgICAvLyBPdmVycmlkZTog6riw7KG0IOugiOy9lOuTnOydmCDqsJIg7IKs7JqpIOKGkiBVUERBVEVcbiAgICAgICAgICByb3dbcHJvcE5hbWVdID0gZXhpc3RpbmdSZWNvcmQuY29sdW1uc1twcm9wTmFtZV0/LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIOyDiCDroIjsvZTrk5w6IOygnOyZuCDihpIgSU5TRVJUIChEQi9VcHNlcnRCdWlsZGVy6rCAIOyDneyEsSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXIgfCBudWxsO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQgIT09IG51bGwgJiYgcmVsYXRlZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG5cbiAgICAgICAgICAgIC8vIOuovOyggCBza2lw65CcIGZpeHR1cmXsnbjsp4Ag7ZmV7J24XG4gICAgICAgICAgICBjb25zdCBza2lwcGVkRXhpc3RpbmdJZCA9IHRoaXMuc2tpcHBlZEZpeHR1cmVzLmdldChyZWxhdGVkRml4dHVyZUlkKT8uZXhpc3RpbmdJZDtcbiAgICAgICAgICAgIGlmIChza2lwcGVkRXhpc3RpbmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIHNraXDrkJwgZml4dHVyZSDihpIgdGFyZ2V0IERC7J2YIOq4sOyhtCDroIjsvZTrk5wgaWQg7IKs7JqpXG4gICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHNraXBwZWRFeGlzdGluZ0lkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQnCDqsJnsnYAg7YWM7J2067iUIGZpeHR1cmUg7ZmV7J24XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEluc2VydGVkSWRzID0gaW5zZXJ0ZWRJZHNCeVRhYmxlPy5nZXQocmVsYXRlZEVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsSWQgPSByZWxhdGVkSW5zZXJ0ZWRJZHM/LmdldChyZWxhdGVkUmVmLnV1aWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFjdHVhbElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOydtOuvuCB1cHNlcnTrkKgg4oaSIOyLpOygnCBJRCDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IGFjdHVhbElkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyDslYTsp4EgdXBzZXJ0IOyViOuQqCDihpIgVUJSZWYg7IKs7JqpXG4gICAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSByZWxhdGVkUmVmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmaXh0dXJlc+yXkCDtj6ztlajrkJjsp4Ag7JWK7J2AIOugiOy9lOuTnCDihpIgSUQg6re464yA66GcIOyCrOyaqVxuICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXNNYW55LCBNYW55VG9NYW5564qUIOuzhOuPhCDsspjrpqxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDsu6zrn7xcbiAgICAgICAgcm93W3Byb3BOYW1lXSA9IHRoaXMuY29udmVydENvbHVtblZhbHVlKHByb3AgYXMgRW50aXR5UHJvcCwgY29sdW1uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBSZWdpc3RlcmluZyAke2VudGl0eS50YWJsZX0gLSAke2luc3BlY3Qocm93LCBmYWxzZSwgbnVsbCwgdHJ1ZSl9YCkpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuYnVpbGRlci5yZWdpc3RlcihlbnRpdHkudGFibGUsIHJvdyk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwLnNldChmaXh0dXJlLmZpeHR1cmVJZCwgcmVmKTtcblxuICAgIHJldHVybiByZWY7XG4gIH1cblxuICAvKipcbiAgICog7Lus65+8IOqwkiDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgY29udmVydENvbHVtblZhbHVlKHByb3A6IEVudGl0eVByb3AsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAvLyBVcHNlcnRCdWlsZGVyLnJlZ2lzdGVy7JeQ7IScIEpTT04uc3RyaW5naWZ5IOyymOumrO2VmOuvgOuhnCBvYmplY3Qg6re464yA66GcIOyghOuLrFxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKFxuICAgIHRyeDogS25leC5UcmFuc2FjdGlvbixcbiAgICBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICAgIGluc2VydGVkSWRzQnlUYWJsZTogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICBjb25zdCBzb3VyY2VSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcblxuICAgICAgaWYgKCFzb3VyY2VSZWYpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBzb3VyY2VVdWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgIGNvbnN0IHNvdXJjZUlkID0gc291cmNlVXVpZFRvSWQ/LmdldChzb3VyY2VSZWYudXVpZCk7XG5cbiAgICAgIGlmIChzb3VyY2VJZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBbLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IGNvbHVtbi5wcm9wO1xuXG4gICAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkgJiYgQXJyYXkuaXNBcnJheShjb2x1bW4udmFsdWUpKSB7XG4gICAgICAgICAgLy8g7ISg7YOd65CY7KeAIOyViuydgCBNYW55VG9NYW55IOq0gOqzhOuKlCDsoIDsnqXtlZjsp4Ag7JWK7J2MXG4gICAgICAgICAgY29uc3QgdGFyZ2V0VGFibGUgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGlmICh0aGlzLmJ1aWxkZXIuaGFzVGFibGUodGFyZ2V0VGFibGUudGFibGUpID09PSBmYWxzZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gY29sdW1uLnZhbHVlIGFzIG51bWJlcltdO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBqb2luVGFibGUgPSAocHJvcCBhcyBNYW55VG9NYW55UmVsYXRpb25Qcm9wKS5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG5cbiAgICAgICAgICAgIGxldCB0YXJnZXRJZDogbnVtYmVyIHwgc3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAocmVsYXRlZFJlZikge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHJlbGF0ZWRFbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZElkID0gcmVsYXRlZFV1aWRUb0lkPy5nZXQocmVsYXRlZFJlZi51dWlkKTtcblxuICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFJlbGF0ZWQgZml4dHVyZSAke3JlbGF0ZWRGaXh0dXJlSWR9IG5vdCBmb3VuZCBpbiBpbnNlcnRlZElkcywgc2tpcHBpbmdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZXNvbHZlZElkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEpvaW5UYWJsZeyXkCDsgr3snoVcbiAgICAgICAgICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCB0cngoam9pblRhYmxlKVxuICAgICAgICAgICAgICAud2hlcmUoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5saW1pdCgxKTtcblxuICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICBhd2FpdCB0cngoam9pblRhYmxlKS5pbnNlcnQoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgYEluc2VydGVkIGludG8gJHtqb2luVGFibGV9OiAke2VudGl0eS50YWJsZX0oJHtzb3VyY2VJZH0pIC0gJHtyZWxhdGVkRW50aXR5LnRhYmxlfSgke3RhcmdldElkfSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwmeydgCDthYzsnbTruJQg64K0IGZpeHR1cmXrk6TsnYQgc2VsZi1yZWZlcmVuY2Ug66CI67Ko67OE66GcIOu2hO2VoFxuICAgKiAtIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuKlCBmaXh0dXJl65OkOiBMZXZlbCAwXG4gICAqIC0gTGV2ZWwgMOydhCDssLjsobDtlZjripQgZml4dHVyZeuTpDogTGV2ZWwgMVxuICAgKiAtIOuwmOuztVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy6rCAIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0IEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBncm91cEZpeHR1cmVzQnlMZXZlbChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogRml4dHVyZVJlY29yZFtdW10ge1xuICAgIGlmIChmaXh0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlc1swXS5lbnRpdHlJZCk7XG5cbiAgICAvLyBzZWxmLXJlZmVyZW5jZSByZWxhdGlvbiBwcm9wIOywvuq4sFxuICAgIGNvbnN0IHNlbGZSZWZQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIHwgT25lVG9PbmVSZWxhdGlvblByb3AgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZlJlZlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc2VsZi1yZWZlcmVuY2Ug7JeG7J2MIOKGkiDri6jsnbwg66CI67KoXG4gICAgICByZXR1cm4gW2ZpeHR1cmVzXTtcbiAgICB9XG5cbiAgICAvLyDroIjrsqjrs4Qg67aE7ZWgICh0b3BvbG9naWNhbCBzb3J0KVxuICAgIGNvbnN0IGxldmVsczogRml4dHVyZVJlY29yZFtdW10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KGZpeHR1cmVzLm1hcCgoZikgPT4gZi5maXh0dXJlSWQpKTtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBpZiAoIXJlbWFpbmluZy5oYXMoZml4dHVyZS5maXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDrqqjrkZAg7J2066+4IOyymOumrOuQkOqxsOuCmCBudWxs7J24IOqyveyasFxuICAgICAgICBjb25zdCBjYW5Qcm9jZXNzID0gc2VsZlJlZlByb3BzLmV2ZXJ5KChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmSWQgPSBmaXh0dXJlLmNvbHVtbnNbcHJvcC5uYW1lXT8udmFsdWUgYXMgbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgICBpZiAocmVmSWQgPT09IG51bGwgfHwgcmVmSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgY29uc3QgcmVmRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlZklkfWA7XG4gICAgICAgICAgLy8g7J2066+4IOyymOumrOuQkOqxsOuCmCwg7ZiE7J6sIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg6rK97JqwICjsmbjrtoAg7LC47KGwKVxuICAgICAgICAgIHJldHVybiBwcm9jZXNzZWQuaGFzKHJlZkZpeHR1cmVJZCkgfHwgIXJlbWFpbmluZy5oYXMocmVmRml4dHVyZUlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNhblByb2Nlc3MpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaChmaXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdJZHMgPSBBcnJheS5mcm9tKHJlbWFpbmluZykuam9pbihcIiwgXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENpcmN1bGFyIHNlbGYtcmVmZXJlbmNlIGRldGVjdGVkIGluICR7ZW50aXR5LnRhYmxlfS4gUmVtYWluaW5nIGZpeHR1cmVzOiAke3JlbWFpbmluZ0lkc31gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICBwcm9jZXNzZWQuYWRkKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIH1cblxuICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1VuaXF1ZVZpb2xhdGlvbihkYjogS25leCwgZW50aXR5OiBFbnRpdHksIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpIHtcbiAgICBjb25zdCBfdW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gX3VuaXF1ZUluZGV4ZXMuZmlsdGVyKChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGNvbHVtbikgPT4gIWNvbHVtbi5uYW1lLnN0YXJ0c1dpdGgoYCR7ZW50aXR5LnRhYmxlfV9fYCkpLFxuICAgICk7XG4gICAgaWYgKHVuaXF1ZUluZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgdW5pcXVlUXVlcnkgPSBkYihlbnRpdHkudGFibGUpO1xuICAgIGxldCBoYXNDb25kaXRpb24gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdW5pcXVlSW5kZXhlcykge1xuICAgICAgLy8g7Lus65+8IOykkSDtlZjrgpjrnbzrj4QgbnVsbOydtOuptCDsnKDri4jtgawg7KCc7JW97J2EIOychOuwmO2VmOyngCDslYrquLAg65WM66y47JeQIO2VtOuLuSDsnbjrjbHsiqTripQg66y07IucXG4gICAgICBjb25zdCBjb250YWluc051bGwgPSBpbmRleC5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlID09PSBudWxsO1xuICAgICAgfSk7XG4gICAgICBpZiAoY29udGFpbnNOdWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB1bmlxdWVRdWVyeSA9IHVuaXF1ZVF1ZXJ5Lm9yV2hlcmUoKHFiKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGluZGV4LmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKSkge1xuICAgICAgICAgICAgcWIud2hlcmVJbihjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHFiLmFuZFdoZXJlKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhhc0NvbmRpdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFt1bmlxdWVGb3VuZF0gPSBhd2FpdCB1bmlxdWVRdWVyeTtcbiAgICByZXR1cm4gdW5pcXVlRm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgIGRiOiBLbmV4LFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICkge1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0aCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJTdGFydCA9IGNvbnRlbnQuaW5kZXhPZihcImNvbnN0IGZpeHR1cmVMb2FkZXIgPSB7XCIpO1xuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJFbmQgPSBjb250ZW50LmluZGV4T2YoXCJ9O1wiLCBmaXh0dXJlTG9hZGVyU3RhcnQpO1xuXG4gICAgaWYgKGZpeHR1cmVMb2FkZXJTdGFydCAhPT0gLTEgJiYgZml4dHVyZUxvYWRlckVuZCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtjb250ZW50LnNsaWNlKDAsIGZpeHR1cmVMb2FkZXJFbmQpfSAgJHtjb2RlfVxcbiR7Y29udGVudC5zbGljZShmaXh0dXJlTG9hZGVyRW5kKX1gO1xuXG4gICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiY2hhbGsiLCJleGVjU3luYyIsInJlYWRGaWxlU3luYyIsIndyaXRlRmlsZVN5bmMiLCJpbmZsZWN0aW9uIiwidW5pcXVlIiwiaW5zcGVjdCIsIlNvbmFtdSIsIkJhc2VNb2RlbCIsImNyZWF0ZUtuZXhJbnN0YW5jZSIsIlVwc2VydEJ1aWxkZXIiLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiUmVsYXRpb25HcmFwaCIsIkZpeHR1cmVNYW5hZ2VyQ2xhc3MiLCJfdGRiIiwidGRiIiwiRXJyb3IiLCJfZmRiIiwiZmRiIiwiY2FjaGVkVGFibGVOYW1lcyIsInJlbGF0aW9uR3JhcGgiLCJidWlsZGVyIiwiZml4dHVyZVJlZk1hcCIsIk1hcCIsInNraXBwZWRGaXh0dXJlcyIsImluaXQiLCJkYkNvbmZpZyIsInRlc3QiLCJwcm9kdWN0aW9uX21hc3RlciIsInRDb25uIiwiY29ubmVjdGlvbiIsInBDb25uIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsImZpeHR1cmUiLCJzeW5jIiwiZml4dHVyZUNvbm4iLCJ0ZXN0Q29ubiIsInRlc3RQZ0VudiIsIlBHUEFTU1dPUkQiLCJwYXNzd29yZCIsInVzZXIiLCJzdGRpbyIsImVudiIsInByb2Nlc3MiLCJmaXh0dXJlUGdFbnYiLCJkdW1wQ21kIiwicmVzdG9yZUNtZCIsInNoZWxsIiwidmlzaXRlZFJlY29yZHMiLCJTZXQiLCJpbXBvcnRGaXh0dXJlIiwiZW50aXR5SWQiLCJpZHMiLCJjbGVhciIsInF1ZXJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiaWQiLCJnZXRJbXBvcnRRdWVyaWVzIiwiZmxhdCIsIndkYiIsImdldERCIiwicXVlcnkiLCJyYXciLCJmaWVsZCIsInJlY29yZEtleSIsImhhcyIsImFkZCIsImVudGl0eSIsImdldCIsInJvdyIsInRhYmxlIiwid2hlcmUiLCJsaW1pdCIsInVuZGVmaW5lZCIsImZpeHR1cmVEYXRhYmFzZSIsInJlYWxEYXRhYmFzZSIsInNlbGZRdWVyeSIsImFyZ3MiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVsYXRpb25zIiwiZmlsdGVyIiwicmVsYXRpb24iLCJjdXN0b21Kb2luQ2xhdXNlIiwiaGFzSm9pbkNvbHVtbiIsInJlbGF0ZWRFbnRpdHkiLCJ3aXRoIiwicmVsYXRlZElkQ29sdW1uTmFtZSIsInByb3BzIiwiZmluZCIsInAiLCJuYW1lIiwiYXJnIiwicmVsUXVlcmllcyIsInJldmVyc2UiLCJkZXN0cm95IiwiZ2V0Rml4dHVyZXMiLCJzb3VyY2VEQk5hbWUiLCJ0YXJnZXREQk5hbWUiLCJzZWFyY2hPcHRpb25zIiwiZHVwbGljYXRlQ2hlY2siLCJzb3VyY2VEQiIsInRhcmdldERCIiwidmFsdWUiLCJzZWFyY2hUeXBlIiwiY29sdW1uIiwicHJvcCIsInR5cGUiLCJyb3dzIiwibGVuZ3RoIiwiZml4dHVyZXMiLCJpbml0aWFsUmVjb3Jkc0xlbmd0aCIsIm5ld1JlY29yZHMiLCJjcmVhdGVGaXh0dXJlUmVjb3JkIiwiX2RiIiwicHVzaCIsImN1cnJlbnRGaXh0dXJlUmVjb3JkIiwiciIsImZpeHR1cmVJZCIsImZldGNoZWRSZWNvcmRzIiwic2xpY2UiLCJjdXN0b21Db2x1bW5zIiwiY29sdW1ucyIsImN1c3RvbUR1cGxpY2F0ZVJvdyIsImNoZWNrRHVwbGljYXRlQnlDb2x1bW5zIiwicmVjb3JkIiwic2luZ2xlUmVjb3JkIiwidGFyZ2V0IiwidW5pcXVlUm93IiwiY2hlY2tVbmlxdWVWaW9sYXRpb24iLCJmIiwib3B0aW9ucyIsInJlY29yZHMiLCJ2aXNpdGVkRW50aXRpZXMiLCJjcmVhdGUiLCJiZWxvbmdzUmVjb3JkcyIsImRiIiwidGhyb3VnaFRhYmxlIiwiam9pblRhYmxlIiwiZnJvbUNvbHVtbiIsInNpbmd1bGFyaXplIiwidG9Db2x1bW4iLCJyZWxhdGVkSWRzIiwicGx1Y2siLCJqb2luQ29sdW1uIiwicmVsYXRlZFByb3AiLCJyZWxhdGVkUm93IiwiZmlyc3QiLCJyZWxhdGVkSWQiLCJpbnNlcnRGaXh0dXJlcyIsImRiTmFtZSIsIl9maXh0dXJlcyIsInJlc3VsdHMiLCJidWlsZEdyYXBoIiwiaW5zZXJ0aW9uT3JkZXIiLCJnZXRJbnNlcnRpb25PcmRlciIsImhhc1RhcmdldCIsImhhc1VuaXF1ZSIsImhhc0R1cGxpY2F0ZSIsIm92ZXJyaWRlIiwiZXhpc3RpbmdJZCIsInNldCIsImNvbnNvbGUiLCJsb2ciLCJ5ZWxsb3ciLCJmaXh0dXJlc0J5VGFibGUiLCJ0YWJsZU9yZGVyIiwidGFibGVOYW1lIiwidHJhbnNhY3Rpb24iLCJ0cngiLCJpbnNlcnRlZElkc0J5VGFibGUiLCJ0YWJsZUZpeHR1cmVzIiwibGV2ZWxzIiwiZ3JvdXBGaXh0dXJlc0J5TGV2ZWwiLCJsZXZlbEZpeHR1cmVzIiwicmVnaXN0ZXJGaXh0dXJlIiwiYmx1ZSIsImdldFRhYmxlIiwidXVpZHMiLCJ1dWlkIiwiaW5kZXhPZiIsInVwc2VydCIsImV4aXN0aW5nTWFwIiwiaSIsIndhcm4iLCJwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyIsInNraXBwZWQiLCJkYXRhIiwicmVmIiwidXVpZFRvSWQiLCJpbnNlcnRlZElkIiwiZ3JlZW4iLCJleGlzdGluZ1JlY29yZCIsImlzT3ZlcnJpZGVNb2RlIiwicHJvcE5hbWUiLCJnZW5lcmF0ZWQiLCJyZWxhdGVkRml4dHVyZUlkIiwic2tpcHBlZEV4aXN0aW5nSWQiLCJyZWxhdGVkUmVmIiwicmVsYXRlZEluc2VydGVkSWRzIiwiYWN0dWFsSWQiLCJjb252ZXJ0Q29sdW1uVmFsdWUiLCJyZWdpc3RlciIsIkRhdGUiLCJzb3VyY2VSZWYiLCJzb3VyY2VVdWlkVG9JZCIsInNvdXJjZUlkIiwiQXJyYXkiLCJpc0FycmF5IiwidGFyZ2V0VGFibGUiLCJoYXNUYWJsZSIsInNvdXJjZUNvbHVtbiIsInRhcmdldENvbHVtbiIsInRhcmdldElkIiwicmVsYXRlZFV1aWRUb0lkIiwicmVzb2x2ZWRJZCIsImZvdW5kIiwiaW5zZXJ0Iiwic2VsZlJlZlByb3BzIiwicmVtYWluaW5nIiwicHJvY2Vzc2VkIiwic2l6ZSIsImN1cnJlbnRMZXZlbCIsImNhblByb2Nlc3MiLCJldmVyeSIsInJlZklkIiwicmVmRml4dHVyZUlkIiwicmVtYWluaW5nSWRzIiwiZnJvbSIsImpvaW4iLCJkZWxldGUiLCJfdW5pcXVlSW5kZXhlcyIsImluZGV4ZXMiLCJ1bmlxdWVJbmRleGVzIiwiaW5kZXgiLCJzdGFydHNXaXRoIiwidW5pcXVlUXVlcnkiLCJoYXNDb25kaXRpb24iLCJjb250YWluc051bGwiLCJzb21lIiwicmVwbGFjZSIsIm9yV2hlcmUiLCJxYiIsIndoZXJlSW4iLCJhbmRXaGVyZSIsInVuaXF1ZUZvdW5kIiwid2hlcmVDbGF1c2UiLCJkYkNvbHVtbiIsImFkZEZpeHR1cmVMb2FkZXIiLCJjb2RlIiwicGF0aCIsImFwaVJvb3RQYXRoIiwiY29udGVudCIsInRvU3RyaW5nIiwiZml4dHVyZUxvYWRlclN0YXJ0IiwiZml4dHVyZUxvYWRlckVuZCIsIm5ld0NvbnRlbnQiLCJGaXh0dXJlTWFuYWdlciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxRQUFRLFFBQVEsZ0JBQWdCO0FBQ3pDLFNBQVNDLFlBQVksRUFBRUMsYUFBYSxRQUFRLEtBQUs7QUFDakQsT0FBT0MsZ0JBQWdCLGFBQWE7QUFFcEMsU0FBU0MsTUFBTSxRQUFRLFVBQVU7QUFDakMsU0FBU0MsT0FBTyxRQUFRLE9BQU87QUFDL0IsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLFNBQVNDLFNBQVMsUUFBUSw0QkFBeUI7QUFFbkQsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQW1CO0FBQ3RELFNBQXFCQyxhQUFhLFFBQVEsZ0NBQTZCO0FBRXZFLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FPRUMsMEJBQTBCLEVBQzFCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsc0JBQXNCLEVBQ3RCQyxjQUFjLEVBQ2RDLGFBQWEsUUFHUixvQkFBaUI7QUFDeEIsU0FBU0MsYUFBYSxRQUFRLHVCQUFvQjtBQVNsRCxPQUFPLE1B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
759
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgdHlwZSBNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IFJlbGF0aW9uR3JhcGggfSBmcm9tIFwiLi9fcmVsYXRpb24tZ3JhcGhcIjtcblxuLyoqIOyCrOyaqeyekCDsp4DsoJUg7KSR67O1IO2ZleyduCDsu6zrn7wgKGVudGl0eUlk67OE66GcIOyngOyglSkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlQ2hlY2tPcHRpb25zIHtcbiAgY29sdW1ucz86IHtcbiAgICBbZW50aXR5SWQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRml4dHVyZU1hbmFnZXJDbGFzcyB7XG4gIHByaXZhdGUgX3RkYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgdGRiKHRkYjogS25leCkge1xuICAgIHRoaXMuX3RkYiA9IHRkYjtcbiAgfVxuICBnZXQgdGRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLl90ZGIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpeHR1cmVNYW5hZ2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3RkYjtcbiAgfVxuXG4gIHByaXZhdGUgX2ZkYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgZmRiKGZkYjogS25leCkge1xuICAgIHRoaXMuX2ZkYiA9IGZkYjtcbiAgfVxuICBnZXQgZmRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLl9mZGIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpeHR1cmVNYW5hZ2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZkYjtcbiAgfVxuICBjYWNoZWRUYWJsZU5hbWVzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVsYXRpb25HcmFwaCA9IG5ldyBSZWxhdGlvbkdyYXBoKCk7XG5cbiAgLy8gVXBzZXJ0QnVpbGRlciDquLDrsJggaW1wb3J066W8IOychO2VnCDsg4Htg5xcbiAgcHJpdmF0ZSBidWlsZGVyOiBVcHNlcnRCdWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgcHJpdmF0ZSBmaXh0dXJlUmVmTWFwOiBNYXA8c3RyaW5nLCBVQlJlZj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2tpcHBlZEZpeHR1cmVzOiBNYXA8c3RyaW5nLCB7IGVudGl0eUlkOiBzdHJpbmc7IGV4aXN0aW5nSWQ6IG51bWJlciB8IHN0cmluZyB9PiA9XG4gICAgbmV3IE1hcCgpO1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuX3RkYiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoU29uYW11LmRiQ29uZmlnLnRlc3QgJiYgU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyKSB7XG4gICAgICBjb25zdCB0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHBDb25uID0gU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGlmIChcbiAgICAgICAgYCR7dENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3RDb25uLnBvcnQgPz8gNTQzMn0vJHt0Q29ubi5kYXRhYmFzZX1gID09PVxuICAgICAgICBgJHtwQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7cENvbm4ucG9ydCA/PyA1NDMyfS8ke3BDb25uLmRhdGFiYXNlfWBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2FjOyKpO2KuERC7JmAIO2UhOuhnOuNleyFmERC7JeQIOuPmeydvO2VnCDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7IKs7Jqp65CY7JeI7Iq164uI64ukLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGRiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgICB0aGlzLmZkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gIH1cblxuICAvKipcbiAgICDsm5DqsqkgZml4dHVyZSBEQuulvCDroZzsu6wgdGVzdCBEQuuhnCDrs7Xsgqztlanri4jri6QuXG4gICAgcGdfZHVtcOuhnCDsm5DqsqkgRELrpbwg642k7ZSE7ZWY6rOgLCBwZ19yZXN0b3Jl66GcIOuhnOy7rOyXkCDrs7Xsm5Dtlanri4jri6QuXG4gICovXG4gIGFzeW5jIHN5bmMoKSB7XG4gICAgY29uc3QgZml4dHVyZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHRlc3RDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcblxuICAgIC8vIDEuIOuhnOy7rCB0ZXN0IERCIOyXsOqysCDsooXro4wg67CPIOyerOyDneyEsVxuICAgIGNvbnN0IHRlc3RQZ0VudiA9IHsgUEdQQVNTV09SRDogdGVzdENvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIlxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gJyR7dGVzdENvbm4uZGF0YWJhc2V9J1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIFwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcXFxcIiR7dGVzdENvbm4uZGF0YWJhc2V9XFxcXFwiXCJgLFxuICAgICAgeyBzdGRpbzogXCJpbmhlcml0XCIsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGVzdFBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgICApO1xuXG4gICAgZXhlY1N5bmMoXG4gICAgICBgcHNxbCAtaCAke3Rlc3RDb25uLmhvc3R9IC1wICR7dGVzdENvbm4ucG9ydCA/PyA1NDMyfSAtVSAke3Rlc3RDb25uLnVzZXJ9IC1kIHBvc3RncmVzIC1jIFwiQ1JFQVRFIERBVEFCQVNFIFxcXFxcIiR7dGVzdENvbm4uZGF0YWJhc2V9XFxcXFwiXCJgLFxuICAgICAgeyBzdGRpbzogXCJpbmhlcml0XCIsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGVzdFBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgICApO1xuXG4gICAgLy8gMi4g7JuQ6rKpIGZpeHR1cmUgREIg4oaSIOuhnOy7rCB0ZXN0IERC66GcIOuzteyCrCAocGdfZHVtcCB8IHBnX3Jlc3RvcmUpXG4gICAgY29uc3QgZml4dHVyZVBnRW52ID0geyBQR1BBU1NXT1JEOiBmaXh0dXJlQ29ubi5wYXNzd29yZCB8fCBcIlwiIH07XG4gICAgY29uc3QgZHVtcENtZCA9IGBwZ19kdW1wIC1oICR7Zml4dHVyZUNvbm4uaG9zdH0gLXAgJHtmaXh0dXJlQ29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7Zml4dHVyZUNvbm4udXNlcn0gLWQgJHtmaXh0dXJlQ29ubi5kYXRhYmFzZX0gLUZjYDtcbiAgICBjb25zdCByZXN0b3JlQ21kID0gYHBnX3Jlc3RvcmUgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCAke3Rlc3RDb25uLmRhdGFiYXNlfSAtLW5vLW93bmVyIC0tbm8tYWNsYDtcblxuICAgIGV4ZWNTeW5jKGAke2R1bXBDbWR9IHwgUEdQQVNTV09SRD1cIiR7dGVzdENvbm4ucGFzc3dvcmQgfHwgXCJcIn1cIiAke3Jlc3RvcmVDbWR9YCwge1xuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5maXh0dXJlUGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudixcbiAgICAgIHNoZWxsOiBcIi9iaW4vYmFzaFwiLFxuICAgIH0pO1xuXG4gICAgLy8gMy4g7Iuc7YCA7IqkIOumrOyFiyAo642w7J207YSwIOuzteyCrCDtm4Qg7Iuc7YCA7Iqk66W8IE1BWChpZCnroZwg7KCV66CsKVxuICAgIGF3YWl0IHRoaXMucmVzZXRTZXF1ZW5jZXMoU29uYW11LmRiQ29uZmlnLnRlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuqqOuToCDthYzsnbTruJTsnZgg7Iuc7YCA7Iqk66W8IO2YhOyerCBNQVgoaWQp66GcIOumrOyFi+2VqeuLiOuLpC5cbiAgICogZml4dHVyZSBzeW5jIO2bhCDsi5ztgIDsiqTqsIAg7Iuk7KCcIOuNsOydtO2EsOyZgCDrp57sp4Ag7JWK64qUIOusuOygnOulvCDtlbTqsrDtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc2V0U2VxdWVuY2VzKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZ1tcInRlc3RcIl0pIHtcbiAgICBjb25zdCB0ZXN0RGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoZGJDb25maWcpO1xuICAgIGNvbnN0IGVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGVudGl0eS50YWJsZSB8fCBlbnRpdHkuaWQudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIO2ZleyduO2VqeuLiOuLpFxuICAgICAgICBjb25zdCBpZFByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICBjb25zdCBpZFR5cGUgPSBpZFByb3A/LnR5cGU7XG5cbiAgICAgICAgLy8gaW50ZWdlcuuCmCBiaWdJbnRlZ2Vy6rCAIOyVhOuLjCDqsr3smrAgc2VxdWVuY2UgcmVzZXTsnYQg7Iqk7YK17ZWp64uI64ukICh0ZXh0LCB1dWlkIOuTsSlcbiAgICAgICAgaWYgKCFpZFR5cGUgfHwgKGlkVHlwZSAhPT0gXCJpbnRlZ2VyXCIgJiYgaWRUeXBlICE9PSBcImJpZ0ludGVnZXJcIikpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBpbmcgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfSAoaWQgdHlwZTogJHtpZFR5cGUgfHwgXCJ1bmtub3duXCJ9KWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9zdGdyZVNRTCDsi5ztgIDsiqTrpbwg7ZiE7J6sIO2FjOydtOu4lOydmCBNQVgoaWQp66GcIOumrOyFi+2VqeuLiOuLpC5cbiAgICAgICAgLy8g7IS4IOuyiOynuCDsnbjsnpDrpbwg7IOd65617ZWY66m0IOq4sOuzuOqwkiB0cnVl6rCAIOyggeyaqeuQmOyWtCwg64uk7J2MIElOU0VSVCDsi5wgTUFYKGlkKSsx67aA7YSwIOyLnOyeke2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgdGVzdERiLnJhdyhgXG4gICAgICAgICAgU0VMRUNUIHNldHZhbChcbiAgICAgICAgICAgIHBnX2dldF9zZXJpYWxfc2VxdWVuY2UoJ3B1YmxpYy4ke3RhYmxlTmFtZX0nLCAnaWQnKSxcbiAgICAgICAgICAgIENPQUxFU0NFKChTRUxFQ1QgTUFYKGlkKSBGUk9NICR7dGFibGVOYW1lfSksIDEpXG4gICAgICAgICAgKVxuICAgICAgICBgKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGVzdERiLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZpc2l0ZWRSZWNvcmRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGFzeW5jIGltcG9ydEZpeHR1cmUoZW50aXR5SWQ6IHN0cmluZywgaWRzOiBudW1iZXJbXSkge1xuICAgIC8vIOuwqeusuCDquLDroZ0g7LSI6riw7ZmUICjsg4jroZzsmrQgaW1wb3J0IOyekeyXhSDsi5zsnpEpXG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5jbGVhcigpO1xuXG4gICAgY29uc3QgcXVlcmllcyA9IHVuaXF1ZShcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgaWRzLm1hcChhc3luYyAoaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEltcG9ydFF1ZXJpZXMoZW50aXR5SWQsIFwiaWRcIiwgaWQpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICApLmZsYXQoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICBmb3IgKGNvbnN0IHF1ZXJ5IG9mIHF1ZXJpZXMpIHtcbiAgICAgIGF3YWl0IHdkYi5yYXcocXVlcnkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEltcG9ydFF1ZXJpZXMoZW50aXR5SWQ6IHN0cmluZywgZmllbGQ6IHN0cmluZywgaWQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtmaWVsZH0jJHtpZH1gO1xuXG4gICAgLy8g7Iic7ZmYIOywuOyhsCDrsKnsp4A6IOydtOuvuCDrsKnrrLjtlZwg66CI7L2U65Oc64qUIOyKpO2CtVxuICAgIGlmICh0aGlzLnZpc2l0ZWRSZWNvcmRzLmhhcyhyZWNvcmRLZXkpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRoaXMudmlzaXRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcblxuICAgIC8vIOyXrOq4sOyEnCDsi6REQuydmCByb3cg6rCA7KC47Ji0XG4gICAgY29uc3QgW3Jvd10gPSBhd2FpdCB3ZGIoZW50aXR5LnRhYmxlKS53aGVyZShmaWVsZCwgaWQpLmxpbWl0KDEpO1xuICAgIGlmIChyb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfSMke2lkfSByb3frpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7ZS97Iqk7LOQREIsIOyLpERCXG4gICAgY29uc3QgZml4dHVyZURhdGFiYXNlID0gKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKS5kYXRhYmFzZTtcbiAgICBjb25zdCByZWFsRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKVxuICAgICAgLmRhdGFiYXNlO1xuXG4gICAgY29uc3Qgc2VsZlF1ZXJ5ID0gYElOU0VSVCBJR05PUkUgSU5UTyBcXGAke2ZpeHR1cmVEYXRhYmFzZX1cXGAuXFxgJHtlbnRpdHkudGFibGV9XFxgIChTRUxFQ1QgKiBGUk9NIFxcYCR7cmVhbERhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgV0hFUkUgXFxgaWRcXGAgPSAke2lkfSlgO1xuXG4gICAgY29uc3QgYXJncyA9IE9iamVjdC5lbnRyaWVzKGVudGl0eS5yZWxhdGlvbnMpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoWywgcmVsYXRpb25dKSA9PlxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSAmJiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlID09PSB1bmRlZmluZWQpLFxuICAgICAgKVxuICAgICAgLm1hcCgoWywgcmVsYXRpb25dKSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgIEJlbG9uZ3NUb09uZeyduCDqsr3smrBcbiAgICAgICAgICBDYXRlZ29yeSAvICdpZCcgLyByb3dbY2F0ZWdvcnlfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSB0cnVlIOyduCDqsr3smrBcbiAgICAgICAgICBQcm9maWxlIC8gJ2lkJyAvIHJvd1twcm9maWxlX2lkXSDtmLjstpxcbiAgICAgICAgT25lVG9PbmXsl5Agam9pbkNvbHVtbiA9PT0gZmFsc2Ug7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAncHJvZmlsZV9pZCcgLyByb3dbJ2lkJ10g7Zi47LacXG4gICAgICAgICovXG4gICAgICAgIGxldCBmaWVsZDogc3RyaW5nO1xuICAgICAgICBsZXQgaWQ6IG51bWJlcjtcbiAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmICFyZWxhdGlvbi5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZENvbHVtbk5hbWUgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKT8ubmFtZTtcbiAgICAgICAgICBpZiAoIXJlbGF0ZWRJZENvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZWxhdGVkRW50aXR5LmlkfeydmCAke2VudGl0eS5pZH0g6rSA6rOEIO2UhOuhreydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGQgPSBgJHtyZWxhdGVkSWRDb2x1bW5OYW1lfV9pZGA7XG4gICAgICAgICAgaWQgPSByb3cuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGQgPSBcImlkXCI7XG4gICAgICAgICAgaWQgPSByb3dbYCR7cmVsYXRpb24ubmFtZX1faWRgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVudGl0eUlkOiByZWxhdGlvbi53aXRoLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGlkLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGFyZykgPT4gYXJnLmlkICE9PSBudWxsKTtcblxuICAgIGNvbnN0IHJlbFF1ZXJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFyZ3MubWFwKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEltcG9ydFF1ZXJpZXMoYXJncy5lbnRpdHlJZCwgYXJncy5maWVsZCwgYXJncy5pZCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIFsuLi51bmlxdWUocmVsUXVlcmllcy5yZXZlcnNlKCkuZmxhdCgpKSwgc2VsZlF1ZXJ5XTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX3RkYikge1xuICAgICAgYXdhaXQgdGhpcy5fdGRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX3RkYiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZGIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2ZkYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9mZGIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rml4dHVyZXMoXG4gICAgc291cmNlREJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICB0YXJnZXREQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHNlYXJjaE9wdGlvbnM6IEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICAgIGR1cGxpY2F0ZUNoZWNrPzogRHVwbGljYXRlQ2hlY2tPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VEQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbc291cmNlREJOYW1lXSk7XG4gICAgY29uc3QgdGFyZ2V0REIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW3RhcmdldERCTmFtZV0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGZpZWxkLCB2YWx1ZSwgc2VhcmNoVHlwZSB9ID0gc2VhcmNoT3B0aW9ucztcblxuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgZW50aXR5LnByb3BzLmZpbmQoKHByb3ApID0+IHByb3AubmFtZSA9PT0gZmllbGQpPy50eXBlID09PSBcInJlbGF0aW9uXCJcbiAgICAgICAgICA/IGAke2ZpZWxkfV9pZGBcbiAgICAgICAgICA6IGZpZWxkO1xuXG4gICAgICBsZXQgcXVlcnkgPSBzb3VyY2VEQihlbnRpdHkudGFibGUpO1xuICAgICAgaWYgKHNlYXJjaFR5cGUgPT09IFwiZXF1YWxzXCIpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VhcmNoVHlwZSA9PT0gXCJsaWtlXCIpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIFwibGlrZVwiLCBgJSR7dmFsdWV9JWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnk7XG4gICAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjb3JkcyBmb3VuZFwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCBpbml0aWFsUmVjb3Jkc0xlbmd0aCA9IGZpeHR1cmVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV3UmVjb3JkcyA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIHJvdywge1xuICAgICAgICAgIF9kYjogc291cmNlREIsXG4gICAgICAgIH0pO1xuICAgICAgICBmaXh0dXJlcy5wdXNoKC4uLm5ld1JlY29yZHMpO1xuICAgICAgICBjb25zdCBjdXJyZW50Rml4dHVyZVJlY29yZCA9IGZpeHR1cmVzLmZpbmQoKHIpID0+IHIuZml4dHVyZUlkID09PSBgJHtlbnRpdHlJZH0jJHtyb3cuaWR9YCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGaXh0dXJlUmVjb3JkKSB7XG4gICAgICAgICAgLy8g7ZiE7J6sIGZpeHR1cmXroZzrtoDthLAg7IOd7ISx65CcIGZldGNoZWRSZWNvcmRzIOyEpOyglVxuICAgICAgICAgIGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZldGNoZWRSZWNvcmRzID0gZml4dHVyZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKHIpID0+IHIuZml4dHVyZUlkICE9PSBjdXJyZW50Rml4dHVyZVJlY29yZC5maXh0dXJlSWQpXG4gICAgICAgICAgICAuc2xpY2UoaW5pdGlhbFJlY29yZHNMZW5ndGgpXG4gICAgICAgICAgICAubWFwKChyKSA9PiByLmZpeHR1cmVJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAgIC8vIOyCrOyaqeyekCDsp4DsoJUg7Lus65+8IOq4sOykgCDspJHrs7Ug7ZmV7J24IOKGkiB0YXJnZXRcbiAgICAgICAgY29uc3QgY3VzdG9tQ29sdW1ucyA9IGR1cGxpY2F0ZUNoZWNrPy5jb2x1bW5zPy5bZml4dHVyZS5lbnRpdHlJZF07XG4gICAgICAgIGlmIChjdXN0b21Db2x1bW5zICYmIGN1c3RvbUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN1c3RvbUR1cGxpY2F0ZVJvdyA9IGF3YWl0IHRoaXMuY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgICAgICAgICB0YXJnZXREQixcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIGZpeHR1cmUsXG4gICAgICAgICAgICBjdXN0b21Db2x1bW5zLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGN1c3RvbUR1cGxpY2F0ZVJvdykge1xuICAgICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCBjdXN0b21EdXBsaWNhdGVSb3csIHtcbiAgICAgICAgICAgICAgc2luZ2xlUmVjb3JkOiB0cnVlLFxuICAgICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaXh0dXJlLnRhcmdldCA9IHJlY29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmlxdWUgaW5kZXgg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIGZpeHR1cmUudW5pcXVlXG4gICAgICAgIGNvbnN0IHVuaXF1ZVJvdyA9IGF3YWl0IHRoaXMuY2hlY2tVbmlxdWVWaW9sYXRpb24odGFyZ2V0REIsIGVudGl0eSwgZml4dHVyZSk7XG4gICAgICAgIGlmICh1bmlxdWVSb3cpIHtcbiAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIHVuaXF1ZVJvdywge1xuICAgICAgICAgICAgc2luZ2xlUmVjb3JkOiB0cnVlLFxuICAgICAgICAgICAgX2RiOiB0YXJnZXREQixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaXh0dXJlLnVuaXF1ZSA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5pcXVlKGZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0YXJnZXREQi5kZXN0cm95KCk7XG4gICAgICBhd2FpdCBzb3VyY2VEQi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3c6IHtcbiAgICAgIGlkOiBudW1iZXIgfCBzdHJpbmc7XG4gICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICB9LFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBzaW5nbGVSZWNvcmQ/OiBib29sZWFuO1xuICAgICAgX2RiPzogS25leDtcbiAgICB9LFxuICApOiBQcm9taXNlPEZpeHR1cmVSZWNvcmRbXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ZWRFbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgY3JlYXRlID0gYXN5bmMgKFxuICAgICAgZW50aXR5OiBFbnRpdHksXG4gICAgICByb3c6IHtcbiAgICAgICAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgICB9LFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgZml4dHVyZUlkID0gYCR7ZW50aXR5LmlkfSMke3Jvdy5pZH1gO1xuICAgICAgaWYgKHZpc2l0ZWRFbnRpdGllcy5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aXNpdGVkRW50aXRpZXMuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IHJlY29yZDogRml4dHVyZVJlY29yZCA9IHtcbiAgICAgICAgZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICBjb2x1bW5zOiB7fSxcbiAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICBiZWxvbmdzUmVjb3JkczogW10sXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdID0ge1xuICAgICAgICAgIHByb3A6IHByb3AsXG4gICAgICAgICAgdmFsdWU6IHJvd1twcm9wLm5hbWVdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRiID0gb3B0aW9ucz8uX2RiID8/IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCB0aHJvdWdoVGFibGUgPSBwcm9wLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCBmcm9tQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdG9Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIodGhyb3VnaFRhYmxlKS53aGVyZShmcm9tQ29sdW1uLCByb3cuaWQpLnBsdWNrKHRvQ29sdW1uKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSlcbiAgICAgICAgICAgIC53aGVyZShwcm9wLmpvaW5Db2x1bW4sIHJvdy5pZClcbiAgICAgICAgICAgIC5wbHVjayhcImlkXCIpO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgIXByb3AuaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIC8vIOyXreuwqe2WpSBPbmVUb09uZTogRkvrpbwg6rCA7KeEIOq0gOugqCDsl5Tti7Dti7Drpbwg7LC+7Iq164uI64ukXG4gICAgICAgICAgLy8g7JiI7IucOiBVc2VyIE9uZVRvT25lIEVtcGxveWVlIChFbXBsb3llZeqwgCB1c2VyX2lkIEZL66W8IOqwgOynkClcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkUHJvcCA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZWxhdGVkUHJvcCAmJiBpc1JlbGF0aW9uUHJvcChyZWxhdGVkUHJvcCkpIHtcbiAgICAgICAgICAgIC8vIOq0gOugqCDsl5Tti7Dti7Dsl5DshJwgRksg7Lus65+87Jy866GcIOy/vOumrO2VqeuLiOuLpCAoaWTqsIAg7JWE64uYKVxuICAgICAgICAgICAgY29uc3QgZmtDb2x1bW4gPSBgJHtyZWxhdGVkUHJvcC5uYW1lfV9pZGA7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoZmtDb2x1bW4sIHJvdy5pZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkUm93Py5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByb3dbYCR7cHJvcC5uYW1lfV9pZGBdO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgcmVjb3JkLmJlbG9uZ3NSZWNvcmRzLnB1c2goYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiYgcmVsYXRlZElkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJlbGF0ZWRJZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGVkUm93KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZShyZWxhdGVkRW50aXR5LCByZWxhdGVkUm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShlbnRpdHksIHJvdyk7XG5cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwIChzZWxmLXJlZmVyZW5jZSDtj6ztlagpXG4gICAqIDIuIO2FjOydtOu4lOuzhCDroIjrsqjrs4TroZwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ0g67CPIHVwc2VydCDsi6TtlolcbiAgICogMy4g7Iic7IScIOq4sOuwmCB1dWlk4oaSaWQg66ek7ZWRIChVcHNlcnRCdWlsZGVy6rCAIHV1aWTrpbwgRELsl5Ag7KCA7J6l7ZWY7KeAIOyViuycvOuvgOuhnClcbiAgICpcbiAgICogVXBzZXJ0QnVpbGRlcuuKlCBzZWxmLXJlZmVyZW5jZeqwgCDsnojsnLzrqbQgYnVpbGRJbnNlcnRMZXZlbHMoKeuhnCDsnqzsoJXroKztlZjsl6xcbiAgICog65Ox66GdIOyInOyEnOyZgCDrsJjtmZgg7Iic7ISc6rCAIOuLrOudvOyniCDsiJgg7J6I7Iq164uI64ukLiDsnbTrpbwg67Cp7KeA7ZWY6riwIOychO2VtFxuICAgKiBGaXh0dXJlTWFuYWdlcuqwgCDroIjrsqjrs4TroZwg64KY64ig7IScIOyymOumrO2VmOyXrCDqsIEgdXBzZXJ0IO2YuOy2nOyXkOyEnOuKlFxuICAgKiBzZWxmLXJlZmVyZW5jZeqwgCDsl4brj4TroZ0g7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Rml4dHVyZXMoXG4gICAgZGJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICBfZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBmaXh0dXJlcyA9IHVuaXF1ZShfZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG5cbiAgICAvLyDstIjquLDtmZRcbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnNraXBwZWRGaXh0dXJlcyA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tkYk5hbWVdKTtcbiAgICBjb25zdCByZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwXG4gICAgICB0aGlzLnJlbGF0aW9uR3JhcGguYnVpbGRHcmFwaChmaXh0dXJlcyk7XG4gICAgICBjb25zdCBpbnNlcnRpb25PcmRlciA9IHRoaXMucmVsYXRpb25HcmFwaC5nZXRJbnNlcnRpb25PcmRlcigpO1xuXG4gICAgICAvLyAyLiDsiqTtgrXtlaAgZml4dHVyZSDrqLzsoIAg7LKY66asIChvdmVycmlkZSDssrTtgawpXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaGFzVGFyZ2V0ID0gISFmaXh0dXJlLnRhcmdldDtcbiAgICAgICAgY29uc3QgaGFzVW5pcXVlID0gISFmaXh0dXJlLnVuaXF1ZTtcbiAgICAgICAgY29uc3QgaGFzRHVwbGljYXRlID0gaGFzVGFyZ2V0IHx8IGhhc1VuaXF1ZTtcblxuICAgICAgICAvLyDspJHrs7XsnbQg7J6I6rOgIG92ZXJyaWRlPWZhbHNl7J24IOqyveyasDog7Iqk7YK1XG4gICAgICAgIGlmIChoYXNEdXBsaWNhdGUgJiYgIWZpeHR1cmUub3ZlcnJpZGUpIHtcbiAgICAgICAgICAvLyDquLDsobQg66CI7L2U65OcIElEIOyggOyepSAodW5pcXVlIOyasOyEoCwg7JeG7Jy866m0IHRhcmdldClcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gZml4dHVyZS51bmlxdWU/LmlkID8/IGZpeHR1cmUudGFyZ2V0Py5pZDtcbiAgICAgICAgICBhc3NlcnQoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5za2lwcGVkRml4dHVyZXMuc2V0KGZpeHR1cmVJZCwge1xuICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICBleGlzdGluZ0lkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSAoZXhpc3Rpbmc6ICMke2V4aXN0aW5nSWR9LCBvdmVycmlkZTogZmFsc2UpYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgZml4dHVyZSDqt7jro7ntmZQgKGluc2VydGlvbk9yZGVyIOyInOyEnCDquLDrsJgpXG4gICAgICBjb25zdCBmaXh0dXJlc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgRml4dHVyZVJlY29yZFtdPigpO1xuICAgICAgY29uc3QgdGFibGVPcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmUg7KCc7Jm4XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWRGaXh0dXJlcy5oYXMoZml4dHVyZUlkKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGU7XG5cbiAgICAgICAgaWYgKCFmaXh0dXJlc0J5VGFibGUuaGFzKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICBmaXh0dXJlc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgW10pO1xuICAgICAgICAgIHRhYmxlT3JkZXIucHVzaCh0YWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKT8ucHVzaChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4oKTtcblxuICAgICAgICAvLyA0LiDthYzsnbTruJTrs4Qg66CI67Ko67OEIOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaXh0dXJlcyA9IGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmdyb3VwRml4dHVyZXNCeUxldmVsKHRhYmxlRml4dHVyZXMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsZXZlbEZpeHR1cmVzIG9mIGxldmVscykge1xuICAgICAgICAgICAgLy8g7ZW064u5IOugiOuyqOydmCBmaXh0dXJl65OkIHJlZ2lzdGVyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgbGV2ZWxGaXh0dXJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUpYCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB1cHNlcnQg7Iuk7ZaJIOyghCB1dWlkIOuqqeuhnSDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5idWlsZGVyLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCB1dWlkcyA9IHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvdy51dWlkIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgIGBVcHNlcnRpbmcgJHt0YWJsZU5hbWV9IHdpdGggJHt1dWlkcy5sZW5ndGh9IHJvd3MgKGxldmVsICR7bGV2ZWxzLmluZGV4T2YobGV2ZWxGaXh0dXJlcykgKyAxfS8ke2xldmVscy5sZW5ndGh9KWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gKGF3YWl0IHRoaXMuYnVpbGRlci51cHNlcnQoXG4gICAgICAgICAgICAgIHRyeCxcbiAgICAgICAgICAgICAgdGFibGVOYW1lIGFzIGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kLFxuICAgICAgICAgICAgKSkgYXMgKG51bWJlciB8IHN0cmluZylbXTtcblxuICAgICAgICAgICAgLy8g7Iic7IScIOq4sOuwmCB1dWlkIC0+IGlkIOunpO2VkVxuICAgICAgICAgICAgLy8gc2VsZi1yZWZlcmVuY2XqsIAg7JeG7Jy866+A66GcIOuTseuhnSDsiJzshJwgPSDrsJjtmZgg7Iic7IScIOuztOyepVxuICAgICAgICAgICAgaWYgKHV1aWRzLmxlbmd0aCA+IDAgJiYgdXVpZHMubGVuZ3RoID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWFwID1cbiAgICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHRhYmxlTmFtZSkgPz8gbmV3IE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1dWlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nTWFwLnNldCh1dWlkc1tpXSwgaWRzW2ldKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgZXhpc3RpbmdNYXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1dWlkcy5sZW5ndGggIT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgIGBXYXJuaW5nOiB1dWlkIGNvdW50ICgke3V1aWRzLmxlbmd0aH0pICE9IGlkIGNvdW50ICgke2lkcy5sZW5ndGh9KSBmb3IgJHt0YWJsZU5hbWV9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIE1hbnlUb01hbnkg6rSA6rOEIOyymOumrFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKHRyeCwgZml4dHVyZXMsIGluc2VydGVkSWRzQnlUYWJsZSk7XG5cbiAgICAgICAgLy8gNi4gUG9zdGdyZVNRTCDsi5ztgIDsiqQg66as7IWLXG4gICAgICAgIC8vIEZpeHR1cmUg7IK97J6FIO2bhCDqsIEg7YWM7J2067iU7J2YIElEIOyLnO2AgOyKpOulvCDstZzrjIAgSUQg6rCS7Jy866GcIOyXheuNsOydtO2KuO2VqeuLiOuLpC5cbiAgICAgICAgLy8g7J2066CH6rKMIO2VmOyngCDslYrsnLzrqbQg64uk7J2MIElOU0VSVCDsi5wgSUTqsIAgMjAwMOuyiOuMgOuhnCDsg53shLHrkKAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlc2V0dGluZyBzZXF1ZW5jZXMuLi5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eeulvCDssL7slYTshJwgaWQg7YOA7J6FIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpLmZpbmQoXG4gICAgICAgICAgICAgIChlKSA9PiBlLnRhYmxlID09PSB0YWJsZU5hbWUgfHwgZS5pZC50b0xvd2VyQ2FzZSgpID09PSB0YWJsZU5hbWUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAgICAgICAvLyBpbnRlZ2Vy64KYIGJpZ0ludGVnZXLqsIAg7JWE64uMIOqyveyasCBzZXF1ZW5jZSByZXNldOydhCDsiqTtgrXtlanri4jri6RcbiAgICAgICAgICAgICAgaWYgKCFpZFR5cGUgfHwgKGlkVHlwZSAhPT0gXCJpbnRlZ2VyXCIgJiYgaWRUeXBlICE9PSBcImJpZ0ludGVnZXJcIikpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgICAgIGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2FjOydtOu4lOydmCDstZzrjIAgSUQg7KGw7ZqMXG4gICAgICAgICAgICBjb25zdCBtYXhJZFJlc3VsdCA9IGF3YWl0IHRyeCh0YWJsZU5hbWUpLm1heChcImlkIGFzIG1heF9pZFwiKS5maXJzdCgpO1xuICAgICAgICAgICAgY29uc3QgbWF4SWQgPSBtYXhJZFJlc3VsdD8ubWF4X2lkO1xuXG4gICAgICAgICAgICBpZiAobWF4SWQgIT09IG51bGwgJiYgbWF4SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyDsi5ztgIDsiqTrpbwg7LWc64yAIElE66GcIOyEpOyglVxuICAgICAgICAgICAgICBhd2FpdCB0cngucmF3KGBTRUxFQ1Qgc2V0dmFsKCcke3RhYmxlTmFtZX1faWRfc2VxJywgPylgLCBbbWF4SWRdKTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFJlc2V0IHNlcXVlbmNlIGZvciAke3RhYmxlTmFtZX06ICR7bWF4SWR9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgIC8vIOyLnO2AgOyKpOqwgCDsl4bripQg7YWM7J2067iUKGpvaW4gdGFibGUg65OxKeydgCDrrLTsi5xcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfWApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3LiDqsrDqs7wg7IiY7KeRXG4gICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmXripQg6riw7KG0IOugiOy9lOuTnCDsoJXrs7TroZwg6rKw6rO8IOy2lOqwgFxuICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBza2lwcGVkLmV4aXN0aW5nSWQpLmZpcnN0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IHV1aWRUb0lkPy5nZXQocmVmLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBpbnNlcnRlZElkKS5maXJzdCgpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWUocmVzdWx0cywgKHIpID0+IGAke3IuZW50aXR5SWR9IyR7ci5kYXRhLmlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeHR1cmVSZWNvcmTrpbwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ1cbiAgICogQHBhcmFtIGluc2VydGVkSWRzQnlUYWJsZSDsnbTrr7ggdXBzZXJ065CcIO2FjOydtOu4lOydmCB1dWlk4oaSaWQg66ek7ZWRICjroIjrsqjrs4Qg7LKY66asIOyLnCDsgqzsmqkpXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRml4dHVyZShcbiAgICBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkLFxuICAgIGluc2VydGVkSWRzQnlUYWJsZT86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4+LFxuICApOiBVQlJlZiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZWQgY29sdW1u7J2AIElOU0VSVOyXkOyEnCDsoJzsmbggKERC6rCAIOyekOuPmSDsg53shLEpXG4gICAgICBpZiAoXCJnZW5lcmF0ZWRcIiBpbiBwcm9wICYmIHByb3AuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZCDsspjrpqw6IE92ZXJyaWRlIOuqqOuTnOydvCDrlYzrp4wg6riw7KG0IOqwkiDsgqzsmqlcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgIGlmIChpc092ZXJyaWRlTW9kZSAmJiBleGlzdGluZ1JlY29yZCkge1xuICAgICAgICAgIC8vIE92ZXJyaWRlOiDquLDsobQg66CI7L2U65Oc7J2YIOqwkiDsgqzsmqkg4oaSIFVQREFURVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBleGlzdGluZ1JlY29yZC5jb2x1bW5zW3Byb3BOYW1lXT8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g7IOIIOugiOy9lOuTnDog7KCc7Jm4IOKGkiBJTlNFUlQgKERCL1Vwc2VydEJ1aWxkZXLqsIAg7IOd7ISxKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUocHJvcDogRW50aXR5UHJvcCwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIC8vIFVwc2VydEJ1aWxkZXIucmVnaXN0ZXLsl5DshJwgSlNPTi5zdHJpbmdpZnkg7LKY66as7ZWY66+A66GcIG9iamVjdCDqt7jrjIDroZwg7KCE64usXG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKHRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YXJnZXRUYWJsZS50YWJsZSkgPT09IGZhbHNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IChwcm9wIGFzIE1hbnlUb01hbnlSZWxhdGlvblByb3ApLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZElkIG9mIHJlbGF0ZWRJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgbGV0IHRhcmdldElkOiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRVdWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQocmVsYXRlZEVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkSWQgPSByZWxhdGVkVXVpZFRvSWQ/LmdldChyZWxhdGVkUmVmLnV1aWQpO1xuXG4gICAgICAgICAgICAgIGlmIChyZXNvbHZlZElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgUmVsYXRlZCBmaXh0dXJlICR7cmVsYXRlZEZpeHR1cmVJZH0gbm90IGZvdW5kIGluIGluc2VydGVkSWRzLCBza2lwcGluZ2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlc29sdmVkSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSm9pblRhYmxl7JeQIOyCveyehVxuICAgICAgICAgICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IHRyeChqb2luVGFibGUpXG4gICAgICAgICAgICAgIC53aGVyZSh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmxpbWl0KDEpO1xuXG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRyeChqb2luVGFibGUpLmluc2VydCh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6rCZ7J2AIO2FjOydtOu4lCDrgrQgZml4dHVyZeuTpOydhCBzZWxmLXJlZmVyZW5jZSDroIjrsqjrs4TroZwg67aE7ZWgXG4gICAqIC0gc2VsZi1yZWZlcmVuY2XqsIAg7JeG64qUIGZpeHR1cmXrk6Q6IExldmVsIDBcbiAgICogLSBMZXZlbCAw7J2EIOywuOyhsO2VmOuKlCBmaXh0dXJl65OkOiBMZXZlbCAxXG4gICAqIC0g67CY67O1XG4gICAqXG4gICAqIFVwc2VydEJ1aWxkZXLqsIAgc2VsZi1yZWZlcmVuY2XqsIAg7J6I7Jy866m0IGJ1aWxkSW5zZXJ0TGV2ZWxzKCnroZwg7J6s7KCV66Cs7ZWY7JesXG4gICAqIOuTseuhnSDsiJzshJzsmYAg67CY7ZmYIOyInOyEnOqwgCDri6zrnbzsp4gg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7J2066W8IOuwqeyngO2VmOq4sCDsnITtlbQgRml4dHVyZU1hbmFnZXLqsIAg66CI67Ko67OE66GcIOuCmOuIoOyEnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdyb3VwRml4dHVyZXNCeUxldmVsKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiBGaXh0dXJlUmVjb3JkW11bXSB7XG4gICAgaWYgKGZpeHR1cmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmVzWzBdLmVudGl0eUlkKTtcblxuICAgIC8vIHNlbGYtcmVmZXJlbmNlIHJlbGF0aW9uIHByb3Ag7LC+6riwXG4gICAgY29uc3Qgc2VsZlJlZlByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwKTogcCBpcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgfCBPbmVUb09uZVJlbGF0aW9uUHJvcCA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocCkgJiYgcC5oYXNKb2luQ29sdW1uKSkgJiZcbiAgICAgICAgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgKTtcblxuICAgIGlmIChzZWxmUmVmUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBzZWxmLXJlZmVyZW5jZSDsl4bsnYwg4oaSIOuLqOydvCDroIjrsqhcbiAgICAgIHJldHVybiBbZml4dHVyZXNdO1xuICAgIH1cblxuICAgIC8vIOugiOuyqOuzhCDrtoTtlaAgKHRvcG9sb2dpY2FsIHNvcnQpXG4gICAgY29uc3QgbGV2ZWxzOiBGaXh0dXJlUmVjb3JkW11bXSA9IFtdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQoZml4dHVyZXMubWFwKChmKSA9PiBmLmZpeHR1cmVJZCkpO1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgd2hpbGUgKHJlbWFpbmluZy5zaXplID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudExldmVsOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICAgIGlmICghcmVtYWluaW5nLmhhcyhmaXh0dXJlLmZpeHR1cmVJZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNlbGYtcmVmZXJlbmNl6rCAIOuqqOuRkCDsnbTrr7gg7LKY66as65CQ6rGw64KYIG51bGzsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNhblByb2Nlc3MgPSBzZWxmUmVmUHJvcHMuZXZlcnkoKHByb3ApID0+IHtcbiAgICAgICAgICBjb25zdCByZWZJZCA9IGZpeHR1cmUuY29sdW1uc1twcm9wLm5hbWVdPy52YWx1ZSBhcyBudW1iZXIgfCBudWxsO1xuICAgICAgICAgIGlmIChyZWZJZCA9PT0gbnVsbCB8fCByZWZJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICBjb25zdCByZWZGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVmSWR9YDtcbiAgICAgICAgICAvLyDsnbTrr7gg7LKY66as65CQ6rGw64KYLCDtmITsnqwgZml4dHVyZXPsl5Ag7Y+s7ZWo65CY7KeAIOyViuydgCDqsr3smrAgKOyZuOu2gCDssLjsobApXG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZC5oYXMocmVmRml4dHVyZUlkKSB8fCAhcmVtYWluaW5nLmhhcyhyZWZGaXh0dXJlSWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuUHJvY2Vzcykge1xuICAgICAgICAgIGN1cnJlbnRMZXZlbC5wdXNoKGZpeHR1cmUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ0lkcyA9IEFycmF5LmZyb20ocmVtYWluaW5nKS5qb2luKFwiLCBcIik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2lyY3VsYXIgc2VsZi1yZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJHtlbnRpdHkudGFibGV9LiBSZW1haW5pbmcgZml4dHVyZXM6ICR7cmVtYWluaW5nSWRzfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBjdXJyZW50TGV2ZWwpIHtcbiAgICAgICAgcmVtYWluaW5nLmRlbGV0ZShmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgIHByb2Nlc3NlZC5hZGQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgfVxuXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgIH1cblxuICAgIHJldHVybiBsZXZlbHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVW5pcXVlVmlvbGF0aW9uKGRiOiBLbmV4LCBlbnRpdHk6IEVudGl0eSwgZml4dHVyZTogRml4dHVyZVJlY29yZCkge1xuICAgIGNvbnN0IF91bmlxdWVJbmRleGVzID0gZW50aXR5LmluZGV4ZXM/LmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBcInVuaXF1ZVwiKSA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSBfdW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOyduCDqsr3smrAgX2lkIOu2meydtOq4sFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCBkYkNvbHVtbiA9IHByb3AgJiYgaXNSZWxhdGlvblByb3AocHJvcCkgPyBgJHtjb2x1bW59X2lkYCA6IGNvbHVtbjtcbiAgICAgIGNvbnN0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW2NvbHVtbl0/LnZhbHVlO1xuXG4gICAgICAvLyBudWxsIOqwkuydtCDtj6ztlajrkJwg6rK97JqwIOykkeuztSDtmZXsnbgg7Iqk7YK1XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2hlcmVDbGF1c2VbZGJDb2x1bW5dID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IGRiKGVudGl0eS50YWJsZSkud2hlcmUod2hlcmVDbGF1c2UpLmxpbWl0KDEpO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpeHR1cmVMb2FkZXIoY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL3Rlc3RpbmcvZml4dHVyZS50c2A7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgZml4dHVyZUxvYWRlclN0YXJ0ID0gY29udGVudC5pbmRleE9mKFwiY29uc3QgZml4dHVyZUxvYWRlciA9IHtcIik7XG4gICAgY29uc3QgZml4dHVyZUxvYWRlckVuZCA9IGNvbnRlbnQuaW5kZXhPZihcIn07XCIsIGZpeHR1cmVMb2FkZXJTdGFydCk7XG5cbiAgICBpZiAoZml4dHVyZUxvYWRlclN0YXJ0ICE9PSAtMSAmJiBmaXh0dXJlTG9hZGVyRW5kICE9PSAtMSkge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2NvbnRlbnQuc2xpY2UoMCwgZml4dHVyZUxvYWRlckVuZCl9ICAke2NvZGV9XFxuJHtjb250ZW50LnNsaWNlKGZpeHR1cmVMb2FkZXJFbmQpfWA7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgbmV3Q29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIGZpeHR1cmVMb2FkZXIgaW4gZml4dHVyZS50c1wiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZpeHR1cmVNYW5hZ2VyID0gbmV3IEZpeHR1cmVNYW5hZ2VyQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJjaGFsayIsImV4ZWNTeW5jIiwicmVhZEZpbGVTeW5jIiwid3JpdGVGaWxlU3luYyIsImluZmxlY3Rpb24iLCJ1bmlxdWUiLCJpbnNwZWN0IiwiU29uYW11IiwiQmFzZU1vZGVsIiwiY3JlYXRlS25leEluc3RhbmNlIiwiVXBzZXJ0QnVpbGRlciIsIkVudGl0eU1hbmFnZXIiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVmlydHVhbFByb3AiLCJSZWxhdGlvbkdyYXBoIiwiRml4dHVyZU1hbmFnZXJDbGFzcyIsIl90ZGIiLCJ0ZGIiLCJFcnJvciIsIl9mZGIiLCJmZGIiLCJjYWNoZWRUYWJsZU5hbWVzIiwicmVsYXRpb25HcmFwaCIsImJ1aWxkZXIiLCJmaXh0dXJlUmVmTWFwIiwiTWFwIiwic2tpcHBlZEZpeHR1cmVzIiwiaW5pdCIsImRiQ29uZmlnIiwidGVzdCIsInByb2R1Y3Rpb25fbWFzdGVyIiwidENvbm4iLCJjb25uZWN0aW9uIiwicENvbm4iLCJob3N0IiwicG9ydCIsImRhdGFiYXNlIiwiZml4dHVyZSIsInN5bmMiLCJmaXh0dXJlQ29ubiIsInRlc3RDb25uIiwidGVzdFBnRW52IiwiUEdQQVNTV09SRCIsInBhc3N3b3JkIiwidXNlciIsInN0ZGlvIiwiZW52IiwicHJvY2VzcyIsImZpeHR1cmVQZ0VudiIsImR1bXBDbWQiLCJyZXN0b3JlQ21kIiwic2hlbGwiLCJyZXNldFNlcXVlbmNlcyIsInRlc3REYiIsImVudGl0aWVzIiwiZ2V0QWxsRW50aXRpZXMiLCJlbnRpdHkiLCJ0YWJsZU5hbWUiLCJ0YWJsZSIsImlkIiwidG9Mb3dlckNhc2UiLCJpZFByb3AiLCJwcm9wcyIsImZpbmQiLCJwIiwibmFtZSIsImlkVHlwZSIsInR5cGUiLCJjb25zb2xlIiwibG9nIiwicmF3IiwiZGVzdHJveSIsInZpc2l0ZWRSZWNvcmRzIiwiU2V0IiwiaW1wb3J0Rml4dHVyZSIsImVudGl0eUlkIiwiaWRzIiwiY2xlYXIiLCJxdWVyaWVzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImdldEltcG9ydFF1ZXJpZXMiLCJmbGF0Iiwid2RiIiwiZ2V0REIiLCJxdWVyeSIsImZpZWxkIiwicmVjb3JkS2V5IiwiaGFzIiwiYWRkIiwiZ2V0Iiwicm93Iiwid2hlcmUiLCJsaW1pdCIsInVuZGVmaW5lZCIsImZpeHR1cmVEYXRhYmFzZSIsInJlYWxEYXRhYmFzZSIsInNlbGZRdWVyeSIsImFyZ3MiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVsYXRpb25zIiwiZmlsdGVyIiwicmVsYXRpb24iLCJjdXN0b21Kb2luQ2xhdXNlIiwiaGFzSm9pbkNvbHVtbiIsInJlbGF0ZWRFbnRpdHkiLCJ3aXRoIiwicmVsYXRlZElkQ29sdW1uTmFtZSIsImFyZyIsInJlbFF1ZXJpZXMiLCJyZXZlcnNlIiwiZ2V0Rml4dHVyZXMiLCJzb3VyY2VEQk5hbWUiLCJ0YXJnZXREQk5hbWUiLCJzZWFyY2hPcHRpb25zIiwiZHVwbGljYXRlQ2hlY2siLCJzb3VyY2VEQiIsInRhcmdldERCIiwidmFsdWUiLCJzZWFyY2hUeXBlIiwiY29sdW1uIiwicHJvcCIsInJvd3MiLCJsZW5ndGgiLCJmaXh0dXJlcyIsImluaXRpYWxSZWNvcmRzTGVuZ3RoIiwibmV3UmVjb3JkcyIsImNyZWF0ZUZpeHR1cmVSZWNvcmQiLCJfZGIiLCJwdXNoIiwiY3VycmVudEZpeHR1cmVSZWNvcmQiLCJyIiwiZml4dHVyZUlkIiwiZmV0Y2hlZFJlY29yZHMiLCJzbGljZSIsImN1c3RvbUNvbHVtbnMiLCJjb2x1bW5zIiwiY3VzdG9tRHVwbGljYXRlUm93IiwiY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMiLCJyZWNvcmQiLCJzaW5nbGVSZWNvcmQiLCJ0YXJnZXQiLCJ1bmlxdWVSb3ciLCJjaGVja1VuaXF1ZVZpb2xhdGlvbiIsImYiLCJvcHRpb25zIiwicmVjb3JkcyIsInZpc2l0ZWRFbnRpdGllcyIsImNyZWF0ZSIsImJlbG9uZ3NSZWNvcmRzIiwiZGIiLCJ0aHJvdWdoVGFibGUiLCJqb2luVGFibGUiLCJmcm9tQ29sdW1uIiwic2luZ3VsYXJpemUiLCJ0b0NvbHVtbiIsInJlbGF0ZWRJZHMiLCJwbHVjayIsImpvaW5Db2x1bW4iLCJyZWxhdGVkUHJvcCIsImZrQ29sdW1uIiwicmVsYXRlZFJvdyIsImZpcnN0IiwicmVsYXRlZElkIiwiaW5zZXJ0Rml4dHVyZXMiLCJkYk5hbWUiLCJfZml4dHVyZXMiLCJyZXN1bHRzIiwiYnVpbGRHcmFwaCIsImluc2VydGlvbk9yZGVyIiwiZ2V0SW5zZXJ0aW9uT3JkZXIiLCJoYXNUYXJnZXQiLCJoYXNVbmlxdWUiLCJoYXNEdXBsaWNhdGUiLCJvdmVycmlkZSIsImV4aXN0aW5nSWQiLCJzZXQiLCJ5ZWxsb3ciLCJmaXh0dXJlc0J5VGFibGUiLCJ0YWJsZU9yZGVyIiwidHJhbnNhY3Rpb24iLCJ0cngiLCJpbnNlcnRlZElkc0J5VGFibGUiLCJ0YWJsZUZpeHR1cmVzIiwibGV2ZWxzIiwiZ3JvdXBGaXh0dXJlc0J5TGV2ZWwiLCJsZXZlbEZpeHR1cmVzIiwicmVnaXN0ZXJGaXh0dXJlIiwiYmx1ZSIsImdldFRhYmxlIiwidXVpZHMiLCJ1dWlkIiwiaW5kZXhPZiIsInVwc2VydCIsImV4aXN0aW5nTWFwIiwiaSIsIndhcm4iLCJwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyIsImUiLCJncmF5IiwibWF4SWRSZXN1bHQiLCJtYXgiLCJtYXhJZCIsIm1heF9pZCIsImdyZWVuIiwiX2VyciIsInNraXBwZWQiLCJkYXRhIiwicmVmIiwidXVpZFRvSWQiLCJpbnNlcnRlZElkIiwiZXhpc3RpbmdSZWNvcmQiLCJpc092ZXJyaWRlTW9kZSIsInByb3BOYW1lIiwiZ2VuZXJhdGVkIiwicmVsYXRlZEZpeHR1cmVJZCIsInNraXBwZWRFeGlzdGluZ0lkIiwicmVsYXRlZFJlZiIsInJlbGF0ZWRJbnNlcnRlZElkcyIsImFjdHVhbElkIiwiY29udmVydENvbHVtblZhbHVlIiwicmVnaXN0ZXIiLCJEYXRlIiwic291cmNlUmVmIiwic291cmNlVXVpZFRvSWQiLCJzb3VyY2VJZCIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldFRhYmxlIiwiaGFzVGFibGUiLCJzb3VyY2VDb2x1bW4iLCJ0YXJnZXRDb2x1bW4iLCJ0YXJnZXRJZCIsInJlbGF0ZWRVdWlkVG9JZCIsInJlc29sdmVkSWQiLCJmb3VuZCIsImluc2VydCIsInNlbGZSZWZQcm9wcyIsInJlbWFpbmluZyIsInByb2Nlc3NlZCIsInNpemUiLCJjdXJyZW50TGV2ZWwiLCJjYW5Qcm9jZXNzIiwiZXZlcnkiLCJyZWZJZCIsInJlZkZpeHR1cmVJZCIsInJlbWFpbmluZ0lkcyIsImZyb20iLCJqb2luIiwiZGVsZXRlIiwiX3VuaXF1ZUluZGV4ZXMiLCJpbmRleGVzIiwidW5pcXVlSW5kZXhlcyIsImluZGV4Iiwic3RhcnRzV2l0aCIsInVuaXF1ZVF1ZXJ5IiwiaGFzQ29uZGl0aW9uIiwiY29udGFpbnNOdWxsIiwic29tZSIsInJlcGxhY2UiLCJvcldoZXJlIiwicWIiLCJ3aGVyZUluIiwiYW5kV2hlcmUiLCJ1bmlxdWVGb3VuZCIsIndoZXJlQ2xhdXNlIiwiZGJDb2x1bW4iLCJhZGRGaXh0dXJlTG9hZGVyIiwiY29kZSIsInBhdGgiLCJhcGlSb290UGF0aCIsImNvbnRlbnQiLCJ0b1N0cmluZyIsImZpeHR1cmVMb2FkZXJTdGFydCIsImZpeHR1cmVMb2FkZXJFbmQiLCJuZXdDb250ZW50IiwiRml4dHVyZU1hbmFnZXIiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsUUFBUSxRQUFRLGdCQUFnQjtBQUN6QyxTQUFTQyxZQUFZLEVBQUVD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
@@ -1,5 +1,8 @@
1
1
  export * from "./bootstrap";
2
+ export * from "./data-explorer";
3
+ export * from "./fixture-generator";
2
4
  export * from "./fixture-loader";
5
+ export * from "./fixture-manager";
3
6
  export * from "./global-setup";
4
7
  export * from "./naite-vitest-reporter";
5
8
  export * from "./parallel-db-manager";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC"}
@@ -1,8 +1,11 @@
1
1
  export * from "./bootstrap.js";
2
+ export * from "./data-explorer.js";
3
+ export * from "./fixture-generator.js";
2
4
  export * from "./fixture-loader.js";
5
+ export * from "./fixture-manager.js";
3
6
  export * from "./global-setup.js";
4
7
  export * from "./naite-vitest-reporter.js";
5
8
  export * from "./parallel-db-manager.js";
6
9
  export * from "./vitest-helpers.js";
7
10
 
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2Jvb3RzdHJhcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZml4dHVyZS1sb2FkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dsb2JhbC1zZXR1cFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFpdGUtdml0ZXN0LXJlcG9ydGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wYXJhbGxlbC1kYi1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92aXRlc3QtaGVscGVyc1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWM7QUFDNUIsY0FBYyxzQkFBbUI7QUFDakMsY0FBYyxvQkFBaUI7QUFDL0IsY0FBYyw2QkFBMEI7QUFDeEMsY0FBYywyQkFBd0I7QUFDdEMsY0FBYyxzQkFBbUIifQ==
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2Jvb3RzdHJhcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZml4dHVyZS1nZW5lcmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpeHR1cmUtbG9hZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maXh0dXJlLW1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dsb2JhbC1zZXR1cFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFpdGUtdml0ZXN0LXJlcG9ydGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wYXJhbGxlbC1kYi1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92aXRlc3QtaGVscGVyc1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWM7QUFDNUIsY0FBYyxxQkFBa0I7QUFDaEMsY0FBYyx5QkFBc0I7QUFDcEMsY0FBYyxzQkFBbUI7QUFDakMsY0FBYyx1QkFBb0I7QUFDbEMsY0FBYyxvQkFBaUI7QUFDL0IsY0FBYyw2QkFBMEI7QUFDeEMsY0FBYywyQkFBd0I7QUFDdEMsY0FBYyxzQkFBbUIifQ==