@firestitch/report 18.6.0 → 18.6.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 (31) hide show
  1. package/app/reports/components/component-kpi/component-kpi.component.d.ts +2 -1
  2. package/app/reports/components/component-list/component-list.component.d.ts +0 -1
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +1 -0
  4. package/app/reports/components/report-component/report-component.component.d.ts +2 -1
  5. package/app/reports/format.d.ts +2 -2
  6. package/app/reports/interfaces/report.interface.d.ts +1 -0
  7. package/app/reports/option-builder.d.ts +2 -1
  8. package/app/reports/report-url-state.d.ts +1 -0
  9. package/app/reports/services/report-filter-state.service.d.ts +3 -0
  10. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +7 -4
  11. package/esm2022/app/reports/components/component-list/component-list.component.mjs +6 -28
  12. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +8 -3
  13. package/esm2022/app/reports/components/report-component/report-component.component.mjs +5 -3
  14. package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +2 -2
  15. package/esm2022/app/reports/export/report-export-collector.service.mjs +8 -6
  16. package/esm2022/app/reports/export/report-pdf.service.mjs +7 -6
  17. package/esm2022/app/reports/export/report-pptx.service.mjs +7 -6
  18. package/esm2022/app/reports/format.mjs +13 -7
  19. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  20. package/esm2022/app/reports/option-builder.mjs +16 -1
  21. package/esm2022/app/reports/report-url-state.mjs +5 -1
  22. package/esm2022/app/reports/services/report-filter-state.service.mjs +43 -12
  23. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +11 -4
  24. package/esm2022/app/reports/views/report/report.component.mjs +6 -2
  25. package/fesm2022/{firestitch-report-echarts-B9nl9XKM.mjs → firestitch-report-echarts-Djtmaxj1.mjs} +2 -2
  26. package/fesm2022/{firestitch-report-echarts-B9nl9XKM.mjs.map → firestitch-report-echarts-Djtmaxj1.mjs.map} +1 -1
  27. package/fesm2022/{firestitch-report-firestitch-report-Bb65HEYB.mjs → firestitch-report-firestitch-report-D3zseBZc.mjs} +130 -91
  28. package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +1 -0
  29. package/fesm2022/firestitch-report.mjs +1 -1
  30. package/package.json +1 -1
  31. package/fesm2022/firestitch-report-firestitch-report-Bb65HEYB.mjs.map +0 -1
@@ -327,6 +327,15 @@ export class ReportFilterStateService {
327
327
  }
328
328
  // Applies the viewer state read from the URL on top of the seeded defaults.
329
329
  _restore(report, restore) {
330
+ this._restoreGroups(restore);
331
+ this._restoreListSorts(report, restore);
332
+ // The URL is the whole truth on a first load: no grain in it means the
333
+ // authored ones. The host still drops a grain the report does not offer.
334
+ this._frequency = GRANULARITY_OPTIONS
335
+ .find((option) => option.value === restore.groupBy)?.value ?? null;
336
+ }
337
+ // The URL's group values. An empty one is an explicit clear of the group.
338
+ _restoreGroups(restore) {
330
339
  restore.groups.forEach((raw, groupId) => {
331
340
  const group = this._groups.get(groupId);
332
341
  const value = group
@@ -343,6 +352,10 @@ export class ReportFilterStateService {
343
352
  this._cleared.delete(groupId);
344
353
  }
345
354
  });
355
+ }
356
+ // The URL's list sorts, each kept only for a list the report has and a
357
+ // column that list can be sorted by.
358
+ _restoreListSorts(report, restore) {
346
359
  const lists = new Map(this._listComponents(report).map((component) => [component.id, component]));
347
360
  restore.listSorts.forEach((raw, componentId) => {
348
361
  const component = lists.get(componentId);
@@ -351,12 +364,10 @@ export class ReportFilterStateService {
351
364
  this._listSorts.set(componentId, sort);
352
365
  }
353
366
  });
354
- // The URL is the whole truth on a first load: no grain in it means the
355
- // authored ones. The host still drops a grain the report does not offer.
356
- this._frequency = GRANULARITY_OPTIONS
357
- .find((option) => option.value === restore.groupBy)?.value ?? null;
358
367
  }
