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
@@ -0,0 +1,286 @@
1
+ /**
2
+ * LLM을 사용하여 Entity의 cone 메타데이터를 생성합니다.
3
+ *
4
+ * @param context - Entity 정보와 생성 옵션
5
+ * @returns 생성된 cone 메타데이터
6
+ */ export async function generateCones(context) {
7
+ const apiKey = getApiKey();
8
+ const prompt = buildPrompt(context);
9
+ const { text: responseText, tokensUsed } = await callAnthropicAPI(prompt, apiKey);
10
+ const result = parseConeResponse(responseText);
11
+ result.tokensUsed = tokensUsed;
12
+ if (context.existingCones) {
13
+ if (context.onlyEmpty) {
14
+ return mergeOnlyEmpty(result, context.existingCones);
15
+ }
16
+ return mergeWithExisting(result, context.existingCones);
17
+ }
18
+ return result;
19
+ }
20
+ /**
21
+ * API 키를 가져옵니다.
22
+ *
23
+ * Sonamu.secret 또는 환경변수에서 가져옵니다.
24
+ */ function getApiKey() {
25
+ // Sonamu.secret은 런타임에 로드되므로 동적으로 import
26
+ let apiKey;
27
+ try {
28
+ // Sonamu가 초기화되어 있는 경우
29
+ const { Sonamu } = require("../api");
30
+ apiKey = Sonamu.secret?.anthropic_api_key;
31
+ } catch {
32
+ // Sonamu가 초기화되지 않은 경우 (테스트 등)
33
+ apiKey = undefined;
34
+ }
35
+ if (!apiKey) {
36
+ apiKey = process.env.ANTHROPIC_API_KEY;
37
+ }
38
+ if (!apiKey) {
39
+ throw new Error("ANTHROPIC_API_KEY not found. " + "Set ANTHROPIC_API_KEY environment variable or add it to sonamu.secret.ts");
40
+ }
41
+ return apiKey;
42
+ }
43
+ /**
44
+ * LLM 프롬프트를 생성합니다.
45
+ *
46
+ * ai-client.ts 패턴을 참고하여 명확한 지시사항과 출력 형식을 제공합니다.
47
+ */ function buildPrompt(context) {
48
+ const locale = context.locale || "ko";
49
+ const localeDesc = {
50
+ ko: "Korean",
51
+ en: "English",
52
+ ja: "Japanese"
53
+ }[locale];
54
+ return `You are a Sonamu framework expert. Generate cone metadata for database entity fixture generation.
55
+
56
+ ENTITY STRUCTURE:
57
+ ${JSON.stringify(context.entity, null, 2)}
58
+
59
+ LOCALE: ${locale} (${localeDesc})
60
+
61
+ INSTRUCTIONS:
62
+ 1. Entity cone metadata:
63
+ - desc: Short description of what this entity represents
64
+ - note: Explain the entity's purpose, relationships, and business context
65
+ - tags: Relevant categorization tags
66
+ - fixtureHint: Overall guidance for generating test data for this entity
67
+
68
+ 2. For each prop, generate appropriate cone metadata:
69
+ - desc: Short description in ${localeDesc}
70
+ - note: Additional notes if needed
71
+ - fixtureHint: Detailed guidance for realistic test data generation
72
+ - fixtureGenerator: faker.js expression when applicable
73
+
74
+ 3. Field type → faker.js mapping:
75
+ - email → faker.internet.email()
76
+ - phone → faker.phone.number()
77
+ - name/username → faker.person.fullName() (with locale)
78
+ - birth_date → faker.date.birthdate({ min: 18, max: 65, mode: 'age' })
79
+ - salary → faker.number.int({ min: 30_000_000, max: 150_000_000 }) for ko locale
80
+ - company_name → faker.company.name()
81
+ - address → faker.location.streetAddress()
82
+
83
+ 4. Relation fields (BelongsToOne, OneToOne with hasJoinColumn):
84
+ - Always add dataSource: { strategy: "recent", config: { limit: 3-5 } }
85
+ - fixtureHint: Explain that it references existing data
86
+
87
+ 5. Subsets cone metadata (IMPORTANT - generate for ALL subsets):
88
+ - desc: Describe what this subset represents and what fields it includes
89
+ - note: Explain the use case and when to use this subset
90
+
91
+ 6. Enums cone metadata (IMPORTANT - generate for ALL enums):
92
+ - desc: Describe what this enum represents
93
+ - fixtureHint: If any prop uses this enum type, copy that prop's fixtureHint here
94
+ Example: If prop "status" (type: enum, enum: "UserStatus") has fixtureHint "User status: active, inactive, suspended",
95
+ then UserStatus enum's fixtureHint should be the same
96
+ - For each enum value, provide desc explaining what that specific value means
97
+
98
+ 7. Korean field names (locale=ko):
99
+ - Infer meaning and generate appropriate faker
100
+ - "이름" → faker.person.fullName()
101
+ - "생년월일" → faker.date.birthdate()
102
+ - "주소" → faker.location.streetAddress()
103
+
104
+ 8. Locale-specific values:
105
+ - ko: Korean names, addresses, phone numbers (010-XXXX-XXXX format)
106
+ - en: English names, US addresses
107
+ - ja: Japanese names, addresses
108
+
109
+ ${context.existingCones ? `
110
+ EXISTING CONES (preserve these if present):
111
+ ${JSON.stringify(context.existingCones, null, 2)}
112
+ ` : ""}
113
+
114
+ OUTPUT FORMAT:
115
+ Return ONLY valid JSON (no markdown, no code blocks). Use this exact structure:
116
+ {
117
+ "entityCone": {
118
+ "desc": "${localeDesc} description of the entity",
119
+ "note": "Optional detailed notes about the entity's purpose and relationships",
120
+ "tags": ["optional", "tags"],
121
+ "fixtureHint": "Guidance for generating fixtures of this entity (what to consider, relationships, constraints)"
122
+ },
123
+ "propCones": {
124
+ "prop_name": {
125
+ "desc": "${localeDesc} description",
126
+ "note": "Optional additional notes about this field",
127
+ "fixtureHint": "Detailed generation guidance for this specific field",
128
+ "fixtureGenerator": "faker.xxx.yyy()",
129
+ "dataSource": { "strategy": "recent", "config": { "limit": 5 } } // Only for relation fields
130
+ }
131
+ },
132
+ "subsetCones": {
133
+ "A": {
134
+ "desc": "${localeDesc} description of subset A",
135
+ "note": "What fields are included in this subset",
136
+ "fixtureHint": "Optional guidance if this subset affects fixture generation"
137
+ }
138
+ },
139
+ "enumCones": {
140
+ "EnumName": {
141
+ "desc": "${localeDesc} description of the enum",
142
+ "fixtureHint": "Optional guidance for generating enum values in fixtures",
143
+ "values": {
144
+ "VALUE_KEY": {
145
+ "desc": "${localeDesc} description of this enum value"
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+
152
+ IMPORTANT: Return pure JSON only. Do NOT wrap in markdown code blocks.`;
153
+ }
154
+ /**
155
+ * Anthropic API를 호출하여 LLM 응답을 받습니다.
156
+ *
157
+ * @param prompt - 생성할 프롬프트
158
+ * @param apiKey - Anthropic API 키
159
+ * @returns LLM 응답 텍스트 및 토큰 사용량
160
+ */ async function callAnthropicAPI(prompt, apiKey) {
161
+ try {
162
+ // @ai-sdk/anthropic과 ai 패키지는 optional dependency이므로 동적 import
163
+ const { createAnthropic } = await import("@ai-sdk/anthropic");
164
+ const { generateText } = await import("ai");
165
+ const anthropic = createAnthropic({
166
+ apiKey
167
+ });
168
+ const { text, usage } = await generateText({
169
+ model: anthropic("claude-sonnet-4-5"),
170
+ prompt
171
+ });
172
+ const tokensUsed = usage?.totalTokens || 0;
173
+ if (usage) {
174
+ console.log(`[Cone Generator] Tokens used: ${tokensUsed}`);
175
+ }
176
+ return {
177
+ text,
178
+ tokensUsed
179
+ };
180
+ } catch (error) {
181
+ if (error && typeof error === "object" && "statusCode" in error) {
182
+ const statusCode = error.statusCode;
183
+ if (statusCode === 429) {
184
+ throw new Error("Rate limit exceeded. Please try again later.");
185
+ }
186
+ }
187
+ const message = error instanceof Error ? error.message : "Unknown error";
188
+ throw new Error(`LLM API failed: ${message}`);
189
+ }
190
+ }
191
+ /**
192
+ * LLM 응답을 파싱하여 ConeGenerationResult로 변환합니다.
193
+ *
194
+ * Markdown 코드 블록이 포함되어 있으면 제거합니다.
195
+ */ function parseConeResponse(text) {
196
+ let jsonText = text.trim();
197
+ jsonText = jsonText.replace(/^```json\s*/i, "");
198
+ jsonText = jsonText.replace(/```\s*$/, "");
199
+ jsonText = jsonText.trim();
200
+ try {
201
+ const parsed = JSON.parse(jsonText);
202
+ if (!parsed.propCones || typeof parsed.propCones !== "object") {
203
+ throw new Error("Invalid response: propCones is required and must be an object");
204
+ }
205
+ return {
206
+ entityCone: parsed.entityCone,
207
+ propCones: parsed.propCones,
208
+ subsetCones: parsed.subsetCones || {},
209
+ enumCones: parsed.enumCones || {},
210
+ tokensUsed: 0
211
+ };
212
+ } catch (error) {
213
+ const message = error instanceof Error ? error.message : "Unknown error";
214
+ throw new Error(`Failed to parse LLM response: ${message}\n\n` + `Original response:\n${text}\n\n` + `Cleaned JSON:\n${jsonText}`);
215
+ }
216
+ }
217
+ /**
218
+ * 생성된 cone을 기존 cone과 병합합니다.
219
+ *
220
+ * 기존 cone이 있으면 보존하고, 없는 경우에만 생성된 cone을 사용합니다.
221
+ */ function mergeWithExisting(generated, existing) {
222
+ const result = {
223
+ ...generated
224
+ };
225
+ const entityKey = `entity:${generated.entityCone ? "present" : "missing"}`;
226
+ if (existing[entityKey]) {
227
+ result.entityCone = existing[entityKey];
228
+ }
229
+ for (const propName of Object.keys(generated.propCones)){
230
+ const key = `prop:${propName}`;
231
+ if (existing[key]) {
232
+ result.propCones[propName] = existing[key];
233
+ }
234
+ }
235
+ for (const enumId of Object.keys(generated.enumCones)){
236
+ const key = `enum:${enumId}`;
237
+ if (existing[key]) {
238
+ result.enumCones[enumId] = existing[key];
239
+ }
240
+ }
241
+ for (const subsetKey of Object.keys(generated.subsetCones)){
242
+ const key = `subset:${subsetKey}`;
243
+ if (existing[key]) {
244
+ result.subsetCones[subsetKey] = existing[key];
245
+ }
246
+ }
247
+ return result;
248
+ }
249
+ /**
250
+ * fixtureHint가 없는 cone만 생성하고 나머지는 보존합니다.
251
+ *
252
+ * 기존 cone에 fixtureHint가 있으면 보존하고, 없으면 새로 생성된 cone을 사용합니다.
253
+ */ function mergeOnlyEmpty(generated, existing) {
254
+ const result = {
255
+ ...generated
256
+ };
257
+ // Entity cone: fixtureHint가 있으면 보존
258
+ const entityKey = `entity:${generated.entityCone ? "present" : "missing"}`;
259
+ if (existing[entityKey]?.fixtureHint) {
260
+ result.entityCone = existing[entityKey];
261
+ }
262
+ // Prop cones: fixtureHint가 있으면 보존
263
+ for (const propName of Object.keys(generated.propCones)){
264
+ const key = `prop:${propName}`;
265
+ if (existing[key]?.fixtureHint) {
266
+ result.propCones[propName] = existing[key];
267
+ }
268
+ }
269
+ // Enum cones: fixtureHint가 있으면 보존 (enum은 보통 fixtureHint가 없지만 일관성을 위해)
270
+ for (const enumId of Object.keys(generated.enumCones)){
271
+ const key = `enum:${enumId}`;
272
+ if (existing[key]?.fixtureHint) {
273
+ result.enumCones[enumId] = existing[key];
274
+ }
275
+ }
276
+ // Subset cones: fixtureHint가 있으면 보존 (subset도 보통 fixtureHint가 없지만 일관성을 위해)
277
+ for (const subsetKey of Object.keys(generated.subsetCones)){
278
+ const key = `subset:${subsetKey}`;
279
+ if (existing[key]?.fixtureHint) {
280
+ result.subsetCones[subsetKey] = existing[key];
281
+ }
282
+ }
283
+ return result;
284
+ }
285
+
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25lL2NvbmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uZSwgRW50aXR5SnNvbiB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vKipcbiAqIENvbmUg7IOd7ISxIOy7qO2FjeyKpO2KuFxuICpcbiAqIEVudGl0eSDsoJXrs7TsmYAg7IOd7ISxIOyYteyFmOydhCDri7Tqs6Ag7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgdHlwZSBDb25lR2VuZXJhdGlvbkNvbnRleHQgPSB7XG4gIGVudGl0eTogRW50aXR5SnNvbjtcbiAgbG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuICBleGlzdGluZ0NvbmVzPzogUmVjb3JkPHN0cmluZywgQ29uZT47XG4gIC8qKiB0cnVl7J24IOqyveyasCBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKi9cbiAgb25seUVtcHR5PzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQ29uZSDsg53shLEg6rKw6rO8XG4gKlxuICogRW50aXR5LCBQcm9wcywgU3Vic2V0cywgRW51bXPsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg64u06rOgIOyeiOyKteuLiOuLpC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29uZUdlbmVyYXRpb25SZXN1bHQgPSB7XG4gIGVudGl0eUNvbmU/OiBDb25lO1xuICBwcm9wQ29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+O1xuICBzdWJzZXRDb25lczogUmVjb3JkPHN0cmluZywgQ29uZT47XG4gIGVudW1Db25lczogUmVjb3JkPHN0cmluZywgQ29uZT47XG4gIHRva2Vuc1VzZWQ6IG51bWJlcjtcbn07XG5cbi8qKlxuICogTExN7J2EIOyCrOyaqe2VmOyXrCBFbnRpdHnsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gRW50aXR5IOygleuztOyZgCDsg53shLEg7Ji17IWYXG4gKiBAcmV0dXJucyDsg53shLHrkJwgY29uZSDrqZTtg4DrjbDsnbTthLBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ29uZXMoY29udGV4dDogQ29uZUdlbmVyYXRpb25Db250ZXh0KTogUHJvbWlzZTxDb25lR2VuZXJhdGlvblJlc3VsdD4ge1xuICBjb25zdCBhcGlLZXkgPSBnZXRBcGlLZXkoKTtcbiAgY29uc3QgcHJvbXB0ID0gYnVpbGRQcm9tcHQoY29udGV4dCk7XG4gIGNvbnN0IHsgdGV4dDogcmVzcG9uc2VUZXh0LCB0b2tlbnNVc2VkIH0gPSBhd2FpdCBjYWxsQW50aHJvcGljQVBJKHByb21wdCwgYXBpS2V5KTtcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VDb25lUmVzcG9uc2UocmVzcG9uc2VUZXh0KTtcbiAgcmVzdWx0LnRva2Vuc1VzZWQgPSB0b2tlbnNVc2VkO1xuXG4gIGlmIChjb250ZXh0LmV4aXN0aW5nQ29uZXMpIHtcbiAgICBpZiAoY29udGV4dC5vbmx5RW1wdHkpIHtcbiAgICAgIHJldHVybiBtZXJnZU9ubHlFbXB0eShyZXN1bHQsIGNvbnRleHQuZXhpc3RpbmdDb25lcyk7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZVdpdGhFeGlzdGluZyhyZXN1bHQsIGNvbnRleHQuZXhpc3RpbmdDb25lcyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEFQSSDtgqTrpbwg6rCA7KC47Ji164uI64ukLlxuICpcbiAqIFNvbmFtdS5zZWNyZXQg65iQ64qUIO2ZmOqyveuzgOyImOyXkOyEnCDqsIDsoLjsmLXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldEFwaUtleSgpOiBzdHJpbmcge1xuICAvLyBTb25hbXUuc2VjcmV07J2AIOufsO2DgOyehOyXkCDroZzrk5zrkJjrr4DroZwg64+Z7KCB7Jy866GcIGltcG9ydFxuICBsZXQgYXBpS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb25hbXXqsIAg7LSI6riw7ZmU65CY7Ja0IOyeiOuKlCDqsr3smrBcbiAgICBjb25zdCB7IFNvbmFtdSB9ID0gcmVxdWlyZShcIi4uL2FwaVwiKTtcbiAgICBhcGlLZXkgPSBTb25hbXUuc2VjcmV0Py5hbnRocm9waWNfYXBpX2tleTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg65OxKVxuICAgIGFwaUtleSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghYXBpS2V5KSB7XG4gICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gIH1cblxuICBpZiAoIWFwaUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQU5USFJPUElDX0FQSV9LRVkgbm90IGZvdW5kLiBcIiArXG4gICAgICAgIFwiU2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGFkZCBpdCB0byBzb25hbXUuc2VjcmV0LnRzXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhcGlLZXk7XG59XG5cbi8qKlxuICogTExNIO2UhOuhrO2UhO2KuOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogYWktY2xpZW50LnRzIO2MqO2EtOydhCDssLjqs6DtlZjsl6wg66qF7ZmV7ZWcIOyngOyLnOyCrO2VreqzvCDstpzroKUg7ZiV7Iud7J2EIOygnOqzte2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQcm9tcHQoY29udGV4dDogQ29uZUdlbmVyYXRpb25Db250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgbG9jYWxlID0gY29udGV4dC5sb2NhbGUgfHwgXCJrb1wiO1xuICBjb25zdCBsb2NhbGVEZXNjID0ge1xuICAgIGtvOiBcIktvcmVhblwiLFxuICAgIGVuOiBcIkVuZ2xpc2hcIixcbiAgICBqYTogXCJKYXBhbmVzZVwiLFxuICB9W2xvY2FsZV07XG5cbiAgcmV0dXJuIGBZb3UgYXJlIGEgU29uYW11IGZyYW1ld29yayBleHBlcnQuIEdlbmVyYXRlIGNvbmUgbWV0YWRhdGEgZm9yIGRhdGFiYXNlIGVudGl0eSBmaXh0dXJlIGdlbmVyYXRpb24uXG5cbkVOVElUWSBTVFJVQ1RVUkU6XG4ke0pTT04uc3RyaW5naWZ5KGNvbnRleHQuZW50aXR5LCBudWxsLCAyKX1cblxuTE9DQUxFOiAke2xvY2FsZX0gKCR7bG9jYWxlRGVzY30pXG5cbklOU1RSVUNUSU9OUzpcbjEuIEVudGl0eSBjb25lIG1ldGFkYXRhOlxuICAgLSBkZXNjOiBTaG9ydCBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgZW50aXR5IHJlcHJlc2VudHNcbiAgIC0gbm90ZTogRXhwbGFpbiB0aGUgZW50aXR5J3MgcHVycG9zZSwgcmVsYXRpb25zaGlwcywgYW5kIGJ1c2luZXNzIGNvbnRleHRcbiAgIC0gdGFnczogUmVsZXZhbnQgY2F0ZWdvcml6YXRpb24gdGFnc1xuICAgLSBmaXh0dXJlSGludDogT3ZlcmFsbCBndWlkYW5jZSBmb3IgZ2VuZXJhdGluZyB0ZXN0IGRhdGEgZm9yIHRoaXMgZW50aXR5XG5cbjIuIEZvciBlYWNoIHByb3AsIGdlbmVyYXRlIGFwcHJvcHJpYXRlIGNvbmUgbWV0YWRhdGE6XG4gICAtIGRlc2M6IFNob3J0IGRlc2NyaXB0aW9uIGluICR7bG9jYWxlRGVzY31cbiAgIC0gbm90ZTogQWRkaXRpb25hbCBub3RlcyBpZiBuZWVkZWRcbiAgIC0gZml4dHVyZUhpbnQ6IERldGFpbGVkIGd1aWRhbmNlIGZvciByZWFsaXN0aWMgdGVzdCBkYXRhIGdlbmVyYXRpb25cbiAgIC0gZml4dHVyZUdlbmVyYXRvcjogZmFrZXIuanMgZXhwcmVzc2lvbiB3aGVuIGFwcGxpY2FibGVcblxuMy4gRmllbGQgdHlwZSDihpIgZmFrZXIuanMgbWFwcGluZzpcbiAgIC0gZW1haWwg4oaSIGZha2VyLmludGVybmV0LmVtYWlsKClcbiAgIC0gcGhvbmUg4oaSIGZha2VyLnBob25lLm51bWJlcigpXG4gICAtIG5hbWUvdXNlcm5hbWUg4oaSIGZha2VyLnBlcnNvbi5mdWxsTmFtZSgpICh3aXRoIGxvY2FsZSlcbiAgIC0gYmlydGhfZGF0ZSDihpIgZmFrZXIuZGF0ZS5iaXJ0aGRhdGUoeyBtaW46IDE4LCBtYXg6IDY1LCBtb2RlOiAnYWdlJyB9KVxuICAgLSBzYWxhcnkg4oaSIGZha2VyLm51bWJlci5pbnQoeyBtaW46IDMwXzAwMF8wMDAsIG1heDogMTUwXzAwMF8wMDAgfSkgZm9yIGtvIGxvY2FsZVxuICAgLSBjb21wYW55X25hbWUg4oaSIGZha2VyLmNvbXBhbnkubmFtZSgpXG4gICAtIGFkZHJlc3Mg4oaSIGZha2VyLmxvY2F0aW9uLnN0cmVldEFkZHJlc3MoKVxuXG40LiBSZWxhdGlvbiBmaWVsZHMgKEJlbG9uZ3NUb09uZSwgT25lVG9PbmUgd2l0aCBoYXNKb2luQ29sdW1uKTpcbiAgIC0gQWx3YXlzIGFkZCBkYXRhU291cmNlOiB7IHN0cmF0ZWd5OiBcInJlY2VudFwiLCBjb25maWc6IHsgbGltaXQ6IDMtNSB9IH1cbiAgIC0gZml4dHVyZUhpbnQ6IEV4cGxhaW4gdGhhdCBpdCByZWZlcmVuY2VzIGV4aXN0aW5nIGRhdGFcblxuNS4gU3Vic2V0cyBjb25lIG1ldGFkYXRhIChJTVBPUlRBTlQgLSBnZW5lcmF0ZSBmb3IgQUxMIHN1YnNldHMpOlxuICAgLSBkZXNjOiBEZXNjcmliZSB3aGF0IHRoaXMgc3Vic2V0IHJlcHJlc2VudHMgYW5kIHdoYXQgZmllbGRzIGl0IGluY2x1ZGVzXG4gICAtIG5vdGU6IEV4cGxhaW4gdGhlIHVzZSBjYXNlIGFuZCB3aGVuIHRvIHVzZSB0aGlzIHN1YnNldFxuXG42LiBFbnVtcyBjb25lIG1ldGFkYXRhIChJTVBPUlRBTlQgLSBnZW5lcmF0ZSBmb3IgQUxMIGVudW1zKTpcbiAgIC0gZGVzYzogRGVzY3JpYmUgd2hhdCB0aGlzIGVudW0gcmVwcmVzZW50c1xuICAgLSBmaXh0dXJlSGludDogSWYgYW55IHByb3AgdXNlcyB0aGlzIGVudW0gdHlwZSwgY29weSB0aGF0IHByb3AncyBmaXh0dXJlSGludCBoZXJlXG4gICAgIEV4YW1wbGU6IElmIHByb3AgXCJzdGF0dXNcIiAodHlwZTogZW51bSwgZW51bTogXCJVc2VyU3RhdHVzXCIpIGhhcyBmaXh0dXJlSGludCBcIlVzZXIgc3RhdHVzOiBhY3RpdmUsIGluYWN0aXZlLCBzdXNwZW5kZWRcIixcbiAgICAgICAgICAgICAgdGhlbiBVc2VyU3RhdHVzIGVudW0ncyBmaXh0dXJlSGludCBzaG91bGQgYmUgdGhlIHNhbWVcbiAgIC0gRm9yIGVhY2ggZW51bSB2YWx1ZSwgcHJvdmlkZSBkZXNjIGV4cGxhaW5pbmcgd2hhdCB0aGF0IHNwZWNpZmljIHZhbHVlIG1lYW5zXG5cbjcuIEtvcmVhbiBmaWVsZCBuYW1lcyAobG9jYWxlPWtvKTpcbiAgIC0gSW5mZXIgbWVhbmluZyBhbmQgZ2VuZXJhdGUgYXBwcm9wcmlhdGUgZmFrZXJcbiAgIC0gXCLsnbTrpoRcIiDihpIgZmFrZXIucGVyc29uLmZ1bGxOYW1lKClcbiAgIC0gXCLsg53rhYTsm5TsnbxcIiDihpIgZmFrZXIuZGF0ZS5iaXJ0aGRhdGUoKVxuICAgLSBcIuyjvOyGjFwiIOKGkiBmYWtlci5sb2NhdGlvbi5zdHJlZXRBZGRyZXNzKClcblxuOC4gTG9jYWxlLXNwZWNpZmljIHZhbHVlczpcbiAgIC0ga286IEtvcmVhbiBuYW1lcywgYWRkcmVzc2VzLCBwaG9uZSBudW1iZXJzICgwMTAtWFhYWC1YWFhYIGZvcm1hdClcbiAgIC0gZW46IEVuZ2xpc2ggbmFtZXMsIFVTIGFkZHJlc3Nlc1xuICAgLSBqYTogSmFwYW5lc2UgbmFtZXMsIGFkZHJlc3Nlc1xuXG4ke1xuICBjb250ZXh0LmV4aXN0aW5nQ29uZXNcbiAgICA/IGBcbkVYSVNUSU5HIENPTkVTIChwcmVzZXJ2ZSB0aGVzZSBpZiBwcmVzZW50KTpcbiR7SlNPTi5zdHJpbmdpZnkoY29udGV4dC5leGlzdGluZ0NvbmVzLCBudWxsLCAyKX1cbmBcbiAgICA6IFwiXCJcbn1cblxuT1VUUFVUIEZPUk1BVDpcblJldHVybiBPTkxZIHZhbGlkIEpTT04gKG5vIG1hcmtkb3duLCBubyBjb2RlIGJsb2NrcykuIFVzZSB0aGlzIGV4YWN0IHN0cnVjdHVyZTpcbntcbiAgXCJlbnRpdHlDb25lXCI6IHtcbiAgICBcImRlc2NcIjogXCIke2xvY2FsZURlc2N9IGRlc2NyaXB0aW9uIG9mIHRoZSBlbnRpdHlcIixcbiAgICBcIm5vdGVcIjogXCJPcHRpb25hbCBkZXRhaWxlZCBub3RlcyBhYm91dCB0aGUgZW50aXR5J3MgcHVycG9zZSBhbmQgcmVsYXRpb25zaGlwc1wiLFxuICAgIFwidGFnc1wiOiBbXCJvcHRpb25hbFwiLCBcInRhZ3NcIl0sXG4gICAgXCJmaXh0dXJlSGludFwiOiBcIkd1aWRhbmNlIGZvciBnZW5lcmF0aW5nIGZpeHR1cmVzIG9mIHRoaXMgZW50aXR5ICh3aGF0IHRvIGNvbnNpZGVyLCByZWxhdGlvbnNoaXBzLCBjb25zdHJhaW50cylcIlxuICB9LFxuICBcInByb3BDb25lc1wiOiB7XG4gICAgXCJwcm9wX25hbWVcIjoge1xuICAgICAgXCJkZXNjXCI6IFwiJHtsb2NhbGVEZXNjfSBkZXNjcmlwdGlvblwiLFxuICAgICAgXCJub3RlXCI6IFwiT3B0aW9uYWwgYWRkaXRpb25hbCBub3RlcyBhYm91dCB0aGlzIGZpZWxkXCIsXG4gICAgICBcImZpeHR1cmVIaW50XCI6IFwiRGV0YWlsZWQgZ2VuZXJhdGlvbiBndWlkYW5jZSBmb3IgdGhpcyBzcGVjaWZpYyBmaWVsZFwiLFxuICAgICAgXCJmaXh0dXJlR2VuZXJhdG9yXCI6IFwiZmFrZXIueHh4Lnl5eSgpXCIsXG4gICAgICBcImRhdGFTb3VyY2VcIjogeyBcInN0cmF0ZWd5XCI6IFwicmVjZW50XCIsIFwiY29uZmlnXCI6IHsgXCJsaW1pdFwiOiA1IH0gfSAgLy8gT25seSBmb3IgcmVsYXRpb24gZmllbGRzXG4gICAgfVxuICB9LFxuICBcInN1YnNldENvbmVzXCI6IHtcbiAgICBcIkFcIjoge1xuICAgICAgXCJkZXNjXCI6IFwiJHtsb2NhbGVEZXNjfSBkZXNjcmlwdGlvbiBvZiBzdWJzZXQgQVwiLFxuICAgICAgXCJub3RlXCI6IFwiV2hhdCBmaWVsZHMgYXJlIGluY2x1ZGVkIGluIHRoaXMgc3Vic2V0XCIsXG4gICAgICBcImZpeHR1cmVIaW50XCI6IFwiT3B0aW9uYWwgZ3VpZGFuY2UgaWYgdGhpcyBzdWJzZXQgYWZmZWN0cyBmaXh0dXJlIGdlbmVyYXRpb25cIlxuICAgIH1cbiAgfSxcbiAgXCJlbnVtQ29uZXNcIjoge1xuICAgIFwiRW51bU5hbWVcIjoge1xuICAgICAgXCJkZXNjXCI6IFwiJHtsb2NhbGVEZXNjfSBkZXNjcmlwdGlvbiBvZiB0aGUgZW51bVwiLFxuICAgICAgXCJmaXh0dXJlSGludFwiOiBcIk9wdGlvbmFsIGd1aWRhbmNlIGZvciBnZW5lcmF0aW5nIGVudW0gdmFsdWVzIGluIGZpeHR1cmVzXCIsXG4gICAgICBcInZhbHVlc1wiOiB7XG4gICAgICAgIFwiVkFMVUVfS0VZXCI6IHtcbiAgICAgICAgICBcImRlc2NcIjogXCIke2xvY2FsZURlc2N9IGRlc2NyaXB0aW9uIG9mIHRoaXMgZW51bSB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuSU1QT1JUQU5UOiBSZXR1cm4gcHVyZSBKU09OIG9ubHkuIERvIE5PVCB3cmFwIGluIG1hcmtkb3duIGNvZGUgYmxvY2tzLmA7XG59XG5cbi8qKlxuICogQW50aHJvcGljIEFQSeulvCDtmLjstpztlZjsl6wgTExNIOydkeuLteydhCDrsJvsirXri4jri6QuXG4gKlxuICogQHBhcmFtIHByb21wdCAtIOyDneyEse2VoCDtlITroaztlITtirhcbiAqIEBwYXJhbSBhcGlLZXkgLSBBbnRocm9waWMgQVBJIO2CpFxuICogQHJldHVybnMgTExNIOydkeuLtSDthY3siqTtirgg67CPIO2GoO2BsCDsgqzsmqnrn4lcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsbEFudGhyb3BpY0FQSShcbiAgcHJvbXB0OiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHRleHQ6IHN0cmluZzsgdG9rZW5zVXNlZDogbnVtYmVyIH0+IHtcbiAgdHJ5IHtcbiAgICAvLyBAYWktc2RrL2FudGhyb3BpY+qzvCBhaSDtjKjtgqTsp4DripQgb3B0aW9uYWwgZGVwZW5kZW5jeeydtOuvgOuhnCDrj5nsoIEgaW1wb3J0XG4gICAgY29uc3QgeyBjcmVhdGVBbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZXh0IH0gPSBhd2FpdCBpbXBvcnQoXCJhaVwiKTtcblxuICAgIGNvbnN0IGFudGhyb3BpYyA9IGNyZWF0ZUFudGhyb3BpYyh7XG4gICAgICBhcGlLZXksXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHRleHQsIHVzYWdlIH0gPSBhd2FpdCBnZW5lcmF0ZVRleHQoe1xuICAgICAgbW9kZWw6IGFudGhyb3BpYyhcImNsYXVkZS1zb25uZXQtNC01XCIpLFxuICAgICAgcHJvbXB0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdG9rZW5zVXNlZCA9IHVzYWdlPy50b3RhbFRva2VucyB8fCAwO1xuICAgIGlmICh1c2FnZSkge1xuICAgICAgY29uc29sZS5sb2coYFtDb25lIEdlbmVyYXRvcl0gVG9rZW5zIHVzZWQ6ICR7dG9rZW5zVXNlZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0ZXh0LCB0b2tlbnNVc2VkIH07XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiBcInN0YXR1c0NvZGVcIiBpbiBlcnJvcikge1xuICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IChlcnJvciBhcyB7IHN0YXR1c0NvZGU6IG51bWJlciB9KS5zdGF0dXNDb2RlO1xuICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQyOSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYExMTSBBUEkgZmFpbGVkOiAke21lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBMTE0g7J2R64u17J2EIO2MjOyLse2VmOyXrCBDb25lR2VuZXJhdGlvblJlc3VsdOuhnCDrs4DtmZjtlanri4jri6QuXG4gKlxuICogTWFya2Rvd24g7L2U65OcIOu4lOuhneydtCDtj6ztlajrkJjslrQg7J6I7Jy866m0IOygnOqxsO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb25lUmVzcG9uc2UodGV4dDogc3RyaW5nKTogQ29uZUdlbmVyYXRpb25SZXN1bHQge1xuICBsZXQganNvblRleHQgPSB0ZXh0LnRyaW0oKTtcbiAganNvblRleHQgPSBqc29uVGV4dC5yZXBsYWNlKC9eYGBganNvblxccyovaSwgXCJcIik7XG4gIGpzb25UZXh0ID0ganNvblRleHQucmVwbGFjZSgvYGBgXFxzKiQvLCBcIlwiKTtcbiAganNvblRleHQgPSBqc29uVGV4dC50cmltKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcblxuICAgIGlmICghcGFyc2VkLnByb3BDb25lcyB8fCB0eXBlb2YgcGFyc2VkLnByb3BDb25lcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByZXNwb25zZTogcHJvcENvbmVzIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5Q29uZTogcGFyc2VkLmVudGl0eUNvbmUsXG4gICAgICBwcm9wQ29uZXM6IHBhcnNlZC5wcm9wQ29uZXMsXG4gICAgICBzdWJzZXRDb25lczogcGFyc2VkLnN1YnNldENvbmVzIHx8IHt9LFxuICAgICAgZW51bUNvbmVzOiBwYXJzZWQuZW51bUNvbmVzIHx8IHt9LFxuICAgICAgdG9rZW5zVXNlZDogMCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgTExNIHJlc3BvbnNlOiAke21lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgIGBPcmlnaW5hbCByZXNwb25zZTpcXG4ke3RleHR9XFxuXFxuYCArXG4gICAgICAgIGBDbGVhbmVkIEpTT046XFxuJHtqc29uVGV4dH1gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiDsg53shLHrkJwgY29uZeydhCDquLDsobQgY29uZeqzvCDrs5Htlantlanri4jri6QuXG4gKlxuICog6riw7KG0IGNvbmXsnbQg7J6I7Jy866m0IOuztOyhtO2VmOqzoCwg7JeG64qUIOqyveyasOyXkOunjCDsg53shLHrkJwgY29uZeydhCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlV2l0aEV4aXN0aW5nKFxuICBnZW5lcmF0ZWQ6IENvbmVHZW5lcmF0aW9uUmVzdWx0LFxuICBleGlzdGluZzogUmVjb3JkPHN0cmluZywgQ29uZT4sXG4pOiBDb25lR2VuZXJhdGlvblJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4uZ2VuZXJhdGVkIH07XG5cbiAgY29uc3QgZW50aXR5S2V5ID0gYGVudGl0eToke2dlbmVyYXRlZC5lbnRpdHlDb25lID8gXCJwcmVzZW50XCIgOiBcIm1pc3NpbmdcIn1gO1xuICBpZiAoZXhpc3RpbmdbZW50aXR5S2V5XSkge1xuICAgIHJlc3VsdC5lbnRpdHlDb25lID0gZXhpc3RpbmdbZW50aXR5S2V5XTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnByb3BDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgcHJvcDoke3Byb3BOYW1lfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0pIHtcbiAgICAgIHJlc3VsdC5wcm9wQ29uZXNbcHJvcE5hbWVdID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyhnZW5lcmF0ZWQuZW51bUNvbmVzKSkge1xuICAgIGNvbnN0IGtleSA9IGBlbnVtOiR7ZW51bUlkfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0pIHtcbiAgICAgIHJlc3VsdC5lbnVtQ29uZXNbZW51bUlkXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnN1YnNldENvbmVzKSkge1xuICAgIGNvbnN0IGtleSA9IGBzdWJzZXQ6JHtzdWJzZXRLZXl9YDtcbiAgICBpZiAoZXhpc3Rpbmdba2V5XSkge1xuICAgICAgcmVzdWx0LnN1YnNldENvbmVzW3N1YnNldEtleV0gPSBleGlzdGluZ1trZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogZml4dHVyZUhpbnTqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISx7ZWY6rOgIOuCmOuouOyngOuKlCDrs7TsobTtlanri4jri6QuXG4gKlxuICog6riw7KG0IGNvbmXsl5AgZml4dHVyZUhpbnTqsIAg7J6I7Jy866m0IOuztOyhtO2VmOqzoCwg7JeG7Jy866m0IOyDiOuhnCDsg53shLHrkJwgY29uZeydhCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT25seUVtcHR5KFxuICBnZW5lcmF0ZWQ6IENvbmVHZW5lcmF0aW9uUmVzdWx0LFxuICBleGlzdGluZzogUmVjb3JkPHN0cmluZywgQ29uZT4sXG4pOiBDb25lR2VuZXJhdGlvblJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4uZ2VuZXJhdGVkIH07XG5cbiAgLy8gRW50aXR5IGNvbmU6IGZpeHR1cmVIaW506rCAIOyeiOycvOuptCDrs7TsobRcbiAgY29uc3QgZW50aXR5S2V5ID0gYGVudGl0eToke2dlbmVyYXRlZC5lbnRpdHlDb25lID8gXCJwcmVzZW50XCIgOiBcIm1pc3NpbmdcIn1gO1xuICBpZiAoZXhpc3RpbmdbZW50aXR5S2V5XT8uZml4dHVyZUhpbnQpIHtcbiAgICByZXN1bHQuZW50aXR5Q29uZSA9IGV4aXN0aW5nW2VudGl0eUtleV07XG4gIH1cblxuICAvLyBQcm9wIGNvbmVzOiBmaXh0dXJlSGludOqwgCDsnojsnLzrqbQg67O07KG0XG4gIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnByb3BDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgcHJvcDoke3Byb3BOYW1lfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0/LmZpeHR1cmVIaW50KSB7XG4gICAgICByZXN1bHQucHJvcENvbmVzW3Byb3BOYW1lXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gRW51bSBjb25lczogZml4dHVyZUhpbnTqsIAg7J6I7Jy866m0IOuztOyhtCAoZW51beydgCDrs7TthrUgZml4dHVyZUhpbnTqsIAg7JeG7KeA66eMIOydvOq0gOyEseydhCDsnITtlbQpXG4gIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5lbnVtQ29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYGVudW06JHtlbnVtSWR9YDtcbiAgICBpZiAoZXhpc3Rpbmdba2V5XT8uZml4dHVyZUhpbnQpIHtcbiAgICAgIHJlc3VsdC5lbnVtQ29uZXNbZW51bUlkXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gU3Vic2V0IGNvbmVzOiBmaXh0dXJlSGludOqwgCDsnojsnLzrqbQg67O07KG0IChzdWJzZXTrj4Qg67O07Ya1IGZpeHR1cmVIaW506rCAIOyXhuyngOunjCDsnbzqtIDshLHsnYQg7JyE7ZW0KVxuICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiBPYmplY3Qua2V5cyhnZW5lcmF0ZWQuc3Vic2V0Q29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYHN1YnNldDoke3N1YnNldEtleX1gO1xuICAgIGlmIChleGlzdGluZ1trZXldPy5maXh0dXJlSGludCkge1xuICAgICAgcmVzdWx0LnN1YnNldENvbmVzW3N1YnNldEtleV0gPSBleGlzdGluZ1trZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwibmFtZXMiOlsiZ2VuZXJhdGVDb25lcyIsImNvbnRleHQiLCJhcGlLZXkiLCJnZXRBcGlLZXkiLCJwcm9tcHQiLCJidWlsZFByb21wdCIsInRleHQiLCJyZXNwb25zZVRleHQiLCJ0b2tlbnNVc2VkIiwiY2FsbEFudGhyb3BpY0FQSSIsInJlc3VsdCIsInBhcnNlQ29uZVJlc3BvbnNlIiwiZXhpc3RpbmdDb25lcyIsIm9ubHlFbXB0eSIsIm1lcmdlT25seUVtcHR5IiwibWVyZ2VXaXRoRXhpc3RpbmciLCJTb25hbXUiLCJyZXF1aXJlIiwic2VjcmV0IiwiYW50aHJvcGljX2FwaV9rZXkiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiQU5USFJPUElDX0FQSV9LRVkiLCJFcnJvciIsImxvY2FsZSIsImxvY2FsZURlc2MiLCJrbyIsImVuIiwiamEiLCJKU09OIiwic3RyaW5naWZ5IiwiZW50aXR5IiwiY3JlYXRlQW50aHJvcGljIiwiZ2VuZXJhdGVUZXh0IiwiYW50aHJvcGljIiwidXNhZ2UiLCJtb2RlbCIsInRvdGFsVG9rZW5zIiwiY29uc29sZSIsImxvZyIsImVycm9yIiwic3RhdHVzQ29kZSIsIm1lc3NhZ2UiLCJqc29uVGV4dCIsInRyaW0iLCJyZXBsYWNlIiwicGFyc2VkIiwicGFyc2UiLCJwcm9wQ29uZXMiLCJlbnRpdHlDb25lIiwic3Vic2V0Q29uZXMiLCJlbnVtQ29uZXMiLCJnZW5lcmF0ZWQiLCJleGlzdGluZyIsImVudGl0eUtleSIsInByb3BOYW1lIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsImVudW1JZCIsInN1YnNldEtleSIsImZpeHR1cmVIaW50Il0sIm1hcHBpbmdzIjoiQUE0QkE7Ozs7O0NBS0MsR0FDRCxPQUFPLGVBQWVBLGNBQWNDLE9BQThCO0lBQ2hFLE1BQU1DLFNBQVNDO0lBQ2YsTUFBTUMsU0FBU0MsWUFBWUo7SUFDM0IsTUFBTSxFQUFFSyxNQUFNQyxZQUFZLEVBQUVDLFVBQVUsRUFBRSxHQUFHLE1BQU1DLGlCQUFpQkwsUUFBUUY7SUFDMUUsTUFBTVEsU0FBU0Msa0JBQWtCSjtJQUNqQ0csT0FBT0YsVUFBVSxHQUFHQTtJQUVwQixJQUFJUCxRQUFRVyxhQUFhLEVBQUU7UUFDekIsSUFBSVgsUUFBUVksU0FBUyxFQUFFO1lBQ3JCLE9BQU9DLGVBQWVKLFFBQVFULFFBQVFXLGFBQWE7UUFDckQ7UUFDQSxPQUFPRyxrQkFBa0JMLFFBQVFULFFBQVFXLGFBQWE7SUFDeEQ7SUFFQSxPQUFPRjtBQUNUO0FBRUE7Ozs7Q0FJQyxHQUNELFNBQVNQO0lBQ1Asd0NBQXdDO0lBQ3hDLElBQUlEO0lBRUosSUFBSTtRQUNGLHNCQUFzQjtRQUN0QixNQUFNLEVBQUVjLE1BQU0sRUFBRSxHQUFHQyxRQUFRO1FBQzNCZixTQUFTYyxPQUFPRSxNQUFNLEVBQUVDO0lBQzFCLEVBQUUsT0FBTTtRQUNOLDhCQUE4QjtRQUM5QmpCLFNBQVNrQjtJQUNYO0lBRUEsSUFBSSxDQUFDbEIsUUFBUTtRQUNYQSxTQUFTbUIsUUFBUUMsR0FBRyxDQUFDQyxpQkFBaUI7SUFDeEM7SUFFQSxJQUFJLENBQUNyQixRQUFRO1FBQ1gsTUFBTSxJQUFJc0IsTUFDUixrQ0FDRTtJQUVOO0lBRUEsT0FBT3RCO0FBQ1Q7QUFFQTs7OztDQUlDLEdBQ0QsU0FBU0csWUFBWUosT0FBOEI7SUFDakQsTUFBTXdCLFNBQVN4QixRQUFRd0IsTUFBTSxJQUFJO0lBQ2pDLE1BQU1DLGFBQWE7UUFDakJDLElB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
@@ -1 +1 @@
1
- {"version":3,"file":"_batch_update.d.ts","sourceRoot":"","sources":["../../src/database/_batch_update.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACpD,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,MAAM,IAAI;KACxC,GAAG,IAAI,EAAE,GAAG,WAAW;CACzB,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEhC;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,EAAE,SAAS,MAAM,EACjD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,EAAE,EAAE,EACT,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EACrB,SAAS,SAAK,EACd,GAAG,GAAE,IAAI,CAAC,WAAW,GAAG,IAAW,iBAuBpC"}
1
+ {"version":3,"file":"_batch_update.d.ts","sourceRoot":"","sources":["../../src/database/_batch_update.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACpD,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,MAAM,IAAI;KACxC,GAAG,IAAI,EAAE,GAAG,WAAW;CACzB,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEhC;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,EAAE,SAAS,MAAM,EACjD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,EAAE,EAAE,EACT,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EACrB,SAAS,SAAK,EACd,GAAG,GAAE,IAAI,CAAC,WAAW,GAAG,IAAW,iBA+BpC"}
@@ -1,7 +1,13 @@
1
1
  /*
2
2
  아래의 링크에서 참고해서 가져온 소스코드
3
3
  https://github.com/knex/knex/issues/5716
4
- */ /**
4
+ */ import { getLogger } from "@logtape/logtape";
5
+ const logger = getLogger([
6
+ "sonamu",
7
+ "internal",
8
+ "batch-update"
9
+ ]);
10
+ /**
5
11
  * Batch update rows in a table. Technically its a patch since it only updates the specified columns. Any omitted columns will not be affected
6
12
  * @param db
7
13
  * @param tableName
@@ -20,11 +26,19 @@
20
26
  };
21
27
  if (trx) {
22
28
  for (const chunk of chunks){
29
+ logger.debug("Processing Batch Chunk in Existing Transaction: {current} / {total}", {
30
+ current: chunk.length,
31
+ total: chunks.length
32
+ });
23
33
  await executeUpdate(chunk, trx);
24
34
  }
25
35
  } else {
26
36
  await knex.transaction(async (newTrx)=>{
27
37
  for (const chunk of chunks){
38
+ logger.debug("Processing Batch Chunk in New Transaction: {current} / {total}", {
39
+ current: chunk.length,
40
+ total: chunks.length
41
+ });
28
42
  await executeUpdate(chunk, newTrx);
29
43
  }
30
44
  });
@@ -92,4 +106,4 @@ function generateBatchUpdateSQL(db, tableName, data, identifiers) {
92
106
  return sql;
93
107
  }
94
108
 
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9fYmF0Y2hfdXBkYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIOyVhOuemOydmCDrp4Htgazsl5DshJwg7LC46rOg7ZW07IScIOqwgOyguOyYqCDshozsiqTsvZTrk5xcbiAgaHR0cHM6Ly9naXRodWIuY29tL2tuZXgva25leC9pc3N1ZXMvNTcxNlxuKi9cblxuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcblxudHlwZSBDb2x1bW5WYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuZXhwb3J0IHR5cGUgUm93V2l0aElkPElkIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgW2tleSBpbiBJZF06IENvbHVtblZhbHVlO1xufSAmIFJlY29yZDxzdHJpbmcsIENvbHVtblZhbHVlPjtcblxuLyoqXG4gKiBCYXRjaCB1cGRhdGUgcm93cyBpbiBhIHRhYmxlLiBUZWNobmljYWxseSBpdHMgYSBwYXRjaCBzaW5jZSBpdCBvbmx5IHVwZGF0ZXMgdGhlIHNwZWNpZmllZCBjb2x1bW5zLiBBbnkgb21pdHRlZCBjb2x1bW5zIHdpbGwgbm90IGJlIGFmZmVjdGVkXG4gKiBAcGFyYW0gZGJcbiAqIEBwYXJhbSB0YWJsZU5hbWVcbiAqIEBwYXJhbSBpZHNcbiAqIEBwYXJhbSByb3dzXG4gKiBAcGFyYW0gY2h1bmtTaXplXG4gKiBAcGFyYW0gdHJ4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaFVwZGF0ZTxJZCBleHRlbmRzIHN0cmluZz4oXG4gIGtuZXg6IEtuZXgsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBpZHM6IElkW10sXG4gIHJvd3M6IFJvd1dpdGhJZDxJZD5bXSxcbiAgY2h1bmtTaXplID0gNTAsXG4gIHRyeDogS25leC5UcmFuc2FjdGlvbiB8IG51bGwgPSBudWxsLFxuKSB7XG4gIGNvbnN0IGNodW5rczogUm93V2l0aElkPElkPltdW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSArPSBjaHVua1NpemUpIHtcbiAgICBjaHVua3MucHVzaChyb3dzLnNsaWNlKGksIGkgKyBjaHVua1NpemUpKTtcbiAgfVxuXG4gIGNvbnN0IGV4ZWN1dGVVcGRhdGUgPSBhc3luYyAoY2h1bms6IFJvd1dpdGhJZDxJZD5bXSwgdHJhbnNhY3Rpb246IEtuZXguVHJhbnNhY3Rpb24pID0+IHtcbiAgICBjb25zdCByYXdRdWVyeSA9IGdlbmVyYXRlQmF0Y2hVcGRhdGVTUUwoa25leCwgdGFibGVOYW1lLCBjaHVuaywgaWRzKTtcbiAgICByZXR1cm4gcmF3UXVlcnkudHJhbnNhY3RpbmcodHJhbnNhY3Rpb24pO1xuICB9O1xuXG4gIGlmICh0cngpIHtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgYXdhaXQgZXhlY3V0ZVVwZGF0ZShjaHVuaywgdHJ4KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQga25leC50cmFuc2FjdGlvbihhc3luYyAobmV3VHJ4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgICBhd2FpdCBleGVjdXRlVXBkYXRlKGNodW5rLCBuZXdUcngpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBzZXQgb2YgdW5pcXVlIGtleXMgaW4gYSBkYXRhIGFycmF5XG4gKlxuICogRXhhbXBsZTpcbiAqIFsgeyBhOiAxLCBiOiAyIH0sIHsgYTogMywgYzogNCB9IF0gPT4gU2V0KFsgXCJhXCIsIFwiYlwiLCBcImNcIiBdKVxuICogQHBhcmFtIGRhdGFcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVLZXlTZXRGcm9tRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW5WYWx1ZT5bXSkge1xuICBjb25zdCBrZXlTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAga2V5U2V0LmFkZChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5U2V0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUJhdGNoVXBkYXRlU1FMPElkIGV4dGVuZHMgc3RyaW5nPihcbiAgZGI6IEtuZXgsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW5WYWx1ZT5bXSxcbiAgaWRlbnRpZmllcnM6IElkW10sXG4pOiBLbmV4LlJhdyB7XG4gIGNvbnN0IGtleVNldCA9IGdlbmVyYXRlS2V5U2V0RnJvbURhdGEoZGF0YSk7XG4gIGNvbnN0IGFsbEJpbmRpbmdzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwpW10gPSBbXTtcblxuICBjb25zdCBpbnZhbGlkSWRlbnRpZmllcnMgPSBpZGVudGlmaWVycy5maWx0ZXIoKGlkKSA9PiAha2V5U2V0LmhhcyhpZCkpO1xuICBpZiAoaW52YWxpZElkZW50aWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBpZGVudGlmaWVyczogJHtpbnZhbGlkSWRlbnRpZmllcnMuam9pbihcIiwgXCIpfS4gSWRlbnRpZmllcnMgbXVzdCBleGlzdCBpbiB0aGUgZGF0YWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNhc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleVNldCkge1xuICAgIGlmIChpZGVudGlmaWVycy5pbmNsdWRlcyhrZXkgYXMgSWQpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNhc2VCaW5kaW5nczogKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsKVtdID0gW107XG4gICAgY29uc3Qgd2hlbkNsYXVzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093bihyb3csIGtleSkpIHtcbiAgICAgICAgY29uc3Qgd2hlcmVQYXJ0cyA9IGlkZW50aWZpZXJzLm1hcCgoKSA9PiBgPz8gPSA/YCkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICB3aGVuQ2xhdXNlcy5wdXNoKGBXSEVOICgke3doZXJlUGFydHN9KSBUSEVOID9gKTtcblxuICAgICAgICAvLyBpZGVudGlmaWVyIOydtOumhOqzvCDqsJLrk6TsnYQg7LaU6rCAXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRlbnRpZmllcnMpIHtcbiAgICAgICAgICBjYXNlQmluZGluZ3MucHVzaChpZCwgcm93W2lkXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVEhFTiDqsJIg7LaU6rCAXG4gICAgICAgIGNhc2VCaW5kaW5ncy5wdXNoKHJvd1trZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3aGVuVGhlbiA9IHdoZW5DbGF1c2VzLmpvaW4oXCIgXCIpO1xuICAgIGNhc2VzLnB1c2goYD8/ID0gQ0FTRSAke3doZW5UaGVufSBFTFNFID8/IEVORGApO1xuXG4gICAgLy8g7Lus65+866qFIDLqsJwg7LaU6rCAIChTRVTsnZgg7Lus65+866qFLCBFTFNF7J2YIOy7rOufvOuqhSlcbiAgICBhbGxCaW5kaW5ncy5wdXNoKGtleSk7XG4gICAgYWxsQmluZGluZ3MucHVzaCguLi5jYXNlQmluZGluZ3MpO1xuICAgIGFsbEJpbmRpbmdzLnB1c2goa2V5KTtcbiAgfVxuXG4gIGNvbnN0IHdoZXJlSW5DbGF1c2VzID0gaWRlbnRpZmllcnNcbiAgICAubWFwKChfY29sKSA9PiBgPz8gSU4gKCR7ZGF0YS5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYClcbiAgICAuam9pbihcIiBBTkQgXCIpO1xuXG4gIGNvbnN0IHdoZXJlSW5CaW5kaW5nczogKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsKVtdID0gW107XG4gIGZvciAoY29uc3QgY29sIG9mIGlkZW50aWZpZXJzKSB7XG4gICAgd2hlcmVJbkJpbmRpbmdzLnB1c2goY29sKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgICB3aGVyZUluQmluZGluZ3MucHVzaChyb3dbY29sXSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3FsID0gZGIucmF3KGBVUERBVEUgPz8gU0VUICR7Y2FzZXMuam9pbihcIiwgXCIpfSBXSEVSRSAke3doZXJlSW5DbGF1c2VzfWAsIFtcbiAgICB0YWJsZU5hbWUsXG4gICAgLi4uYWxsQmluZGluZ3MsXG4gICAgLi4ud2hlcmVJbkJpbmRpbmdzLFxuICBdKTtcblxuICByZXR1cm4gc3FsO1xufVxuIl0sIm5hbWVzIjpbImJhdGNoVXBkYXRlIiwia25leCIsInRhYmxlTmFtZSIsImlkcyIsInJvd3MiLCJjaHVua1NpemUiLCJ0cngiLCJjaHVua3MiLCJpIiwibGVuZ3RoIiwicHVzaCIsInNsaWNlIiwiZXhlY3V0ZVVwZGF0ZSIsImNodW5rIiwidHJhbnNhY3Rpb24iLCJyYXdRdWVyeSIsImdlbmVyYXRlQmF0Y2hVcGRhdGVTUUwiLCJ0cmFuc2FjdGluZyIsIm5ld1RyeCIsImdlbmVyYXRlS2V5U2V0RnJvbURhdGEiLCJkYXRhIiwia2V5U2V0IiwiU2V0Iiwicm93Iiwia2V5IiwiT2JqZWN0Iiwia2V5cyIsImFkZCIsImRiIiwiaWRlbnRpZmllcnMiLCJhbGxCaW5kaW5ncyIsImludmFsaWRJZGVudGlmaWVycyIsImZpbHRlciIsImlkIiwiaGFzIiwiRXJyb3IiLCJqb2luIiwiY2FzZXMiLCJpbmNsdWRlcyIsImNhc2VCaW5kaW5ncyIsIndoZW5DbGF1c2VzIiwiaGFzT3duIiwid2hlcmVQYXJ0cyIsIm1hcCIsIndoZW5UaGVuIiwid2hlcmVJbkNsYXVzZXMiLCJfY29sIiwid2hlcmVJbkJpbmRpbmdzIiwiY29sIiwic3FsIiwicmF3Il0sIm1hcHBpbmdzIjoiQUFBQTs7O0FBR0EsR0FTQTs7Ozs7Ozs7Q0FRQyxHQUNELE9BQU8sZUFBZUEsWUFDcEJDLElBQVUsRUFD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
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9fYmF0Y2hfdXBkYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIOyVhOuemOydmCDrp4Htgazsl5DshJwg7LC46rOg7ZW07IScIOqwgOyguOyYqCDshozsiqTsvZTrk5xcbiAgaHR0cHM6Ly9naXRodWIuY29tL2tuZXgva25leC9pc3N1ZXMvNTcxNlxuKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJzb25hbXVcIiwgXCJpbnRlcm5hbFwiLCBcImJhdGNoLXVwZGF0ZVwiXSk7XG5cbnR5cGUgQ29sdW1uVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbmV4cG9ydCB0eXBlIFJvd1dpdGhJZDxJZCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrZXkgaW4gSWRdOiBDb2x1bW5WYWx1ZTtcbn0gJiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW5WYWx1ZT47XG5cbi8qKlxuICogQmF0Y2ggdXBkYXRlIHJvd3MgaW4gYSB0YWJsZS4gVGVjaG5pY2FsbHkgaXRzIGEgcGF0Y2ggc2luY2UgaXQgb25seSB1cGRhdGVzIHRoZSBzcGVjaWZpZWQgY29sdW1ucy4gQW55IG9taXR0ZWQgY29sdW1ucyB3aWxsIG5vdCBiZSBhZmZlY3RlZFxuICogQHBhcmFtIGRiXG4gKiBAcGFyYW0gdGFibGVOYW1lXG4gKiBAcGFyYW0gaWRzXG4gKiBAcGFyYW0gcm93c1xuICogQHBhcmFtIGNodW5rU2l6ZVxuICogQHBhcmFtIHRyeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmF0Y2hVcGRhdGU8SWQgZXh0ZW5kcyBzdHJpbmc+KFxuICBrbmV4OiBLbmV4LFxuICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgaWRzOiBJZFtdLFxuICByb3dzOiBSb3dXaXRoSWQ8SWQ+W10sXG4gIGNodW5rU2l6ZSA9IDUwLFxuICB0cng6IEtuZXguVHJhbnNhY3Rpb24gfCBudWxsID0gbnVsbCxcbikge1xuICBjb25zdCBjaHVua3M6IFJvd1dpdGhJZDxJZD5bXVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkgKz0gY2h1bmtTaXplKSB7XG4gICAgY2h1bmtzLnB1c2gocm93cy5zbGljZShpLCBpICsgY2h1bmtTaXplKSk7XG4gIH1cblxuICBjb25zdCBleGVjdXRlVXBkYXRlID0gYXN5bmMgKGNodW5rOiBSb3dXaXRoSWQ8SWQ+W10sIHRyYW5zYWN0aW9uOiBLbmV4LlRyYW5zYWN0aW9uKSA9PiB7XG4gICAgY29uc3QgcmF3UXVlcnkgPSBnZW5lcmF0ZUJhdGNoVXBkYXRlU1FMKGtuZXgsIHRhYmxlTmFtZSwgY2h1bmssIGlkcyk7XG4gICAgcmV0dXJuIHJhd1F1ZXJ5LnRyYW5zYWN0aW5nKHRyYW5zYWN0aW9uKTtcbiAgfTtcblxuICBpZiAodHJ4KSB7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIlByb2Nlc3NpbmcgQmF0Y2ggQ2h1bmsgaW4gRXhpc3RpbmcgVHJhbnNhY3Rpb246IHtjdXJyZW50fSAvIHt0b3RhbH1cIiwge1xuICAgICAgICBjdXJyZW50OiBjaHVuay5sZW5ndGgsXG4gICAgICAgIHRvdGFsOiBjaHVua3MubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBleGVjdXRlVXBkYXRlKGNodW5rLCB0cngpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBrbmV4LnRyYW5zYWN0aW9uKGFzeW5jIChuZXdUcngpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIlByb2Nlc3NpbmcgQmF0Y2ggQ2h1bmsgaW4gTmV3IFRyYW5zYWN0aW9uOiB7Y3VycmVudH0gLyB7dG90YWx9XCIsIHtcbiAgICAgICAgICBjdXJyZW50OiBjaHVuay5sZW5ndGgsXG4gICAgICAgICAgdG90YWw6IGNodW5rcy5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBleGVjdXRlVXBkYXRlKGNodW5rLCBuZXdUcngpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBzZXQgb2YgdW5pcXVlIGtleXMgaW4gYSBkYXRhIGFycmF5XG4gKlxuICogRXhhbXBsZTpcbiAqIFsgeyBhOiAxLCBiOiAyIH0sIHsgYTogMywgYzogNCB9IF0gPT4gU2V0KFsgXCJhXCIsIFwiYlwiLCBcImNcIiBdKVxuICogQHBhcmFtIGRhdGFcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVLZXlTZXRGcm9tRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW5WYWx1ZT5bXSkge1xuICBjb25zdCBrZXlTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAga2V5U2V0LmFkZChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5U2V0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUJhdGNoVXBkYXRlU1FMPElkIGV4dGVuZHMgc3RyaW5nPihcbiAgZGI6IEtuZXgsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW5WYWx1ZT5bXSxcbiAgaWRlbnRpZmllcnM6IElkW10sXG4pOiBLbmV4LlJhdyB7XG4gIGNvbnN0IGtleVNldCA9IGdlbmVyYXRlS2V5U2V0RnJvbURhdGEoZGF0YSk7XG4gIGNvbnN0IGFsbEJpbmRpbmdzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwpW10gPSBbXTtcblxuICBjb25zdCBpbnZhbGlkSWRlbnRpZmllcnMgPSBpZGVudGlmaWVycy5maWx0ZXIoKGlkKSA9PiAha2V5U2V0LmhhcyhpZCkpO1xuICBpZiAoaW52YWxpZElkZW50aWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBpZGVudGlmaWVyczogJHtpbnZhbGlkSWRlbnRpZmllcnMuam9pbihcIiwgXCIpfS4gSWRlbnRpZmllcnMgbXVzdCBleGlzdCBpbiB0aGUgZGF0YWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNhc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleVNldCkge1xuICAgIGlmIChpZGVudGlmaWVycy5pbmNsdWRlcyhrZXkgYXMgSWQpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNhc2VCaW5kaW5nczogKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsKVtdID0gW107XG4gICAgY29uc3Qgd2hlbkNsYXVzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093bihyb3csIGtleSkpIHtcbiAgICAgICAgY29uc3Qgd2hlcmVQYXJ0cyA9IGlkZW50aWZpZXJzLm1hcCgoKSA9PiBgPz8gPSA/YCkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICB3aGVuQ2xhdXNlcy5wdXNoKGBXSEVOICgke3doZXJlUGFydHN9KSBUSEVOID9gKTtcblxuICAgICAgICAvLyBpZGVudGlmaWVyIOydtOumhOqzvCDqsJLrk6TsnYQg7LaU6rCAXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRlbnRpZmllcnMpIHtcbiAgICAgICAgICBjYXNlQmluZGluZ3MucHVzaChpZCwgcm93W2lkXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVEhFTiDqsJIg7LaU6rCAXG4gICAgICAgIGNhc2VCaW5kaW5ncy5wdXNoKHJvd1trZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3aGVuVGhlbiA9IHdoZW5DbGF1c2VzLmpvaW4oXCIgXCIpO1xuICAgIGNhc2VzLnB1c2goYD8/ID0gQ0FTRSAke3doZW5UaGVufSBFTFNFID8/IEVORGApO1xuXG4gICAgLy8g7Lus65+866qFIDLqsJwg7LaU6rCAIChTRVTsnZgg7Lus65+866qFLCBFTFNF7J2YIOy7rOufvOuqhSlcbiAgICBhbGxCaW5kaW5ncy5wdXNoKGtleSk7XG4gICAgYWxsQmluZGluZ3MucHVzaCguLi5jYXNlQmluZGluZ3MpO1xuICAgIGFsbEJpbmRpbmdzLnB1c2goa2V5KTtcbiAgfVxuXG4gIGNvbnN0IHdoZXJlSW5DbGF1c2VzID0gaWRlbnRpZmllcnNcbiAgICAubWFwKChfY29sKSA9PiBgPz8gSU4gKCR7ZGF0YS5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYClcbiAgICAuam9pbihcIiBBTkQgXCIpO1xuXG4gIGNvbnN0IHdoZXJlSW5CaW5kaW5nczogKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsKVtdID0gW107XG4gIGZvciAoY29uc3QgY29sIG9mIGlkZW50aWZpZXJzKSB7XG4gICAgd2hlcmVJbkJpbmRpbmdzLnB1c2goY29sKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgICB3aGVyZUluQmluZGluZ3MucHVzaChyb3dbY29sXSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3FsID0gZGIucmF3KGBVUERBVEUgPz8gU0VUICR7Y2FzZXMuam9pbihcIiwgXCIpfSBXSEVSRSAke3doZXJlSW5DbGF1c2VzfWAsIFtcbiAgICB0YWJsZU5hbWUsXG4gICAgLi4uYWxsQmluZGluZ3MsXG4gICAgLi4ud2hlcmVJbkJpbmRpbmdzLFxuICBdKTtcblxuICByZXR1cm4gc3FsO1xufVxuIl0sIm5hbWVzIjpbImdldExvZ2dlciIsImxvZ2dlciIsImJhdGNoVXBkYXRlIiwia25leCIsInRhYmxlTmFtZSIsImlkcyIsInJvd3MiLCJjaHVua1NpemUiLCJ0cngiLCJjaHVua3MiLCJpIiwibGVuZ3RoIiwicHVzaCIsInNsaWNlIiwiZXhlY3V0ZVVwZGF0ZSIsImNodW5rIiwidHJhbnNhY3Rpb24iLCJyYXdRdWVyeSIsImdlbmVyYXRlQmF0Y2hVcGRhdGVTUUwiLCJ0cmFuc2FjdGluZyIsImRlYnVnIiwiY3VycmVudCIsInRvdGFsIiwibmV3VHJ4IiwiZ2VuZXJhdGVLZXlTZXRGcm9tRGF0YSIsImRhdGEiLCJrZXlTZXQiLCJTZXQiLCJyb3ciLCJrZXkiLCJPYmplY3QiLCJrZXlzIiwiYWRkIiwiZGIiLCJpZGVudGlmaWVycyIsImFsbEJpbmRpbmdzIiwiaW52YWxpZElkZW50aWZpZXJzIiwiZmlsdGVyIiwiaWQiLCJoYXMiLCJFcnJvciIsImpvaW4iLCJjYXNlcyIsImluY2x1ZGVzIiwiY2FzZUJpbmRpbmdzIiwid2hlbkNsYXVzZXMiLCJoYXNPd24iLCJ3aGVyZVBhcnRzIiwibWFwIiwid2hlblRoZW4iLCJ3aGVyZUluQ2xhdXNlcyIsIl9jb2wiLCJ3aGVyZUluQmluZGluZ3MiLCJjb2wiLCJzcWwiLCJyYXciXSwibWFwcGluZ3MiOiJBQUFBOzs7QUFHQSxHQUVBLFNBQVNBLFNBQVMsUUFBUSxtQkFBbUI7QUFHN0MsTUFBTUMsU0FBU0QsVUFBVTtJQUFDO0lBQVU7SUFBWTtDQUFlO0FBTy9EOzs7Ozs7OztDQVFDLEdBQ0QsT0FBTyxlQUFlRSxZQUNwQkMsSUFBVSxFQUNWQyxTQUFpQixFQUNqQkMsR0FBUyxFQUNUQyxJQUFxQixFQUNyQkMsWUFBWSxFQUFFLEVBQ2RDLE1BQStCLElBQUk7SUFFbkMsTUFBTUMsU0FBNEIsRUFBRTtJQUNwQyxJQUFLLElBQUlDLElBQUksR0FBR0EsSUFBSUosS0FBS0ssTUFBTSxFQUFFRCxLQUFLSCxVQUFXO1FBQy9DRSxPQUFPRyxJQUFJLENBQUNOLEtBQUtPLEtBQUssQ0FBQ0gsR0FBR0EsSUFBSUg7SUFDaEM7SUFFQSxNQUFNTyxnQkFBZ0IsT0FBT0MsT0FBd0JDO1FBQ25ELE1BQU1DLFdBQVdDLHVCQUF1QmYsTUFBTUMsV0FBV1csT0FBT1Y7UUFDaEUsT0FBT1ksU0FBU0UsV0FBVyxDQUFDSDtJ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
@@ -78,4 +78,4 @@ describe("InferAllSubsets", ()=>{
78
78
  });
79
79
  });
80
80
 
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXN1YnNldC50ZXN0LWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdFR5cGVPZiwgaXQgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IEh5ZHJhdGUsIEluZmVyQWxsU3Vic2V0cywgTG9hZGVyc1Jlc3VsdCB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5cbi8qKiBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFB1cmkgU3Vic2V0IO2DgOyehSDsi5zsiqTthZzsl5DshJwgYW5566W8IO2XiOyaqe2VqCAqL1xudHlwZSBNb2NrUHVyaTxUPiA9IFB1cmk8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIGFueSwgVD47XG5cbmRlc2NyaWJlKFwiSHlkcmF0ZVwiLCAoKSA9PiB7XG4gIGl0KFwiZmxhdCDqsJ3ssrTrpbwg6re464yA66GcIOycoOyngO2VnOuLpCAoX18g7JeG64qUIOqyveyasClcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjxIeWRyYXRlPElucHV0Pj4oKTtcbiAgfSk7XG5cbiAgaXQoXCLri6jsnbwgZGVwdGjsnZggX18g7YKk66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0geyBpZDogbnVtYmVyOyB1c2VyX19uYW1lOiBzdHJpbmc7IHVzZXJfX2VtYWlsOiBzdHJpbmcgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXI6IHsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nIH07XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLri6TspJEgZGVwdGjsnZggX18g7YKk66W8IOyerOq3gOyggeycvOuhnCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyX19wcm9maWxlX19iaW86IHN0cmluZztcbiAgICAgIHVzZXJfX3Byb2ZpbGVfX2F2YXRhcjogc3RyaW5nO1xuICAgICAgdXNlcl9fbmFtZTogc3RyaW5nO1xuICAgIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgcHJvZmlsZTogeyBiaW86IHN0cmluZzsgYXZhdGFyOiBzdHJpbmcgfTtcbiAgICAgIH07XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLsl6zrn6wg6rSA6rOE66W8IOuPmeyLnOyXkCDsspjrpqztlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcl9faWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX25hbWU6IHN0cmluZztcbiAgICAgIHBvc3RfX2lkOiBudW1iZXI7XG4gICAgICBwb3N0X190aXRsZTogc3RyaW5nO1xuICAgIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9O1xuICAgICAgcG9zdDogeyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nIH07XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLruYgg6rCd7LK066W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHt9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7fT4oKTtcbiAgfSk7XG5cbiAgaXQoXCJudWxsYWJsZSDtlYTrk5zqsIAg7J6I64qUIOykkeyyqSDqsJ3ssrTrpbwg7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0ge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX2lkOiBudW1iZXIgfCBudWxsO1xuICAgICAgdXNlcl9fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcjogeyBpZDogbnVtYmVyIHwgbnVsbDsgbmFtZTogc3RyaW5nIHwgbnVsbCB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi64+Z7J287ZWcIHByZWZpeOulvCDqsIDsp4Qg7Jes65+sIO2VhOuTnOulvCDsmKzrsJTrpbTqsowg6re466O57ZmU7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0ge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX2lkOiBudW1iZXI7XG4gICAgICB1c2VyX19uYW1lOiBzdHJpbmc7XG4gICAgICB1c2VyX2NvdW50OiBudW1iZXI7XG4gICAgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXI6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH07XG4gICAgICB1c2VyX2NvdW50OiBudW1iZXI7XG4gICAgfT4oKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJMb2FkZXJzUmVzdWx0XCIsICgpID0+IHtcbiAgaXQoXCLri6jsnbwg66Gc642U7J2YIOqysOqzvCDtg4DsnoXsnYQg7IOd7ISx7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIE1vY2tMb2FkZXJRYiA9IChcbiAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IHRpdGxlOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG5cbiAgICB0eXBlIExvYWRlcnMgPSBbXG4gICAgICB7XG4gICAgICAgIGFzOiBcInBvc3RzXCI7XG4gICAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICAgIHFiOiBNb2NrTG9hZGVyUWI7XG4gICAgICB9LFxuICAgIF07XG4gICAgdHlwZSBSZXN1bHQgPSBMb2FkZXJzUmVzdWx0PExvYWRlcnM+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwicG9zdHNcIik7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7IHBvc3RzOiB7IGlkOiBudW1iZXI7IHRpdGxlOiBzdHJpbmcgfVtdIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi7KSR7LKpIOuhnOuNlOulvCDsspjrpqztlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgQ29tbWVudExvYWRlclFiID0gKFxuICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgY29udGVudDogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuXG4gICAgdHlwZSBQb3N0TG9hZGVyUWIgPSAoXG4gICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuXG4gICAgdHlwZSBMb2FkZXJzID0gW1xuICAgICAge1xuICAgICAgICBhczogXCJwb3N0c1wiO1xuICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICBxYjogUG9zdExvYWRlclFiO1xuICAgICAgICBsb2FkZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXM6IFwiY29tbWVudHNcIjtcbiAgICAgICAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICAgICAgICBxYjogQ29tbWVudExvYWRlclFiO1xuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9LFxuICAgIF07XG4gICAgdHlwZSBSZXN1bHQgPSBMb2FkZXJzUmVzdWx0PExvYWRlcnM+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwicG9zdHNcIik7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBwb3N0czogeyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyBjb21tZW50czogeyBpZDogbnVtYmVyOyBjb250ZW50OiBzdHJpbmcgfVtdIH1bXTtcbiAgICB9PigpO1xuICB9KTtcblxuICBpdChcIuyXrOufrCDroZzrjZTrpbwg7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIFByb2plY3RMb2FkZXIgPSB7XG4gICAgICBhczogXCJwcm9qZWN0c1wiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgfTtcbiAgICB0eXBlIERlcGFydG1lbnRMb2FkZXIgPSB7XG4gICAgICBhczogXCJkZXBhcnRtZW50XCI7XG4gICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgcWI6IChcbiAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgY29tcGFueV9uYW1lOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgfTtcbiAgICB0eXBlIEVtcGxveWVlTG9hZGVyID0ge1xuICAgICAgYXM6IFwiZW1wbG95ZWVzXCI7XG4gICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgcWI6IChcbiAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IGVtcGxveWVlX251bWJlcjogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgICAgbG9hZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXM6IFwidXNlclwiO1xuICAgICAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICAgICAgcWI6IChcbiAgICAgICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfTtcblxuICAgIHR5cGUgTG9hZGVycyA9IFtQcm9qZWN0TG9hZGVyLCBEZXBhcnRtZW50TG9hZGVyLCBFbXBsb3llZUxvYWRlcl07XG4gICAgdHlwZSBSZXN1bHQgPSBMb2FkZXJzUmVzdWx0PExvYWRlcnM+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwicHJvamVjdHNcIik7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJlbXBsb3llZXNcIik7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJkZXBhcnRtZW50XCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgcHJvamVjdHM6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXTtcbiAgICAgIGRlcGFydG1lbnQ6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBjb21wYW55X25hbWU6IHN0cmluZyB9W107XG4gICAgICBlbXBsb3llZXM6IHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgZW1wbG95ZWVfbnVtYmVyOiBzdHJpbmc7XG4gICAgICAgIHVzZXI6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nIH1bXTtcbiAgICAgIH1bXTtcbiAgICB9PigpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIkluZmVyQWxsU3Vic2V0c1wiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwi7ISc67iM7IWL7J20IO2VmOuCmOyduCDqsr3smrBcIiwgKCkgPT4ge1xuICAgIGl0KFwi66Gc642UIOyXhuydtCDquLDrs7ggU3Vic2V0IOqysOqzvOulvCDstpTroaDtlZzri6RcIiwgKCkgPT4ge1xuICAgICAgLy8gU3Vic2V0UXVlcnlcbiAgICAgIHR5cGUgU3Vic2V0Rm5BID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBNb2NrUHVyaTx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIHVzZXJfX25hbWU6IHN0cmluZztcbiAgICAgICAgdXNlcl9fZW1haWw6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9fbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19jb21wYW55X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW107XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcIkFcIik7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0LkEpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICB1c2VyOiB7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9O1xuICAgICAgICBkZXBhcnRtZW50OiB7IG5hbWU6IHN0cmluZzsgY29tcGFueTogeyBuYW1lOiBzdHJpbmcgfSB9O1xuICAgICAgfT4oKTtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQuQS5kZXBhcnRtZW50LmNvbXBhbnkpLnRvRXF1YWxUeXBlT2Y8eyBuYW1lOiBzdHJpbmcgfT4oKTtcbiAgICB9KTtcblxuICAgIGl0KFwi66Gc642U66W8IO2PrO2VqO2VnCBTdWJzZXQg6rKw6rO866W8IOy2lOuhoO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICAvLyBTdWJzZXRRdWVyeVxuICAgICAgdHlwZSBTdWJzZXRGbkEgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgY29tcGFueV9faWQ6IG51bWJlcjtcbiAgICAgICAgY29tcGFueV9fbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19pZDogbnVtYmVyO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgQ29tcGFueURlcGFydG1lbnRzTG9hZGVyID0ge1xuICAgICAgICBhczogXCJjb21wYW55X19kZXBhcnRtZW50c1wiO1xuICAgICAgICByZWZJZDogXCJjb21wYW55X19pZFwiO1xuICAgICAgICBxYjogKFxuICAgICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgICAgfTtcbiAgICAgIHR5cGUgRGVwYXJ0bWVudFByb2plY3RzTG9hZGVyID0ge1xuICAgICAgICBhczogXCJkZXBhcnRtZW50X19wcm9qZWN0c1wiO1xuICAgICAgICByZWZJZDogXCJkZXBhcnRtZW50X19pZFwiO1xuICAgICAgICBxYjogKFxuICAgICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIH07XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtDb21wYW55RGVwYXJ0bWVudHNMb2FkZXIsIERlcGFydG1lbnRQcm9qZWN0c0xvYWRlcl07XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcIkFcIik7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgQToge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgY29tcGFueTogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGRlcGFydG1lbnRzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W10gfTtcbiAgICAgICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcHJvamVjdHM6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9W107XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG5cbiAgICBpdChcIuykkeyyqSDroZzrjZTrpbwg7Y+s7ZWo7ZWcIFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBjb21wYW55X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgQ29tcGFueURlcGFydG1lbnRzTG9hZGVyID0ge1xuICAgICAgICBhczogXCJjb21wYW55X19kZXBhcnRtZW50c1wiO1xuICAgICAgICByZWZJZDogXCJjb21wYW55X19pZFwiO1xuICAgICAgICBxYjogKFxuICAgICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgICAgICBsb2FkZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXM6IFwicHJvamVjdHNcIjtcbiAgICAgICAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICAgICAgICBxYjogKFxuICAgICAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfTtcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW0NvbXBhbnlEZXBhcnRtZW50c0xvYWRlcl07XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgQToge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgY29tcGFueToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgZGVwYXJ0bWVudHM6IHtcbiAgICAgICAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICBwcm9qZWN0czogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH1bXTtcbiAgICAgICAgICAgIH1bXTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCLshJzruIzshYvsnbQg7Jes65+sIOqwnOyduCDqsr3smrBcIiwgKCkgPT4ge1xuICAgIGl0KFwi66Gc642UIOyXhuydtCDquLDrs7ggU3Vic2V0IOqysOqzvOulvCDstpTroaDtlZzri6RcIiwgKCkgPT4ge1xuICAgICAgLy8gU3Vic2V0UXVlcnlcbiAgICAgIHR5cGUgU3Vic2V0Rm5BID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBNb2NrUHVyaTx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZW1haWw6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldEZuUCA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblNTID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBNb2NrUHVyaTx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZW1haWw6IHN0cmluZztcbiAgICAgICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRRdWVyaWVzID0ge1xuICAgICAgICBBOiBTdWJzZXRGbkE7XG4gICAgICAgIFA6IFN1YnNldEZuUDtcbiAgICAgICAgU1M6IFN1YnNldEZuU1M7XG4gICAgICB9O1xuXG4gICAgICAvLyBMb2FkZXJRdWVyeVxuICAgICAgdHlwZSBMb2FkZXJRdWVyaWVzID0ge1xuICAgICAgICBBOiBbXTtcbiAgICAgICAgUDogW107XG4gICAgICAgIFNTOiBbXTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlc3VsdFxuICAgICAgdHlwZSBSZXN1bHQgPSBJbmZlckFsbFN1YnNldHM8U3Vic2V0UXVlcmllcywgTG9hZGVyUXVlcmllcz47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBBOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZzsgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmcgfSB9O1xuICAgICAgICBQOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmcgfSB9O1xuICAgICAgICBTUzogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG5cbiAgICBpdChcIuuhnOuNlOulvCDtj6ztlajtlZwgU3Vic2V0IOqysOqzvOulvCDstpTroaDtlZzri6RcIiwgKCkgPT4ge1xuICAgICAgLy8gU3Vic2V0UXVlcnlcbiAgICAgIHR5cGUgU3Vic2V0Rm5BID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBNb2NrUHVyaTx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZW1haWw6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldEZuUCA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblNTID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBNb2NrUHVyaTx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZW1haWw6IHN0cmluZztcbiAgICAgICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRRdWVyaWVzID0ge1xuICAgICAgICBBOiBTdWJzZXRGbkE7XG4gICAgICAgIFA6IFN1YnNldEZuUDtcbiAgICAgICAgU1M6IFN1YnNldEZuU1M7XG4gICAgICB9O1xuXG4gICAgICAvLyBMb2FkZXJRdWVyeVxuICAgICAgdHlwZSBQcm9qZWN0TG9hZGVyID0ge1xuICAgICAgICBhczogXCJwcm9qZWN0c1wiO1xuICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICBxYjogKFxuICAgICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgbG9hZGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzOiBcInRhZ3NcIjtcbiAgICAgICAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICAgICAgICBxYjogKFxuICAgICAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9O1xuICAgICAgdHlwZSBMb2FkZXJRdWVyaWVzID0ge1xuICAgICAgICBBOiBbUHJvamVjdExvYWRlcl07XG4gICAgICAgIFA6IFtdO1xuICAgICAgICBTUzogW107XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgQToge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgICAgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgICAgICBwcm9qZWN0czoge1xuICAgICAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgICAgICAgdGFnczogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgICAgUDogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgU1M6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG4gICAgICB9PigpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiZXhwZWN0VHlwZU9mIiwiaXQiLCJyZXN1bHQiLCJ0b0VxdWFsVHlwZU9mIiwidG9IYXZlUHJvcGVydHkiLCJBIiwiZGVwYXJ0bWVudCIsImNvbXBhbnkiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsRUFBRUMsWUFBWSxFQUFFQyxFQUFFLFFBQVEsU0FBUztBQVNwREYsU0FBUyxXQUFXO0lBQ2xCRSxHQUFHLGdDQUFnQztRQUlqQyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFDcEM7SUFFQUYsR0FBRywrQkFBK0I7UUFJaEMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBSXBDO0lBRUFGLEdBQUcscUNBQXFDO1FBU3RDLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQU9wQztJQUVBRixHQUFHLG1CQUFtQjtRQVVwQixNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFLcEM7SUFFQUYsR0FBRyxjQUFjO1FBSWYsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBQ3BDO0lBRUFGLEdBQUcsK0JBQStCO1FBUWhDLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUlwQztJQUVBRixHQUFHLG9DQUFvQztRQVNyQyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFLcEM7QUFDRjtBQUVBSixTQUFTLGlCQUFpQjtJQUN4QkUsR0FBRyxzQkFBc0I7UUFldkIsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7SUFDcEM7SUFFQUYsR0FBRyxlQUFlO1FBMkJoQixNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztRQUNwQ0osYUFBYUUsUUFBUUMsYUFBYTtJQUdwQztJQUVBRixHQUFHLGVBQWU7UUF1Q2hCLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztRQUNwQ0osYUFBYUUsUUFBUUMsYUFBYTtJQVNwQztBQUNGO0FBRUFKLFNBQVMsbUJBQW1CO0lBQzFCQSxTQUFTLGVBQWU7UUFDdEJFLEdBQUcsNEJBQTRCO1lBcUI3QixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztZQUNwQ0osYUFBYUUsT0FBT0csQ0FBQyxFQUFFRixhQUFhO1lBS3BDSCxhQUFhRSxPQUFPRyxDQUFDLENBQUNDLFVBQVUsQ0FBQ0MsT0FBTyxFQUFFSixhQUFhO1FBQ3pEO1FBRUFGLEdBQUcsMkJBQTJCO1lBcUM1QixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztZQUNwQ0osYUFBYUUsUUFBUUMsYUFBYTtRQVdwQztRQUVBRixHQUFHLDhCQUE4QjtZQW9DL0IsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBYXBDO0lBQ0Y7SUFFQUosU0FBUyxpQkFBaUI7UUFDeEJFLEdBQUcsNEJBQTRCO1lBbUM3QixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFLcEM7UUFFQUYsR0FBRywyQkFBMkI7WUFxRDVCLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQWdCcEM7SUFDRjtBQUNGIn0=
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXN1YnNldC50ZXN0LWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdFR5cGVPZiwgaXQgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IEh5ZHJhdGUsIEluZmVyQWxsU3Vic2V0cywgTG9hZGVyc1Jlc3VsdCB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5cbi8qKiBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFB1cmkgU3Vic2V0IO2DgOyehSDsi5zsiqTthZzsl5DshJwgYW5566W8IO2XiOyaqe2VqCAqL1xudHlwZSBNb2NrUHVyaTxUPiA9IFB1cmk8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIGFueSwgVD47XG5cbmRlc2NyaWJlKFwiSHlkcmF0ZVwiLCAoKSA9PiB7XG4gIGl0KFwiZmxhdCDqsJ3ssrTrpbwg6re464yA66GcIOycoOyngO2VnOuLpCAoX18g7JeG64qUIOqyveyasClcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjxIeWRyYXRlPElucHV0Pj4oKTtcbiAgfSk7XG5cbiAgaXQoXCLri6jsnbwgZGVwdGjsnZggX18g7YKk66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0geyBpZDogbnVtYmVyOyB1c2VyX19uYW1lOiBzdHJpbmc7IHVzZXJfX2VtYWlsOiBzdHJpbmcgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXI6IHsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nIH07XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLri6TspJEgZGVwdGjsnZggX18g7YKk66W8IOyerOq3gOyggeycvOuhnCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyX19wcm9maWxlX19iaW86IHN0cmluZztcbiAgICAgIHVzZXJfX3Byb2ZpbGVfX2F2YXRhcjogc3RyaW5nO1xuICAgICAgdXNlcl9fbmFtZTogc3RyaW5nO1xuICAgIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgcHJvZmlsZTogeyBiaW86IHN0cmluZzsgYXZhdGFyOiBzdHJpbmcgfTtcbiAgICAgIH07XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLsl6zrn6wg6rSA6rOE66W8IOuPmeyLnOyXkCDsspjrpqztlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcl9faWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX25hbWU6IHN0cmluZztcbiAgICAgIHBvc3RfX2lkOiBudW1iZXI7XG4gICAgICBwb3N0X190aXRsZTogc3RyaW5nO1xuICAgIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9O1xuICAgICAgcG9zdDogeyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nIH07XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLruYgg6rCd7LK066W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHt9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7fT4oKTtcbiAgfSk7XG5cbiAgaXQoXCJudWxsYWJsZSDtlYTrk5zqsIAg7J6I64qUIOykkeyyqSDqsJ3ssrTrpbwg7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0ge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX2lkOiBudW1iZXIgfCBudWxsO1xuICAgICAgdXNlcl9fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcjogeyBpZDogbnVtYmVyIHwgbnVsbDsgbmFtZTogc3RyaW5nIHwgbnVsbCB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi64+Z7J287ZWcIHByZWZpeOulvCDqsIDsp4Qg7Jes65+sIO2VhOuTnOulvCDsmKzrsJTrpbTqsowg6re466O57ZmU7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0ge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX2lkOiBudW1iZXI7XG4gICAgICB1c2VyX19uYW1lOiBzdHJpbmc7XG4gICAgICB1c2VyX2NvdW50OiBudW1iZXI7XG4gICAgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXI6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH07XG4gICAgICB1c2VyX2NvdW50OiBudW1iZXI7XG4gICAgfT4oKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJMb2FkZXJzUmVzdWx0XCIsICgpID0+IHtcbiAgaXQoXCLri6jsnbwg66Gc642U7J2YIOqysOqzvCDtg4DsnoXsnYQg7IOd7ISx7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIE1vY2tMb2FkZXJRYiA9IChcbiAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgZnJvbUlkczogbnVtYmVyW10gfCBzdHJpbmdbXSxcbiAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcblxuICAgIHR5cGUgTG9hZGVycyA9IFtcbiAgICAgIHtcbiAgICAgICAgYXM6IFwicG9zdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgcWI6IE1vY2tMb2FkZXJRYjtcbiAgICAgIH0sXG4gICAgXTtcbiAgICB0eXBlIFJlc3VsdCA9IExvYWRlcnNSZXN1bHQ8TG9hZGVycz47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJwb3N0c1wiKTtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHsgcG9zdHM6IHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZyB9W10gfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLspJHssqkg66Gc642U66W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBDb21tZW50TG9hZGVyUWIgPSAoXG4gICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgIGZyb21JZHM6IG51bWJlcltdIHwgc3RyaW5nW10sXG4gICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IGNvbnRlbnQ6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcblxuICAgIHR5cGUgUG9zdExvYWRlclFiID0gKFxuICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuXG4gICAgdHlwZSBMb2FkZXJzID0gW1xuICAgICAge1xuICAgICAgICBhczogXCJwb3N0c1wiO1xuICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICBxYjogUG9zdExvYWRlclFiO1xuICAgICAgICBsb2FkZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXM6IFwiY29tbWVudHNcIjtcbiAgICAgICAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICAgICAgICBxYjogQ29tbWVudExvYWRlclFiO1xuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9LFxuICAgIF07XG4gICAgdHlwZSBSZXN1bHQgPSBMb2FkZXJzUmVzdWx0PExvYWRlcnM+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwicG9zdHNcIik7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBwb3N0czogeyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyBjb21tZW50czogeyBpZDogbnVtYmVyOyBjb250ZW50OiBzdHJpbmcgfVtdIH1bXTtcbiAgICB9PigpO1xuICB9KTtcblxuICBpdChcIuyXrOufrCDroZzrjZTrpbwg7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIFByb2plY3RMb2FkZXIgPSB7XG4gICAgICBhczogXCJwcm9qZWN0c1wiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICB9O1xuICAgIHR5cGUgRGVwYXJ0bWVudExvYWRlciA9IHtcbiAgICAgIGFzOiBcImRlcGFydG1lbnRcIjtcbiAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICBxYjogKFxuICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgZnJvbUlkczogbnVtYmVyW10gfCBzdHJpbmdbXSxcbiAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGNvbXBhbnlfbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgIH07XG4gICAgdHlwZSBFbXBsb3llZUxvYWRlciA9IHtcbiAgICAgIGFzOiBcImVtcGxveWVlc1wiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IGVtcGxveWVlX251bWJlcjogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgICAgbG9hZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXM6IFwidXNlclwiO1xuICAgICAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICAgICAgcWI6IChcbiAgICAgICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICAgICAgZnJvbUlkczogbnVtYmVyW10gfCBzdHJpbmdbXSxcbiAgICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgdHlwZSBMb2FkZXJzID0gW1Byb2plY3RMb2FkZXIsIERlcGFydG1lbnRMb2FkZXIsIEVtcGxveWVlTG9hZGVyXTtcbiAgICB0eXBlIFJlc3VsdCA9IExvYWRlcnNSZXN1bHQ8TG9hZGVycz47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJwcm9qZWN0c1wiKTtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcImVtcGxveWVlc1wiKTtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcImRlcGFydG1lbnRcIik7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBwcm9qZWN0czogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdO1xuICAgICAgZGVwYXJ0bWVudDogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGNvbXBhbnlfbmFtZTogc3RyaW5nIH1bXTtcbiAgICAgIGVtcGxveWVlczoge1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBlbXBsb3llZV9udW1iZXI6IHN0cmluZztcbiAgICAgICAgdXNlcjogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfVtdO1xuICAgICAgfVtdO1xuICAgIH0+KCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiSW5mZXJBbGxTdWJzZXRzXCIsICgpID0+IHtcbiAgZGVzY3JpYmUoXCLshJzruIzshYvsnbQg7ZWY64KY7J24IOqyveyasFwiLCAoKSA9PiB7XG4gICAgaXQoXCLroZzrjZQg7JeG7J20IOq4sOuzuCBTdWJzZXQg6rKw6rO866W8IOy2lOuhoO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICAvLyBTdWJzZXRRdWVyeVxuICAgICAgdHlwZSBTdWJzZXRGbkEgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgdXNlcl9fbmFtZTogc3RyaW5nO1xuICAgICAgICB1c2VyX19lbWFpbDogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX2NvbXBhbnlfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRRdWVyaWVzID0ge1xuICAgICAgICBBOiBTdWJzZXRGbkE7XG4gICAgICB9O1xuXG4gICAgICAvLyBMb2FkZXJRdWVyeVxuICAgICAgdHlwZSBMb2FkZXJRdWVyaWVzID0ge1xuICAgICAgICBBOiBbXTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlc3VsdFxuICAgICAgdHlwZSBSZXN1bHQgPSBJbmZlckFsbFN1YnNldHM8U3Vic2V0UXVlcmllcywgTG9hZGVyUXVlcmllcz47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwiQVwiKTtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQuQSkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIHVzZXI6IHsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nIH07XG4gICAgICAgIGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nOyBjb21wYW55OiB7IG5hbWU6IHN0cmluZyB9IH07XG4gICAgICB9PigpO1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdC5BLmRlcGFydG1lbnQuY29tcGFueSkudG9FcXVhbFR5cGVPZjx7IG5hbWU6IHN0cmluZyB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLroZzrjZTrpbwg7Y+s7ZWo7ZWcIFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBjb21wYW55X19pZDogbnVtYmVyO1xuICAgICAgICBjb21wYW55X19uYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX2lkOiBudW1iZXI7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRRdWVyaWVzID0ge1xuICAgICAgICBBOiBTdWJzZXRGbkE7XG4gICAgICB9O1xuXG4gICAgICAvLyBMb2FkZXJRdWVyeVxuICAgICAgdHlwZSBDb21wYW55RGVwYXJ0bWVudHNMb2FkZXIgPSB7XG4gICAgICAgIGFzOiBcImNvbXBhbnlfX2RlcGFydG1lbnRzXCI7XG4gICAgICAgIHJlZklkOiBcImNvbXBhbnlfX2lkXCI7XG4gICAgICAgIHFiOiAoXG4gICAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgICAgZnJvbUlkczogbnVtYmVyW10gfCBzdHJpbmdbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIH07XG4gICAgICB0eXBlIERlcGFydG1lbnRQcm9qZWN0c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiZGVwYXJ0bWVudF9fcHJvamVjdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiZGVwYXJ0bWVudF9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIH07XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtDb21wYW55RGVwYXJ0bWVudHNMb2FkZXIsIERlcGFydG1lbnRQcm9qZWN0c0xvYWRlcl07XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcIkFcIik7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgQToge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgY29tcGFueTogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGRlcGFydG1lbnRzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W10gfTtcbiAgICAgICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcHJvamVjdHM6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9W107XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG5cbiAgICBpdChcIuykkeyyqSDroZzrjZTrpbwg7Y+s7ZWo7ZWcIFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBjb21wYW55X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgQ29tcGFueURlcGFydG1lbnRzTG9hZGVyID0ge1xuICAgICAgICBhczogXCJjb21wYW55X19kZXBhcnRtZW50c1wiO1xuICAgICAgICByZWZJZDogXCJjb21wYW55X19pZFwiO1xuICAgICAgICBxYjogKFxuICAgICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdIHwgc3RyaW5nW10sXG4gICAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgIGxvYWRlcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhczogXCJwcm9qZWN0c1wiO1xuICAgICAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgICAgIHFiOiAoXG4gICAgICAgICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuICAgICAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH07XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtDb21wYW55RGVwYXJ0bWVudHNMb2FkZXJdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGRlcGFydG1lbnRzOiB7XG4gICAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgcHJvamVjdHM6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9W107XG4gICAgICAgICAgICB9W107XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwi7ISc67iM7IWL7J20IOyXrOufrCDqsJzsnbgg6rK97JqwXCIsICgpID0+IHtcbiAgICBpdChcIuuhnOuNlCDsl4bsnbQg6riw67O4IFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblAgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0Rm5TUyA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgICBQOiBTdWJzZXRGblA7XG4gICAgICAgIFNTOiBTdWJzZXRGblNTO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW107XG4gICAgICAgIFA6IFtdO1xuICAgICAgICBTUzogW107XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgQTogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgUDogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgU1M6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLroZzrjZTrpbwg7Y+s7ZWo7ZWcIFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblAgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0Rm5TUyA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgICBQOiBTdWJzZXRGblA7XG4gICAgICAgIFNTOiBTdWJzZXRGblNTO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgUHJvamVjdExvYWRlciA9IHtcbiAgICAgICAgYXM6IFwicHJvamVjdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuICAgICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgbG9hZGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzOiBcInRhZ3NcIjtcbiAgICAgICAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICAgICAgICBxYjogKFxuICAgICAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICAgICAgZnJvbUlkczogbnVtYmVyW10gfCBzdHJpbmdbXSxcbiAgICAgICAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH07XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtQcm9qZWN0TG9hZGVyXTtcbiAgICAgICAgUDogW107XG4gICAgICAgIFNTOiBbXTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlc3VsdFxuICAgICAgdHlwZSBSZXN1bHQgPSBJbmZlckFsbFN1YnNldHM8U3Vic2V0UXVlcmllcywgTG9hZGVyUXVlcmllcz47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBBOiB7XG4gICAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgZW1haWw6IHN0cmluZztcbiAgICAgICAgICBkZXBhcnRtZW50OiB7IG5hbWU6IHN0cmluZyB9O1xuICAgICAgICAgIHByb2plY3RzOiB7XG4gICAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICAgICAgICB0YWdzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W107XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgICBQOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmcgfSB9O1xuICAgICAgICBTUzogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJleHBlY3RUeXBlT2YiLCJpdCIsInJlc3VsdCIsInRvRXF1YWxUeXBlT2YiLCJ0b0hhdmVQcm9wZXJ0eSIsIkEiLCJkZXBhcnRtZW50IiwiY29tcGFueSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsUUFBUSxFQUFFQyxZQUFZLEVBQUVDLEVBQUUsUUFBUSxTQUFTO0FBU3BERixTQUFTLFdBQVc7SUFDbEJFLEdBQUcsZ0NBQWdDO1FBSWpDLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUNwQztJQUVBRixHQUFHLCtCQUErQjtRQUloQyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFJcEM7SUFFQUYsR0FBRyxxQ0FBcUM7UUFTdEMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBT3BDO0lBRUFGLEdBQUcsbUJBQW1CO1FBVXBCLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUtwQztJQUVBRixHQUFHLGNBQWM7UUFJZixNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFDcEM7SUFFQUYsR0FBRywrQkFBK0I7UUFRaEMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBSXBDO0lBRUFGLEdBQUcsb0NBQW9DO1FBU3JDLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUtwQztBQUNGO0FBRUFKLFNBQVMsaUJBQWlCO0lBQ3hCRSxHQUFHLHNCQUFzQjtRQWV2QixNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztRQUNwQ0osYUFBYUUsUUFBUUMsYUFBYTtJQUNwQztJQUVBRixHQUFHLGVBQWU7UUEyQmhCLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRQyxhQUFhO0lBR3BDO0lBRUFGLEdBQUcsZUFBZTtRQXVDaEIsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztRQUNwQ0osYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRQyxhQUFhO0lBU3BDO0FBQ0Y7QUFFQUosU0FBUyxtQkFBbUI7SUFDMUJBLFNBQVMsZUFBZTtRQUN0QkUsR0FBRyw0QkFBNEI7WUFxQjdCLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1lBQ3BDSixhQUFhRSxPQUFPRyxDQUFDLEVBQUVGLGFBQWE7WUFLcENILGFBQWFFLE9BQU9HLENBQUMsQ0FBQ0MsVUFBVSxDQUFDQyxPQUFPLEVBQUVKLGFBQWE7UUFDekQ7UUFFQUYsR0FBRywyQkFBMkI7WUFxQzVCLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1lBQ3BDSixhQUFhRSxRQUFRQyxhQUFhO1FBV3BDO1FBRUFGLEdBQUcsOEJBQThCO1lBb0MvQixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFhcEM7SUFDRjtJQUVBSixTQUFTLGlCQUFpQjtRQUN4QkUsR0FBRyw0QkFBNEI7WUFtQzdCLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQUtwQztRQUVBRixHQUFHLDJCQUEyQjtZQXFENUIsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBZ0JwQztJQUNGO0FBQ0YifQ==
@@ -26,7 +26,7 @@ export type ExtractPuriResult<T> = T extends Puri<any, any, infer R> ? R : never
26
26
  * @param qbWrapper - Puri 래퍼
27
27
  * @param fromIds - 부모 레코드 ID 배열
28
28
  */
29
- export type PuriLoaderQbFn = (qbWrapper: PuriWrapper<DatabaseSchemaExtend>, fromIds: number[]) => Puri<any, any, any>;
29
+ export type PuriLoaderQbFn = (qbWrapper: PuriWrapper<DatabaseSchemaExtend>, fromIds: number[] | string[]) => Puri<any, any, any>;
30
30
  /**
31
31
  * 단일 Loader 정의
32
32
  * 1:N 또는 N:M 관계 데이터를 로드하는 설정
@@ -1 +1 @@
1
- {"version":3,"file":"puri-subset.types.d.ts","sourceRoot":"","sources":["../../src/database/puri-subset.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"puri-subset.types.d.ts","sourceRoot":"","sources":["../../src/database/puri-subset.types.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEjG;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAMjF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,SAAS,EAAE,WAAW,CAAC,oBAAoB,CAAC,EAC5C,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,KACzB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEzB;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,EAAE,EAAE,cAAc,CAAC;IACnB,wBAAwB;IACxB,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,UAAU,SAAS,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAMnG;;;GAGG;AACH,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC;AAEzF;;;GAGG;AACH,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE,GACxF,IAAI,GACJ,KAAK,CAAC;AAEV;;;;;;;;;;GAUG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,KAAK,YAAY,CAAC,CAAC,IAAI;KACpB,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,KAAK,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrE,GAAG;KACD,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAC1C,YAAY,CAAC;SACV,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;KACzF,CAAC,CACH;CACF,CAAC;AAMF;;GAEG;AACH,KAAK,mBAAmB,CAAC,SAAS,IAAI,SAAS,SAAS,cAAc,GAClE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GACxE,KAAK,CAAC;AAEV;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,CAAC,QAAQ,SAAS,iBAAiB,EAAE,IAAI,MAAM,CAAC;KACtE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE;CAC9F,CAAC,CAAC;AAEH;;GAEG;AACH,KAAK,WAAW,CAAC,KAAK,EAAE,QAAQ,IAAI,QAAQ,SAAS,iBAAiB,EAAE,GACpE,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,GACvC,KAAK,CAAC;AAMV;;GAEG;AACH,KAAK,sBAAsB,CACzB,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACvD,QAAQ,SAAS,iBAAiB,EAAE,GAAG,SAAS,GAAG,SAAS,IAC1D,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AAErF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,eAAe,CACzB,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,EACxD,UAAU,SAAS,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC,IAC7D;KACD,CAAC,IAAI,MAAM,UAAU,GAAG,sBAAsB,CAC7C,UAAU,CAAC,CAAC,CAAC,EACb,CAAC,SAAS,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CACvD;CACF,CAAC;AAMF;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,QAAQ,GACR,SAAS,GACT,cAAc,GACd,OAAO,GACP,OAAO,GACP,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,SAAS,GACT,UAAU,CAAC"}
@@ -13,4 +13,4 @@
13
13
  * Knex QueryBuilder에서 clear 가능한 statement 목록
14
14
  */ export { };
15
15
 
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXN1YnNldC50eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogUHVyaSBTdWJzZXQg7YOA7J6FIOyLnOyKpO2FnOyXkOyEnCBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5cbi8qKlxuICogUHVyaSBTdWJzZXQg7YOA7J6FIOyLnOyKpO2FnFxuICpcbiAqIFN1YnNldFF1ZXJ57JmAIExvYWRlclF1ZXJ566W8IOq4sOuwmOycvOuhnCDstZzsooUg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlZjripQg7YOA7J6FIOycoO2LuOumrO2LsOuTpC5cbiAqIO2VteyLrCDqsJzrhZA6XG4gKiAtIFN1YnNldFF1ZXJ5OiDquLDrs7gg7L+866asIChqb2luLCBzZWxlY3QpXG4gKiAtIExvYWRlclF1ZXJ5OiAxOk4sIE46TSDqtIDqs4Qg642w7J207YSwIOuhnOuUqVxuICogLSBIeWRyYXRlOiBmbGF07ZWcIOqysOqzvOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmCAo7JiIOiB1c2VyX19uYW1lIOKGkiB7IHVzZXI6IHsgbmFtZSB9IH0pXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBFeHBhbmQgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIOq4sOuzuCDtg4DsnoUg7KCV7J2YXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU3Vic2V0UXVlcnkg7ZWo7IiYIOyLnOq3uOuLiOyymFxuICogUHVyaVdyYXBwZXLrpbwg67Cb7JWEIFB1cmkg7L+866asIOu5jOuNlOulvCDrsJjtmZhcbiAqL1xuZXhwb3J0IHR5cGUgUHVyaVN1YnNldEZuID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBQdXJpPGFueSwgYW55LCBhbnk+O1xuXG4vKipcbiAqIFB1cmkg7J247Iqk7YS07Iqk7JeQ7IScIFRSZXN1bHQg7YOA7J6FIOy2lOy2nFxuICovXG5leHBvcnQgdHlwZSBFeHRyYWN0UHVyaVJlc3VsdDxUPiA9IFQgZXh0ZW5kcyBQdXJpPGFueSwgYW55LCBpbmZlciBSPiA/IFIgOiBuZXZlcjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTG9hZGVyIOq0gOugqCDtg4DsnoVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBMb2FkZXIg7L+866asIOu5jOuNlCDtlajsiJgg7Iuc6re464uI7LKYXG4gKiBAcGFyYW0gcWJXcmFwcGVyIC0gUHVyaSDrnpjtjbxcbiAqIEBwYXJhbSBmcm9tSWRzIC0g67aA66qoIOugiOy9lOuTnCBJRCDrsLDsl7RcbiAqL1xuZXhwb3J0IHR5cGUgUHVyaUxvYWRlclFiRm4gPSAoXG4gIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICBmcm9tSWRzOiBudW1iZXJbXSxcbikgPT4gUHVyaTxhbnksIGFueSwgYW55PjtcblxuLyoqXG4gKiDri6jsnbwgTG9hZGVyIOygleydmFxuICogMTpOIOuYkOuKlCBOOk0g6rSA6rOEIOuNsOydtO2EsOulvCDroZzrk5ztlZjripQg7ISk7KCVXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmVyaWNQdXJpTG9hZGVyID0ge1xuICAvKiog6rKw6rO8IOqwneyytOyXkOyEnCDsgqzsmqntlaAg7ZWE65Oc66qFICovXG4gIGFzOiBzdHJpbmc7XG4gIC8qKiDrtoDrqqgg66CI7L2U65Oc7JmAIOyXsOqysO2VoCDssLjsobAg7ZWE65Oc66qFICovXG4gIHJlZklkOiBzdHJpbmc7XG4gIC8qKiDrjbDsnbTthLAg66Gc65SpIOy/vOumrCDruYzrjZQgKi9cbiAgcWI6IFB1cmlMb2FkZXJRYkZuO1xuICAvKiog7KSR7LKpIOuhnOuNlCAo7J6s6reA7KCBIOuhnOuUqSDsp4Dsm5ApICovXG4gIGxvYWRlcnM/OiBHZW5lcmljUHVyaUxvYWRlcltdO1xufTtcblxuLyoqXG4gKiDrqqjrjbjrs4QgTG9hZGVyIOy/vOumrCDsu6zroInshZhcbiAqIOqwgSBTdWJzZXRLZXnsl5Ag64yA7ZW0IExvYWRlciDrsLDsl7TsnYQg7KCV7J2YXG4gKi9cbmV4cG9ydCB0eXBlIFB1cmlMb2FkZXJRdWVyaWVzPFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmc+ID0gUmVjb3JkPFRTdWJzZXRLZXksIEdlbmVyaWNQdXJpTG9hZGVyW10+O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIeWRyYXRlIO2DgOyehSDsi5zsiqTthZxcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiDqtazrtoTsnpAoX18pIOyVnuu2gOu2hCDstpTstpxcbiAqIEBleGFtcGxlIEV4dHJhY3RIZWFkPFwidXNlcl9fbmFtZVwiPiA9IFwidXNlclwiXG4gKi9cbnR5cGUgRXh0cmFjdEhlYWQ8SyBleHRlbmRzIHN0cmluZz4gPSBLIGV4dGVuZHMgYCR7aW5mZXIgSGVhZH1fXyR7c3RyaW5nfWAgPyBIZWFkIDogbmV2ZXI7XG5cbi8qKlxuICog6rWs67aE7J6QKF9fKSDrkrfrtoDrtoQg7LaU7LacXG4gKiBAZXhhbXBsZSBFeHRyYWN0VGFpbDxcInVzZXJfX3Byb2ZpbGVfX25hbWVcIiwgXCJ1c2VyXCI+ID0gXCJwcm9maWxlX19uYW1lXCJcbiAqL1xudHlwZSBFeHRyYWN0VGFpbDxLIGV4dGVuZHMgc3RyaW5nLCBIZWFkIGV4dGVuZHMgc3RyaW5nPiA9IEsgZXh0ZW5kcyBgJHtIZWFkfV9fJHtpbmZlciBUYWlsfWBcbiAgPyBUYWlsXG4gIDogbmV2ZXI7XG5cbi8qKlxuICogRmxhdCDqsJ3ssrTrpbwg7KSR7LKpIOqwneyytOuhnCDrs4DtmZhcbiAqXG4gKiDrn7Dtg4DsnoQgaHlkcmF0ZSDtlajsiJjsmYAg64+Z7J287ZWcIOuPmeyekeydhCDtg4DsnoUg66CI67Ko7JeQ7IScIOq1rO2YhC5cbiAqIGBfX2DroZwg6rWs67aE65CcIO2CpOulvCDspJHssqkg6rCd7LK0IOq1rOyhsOuhnCDrs4DtmZguXG4gKlxuICogQGV4YW1wbGVcbiAqIHR5cGUgSW5wdXQgPSB7IGlkOiBudW1iZXI7IHVzZXJfX25hbWU6IHN0cmluZzsgdXNlcl9fcHJvZmlsZV9fYmlvOiBzdHJpbmcgfVxuICogdHlwZSBPdXRwdXQgPSBIeWRyYXRlPElucHV0PlxuICogLy8geyBpZDogbnVtYmVyOyB1c2VyOiB7IG5hbWU6IHN0cmluZzsgcHJvZmlsZTogeyBiaW86IHN0cmluZyB9IH0gfVxuICovXG5leHBvcnQgdHlwZSBIeWRyYXRlPFQ+ID0gRXhwYW5kPEh5ZHJhdGVJbm5lcjxUPj47XG50eXBlIEh5ZHJhdGVJbm5lcjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBLIGV4dGVuZHMgYCR7c3RyaW5nfV9fJHtzdHJpbmd9YCA/IG5ldmVyIDogS106IFRbS107XG59ICYge1xuICBbSyBpbiBFeHRyYWN0SGVhZDxrZXlvZiBUICYgc3RyaW5nPl06IEV4cGFuZDxcbiAgICBIeWRyYXRlSW5uZXI8e1xuICAgICAgW1AgaW4ga2V5b2YgVCBhcyBQIGV4dGVuZHMgYCR7S31fXyR7c3RyaW5nfWAgPyBFeHRyYWN0VGFpbDxQICYgc3RyaW5nLCBLPiA6IG5ldmVyXTogVFtQXTtcbiAgICB9PlxuICA+O1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTG9hZGVyIOqysOqzvCDtg4DsnoUg7LaU66GgXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTG9hZGVyIOy/vOumrCDtlajsiJjsl5DshJwg6rKw6rO8IO2DgOyehSDstpTstpwgKHJlZklkIOygnOyZuCwgSHlkcmF0ZSDsoIHsmqkpXG4gKi9cbnR5cGUgRXh0cmFjdExvYWRlclJlc3VsdDxUTG9hZGVyUWI+ID0gVExvYWRlclFiIGV4dGVuZHMgUHVyaUxvYWRlclFiRm5cbiAgPyBFeHBhbmQ8SHlkcmF0ZTxPbWl0PEV4dHJhY3RQdXJpUmVzdWx0PFJldHVyblR5cGU8VExvYWRlclFiPj4sIFwicmVmSWRcIj4+PlxuICA6IG5ldmVyO1xuXG4vKipcbiAqIExvYWRlciDrsLDsl7Tsl5DshJwg6rKw6rO8IOqwneyytCDtg4DsnoUg67mM65OcICjsnqzqt4DsoIHsnLzroZwg7KSR7LKpIGxvYWRlciDsspjrpqwpXG4gKlxuICogQGV4YW1wbGVcbiAqIHR5cGUgTG9hZGVycyA9IFtcbiAqICAgeyBhczogXCJlbXBsb3llZXNcIjsgcmVmSWQ6IFwiaWRcIjsgcWI6IC4uLjsgbG9hZGVyczogW3sgYXM6IFwicHJvamVjdHNcIjsgLi4uIH1dIH1cbiAqIF1cbiAqIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPlxuICogLy8geyBlbXBsb3llZXM6IEFycmF5PHsgLi4uZW1wbG95ZWUgZmllbGRzOyBwcm9qZWN0czogQXJyYXk8Li4uPiB9PiB9XG4gKi9cbmV4cG9ydCB0eXBlIExvYWRlcnNSZXN1bHQ8VExvYWRlcnMgZXh0ZW5kcyBHZW5lcmljUHVyaUxvYWRlcltdPiA9IEV4cGFuZDx7XG4gIFtMIGluIFRMb2FkZXJzW251bWJlcl0gYXMgTFtcImFzXCJdXTogV2l0aExvYWRlcnM8RXh0cmFjdExvYWRlclJlc3VsdDxMW1wicWJcIl0+LCBMW1wibG9hZGVyc1wiXT5bXTtcbn0+O1xuXG4vKipcbiAqIOq4sOuzuCDqsrDqs7zsmYAgTG9hZGVyIOqysOqzvCDrs5HtlalcbiAqL1xudHlwZSBXaXRoTG9hZGVyczxUQmFzZSwgVExvYWRlcnM+ID0gVExvYWRlcnMgZXh0ZW5kcyBHZW5lcmljUHVyaUxvYWRlcltdXG4gID8gRXhwYW5kPFRCYXNlICYgTG9hZGVyc1Jlc3VsdDxUTG9hZGVycz4+XG4gIDogVEJhc2U7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFN1YnNldCDqsrDqs7wg7YOA7J6FIOy2lOuhoFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIOuLqOydvCBTdWJzZXQg7ZWo7IiYICsgTG9hZGVy7JeQ7IScIOy1nOyihSDqsrDqs7wg7YOA7J6FIOy2lOuhoFxuICovXG50eXBlIEluZmVyU3Vic2V0V2l0aExvYWRlcnM8XG4gIFRTdWJzZXRGbiBleHRlbmRzICguLi5hcmdzOiBhbnkpID0+IFB1cmk8YW55LCBhbnksIGFueT4sXG4gIFRMb2FkZXJzIGV4dGVuZHMgR2VuZXJpY1B1cmlMb2FkZXJbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbj4gPSBFeHBhbmQ8SHlkcmF0ZTxXaXRoTG9hZGVyczxFeHRyYWN0UHVyaVJlc3VsdDxSZXR1cm5UeXBlPFRTdWJzZXRGbj4+LCBUTG9hZGVycz4+PjtcblxuLyoqXG4gKiDsoITssrQgU3Vic2V0UXVlcmllcyArIExvYWRlclF1ZXJpZXMg6rCd7LK07JeQ7IScIOyghOyytCDqsrDqs7wg66e1IOyDneyEsVxuICpcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0TWFwIC0gU3Vic2V0IO2VqOyImOuTpOydmCDrqqjsnYwg6rCd7LK0XG4gKiBAdGVtcGxhdGUgVExvYWRlck1hcCAtIExvYWRlciDrsLDsl7Trk6TsnZgg66qo7J2MIOqwneyytFxuICpcbiAqIEBleGFtcGxlXG4gKiB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxcbiAqICAgeyBBOiAoKSA9PiBQdXJpPC4uLj4sIFA6ICgpID0+IFB1cmk8Li4uPiB9LFxuICogICB7IEE6IFsuLi5sb2FkZXJzXSwgUDogW10gfVxuICogPlxuICogLy8geyBBOiBJbmZlcnJlZFR5cGVBOyBQOiBJbmZlcnJlZFR5cGVQIH1cbiAqL1xuZXhwb3J0IHR5cGUgSW5mZXJBbGxTdWJzZXRzPFxuICBUU3Vic2V0TWFwIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueSkgPT4gYW55PixcbiAgVExvYWRlck1hcCBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgR2VuZXJpY1B1cmlMb2FkZXJbXT4+LFxuPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFN1YnNldE1hcF06IEluZmVyU3Vic2V0V2l0aExvYWRlcnM8XG4gICAgVFN1YnNldE1hcFtLXSxcbiAgICBLIGV4dGVuZHMga2V5b2YgVExvYWRlck1hcCA/IFRMb2FkZXJNYXBbS10gOiB1bmRlZmluZWRcbiAgPjtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENsZWFyIOusuFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEtuZXggUXVlcnlCdWlsZGVy7JeQ7IScIGNsZWFyIOqwgOuKpe2VnCBzdGF0ZW1lbnQg66qp66GdXG4gKi9cbmV4cG9ydCB0eXBlIENsZWFyU3RhdGVtZW50cyA9XG4gIHwgXCJ3aXRoXCJcbiAgfCBcInNlbGVjdFwiXG4gIHwgXCJjb2x1bW5zXCJcbiAgfCBcImhpbnRDb21tZW50c1wiXG4gIHwgXCJ3aGVyZVwiXG4gIHwgXCJ1bmlvblwiXG4gIHwgXCJ1c2luZ1wiXG4gIHwgXCJqb2luXCJcbiAgfCBcImdyb3VwXCJcbiAgfCBcIm9yZGVyXCJcbiAgfCBcImhhdmluZ1wiXG4gIHwgXCJsaW1pdFwiXG4gIHwgXCJvZmZzZXRcIlxuICB8IFwiY291bnRlclwiXG4gIHwgXCJjb3VudGVyc1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtGQUFrRixHQUVsRjs7Ozs7Ozs7Q0FRQyxHQW9LRCwrRUFBK0U7QUFDL0UsVUFBVTtBQUNWLCtFQUErRTtBQUUvRTs7Q0FFQyxHQUNELFdBZWUifQ==
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXN1YnNldC50eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogUHVyaSBTdWJzZXQg7YOA7J6FIOyLnOyKpO2FnOyXkOyEnCBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5cbi8qKlxuICogUHVyaSBTdWJzZXQg7YOA7J6FIOyLnOyKpO2FnFxuICpcbiAqIFN1YnNldFF1ZXJ57JmAIExvYWRlclF1ZXJ566W8IOq4sOuwmOycvOuhnCDstZzsooUg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlZjripQg7YOA7J6FIOycoO2LuOumrO2LsOuTpC5cbiAqIO2VteyLrCDqsJzrhZA6XG4gKiAtIFN1YnNldFF1ZXJ5OiDquLDrs7gg7L+866asIChqb2luLCBzZWxlY3QpXG4gKiAtIExvYWRlclF1ZXJ5OiAxOk4sIE46TSDqtIDqs4Qg642w7J207YSwIOuhnOuUqVxuICogLSBIeWRyYXRlOiBmbGF07ZWcIOqysOqzvOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmCAo7JiIOiB1c2VyX19uYW1lIOKGkiB7IHVzZXI6IHsgbmFtZSB9IH0pXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBFeHBhbmQgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIOq4sOuzuCDtg4DsnoUg7KCV7J2YXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU3Vic2V0UXVlcnkg7ZWo7IiYIOyLnOq3uOuLiOyymFxuICogUHVyaVdyYXBwZXLrpbwg67Cb7JWEIFB1cmkg7L+866asIOu5jOuNlOulvCDrsJjtmZhcbiAqL1xuZXhwb3J0IHR5cGUgUHVyaVN1YnNldEZuID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBQdXJpPGFueSwgYW55LCBhbnk+O1xuXG4vKipcbiAqIFB1cmkg7J247Iqk7YS07Iqk7JeQ7IScIFRSZXN1bHQg7YOA7J6FIOy2lOy2nFxuICovXG5leHBvcnQgdHlwZSBFeHRyYWN0UHVyaVJlc3VsdDxUPiA9IFQgZXh0ZW5kcyBQdXJpPGFueSwgYW55LCBpbmZlciBSPiA/IFIgOiBuZXZlcjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTG9hZGVyIOq0gOugqCDtg4DsnoVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBMb2FkZXIg7L+866asIOu5jOuNlCDtlajsiJgg7Iuc6re464uI7LKYXG4gKiBAcGFyYW0gcWJXcmFwcGVyIC0gUHVyaSDrnpjtjbxcbiAqIEBwYXJhbSBmcm9tSWRzIC0g67aA66qoIOugiOy9lOuTnCBJRCDrsLDsl7RcbiAqL1xuZXhwb3J0IHR5cGUgUHVyaUxvYWRlclFiRm4gPSAoXG4gIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuKSA9PiBQdXJpPGFueSwgYW55LCBhbnk+O1xuXG4vKipcbiAqIOuLqOydvCBMb2FkZXIg7KCV7J2YXG4gKiAxOk4g65iQ64qUIE46TSDqtIDqs4Qg642w7J207YSw66W8IOuhnOuTnO2VmOuKlCDshKTsoJVcbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY1B1cmlMb2FkZXIgPSB7XG4gIC8qKiDqsrDqs7wg6rCd7LK07JeQ7IScIOyCrOyaqe2VoCDtlYTrk5zrqoUgKi9cbiAgYXM6IHN0cmluZztcbiAgLyoqIOu2gOuqqCDroIjsvZTrk5zsmYAg7Jew6rKw7ZWgIOywuOyhsCDtlYTrk5zrqoUgKi9cbiAgcmVmSWQ6IHN0cmluZztcbiAgLyoqIOuNsOydtO2EsCDroZzrlKkg7L+866asIOu5jOuNlCAqL1xuICBxYjogUHVyaUxvYWRlclFiRm47XG4gIC8qKiDspJHssqkg66Gc642UICjsnqzqt4DsoIEg66Gc65SpIOyngOybkCkgKi9cbiAgbG9hZGVycz86IEdlbmVyaWNQdXJpTG9hZGVyW107XG59O1xuXG4vKipcbiAqIOuqqOuNuOuzhCBMb2FkZXIg7L+866asIOy7rOugieyFmFxuICog6rCBIFN1YnNldEtleeyXkCDrjIDtlbQgTG9hZGVyIOuwsOyXtOydhCDsoJXsnZhcbiAqL1xuZXhwb3J0IHR5cGUgUHVyaUxvYWRlclF1ZXJpZXM8VFN1YnNldEtleSBleHRlbmRzIHN0cmluZz4gPSBSZWNvcmQ8VFN1YnNldEtleSwgR2VuZXJpY1B1cmlMb2FkZXJbXT47XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEh5ZHJhdGUg7YOA7J6FIOyLnOyKpO2FnFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIOq1rOu2hOyekChfXykg7JWe67aA67aEIOy2lOy2nFxuICogQGV4YW1wbGUgRXh0cmFjdEhlYWQ8XCJ1c2VyX19uYW1lXCI+ID0gXCJ1c2VyXCJcbiAqL1xudHlwZSBFeHRyYWN0SGVhZDxLIGV4dGVuZHMgc3RyaW5nPiA9IEsgZXh0ZW5kcyBgJHtpbmZlciBIZWFkfV9fJHtzdHJpbmd9YCA/IEhlYWQgOiBuZXZlcjtcblxuLyoqXG4gKiDqtazrtoTsnpAoX18pIOuSt+u2gOu2hCDstpTstpxcbiAqIEBleGFtcGxlIEV4dHJhY3RUYWlsPFwidXNlcl9fcHJvZmlsZV9fbmFtZVwiLCBcInVzZXJcIj4gPSBcInByb2ZpbGVfX25hbWVcIlxuICovXG50eXBlIEV4dHJhY3RUYWlsPEsgZXh0ZW5kcyBzdHJpbmcsIEhlYWQgZXh0ZW5kcyBzdHJpbmc+ID0gSyBleHRlbmRzIGAke0hlYWR9X18ke2luZmVyIFRhaWx9YFxuICA/IFRhaWxcbiAgOiBuZXZlcjtcblxuLyoqXG4gKiBGbGF0IOqwneyytOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmFxuICpcbiAqIOufsO2DgOyehCBoeWRyYXRlIO2VqOyImOyZgCDrj5nsnbztlZwg64+Z7J6R7J2EIO2DgOyehSDroIjrsqjsl5DshJwg6rWs7ZiELlxuICogYF9fYOuhnCDqtazrtoTrkJwg7YKk66W8IOykkeyyqSDqsJ3ssrQg6rWs7KGw66GcIOuzgO2ZmC5cbiAqXG4gKiBAZXhhbXBsZVxuICogdHlwZSBJbnB1dCA9IHsgaWQ6IG51bWJlcjsgdXNlcl9fbmFtZTogc3RyaW5nOyB1c2VyX19wcm9maWxlX19iaW86IHN0cmluZyB9XG4gKiB0eXBlIE91dHB1dCA9IEh5ZHJhdGU8SW5wdXQ+XG4gKiAvLyB7IGlkOiBudW1iZXI7IHVzZXI6IHsgbmFtZTogc3RyaW5nOyBwcm9maWxlOiB7IGJpbzogc3RyaW5nIH0gfSB9XG4gKi9cbmV4cG9ydCB0eXBlIEh5ZHJhdGU8VD4gPSBFeHBhbmQ8SHlkcmF0ZUlubmVyPFQ+PjtcbnR5cGUgSHlkcmF0ZUlubmVyPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgJHtzdHJpbmd9X18ke3N0cmluZ31gID8gbmV2ZXIgOiBLXTogVFtLXTtcbn0gJiB7XG4gIFtLIGluIEV4dHJhY3RIZWFkPGtleW9mIFQgJiBzdHJpbmc+XTogRXhwYW5kPFxuICAgIEh5ZHJhdGVJbm5lcjx7XG4gICAgICBbUCBpbiBrZXlvZiBUIGFzIFAgZXh0ZW5kcyBgJHtLfV9fJHtzdHJpbmd9YCA/IEV4dHJhY3RUYWlsPFAgJiBzdHJpbmcsIEs+IDogbmV2ZXJdOiBUW1BdO1xuICAgIH0+XG4gID47XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMb2FkZXIg6rKw6rO8IO2DgOyehSDstpTroaBcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBMb2FkZXIg7L+866asIO2VqOyImOyXkOyEnCDqsrDqs7wg7YOA7J6FIOy2lOy2nCAocmVmSWQg7KCc7Jm4LCBIeWRyYXRlIOyggeyaqSlcbiAqL1xudHlwZSBFeHRyYWN0TG9hZGVyUmVzdWx0PFRMb2FkZXJRYj4gPSBUTG9hZGVyUWIgZXh0ZW5kcyBQdXJpTG9hZGVyUWJGblxuICA/IEV4cGFuZDxIeWRyYXRlPE9taXQ8RXh0cmFjdFB1cmlSZXN1bHQ8UmV0dXJuVHlwZTxUTG9hZGVyUWI+PiwgXCJyZWZJZFwiPj4+XG4gIDogbmV2ZXI7XG5cbi8qKlxuICogTG9hZGVyIOuwsOyXtOyXkOyEnCDqsrDqs7wg6rCd7LK0IO2DgOyehSDruYzrk5wgKOyerOq3gOyggeycvOuhnCDspJHssqkgbG9hZGVyIOyymOumrClcbiAqXG4gKiBAZXhhbXBsZVxuICogdHlwZSBMb2FkZXJzID0gW1xuICogICB7IGFzOiBcImVtcGxveWVlc1wiOyByZWZJZDogXCJpZFwiOyBxYjogLi4uOyBsb2FkZXJzOiBbeyBhczogXCJwcm9qZWN0c1wiOyAuLi4gfV0gfVxuICogXVxuICogdHlwZSBSZXN1bHQgPSBMb2FkZXJzUmVzdWx0PExvYWRlcnM+XG4gKiAvLyB7IGVtcGxveWVlczogQXJyYXk8eyAuLi5lbXBsb3llZSBmaWVsZHM7IHByb2plY3RzOiBBcnJheTwuLi4+IH0+IH1cbiAqL1xuZXhwb3J0IHR5cGUgTG9hZGVyc1Jlc3VsdDxUTG9hZGVycyBleHRlbmRzIEdlbmVyaWNQdXJpTG9hZGVyW10+ID0gRXhwYW5kPHtcbiAgW0wgaW4gVExvYWRlcnNbbnVtYmVyXSBhcyBMW1wiYXNcIl1dOiBXaXRoTG9hZGVyczxFeHRyYWN0TG9hZGVyUmVzdWx0PExbXCJxYlwiXT4sIExbXCJsb2FkZXJzXCJdPltdO1xufT47XG5cbi8qKlxuICog6riw67O4IOqysOqzvOyZgCBMb2FkZXIg6rKw6rO8IOuzke2VqVxuICovXG50eXBlIFdpdGhMb2FkZXJzPFRCYXNlLCBUTG9hZGVycz4gPSBUTG9hZGVycyBleHRlbmRzIEdlbmVyaWNQdXJpTG9hZGVyW11cbiAgPyBFeHBhbmQ8VEJhc2UgJiBMb2FkZXJzUmVzdWx0PFRMb2FkZXJzPj5cbiAgOiBUQmFzZTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3Vic2V0IOqysOqzvCDtg4DsnoUg7LaU66GgXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog64uo7J28IFN1YnNldCDtlajsiJggKyBMb2FkZXLsl5DshJwg7LWc7KKFIOqysOqzvCDtg4DsnoUg7LaU66GgXG4gKi9cbnR5cGUgSW5mZXJTdWJzZXRXaXRoTG9hZGVyczxcbiAgVFN1YnNldEZuIGV4dGVuZHMgKC4uLmFyZ3M6IGFueSkgPT4gUHVyaTxhbnksIGFueSwgYW55PixcbiAgVExvYWRlcnMgZXh0ZW5kcyBHZW5lcmljUHVyaUxvYWRlcltdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuPiA9IEV4cGFuZDxIeWRyYXRlPFdpdGhMb2FkZXJzPEV4dHJhY3RQdXJpUmVzdWx0PFJldHVyblR5cGU8VFN1YnNldEZuPj4sIFRMb2FkZXJzPj4+O1xuXG4vKipcbiAqIOyghOyytCBTdWJzZXRRdWVyaWVzICsgTG9hZGVyUXVlcmllcyDqsJ3ssrTsl5DshJwg7KCE7LK0IOqysOqzvCDrp7Ug7IOd7ISxXG4gKlxuICogQHRlbXBsYXRlIFRTdWJzZXRNYXAgLSBTdWJzZXQg7ZWo7IiY65Ok7J2YIOuqqOydjCDqsJ3ssrRcbiAqIEB0ZW1wbGF0ZSBUTG9hZGVyTWFwIC0gTG9hZGVyIOuwsOyXtOuTpOydmCDrqqjsnYwg6rCd7LK0XG4gKlxuICogQGV4YW1wbGVcbiAqIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFxuICogICB7IEE6ICgpID0+IFB1cmk8Li4uPiwgUDogKCkgPT4gUHVyaTwuLi4+IH0sXG4gKiAgIHsgQTogWy4uLmxvYWRlcnNdLCBQOiBbXSB9XG4gKiA+XG4gKiAvLyB7IEE6IEluZmVycmVkVHlwZUE7IFA6IEluZmVycmVkVHlwZVAgfVxuICovXG5leHBvcnQgdHlwZSBJbmZlckFsbFN1YnNldHM8XG4gIFRTdWJzZXRNYXAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogYW55KSA9PiBhbnk+LFxuICBUTG9hZGVyTWFwIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBHZW5lcmljUHVyaUxvYWRlcltdPj4sXG4+ID0ge1xuICBbSyBpbiBrZXlvZiBUU3Vic2V0TWFwXTogSW5mZXJTdWJzZXRXaXRoTG9hZGVyczxcbiAgICBUU3Vic2V0TWFwW0tdLFxuICAgIEsgZXh0ZW5kcyBrZXlvZiBUTG9hZGVyTWFwID8gVExvYWRlck1hcFtLXSA6IHVuZGVmaW5lZFxuICA+O1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ2xlYXIg66y4XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogS25leCBRdWVyeUJ1aWxkZXLsl5DshJwgY2xlYXIg6rCA64ql7ZWcIHN0YXRlbWVudCDrqqnroZ1cbiAqL1xuZXhwb3J0IHR5cGUgQ2xlYXJTdGF0ZW1lbnRzID1cbiAgfCBcIndpdGhcIlxuICB8IFwic2VsZWN0XCJcbiAgfCBcImNvbHVtbnNcIlxuICB8IFwiaGludENvbW1lbnRzXCJcbiAgfCBcIndoZXJlXCJcbiAgfCBcInVuaW9uXCJcbiAgfCBcInVzaW5nXCJcbiAgfCBcImpvaW5cIlxuICB8IFwiZ3JvdXBcIlxuICB8IFwib3JkZXJcIlxuICB8IFwiaGF2aW5nXCJcbiAgfCBcImxpbWl0XCJcbiAgfCBcIm9mZnNldFwiXG4gIHwgXCJjb3VudGVyXCJcbiAgfCBcImNvdW50ZXJzXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0ZBQWtGLEdBRWxGOzs7Ozs7OztDQVFDLEdBb0tELCtFQUErRTtBQUMvRSxVQUFVO0FBQ1YsK0VBQStFO0FBRS9FOztDQUVDLEdBQ0QsV0FlZSJ9
@@ -207,9 +207,13 @@ export declare class WhereGroup<TTables extends Record<string, any>> {
207
207
  where(conditions: WhereCondition<TTables>): this;
208
208
  where<TColumn extends AvailableColumns<TTables>>(column: TColumn, value: ExtractColumnType<TTables, TColumn & string>): this;
209
209
  where<TColumn extends AvailableColumns<TTables>>(column: TColumn, operator: WhereOperator, value: ExtractColumnType<TTables, TColumn & string>): this;
210
+ whereIn<TColumn extends AvailableColumns<TTables>>(column: TColumn, values: ExtractColumnType<TTables, TColumn & string>[]): this;
211
+ whereNotIn<TColumn extends AvailableColumns<TTables>>(column: TColumn, values: ExtractColumnType<TTables, TColumn & string>[]): this;
210
212
  orWhere(conditions: WhereCondition<TTables>): this;
211
213
  orWhere<TColumn extends AvailableColumns<TTables>>(column: TColumn, value: ExtractColumnType<TTables, TColumn & string>): this;
212
214
  orWhere<TColumn extends AvailableColumns<TTables>>(column: TColumn, operator: WhereOperator, value: ExtractColumnType<TTables, TColumn & string>): this;
215
+ orWhereIn<TColumn extends AvailableColumns<TTables>>(column: TColumn, values: ExtractColumnType<TTables, TColumn & string>[]): this;
216
+ orWhereNotIn<TColumn extends AvailableColumns<TTables>>(column: TColumn, values: ExtractColumnType<TTables, TColumn & string>[]): this;
213
217
  whereGroup(callback: (g: WhereGroup<TTables>) => void): this;
214
218
  orWhereGroup(callback: (g: WhereGroup<TTables>) => void): this;
215
219
  }