dbctx 1.5.0 → 2.0.1

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 (141) hide show
  1. package/dist/app/assemble.d.mts.map +1 -1
  2. package/dist/app/assemble.mjs +20 -4
  3. package/dist/app/list.d.mts +4 -0
  4. package/dist/app/list.d.mts.map +1 -0
  5. package/dist/app/list.mjs +93 -0
  6. package/dist/app/load-introspection.d.mts +26 -0
  7. package/dist/app/load-introspection.d.mts.map +1 -0
  8. package/dist/app/load-introspection.mjs +89 -0
  9. package/dist/app/login.d.mts +2 -0
  10. package/dist/app/login.d.mts.map +1 -0
  11. package/dist/app/login.mjs +69 -0
  12. package/dist/app/open-url.d.mts +2 -0
  13. package/dist/app/open-url.d.mts.map +1 -1
  14. package/dist/app/open-url.mjs +8 -3
  15. package/dist/app/sample.d.mts +24 -0
  16. package/dist/app/sample.d.mts.map +1 -0
  17. package/dist/app/sample.mjs +257 -0
  18. package/dist/app/session.d.mts +1 -0
  19. package/dist/app/session.d.mts.map +1 -1
  20. package/dist/app/session.mjs +44 -4
  21. package/dist/app/tail.d.mts +13 -0
  22. package/dist/app/tail.d.mts.map +1 -0
  23. package/dist/app/tail.mjs +168 -0
  24. package/dist/db/check-constraints.d.mts +9 -0
  25. package/dist/db/check-constraints.d.mts.map +1 -0
  26. package/dist/db/check-constraints.mjs +17 -0
  27. package/dist/db/custom-types.d.mts +26 -0
  28. package/dist/db/custom-types.d.mts.map +1 -0
  29. package/dist/db/custom-types.mjs +61 -0
  30. package/dist/db/extensions.d.mts +8 -0
  31. package/dist/db/extensions.d.mts.map +1 -0
  32. package/dist/db/extensions.mjs +14 -0
  33. package/dist/db/functions.d.mts +11 -0
  34. package/dist/db/functions.d.mts.map +1 -0
  35. package/dist/db/functions.mjs +23 -0
  36. package/dist/db/index.d.mts +9 -0
  37. package/dist/db/index.d.mts.map +1 -1
  38. package/dist/db/index.mjs +10 -1
  39. package/dist/db/planner-stats.d.mts +33 -0
  40. package/dist/db/planner-stats.d.mts.map +1 -0
  41. package/dist/db/planner-stats.mjs +103 -0
  42. package/dist/db/rls.d.mts +21 -0
  43. package/dist/db/rls.d.mts.map +1 -0
  44. package/dist/db/rls.mjs +48 -0
  45. package/dist/db/sample.d.mts +16 -0
  46. package/dist/db/sample.d.mts.map +1 -0
  47. package/dist/db/sample.mjs +73 -0
  48. package/dist/db/sequences.d.mts +15 -0
  49. package/dist/db/sequences.d.mts.map +1 -0
  50. package/dist/db/sequences.mjs +31 -0
  51. package/dist/db/triggers.d.mts +11 -0
  52. package/dist/db/triggers.d.mts.map +1 -0
  53. package/dist/db/triggers.mjs +21 -0
  54. package/dist/flow/events.d.mts +115 -0
  55. package/dist/flow/events.d.mts.map +1 -0
  56. package/dist/flow/events.mjs +2 -0
  57. package/dist/flow/interpreter.d.mts +21 -0
  58. package/dist/flow/interpreter.d.mts.map +1 -0
  59. package/dist/flow/interpreter.mjs +605 -0
  60. package/dist/flow/projection.d.mts +17 -0
  61. package/dist/flow/projection.d.mts.map +1 -0
  62. package/dist/flow/projection.mjs +83 -0
  63. package/dist/flow/projection.test.d.mts +2 -0
  64. package/dist/flow/projection.test.d.mts.map +1 -0
  65. package/dist/flow/projection.test.mjs +162 -0
  66. package/dist/flow/reducer.d.mts +5 -0
  67. package/dist/flow/reducer.d.mts.map +1 -0
  68. package/dist/flow/reducer.mjs +306 -0
  69. package/dist/flow/reducer.test.d.mts +2 -0
  70. package/dist/flow/reducer.test.d.mts.map +1 -0
  71. package/dist/flow/reducer.test.mjs +479 -0
  72. package/dist/flow/run.d.mts +3 -0
  73. package/dist/flow/run.d.mts.map +1 -0
  74. package/dist/flow/run.mjs +89 -0
  75. package/dist/flow/states.d.mts +54 -0
  76. package/dist/flow/states.d.mts.map +1 -0
  77. package/dist/flow/states.mjs +39 -0
  78. package/dist/index.d.mts +7 -1
  79. package/dist/index.d.mts.map +1 -1
  80. package/dist/index.mjs +112 -13
  81. package/dist/lib/atomic-write.d.mts +4 -0
  82. package/dist/lib/atomic-write.d.mts.map +1 -0
  83. package/dist/lib/atomic-write.mjs +75 -0
  84. package/dist/lib/stream-job.d.mts +19 -0
  85. package/dist/lib/stream-job.d.mts.map +1 -0
  86. package/dist/lib/stream-job.mjs +55 -0
  87. package/dist/lib/trpc-url.mjs +2 -2
  88. package/dist/lib/trpc.mjs +2 -2
  89. package/dist/logger.d.mts.map +1 -1
  90. package/dist/logger.mjs +6 -3
  91. package/dist/providers/TrpcProvider.js +3 -3
  92. package/dist/store.d.mts +95 -2
  93. package/dist/store.d.mts.map +1 -1
  94. package/dist/store.mjs +64 -1
  95. package/dist/ui/App.d.ts +1 -1
  96. package/dist/ui/App.d.ts.map +1 -1
  97. package/dist/ui/App.js +22 -4
  98. package/dist/ui/components/Analyze.d.ts +10 -0
  99. package/dist/ui/components/Analyze.d.ts.map +1 -0
  100. package/dist/ui/components/Analyze.js +54 -0
  101. package/dist/ui/components/Billing.d.ts +10 -0
  102. package/dist/ui/components/Billing.d.ts.map +1 -0
  103. package/dist/ui/components/Billing.js +40 -0
  104. package/dist/ui/components/DB.d.ts.map +1 -1
  105. package/dist/ui/components/DB.js +2 -2
  106. package/dist/ui/components/DatabasePicker.d.ts +13 -0
  107. package/dist/ui/components/DatabasePicker.d.ts.map +1 -0
  108. package/dist/ui/components/DatabasePicker.js +79 -0
  109. package/dist/ui/components/Enrich.d.ts +10 -0
  110. package/dist/ui/components/Enrich.d.ts.map +1 -0
  111. package/dist/ui/components/Enrich.js +41 -0
  112. package/dist/ui/components/Gate.js +2 -2
  113. package/dist/ui/components/Introspect.d.ts.map +1 -1
  114. package/dist/ui/components/Introspect.js +2 -2
  115. package/dist/ui/components/IntrospectionUpload.d.ts +10 -0
  116. package/dist/ui/components/IntrospectionUpload.d.ts.map +1 -0
  117. package/dist/ui/components/IntrospectionUpload.js +30 -0
  118. package/dist/ui/components/Login.d.ts +19 -0
  119. package/dist/ui/components/Login.d.ts.map +1 -0
  120. package/dist/ui/components/Login.js +38 -0
  121. package/dist/ui/components/OutputJson.d.ts.map +1 -1
  122. package/dist/ui/components/OutputJson.js +2 -2
  123. package/dist/ui/components/SSH.d.ts.map +1 -1
  124. package/dist/ui/components/SSH.js +2 -2
  125. package/dist/ui/components/SamplesUpload.d.ts +10 -0
  126. package/dist/ui/components/SamplesUpload.d.ts.map +1 -0
  127. package/dist/ui/components/SamplesUpload.js +24 -0
  128. package/dist/ui/components/Sampling.d.ts +10 -0
  129. package/dist/ui/components/Sampling.d.ts.map +1 -0
  130. package/dist/ui/components/Sampling.js +58 -0
  131. package/dist/ui/components/Session.d.ts.map +1 -1
  132. package/dist/ui/components/Session.js +4 -4
  133. package/dist/ui/components/Spinner.d.ts.map +1 -1
  134. package/dist/ui/components/Spinner.js +17 -5
  135. package/dist/validatePaths.d.mts +1 -1
  136. package/dist/validatePaths.d.mts.map +1 -1
  137. package/dist/validatePaths.mjs +5 -1
  138. package/package.json +7 -7
  139. package/dist/app/index.d.mts +0 -3
  140. package/dist/app/index.d.mts.map +0 -1
  141. package/dist/app/index.mjs +0 -156
