@decohere/flux 0.0.1-dev.76 → 0.0.1-dev.77

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.
@@ -1,12 +1,9 @@
1
1
  import { EventEmitter } from "node:events";
2
- import { registerHooks } from "node:module";
3
2
  import path from "node:path";
4
- import { BuildTargets, SwcTranspiler, WorkspaceDefaults } from "@decohere/forge";
5
- import { packageAliases, WorkspaceFactory } from "@decohere/mesh";
6
- import { FileEx, io } from "@decohere/nexus/io";
3
+ import { io } from "@decohere/nexus/io";
7
4
  import { debounce } from "@decohere/nexus/system";
8
5
  import { scribe } from "@decohere/scribe";
9
- import { rewriteServeSpecifier } from "./rewrite-serve-specifier.js";
6
+ import { SourceModuleLoader } from "./source-module-loader.js";
10
7
  const currentFilePath = io.fileUrlToPath(import.meta.url);
11
8
  const VERSION_URL_PARAM = "version";
12
9
  /** Default quiet window before a file-change reboot. */ export const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
@@ -21,20 +18,13 @@ export function resolveRebootDebounceMs(value) {
21
18
  export class HotReloadServer extends EventEmitter {
22
19
  // ── State ────────────────────────────────────────────────────────────────
23
20
  logger = scribe.logger(HotReloadServer.name);
21
+ loader = new SourceModuleLoader();
24
22
  disposed = false;
25
- hooksRegistered = false;
26
23
  /** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
27
24
  pendingEntryReboots = new Set();
28
- workspace;
29
- buildConfig = "debug";
30
25
  watchSubscription;
31
- /** Map from absolute .ts source file path to project info */ fileInfoMap = new Map();
32
26
  moduleCache = new Map();
33
27
  dependencies = new Map();
34
- transpileCache = new Map();
35
- transpiler = new SwcTranspiler();
36
- aliasPaths = {};
37
- aliasBaseUrl = path.resolve(".");
38
28
  rebootTail = Promise.resolve();
39
29
  rebootDebounceGen = 0;
40
30
  rebootInFlight = false;
@@ -46,7 +36,6 @@ export class HotReloadServer extends EventEmitter {
46
36
  this.disposed = false;
47
37
  this.dependencies.clear();
48
38
  this.moduleCache.clear();
49
- this.transpileCache.clear();
50
39
  this.entries.clear();
51
40
  this.pendingEntryReboots.clear();
52
41
  this.rebootTail = Promise.resolve();
@@ -55,8 +44,13 @@ export class HotReloadServer extends EventEmitter {
55
44
  this.rebootQueued = false;
56
45
  this.bindScheduleReboot(resolveRebootDebounceMs(options.rebootDebounceMs));
57
46
  const { buildConfig } = options;
58
- this.buildConfig = buildConfig;
59
- this.workspace = await this.resolveWorkspace(options);
47
+ await this.loader.configure({
48
+ buildConfig,
49
+ workspace: options.workspace,
50
+ versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl),
51
+ onResolved: this.onPostResolve
52
+ });
53
+ const workspace = this.requireWorkspace();
60
54
  const selected = this.resolveProjects(buildConfig, options);
61
55
  for (const project of selected){
62
56
  const entryPath = path.resolve(project.getSourceEntryPath());
@@ -64,12 +58,10 @@ export class HotReloadServer extends EventEmitter {
64
58
  path: entryPath
65
59
  });
66
60
  }
67
- this.fileInfoMap = await this.buildFileInfoMap(buildConfig);
68
- this.aliasPaths = await this.buildAliasPaths();
69
- this.registerHooks();
61
+ this.loader.registerHooks();
70
62
  this.invalidateAllSourceFiles();
71
- await this.workspace.watch(buildConfig);
72
- this.watchSubscription = this.workspace.projectFileChanged$.subscribe(this.onFileChange);
63
+ await workspace.watch(buildConfig);
64
+ this.watchSubscription = workspace.projectFileChanged$.subscribe(this.onFileChange);
73
65
  for (const entry of this.entries.values()){
74
66
  this.logger.trace(`Serving ${entry.path}`);
75
67
  }
@@ -83,11 +75,11 @@ export class HotReloadServer extends EventEmitter {
83
75
  this.disposed = true;
84
76
  this.rebootDebounceGen += 1;
85
77
  this.watchSubscription?.unsubscribe();
86
- this.workspace?.[Symbol.dispose]();
87
78
  await this.rebootTail;
88
79
  await this.disposeEntries([
89
80
  ...this.entries.keys()
90
81
  ]);
82
+ this.loader.dispose();
91
83
  }
92
84
  async [Symbol.asyncDispose]() {
93
85
  await this.dispose();
@@ -100,8 +92,8 @@ export class HotReloadServer extends EventEmitter {
100
92
  const state = this.entries.get(entryPath);
101
93
  if (state == null) return;
102
94
  try {
103
- const url = this.versionModule(io.pathToFileUrl(entryPath));
104
- state.module = (await import(url))?.default;
95
+ const mod = await this.loader.importEntry(entryPath);
96
+ state.module = mod?.default;
105
97
  } catch (error) {
106
98
  state.module = undefined;
107
99
  this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
@@ -172,14 +164,15 @@ export class HotReloadServer extends EventEmitter {
172
164
  }
173
165
  }
174
166
  // ── Setup ────────────────────────────────────────────────────────────────
175
- async resolveWorkspace(options) {
176
- return options.workspace ?? WorkspaceFactory.create({
177
- ...WorkspaceDefaults,
178
- rootDir: process.cwd()
179
- });
167
+ requireWorkspace() {
168
+ const workspace = this.loader.getWorkspace();
169
+ if (workspace == null) {
170
+ throw new Error("SourceModuleLoader has no workspace after configure");
171
+ }
172
+ return workspace;
180
173
  }
181
174
  resolveProjects(buildConfig, options) {
182
- const projects = this.workspace?.getProjects(buildConfig) ?? [];
175
+ const projects = this.loader.getWorkspace()?.getProjects(buildConfig) ?? [];
183
176
  const names = options.projects != null && options.projects.length > 0 ? options.projects : options.project != null ? [
184
177
  options.project
185
178
  ] : undefined;
@@ -202,57 +195,6 @@ export class HotReloadServer extends EventEmitter {
202
195
  }
203
196
  return selected;
204
197
  }
205
- async buildFileInfoMap(buildConfig) {
206
- const projects = this.workspace?.getProjects(buildConfig) ?? [];
207
- const entries = await Promise.all(projects.map(async (project)=>{
208
- const files = await project.getAllFiles();
209
- return files.map((file)=>[
210
- file.fullPath,
211
- {
212
- project
213
- }
214
- ]);
215
- }));
216
- return new Map(entries.flat());
217
- }
218
- registerHooks() {
219
- if (this.hooksRegistered) return;
220
- this.hooksRegistered = true;
221
- registerHooks({
222
- resolve: (specifier, context, next)=>{
223
- if (this.disposed) return next(specifier, context);
224
- const parentUrl = context.parentURL ?? "";
225
- const rewritten = rewriteServeSpecifier({
226
- specifier,
227
- parentUrl,
228
- isWatchedTs: (filePath)=>this.fileInfoMap.has(filePath),
229
- resolveBare: (bare)=>packageAliases.resolvePath(bare, this.aliasPaths, this.aliasBaseUrl),
230
- versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl)
231
- }) ?? specifier;
232
- const result = next(rewritten, context);
233
- this.onPostResolve(result, parentUrl);
234
- return result;
235
- },
236
- load: (url, context, next)=>{
237
- if (this.disposed) return next(url, context);
238
- const result = this.loadTs(url);
239
- if (result != null) return {
240
- format: "module",
241
- source: result.source,
242
- shortCircuit: true
243
- };
244
- return next(url, context);
245
- }
246
- });
247
- }
248
- // ── Module hooks ─────────────────────────────────────────────────────────
249
- async buildAliasPaths() {
250
- const workspace = this.workspace;
251
- if (workspace == null) return {};
252
- const packageAliases = workspace.getPackageAliases(this.buildConfig);
253
- this.aliasBaseUrl = packageAliases.baseUrl;
254
- return packageAliases.paths;
255
- }
256
198
  /**
257
199
  * Post-next dependency tracker: records which source files import which
258
200
  * other source files so that reloadIfAffected can traverse the graph.
@@ -273,60 +215,25 @@ export class HotReloadServer extends EventEmitter {
273
215
  } catch {
274
216
  parentPath = "";
275
217
  }
276
- const isSource = this.fileInfoMap.has(filePath);
277
- const parentIsSource = this.fileInfoMap.has(parentPath);
218
+ const isSource = this.loader.hasSourceFile(filePath);
219
+ const parentIsSource = this.loader.hasSourceFile(parentPath);
278
220
  if (isSource || parentIsSource) {
279
221
  this.trackDependency(filePath, parentPath);
280
222
  }
281
223
  };
282
- loadTs = (url)=>{
283
- if (!url.startsWith("file:")) return null;
284
- const cleanPath = new URL(url).pathname;
285
- const fileInfo = this.fileInfoMap.get(cleanPath);
286
- if (fileInfo == null) return null;
287
- const cached = this.transpileCache.get(cleanPath);
288
- if (cached != null) return {
289
- source: cached
290
- };
291
- const { project } = fileInfo;
292
- const tsConfig = project.getTsConfigSync();
293
- const userConfig = project.getSwcConfigSync();
294
- const file = new FileEx({
295
- fullPath: cleanPath
296
- });
297
- const response = this.transpiler.transformFileSync(file, BuildTargets.es6, {
298
- tsConfig,
299
- aliasPaths: true,
300
- userConfig,
301
- workspace: this.workspace,
302
- projects: this.workspace?.getProjects(this.buildConfig)
303
- });
304
- if (response.outcome !== "success") {
305
- this.logger.error(`Failed to transpile ${cleanPath}`, response);
306
- // Do not fall through to next(): Vitest/Node loaders can deadlock on a
307
- // versioned .ts URL. Fail the import so bootEntry can catch and continue.
308
- throw new Error(`Failed to transpile ${cleanPath}`);
309
- }
310
- this.transpileCache.set(cleanPath, response.code);
311
- return {
312
- source: response.code
313
- };
314
- };
315
224
  // ── File watching ────────────────────────────────────────────────────────
316
225
  onFileChange = (evt)=>{
317
226
  const { file, eventName, project } = evt;
318
227
  const fullPath = file.fullPath;
319
228
  this.logger.trace(`File ${eventName}: ${fullPath}`);
320
229
  if (eventName === io.WatchEvents.unlink) {
321
- this.transpileCache.delete(fullPath);
230
+ this.loader.invalidateTranspile(fullPath);
322
231
  this.moduleCache.set(fullPath, null);
323
232
  return;
324
233
  }
325
234
  if (eventName === io.WatchEvents.add) {
326
235
  if (project.isSourceFile(file)) {
327
- this.fileInfoMap.set(fullPath, {
328
- project
329
- });
236
+ this.loader.setSourceFile(fullPath, project);
330
237
  this.moduleCache.set(fullPath, null);
331
238
  this.reloadIfAffected(fullPath);
332
239
  }
@@ -334,10 +241,7 @@ export class HotReloadServer extends EventEmitter {
334
241
  }
335
242
  // change
336
243
  if (!project.isSourceFile(file)) return;
337
- this.transpileCache.delete(fullPath);
338
- this.transpiler.invalidateContentCache(new FileEx({
339
- fullPath
340
- }));
244
+ this.loader.invalidateTranspile(fullPath);
341
245
  this.reloadIfAffected(fullPath);
342
246
  };
343
247
  reloadIfAffected(fullPath) {
@@ -373,7 +277,7 @@ export class HotReloadServer extends EventEmitter {
373
277
  }
374
278
  let subDeps = [];
375
279
  for (const dep of moduleDeps){
376
- if (!this.fileInfoMap.has(dep)) continue;
280
+ if (!this.loader.hasSourceFile(dep)) continue;
377
281
  const subs = this.getDependencyGraph(dep, [
378
282
  moduleId,
379
283
  ...parentModules
@@ -417,7 +321,7 @@ export class HotReloadServer extends EventEmitter {
417
321
  invalidateModule(...modules) {
418
322
  for (const module of modules){
419
323
  this.moduleCache.set(module, null);
420
- this.transpileCache.delete(module);
324
+ this.loader.invalidateTranspile(module);
421
325
  // Prune stale outgoing edges: remove this module as a parent from all dependency lists
422
326
  for (const [key, parents] of this.dependencies){
423
327
  const filtered = parents.filter((p)=>p !== module);
@@ -430,14 +334,13 @@ export class HotReloadServer extends EventEmitter {
430
334
  }
431
335
  }
432
336
  invalidateAllSourceFiles() {
433
- for (const filePath of this.fileInfoMap.keys()){
337
+ for (const filePath of this.loader.sourceFilePaths()){
434
338
  this.moduleCache.set(filePath, null);
435
339
  }
436
340
  }
437
- // ── Utilities ────────────────────────────────────────────────────────────
438
341
  isSelf(filePath) {
439
342
  return currentFilePath === path.resolve(filePath);
440
343
  }
441
344
  }
442
345
 
443
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBwYWNrYWdlQWxpYXNlcywgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcmV3cml0ZVNlcnZlU3BlY2lmaWVyIH0gZnJvbSBcIi4vcmV3cml0ZS1zZXJ2ZS1zcGVjaWZpZXIuanNcIjtcblxudHlwZSBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHsgc291cmNlOiBzdHJpbmcgfSB8IG51bGw7XG5cbmNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IFZFUlNJT05fVVJMX1BBUkFNID0gXCJ2ZXJzaW9uXCI7XG4vKiogRGVmYXVsdCBxdWlldCB3aW5kb3cgYmVmb3JlIGEgZmlsZS1jaGFuZ2UgcmVib290LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIE11bHRpcGxlIEZsdXggYXBwIHBhY2thZ2UgbmFtZXMgdG8gYm9vdCBpbiBvbmUgcHJvY2VzcyAoZGlyZWN0b3J5IHNsaWNlKS5cblx0ICogV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgcHJvamVjdH0uXG5cdCAqL1xuXHRwcm9qZWN0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NU30uIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn1cblxudHlwZSBGaWxlSW5mbyA9IHsgcHJvamVjdDogUHJvamVjdCB9O1xudHlwZSBFbnRyeVN0YXRlID0geyBwYXRoOiBzdHJpbmc7IG1vZHVsZT86IEFzeW5jRGlzcG9zYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgSG90UmVsb2FkU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEhvdFJlbG9hZFNlcnZlckV2ZW50cz4ge1xuXHQvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKEhvdFJlbG9hZFNlcnZlci5uYW1lKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGhvb2tzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0cHJpdmF0ZSBidWlsZENvbmZpZyA9IFwiZGVidWdcIjtcblx0cHJpdmF0ZSB3YXRjaFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblx0LyoqIE1hcCBmcm9tIGFic29sdXRlIC50cyBzb3VyY2UgZmlsZSBwYXRoIHRvIHByb2plY3QgaW5mbyAqL1xuXHRwcml2YXRlIGZpbGVJbmZvTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVJbmZvPigpO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0cHJpdmF0ZSB0cmFuc3BpbGVyID0gbmV3IFN3Y1RyYW5zcGlsZXIoKTtcblx0cHJpdmF0ZSBhbGlhc1BhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0cHJpdmF0ZSBhbGlhc0Jhc2VVcmwgPSBwYXRoLnJlc29sdmUoXCIuXCIpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHNjaGVkdWxlUmVib290OiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cblx0Ly8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpIHtcblx0XHR0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG5cdFx0dGhpcy5kZXBlbmRlbmNpZXMuY2xlYXIoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucmVib290VGFpbCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmJpbmRTY2hlZHVsZVJlYm9vdChyZXNvbHZlUmVib290RGVib3VuY2VNcyhvcHRpb25zLnJlYm9vdERlYm91bmNlTXMpKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy5idWlsZENvbmZpZyA9IGJ1aWxkQ29uZmlnO1xuXHRcdHRoaXMud29ya3NwYWNlID0gYXdhaXQgdGhpcy5yZXNvbHZlV29ya3NwYWNlKG9wdGlvbnMpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuZmlsZUluZm9NYXAgPSBhd2FpdCB0aGlzLmJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNQYXRocyA9IGF3YWl0IHRoaXMuYnVpbGRBbGlhc1BhdGhzKCk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcy52YWx1ZXMoKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFNlcnZpbmcgJHtlbnRyeS5wYXRofWApO1xuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKFsuLi50aGlzLmVudHJpZXMua2V5cygpXSk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290RGVib3VuY2VHZW4gKz0gMTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXHRcdHRoaXMud29ya3NwYWNlPy5bU3ltYm9sLmRpc3Bvc2VdKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmJvb3RFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChlbnRyeVBhdGgpO1xuXHRcdGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKGVudHJ5UGF0aCkpO1xuXHRcdFx0c3RhdGUubW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgcmVzb2x2ZVdvcmtzcGFjZShvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvbWlzZTxXb3Jrc3BhY2U+IHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0b3B0aW9ucy53b3Jrc3BhY2UgPz9cblx0XHRcdFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgLi4uV29ya3NwYWNlRGVmYXVsdHMsIHJvb3REaXI6IHByb2Nlc3MuY3dkKCkgfSlcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlSW5mbz4+IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvamVjdC5nZXRBbGxGaWxlcygpO1xuXHRcdFx0XHRyZXR1cm4gZmlsZXMubWFwKChmaWxlKTogW3N0cmluZywgRmlsZUluZm9dID0+IFtmaWxlLmZ1bGxQYXRoLCB7IHByb2plY3QgfV0pO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0XHRyZXR1cm4gbmV3IE1hcChlbnRyaWVzLmZsYXQoKSk7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVySG9va3MoKSB7XG5cdFx0aWYgKHRoaXMuaG9va3NSZWdpc3RlcmVkKSByZXR1cm47XG5cdFx0dGhpcy5ob29rc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHJlZ2lzdGVySG9va3Moe1xuXHRcdFx0cmVzb2x2ZTogKFxuXHRcdFx0XHRzcGVjaWZpZXI6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogUmVzb2x2ZUhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAoc3BlY2lmaWVyOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPFJlc29sdmVIb29rQ29udGV4dD4pID0+IFJlc29sdmVGbk91dHB1dCxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQoc3BlY2lmaWVyLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcGFyZW50VXJsID0gY29udGV4dC5wYXJlbnRVUkwgPz8gXCJcIjtcblx0XHRcdFx0Y29uc3QgcmV3cml0dGVuID1cblx0XHRcdFx0XHRyZXdyaXRlU2VydmVTcGVjaWZpZXIoe1xuXHRcdFx0XHRcdFx0c3BlY2lmaWVyLFxuXHRcdFx0XHRcdFx0cGFyZW50VXJsLFxuXHRcdFx0XHRcdFx0aXNXYXRjaGVkVHM6IChmaWxlUGF0aCkgPT4gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpLFxuXHRcdFx0XHRcdFx0cmVzb2x2ZUJhcmU6IChiYXJlKSA9PlxuXHRcdFx0XHRcdFx0XHRwYWNrYWdlQWxpYXNlcy5yZXNvbHZlUGF0aChiYXJlLCB0aGlzLmFsaWFzUGF0aHMsIHRoaXMuYWxpYXNCYXNlVXJsKSxcblx0XHRcdFx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdFx0XHR9KSA/PyBzcGVjaWZpZXI7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IG5leHQocmV3cml0dGVuLCBjb250ZXh0KSBhcyBSZXNvbHZlRm5PdXRwdXQ7XG5cdFx0XHRcdHRoaXMub25Qb3N0UmVzb2x2ZShyZXN1bHQsIHBhcmVudFVybCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0bG9hZDogKFxuXHRcdFx0XHR1cmw6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogTG9hZEhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAodXJsOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPExvYWRIb29rQ29udGV4dD4pID0+IExvYWRGbk91dHB1dCxcblx0XHRcdCk6IExvYWRGbk91dHB1dCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmxvYWRUcyh1cmwpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHRcdFx0cmV0dXJuIHsgZm9ybWF0OiBcIm1vZHVsZVwiLCBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsIHNob3J0Q2lyY3VpdDogdHJ1ZSB9O1xuXHRcdFx0XHRyZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8vIOKUgOKUgCBNb2R1bGUgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZEFsaWFzUGF0aHMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IHtcblx0XHRjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLndvcmtzcGFjZTtcblx0XHRpZiAod29ya3NwYWNlID09IG51bGwpIHJldHVybiB7fTtcblxuXHRcdGNvbnN0IHBhY2thZ2VBbGlhc2VzID0gd29ya3NwYWNlLmdldFBhY2thZ2VBbGlhc2VzKHRoaXMuYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNCYXNlVXJsID0gcGFja2FnZUFsaWFzZXMuYmFzZVVybDtcblx0XHRyZXR1cm4gcGFja2FnZUFsaWFzZXMucGF0aHM7XG5cdH1cblxuXHQvKipcblx0ICogUG9zdC1uZXh0IGRlcGVuZGVuY3kgdHJhY2tlcjogcmVjb3JkcyB3aGljaCBzb3VyY2UgZmlsZXMgaW1wb3J0IHdoaWNoXG5cdCAqIG90aGVyIHNvdXJjZSBmaWxlcyBzbyB0aGF0IHJlbG9hZElmQWZmZWN0ZWQgY2FuIHRyYXZlcnNlIHRoZSBncmFwaC5cblx0ICovXG5cdHByaXZhdGUgb25Qb3N0UmVzb2x2ZSA9IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB7IHVybCB9ID0gcmVzdWx0O1xuXHRcdGNvbnN0IHBhcmVudFVybENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGxldCBmaWxlUGF0aDogc3RyaW5nO1xuXHRcdGxldCBwYXJlbnRQYXRoOiBzdHJpbmc7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXHRcdFx0dXJsT2JqLnNlYXJjaCA9IFwiXCI7XG5cdFx0XHRmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsT2JqLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmxDbGVhbik7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRwYXJlbnRQYXRoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBpc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgbG9hZFRzOiBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHtcblx0XHRpZiAoIXVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgY2xlYW5QYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuXHRcdGNvbnN0IGZpbGVJbmZvID0gdGhpcy5maWxlSW5mb01hcC5nZXQoY2xlYW5QYXRoKTtcblx0XHRpZiAoZmlsZUluZm8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLnRyYW5zcGlsZUNhY2hlLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIHsgc291cmNlOiBjYWNoZWQgfTtcblxuXHRcdGNvbnN0IHsgcHJvamVjdCB9ID0gZmlsZUluZm87XG5cdFx0Y29uc3QgdHNDb25maWcgPSBwcm9qZWN0LmdldFRzQ29uZmlnU3luYygpO1xuXHRcdGNvbnN0IHVzZXJDb25maWcgPSBwcm9qZWN0LmdldFN3Y0NvbmZpZ1N5bmMoKTtcblxuXHRcdGNvbnN0IGZpbGUgPSBuZXcgRmlsZUV4KHsgZnVsbFBhdGg6IGNsZWFuUGF0aCB9KTtcblx0XHRjb25zdCByZXNwb25zZSA9IHRoaXMudHJhbnNwaWxlci50cmFuc2Zvcm1GaWxlU3luYyhmaWxlLCBCdWlsZFRhcmdldHMuZXM2LCB7XG5cdFx0XHR0c0NvbmZpZyxcblx0XHRcdGFsaWFzUGF0aHM6IHRydWUsXG5cdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdHByb2plY3RzOiB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHModGhpcy5idWlsZENvbmZpZyksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWAsIHJlc3BvbnNlKTtcblx0XHRcdC8vIERvIG5vdCBmYWxsIHRocm91Z2ggdG8gbmV4dCgpOiBWaXRlc3QvTm9kZSBsb2FkZXJzIGNhbiBkZWFkbG9jayBvbiBhXG5cdFx0XHQvLyB2ZXJzaW9uZWQgLnRzIFVSTC4gRmFpbCB0aGUgaW1wb3J0IHNvIGJvb3RFbnRyeSBjYW4gY2F0Y2ggYW5kIGNvbnRpbnVlLlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWApO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuc2V0KGNsZWFuUGF0aCwgcmVzcG9uc2UuY29kZSk7XG5cdFx0cmV0dXJuIHsgc291cmNlOiByZXNwb25zZS5jb2RlIH07XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmZpbGVJbmZvTWFwLnNldChmdWxsUGF0aCwgeyBwcm9qZWN0IH0pO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnRyYW5zcGlsZXIuaW52YWxpZGF0ZUNvbnRlbnRDYWNoZShuZXcgRmlsZUV4KHsgZnVsbFBhdGggfSkpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cdFx0Y29uc3QgYWZmZWN0ZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcy5rZXlzKCldLmZpbHRlcigoZW50cnlQYXRoKSA9PlxuXHRcdFx0bW9kdWxlcy5pbmNsdWRlcyhlbnRyeVBhdGgpLFxuXHRcdCk7XG5cblx0XHRpZiAoYWZmZWN0ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYENoYW5nZSBpbiAke2Z1bGxQYXRofSBkb2VzIG5vdCBhZmZlY3QgZW50cnkg4oCUIHNraXBwaW5nIHJlbG9hZGApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFxuXHRcdFx0YENoYW5nZSBpbiAke2Z1bGxQYXRofSBhZmZlY3RzICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZShzKSDigJQgc2NoZWR1bGluZyByZWxvYWRgLFxuXHRcdCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdGZvciAoY29uc3QgZW50cnlQYXRoIG9mIGFmZmVjdGVkRW50cmllcykge1xuXHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmFkZChlbnRyeVBhdGgpO1xuXHRcdH1cblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUobW9kdWxlKTtcblx0XHRcdC8vIFBydW5lIHN0YWxlIG91dGdvaW5nIGVkZ2VzOiByZW1vdmUgdGhpcyBtb2R1bGUgYXMgYSBwYXJlbnQgZnJvbSBhbGwgZGVwZW5kZW5jeSBsaXN0c1xuXHRcdFx0Zm9yIChjb25zdCBba2V5LCBwYXJlbnRzXSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZCA9IHBhcmVudHMuZmlsdGVyKChwKSA9PiBwICE9PSBtb2R1bGUpO1xuXHRcdFx0XHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuc2V0KGtleSwgZmlsdGVyZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmZpbGVJbmZvTWFwLmtleXMoKSkge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJyZWdpc3Rlckhvb2tzIiwicGF0aCIsIkJ1aWxkVGFyZ2V0cyIsIlN3Y1RyYW5zcGlsZXIiLCJXb3Jrc3BhY2VEZWZhdWx0cyIsInBhY2thZ2VBbGlhc2VzIiwiV29ya3NwYWNlRmFjdG9yeSIsIkZpbGVFeCIsImlvIiwiZGVib3VuY2UiLCJzY3JpYmUiLCJyZXdyaXRlU2VydmVTcGVjaWZpZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJmaWxlVXJsVG9QYXRoIiwidXJsIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsInJlc29sdmVSZWJvb3REZWJvdW5jZU1zIiwidmFsdWUiLCJkZWxheSIsIk51bWJlciIsImlzRmluaXRlIiwiRXJyb3IiLCJTdHJpbmciLCJtb2R1bGVWZXJzaW9uU2VxIiwiSG90UmVsb2FkU2VydmVyIiwibG9nZ2VyIiwibmFtZSIsImRpc3Bvc2VkIiwiaG9va3NSZWdpc3RlcmVkIiwiZW50cmllcyIsIk1hcCIsInBlbmRpbmdFbnRyeVJlYm9vdHMiLCJTZXQiLCJ3b3Jrc3BhY2UiLCJidWlsZENvbmZpZyIsIndhdGNoU3Vic2NyaXB0aW9uIiwiZmlsZUluZm9NYXAiLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInRyYW5zcGlsZUNhY2hlIiwidHJhbnNwaWxlciIsImFsaWFzUGF0aHMiLCJhbGlhc0Jhc2VVcmwiLCJyZXNvbHZlIiwicmVib290VGFpbCIsIlByb21pc2UiLCJyZWJvb3REZWJvdW5jZUdlbiIsInJlYm9vdEluRmxpZ2h0IiwicmVib290Rm9sbG93VXAiLCJyZWJvb3RRdWV1ZWQiLCJzY2hlZHVsZVJlYm9vdCIsInN0YXJ0Iiwib3B0aW9ucyIsImNsZWFyIiwiYmluZFNjaGVkdWxlUmVib290IiwicmVib290RGVib3VuY2VNcyIsInJlc29sdmVXb3Jrc3BhY2UiLCJzZWxlY3RlZCIsInJlc29sdmVQcm9qZWN0cyIsInByb2plY3QiLCJlbnRyeVBhdGgiLCJnZXRTb3VyY2VFbnRyeVBhdGgiLCJzZXQiLCJidWlsZEZpbGVJbmZvTWFwIiwiYnVpbGRBbGlhc1BhdGhzIiwiaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzIiwid2F0Y2giLCJwcm9qZWN0RmlsZUNoYW5nZWQkIiwic3Vic2NyaWJlIiwib25GaWxlQ2hhbmdlIiwiZW50cnkiLCJ2YWx1ZXMiLCJ0cmFjZSIsImJvb3RFbnRyaWVzIiwia2V5cyIsImVtaXQiLCJkaXNwb3NlIiwidW5zdWJzY3JpYmUiLCJTeW1ib2wiLCJkaXNwb3NlRW50cmllcyIsImFzeW5jRGlzcG9zZSIsImVudHJ5UGF0aHMiLCJhbGwiLCJtYXAiLCJib290RW50cnkiLCJzdGF0ZSIsImdldCIsInZlcnNpb25Nb2R1bGUiLCJwYXRoVG9GaWxlVXJsIiwibW9kdWxlIiwiZGVmYXVsdCIsImVycm9yIiwidW5kZWZpbmVkIiwiZGVsYXlNcyIsImdlbiIsInJlcXVlc3RSZWJvb3QiLCJ0aGVuIiwicnVuUmVib290IiwidG9SZWJvb3QiLCJzaXplIiwibGVuZ3RoIiwibmVlZHNGb2xsb3dVcCIsImRpc3Bvc2VFbnRyeSIsInBhdGhzIiwicCIsImNyZWF0ZSIsInJvb3REaXIiLCJwcm9jZXNzIiwiY3dkIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsIm5hbWVzIiwiZmlyc3QiLCJhdCIsImZvdW5kIiwiZmluZCIsInB1c2giLCJmaWxlcyIsImdldEFsbEZpbGVzIiwiZmlsZSIsImZ1bGxQYXRoIiwiZmxhdCIsInNwZWNpZmllciIsImNvbnRleHQiLCJuZXh0IiwicGFyZW50VXJsIiwicGFyZW50VVJMIiwicmV3cml0dGVuIiwiaXNXYXRjaGVkVHMiLCJmaWxlUGF0aCIsImhhcyIsInJlc29sdmVCYXJlIiwiYmFyZSIsInJlc29sdmVQYXRoIiwidmVyc2lvbkZpbGVVcmwiLCJmaWxlVXJsIiwiZ2V0Q2FjaGVkT3JOZXciLCJyZXN1bHQiLCJvblBvc3RSZXNvbHZlIiwibG9hZCIsImxvYWRUcyIsImZvcm1hdCIsInNvdXJjZSIsInNob3J0Q2lyY3VpdCIsImdldFBhY2thZ2VBbGlhc2VzIiwiYmFzZVVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJwYXJlbnRQYXRoIiwidXJsT2JqIiwiVVJMIiwic2VhcmNoIiwidG9TdHJpbmciLCJpc1NvdXJjZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5Iiwic3RhcnRzV2l0aCIsImNsZWFuUGF0aCIsInBhdGhuYW1lIiwiZmlsZUluZm8iLCJjYWNoZWQiLCJ0c0NvbmZpZyIsImdldFRzQ29uZmlnU3luYyIsInVzZXJDb25maWciLCJnZXRTd2NDb25maWdTeW5jIiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1GaWxlU3luYyIsImVzNiIsIm91dGNvbWUiLCJjb2RlIiwiZXZ0IiwiZXZlbnROYW1lIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJyZWxvYWRJZkFmZmVjdGVkIiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiYWZmZWN0ZWRFbnRyaWVzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlTW9kdWxlIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uZWRVcmwiLCJzZWFyY2hQYXJhbXMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxjQUFjO0FBTzNDLFNBQVNDLGFBQWEsUUFBUSxjQUFjO0FBQzVDLE9BQU9DLFVBQVUsWUFBWTtBQUM3QixTQUFTQyxZQUFZLEVBQUVDLGFBQWEsRUFBRUMsaUJBQWlCLFFBQVEsa0JBQWtCO0FBRWpGLFNBQVNDLGNBQWMsRUFBRUMsZ0JBQWdCLFFBQVEsaUJBQWlCO0FBQ2xFLFNBQVNDLE1BQU0sRUFBRUMsRUFBRSxRQUFRLHFCQUFxQjtBQUNoRCxTQUFTQyxRQUFRLFFBQVEseUJBQXlCO0FBQ2xELFNBQXNCQyxNQUFNLFFBQVEsbUJBQW1CO0FBRXZELFNBQVNDLHFCQUFxQixRQUFRLCtCQUErQjtBQUlyRSxNQUFNQyxrQkFBa0JKLEdBQUdLLGFBQWEsQ0FBQyxZQUFZQyxHQUFHO0FBQ3hELE1BQU1DLG9CQUFvQjtBQUMxQixzREFBc0QsR0FDdEQsT0FBTyxNQUFNQyw2QkFBNkIsSUFBSTtBQUU5QyxPQUFPLFNBQVNDLHdCQUF3QkMsS0FBeUI7SUFDaEUsTUFBTUMsUUFBUUQsU0FBU0Y7SUFDdkIsSUFBSSxDQUFDSSxPQUFPQyxRQUFRLENBQUNGLFVBQVVBLFFBQVEsR0FBRztRQUN6QyxNQUFNLElBQUlHLE1BQU0sQ0FB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
346
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVib290RGVib3VuY2VNcyh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0Y29uc3QgZGVsYXkgPSB2YWx1ZSA/PyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUztcblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZGVsYXkpIHx8IGRlbGF5IDwgMCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgcmVib290RGVib3VuY2VNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKHZhbHVlKX1gKTtcblx0fVxuXHRyZXR1cm4gZGVsYXk7XG59XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogTXVsdGlwbGUgRmx1eCBhcHAgcGFja2FnZSBuYW1lcyB0byBib290IGluIG9uZSBwcm9jZXNzIChkaXJlY3Rvcnkgc2xpY2UpLlxuXHQgKiBXaGVuIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHtAbGluayBwcm9qZWN0fS5cblx0ICovXG5cdHByb2plY3RzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG5cdC8qKlxuXHQgKiBRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdC5cblx0ICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TfS4gUmFpc2UgdGhpcyBmb3IgYWdlbnQgc2F2ZSB0cmFpbnMuXG5cdCAqL1xuXHRyZWJvb3REZWJvdW5jZU1zPzogbnVtYmVyO1xufVxuXG50eXBlIEVudHJ5U3RhdGUgPSB7IHBhdGg6IHN0cmluZzsgbW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IG5ldyBTb3VyY2VNb2R1bGVMb2FkZXIoKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHNjaGVkdWxlUmVib290OiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cblx0Ly8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpIHtcblx0XHR0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG5cdFx0dGhpcy5kZXBlbmRlbmNpZXMuY2xlYXIoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy5lbnRyaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmNsZWFyKCk7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRcdHRoaXMuYmluZFNjaGVkdWxlUmVib290KHJlc29sdmVSZWJvb3REZWJvdW5jZU1zKG9wdGlvbnMucmVib290RGVib3VuY2VNcykpO1xuXG5cdFx0Y29uc3QgeyBidWlsZENvbmZpZyB9ID0gb3B0aW9ucztcblxuXHRcdGF3YWl0IHRoaXMubG9hZGVyLmNvbmZpZ3VyZSh7XG5cdFx0XHRidWlsZENvbmZpZyxcblx0XHRcdHdvcmtzcGFjZTogb3B0aW9ucy53b3Jrc3BhY2UsXG5cdFx0XHR2ZXJzaW9uRmlsZVVybDogKGZpbGVVcmwpID0+IHRoaXMuZ2V0Q2FjaGVkT3JOZXcoZmlsZVVybCksXG5cdFx0XHRvblJlc29sdmVkOiB0aGlzLm9uUG9zdFJlc29sdmUsXG5cdFx0fSk7XG5cblx0XHRjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLnJlcXVpcmVXb3Jrc3BhY2UoKTtcblx0XHRjb25zdCBzZWxlY3RlZCA9IHRoaXMucmVzb2x2ZVByb2plY3RzKGJ1aWxkQ29uZmlnLCBvcHRpb25zKTtcblx0XHRmb3IgKGNvbnN0IHByb2plY3Qgb2Ygc2VsZWN0ZWQpIHtcblx0XHRcdGNvbnN0IGVudHJ5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmdldFNvdXJjZUVudHJ5UGF0aCgpKTtcblx0XHRcdHRoaXMuZW50cmllcy5zZXQoZW50cnlQYXRoLCB7IHBhdGg6IGVudHJ5UGF0aCB9KTtcblx0XHR9XG5cblx0XHR0aGlzLmxvYWRlci5yZWdpc3Rlckhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblxuXHRcdGF3YWl0IHdvcmtzcGFjZS53YXRjaChidWlsZENvbmZpZyk7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbiA9IHdvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcy52YWx1ZXMoKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFNlcnZpbmcgJHtlbnRyeS5wYXRofWApO1xuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKFsuLi50aGlzLmVudHJpZXMua2V5cygpXSk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290RGVib3VuY2VHZW4gKz0gMTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXHRcdGF3YWl0IHRoaXMucmVib290VGFpbDtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyaWVzKFsuLi50aGlzLmVudHJpZXMua2V5cygpXSk7XG5cdFx0dGhpcy5sb2FkZXIuZGlzcG9zZSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cmllcyhlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSkge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKGVudHJ5UGF0aHMubWFwKChlbnRyeVBhdGgpID0+IHRoaXMuYm9vdEVudHJ5KGVudHJ5UGF0aCkpKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc3RhdGUgPSB0aGlzLmVudHJpZXMuZ2V0KGVudHJ5UGF0aCk7XG5cdFx0aWYgKHN0YXRlID09IG51bGwpIHJldHVybjtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbW9kID0gKGF3YWl0IHRoaXMubG9hZGVyLmltcG9ydEVudHJ5KGVudHJ5UGF0aCkpIGFzIHtcblx0XHRcdFx0ZGVmYXVsdD86IEFzeW5jRGlzcG9zYWJsZTtcblx0XHRcdH07XG5cdFx0XHRzdGF0ZS5tb2R1bGUgPSBtb2Q/LmRlZmF1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcIlRoZXJlIHdhcyBhbiBlcnJvciBib290aW5nIHRoZSBlbnRyeSBwb2ludC4gWW91ciBhcHBsaWNhdGlvbiBtYXkgbm90IGZ1bmN0aW9uIGFzIGV4cGVjdGVkXCIsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGJpbmRTY2hlZHVsZVJlYm9vdChkZWxheU1zOiBudW1iZXIpIHtcblx0XHRjb25zdCBnZW4gPSArK3RoaXMucmVib290RGVib3VuY2VHZW47XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkIHx8IGdlbiAhPT0gdGhpcy5yZWJvb3REZWJvdW5jZUdlbikgcmV0dXJuO1xuXHRcdFx0dGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fSwgZGVsYXlNcyk7XG5cdH1cblxuXHRwcml2YXRlIHJlcXVlc3RSZWJvb3QoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRpZiAodGhpcy5yZWJvb3RJbkZsaWdodCkge1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICh0aGlzLnJlYm9vdFF1ZXVlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSB0aGlzLnJlYm9vdFRhaWwudGhlbihcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1blJlYm9vdCgpIHtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IHRydWU7XG5cdFx0dHJ5IHtcblx0XHRcdGRvIHtcblx0XHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdFx0XHRjb25zdCB0b1JlYm9vdCA9XG5cdFx0XHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLnNpemUgPiAwXG5cdFx0XHRcdFx0XHQ/IFsuLi50aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHNdXG5cdFx0XHRcdFx0XHQ6IFsuLi50aGlzLmVudHJpZXMua2V5cygpXTtcblx0XHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmNsZWFyKCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBSZWJvb3RpbmcgJHt0b1JlYm9vdC5sZW5ndGh9IGVudHJ5IG1vZHVsZShzKWApO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyh0b1JlYm9vdCk7XG5cdFx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHRcdH0gd2hpbGUgKHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRjb25zdCBuZWVkc0ZvbGxvd1VwID0gdGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZDtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHRcdGlmIChuZWVkc0ZvbGxvd1VwKSB0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyaWVzKGVudHJ5UGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoZW50cnlQYXRocy5tYXAoKGVudHJ5UGF0aCkgPT4gdGhpcy5kaXNwb3NlRW50cnkoZW50cnlQYXRoKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoZW50cnlQYXRoPzogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF0aHMgPSBlbnRyeVBhdGggIT0gbnVsbCA/IFtlbnRyeVBhdGhdIDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdGZvciAoY29uc3QgcCBvZiBwYXRocykge1xuXHRcdFx0Y29uc3Qgc3RhdGUgPSB0aGlzLmVudHJpZXMuZ2V0KHApO1xuXHRcdFx0aWYgKHN0YXRlID09IG51bGwpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgZW50cnkgPSBzdGF0ZS5tb2R1bGU7XG5cdFx0XHRzdGF0ZS5tb2R1bGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBlbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcIkVudHJ5IGFzeW5jRGlzcG9zZSBmYWlsZWRcIiwgZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBTZXR1cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIHJlcXVpcmVXb3Jrc3BhY2UoKTogV29ya3NwYWNlIHtcblx0XHRjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLmxvYWRlci5nZXRXb3Jrc3BhY2UoKTtcblx0XHRpZiAod29ya3NwYWNlID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlNvdXJjZU1vZHVsZUxvYWRlciBoYXMgbm8gd29ya3NwYWNlIGFmdGVyIGNvbmZpZ3VyZVwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIHdvcmtzcGFjZTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVByb2plY3RzKGJ1aWxkQ29uZmlnOiBzdHJpbmcsIG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpOiBQcm9qZWN0W10ge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk/LmdldFByb2plY3RzKGJ1aWxkQ29uZmlnKSA/PyBbXTtcblx0XHRjb25zdCBuYW1lcyA9XG5cdFx0XHRvcHRpb25zLnByb2plY3RzICE9IG51bGwgJiYgb3B0aW9ucy5wcm9qZWN0cy5sZW5ndGggPiAwXG5cdFx0XHRcdD8gb3B0aW9ucy5wcm9qZWN0c1xuXHRcdFx0XHQ6IG9wdGlvbnMucHJvamVjdCAhPSBudWxsXG5cdFx0XHRcdFx0PyBbb3B0aW9ucy5wcm9qZWN0XVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKG5hbWVzID09IG51bGwpIHtcblx0XHRcdGNvbnN0IGZpcnN0ID0gcHJvamVjdHMuYXQoMCk7XG5cdFx0XHRpZiAoZmlyc3QgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vIHByb2plY3RzIGZvdW5kIGZvciBjb25maWd1cmF0aW9uOiAke2J1aWxkQ29uZmlnfWApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFtmaXJzdF07XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2VsZWN0ZWQ6IFByb2plY3RbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuXHRcdFx0Y29uc3QgZm91bmQgPSBwcm9qZWN0cy5maW5kKChwKSA9PiBwLm5hbWUgPT09IG5hbWUpO1xuXHRcdFx0aWYgKGZvdW5kID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0IFwiJHtuYW1lfVwiIG5vdCBmb3VuZCBpbiB3b3Jrc3BhY2VgKTtcblx0XHRcdH1cblx0XHRcdHNlbGVjdGVkLnB1c2goZm91bmQpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUG9zdC1uZXh0IGRlcGVuZGVuY3kgdHJhY2tlcjogcmVjb3JkcyB3aGljaCBzb3VyY2UgZmlsZXMgaW1wb3J0IHdoaWNoXG5cdCAqIG90aGVyIHNvdXJjZSBmaWxlcyBzbyB0aGF0IHJlbG9hZElmQWZmZWN0ZWQgY2FuIHRyYXZlcnNlIHRoZSBncmFwaC5cblx0ICovXG5cdHByaXZhdGUgb25Qb3N0UmVzb2x2ZSA9IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB7IHVybCB9ID0gcmVzdWx0O1xuXHRcdGNvbnN0IHBhcmVudFVybENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGxldCBmaWxlUGF0aDogc3RyaW5nO1xuXHRcdGxldCBwYXJlbnRQYXRoOiBzdHJpbmc7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXHRcdFx0dXJsT2JqLnNlYXJjaCA9IFwiXCI7XG5cdFx0XHRmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsT2JqLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmxDbGVhbik7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRwYXJlbnRQYXRoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBpc1NvdXJjZSA9IHRoaXMubG9hZGVyLmhhc1NvdXJjZUZpbGUoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShwYXJlbnRQYXRoKTtcblxuXHRcdGlmIChpc1NvdXJjZSB8fCBwYXJlbnRJc1NvdXJjZSkge1xuXHRcdFx0dGhpcy50cmFja0RlcGVuZGVuY3koZmlsZVBhdGgsIHBhcmVudFBhdGgpO1xuXHRcdH1cblx0fTtcblxuXHQvLyDilIDilIAgRmlsZSB3YXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIG9uRmlsZUNoYW5nZSA9IChldnQ6IFByb2plY3RGaWxlRXZlbnQpID0+IHtcblx0XHRjb25zdCB7IGZpbGUsIGV2ZW50TmFtZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gZmlsZS5mdWxsUGF0aDtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBGaWxlICR7ZXZlbnROYW1lfTogJHtmdWxsUGF0aH1gKTtcblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy5sb2FkZXIuaW52YWxpZGF0ZVRyYW5zcGlsZShmdWxsUGF0aCk7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGV2ZW50TmFtZSA9PT0gaW8uV2F0Y2hFdmVudHMuYWRkKSB7XG5cdFx0XHRpZiAocHJvamVjdC5pc1NvdXJjZUZpbGUoZmlsZSkpIHtcblx0XHRcdFx0dGhpcy5sb2FkZXIuc2V0U291cmNlRmlsZShmdWxsUGF0aCwgcHJvamVjdCk7XG5cdFx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBjaGFuZ2Vcblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSByZXR1cm47XG5cdFx0dGhpcy5sb2FkZXIuaW52YWxpZGF0ZVRyYW5zcGlsZShmdWxsUGF0aCk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblx0XHRjb25zdCBhZmZlY3RlZEVudHJpZXMgPSBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0uZmlsdGVyKChlbnRyeVBhdGgpID0+XG5cdFx0XHRtb2R1bGVzLmluY2x1ZGVzKGVudHJ5UGF0aCksXG5cdFx0KTtcblxuXHRcdGlmIChhZmZlY3RlZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgQ2hhbmdlIGluICR7ZnVsbFBhdGh9IGRvZXMgbm90IGFmZmVjdCBlbnRyeSDigJQgc2tpcHBpbmcgcmVsb2FkYCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXG5cdFx0XHRgQ2hhbmdlIGluICR7ZnVsbFBhdGh9IGFmZmVjdHMgJHttb2R1bGVzLmxlbmd0aH0gbW9kdWxlKHMpIOKAlCBzY2hlZHVsaW5nIHJlbG9hZGAsXG5cdFx0KTtcblx0XHR0aGlzLmludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlcyk7XG5cdFx0Zm9yIChjb25zdCBlbnRyeVBhdGggb2YgYWZmZWN0ZWRFbnRyaWVzKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuYWRkKGVudHJ5UGF0aCk7XG5cdFx0fVxuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIOKUgOKUgCBEZXBlbmRlbmN5IGdyYXBoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHRoaXMuaXNTZWxmKG1vZHVsZUlkKSkgcmV0dXJuIFtdO1xuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUobW9kdWxlKTtcblx0XHRcdC8vIFBydW5lIHN0YWxlIG91dGdvaW5nIGVkZ2VzOiByZW1vdmUgdGhpcyBtb2R1bGUgYXMgYSBwYXJlbnQgZnJvbSBhbGwgZGVwZW5kZW5jeSBsaXN0c1xuXHRcdFx0Zm9yIChjb25zdCBba2V5LCBwYXJlbnRzXSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZCA9IHBhcmVudHMuZmlsdGVyKChwKSA9PiBwICE9PSBtb2R1bGUpO1xuXHRcdFx0XHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuc2V0KGtleSwgZmlsdGVyZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmxvYWRlci5zb3VyY2VGaWxlUGF0aHMoKSkge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwicGF0aCIsImlvIiwiZGVib3VuY2UiLCJzY3JpYmUiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJmaWxlVXJsVG9QYXRoIiwidXJsIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsInJlc29sdmVSZWJvb3REZWJvdW5jZU1zIiwidmFsdWUiLCJkZWxheSIsIk51bWJlciIsImlzRmluaXRlIiwiRXJyb3IiLCJTdHJpbmciLCJtb2R1bGVWZXJzaW9uU2VxIiwiSG90UmVsb2FkU2VydmVyIiwibG9nZ2VyIiwibmFtZSIsImxvYWRlciIsImRpc3Bvc2VkIiwiZW50cmllcyIsIk1hcCIsInBlbmRpbmdFbnRyeVJlYm9vdHMiLCJTZXQiLCJ3YXRjaFN1YnNjcmlwdGlvbiIsIm1vZHVsZUNhY2hlIiwiZGVwZW5kZW5jaWVzIiwicmVib290VGFpbCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVib290RGVib3VuY2VHZW4iLCJyZWJvb3RJbkZsaWdodCIsInJlYm9vdEZvbGxvd1VwIiwicmVib290UXVldWVkIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyZSIsIndvcmtzcGFjZSIsInZlcnNpb25GaWxlVXJsIiwiZmlsZVVybCIsImdldENhY2hlZE9yTmV3Iiwib25SZXNvbHZlZCIsIm9uUG9zdFJlc29sdmUiLCJyZXF1aXJlV29ya3NwYWNlIiwic2VsZWN0ZWQiLCJyZXNvbHZlUHJvamVjdHMiLCJwcm9qZWN0IiwiZW50cnlQYXRoIiwiZ2V0U291cmNlRW50cnlQYXRoIiwic2V0IiwicmVnaXN0ZXJIb29rcyIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsImVudHJ5IiwidmFsdWVzIiwidHJhY2UiLCJib290RW50cmllcyIsImtleXMiLCJlbWl0IiwiZGlzcG9zZSIsInVuc3Vic2NyaWJlIiwiZGlzcG9zZUVudHJpZXMiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJlbnRyeVBhdGhzIiwiYWxsIiwibWFwIiwiYm9vdEVudHJ5Iiwic3RhdGUiLCJnZXQiLCJtb2QiLCJpbXBvcnRFbnRyeSIsIm1vZHVsZSIsImRlZmF1bHQiLCJlcnJvciIsInVuZGVmaW5lZCIsImRlbGF5TXMiLCJnZW4iLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsImxlbmd0aCIsIm5lZWRzRm9sbG93VXAiLCJkaXNwb3NlRW50cnkiLCJwYXRocyIsInAiLCJnZXRXb3Jrc3BhY2UiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwibmFtZXMiLCJmaXJzdCIsImF0IiwiZm91bmQiLCJmaW5kIiwicHVzaCIsInJlc3VsdCIsInBhcmVudFVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJ1cmxPYmoiLCJVUkwiLCJzZWFyY2giLCJ0b1N0cmluZyIsImlzU291cmNlIiwiaGFzU291cmNlRmlsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZXZ0IiwiZmlsZSIsImV2ZW50TmFtZSIsImZ1bGxQYXRoIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJpbnZhbGlkYXRlVHJhbnNwaWxlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwic2V0U291cmNlRmlsZSIsInJlbG9hZElmQWZmZWN0ZWQiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsImFmZmVjdGVkRW50cmllcyIsImZpbHRlciIsImluY2x1ZGVzIiwiaW52YWxpZGF0ZU1vZHVsZSIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsInNlYXJjaFBhcmFtcyIsImtleSIsInBhcmVudHMiLCJmaWx0ZXJlZCIsImRlbGV0ZSIsInNvdXJjZUZpbGVQYXRocyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUFRLGNBQWM7QUFFM0MsT0FBT0MsVUFBVSxZQUFZO0FBRTdCLFNBQVNDLEVBQUUsUUFBUSxxQkFBcUI7QUFDeEMsU0FBU0MsUUFBUSxRQUFRLHlCQUF5QjtBQUNsRCxTQUFzQkMsTUFBTSxRQUFRLG1CQUFtQjtBQUV2RCxTQUFTQyxrQkFBa0IsUUFBUSw0QkFBNEI7QUFFL0QsTUFBTUMsa0JBQWtCSixHQUFHSyxhQUFhLENBQUMsWUFBWUMsR0FBRztBQUN4RCxNQUFNQyxvQkFBb0I7QUFDMUIsc0RBQXNELEdBQ3RELE9BQU8sTUFBTUMsNkJBQTZCLElBQUk7QUFFOUMs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
package/es6/src/index.js CHANGED
@@ -2,5 +2,6 @@ export { DeferredScriptRunner } from "./deferred-script-runner.js";
2
2
  export { FluxModule } from "./flux.module.js";
3
3
  export { DEFAULT_REBOOT_DEBOUNCE_MS, HotReloadServer } from "./hot-reload-server.js";
4
4
  export { classifySliceProject, classifySliceProjects, normalizeSlicePrefix, projectsInSlice, projectsInSlices, resolveDeferScript } from "./slice-serve.js";
5
+ export { SourceModuleLoader } from "./source-module-loader.js";
5
6
 
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IERlZmVycmVkU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vZGVmZXJyZWQtc2NyaXB0LXJ1bm5lci5qc1wiO1xuZXhwb3J0IHsgRmx1eE1vZHVsZSB9IGZyb20gXCIuL2ZsdXgubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuZXhwb3J0IHsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsIEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHtcblx0dHlwZSBDbGFzc2lmaWVkU2xpY2UsXG5cdGNsYXNzaWZ5U2xpY2VQcm9qZWN0LFxuXHRjbGFzc2lmeVNsaWNlUHJvamVjdHMsXG5cdG5vcm1hbGl6ZVNsaWNlUHJlZml4LFxuXHRwcm9qZWN0c0luU2xpY2UsXG5cdHByb2plY3RzSW5TbGljZXMsXG5cdHJlc29sdmVEZWZlclNjcmlwdCxcblx0dHlwZSBTbGljZUtpbmQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcbiJdLCJuYW1lcyI6WyJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsIkZsdXhNb2R1bGUiLCJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsIkhvdFJlbG9hZFNlcnZlciIsImNsYXNzaWZ5U2xpY2VQcm9qZWN0IiwiY2xhc3NpZnlTbGljZVByb2plY3RzIiwibm9ybWFsaXplU2xpY2VQcmVmaXgiLCJwcm9qZWN0c0luU2xpY2UiLCJwcm9qZWN0c0luU2xpY2VzIiwicmVzb2x2ZURlZmVyU2NyaXB0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxvQkFBb0IsUUFBUSw4QkFBOEI7QUFDbkUsU0FBU0MsVUFBVSxRQUFRLG1CQUFtQjtBQUU5QyxTQUFTQywwQkFBMEIsRUFBRUMsZUFBZSxRQUFRLHlCQUF5QjtBQUVyRixTQUVDQyxvQkFBb0IsRUFDcEJDLHFCQUFxQixFQUNyQkMsb0JBQW9CLEVBQ3BCQyxlQUFlLEVBQ2ZDLGdCQUFnQixFQUNoQkMsa0JBQWtCLFFBR1osbUJBQW1CIn0=
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IERlZmVycmVkU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vZGVmZXJyZWQtc2NyaXB0LXJ1bm5lci5qc1wiO1xuZXhwb3J0IHsgRmx1eE1vZHVsZSB9IGZyb20gXCIuL2ZsdXgubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuZXhwb3J0IHsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsIEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9ydW4uYWN0aW9uLmpzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHtcblx0dHlwZSBDbGFzc2lmaWVkU2xpY2UsXG5cdGNsYXNzaWZ5U2xpY2VQcm9qZWN0LFxuXHRjbGFzc2lmeVNsaWNlUHJvamVjdHMsXG5cdG5vcm1hbGl6ZVNsaWNlUHJlZml4LFxuXHRwcm9qZWN0c0luU2xpY2UsXG5cdHByb2plY3RzSW5TbGljZXMsXG5cdHJlc29sdmVEZWZlclNjcmlwdCxcblx0dHlwZSBTbGljZUtpbmQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcbmV4cG9ydCB0eXBlIHsgU291cmNlTW9kdWxlTG9hZGVyT3B0aW9ucyB9IGZyb20gXCIuL3NvdXJjZS1tb2R1bGUtbG9hZGVyLmpzXCI7XG5leHBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuIl0sIm5hbWVzIjpbIkRlZmVycmVkU2NyaXB0UnVubmVyIiwiRmx1eE1vZHVsZSIsIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiSG90UmVsb2FkU2VydmVyIiwiY2xhc3NpZnlTbGljZVByb2plY3QiLCJjbGFzc2lmeVNsaWNlUHJvamVjdHMiLCJub3JtYWxpemVTbGljZVByZWZpeCIsInByb2plY3RzSW5TbGljZSIsInByb2plY3RzSW5TbGljZXMiLCJyZXNvbHZlRGVmZXJTY3JpcHQiLCJTb3VyY2VNb2R1bGVMb2FkZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLG9CQUFvQixRQUFRLDhCQUE4QjtBQUNuRSxTQUFTQyxVQUFVLFFBQVEsbUJBQW1CO0FBRTlDLFNBQVNDLDBCQUEwQixFQUFFQyxlQUFlLFFBQVEseUJBQXlCO0FBR3JGLFNBRUNDLG9CQUFvQixFQUNwQkMscUJBQXFCLEVBQ3JCQyxvQkFBb0IsRUFDcEJDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsUUFHWixtQkFBbUI7QUFFMUIsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCIn0=
@@ -0,0 +1,58 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import path from "node:path";
11
+ import { injectable } from "@decohere/crucible/decorators";
12
+ // biome-ignore lint/style/useImportType: <DI>
13
+ import { Workspace } from "@decohere/mesh";
14
+ import { ActionResponse } from "@decohere/nexus/cli";
15
+ import { scribe } from "@decohere/scribe";
16
+ // biome-ignore lint/style/useImportType: <DI>
17
+ import { SourceModuleLoader } from "./source-module-loader.js";
18
+ export class RunAction {
19
+ loader;
20
+ workspace;
21
+ logger = scribe.logger(RunAction.name);
22
+ constructor(loader, workspace){
23
+ this.loader = loader;
24
+ this.workspace = workspace;
25
+ }
26
+ async run(options) {
27
+ const entry = options.entry?.trim();
28
+ if (entry == null || entry === "") {
29
+ throw new Error("flux run requires an entry file path");
30
+ }
31
+ const absoluteEntry = path.resolve(entry);
32
+ const passthrough = options.args ?? [];
33
+ await this.loader.configure({
34
+ workspace: this.workspace,
35
+ buildConfig: options.configuration
36
+ });
37
+ this.loader.registerHooks();
38
+ // Bin-style entries (forge.ts, flux.ts) read process.argv.slice(2).
39
+ process.argv = [
40
+ process.execPath,
41
+ absoluteEntry,
42
+ ...passthrough
43
+ ];
44
+ this.logger.trace(`Running ${absoluteEntry}`);
45
+ await this.loader.importEntry(absoluteEntry);
46
+ return ActionResponse.Success(RunAction.name);
47
+ }
48
+ }
49
+ RunAction = _ts_decorate([
50
+ injectable(),
51
+ _ts_metadata("design:type", Function),
52
+ _ts_metadata("design:paramtypes", [
53
+ typeof SourceModuleLoader === "undefined" ? Object : SourceModuleLoader,
54
+ typeof Workspace === "undefined" ? Object : Workspace
55
+ ])
56
+ ], RunAction);
57
+
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3J1bi5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBSdW5PcHRpb25zID0ge1xuXHQvKiogQWJzb2x1dGUgb3IgY3dkLXJlbGF0aXZlIHBhdGggdG8gYSBgLnRzYCBlbnRyeSBmaWxlLiAqL1xuXHRlbnRyeTogc3RyaW5nO1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBlbnRyeSAoYmluLXN0eWxlIGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS4gKi9cblx0YXJncz86IHN0cmluZ1tdO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bkFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxSdW5PcHRpb25zPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFJ1bkFjdGlvbi5uYW1lKTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXI6IFNvdXJjZU1vZHVsZUxvYWRlcixcblx0XHRwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZTogV29ya3NwYWNlLFxuXHQpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBSdW5PcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRcdGNvbnN0IGVudHJ5ID0gb3B0aW9ucy5lbnRyeT8udHJpbSgpO1xuXHRcdGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5ID09PSBcIlwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJmbHV4IHJ1biByZXF1aXJlcyBhbiBlbnRyeSBmaWxlIHBhdGhcIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWJzb2x1dGVFbnRyeSA9IHBhdGgucmVzb2x2ZShlbnRyeSk7XG5cdFx0Y29uc3QgcGFzc3Rocm91Z2ggPSBvcHRpb25zLmFyZ3MgPz8gW107XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdGJ1aWxkQ29uZmlnOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24sXG5cdFx0fSk7XG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXG5cdFx0Ly8gQmluLXN0eWxlIGVudHJpZXMgKGZvcmdlLnRzLCBmbHV4LnRzKSByZWFkIHByb2Nlc3MuYXJndi5zbGljZSgyKS5cblx0XHRwcm9jZXNzLmFyZ3YgPSBbcHJvY2Vzcy5leGVjUGF0aCwgYWJzb2x1dGVFbnRyeSwgLi4ucGFzc3Rocm91Z2hdO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJ1bm5pbmcgJHthYnNvbHV0ZUVudHJ5fWApO1xuXHRcdGF3YWl0IHRoaXMubG9hZGVyLmltcG9ydEVudHJ5KGFic29sdXRlRW50cnkpO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFJ1bkFjdGlvbi5uYW1lKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJzY3JpYmUiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJSdW5BY3Rpb24iLCJsb2dnZXIiLCJuYW1lIiwibG9hZGVyIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsImVudHJ5IiwidHJpbSIsIkVycm9yIiwiYWJzb2x1dGVFbnRyeSIsInJlc29sdmUiLCJwYXNzdGhyb3VnaCIsImFyZ3MiLCJjb25maWd1cmUiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyYXRpb24iLCJyZWdpc3Rlckhvb2tzIiwicHJvY2VzcyIsImFyZ3YiLCJleGVjUGF0aCIsInRyYWNlIiwiaW1wb3J0RW50cnkiLCJTdWNjZXNzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPQSxVQUFVLFlBQVk7QUFDN0IsU0FBU0MsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCw4Q0FBOEM7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLGlCQUFpQjtBQUMzQyxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFzQkMsTUFBTSxRQUFRLG1CQUFtQjtBQUN2RCw4Q0FBOEM7QUFDOUMsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCO0FBVy9ELE9BQU8sTUFBTUM7OztJQUNLQyxTQUFpQkgsT0FBT0csTUFBTSxDQUFDRCxVQUFVRSxJQUFJLEVBQUU7SUFFaEUsWUFDQyxBQUFpQkMsTUFBMEIsRUFDM0MsQUFBaUJDLFNBQW9CLENBQ3BDO2FBRmdCRCxTQUFBQTthQUNBQyxZQUFBQTtJQUNmO0lBRUgsTUFBYUMsSUFBSUMsT0FBbUIsRUFBMkI7UUFDOUQsTUFBTUMsUUFBUUQsUUFBUUMsS0FBSyxFQUFFQztRQUM3QixJQUFJRCxTQUFTLFFBQVFBLFVBQVUsSUFBSTtZQUNsQyxNQUFNLElBQUlFLE1BQU07UUFDakI7UUFFQSxNQUFNQyxnQkFBZ0JoQixLQUFLaUIsT0FBTyxDQUFDSjtRQUNuQyxNQUFNSyxjQUFjTixRQUFRTyxJQUFJLElBQUksRUFBRTtRQUV0QyxNQUFNLElBQUksQ0FBQ1YsTUFBTSxDQUFDVyxTQUFTLENBQUM7WUFDM0JWLFdBQVcsSUFBSSxDQUFDQSxTQUFTO1lBQ3pCVyxhQUFhVCxRQUFRVSxhQUFhO1FBQ25DO1FBQ0EsSUFBSSxDQUFDYixNQUFNLENBQUNjLGFBQWE7UUFFekIsb0VBQW9FO1FBQ3BFQyxRQUFRQyxJQUFJLEdBQUc7WUFBQ0QsUUFBUUUsUUFBUTtZQUFFVjtlQUFrQkU7U0FBWTtRQUVoRSxJQUFJLENBQUNYLE1BQU0sQ0FBQ29CLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRVgsZUFBZTtRQUM1QyxNQUFNLElBQUksQ0FBQ1AsTUFBTSxDQUFDbUIsV0FBVyxDQUFDWjtRQUM5QixPQUFPYixlQUFlMEIsT0FBTyxDQUFDdkIsVUFBVUUsSUFBSTtJQUM3QztBQUNEIn0=
@@ -0,0 +1,57 @@
1
+ import { ConfigurationOption, DecohereCommand } from "@decohere/nexus/cli";
2
+ import { RunAction } from "./run.action.js";
3
+ export class RunCommand extends DecohereCommand {
4
+ get actions() {
5
+ return [
6
+ RunAction
7
+ ];
8
+ }
9
+ constructor(name){
10
+ super(name);
11
+ this.description("Compile and run a TypeScript entry on the fly (no watch / HMR)");
12
+ this.argument("<entry>", "Path to the TypeScript entry file");
13
+ this.argument("[args...]", "Arguments forwarded to the entry after rewriting argv");
14
+ this.addOption(new ConfigurationOption("debug"));
15
+ }
16
+ /**
17
+ * Commander passes positionals before options when `<entry> [args...]` is declared.
18
+ * Terminal's ModuleFactory expects `(opts, cmd)` — normalize and stash entry/args on opts.
19
+ */ action(fn) {
20
+ return super.action((...args)=>{
21
+ const cmd = args.at(-1);
22
+ const opts = args.at(-2);
23
+ const { entry, entryArgs } = normalizeRunPositionals(args.slice(0, -2));
24
+ cmd.setOptionValue("entry", entry);
25
+ cmd.setOptionValue("args", entryArgs);
26
+ return fn(opts, cmd);
27
+ });
28
+ }
29
+ }
30
+ /** Commander yields `[entry, args[]]` or sometimes a flat list depending on arity. */ function normalizeRunPositionals(positionals) {
31
+ if (positionals.length === 0) {
32
+ return {
33
+ entry: "",
34
+ entryArgs: []
35
+ };
36
+ }
37
+ const first = positionals[0];
38
+ if (typeof first !== "string" || first === "") {
39
+ return {
40
+ entry: "",
41
+ entryArgs: []
42
+ };
43
+ }
44
+ const second = positionals[1];
45
+ if (Array.isArray(second)) {
46
+ return {
47
+ entry: first,
48
+ entryArgs: second.filter((s)=>typeof s === "string")
49
+ };
50
+ }
51
+ return {
52
+ entry: first,
53
+ entryArgs: positionals.slice(1).filter((s)=>typeof s === "string" && s !== "")
54
+ };
55
+ }
56
+
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3J1bi5jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ3VyYXRpb25PcHRpb24sIERlY29oZXJlQ29tbWFuZCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvblZhbHVlcyB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IFJ1bkFjdGlvbiB9IGZyb20gXCIuL3J1bi5hY3Rpb24uanNcIjtcblxuZXhwb3J0IGNsYXNzIFJ1bkNvbW1hbmQgZXh0ZW5kcyBEZWNvaGVyZUNvbW1hbmQge1xuXHRwdWJsaWMgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7XG5cdFx0cmV0dXJuIFtSdW5BY3Rpb25dO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUpO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24oXCJDb21waWxlIGFuZCBydW4gYSBUeXBlU2NyaXB0IGVudHJ5IG9uIHRoZSBmbHkgKG5vIHdhdGNoIC8gSE1SKVwiKTtcblx0XHR0aGlzLmFyZ3VtZW50KFwiPGVudHJ5PlwiLCBcIlBhdGggdG8gdGhlIFR5cGVTY3JpcHQgZW50cnkgZmlsZVwiKTtcblx0XHR0aGlzLmFyZ3VtZW50KFwiW2FyZ3MuLi5dXCIsIFwiQXJndW1lbnRzIGZvcndhcmRlZCB0byB0aGUgZW50cnkgYWZ0ZXIgcmV3cml0aW5nIGFyZ3ZcIik7XG5cdFx0dGhpcy5hZGRPcHRpb24obmV3IENvbmZpZ3VyYXRpb25PcHRpb24oXCJkZWJ1Z1wiKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29tbWFuZGVyIHBhc3NlcyBwb3NpdGlvbmFscyBiZWZvcmUgb3B0aW9ucyB3aGVuIGA8ZW50cnk+IFthcmdzLi4uXWAgaXMgZGVjbGFyZWQuXG5cdCAqIFRlcm1pbmFsJ3MgTW9kdWxlRmFjdG9yeSBleHBlY3RzIGAob3B0cywgY21kKWAg4oCUIG5vcm1hbGl6ZSBhbmQgc3Rhc2ggZW50cnkvYXJncyBvbiBvcHRzLlxuXHQgKi9cblx0cHVibGljIG92ZXJyaWRlIGFjdGlvbihmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPik6IHRoaXMge1xuXHRcdHJldHVybiBzdXBlci5hY3Rpb24oKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBjbWQgPSBhcmdzLmF0KC0xKSBhcyBEZWNvaGVyZUNvbW1hbmQ7XG5cdFx0XHRjb25zdCBvcHRzID0gYXJncy5hdCgtMikgYXMgT3B0aW9uVmFsdWVzO1xuXHRcdFx0Y29uc3QgeyBlbnRyeSwgZW50cnlBcmdzIH0gPSBub3JtYWxpemVSdW5Qb3NpdGlvbmFscyhhcmdzLnNsaWNlKDAsIC0yKSk7XG5cdFx0XHRjbWQuc2V0T3B0aW9uVmFsdWUoXCJlbnRyeVwiLCBlbnRyeSk7XG5cdFx0XHRjbWQuc2V0T3B0aW9uVmFsdWUoXCJhcmdzXCIsIGVudHJ5QXJncyk7XG5cdFx0XHRyZXR1cm4gZm4ob3B0cywgY21kKTtcblx0XHR9KTtcblx0fVxufVxuXG4vKiogQ29tbWFuZGVyIHlpZWxkcyBgW2VudHJ5LCBhcmdzW11dYCBvciBzb21ldGltZXMgYSBmbGF0IGxpc3QgZGVwZW5kaW5nIG9uIGFyaXR5LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUnVuUG9zaXRpb25hbHMocG9zaXRpb25hbHM6IHVua25vd25bXSk6IHtcblx0ZW50cnk6IHN0cmluZztcblx0ZW50cnlBcmdzOiBzdHJpbmdbXTtcbn0ge1xuXHRpZiAocG9zaXRpb25hbHMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIHsgZW50cnk6IFwiXCIsIGVudHJ5QXJnczogW10gfTtcblx0fVxuXG5cdGNvbnN0IGZpcnN0ID0gcG9zaXRpb25hbHNbMF07XG5cdGlmICh0eXBlb2YgZmlyc3QgIT09IFwic3RyaW5nXCIgfHwgZmlyc3QgPT09IFwiXCIpIHtcblx0XHRyZXR1cm4geyBlbnRyeTogXCJcIiwgZW50cnlBcmdzOiBbXSB9O1xuXHR9XG5cblx0Y29uc3Qgc2Vjb25kID0gcG9zaXRpb25hbHNbMV07XG5cdGlmIChBcnJheS5pc0FycmF5KHNlY29uZCkpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZW50cnk6IGZpcnN0LFxuXHRcdFx0ZW50cnlBcmdzOiBzZWNvbmQuZmlsdGVyKChzKTogcyBpcyBzdHJpbmcgPT4gdHlwZW9mIHMgPT09IFwic3RyaW5nXCIpLFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGVudHJ5OiBmaXJzdCxcblx0XHRlbnRyeUFyZ3M6IHBvc2l0aW9uYWxzXG5cdFx0XHQuc2xpY2UoMSlcblx0XHRcdC5maWx0ZXIoKHMpOiBzIGlzIHN0cmluZyA9PiB0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiAmJiBzICE9PSBcIlwiKSxcblx0fTtcbn1cbiJdLCJuYW1lcyI6WyJDb25maWd1cmF0aW9uT3B0aW9uIiwiRGVjb2hlcmVDb21tYW5kIiwiUnVuQWN0aW9uIiwiUnVuQ29tbWFuZCIsImFjdGlvbnMiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJhcmd1bWVudCIsImFkZE9wdGlvbiIsImFjdGlvbiIsImZuIiwiYXJncyIsImNtZCIsImF0Iiwib3B0cyIsImVudHJ5IiwiZW50cnlBcmdzIiwibm9ybWFsaXplUnVuUG9zaXRpb25hbHMiLCJzbGljZSIsInNldE9wdGlvblZhbHVlIiwicG9zaXRpb25hbHMiLCJsZW5ndGgiLCJmaXJzdCIsInNlY29uZCIsIkFycmF5IiwiaXNBcnJheSIsImZpbHRlciIsInMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLG1CQUFtQixFQUFFQyxlQUFlLFFBQVEsc0JBQXNCO0FBRTNFLFNBQVNDLFNBQVMsUUFBUSxrQkFBa0I7QUFFNUMsT0FBTyxNQUFNQyxtQkFBbUJGO0lBQy9CLElBQW9CRyxVQUFVO1FBQzdCLE9BQU87WUFBQ0Y7U0FBVTtJQUNuQjtJQUVBLFlBQW1CRyxJQUFZLENBQUU7UUFDaEMsS0FBSyxDQUFDQTtRQUNOLElBQUksQ0FBQ0MsV0FBVyxDQUFDO1FBQ2pCLElBQUksQ0FBQ0MsUUFBUSxDQUFDLFdBQVc7UUFDekIsSUFBSSxDQUFDQSxRQUFRLENBQUMsYUFBYTtRQUMzQixJQUFJLENBQUNDLFNBQVMsQ0FBQyxJQUFJUixvQkFBb0I7SUFDeEM7SUFFQTs7O0VBR0MsR0FDRCxBQUFnQlMsT0FBT0MsRUFBNEMsRUFBUTtRQUMxRSxPQUFPLEtBQUssQ0FBQ0QsT0FBTyxDQUFDLEdBQUdFO1lBQ3ZCLE1BQU1DLE1BQU1ELEtBQUtFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLE1BQU1DLE9BQU9ILEtBQUtFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sRUFBRUUsS0FBSyxFQUFFQyxTQUFTLEVBQUUsR0FBR0Msd0JBQXdCTixLQUFLTyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ3BFTixJQUFJTyxjQUFjLENBQUMsU0FBU0o7WUFDNUJILElBQUlPLGNBQWMsQ0FBQyxRQUFRSDtZQUMzQixPQUFPTixHQUFHSSxNQUFNRjtRQUNqQjtJQUNEO0FBQ0Q7QUFFQSxvRkFBb0YsR0FDcEYsU0FBU0ssd0JBQXdCRyxXQUFzQjtJQUl0RCxJQUFJQSxZQUFZQyxNQUFNLEtBQUssR0FBRztRQUM3QixPQUFPO1lBQUVOLE9BQU87WUFBSUMsV0FBVyxFQUFFO1FBQUM7SUFDbkM7SUFFQSxNQUFNTSxRQUFRRixXQUFXLENBQUMsRUFBRTtJQUM1QixJQUFJLE9BQU9FLFVBQVUsWUFBWUEsVUFBVSxJQUFJO1FBQzlDLE9BQU87WUFBRVAsT0FBTztZQUFJQyxXQUFXLEVBQUU7UUFBQztJQUNuQztJQUVBLE1BQU1PLFNBQVNILFdBQVcsQ0FBQyxFQUFFO0lBQzdCLElBQUlJLE1BQU1DLE9BQU8sQ0FBQ0YsU0FBUztRQUMxQixPQUFPO1lBQ05SLE9BQU9PO1lBQ1BOLFdBQVdPLE9BQU9HLE1BQU0sQ0FBQyxDQUFDQyxJQUFtQixPQUFPQSxNQUFNO1FBQzNEO0lBQ0Q7SUFFQSxPQUFPO1FBQ05aLE9BQU9PO1FBQ1BOLFdBQVdJLFlBQ1RGLEtBQUssQ0FBQyxHQUNOUSxNQUFNLENBQUMsQ0FBQ0MsSUFBbUIsT0FBT0EsTUFBTSxZQUFZQSxNQUFNO0lBQzdEO0FBQ0QifQ==