359
- // Drops state kept for groups and lists the report no longer has.
368
+ // Drops state kept for groups, lists and filters the report no longer has.
369
+ // A list sort also goes when its column does: the agent can remove or rename
370
+ // it, and the recreated list would send a column the query does not know.
360
371
  _prune(report) {
361
372
  for (const groupId of [...this._values.keys(), ...this._cleared]) {
362
373
  if (!this._groups.has(groupId)) {
@@ -364,12 +375,20 @@ export class ReportFilterStateService {
364
375
  this._cleared.delete(groupId);
365
376
  }
366
377
  }
367
- const listIds = new Set(this._listComponents(report).map((component) => component.id));
368
- for (const componentId of [...this._listSorts.keys()]) {
369
- if (!listIds.has(componentId)) {
378
+ const lists = new Map(this._listComponents(report).map((component) => [component.id, component]));
379
+ this._listSorts.forEach((sort, componentId) => {
380
+ const component = lists.get(componentId);
381
+ if (!component || !this._sortableColumns(component).includes(sort.column)) {
370
382
  this._listSorts.delete(componentId);
371
383
  }
372
- }
384
+ });
385
+ const filterIds = new Set(this._components(report)
386
+ .flatMap((component) => (component.filters ?? []).map((filter) => filter.id)));
387
+ this._sessionDisabled.forEach((filterId) => {
388
+ if (!filterIds.has(filterId)) {
389
+ this._sessionDisabled.delete(filterId);
390
+ }
391
+ });
373
392
  }
374
393
  // The value a bar sets, keeping the stored preset name while the days are
375
394
  // still the stored days (see setValue).
@@ -390,6 +409,12 @@ export class ReportFilterStateService {
390
409
  }
391
410
  switch (group.type) {
392
411
  case 'dateRange':
412
+ // An untouched rolling default still carries its preset name. Its days
413
+ // were resolved when it was seeded, and after midnight they no longer
414
+ // match today's, but it is still the default and stays out of the URL.
415
+ if (value.preset && value.preset === group.config?.default?.relative) {
416
+ return true;
417
+ }
393
418
  return sameDays(value, defaultValue);
394
419
  case 'select': {
395
420
  const values = (value.values ?? []).map(String).sort();
@@ -401,9 +426,15 @@ export class ReportFilterStateService {
401
426
  return (value.value ?? '').trim() === (defaultValue.value ?? '').trim();
402
427
  }
403
428
  }
429
+ // Every component of the report: its pages' and its header and footer's.
430
+ _components(report) {
431
+ return [
432
+ ...(report.pages ?? []).flatMap((page) => page.components ?? []),
433
+ ...(report.master?.components ?? []),
434
+ ];
435
+ }
404
436
  _listComponents(report) {
405
- return (report.pages ?? [])
406
- .flatMap((page) => page.components ?? [])
437
+ return this._components(report)
407
438
  .filter((component) => component.type === 'list');
408
439
  }
409
440
  // The columns a list can be sorted by: every authored column, or a
@@ -493,4 +524,4 @@ export class ReportFilterStateService {
493
524
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
494
525
  type: Injectable
495
526
  }] });
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEQsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxHQUM3QixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRS9ELE9BQU8sRUFJTCxtQkFBbUIsR0FRcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUdwRSxrRkFBa0Y7QUFDbEYsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxXQUFXLENBQ3pCLENBQTRCLEVBQzVCLENBQTRCO0lBRTVCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSztXQUNyQixDQUFD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YTtnQkFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDakQsS0FBSyxXQUFXO2dCQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNsRCxLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQy9DO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO3dHQS9mVSx3QkFBd0I7NEdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgYXMgcnhGaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIGVuZE9mV2Vlaywgc3RhcnRPZk1vbnRoLCBzdGFydE9mUXVhcnRlciwgc3RhcnRPZldlZWssIHN0YXJ0T2ZZZWFyLFxuICBzdWJEYXlzLCBzdWJNb250aHMsIHN1YldlZWtzLFxufSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9IGZyb20gJy4uL2NvbnN0cy9yZXBvcnQtd2Vlay5jb25zdCc7XG5pbXBvcnQgeyBnZXRab25lZE5vdywgcmVzb2x2ZVJlcG9ydFRpbWV6b25lIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1jaGF0LXZpZXdlci1maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIEZpbHRlckdyb3VwRGVmYXVsdCxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRTb3J0LFxuICBSZXBvcnRVcmxQYXJhbXMsXG4gIFJlcG9ydFVybFNuYXBzaG90LFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBkZWNvZGVGaWx0ZXJWYWx1ZSwgZGVjb2RlU29ydCB9IGZyb20gJy4uL3JlcG9ydC11cmwtc3RhdGUnO1xuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBmaWx0ZXItZ3JvdXAgZGVmYXVsdHMgYXJlIHRoZSBzYW1lLiBDb21wYXJlZCBvbiB0aGUgZmllbGRzIGFcbi8vIGRlZmF1bHQgY2FuIGFjdHVhbGx5IGNhcnJ5LCBzbyBrZXkgb3JkZXIgaW4gdGhlIHBheWxvYWQgY2FuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRGVmYXVsdChcbiAgYTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbiAgYjogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICByZXR1cm4gYS5zdGFydCA9PT0gYi5zdGFydFxuICAgICYmIGEuZW5kID09PSBiLmVuZFxuICAgICYmIGEudmFsdWUgPT09IGIudmFsdWVcbiAgICAmJiBhLnJlbGF0aXZlID09PSBiLnJlbGF0aXZlXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5sZW5ndGggPT09IChiLnZhbHVlcyA/PyBbXSkubGVuZ3RoXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gKGIudmFsdWVzID8/IFtdKVtpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGxpc3Qgc29ydHMgb3JkZXIgdGhlIHJvd3MgdGhlIHNhbWUgd2F5LiBObyBkaXJlY3Rpb24gcmVhZHMgYXNcbi8vIGFzY2VuZGluZywgdGhlIHdheSB0aGUgbGlzdCBhcHBsaWVzIGl0LlxuZnVuY3Rpb24gc2FtZVNvcnQoYTogUmVwb3J0U29ydCwgYjogUmVwb3J0U29ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhYlxuICAgICYmIGEuY29sdW1uID09PSBiLmNvbHVtblxuICAgICYmIChhLmRpcmVjdGlvbiA/PyAnYXNjJykgPT09IChiLmRpcmVjdGlvbiA/PyAnYXNjJyk7XG59XG5cblxuLy8gV2hldGhlciB0d28gZGF0ZS1yYW5nZSB2YWx1ZXMgY292ZXIgdGhlIHNhbWUgY2FsZW5kYXIgZGF5cy5cbmZ1bmN0aW9uIHNhbWVEYXlzKGE6IEZpbHRlckdyb3VwVmFsdWUsIGI6IEZpbHRlckdyb3VwVmFsdWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGRhdGVCb3VuZFN0cmluZyhhLnN0YXJ0KSA9PT0gZGF0ZUJvdW5kU3RyaW5nKGIuc3RhcnQpXG4gICAgJiYgZGF0ZUJvdW5kU3RyaW5nKGEuZW5kKSA9PT0gZGF0ZUJvdW5kU3RyaW5nKGIuZW5kKTtcbn1cblxuXG4vLyBBIHN0YWJsZSBzaWduYXR1cmUgZm9yIGEgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC4gVGhlIHJlcG9ydCB0b29sYmFyIGtleXMgaXRzXG4vLyBmcy1maWx0ZXIgb24gdGhpcywgYmVjYXVzZSBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQg4oCUIHdpdGhvdXQgYVxuLy8ga2V5IGNoYW5nZSBpdCBrZWVwcyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIGV2ZW4gYWZ0ZXIgdGhlXG4vLyBjb25maWcgYmVoaW5kIGl0IGhhcyBiZWVuIHJlYnVpbHQuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFNpZ25hdHVyZShncm91cDogUmVwb3J0RmlsdGVyR3JvdXApOiBzdHJpbmcge1xuICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG5cbiAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGdyb3VwRGVmYXVsdC5zdGFydCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQuZW5kID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC52YWx1ZSA/PyAnJyxcbiAgICBncm91cERlZmF1bHQucmVsYXRpdmUgPz8gJycsXG4gICAgKGdyb3VwRGVmYXVsdC52YWx1ZXMgPz8gW10pLmpvaW4oJywnKSxcbiAgXS5qb2luKCd+Jyk7XG59XG5cblxuLy8gVmlld2VyIGZpbHRlciBzdGF0ZSBmb3IgdGhlIG9wZW4gcmVwb3J0LiBGaWx0ZXIgVkFMVUVTIGFyZSBuZXZlciBzYXZlZCB0b1xuLy8gdGhlIHJlcG9ydCDigJQgdGhpcyBzZXJ2aWNlIGhvbGRzIHRoZW0gcGVyIGZpbHRlciBHUk9VUCAodGhlIHByb3BhZ2F0aW9uIHVuaXQpLFxuLy8gcmVzb2x2ZXMgdGhlbSBpbnRvIHBlci1jb21wb25lbnQgbWVtYmVyLWZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggZGF0YSByZXF1ZXN0LFxuLy8gYW5kIG5vdGlmaWVzIHRoZSBjb21wb25lbnRzIHdob3NlIGdyb3VwcyBjaGFuZ2VkIHNvIG9ubHkgdGhleSByZWZldGNoLlxuLy9cbi8vIEl0IGlzIGFsc28gdGhlIG9uZSBzb3VyY2Ugb2YgdGhlIHZpZXdlciBzdGF0ZSB0aGUgcmVwb3J0IFVSTCBjYXJyaWVzIChncm91cFxuLy8gdmFsdWVzLCB0aGUgZ3JvdXAtYnkgZ3JhaW4sIGxpc3Qgc29ydHMpOiB1cmxTbmFwc2hvdCgpIHNheXMgd2hhdCBkaWZmZXJzIGZyb21cbi8vIHRoZSBhdXRob3JlZCBkZWZhdWx0cywgaW5pdCgpIHJlc3RvcmVzIGl0LCBhbmQgdXJsQ2hhbmdlcygpIHRlbGxzIHRoZSBob3N0J3Ncbi8vIHNpbmdsZSBVUkwgd3JpdGVyIHdoZW4gdG8gd3JpdGUuXG4vL1xuLy8gU2Vzc2lvbi1vbmx5LCBuZXZlciBpbiB0aGUgVVJMOiBwZXItZmlsdGVyIGVuYWJsZS9kaXNhYmxlIHRvZ2dsZXMgZnJvbSBhXG4vLyBjb21wb25lbnQncyBmaWx0ZXIgbWVudSAodGhlIGBlbmFibGVkYCBjb2x1bW4gaXMgdGhlIGF1dGhvcmVkIGRlZmF1bHQ7IGFcbi8vIHZpZXdlcidzIHRvZ2dsZSBzaG91bGRuJ3Qgd3JpdGUgdG8gdGhlIHJlcG9ydCkuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIHtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBlZmZlY3RpdmUgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lKS4gUmVsYXRpdmUgcHJlc2V0c1xuICAvLyByZXNvbHZlIGFnYWluc3QgdG9kYXkgaW4gaXQsIGFuZCBkYXRlIGNlbGxzIHJlbmRlciBpbiBpdC5cbiAgcHVibGljIHJlYWRvbmx5IHRpbWV6b25lID0gc2lnbmFsPHN0cmluZz4oJ1VUQycpO1xuXG4gIHByaXZhdGUgX3ZhbHVlcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlPigpO1xuICBwcml2YXRlIF9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHByaXZhdGUgX3Nlc3Npb25EaXNhYmxlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIEdyb3VwcyB0aGF0IGhhdmUgYSBkZWZhdWx0IHRoZSB2aWV3ZXIgY2xlYXJlZC4gV2l0aG91dCB0aGlzIGEgcmVsb2FkIG9mIHRoZVxuICAvLyByZXBvcnQgKGEgY2hhdCBlZGl0LCBhIGRpYWxvZykgd291bGQgZmluZCBubyB2YWx1ZSBmb3IgdGhlIGdyb3VwIGFuZCBzZWVkXG4gIC8vIGl0cyBkZWZhdWx0IHN0cmFpZ2h0IGJhY2suIEEgY2hhbmdlIHRvIHRoZSBzdG9yZWQgZGVmYXVsdCByZWxlYXNlcyBpdC5cbiAgcHJpdmF0ZSBfY2xlYXJlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sOiBhIHNpbmdsZSByZXBvcnQtd2lkZSBidWNrZXQgb3ZlcnJpZGUgZm9yIGFsbFxuICAvLyB0aW1lLXNlcmllcyBjaGFydHMuIFVuc2V0ID0gZWFjaCBjaGFydCB1c2VzIGl0cyBhdXRob3JlZCBncmFudWxhcml0eS4gTmV2ZXJcbiAgLy8gc2F2ZWQgdG8gdGhlIHJlcG9ydCAodGhlIFVSTCBjYXJyaWVzIGl0KSwgYW5kIGNhcnJpZWQgaW4gdGhlIGRhdGEgcmVxdWVzdCdzXG4gIC8vIGBzdGF0ZWAsIHNvIGl0IHByb3BhZ2F0ZXMgdGhyb3VnaCB0byB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0b28uIE5hbWVkXG4gIC8vIGZvciB0aGUgYGZyZXF1ZW5jeWAgd2lyZSBrZXkgaXQgdHJhdmVscyB1bmRlciwgbm90IGZvciB0aGUgY29udHJvbCdzIGxhYmVsLlxuICBwcml2YXRlIF9mcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHZpZXdlci1jaG9zZW4gc29ydCwgYnkgY29tcG9uZW50IGlkLiBIZWxkIGhlcmUgcmF0aGVyIHRoYW4gb25seVxuICAvLyBpbiB0aGUgbGlzdCdzIEZzTGlzdCBzbyBpdCBzdXJ2aXZlcyB0aGUgbGlzdCBiZWluZyByZWNyZWF0ZWQgKGEgcGFnZSBzd2l0Y2gsXG4gIC8vIGEgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGFuZCBzbyBldmVyeSBjb25zdW1lciBvZiB2aWV3ZXIgc3RhdGUgcmVhZHMgb25lIHBsYWNlLlxuICBwcml2YXRlIF9saXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0U29ydD4oKTtcblxuICAvLyBFbWl0cyB0aGUgZ3JvdXAgaWQgdGhhdCBjaGFuZ2VkOyBjb21wb25lbnRzIGxpc3RlbiBmaWx0ZXJlZCB0byB0aGVpciBvd25cbiAgLy8gZ3JvdXAgaWRzLiBudWxsID0gZXZlcnl0aGluZyBjaGFuZ2VkIChyZS1pbml0KS5cbiAgcHJpdmF0ZSBfY2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIGFueXRoaW5nIHRoZSBVUkwgY2FycmllcyBtYXkgaGF2ZSBjaGFuZ2VkLlxuICBwcml2YXRlIF91cmxDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIC8vXG4gIC8vIGByZXN0b3JlYCBpcyB0aGUgdmlld2VyIHN0YXRlIHJlYWQgZnJvbSB0aGUgVVJMLiBUaGUgaG9zdCBwYXNzZXMgaXQgb25seSBvblxuICAvLyB0aGUgZmlyc3QgbG9hZCBvZiBhIHJlcG9ydDsgYSByZWxvYWQgYWZ0ZXIgYSBjaGF0IG9yIGRpYWxvZyBlZGl0IHBhc3Nlc1xuICAvLyBudWxsLCBzbyB0aGUgaW4tbWVtb3J5IHN0YXRlIHdpbnMuIFBhcmFtcyB0aGF0IG5hbWUgYSBncm91cCwgbGlzdCBvciBjb2x1bW5cbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciB0aGF0IGRvIG5vdCBkZWNvZGUsIGFyZSBpZ25vcmVkLlxuICBwdWJsaWMgaW5pdChyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1RpbWV6b25lID0gdGhpcy50aW1lem9uZSgpO1xuXG4gICAgLy8gU2V0IGZpcnN0OiB0aGUgZGVmYXVsdHMgc2VlZGVkIGJlbG93IHJlc29sdmUgdGhlaXIgcmVsYXRpdmUgcHJlc2V0cyBpbiBpdC5cbiAgICB0aGlzLnRpbWV6b25lLnNldChyZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSk7XG5cbiAgICBjb25zdCB0aW1lem9uZUNoYW5nZWQgPSBwcmV2aW91c1RpbWV6b25lICE9PSB0aGlzLnRpbWV6b25lKCk7XG4gICAgY29uc3QgcHJldmlvdXNHcm91cHMgPSB0aGlzLl9ncm91cHM7XG4gICAgdGhpcy5fZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICB0aGlzLl9ncm91cHMuc2V0KGdyb3VwLmlkLCBncm91cCk7XG4gICAgICB0aGlzLl9zZWVkKGdyb3VwLCBwcmV2aW91c0dyb3Vwcy5nZXQoZ3JvdXAuaWQpID8/IG51bGwsIHRpbWV6b25lQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3RvcmUpIHtcbiAgICAgIHRoaXMuX3Jlc3RvcmUocmVwb3J0LCByZXN0b3JlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcnVuZShyZXBvcnQpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUoZ3JvdXBJZDogbnVtYmVyKTogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBBIGJhcidzIHZhbHVlIGZvciBhIGdyb3VwLiBBIGRhdGUgcmFuZ2Uga2VlcHMgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSBvbmx5XG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSBzdGlsbCB0aGUgc3RvcmVkIGRheXM6IHRoZSBiYXJzIHJlLXNldCBldmVyeSBncm91cCB0aGV5XG4gIC8vIHNob3cgd2hlbmV2ZXIgYW55IG9uZSBvZiB0aGVtIGNoYW5nZXMsIGFuZCBhbiB1bnRvdWNoZWQgcm9sbGluZyByYW5nZSBtdXN0XG4gIC8vIGtlZXAgaXRzIG5hbWUgcmF0aGVyIHRoYW4gdHVybiBpbnRvIHR3byBmaXhlZCBkYXRlcy4gQW55IG90aGVyIHJhbmdlLCBhXG4gIC8vIHBpY2tlciBzaG9ydGN1dCBpbmNsdWRlZCwgaXMgc3RvcmVkIGFzIHRoZSBmaXhlZCBkYXRlcyBpdCBzaG93cy5cbiAgcHVibGljIHNldFZhbHVlKGdyb3VwSWQ6IG51bWJlciwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICBpZiAodGhpcy5fZ3JvdXBzLmdldChncm91cElkKT8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwSWQsIHRoaXMuX3dpdGhQcmVzZXQodGhpcy5fdmFsdWVzLmdldChncm91cElkKSwgdmFsdWUpKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgbmFtZSBhcyB0b2RheSdzIHJhbmdlIGluIHRoZSByZXBvcnQncyB6b25lLCBvciBudWxsIGZvclxuICAvLyBhIG5hbWUgaXQgZG9lcyBub3Qga25vdy4gVGhlIFVSTCBjb2RlYyBkZWNvZGVzIHByZXNldCBuYW1lcyB0aHJvdWdoIHRoaXMuXG4gIHB1YmxpYyByZXNvbHZlUmVsYXRpdmUobmFtZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZShuYW1lKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgcHVibGljIHNldEZyZXF1ZW5jeShmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgZ3JvdXAtYnkgZ3JhaW4gY2hhbmdlcyDigJQgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQgbGlzdGVuc1xuICAvLyBzbyBpdCByZWZldGNoZXMgYW5kIHJlLWJ1Y2tldHMgKHRoZSBvdmVycmlkZSBpc24ndCBzY29wZWQgdG8gYW55IGZpbHRlclxuICAvLyBncm91cCwgc28gY2hhbmdlc0ZvcigpIGNhbid0IGNhcnJ5IGl0KS5cbiAgcHVibGljIGZyZXF1ZW5jeUNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHNvcnQgdGhlIHZpZXdlciBsYXN0IGZldGNoZWQgYSBsaXN0IHdpdGgsIG9yIG51bGwgd2hlbiBpdCBoYXNuJ3Qgc29ydGVkXG4gIC8vICh0aGUgbGlzdCB0aGVuIGZhbGxzIGJhY2sgdG8gaXRzIGF1dGhvcmVkIHNvcnQpLlxuICBwdWJsaWMgbGlzdFNvcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc29ydC4gRGVsaWJlcmF0ZWx5IGVtaXRzIG5vIGNoYW5nZTogdGhlIGxpc3Qgc2V0cyB0aGlzIGZyb21cbiAgLy8gdGhlIGZldGNoIHRoYXQgYWxyZWFkeSByYW4gd2l0aCB0aGF0IHNvcnQsIHNvIGEgbm90aWZpY2F0aW9uIHdvdWxkIG9ubHkgbWFrZVxuICAvLyBpdCByZWZldGNoIHRoZSBzYW1lIHJvd3MuIE9ubHkgdGhlIFVSTCBoZWFycyBhYm91dCBpdC5cbiAgcHVibGljIHNldExpc3RTb3J0KGNvbXBvbmVudElkOiBudW1iZXIsIHNvcnQ6IFJlcG9ydFNvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHNvcnQpIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5zZXQoY29tcG9uZW50SWQsIHNvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgdmlld2VyIHN0YXRlIHRoZSBVUkwgY2FycmllcyBtYXkgaGF2ZSBjaGFuZ2VkOiBhIGdyb3VwXG4gIC8vIHZhbHVlLCB0aGUgZ3JhaW4sIGEgbGlzdCBzb3J0LCBvciBhIChyZSlsb2FkIG9mIHRoZSByZXBvcnQuXG4gIHB1YmxpYyB1cmxDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl91cmxDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIFRoZSB2aWV3ZXIgc3RhdGUgdGhlIFVSTCBzaG91bGQgY2FycnkgZm9yIGByZXBvcnRgOiBvbmx5IHdoYXQgZGlmZmVycyBmcm9tXG4gIC8vIHRoZSBhdXRob3JlZCBkZWZhdWx0cywgc28gYW4gdW50b3VjaGVkIHJlcG9ydCBoYXMgYSBiYXJlIFVSTCBhbmQga2VlcHNcbiAgLy8gZm9sbG93aW5nIGl0cyBkZWZhdWx0cyB3aGVuIHRoZXkgY2hhbmdlLiBBIGdyb3VwIHRoZSB2aWV3ZXIgY2xlYXJlZCBpc1xuICAvLyBudWxsLiBBIGRhdGUgcmFuZ2UgaXMgY29tcGFyZWQgb24gaXRzIGRheXMgYWdhaW5zdCBpdHMgZGVmYXVsdCByZXNvbHZlZFxuICAvLyB0b2RheSwgc28gYSB2YWx1ZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHVuZGVyIGFub3RoZXIgcHJlc2V0IG5hbWUgKHRoaXNZZWFyXG4gIC8vIGFnYWluc3QgYSB5ZWFyVG9EYXRlIGRlZmF1bHQpIGlzIHN0aWxsIHRoZSBkZWZhdWx0LlxuICBwdWJsaWMgdXJsU25hcHNob3QocmVwb3J0OiBSZXBvcnQpOiBSZXBvcnRVcmxTbmFwc2hvdCB7XG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWUgfCBudWxsPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9ncm91cHMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG5cbiAgICAgIGlmICh0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZCkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cC5pZCwgbnVsbCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmICF0aGlzLl9pc0RlZmF1bHQoZ3JvdXAsIHZhbHVlKSkge1xuICAgICAgICBncm91cHMuc2V0KGdyb3VwLmlkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpKSB7XG4gICAgICBjb25zdCBzb3J0ID0gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnQuaWQpO1xuXG4gICAgICBpZiAoc29ydCAmJiAhc2FtZVNvcnQoc29ydCwgY29tcG9uZW50LmNvbmZpZz8uc29ydCA/PyBudWxsKSkge1xuICAgICAgICBsaXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZ3JvdXBzLCBsaXN0U29ydHMsIGZyZXF1ZW5jeTogdGhpcy5fZnJlcXVlbmN5IH07XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCBncm91cElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuYWRkKGZpbHRlcklkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBPTkUgY29tcG9uZW50OiBhbnkgY2hhbmdlIHRvIGEgZ3JvdXAgb25lIG9mIGl0c1xuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gKG9yIGEgZnVsbCByZS1pbml0KS5cbiAgcHVibGljIGNoYW5nZXNGb3IoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQoKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpbHRlckdyb3VwSWQpKTtcblxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKSA9PiBncm91cElkID09PSBudWxsIHx8IGdyb3VwSWRzLmhhcyhncm91cElkKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIGdyb3VwIHZhbHVlcyByZXNvbHZlZCBpbnRvIHRoaXMgY29tcG9uZW50J3MgbWVtYmVyLWZpbHRlciB2YWx1ZXMg4oCUXG4gIC8vIHdoYXQgdGhlIGRhdGEgcmVxdWVzdCBjYXJyaWVzLiBEaXNhYmxlZCBmaWx0ZXJzIChhdXRob3JlZCBvciBzZXNzaW9uKSBhcmVcbiAgLy8gc2tpcHBlZCBlbnRpcmVseS5cbiAgcHVibGljIHJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHJlc29sdmVkOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKSB7XG4gICAgICBpZiAoIWZpbHRlci5lbmFibGVkIHx8IHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHZhbHVlID8gdGhpcy5fcmVzb2x2ZWRGaWVsZHModmFsdWUpIDogbnVsbDtcblxuICAgICAgaWYgKGZpZWxkcykge1xuICAgICAgICByZXNvbHZlZC5wdXNoKHsgZmlsdGVySWQ6IGZpbHRlci5pZCwgLi4uZmllbGRzIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIC8vIFdoYXQgdGhlIHZpZXdlciBoYXMgc2V0LCBvbmUgZW50cnkgcGVyIGZpbHRlciBncm91cCwgZm9yIHRoZSByZXBvcnQgY2hhdDpcbiAgLy8gdGhlIGFnZW50IHJlYWRzIGl0IHRvIGtub3cgd2hhdCBpcyBvbiBzY3JlZW4uIEdyb3VwIG9yZGVyLCBub3QgdGhlIG9yZGVyXG4gIC8vIHRoZSB2YWx1ZXMgd2VyZSBzZXQgaW4sIHNvIHRoZSBzYW1lIHN0YXRlIGFsd2F5cyByZWFkcyB0aGUgc2FtZS4gQSBncm91cFxuICAvLyB3aXRoIG5vdGhpbmcgaW4gaXQgaXMgbGVmdCBvdXQsIGFuZCBhIHNhdmVkIGRlZmF1bHQgY291bnRzIHVudGlsIHRoZVxuICAvLyB2aWV3ZXIgY2hhbmdlcyBpdC4gUGVyLWZpbHRlciB0b2dnbGVzIGFyZSBhIGNvbXBvbmVudCdzIG93biBidXNpbmVzcywgc29cbiAgLy8gdGhleSBhcmUgbm90IHBhcnQgb2YgaXQuXG4gIHB1YmxpYyB2aWV3ZXJGaWx0ZXJzKCk6IFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl92YWx1ZXMuZW50cmllcygpXVxuICAgICAgLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYilcbiAgICAgIC5tYXAoKFtncm91cElkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5fcmVzb2x2ZWRGaWVsZHModmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZHMgPyB7IGdyb3VwSWQsIC4uLmZpZWxkcyB9IDogbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXIgPT4gZW50cnkgIT09IG51bGwpO1xuICB9XG5cbiAgLy8gRXZlcnkgY29tcG9uZW50J3MgcmVzb2x2ZWQgdmFsdWVzIGluIG9uZSBhcnJheSDigJQgd2hhdCBhIHJlcG9ydC1sZXZlbCBleHBvcnRcbiAgLy8gY2FycmllcyBzbyBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGlzLlxuICAvLyBGaWx0ZXIgaWRzIGFyZSB1bmlxdWUgcGVyIGNvbXBvbmVudCwgc28gdGhlIGJhY2tlbmQgcGlja3MgZWFjaCBjb21wb25lbnQnc1xuICAvLyBvd24gb3V0IG9mIHRoZSBwaWxlLiBBIHBhZ2UgaWQgbmFycm93cyBpdCB0byB0aGF0IHBhZ2UuXG4gIHB1YmxpYyByZXNvbHZlRm9yUmVwb3J0KHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCBwYWdlcyA9IChyZXBvcnQucGFnZXMgPz8gW10pXG4gICAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZUlkIHx8IHBhZ2UuaWQgPT09IHBhZ2VJZCk7XG5cbiAgICByZXR1cm4gcGFnZXNcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB0aGlzLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KSkpO1xuICB9XG5cbiAgLy8gQSBncm91cCB2YWx1ZSBhcyB0aGUgZmllbGRzIGEgcmVxdWVzdCBjYXJyaWVzOiBkYXRlIGJvdW5kcyBhcyBjYWxlbmRhclxuICAvLyBkYXlzLCBzZWxlY3QgdmFsdWVzIHdoZW4gYW55IGFyZSBwaWNrZWQsIGtleXdvcmQgdGV4dCB0cmltbWVkLiBOdWxsIHdoZW5cbiAgLy8gYWxsIG9mIHRoZW0gYXJlIGVtcHR5LiBUaGUgcHJlc2V0IG5hbWUgaXMgVVJMIHN0YXRlIG9ubHksIHNvIGl0IGlzIGxlZnRcbiAgLy8gYmVoaW5kLlxuICBwcml2YXRlIF9yZXNvbHZlZEZpZWxkcyh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4gfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZHM6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4gPSB7fTtcblxuICAgIGlmICh2YWx1ZS5zdGFydCkge1xuICAgICAgZmllbGRzLnN0YXJ0ID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLnN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmVuZCkge1xuICAgICAgZmllbGRzLmVuZCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIGZpZWxkcy52YWx1ZXMgPSB2YWx1ZS52YWx1ZXM7XG4gICAgfVxuICAgIGlmICh2YWx1ZS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICBmaWVsZHMudmFsdWUgPSB2YWx1ZS52YWx1ZS50cmltKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkcy5zdGFydCB8fCBmaWVsZHMuZW5kIHx8IGZpZWxkcy52YWx1ZXMgfHwgZmllbGRzLnZhbHVlXG4gICAgICA/IGZpZWxkc1xuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gU2VlZHMgb25lIGdyb3VwIG9uIChyZSlsb2FkOyBzZWUgaW5pdCgpLiBgcHJldmlvdXNgIGlzIHRoZSBncm91cCBhcyB0aGVcbiAgLy8gbGFzdCBsb2FkIGhhZCBpdCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5ldy5cbiAgcHJpdmF0ZSBfc2VlZChcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcHJldmlvdXM6IFJlcG9ydEZpbHRlckdyb3VwIHwgbnVsbCxcbiAgICB0aW1lem9uZUNoYW5nZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDaGFuZ2VkID0gIXNhbWVEZWZhdWx0KHByZXZpb3VzPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuXG4gICAgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG4gICAgY29uc3QgcHJlc2V0VG9SZXNvbHZlID0gdGltZXpvbmVDaGFuZ2VkXG4gICAgICAmJiAhIXZhbHVlPy5wcmVzZXRcbiAgICAgICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhZGVmYXVsdENoYW5nZWQgJiYgIXByZXNldFRvUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBkZWZhdWx0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTCBvbiB0b3Agb2YgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgcHJpdmF0ZSBfcmVzdG9yZShyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgcmVzdG9yZS5ncm91cHMuZm9yRWFjaCgocmF3LCBncm91cElkKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdyb3VwXG4gICAgICAgID8gZGVjb2RlRmlsdGVyVmFsdWUoZ3JvdXAudHlwZSwgcmF3LCAobmFtZSkgPT4gdGhpcy5yZXNvbHZlUmVsYXRpdmUobmFtZSkpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcblxuICAgICAgICBpZiAoZ3JvdXA/LmNvbmZpZz8uZGVmYXVsdCkge1xuICAgICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXBJZCwgdmFsdWUpO1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGxpc3RzID0gbmV3IE1hcCh0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpLm1hcCgoY29tcG9uZW50KSA9PiBbY29tcG9uZW50LmlkLCBjb21wb25lbnRdKSk7XG5cbiAgICByZXN0b3JlLmxpc3RTb3J0cy5mb3JFYWNoKChyYXcsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBsaXN0cy5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgY29uc3Qgc29ydCA9IGRlY29kZVNvcnQocmF3KTtcblxuICAgICAgaWYgKGNvbXBvbmVudCAmJiBzb3J0ICYmIHRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudElkLCBzb3J0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoZSBVUkwgaXMgdGhlIHdob2xlIHRydXRoIG9uIGEgZmlyc3QgbG9hZDogbm8gZ3JhaW4gaW4gaXQgbWVhbnMgdGhlXG4gICAgLy8gYXV0aG9yZWQgb25lcy4gVGhlIGhvc3Qgc3RpbGwgZHJvcHMgYSBncmFpbiB0aGUgcmVwb3J0IGRvZXMgbm90IG9mZmVyLlxuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IEdSQU5VTEFSSVRZX09QVElPTlNcbiAgICAgIC5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gcmVzdG9yZS5ncm91cEJ5KT8udmFsdWUgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIERyb3BzIHN0YXRlIGtlcHQgZm9yIGdyb3VwcyBhbmQgbGlzdHMgdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLlxuICBwcml2YXRlIF9wcnVuZShyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBbLi4udGhpcy5fdmFsdWVzLmtleXMoKSwgLi4udGhpcy5fY2xlYXJlZF0pIHtcbiAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhncm91cElkKSkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsaXN0SWRzID0gbmV3IFNldCh0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpLm1hcCgoY29tcG9uZW50KSA9PiBjb21wb25lbnQuaWQpKTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50SWQgb2YgWy4uLnRoaXMuX2xpc3RTb3J0cy5rZXlzKCldKSB7XG4gICAgICBpZiAoIWxpc3RJZHMuaGFzKGNvbXBvbmVudElkKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUaGUgdmFsdWUgYSBiYXIgc2V0cywga2VlcGluZyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIHdoaWxlIHRoZSBkYXlzIGFyZVxuICAvLyBzdGlsbCB0aGUgc3RvcmVkIGRheXMgKHNlZSBzZXRWYWx1ZSkuXG4gIHByaXZhdGUgX3dpdGhQcmVzZXQoc3RvcmVkOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IEZpbHRlckdyb3VwVmFsdWUge1xuICAgIGNvbnN0IGZpeGVkOiBGaWx0ZXJHcm91cFZhbHVlID0geyAuLi52YWx1ZSB9O1xuICAgIGRlbGV0ZSBmaXhlZC5wcmVzZXQ7XG5cbiAgICByZXR1cm4gc3RvcmVkPy5wcmVzZXQgJiYgc2FtZURheXMoc3RvcmVkLCBmaXhlZClcbiAgICAgID8geyAuLi5maXhlZCwgcHJlc2V0OiBzdG9yZWQucHJlc2V0IH1cbiAgICAgIDogZml4ZWQ7XG4gIH1cblxuICAvLyBXaGV0aGVyIGEgdmFsdWUgaXMgdGhlIGdyb3VwJ3MgYXV0aG9yZWQgZGVmYXVsdCwgYnkgdHlwZTogYSBkYXRlIHJhbmdlIG9uXG4gIC8vIGl0cyBkYXlzICh0aGUgZGVmYXVsdCByZXNvbHZlZCB0b2RheSksIGEgc2VsZWN0IG9uIGl0cyB2YWx1ZXMgaW4gYW55XG4gIC8vIG9yZGVyLCBhIGtleXdvcmQgb24gaXRzIHRleHQuXG4gIHByaXZhdGUgX2lzRGVmYXVsdChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcbiAgICBpZiAoIWRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZ3JvdXAudHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgcmV0dXJuIHNhbWVEYXlzKHZhbHVlLCBkZWZhdWx0VmFsdWUpO1xuXG4gICAgICBjYXNlICdzZWxlY3QnOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9ICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSAoZGVmYXVsdFZhbHVlLnZhbHVlcyA/PyBbXSkubWFwKFN0cmluZykuc29ydCgpO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID09PSBkZWZhdWx0cy5sZW5ndGhcbiAgICAgICAgICAmJiB2YWx1ZXMuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBpdGVtID09PSBkZWZhdWx0c1tpbmRleF0pO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKHZhbHVlLnZhbHVlID8/ICcnKS50cmltKCkgPT09IChkZWZhdWx0VmFsdWUudmFsdWUgPz8gJycpLnRyaW0oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saXN0Q29tcG9uZW50cyhyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpO1xuICB9XG5cbiAgLy8gVGhlIGNvbHVtbnMgYSBsaXN0IGNhbiBiZSBzb3J0ZWQgYnk6IGV2ZXJ5IGF1dGhvcmVkIGNvbHVtbiwgb3IgYVxuICAvLyBjcm9zcy10YWIncyByb3cgY29sdW1uIG9ubHkgKGl0cyBwaXZvdCBjb2x1bW5zIGNvbWUgYW5kIGdvIHdpdGggdGhlIGRhdGEpLlxuICBwcml2YXRlIF9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnBpdm90Qnk/LmNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8uY29sdW1uID8gW2NvbmZpZy5yb3dCeS5jb2x1bW5dIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIChjb25maWc/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uY29sdW1uKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBtYXBwZWQgdG8gYSBzZXNzaW9uIHZhbHVlIGJ5IHR5cGUuIFJlbGF0aXZlXG4gIC8vIGRhdGUgcHJlc2V0cyByZXNvbHZlIGFnYWluc3QgXCJub3dcIiBlYWNoIHRpbWUgdGhlIHJlcG9ydCBvcGVucywgc28gYSBzYXZlZFxuICAvLyBcImxhc3QgMTIgbW9udGhzXCIgc3RheXMgcmVsYXRpdmUgYW5kIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lOyBhIGZpeGVkXG4gIC8vIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogZ3JvdXBEZWZhdWx0LnJlbGF0aXZlIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQuc3RhcnQgfHwgZ3JvdXBEZWZhdWx0LmVuZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGdyb3VwRGVmYXVsdC5zdGFydCA/PyBudWxsLFxuICAgICAgICBlbmQ6IGdyb3VwRGVmYXVsdC5lbmQgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBncm91cERlZmF1bHQudmFsdWVzIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGdyb3VwRGVmYXVsdC52YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
527
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEQsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxHQUM3QixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRS9ELE9BQU8sRUFJTCxtQkFBbUIsR0FRcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUdwRSxrRkFBa0Y7QUFDbEYsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxXQUFXLENBQ3pCLENBQTRCLEVBQzVCLENBQTRCO0lBRTVCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSztXQUNyQixDQUFD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O2dCQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDL0MsS0FBSyxhQUFhO2dCQUNoQixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2hELEtBQUssYUFBYTtnQkFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDakQsS0FBSyxXQUFXO2dCQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNsRCxLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQy9DO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO3dHQXBpQlUsd0JBQXdCOzRHQUF4Qix3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBlbmRPZldlZWssIHN0YXJ0T2ZNb250aCwgc3RhcnRPZlF1YXJ0ZXIsIHN0YXJ0T2ZXZWVrLCBzdGFydE9mWWVhcixcbiAgc3ViRGF5cywgc3ViTW9udGhzLCBzdWJXZWVrcyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSBmcm9tICcuLi9jb25zdHMvcmVwb3J0LXdlZWsuY29uc3QnO1xuaW1wb3J0IHsgZ2V0Wm9uZWROb3csIHJlc29sdmVSZXBvcnRUaW1lem9uZSB9IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBGaWx0ZXJHcm91cERlZmF1bHQsXG4gIEZpbHRlckdyb3VwVmFsdWUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0U29ydCxcbiAgUmVwb3J0VXJsUGFyYW1zLFxuICBSZXBvcnRVcmxTbmFwc2hvdCxcbiAgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGRhdGVCb3VuZFN0cmluZyB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgZGVjb2RlRmlsdGVyVmFsdWUsIGRlY29kZVNvcnQgfSBmcm9tICcuLi9yZXBvcnQtdXJsLXN0YXRlJztcblxuXG4vLyBXaGV0aGVyIHR3byBzdG9yZWQgZmlsdGVyLWdyb3VwIGRlZmF1bHRzIGFyZSB0aGUgc2FtZS4gQ29tcGFyZWQgb24gdGhlIGZpZWxkcyBhXG4vLyBkZWZhdWx0IGNhbiBhY3R1YWxseSBjYXJyeSwgc28ga2V5IG9yZGVyIGluIHRoZSBwYXlsb2FkIGNhbid0IHJlYWQgYXMgYSBjaGFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gc2FtZURlZmF1bHQoXG4gIGE6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwsXG4gIGI6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFhIHx8ICFiKSB7XG4gICAgcmV0dXJuICFhICYmICFiO1xuICB9XG5cbiAgcmV0dXJuIGEuc3RhcnQgPT09IGIuc3RhcnRcbiAgICAmJiBhLmVuZCA9PT0gYi5lbmRcbiAgICAmJiBhLnZhbHVlID09PSBiLnZhbHVlXG4gICAgJiYgYS5yZWxhdGl2ZSA9PT0gYi5yZWxhdGl2ZVxuICAgICYmIChhLnZhbHVlcyA/PyBbXSkubGVuZ3RoID09PSAoYi52YWx1ZXMgPz8gW10pLmxlbmd0aFxuICAgICYmIChhLnZhbHVlcyA/PyBbXSkuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IChiLnZhbHVlcyA/PyBbXSlbaW5kZXhdKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0IHNvcnRzIG9yZGVyIHRoZSByb3dzIHRoZSBzYW1lIHdheS4gTm8gZGlyZWN0aW9uIHJlYWRzIGFzXG4vLyBhc2NlbmRpbmcsIHRoZSB3YXkgdGhlIGxpc3QgYXBwbGllcyBpdC5cbmZ1bmN0aW9uIHNhbWVTb3J0KGE6IFJlcG9ydFNvcnQsIGI6IFJlcG9ydFNvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWJcbiAgICAmJiBhLmNvbHVtbiA9PT0gYi5jb2x1bW5cbiAgICAmJiAoYS5kaXJlY3Rpb24gPz8gJ2FzYycpID09PSAoYi5kaXJlY3Rpb24gPz8gJ2FzYycpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGRhdGUtcmFuZ2UgdmFsdWVzIGNvdmVyIHRoZSBzYW1lIGNhbGVuZGFyIGRheXMuXG5mdW5jdGlvbiBzYW1lRGF5cyhhOiBGaWx0ZXJHcm91cFZhbHVlLCBiOiBGaWx0ZXJHcm91cFZhbHVlKTogYm9vbGVhbiB7XG4gIHJldHVybiBkYXRlQm91bmRTdHJpbmcoYS5zdGFydCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLnN0YXJ0KVxuICAgICYmIGRhdGVCb3VuZFN0cmluZyhhLmVuZCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLmVuZCk7XG59XG5cblxuLy8gQSBzdGFibGUgc2lnbmF0dXJlIGZvciBhIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQuIFRoZSByZXBvcnQgdG9vbGJhciBrZXlzIGl0c1xuLy8gZnMtZmlsdGVyIG9uIHRoaXMsIGJlY2F1c2UgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0IOKAlCB3aXRob3V0IGFcbi8vIGtleSBjaGFuZ2UgaXQga2VlcHMgcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCBldmVuIGFmdGVyIHRoZVxuLy8gY29uZmlnIGJlaGluZCBpdCBoYXMgYmVlbiByZWJ1aWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTaWduYXR1cmUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogc3RyaW5nIHtcbiAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuXG4gIGlmICghZ3JvdXBEZWZhdWx0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBncm91cERlZmF1bHQuc3RhcnQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LmVuZCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQudmFsdWUgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnJlbGF0aXZlID8/ICcnLFxuICAgIChncm91cERlZmF1bHQudmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gIF0uam9pbignficpO1xufVxuXG5cbi8vIFZpZXdlciBmaWx0ZXIgc3RhdGUgZm9yIHRoZSBvcGVuIHJlcG9ydC4gRmlsdGVyIFZBTFVFUyBhcmUgbmV2ZXIgc2F2ZWQgdG9cbi8vIHRoZSByZXBvcnQg4oCUIHRoaXMgc2VydmljZSBob2xkcyB0aGVtIHBlciBmaWx0ZXIgR1JPVVAgKHRoZSBwcm9wYWdhdGlvbiB1bml0KSxcbi8vIHJlc29sdmVzIHRoZW0gaW50byBwZXItY29tcG9uZW50IG1lbWJlci1maWx0ZXIgdmFsdWVzIGZvciBlYWNoIGRhdGEgcmVxdWVzdCxcbi8vIGFuZCBub3RpZmllcyB0aGUgY29tcG9uZW50cyB3aG9zZSBncm91cHMgY2hhbmdlZCBzbyBvbmx5IHRoZXkgcmVmZXRjaC5cbi8vXG4vLyBJdCBpcyBhbHNvIHRoZSBvbmUgc291cmNlIG9mIHRoZSB2aWV3ZXIgc3RhdGUgdGhlIHJlcG9ydCBVUkwgY2FycmllcyAoZ3JvdXBcbi8vIHZhbHVlcywgdGhlIGdyb3VwLWJ5IGdyYWluLCBsaXN0IHNvcnRzKTogdXJsU25hcHNob3QoKSBzYXlzIHdoYXQgZGlmZmVycyBmcm9tXG4vLyB0aGUgYXV0aG9yZWQgZGVmYXVsdHMsIGluaXQoKSByZXN0b3JlcyBpdCwgYW5kIHVybENoYW5nZXMoKSB0ZWxscyB0aGUgaG9zdCdzXG4vLyBzaW5nbGUgVVJMIHdyaXRlciB3aGVuIHRvIHdyaXRlLlxuLy9cbi8vIFNlc3Npb24tb25seSwgbmV2ZXIgaW4gdGhlIFVSTDogcGVyLWZpbHRlciBlbmFibGUvZGlzYWJsZSB0b2dnbGVzIGZyb20gYVxuLy8gY29tcG9uZW50J3MgZmlsdGVyIG1lbnUgKHRoZSBgZW5hYmxlZGAgY29sdW1uIGlzIHRoZSBhdXRob3JlZCBkZWZhdWx0OyBhXG4vLyB2aWV3ZXIncyB0b2dnbGUgc2hvdWxkbid0IHdyaXRlIHRvIHRoZSByZXBvcnQpLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUgKHJlc29sdmVSZXBvcnRUaW1lem9uZSkuIFJlbGF0aXZlIHByZXNldHNcbiAgLy8gcmVzb2x2ZSBhZ2FpbnN0IHRvZGF5IGluIGl0LCBhbmQgZGF0ZSBjZWxscyByZW5kZXIgaW4gaXQuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IHNpZ25hbDxzdHJpbmc+KCdVVEMnKTtcblxuICBwcml2YXRlIF92YWx1ZXMgPSBuZXcgTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZT4oKTtcbiAgcHJpdmF0ZSBfZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuICBwcml2YXRlIF9zZXNzaW9uRGlzYWJsZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBHcm91cHMgdGhhdCBoYXZlIGEgZGVmYXVsdCB0aGUgdmlld2VyIGNsZWFyZWQuIFdpdGhvdXQgdGhpcyBhIHJlbG9hZCBvZiB0aGVcbiAgLy8gcmVwb3J0IChhIGNoYXQgZWRpdCwgYSBkaWFsb2cpIHdvdWxkIGZpbmQgbm8gdmFsdWUgZm9yIHRoZSBncm91cCBhbmQgc2VlZFxuICAvLyBpdHMgZGVmYXVsdCBzdHJhaWdodCBiYWNrLiBBIGNoYW5nZSB0byB0aGUgc3RvcmVkIGRlZmF1bHQgcmVsZWFzZXMgaXQuXG4gIHByaXZhdGUgX2NsZWFyZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbDogYSBzaW5nbGUgcmVwb3J0LXdpZGUgYnVja2V0IG92ZXJyaWRlIGZvciBhbGxcbiAgLy8gdGltZS1zZXJpZXMgY2hhcnRzLiBVbnNldCA9IGVhY2ggY2hhcnQgdXNlcyBpdHMgYXV0aG9yZWQgZ3JhbnVsYXJpdHkuIE5ldmVyXG4gIC8vIHNhdmVkIHRvIHRoZSByZXBvcnQgKHRoZSBVUkwgY2FycmllcyBpdCksIGFuZCBjYXJyaWVkIGluIHRoZSBkYXRhIHJlcXVlc3Qnc1xuICAvLyBgc3RhdGVgLCBzbyBpdCBwcm9wYWdhdGVzIHRocm91Z2ggdG8gdGhlIFBERi9Qb3dlclBvaW50IGV4cG9ydHMgdG9vLiBOYW1lZFxuICAvLyBmb3IgdGhlIGBmcmVxdWVuY3lgIHdpcmUga2V5IGl0IHRyYXZlbHMgdW5kZXIsIG5vdCBmb3IgdGhlIGNvbnRyb2wncyBsYWJlbC5cbiAgcHJpdmF0ZSBfZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2ZyZXF1ZW5jeUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyB2aWV3ZXItY2hvc2VuIHNvcnQsIGJ5IGNvbXBvbmVudCBpZC4gSGVsZCBoZXJlIHJhdGhlciB0aGFuIG9ubHlcbiAgLy8gaW4gdGhlIGxpc3QncyBGc0xpc3Qgc28gaXQgc3Vydml2ZXMgdGhlIGxpc3QgYmVpbmcgcmVjcmVhdGVkIChhIHBhZ2Ugc3dpdGNoLFxuICAvLyBhIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBhbmQgc28gZXZlcnkgY29uc3VtZXIgb2Ygdmlld2VyIHN0YXRlIHJlYWRzIG9uZSBwbGFjZS5cbiAgcHJpdmF0ZSBfbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG5cbiAgLy8gRW1pdHMgdGhlIGdyb3VwIGlkIHRoYXQgY2hhbmdlZDsgY29tcG9uZW50cyBsaXN0ZW4gZmlsdGVyZWQgdG8gdGhlaXIgb3duXG4gIC8vIGdyb3VwIGlkcy4gbnVsbCA9IGV2ZXJ5dGhpbmcgY2hhbmdlZCAocmUtaW5pdCkuXG4gIHByaXZhdGUgX2NoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICAvLyBGaXJlcyB3aGVuZXZlciBhbnl0aGluZyB0aGUgVVJMIGNhcnJpZXMgbWF5IGhhdmUgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfdXJsQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIFNlZWQgZ3JvdXBzICsgdGhlaXIgZGVmYXVsdHMgd2hlbiBhIHJlcG9ydCBsb2Fkcy4gRXhpc3Rpbmcgc2Vzc2lvbiB2YWx1ZXNcbiAgLy8gZm9yIHN0aWxsLWV4aXN0aW5nIGdyb3VwcyBzdXJ2aXZlIGEgc3RydWN0dXJlIHJlLWZldGNoIChhIGNoYXQgZWRpdFxuICAvLyBzaG91bGRuJ3QgcmVzZXQgdGhlIHZpZXdlcidzIGZpbHRlcnMpLCBhbmQgc28gZG9lcyBhIGdyb3VwIHRoZSB2aWV3ZXJcbiAgLy8gY2xlYXJlZCDigJQgVU5MRVNTIHRoZSBncm91cCdzIHN0b3JlZCBkZWZhdWx0IGl0c2VsZiBjaGFuZ2VkLCB3aGljaCBvbmx5XG4gIC8vIGhhcHBlbnMgd2hlbiBhbiBvcGVyYXRvciBzYXZlZCBhIG5ldyBkZWZhdWx0IGluIHJlcG9ydCBzZXR0aW5ncyBvciB0aGVcbiAgLy8gYWdlbnQgc2V0IG9uZS4gVGhhdCBpcyBhbiBleHBsaWNpdCBpbnN0cnVjdGlvbiB0byByZS1zZWVkLCBzbyBpdCB3aW5zIG92ZXJcbiAgLy8gdGhlIHN1cnZpdmluZyBzZXNzaW9uIHZhbHVlOyB3aXRob3V0IGl0IHRoZSBiYXIga2VlcHMgc2hvd2luZyB3aGF0ZXZlciBpdFxuICAvLyB3YXMgZmlyc3Qgc2VlZGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAvL1xuICAvLyBBIGNoYW5nZSBvZiB0aGUgcmVwb3J0J3Mgem9uZSBtb3ZlcyBcInRvZGF5XCIsIHNvIGEgdmFsdWUgc3RpbGwgY2FycnlpbmcgaXRzXG4gIC8vIGdyb3VwIGRlZmF1bHQncyBwcmVzZXQgbmFtZSBpcyByZXNvbHZlZCBhZ2FpbiBpbiB0aGUgbmV3IHpvbmUuIEEgdmFsdWUgdGhlXG4gIC8vIHZpZXdlciBwaWNrZWQsIG9yIG9uZSBjYXJyeWluZyBhbm90aGVyIHByZXNldCBuYW1lLCBpcyBrZXB0IGFzIGl0IGlzLlxuICAvL1xuICAvLyBgcmVzdG9yZWAgaXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTC4gVGhlIGhvc3QgcGFzc2VzIGl0IG9ubHkgb25cbiAgLy8gdGhlIGZpcnN0IGxvYWQgb2YgYSByZXBvcnQ7IGEgcmVsb2FkIGFmdGVyIGEgY2hhdCBvciBkaWFsb2cgZWRpdCBwYXNzZXNcbiAgLy8gbnVsbCwgc28gdGhlIGluLW1lbW9yeSBzdGF0ZSB3aW5zLiBQYXJhbXMgdGhhdCBuYW1lIGEgZ3JvdXAsIGxpc3Qgb3IgY29sdW1uXG4gIC8vIHRoZSByZXBvcnQgbm8gbG9uZ2VyIGhhcywgb3IgdGhhdCBkbyBub3QgZGVjb2RlLCBhcmUgaWdub3JlZC5cbiAgcHVibGljIGluaXQocmVwb3J0OiBSZXBvcnQsIHJlc3RvcmU6IFJlcG9ydFVybFBhcmFtcyB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNUaW1lem9uZSA9IHRoaXMudGltZXpvbmUoKTtcblxuICAgIC8vIFNldCBmaXJzdDogdGhlIGRlZmF1bHRzIHNlZWRlZCBiZWxvdyByZXNvbHZlIHRoZWlyIHJlbGF0aXZlIHByZXNldHMgaW4gaXQuXG4gICAgdGhpcy50aW1lem9uZS5zZXQocmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCkpO1xuXG4gICAgY29uc3QgdGltZXpvbmVDaGFuZ2VkID0gcHJldmlvdXNUaW1lem9uZSAhPT0gdGhpcy50aW1lem9uZSgpO1xuICAgIGNvbnN0IHByZXZpb3VzR3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuICAgIHRoaXMuX2dyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgdGhpcy5fZ3JvdXBzLnNldChncm91cC5pZCwgZ3JvdXApO1xuICAgICAgdGhpcy5fc2VlZChncm91cCwgcHJldmlvdXNHcm91cHMuZ2V0KGdyb3VwLmlkKSA/PyBudWxsLCB0aW1lem9uZUNoYW5nZWQpO1xuICAgIH1cblxuICAgIGlmIChyZXN0b3JlKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlKHJlcG9ydCwgcmVzdG9yZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJ1bmUocmVwb3J0KTtcblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHZhbHVlKGdyb3VwSWQ6IG51bWJlcik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpO1xuICB9XG5cbiAgLy8gQSBiYXIncyB2YWx1ZSBmb3IgYSBncm91cC4gQSBkYXRlIHJhbmdlIGtlZXBzIHRoZSBzdG9yZWQgcHJlc2V0IG5hbWUgb25seVxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgc3RpbGwgdGhlIHN0b3JlZCBkYXlzOiB0aGUgYmFycyByZS1zZXQgZXZlcnkgZ3JvdXAgdGhleVxuICAvLyBzaG93IHdoZW5ldmVyIGFueSBvbmUgb2YgdGhlbSBjaGFuZ2VzLCBhbmQgYW4gdW50b3VjaGVkIHJvbGxpbmcgcmFuZ2UgbXVzdFxuICAvLyBrZWVwIGl0cyBuYW1lIHJhdGhlciB0aGFuIHR1cm4gaW50byB0d28gZml4ZWQgZGF0ZXMuIEFueSBvdGhlciByYW5nZSwgYVxuICAvLyBwaWNrZXIgc2hvcnRjdXQgaW5jbHVkZWQsIGlzIHN0b3JlZCBhcyB0aGUgZml4ZWQgZGF0ZXMgaXQgc2hvd3MuXG4gIHB1YmxpYyBzZXRWYWx1ZShncm91cElkOiBudW1iZXIsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcblxuICAgICAgaWYgKHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk/LmNvbmZpZz8uZGVmYXVsdCkge1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmFkZChncm91cElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB0aGlzLl93aXRoUHJlc2V0KHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCksIHZhbHVlKSk7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgcmVsYXRpdmUgcHJlc2V0IG5hbWUgYXMgdG9kYXkncyByYW5nZSBpbiB0aGUgcmVwb3J0J3Mgem9uZSwgb3IgbnVsbCBmb3JcbiAgLy8gYSBuYW1lIGl0IGRvZXMgbm90IGtub3cuIFRoZSBVUkwgY29kZWMgZGVjb2RlcyBwcmVzZXQgbmFtZXMgdGhyb3VnaCB0aGlzLlxuICBwdWJsaWMgcmVzb2x2ZVJlbGF0aXZlKG5hbWU6IHN0cmluZyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbGF0aXZlUmFuZ2UobmFtZSk7XG4gIH1cblxuICAvLyBUaGUgYWN0aXZlIGdyb3VwLWJ5IGdyYWluLCBvciBudWxsIHdoZW4gdGhlIHZpZXdlciBoYXNuJ3QgY2hvc2VuIG9uZS5cbiAgcHVibGljIGZyZXF1ZW5jeSgpOiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGcmVxdWVuY3koZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTtcbiAgICB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5uZXh0KCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIGdyb3VwLWJ5IGdyYWluIGNoYW5nZXMg4oCUIGV2ZXJ5IHRpbWUtc2VyaWVzIGNoYXJ0IGxpc3RlbnNcbiAgLy8gc28gaXQgcmVmZXRjaGVzIGFuZCByZS1idWNrZXRzICh0aGUgb3ZlcnJpZGUgaXNuJ3Qgc2NvcGVkIHRvIGFueSBmaWx0ZXJcbiAgLy8gZ3JvdXAsIHNvIGNoYW5nZXNGb3IoKSBjYW4ndCBjYXJyeSBpdCkuXG4gIHB1YmxpYyBmcmVxdWVuY3lDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIFRoZSBzb3J0IHRoZSB2aWV3ZXIgbGFzdCBmZXRjaGVkIGEgbGlzdCB3aXRoLCBvciBudWxsIHdoZW4gaXQgaGFzbid0IHNvcnRlZFxuICAvLyAodGhlIGxpc3QgdGhlbiBmYWxscyBiYWNrIHRvIGl0cyBhdXRob3JlZCBzb3J0KS5cbiAgcHVibGljIGxpc3RTb3J0KGNvbXBvbmVudElkOiBudW1iZXIpOiBSZXBvcnRTb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNvcnQuIERlbGliZXJhdGVseSBlbWl0cyBubyBjaGFuZ2U6IHRoZSBsaXN0IHNldHMgdGhpcyBmcm9tXG4gIC8vIHRoZSBmZXRjaCB0aGF0IGFscmVhZHkgcmFuIHdpdGggdGhhdCBzb3J0LCBzbyBhIG5vdGlmaWNhdGlvbiB3b3VsZCBvbmx5IG1ha2VcbiAgLy8gaXQgcmVmZXRjaCB0aGUgc2FtZSByb3dzLiBPbmx5IHRoZSBVUkwgaGVhcnMgYWJvdXQgaXQuXG4gIHB1YmxpYyBzZXRMaXN0U29ydChjb21wb25lbnRJZDogbnVtYmVyLCBzb3J0OiBSZXBvcnRTb3J0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChzb3J0KSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudElkLCBzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNvcnRzLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIHZpZXdlciBzdGF0ZSB0aGUgVVJMIGNhcnJpZXMgbWF5IGhhdmUgY2hhbmdlZDogYSBncm91cFxuICAvLyB2YWx1ZSwgdGhlIGdyYWluLCBhIGxpc3Qgc29ydCwgb3IgYSAocmUpbG9hZCBvZiB0aGUgcmVwb3J0LlxuICBwdWJsaWMgdXJsQ2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fdXJsQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyBUaGUgdmlld2VyIHN0YXRlIHRoZSBVUkwgc2hvdWxkIGNhcnJ5IGZvciBgcmVwb3J0YDogb25seSB3aGF0IGRpZmZlcnMgZnJvbVxuICAvLyB0aGUgYXV0aG9yZWQgZGVmYXVsdHMsIHNvIGFuIHVudG91Y2hlZCByZXBvcnQgaGFzIGEgYmFyZSBVUkwgYW5kIGtlZXBzXG4gIC8vIGZvbGxvd2luZyBpdHMgZGVmYXVsdHMgd2hlbiB0aGV5IGNoYW5nZS4gQSBncm91cCB0aGUgdmlld2VyIGNsZWFyZWQgaXNcbiAgLy8gbnVsbC4gQSBkYXRlIHJhbmdlIGlzIGNvbXBhcmVkIG9uIGl0cyBkYXlzIGFnYWluc3QgaXRzIGRlZmF1bHQgcmVzb2x2ZWRcbiAgLy8gdG9kYXksIHNvIGEgdmFsdWUgdGhhdCBpcyB0aGUgZGVmYXVsdCB1bmRlciBhbm90aGVyIHByZXNldCBuYW1lICh0aGlzWWVhclxuICAvLyBhZ2FpbnN0IGEgeWVhclRvRGF0ZSBkZWZhdWx0KSBpcyBzdGlsbCB0aGUgZGVmYXVsdC5cbiAgcHVibGljIHVybFNuYXBzaG90KHJlcG9ydDogUmVwb3J0KTogUmVwb3J0VXJsU25hcHNob3Qge1xuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4oKTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fZ3JvdXBzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpO1xuXG4gICAgICBpZiAodGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpKSB7XG4gICAgICAgIGdyb3Vwcy5zZXQoZ3JvdXAuaWQsIG51bGwpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiAhdGhpcy5faXNEZWZhdWx0KGdyb3VwLCB2YWx1ZSkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cC5pZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RTb3J0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRTb3J0PigpO1xuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KSkge1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50LmlkKTtcblxuICAgICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGNvbXBvbmVudC5jb25maWc/LnNvcnQgPz8gbnVsbCkpIHtcbiAgICAgICAgbGlzdFNvcnRzLnNldChjb21wb25lbnQuaWQsIHNvcnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGdyb3VwcywgbGlzdFNvcnRzLCBmcmVxdWVuY3k6IHRoaXMuX2ZyZXF1ZW5jeSB9O1xuICB9XG5cbiAgcHVibGljIGlzRmlsdGVyRGlzYWJsZWQoZmlsdGVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgZ3JvdXBJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZGVsZXRlKGZpbHRlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmFkZChmaWx0ZXJJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gT05FIGNvbXBvbmVudDogYW55IGNoYW5nZSB0byBhIGdyb3VwIG9uZSBvZiBpdHNcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIChvciBhIGZ1bGwgcmUtaW5pdCkuXG4gIHB1YmxpYyBjaGFuZ2VzRm9yKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZ3JvdXBJZHMgPSBuZXcgU2V0KChjb21wb25lbnQuZmlsdGVycyA/PyBbXSkubWFwKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJHcm91cElkKSk7XG5cbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoZ3JvdXBJZCkgPT4gZ3JvdXBJZCA9PT0gbnVsbCB8fCBncm91cElkcy5oYXMoZ3JvdXBJZCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBncm91cCB2YWx1ZXMgcmVzb2x2ZWQgaW50byB0aGlzIGNvbXBvbmVudCdzIG1lbWJlci1maWx0ZXIgdmFsdWVzIOKAlFxuICAvLyB3aGF0IHRoZSBkYXRhIHJlcXVlc3QgY2Fycmllcy4gRGlzYWJsZWQgZmlsdGVycyAoYXV0aG9yZWQgb3Igc2Vzc2lvbikgYXJlXG4gIC8vIHNraXBwZWQgZW50aXJlbHkuXG4gIHB1YmxpYyByZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBjb21wb25lbnQuZmlsdGVycyA/PyBbXSkge1xuICAgICAgaWYgKCFmaWx0ZXIuZW5hYmxlZCB8fCB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlci5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB2YWx1ZSA/IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKSA6IG51bGw7XG5cbiAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgcmVzb2x2ZWQucHVzaCh7IGZpbHRlcklkOiBmaWx0ZXIuaWQsIC4uLmZpZWxkcyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cblxuICAvLyBXaGF0IHRoZSB2aWV3ZXIgaGFzIHNldCwgb25lIGVudHJ5IHBlciBmaWx0ZXIgZ3JvdXAsIGZvciB0aGUgcmVwb3J0IGNoYXQ6XG4gIC8vIHRoZSBhZ2VudCByZWFkcyBpdCB0byBrbm93IHdoYXQgaXMgb24gc2NyZWVuLiBHcm91cCBvcmRlciwgbm90IHRoZSBvcmRlclxuICAvLyB0aGUgdmFsdWVzIHdlcmUgc2V0IGluLCBzbyB0aGUgc2FtZSBzdGF0ZSBhbHdheXMgcmVhZHMgdGhlIHNhbWUuIEEgZ3JvdXBcbiAgLy8gd2l0aCBub3RoaW5nIGluIGl0IGlzIGxlZnQgb3V0LCBhbmQgYSBzYXZlZCBkZWZhdWx0IGNvdW50cyB1bnRpbCB0aGVcbiAgLy8gdmlld2VyIGNoYW5nZXMgaXQuIFBlci1maWx0ZXIgdG9nZ2xlcyBhcmUgYSBjb21wb25lbnQncyBvd24gYnVzaW5lc3MsIHNvXG4gIC8vIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgdmlld2VyRmlsdGVycygpOiBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fdmFsdWVzLmVudHJpZXMoKV1cbiAgICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpXG4gICAgICAubWFwKChbZ3JvdXBJZCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gZmllbGRzID8geyBncm91cElkLCAuLi5maWVsZHMgfSA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyID0+IGVudHJ5ICE9PSBudWxsKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IGNvbXBvbmVudCdzIHJlc29sdmVkIHZhbHVlcyBpbiBvbmUgYXJyYXkg4oCUIHdoYXQgYSByZXBvcnQtbGV2ZWwgZXhwb3J0XG4gIC8vIGNhcnJpZXMgc28gZWFjaCBmaWxlIGluIHRoZSBhcmNoaXZlIGlzIGZpbHRlcmVkIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBpcy5cbiAgLy8gRmlsdGVyIGlkcyBhcmUgdW5pcXVlIHBlciBjb21wb25lbnQsIHNvIHRoZSBiYWNrZW5kIHBpY2tzIGVhY2ggY29tcG9uZW50J3NcbiAgLy8gb3duIG91dCBvZiB0aGUgcGlsZS4gQSBwYWdlIGlkIG5hcnJvd3MgaXQgdG8gdGhhdCBwYWdlLlxuICBwdWJsaWMgcmVzb2x2ZUZvclJlcG9ydChyZXBvcnQ6IFJlcG9ydCwgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcGFnZXMgPSAocmVwb3J0LnBhZ2VzID8/IFtdKVxuICAgICAgLmZpbHRlcigocGFnZSkgPT4gIXBhZ2VJZCB8fCBwYWdlLmlkID09PSBwYWdlSWQpO1xuXG4gICAgcmV0dXJuIHBhZ2VzXG4gICAgICAuZmxhdE1hcCgocGFnZSkgPT4gKHBhZ2UuY29tcG9uZW50cyA/PyBbXSlcbiAgICAgICAgLmZsYXRNYXAoKGNvbXBvbmVudCkgPT4gdGhpcy5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCkpKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAgdmFsdWUgYXMgdGhlIGZpZWxkcyBhIHJlcXVlc3QgY2FycmllczogZGF0ZSBib3VuZHMgYXMgY2FsZW5kYXJcbiAgLy8gZGF5cywgc2VsZWN0IHZhbHVlcyB3aGVuIGFueSBhcmUgcGlja2VkLCBrZXl3b3JkIHRleHQgdHJpbW1lZC4gTnVsbCB3aGVuXG4gIC8vIGFsbCBvZiB0aGVtIGFyZSBlbXB0eS4gVGhlIHByZXNldCBuYW1lIGlzIFVSTCBzdGF0ZSBvbmx5LCBzbyBpdCBpcyBsZWZ0XG4gIC8vIGJlaGluZC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZWRGaWVsZHModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+ID0ge307XG5cbiAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgIGZpZWxkcy5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIGZpZWxkcy5lbmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICBmaWVsZHMudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgZmllbGRzLnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZHMuc3RhcnQgfHwgZmllbGRzLmVuZCB8fCBmaWVsZHMudmFsdWVzIHx8IGZpZWxkcy52YWx1ZVxuICAgICAgPyBmaWVsZHNcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFNlZWRzIG9uZSBncm91cCBvbiAocmUpbG9hZDsgc2VlIGluaXQoKS4gYHByZXZpb3VzYCBpcyB0aGUgZ3JvdXAgYXMgdGhlXG4gIC8vIGxhc3QgbG9hZCBoYWQgaXQsIG9yIG51bGwgd2hlbiBpdCBpcyBuZXcuXG4gIHByaXZhdGUgX3NlZWQoXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHByZXZpb3VzOiBSZXBvcnRGaWx0ZXJHcm91cCB8IG51bGwsXG4gICAgdGltZXpvbmVDaGFuZ2VkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0Q2hhbmdlZCA9ICFzYW1lRGVmYXVsdChwcmV2aW91cz8uY29uZmlnPy5kZWZhdWx0ID8/IG51bGwsIGdyb3VwLmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsKTtcblxuICAgIGlmIChkZWZhdWx0Q2hhbmdlZCkge1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpO1xuICAgIGNvbnN0IHByZXNldFRvUmVzb2x2ZSA9IHRpbWV6b25lQ2hhbmdlZFxuICAgICAgJiYgISF2YWx1ZT8ucHJlc2V0XG4gICAgICAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmU7XG5cbiAgICBpZiAodmFsdWUgJiYgIWRlZmF1bHRDaGFuZ2VkICYmICFwcmVzZXRUb1Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApO1xuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cC5pZCwgZGVmYXVsdFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICAvLyBUaGUgZGVmYXVsdCB3YXMgY2xlYXJlZCwgc28gdGhlIHZhbHVlIGl0IHNlZWRlZCBnb2VzIHdpdGggaXQuXG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBcHBsaWVzIHRoZSB2aWV3ZXIgc3RhdGUgcmVhZCBmcm9tIHRoZSBVUkwgb24gdG9wIG9mIHRoZSBzZWVkZWQgZGVmYXVsdHMuXG4gIHByaXZhdGUgX3Jlc3RvcmUocmVwb3J0OiBSZXBvcnQsIHJlc3RvcmU6IFJlcG9ydFVybFBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVHcm91cHMocmVzdG9yZSk7XG4gICAgdGhpcy5fcmVzdG9yZUxpc3RTb3J0cyhyZXBvcnQsIHJlc3RvcmUpO1xuXG4gICAgLy8gVGhlIFVSTCBpcyB0aGUgd2hvbGUgdHJ1dGggb24gYSBmaXJzdCBsb2FkOiBubyBncmFpbiBpbiBpdCBtZWFucyB0aGVcbiAgICAvLyBhdXRob3JlZCBvbmVzLiBUaGUgaG9zdCBzdGlsbCBkcm9wcyBhIGdyYWluIHRoZSByZXBvcnQgZG9lcyBub3Qgb2ZmZXIuXG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gR1JBTlVMQVJJVFlfT1BUSU9OU1xuICAgICAgLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSByZXN0b3JlLmdyb3VwQnkpPy52YWx1ZSA/PyBudWxsO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGdyb3VwIHZhbHVlcy4gQW4gZW1wdHkgb25lIGlzIGFuIGV4cGxpY2l0IGNsZWFyIG9mIHRoZSBncm91cC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUdyb3VwcyhyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICByZXN0b3JlLmdyb3Vwcy5mb3JFYWNoKChyYXcsIGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JvdXBcbiAgICAgICAgPyBkZWNvZGVGaWx0ZXJWYWx1ZShncm91cC50eXBlLCByYXcsIChuYW1lKSA9PiB0aGlzLnJlc29sdmVSZWxhdGl2ZShuYW1lKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICAgIGlmIChncm91cD8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGxpc3Qgc29ydHMsIGVhY2gga2VwdCBvbmx5IGZvciBhIGxpc3QgdGhlIHJlcG9ydCBoYXMgYW5kIGFcbiAgLy8gY29sdW1uIHRoYXQgbGlzdCBjYW4gYmUgc29ydGVkIGJ5LlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgcmVzdG9yZS5saXN0U29ydHMuZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGNvbnN0IHNvcnQgPSBkZWNvZGVTb3J0KHJhdyk7XG5cbiAgICAgIGlmIChjb21wb25lbnQgJiYgc29ydCAmJiB0aGlzLl9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChjb21wb25lbnRJZCwgc29ydCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBEcm9wcyBzdGF0ZSBrZXB0IGZvciBncm91cHMsIGxpc3RzIGFuZCBmaWx0ZXJzIHRoZSByZXBvcnQgbm8gbG9uZ2VyIGhhcy5cbiAgLy8gQSBsaXN0IHNvcnQgYWxzbyBnb2VzIHdoZW4gaXRzIGNvbHVtbiBkb2VzOiB0aGUgYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWVcbiAgLy8gaXQsIGFuZCB0aGUgcmVjcmVhdGVkIGxpc3Qgd291bGQgc2VuZCBhIGNvbHVtbiB0aGUgcXVlcnkgZG9lcyBub3Qga25vdy5cbiAgcHJpdmF0ZSBfcHJ1bmUocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGdyb3VwSWQgb2YgWy4uLnRoaXMuX3ZhbHVlcy5rZXlzKCksIC4uLnRoaXMuX2NsZWFyZWRdKSB7XG4gICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoZ3JvdXBJZCkpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcbiAgICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbHRlcklkcyA9IG5ldyBTZXQodGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuaWQpKSk7XG5cbiAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZm9yRWFjaCgoZmlsdGVySWQpID0+IHtcbiAgICAgIGlmICghZmlsdGVySWRzLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgdmFsdWUgYSBiYXIgc2V0cywga2VlcGluZyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIHdoaWxlIHRoZSBkYXlzIGFyZVxuICAvLyBzdGlsbCB0aGUgc3RvcmVkIGRheXMgKHNlZSBzZXRWYWx1ZSkuXG4gIHByaXZhdGUgX3dpdGhQcmVzZXQoc3RvcmVkOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IEZpbHRlckdyb3VwVmFsdWUge1xuICAgIGNvbnN0IGZpeGVkOiBGaWx0ZXJHcm91cFZhbHVlID0geyAuLi52YWx1ZSB9O1xuICAgIGRlbGV0ZSBmaXhlZC5wcmVzZXQ7XG5cbiAgICByZXR1cm4gc3RvcmVkPy5wcmVzZXQgJiYgc2FtZURheXMoc3RvcmVkLCBmaXhlZClcbiAgICAgID8geyAuLi5maXhlZCwgcHJlc2V0OiBzdG9yZWQucHJlc2V0IH1cbiAgICAgIDogZml4ZWQ7XG4gIH1cblxuICAvLyBXaGV0aGVyIGEgdmFsdWUgaXMgdGhlIGdyb3VwJ3MgYXV0aG9yZWQgZGVmYXVsdCwgYnkgdHlwZTogYSBkYXRlIHJhbmdlIG9uXG4gIC8vIGl0cyBkYXlzICh0aGUgZGVmYXVsdCByZXNvbHZlZCB0b2RheSksIGEgc2VsZWN0IG9uIGl0cyB2YWx1ZXMgaW4gYW55XG4gIC8vIG9yZGVyLCBhIGtleXdvcmQgb24gaXRzIHRleHQuXG4gIHByaXZhdGUgX2lzRGVmYXVsdChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcbiAgICBpZiAoIWRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZ3JvdXAudHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgLy8gQW4gdW50b3VjaGVkIHJvbGxpbmcgZGVmYXVsdCBzdGlsbCBjYXJyaWVzIGl0cyBwcmVzZXQgbmFtZS4gSXRzIGRheXNcbiAgICAgICAgLy8gd2VyZSByZXNvbHZlZCB3aGVuIGl0IHdhcyBzZWVkZWQsIGFuZCBhZnRlciBtaWRuaWdodCB0aGV5IG5vIGxvbmdlclxuICAgICAgICAvLyBtYXRjaCB0b2RheSdzLCBidXQgaXQgaXMgc3RpbGwgdGhlIGRlZmF1bHQgYW5kIHN0YXlzIG91dCBvZiB0aGUgVVJMLlxuICAgICAgICBpZiAodmFsdWUucHJlc2V0ICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNhbWVEYXlzKHZhbHVlLCBkZWZhdWx0VmFsdWUpO1xuXG4gICAgICBjYXNlICdzZWxlY3QnOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9ICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSAoZGVmYXVsdFZhbHVlLnZhbHVlcyA/PyBbXSkubWFwKFN0cmluZykuc29ydCgpO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID09PSBkZWZhdWx0cy5sZW5ndGhcbiAgICAgICAgICAmJiB2YWx1ZXMuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBpdGVtID09PSBkZWZhdWx0c1tpbmRleF0pO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKHZhbHVlLnZhbHVlID8/ICcnKS50cmltKCkgPT09IChkZWZhdWx0VmFsdWUudmFsdWUgPz8gJycpLnRyaW0oKTtcbiAgICB9XG4gIH1cblxuICAvLyBFdmVyeSBjb21wb25lbnQgb2YgdGhlIHJlcG9ydDogaXRzIHBhZ2VzJyBhbmQgaXRzIGhlYWRlciBhbmQgZm9vdGVyJ3MuXG4gIHByaXZhdGUgX2NvbXBvbmVudHMocmVwb3J0OiBSZXBvcnQpOiBSZXBvcnRDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihyZXBvcnQucGFnZXMgPz8gW10pLmZsYXRNYXAoKHBhZ2UpID0+IHBhZ2UuY29tcG9uZW50cyA/PyBbXSksXG4gICAgICAuLi4ocmVwb3J0Lm1hc3Rlcj8uY29tcG9uZW50cyA/PyBbXSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RDb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jyk7XG4gIH1cblxuICAvLyBUaGUgY29sdW1ucyBhIGxpc3QgY2FuIGJlIHNvcnRlZCBieTogZXZlcnkgYXV0aG9yZWQgY29sdW1uLCBvciBhXG4gIC8vIGNyb3NzLXRhYidzIHJvdyBjb2x1bW4gb25seSAoaXRzIHBpdm90IGNvbHVtbnMgY29tZSBhbmQgZ28gd2l0aCB0aGUgZGF0YSkuXG4gIHByaXZhdGUgX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnO1xuXG4gICAgaWYgKGNvbmZpZz8ucGl2b3RCeT8uY29sdW1uKSB7XG4gICAgICByZXR1cm4gY29uZmlnLnJvd0J5Py5jb2x1bW4gPyBbY29uZmlnLnJvd0J5LmNvbHVtbl0gOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNvbmZpZz8uY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+IGNvbHVtbi5jb2x1bW4pO1xuICB9XG5cbiAgLy8gQSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIG1hcHBlZCB0byBhIHNlc3Npb24gdmFsdWUgYnkgdHlwZS4gUmVsYXRpdmVcbiAgLy8gZGF0ZSBwcmVzZXRzIHJlc29sdmUgYWdhaW5zdCBcIm5vd1wiIGVhY2ggdGltZSB0aGUgcmVwb3J0IG9wZW5zLCBzbyBhIHNhdmVkXG4gIC8vIFwibGFzdCAxMiBtb250aHNcIiBzdGF5cyByZWxhdGl2ZSBhbmQgY2FycmllcyBpdHMgcHJlc2V0IG5hbWU7IGEgZml4ZWRcbiAgLy8gcmFuZ2UsIHNlbGVjdCB2YWx1ZXMgYW5kIGtleXdvcmQgdGV4dCBzZWVkIHZlcmJhdGltLlxuICBwcml2YXRlIF9kZWZhdWx0VmFsdWUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcbiAgICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSk7XG5cbiAgICAgIHJldHVybiByYW5nZSA/IHsgc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCwgcHJlc2V0OiBncm91cERlZmF1bHQucmVsYXRpdmUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5zdGFydCB8fCBncm91cERlZmF1bHQuZW5kKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogZ3JvdXBEZWZhdWx0LmVuZCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IGdyb3VwRGVmYXVsdC52YWx1ZXMgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogZ3JvdXBEZWZhdWx0LnZhbHVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBIHJlbGF0aXZlIHByZXNldCBhcyBhIGNhbGVuZGFyLWRheSByYW5nZS4gXCJUb2RheVwiIGlzIHRoZSBkYXkgaW4gdGhlXG4gIC8vIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lLCBub3QgdGhlIGJyb3dzZXIncywgc28gZXZlcnkgdmlld2VyIHNlZWRzIHRoZSBzYW1lXG4gIC8vIHJhbmdlLiBUaGUgc2VydmVyIHR3aW4gaXMgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW0gKGZyYW1ld29yay9SZXBvcnQvRW51bSksXG4gIC8vIGFuZCBSZXBvcnRSZWxhdGl2ZVJhbmdlRW51bVRlc3QgcGlucyB0aGUgdGFibGUgYm90aCBzaWRlcyBtdXN0IHByb2R1Y2UuXG4gIHByaXZhdGUgX3JlbGF0aXZlUmFuZ2UocmVsYXRpdmU6IHN0cmluZyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgbm93ID0gZ2V0Wm9uZWROb3codGhpcy50aW1lem9uZSgpKTtcblxuICAgIHN3aXRjaCAocmVsYXRpdmUpIHtcbiAgICAgIC8vIEEgY2FsZW5kYXIgd2VlaywgTW9uZGF5IHRvIFN1bmRheSAoUkVQT1JUX1dFRUtfU1RBUlRTX09OLCB0aGUgc2FtZSB3ZWVrXG4gICAgICAvLyB0aGUgc2VydmVyJ3Mgd2Vla2x5IGJ1Y2tldHMgdXNlKSwgaW4gd2hvbGUgZGF5cyDigJQgbm90IHRoZSByb2xsaW5nXG4gICAgICAvLyBzZXZlbiBkYXlzIGBsYXN0N0RheXNgIGdpdmVzLCB3aGljaCBuZXZlciBsaW5lcyB1cCB3aXRoIHRoZSB3ZWVrIGFcbiAgICAgIC8vIHBhcnRuZXIgaGFzIGFscmVhZHkgYmVlbiBzZW50LiBgbGFzdFdlZWtgIGlzIHRoZSBvbmUgYSB3ZWVrbHkgcmVwb3J0XG4gICAgICAvLyB3YW50czogaXQgZW5kcyBvbiB0aGUgcHJldmlvdXMgd2VlaydzIFN1bmRheSByYXRoZXIgdGhhbiBhdCBgbm93YCxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdlZWsgaXQgbmFtZXMgaGFzIGNsb3NlZC4gYHRoaXNXZWVrYCBmb2xsb3dzIGV2ZXJ5IG90aGVyXG4gICAgICAvLyBwcmVzZXQgaGVyZSBhbmQgcnVucyB1cCB0byBub3csIHNvIGl0IGlzIGRlbGliZXJhdGVseSBhIHBhcnQtZmluaXNoZWRcbiAgICAgIC8vIHdlZWsgKG9uIGEgU3VuZGF5IGl0IGlzIHRoZSB3aG9sZSBNb25kYXktdG8tU3VuZGF5IHdlZWspLlxuICAgICAgY2FzZSAndGhpc1dlZWsnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZldlZWsobm93LCB7IHdlZWtTdGFydHNPbjogUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0pLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdFdlZWsnOiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gc3ViV2Vla3Mobm93LCAxKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydE9mV2VlayhwcmV2aW91cywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSxcbiAgICAgICAgICBlbmQ6IGVuZE9mV2VlayhwcmV2aW91cywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xhc3Q3RGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgNyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0MzBEYXlzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1YkRheXMobm93LCAzMCksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0M01vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAzKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3Q2TW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDYpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDEyTW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDEyKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNNb250aCc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mTW9udGgobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNRdWFydGVyJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZRdWFydGVyKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzWWVhcic6XG4gICAgICBjYXNlICd5ZWFyVG9EYXRlJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZZZWFyKG5vdyksIGVuZDogbm93IH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==