@@ -0,0 +1,306 @@
1
+ import { initialPostIntrospection, } from './states.mjs';
2
+ // Pure reducer: (state, event) → state. Exhaustive switch over the
3
+ // discriminated union so TypeScript catches missing cases at compile time.
4
+ // Unrelated events (event kinds that don't apply to the current phase or
5
+ // sub-status) return state unchanged — pinned by the no-op invariant test.
6
+ const setError = (state, phase, message) => ({
7
+ ...state,
8
+ phase: 'error',
9
+ errorPhase: phase,
10
+ errorMessage: message,
11
+ });
12
+ const stopAfterReached = (state) => ({
13
+ ...state,
14
+ phase: 'done',
15
+ });
16
+ export const reduce = (state, event) => {
17
+ // Side-channel: post-introspection progress can fire in any phase
18
+ // post-`ingesting-introspection`. Update the sub-status without changing
19
+ // primary phase.
20
+ if (event.kind === 'post-introspection-progress') {
21
+ return {
22
+ ...state,
23
+ postIntrospection: {
24
+ ...state.postIntrospection,
25
+ state: 'running',
26
+ stage: event.stage,
27
+ tokensIn: event.tokensIn,
28
+ tokensOut: event.tokensOut,
29
+ columnsDone: event.columnsDone,
30
+ columnsTotal: event.columnsTotal,
31
+ },
32
+ };
33
+ }
34
+ if (event.kind === 'post-introspection-completed') {
35
+ return {
36
+ ...state,
37
+ postIntrospection: {
38
+ ...state.postIntrospection,
39
+ state: 'done',
40
+ },
41
+ };
42
+ }
43
+ if (event.kind === 'post-introspection-failed') {
44
+ return {
45
+ ...state,
46
+ postIntrospection: {
47
+ ...state.postIntrospection,
48
+ state: 'error',
49
+ error: event.error,
50
+ },
51
+ };
52
+ }
53
+ // Stop-after is the same shape regardless of phase: enter terminal `done`.
54
+ if (event.kind === 'stop-after-reached') {
55
+ return stopAfterReached(state);
56
+ }
57
+ // ── phase-specific transitions ──────────────────────────────────
58
+ if (state.phase === 'idle') {
59
+ if (event.kind === 'start') {
60
+ return {
61
+ ...state,
62
+ phase: state.sshEnabled ? 'connecting-ssh' : 'connecting-db',
63
+ };
64
+ }
65
+ return state;
66
+ }
67
+ if (state.phase === 'connecting-ssh') {
68
+ if (event.kind === 'ssh-connected' || event.kind === 'ssh-not-needed') {
69
+ return state.stopAfter === 'ssh-connect'
70
+ ? stopAfterReached(state)
71
+ : { ...state, phase: 'connecting-db' };
72
+ }
73
+ if (event.kind === 'ssh-failed') {
74
+ return setError(state, 'connecting-ssh', event.error);
75
+ }
76
+ return state;
77
+ }
78
+ if (state.phase === 'connecting-db') {
79
+ if (event.kind === 'db-connected') {
80
+ return state.stopAfter === 'db-connect'
81
+ ? stopAfterReached(state)
82
+ : { ...state, phase: 'introspecting' };
83
+ }
84
+ if (event.kind === 'db-failed') {
85
+ return setError(state, 'connecting-db', event.error);
86
+ }
87
+ return state;
88
+ }
89
+ if (state.phase === 'introspecting') {
90
+ if (event.kind === 'introspection-loaded') {
91
+ // Output JSON write is a sub-step before stop-after-introspection.
92
+ return state.outputJSONPath !== null
93
+ ? { ...state, phase: 'output-json' }
94
+ : state.stopAfter === 'introspection'
95
+ ? stopAfterReached(state)
96
+ : { ...state, phase: 'creating-session' };
97
+ }
98
+ if (event.kind === 'introspection-failed') {
99
+ return setError(state, 'introspecting', event.error);
100
+ }
101
+ return state;
102
+ }
103
+ if (state.phase === 'output-json') {
104
+ if (event.kind === 'output-json-written' ||
105
+ event.kind === 'output-json-skipped' ||
106
+ event.kind === 'output-json-not-requested') {
107
+ return state.stopAfter === 'introspection'
108
+ ? stopAfterReached(state)
109
+ : { ...state, phase: 'creating-session' };
110
+ }
111
+ if (event.kind === 'output-json-failed') {
112
+ return setError(state, 'output-json', event.error);
113
+ }
114
+ return state;
115
+ }
116
+ if (state.phase === 'creating-session') {
117
+ if (event.kind === 'session-created') {
118
+ return {
119
+ ...state,
120
+ sessionId: event.sessionId,
121
+ phase: 'awaiting-authorization',
122
+ };
123
+ }
124
+ if (event.kind === 'fast-path-completed') {
125
+ return {
126
+ ...state,
127
+ sessionId: event.sessionId,
128
+ authToken: event.token,
129
+ phase: state.explanation !== null
130
+ ? 'preflight-checking'
131
+ : 'awaiting-explanation',
132
+ };
133
+ }
134
+ if (event.kind === 'auth-not-needed') {
135
+ // No server-side flow at all — proceed straight to terminal.
136
+ return stopAfterReached(state);
137
+ }
138
+ if (event.kind === 'session-failed') {
139
+ return setError(state, 'creating-session', event.error);
140
+ }
141
+ return state;
142
+ }
143
+ if (state.phase === 'awaiting-authorization') {
144
+ if (event.kind === 'auth-confirmed') {
145
+ return {
146
+ ...state,
147
+ authToken: event.token,
148
+ phase: state.explanation !== null
149
+ ? 'preflight-checking'
150
+ : 'awaiting-explanation',
151
+ };
152
+ }
153
+ if (event.kind === 'auth-failed') {
154
+ return setError(state, 'awaiting-authorization', event.error);
155
+ }
156
+ return state;
157
+ }
158
+ if (state.phase === 'awaiting-explanation') {
159
+ if (event.kind === 'explanation-given') {
160
+ return {
161
+ ...state,
162
+ explanation: event.value,
163
+ phase: 'preflight-checking',
164
+ };
165
+ }
166
+ return state;
167
+ }
168
+ if (state.phase === 'preflight-checking') {
169
+ if (event.kind === 'check-introspection-hit') {
170
+ // Reused revision: skip ingest entirely. Post-introspection state
171
+ // depends on whether the server returned a job id.
172
+ return {
173
+ ...state,
174
+ revisionId: event.revisionId,
175
+ samplesAlreadyIngested: event.samplesExist,
176
+ tablesNeedingSamples: event.tablesNeedingSamples,
177
+ preflightHit: true,
178
+ postIntrospection: {
179
+ ...state.postIntrospection,
180
+ jobId: event.postIntrospectionJobId,
181
+ state: event.postIntrospectionJobId === null
182
+ ? 'done'
183
+ : 'queued',
184
+ reused: event.postIntrospectionJobId === null,
185
+ },
186
+ phase: event.samplesExist
187
+ ? 'awaiting-post-sampling'
188
+ : 'sampling-mask-resolving',
189
+ };
190
+ }
191
+ if (event.kind === 'check-introspection-miss') {
192
+ return { ...state, phase: 'ingesting-introspection' };
193
+ }
194
+ if (event.kind === 'ingest-failed') {
195
+ return setError(state, 'preflight-checking', event.error);
196
+ }
197
+ return state;
198
+ }
199
+ if (state.phase === 'ingesting-introspection') {
200
+ if (event.kind === 'introspection-ingested') {
201
+ return {
202
+ ...state,
203
+ revisionId: event.revisionId,
204
+ samplesAlreadyIngested: event.samplesExist,
205
+ tablesNeedingSamples: event.tablesNeedingSamples,
206
+ postIntrospection: {
207
+ ...state.postIntrospection,
208
+ jobId: event.postIntrospectionJobId,
209
+ state: event.postIntrospectionJobId === null
210
+ ? 'done'
211
+ : 'queued',
212
+ reused: event.postIntrospectionJobId === null,
213
+ },
214
+ phase: event.samplesExist
215
+ ? 'awaiting-post-sampling'
216
+ : 'sampling-mask-resolving',
217
+ };
218
+ }
219
+ if (event.kind === 'ingest-failed') {
220
+ return setError(state, 'ingesting-introspection', event.error);
221
+ }
222
+ return state;
223
+ }
224
+ if (state.phase === 'sampling-mask-resolving') {
225
+ if (event.kind === 'mask-loaded') {
226
+ return {
227
+ ...state,
228
+ sampling: { ...state.sampling, mask: event.mask },
229
+ phase: 'sampling',
230
+ };
231
+ }
232
+ if (event.kind === 'mask-fetch-failed') {
233
+ return setError(state, 'sampling-mask-resolving', event.error);
234
+ }
235
+ // Cascade: post-introspection failed while we're still waiting on
236
+ // it for the mask (the side-channel handler above already updated
237
+ // sub-status; primary phase needs to fail too). The interpreter
238
+ // re-dispatches as `mask-fetch-failed` after observing the substate
239
+ // change.
240
+ return state;
241
+ }
242
+ if (state.phase === 'sampling') {
243
+ if (event.kind === 'sample-table-yielded') {
244
+ return {
245
+ ...state,
246
+ sampling: {
247
+ ...state.sampling,
248
+ collected: [...state.sampling.collected, event.event],
249
+ },
250
+ };
251
+ }
252
+ if (event.kind === 'sampling-completed') {
253
+ return state.stopAfter === 'sampling'
254
+ ? stopAfterReached(state)
255
+ : {
256
+ ...state,
257
+ sampling: {
258
+ ...state.sampling,
259
+ totalTables: state.sampling.collected.length,
260
+ },
261
+ phase: 'uploading-samples',
262
+ };
263
+ }
264
+ if (event.kind === 'sampling-failed') {
265
+ return setError(state, 'sampling', event.error);
266
+ }
267
+ return state;
268
+ }
269
+ if (state.phase === 'uploading-samples') {
270
+ if (event.kind === 'sample-chunk-uploaded') {
271
+ return {
272
+ ...state,
273
+ sampling: {
274
+ ...state.sampling,
275
+ uploadedTables: state.sampling.uploadedTables + event.chunkSize,
276
+ },
277
+ };
278
+ }
279
+ if (event.kind === 'samples-upload-completed' ||
280
+ event.kind === 'samples-upload-not-needed') {
281
+ return { ...state, phase: 'awaiting-post-sampling' };
282
+ }
283
+ if (event.kind === 'samples-upload-failed') {
284
+ return setError(state, 'uploading-samples', event.error);
285
+ }
286
+ return state;
287
+ }
288
+ if (state.phase === 'awaiting-post-sampling') {
289
+ if (event.kind === 'post-sampling-completed') {
290
+ return { ...state, phase: 'done' };
291
+ }
292
+ if (event.kind === 'post-sampling-failed') {
293
+ return setError(state, 'awaiting-post-sampling', event.error);
294
+ }
295
+ return state;
296
+ }
297
+ // Terminal phases ignore further events.
298
+ return state;
299
+ };
300
+ // Resets sub-status fields to fresh — useful when the reducer is composed
301
+ // with a higher-level driver that wants a clean slate (tests use this).
302
+ export const cleanPostIntrospection = (state) => ({
303
+ ...state,
304
+ postIntrospection: initialPostIntrospection,
305
+ });
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlci5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJmbG93L3JlZHVjZXIubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDSCx3QkFBd0IsR0FHM0IsTUFBTSxjQUFjLENBQUM7QUFFdEIsbUVBQW1FO0FBQ25FLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsMkVBQTJFO0FBRTNFLE1BQU0sUUFBUSxHQUFHLENBQ2IsS0FBaUIsRUFDakIsS0FBaUIsRUFDakIsT0FBZSxFQUNMLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxLQUFLO0lBQ1IsS0FBSyxFQUFFLE9BQU87SUFDZCxVQUFVLEVBQUUsS0FBSztJQUNqQixZQUFZLEVBQUUsT0FBTztDQUN4QixDQUFDLENBQUM7QUFFSCxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBaUIsRUFBYyxFQUFFLENBQUMsQ0FBQztJQUN6RCxHQUFHLEtBQUs7SUFDUixLQUFLLEVBQUUsTUFBTTtDQUNoQixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEtBQWlCLEVBQWMsRUFBRTtJQUN2RSxrRUFBa0U7SUFDbEUseUVBQXlFO0lBQ3pFLGlCQUFpQjtJQUNqQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssNkJBQTZCLEVBQUUsQ0FBQztRQUMvQyxPQUFPO1lBQ0gsR0FBRyxLQUFLO1lBQ1IsaUJBQWlCLEVBQUU7Z0JBQ2YsR0FBRyxLQUFLLENBQUMsaUJBQWlCO2dCQUMxQixLQUFLLEVBQUUsU0FBUztnQkFDaEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2dCQUNsQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7YUFDbkM7U0FDSixDQUFDO0lBQ04s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QUFDLEtBQUssS0FBSyx3QkFBd0IsRUFBRSxDQUFDO1FBQzNDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyx5QkFBeUIsRUFBRSxDQUFDO1lBQzNDLE9BQU8sRUFBQyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sUUFBUSxDQUFDLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsMEVBQTBFO0FBQzFFLHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWlCLEVBQWMsRUFBRSxDQUFDLENBQUM7SUFDdEUsR0FBRyxLQUFLO0lBQ1IsaUJBQWlCLEVBQUUsd0JBQXdCO0NBQzlDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtURmxvd0V2ZW50fSBmcm9tICcuL2V2ZW50cy5tanMnO1xuaW1wb3J0IHtcbiAgICBpbml0aWFsUG9zdEludHJvc3BlY3Rpb24sXG4gICAgdHlwZSBURmxvd1BoYXNlLFxuICAgIHR5cGUgVEZsb3dTdGF0ZSxcbn0gZnJvbSAnLi9zdGF0ZXMubWpzJztcblxuLy8gUHVyZSByZWR1Y2VyOiAoc3RhdGUsIGV2ZW50KSDihpIgc3RhdGUuIEV4aGF1c3RpdmUgc3dpdGNoIG92ZXIgdGhlXG4vLyBkaXNjcmltaW5hdGVkIHVuaW9uIHNvIFR5cGVTY3JpcHQgY2F0Y2hlcyBtaXNzaW5nIGNhc2VzIGF0IGNvbXBpbGUgdGltZS5cbi8vIFVucmVsYXRlZCBldmVudHMgKGV2ZW50IGtpbmRzIHRoYXQgZG9uJ3QgYXBwbHkgdG8gdGhlIGN1cnJlbnQgcGhhc2Ugb3Jcbi8vIHN1Yi1zdGF0dXMpIHJldHVybiBzdGF0ZSB1bmNoYW5nZWQg4oCUIHBpbm5lZCBieSB0aGUgbm8tb3AgaW52YXJpYW50IHRlc3QuXG5cbmNvbnN0IHNldEVycm9yID0gKFxuICAgIHN0YXRlOiBURmxvd1N0YXRlLFxuICAgIHBoYXNlOiBURmxvd1BoYXNlLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbik6IFRGbG93U3RhdGUgPT4gKHtcbiAgICAuLi5zdGF0ZSxcbiAgICBwaGFzZTogJ2Vycm9yJyxcbiAgICBlcnJvclBoYXNlOiBwaGFzZSxcbiAgICBlcnJvck1lc3NhZ2U6IG1lc3NhZ2UsXG59KTtcblxuY29uc3Qgc3RvcEFmdGVyUmVhY2hlZCA9IChzdGF0ZTogVEZsb3dTdGF0ZSk6IFRGbG93U3RhdGUgPT4gKHtcbiAgICAuLi5zdGF0ZSxcbiAgICBwaGFzZTogJ2RvbmUnLFxufSk7XG5cbmV4cG9ydCBjb25zdCByZWR1Y2UgPSAoc3RhdGU6IFRGbG93U3RhdGUsIGV2ZW50OiBURmxvd0V2ZW50KTogVEZsb3dTdGF0ZSA9PiB7XG4gICAgLy8gU2lkZS1jaGFubmVsOiBwb3N0LWludHJvc3BlY3Rpb24gcHJvZ3Jlc3MgY2FuIGZpcmUgaW4gYW55IHBoYXNlXG4gICAgLy8gcG9zdC1gaW5nZXN0aW5nLWludHJvc3BlY3Rpb25gLiBVcGRhdGUgdGhlIHN1Yi1zdGF0dXMgd2l0aG91dCBjaGFuZ2luZ1xuICAgIC8vIHByaW1hcnkgcGhhc2UuXG4gICAgaWYgKGV2ZW50LmtpbmQgPT09ICdwb3N0LWludHJvc3BlY3Rpb24tcHJvZ3Jlc3MnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHBvc3RJbnRyb3NwZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUucG9zdEludHJvc3BlY3Rpb24sXG4gICAgICAgICAgICAgICAgc3RhdGU6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICBzdGFnZTogZXZlbnQuc3RhZ2UsXG4gICAgICAgICAgICAgICAgdG9rZW5zSW46IGV2ZW50LnRva2Vuc0luLFxuICAgICAgICAgICAgICAgIHRva2Vuc091dDogZXZlbnQudG9rZW5zT3V0LFxuICAgICAgICAgICAgICAgIGNvbHVtbnNEb25lOiBldmVudC5jb2x1bW5zRG9uZSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zVG90YWw6IGV2ZW50LmNvbHVtbnNUb3RhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChldmVudC5raW5kID09PSAncG9zdC1pbnRyb3NwZWN0aW9uLWNvbXBsZXRlZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgcG9zdEludHJvc3BlY3Rpb246IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5wb3N0SW50cm9zcGVjdGlvbixcbiAgICAgICAgICAgICAgICBzdGF0ZTogJ2RvbmUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtpbmQgPT09ICdwb3N0LWludHJvc3BlY3Rpb24tZmFpbGVkJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBwb3N0SW50cm9zcGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnBvc3RJbnRyb3NwZWN0aW9uLFxuICAgICAgICAgICAgICAgIHN0YXRlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGVycm9yOiBldmVudC5lcnJvcixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gU3RvcC1hZnRlciBpcyB0aGUgc2FtZSBzaGFwZSByZWdhcmRsZXNzIG9mIHBoYXNlOiBlbnRlciB0ZXJtaW5hbCBgZG9uZWAuXG4gICAgaWYgKGV2ZW50LmtpbmQgPT09ICdzdG9wLWFmdGVyLXJlYWNoZWQnKSB7XG4gICAgICAgIHJldHVybiBzdG9wQWZ0ZXJSZWFjaGVkKHN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgcGhhc2Utc3BlY2lmaWMgdHJhbnNpdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdpZGxlJykge1xuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBwaGFzZTogc3RhdGUuc3NoRW5hYmxlZCA/ICdjb25uZWN0aW5nLXNzaCcgOiAnY29ubmVjdGluZy1kYicsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdjb25uZWN0aW5nLXNzaCcpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdzc2gtY29ubmVjdGVkJyB8fCBldmVudC5raW5kID09PSAnc3NoLW5vdC1uZWVkZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuc3RvcEFmdGVyID09PSAnc3NoLWNvbm5lY3QnXG4gICAgICAgICAgICAgICAgPyBzdG9wQWZ0ZXJSZWFjaGVkKHN0YXRlKVxuICAgICAgICAgICAgICAgIDogey4uLnN0YXRlLCBwaGFzZTogJ2Nvbm5lY3RpbmctZGInfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3NzaC1mYWlsZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3Ioc3RhdGUsICdjb25uZWN0aW5nLXNzaCcsIGV2ZW50LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnY29ubmVjdGluZy1kYicpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdkYi1jb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuc3RvcEFmdGVyID09PSAnZGItY29ubmVjdCdcbiAgICAgICAgICAgICAgICA/IHN0b3BBZnRlclJlYWNoZWQoc3RhdGUpXG4gICAgICAgICAgICAgICAgOiB7Li4uc3RhdGUsIHBoYXNlOiAnaW50cm9zcGVjdGluZyd9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5raW5kID09PSAnZGItZmFpbGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKHN0YXRlLCAnY29ubmVjdGluZy1kYicsIGV2ZW50LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnaW50cm9zcGVjdGluZycpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdpbnRyb3NwZWN0aW9uLWxvYWRlZCcpIHtcbiAgICAgICAgICAgIC8vIE91dHB1dCBKU09OIHdyaXRlIGlzIGEgc3ViLXN0ZXAgYmVmb3JlIHN0b3AtYWZ0ZXItaW50cm9zcGVjdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5vdXRwdXRKU09OUGF0aCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gey4uLnN0YXRlLCBwaGFzZTogJ291dHB1dC1qc29uJ31cbiAgICAgICAgICAgICAgICA6IHN0YXRlLnN0b3BBZnRlciA9PT0gJ2ludHJvc3BlY3Rpb24nXG4gICAgICAgICAgICAgICAgICA/IHN0b3BBZnRlclJlYWNoZWQoc3RhdGUpXG4gICAgICAgICAgICAgICAgICA6IHsuLi5zdGF0ZSwgcGhhc2U6ICdjcmVhdGluZy1zZXNzaW9uJ307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdpbnRyb3NwZWN0aW9uLWZhaWxlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihzdGF0ZSwgJ2ludHJvc3BlY3RpbmcnLCBldmVudC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gJ291dHB1dC1qc29uJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBldmVudC5raW5kID09PSAnb3V0cHV0LWpzb24td3JpdHRlbicgfHxcbiAgICAgICAgICAgIGV2ZW50LmtpbmQgPT09ICdvdXRwdXQtanNvbi1za2lwcGVkJyB8fFxuICAgICAgICAgICAgZXZlbnQua2luZCA9PT0gJ291dHB1dC1qc29uLW5vdC1yZXF1ZXN0ZWQnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0b3BBZnRlciA9PT0gJ2ludHJvc3BlY3Rpb24nXG4gICAgICAgICAgICAgICAgPyBzdG9wQWZ0ZXJSZWFjaGVkKHN0YXRlKVxuICAgICAgICAgICAgICAgIDogey4uLnN0YXRlLCBwaGFzZTogJ2NyZWF0aW5nLXNlc3Npb24nfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ291dHB1dC1qc29uLWZhaWxlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihzdGF0ZSwgJ291dHB1dC1qc29uJywgZXZlbnQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdjcmVhdGluZy1zZXNzaW9uJykge1xuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3Nlc3Npb24tY3JlYXRlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBldmVudC5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgcGhhc2U6ICdhd2FpdGluZy1hdXRob3JpemF0aW9uJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdmYXN0LXBhdGgtY29tcGxldGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICBhdXRoVG9rZW46IGV2ZW50LnRva2VuLFxuICAgICAgICAgICAgICAgIHBoYXNlOlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5leHBsYW5hdGlvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAncHJlZmxpZ2h0LWNoZWNraW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYXdhaXRpbmctZXhwbGFuYXRpb24nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ2F1dGgtbm90LW5lZWRlZCcpIHtcbiAgICAgICAgICAgIC8vIE5vIHNlcnZlci1zaWRlIGZsb3cgYXQgYWxsIOKAlCBwcm9jZWVkIHN0cmFpZ2h0IHRvIHRlcm1pbmFsLlxuICAgICAgICAgICAgcmV0dXJuIHN0b3BBZnRlclJlYWNoZWQoc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5raW5kID09PSAnc2Vzc2lvbi1mYWlsZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3Ioc3RhdGUsICdjcmVhdGluZy1zZXNzaW9uJywgZXZlbnQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdhd2FpdGluZy1hdXRob3JpemF0aW9uJykge1xuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ2F1dGgtY29uZmlybWVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBhdXRoVG9rZW46IGV2ZW50LnRva2VuLFxuICAgICAgICAgICAgICAgIHBoYXNlOlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5leHBsYW5hdGlvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAncHJlZmxpZ2h0LWNoZWNraW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYXdhaXRpbmctZXhwbGFuYXRpb24nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ2F1dGgtZmFpbGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKHN0YXRlLCAnYXdhaXRpbmctYXV0aG9yaXphdGlvbicsIGV2ZW50LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnYXdhaXRpbmctZXhwbGFuYXRpb24nKSB7XG4gICAgICAgIGlmIChldmVudC5raW5kID09PSAnZXhwbGFuYXRpb24tZ2l2ZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIGV4cGxhbmF0aW9uOiBldmVudC52YWx1ZSxcbiAgICAgICAgICAgICAgICBwaGFzZTogJ3ByZWZsaWdodC1jaGVja2luZycsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdwcmVmbGlnaHQtY2hlY2tpbmcnKSB7XG4gICAgICAgIGlmIChldmVudC5raW5kID09PSAnY2hlY2staW50cm9zcGVjdGlvbi1oaXQnKSB7XG4gICAgICAgICAgICAvLyBSZXVzZWQgcmV2aXNpb246IHNraXAgaW5nZXN0IGVudGlyZWx5LiBQb3N0LWludHJvc3BlY3Rpb24gc3RhdGVcbiAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gd2hldGhlciB0aGUgc2VydmVyIHJldHVybmVkIGEgam9iIGlkLlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICByZXZpc2lvbklkOiBldmVudC5yZXZpc2lvbklkLFxuICAgICAgICAgICAgICAgIHNhbXBsZXNBbHJlYWR5SW5nZXN0ZWQ6IGV2ZW50LnNhbXBsZXNFeGlzdCxcbiAgICAgICAgICAgICAgICB0YWJsZXNOZWVkaW5nU2FtcGxlczogZXZlbnQudGFibGVzTmVlZGluZ1NhbXBsZXMsXG4gICAgICAgICAgICAgICAgcHJlZmxpZ2h0SGl0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHBvc3RJbnRyb3NwZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnBvc3RJbnRyb3NwZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBqb2JJZDogZXZlbnQucG9zdEludHJvc3BlY3Rpb25Kb2JJZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wb3N0SW50cm9zcGVjdGlvbkpvYklkID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnZG9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdxdWV1ZWQnLFxuICAgICAgICAgICAgICAgICAgICByZXVzZWQ6IGV2ZW50LnBvc3RJbnRyb3NwZWN0aW9uSm9iSWQgPT09IG51bGwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwaGFzZTogZXZlbnQuc2FtcGxlc0V4aXN0XG4gICAgICAgICAgICAgICAgICAgID8gJ2F3YWl0aW5nLXBvc3Qtc2FtcGxpbmcnXG4gICAgICAgICAgICAgICAgICAgIDogJ3NhbXBsaW5nLW1hc2stcmVzb2x2aW5nJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdjaGVjay1pbnRyb3NwZWN0aW9uLW1pc3MnKSB7XG4gICAgICAgICAgICByZXR1cm4gey4uLnN0YXRlLCBwaGFzZTogJ2luZ2VzdGluZy1pbnRyb3NwZWN0aW9uJ307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdpbmdlc3QtZmFpbGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKHN0YXRlLCAncHJlZmxpZ2h0LWNoZWNraW5nJywgZXZlbnQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdpbmdlc3RpbmctaW50cm9zcGVjdGlvbicpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdpbnRyb3NwZWN0aW9uLWluZ2VzdGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICByZXZpc2lvbklkOiBldmVudC5yZXZpc2lvbklkLFxuICAgICAgICAgICAgICAgIHNhbXBsZXNBbHJlYWR5SW5nZXN0ZWQ6IGV2ZW50LnNhbXBsZXNFeGlzdCxcbiAgICAgICAgICAgICAgICB0YWJsZXNOZWVkaW5nU2FtcGxlczogZXZlbnQudGFibGVzTmVlZGluZ1NhbXBsZXMsXG4gICAgICAgICAgICAgICAgcG9zdEludHJvc3BlY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUucG9zdEludHJvc3BlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGpvYklkOiBldmVudC5wb3N0SW50cm9zcGVjdGlvbkpvYklkLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnBvc3RJbnRyb3NwZWN0aW9uSm9iSWQgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdkb25lJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3F1ZXVlZCcsXG4gICAgICAgICAgICAgICAgICAgIHJldXNlZDogZXZlbnQucG9zdEludHJvc3BlY3Rpb25Kb2JJZCA9PT0gbnVsbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBoYXNlOiBldmVudC5zYW1wbGVzRXhpc3RcbiAgICAgICAgICAgICAgICAgICAgPyAnYXdhaXRpbmctcG9zdC1zYW1wbGluZydcbiAgICAgICAgICAgICAgICAgICAgOiAnc2FtcGxpbmctbWFzay1yZXNvbHZpbmcnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ2luZ2VzdC1mYWlsZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3Ioc3RhdGUsICdpbmdlc3RpbmctaW50cm9zcGVjdGlvbicsIGV2ZW50LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnc2FtcGxpbmctbWFzay1yZXNvbHZpbmcnKSB7XG4gICAgICAgIGlmIChldmVudC5raW5kID09PSAnbWFzay1sb2FkZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNhbXBsaW5nOiB7Li4uc3RhdGUuc2FtcGxpbmcsIG1hc2s6IGV2ZW50Lm1hc2t9LFxuICAgICAgICAgICAgICAgIHBoYXNlOiAnc2FtcGxpbmcnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ21hc2stZmV0Y2gtZmFpbGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKHN0YXRlLCAnc2FtcGxpbmctbWFzay1yZXNvbHZpbmcnLCBldmVudC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FzY2FkZTogcG9zdC1pbnRyb3NwZWN0aW9uIGZhaWxlZCB3aGlsZSB3ZSdyZSBzdGlsbCB3YWl0aW5nIG9uXG4gICAgICAgIC8vIGl0IGZvciB0aGUgbWFzayAodGhlIHNpZGUtY2hhbm5lbCBoYW5kbGVyIGFib3ZlIGFscmVhZHkgdXBkYXRlZFxuICAgICAgICAvLyBzdWItc3RhdHVzOyBwcmltYXJ5IHBoYXNlIG5lZWRzIHRvIGZhaWwgdG9vKS4gVGhlIGludGVycHJldGVyXG4gICAgICAgIC8vIHJlLWRpc3BhdGNoZXMgYXMgYG1hc2stZmV0Y2gtZmFpbGVkYCBhZnRlciBvYnNlcnZpbmcgdGhlIHN1YnN0YXRlXG4gICAgICAgIC8vIGNoYW5nZS5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gJ3NhbXBsaW5nJykge1xuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3NhbXBsZS10YWJsZS15aWVsZGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBzYW1wbGluZzoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zYW1wbGluZyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkOiBbLi4uc3RhdGUuc2FtcGxpbmcuY29sbGVjdGVkLCBldmVudC5ldmVudF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdzYW1wbGluZy1jb21wbGV0ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuc3RvcEFmdGVyID09PSAnc2FtcGxpbmcnXG4gICAgICAgICAgICAgICAgPyBzdG9wQWZ0ZXJSZWFjaGVkKHN0YXRlKVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNhbXBsaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRhYmxlczogc3RhdGUuc2FtcGxpbmcuY29sbGVjdGVkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHBoYXNlOiAndXBsb2FkaW5nLXNhbXBsZXMnLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3NhbXBsaW5nLWZhaWxlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihzdGF0ZSwgJ3NhbXBsaW5nJywgZXZlbnQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICd1cGxvYWRpbmctc2FtcGxlcycpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdzYW1wbGUtY2h1bmstdXBsb2FkZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNhbXBsaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNhbXBsaW5nLFxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRlZFRhYmxlczpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNhbXBsaW5nLnVwbG9hZGVkVGFibGVzICsgZXZlbnQuY2h1bmtTaXplLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGV2ZW50LmtpbmQgPT09ICdzYW1wbGVzLXVwbG9hZC1jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICBldmVudC5raW5kID09PSAnc2FtcGxlcy11cGxvYWQtbm90LW5lZWRlZCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gey4uLnN0YXRlLCBwaGFzZTogJ2F3YWl0aW5nLXBvc3Qtc2FtcGxpbmcnfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3NhbXBsZXMtdXBsb2FkLWZhaWxlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihzdGF0ZSwgJ3VwbG9hZGluZy1zYW1wbGVzJywgZXZlbnQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdhd2FpdGluZy1wb3N0LXNhbXBsaW5nJykge1xuICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3Bvc3Qtc2FtcGxpbmctY29tcGxldGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHsuLi5zdGF0ZSwgcGhhc2U6ICdkb25lJ307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09ICdwb3N0LXNhbXBsaW5nLWZhaWxlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihzdGF0ZSwgJ2F3YWl0aW5nLXBvc3Qtc2FtcGxpbmcnLCBldmVudC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIC8vIFRlcm1pbmFsIHBoYXNlcyBpZ25vcmUgZnVydGhlciBldmVudHMuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuLy8gUmVzZXRzIHN1Yi1zdGF0dXMgZmllbGRzIHRvIGZyZXNoIOKAlCB1c2VmdWwgd2hlbiB0aGUgcmVkdWNlciBpcyBjb21wb3NlZFxuLy8gd2l0aCBhIGhpZ2hlci1sZXZlbCBkcml2ZXIgdGhhdCB3YW50cyBhIGNsZWFuIHNsYXRlICh0ZXN0cyB1c2UgdGhpcykuXG5leHBvcnQgY29uc3QgY2xlYW5Qb3N0SW50cm9zcGVjdGlvbiA9IChzdGF0ZTogVEZsb3dTdGF0ZSk6IFRGbG93U3RhdGUgPT4gKHtcbiAgICAuLi5zdGF0ZSxcbiAgICBwb3N0SW50cm9zcGVjdGlvbjogaW5pdGlhbFBvc3RJbnRyb3NwZWN0aW9uLFxufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reducer.test.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reducer.test.d.mts","sourceRoot":"./src/","sources":["flow/reducer.test.mts"],"names":[],"mappings":""}