bways-report 0.1.6 → 0.1.8

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 (98) hide show
  1. package/README.md +293 -464
  2. package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
  3. package/esm2022/lib/core/index.mjs +2 -1
  4. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  5. package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
  6. package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
  7. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
  10. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
  11. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
  12. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
  13. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
  14. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
  16. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
  17. package/esm2022/lib/data-access/adapters/index.mjs +8 -1
  18. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  19. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
  20. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
  21. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
  22. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  26. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
  27. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
  28. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  29. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
  30. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
  31. package/esm2022/lib/features/designer/designer.component.mjs +276 -21
  32. package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
  33. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
  34. package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
  35. package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
  36. package/esm2022/lib/features/embed/index.mjs +5 -0
  37. package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
  38. package/esm2022/lib/features/index.mjs +2 -1
  39. package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
  40. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
  41. package/esm2022/lib/features/routing/index.mjs +2 -2
  42. package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
  43. package/esm2022/lib/features/routing/report-routes.mjs +42 -1
  44. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
  45. package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
  46. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
  47. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
  48. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
  49. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
  50. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  51. package/esm2022/lib/primitives/components/index.mjs +2 -1
  52. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
  53. package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
  54. package/esm2022/lib/provide-reporting.mjs +137 -7
  55. package/fesm2022/bways-report.mjs +4286 -859
  56. package/fesm2022/bways-report.mjs.map +1 -1
  57. package/lib/core/config/bways-report-config.d.ts +161 -0
  58. package/lib/core/index.d.ts +1 -0
  59. package/lib/core/models/report-definition.model.d.ts +16 -0
  60. package/lib/core/services/report-session-context.service.d.ts +1 -0
  61. package/lib/core/tokens/reporting-config.token.d.ts +16 -0
  62. package/lib/core/utils/data-normalization.util.d.ts +10 -0
  63. package/lib/core/utils/report-parameter.util.d.ts +18 -1
  64. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
  65. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
  66. package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
  67. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
  68. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
  69. package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -0
  71. package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
  72. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
  73. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
  74. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
  75. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
  76. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
  77. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
  78. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
  79. package/lib/features/designer/designer.component.d.ts +15 -0
  80. package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
  81. package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
  82. package/lib/features/embed/bways-report-page.component.d.ts +61 -0
  83. package/lib/features/embed/index.d.ts +4 -0
  84. package/lib/features/embed/inject-report-menu.d.ts +44 -0
  85. package/lib/features/index.d.ts +1 -0
  86. package/lib/features/persistence/services/report-store.service.d.ts +5 -0
  87. package/lib/features/routing/index.d.ts +1 -1
  88. package/lib/features/routing/models/report-route.models.d.ts +3 -0
  89. package/lib/features/routing/report-routes.d.ts +40 -0
  90. package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
  91. package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
  92. package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
  93. package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
  97. package/lib/provide-reporting.d.ts +22 -6
  98. package/package.json +1 -1
@@ -92,11 +92,18 @@ export class DesignerStateService {
92
92
  label: meta?.displayName ?? type,
93
93
  key: `${type}_${Math.random().toString(36).substring(2, 6)}`,
94
94
  };
95
+ const existingKeys = new Set(this.definition().components.map((c) => c.key).filter(Boolean));
96
+ const baseKey = overrides?.key ?? defaultConfig.key ?? `${type}_${Math.random().toString(36).substring(2, 6)}`;
97
+ let uniqueKey = baseKey;
98
+ let counter = 1;
99
+ while (existingKeys.has(uniqueKey)) {
100
+ uniqueKey = `${baseKey}_${counter++}`;
101
+ }
95
102
  const newComponent = {
96
103
  id: generateId(type),
97
104
  type,
98
105
  label: overrides?.label ?? defaultConfig.label ?? meta?.displayName ?? type,
99
- key: overrides?.key ?? defaultConfig.key ?? `${type}_${Math.random().toString(36).substring(2, 6)}`,
106
+ key: uniqueKey,
100
107
  order: 0,
101
108
  layout: {
102
109
  columnSpan: overrides?.layout?.columnSpan ?? defaultConfig.layout?.columnSpan ?? (type === 'button' ? 2 : 4),
@@ -375,4 +382,4 @@ export class DesignerStateService {
375
382
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerStateService, decorators: [{
376
383
  type: Injectable
377
384
  }] });
378
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBS2xFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2Qjs7Ozs7R0FLRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEQsdUNBQXVDO0lBQzlCLFVBQVUsR0FBRyxNQUFNLENBQW1CO1FBQzdDLEVBQUUsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsYUFBYSxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQy9ELFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFFSCxzQ0FBc0M7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUUzRCxpQ0FBaUM7SUFDeEIsU0FBUyxHQUFHLE1BQU0sQ0FBb0IsWUFBWSxDQUFDLENB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Qjs0R0FBcEIsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0R3JpZERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kYXRhc291cmNlLm1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9yZWdpc3RyeS9jb21wb25lbnQtcmVnaXN0cnknO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbGl0aWVzL2lkLWdlbmVyYXRvcic7XG5cbmV4cG9ydCB0eXBlIERlc2lnbmVyVmlld01vZGUgPSAnZGVzaWduJyB8ICdwcmV2aWV3JyB8ICdqc29uJztcbmV4cG9ydCB0eXBlIERlc2lnbmVyQWN0aXZlVGFiID0gJ3Byb3BlcnRpZXMnIHwgJ3JlcG9ydCcgfCAnZ3JpZCc7XG5cbmNvbnN0IE1BWF9ISVNUT1JZID0gMzA7XG5cbi8qKlxuICogRGVzaWduZXJTdGF0ZVNlcnZpY2UgY29vcmRpbmF0ZXMgc3RhdGUgZm9yIHRoZSB2aXN1YWwgcmVwb3J0IGRlc2lnbmVyLlxuICpcbiAqIFNjb3BlZCBhdCB0aGUgRGVzaWduZXIgY29tcG9uZW50IGxldmVsIChub3Qgcm9vdCkgdG8gZW5zdXJlIG11bHRpcGxlIGRlc2lnbmVyXG4gKiBpbnN0YW5jZXMgb3IgbmF2aWdhdGlvbiBmbG93cyByZW1haW4gc3RyaWN0bHkgaXNvbGF0ZWQuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZXNpZ25lclN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnkgPSBpbmplY3QoQ29tcG9uZW50UmVnaXN0cnkpO1xuXG4gIC8qKiBDdXJyZW50IGFjdGl2ZSByZXBvcnQgZGVmaW5pdGlvbiAqL1xuICByZWFkb25seSBkZWZpbml0aW9uID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24+KHtcbiAgICBpZDogZ2VuZXJhdGVJZCgncnB0JyksXG4gICAgbmFtZTogJ1VudGl0bGVkIFJlcG9ydCcsXG4gICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICB2ZXJzaW9uOiAxLFxuICAgIGxheW91dDogeyBjb2x1bW5zOiAxMiwgZ2FwOiAxNiwgcGFkZGluZzogMjQsIGRpcmVjdGlvbjogJ2x0cicgfSxcbiAgICBjb21wb25lbnRzOiBbXSxcbiAgICBwYXJhbWV0ZXJzOiBbXSxcbiAgICBkYXRhU291cmNlczogW10sXG4gIH0pO1xuXG4gIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSUQgaW4gY2FudmFzICovXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29tcG9uZW50SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIEFjdGl2ZSBwcm9wZXJ0eSBlZGl0b3IgdGFiICovXG4gIHJlYWRvbmx5IGFjdGl2ZVRhYiA9IHNpZ25hbDxEZXNpZ25lckFjdGl2ZVRhYj4oJ3Byb3BlcnRpZXMnKTtcblxuICAvKiogQ3VycmVudCB2aWV3IG1vZGUgKGRlc2lnbiwgcHJldmlldywgb3IgcmF3IGpzb24pICovXG4gIHJlYWRvbmx5IHZpZXdNb2RlID0gc2lnbmFsPERlc2lnbmVyVmlld01vZGU+KCdkZXNpZ24nKTtcblxuICAvKiogRGlydHkgZmxhZyBpbmRpY2F0aW5nIHVuc2F2ZWQgY2hhbmdlcyAqL1xuICByZWFkb25seSBpc0RpcnR5ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBIaXN0b3J5IHN0YWNrIGZvciBVbmRvIC8gUmVkb1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnkgPSBzaWduYWw8UmVwb3J0RGVmaW5pdGlvbltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeUluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuXG4gIHJlYWRvbmx5IGNhblVuZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmhpc3RvcnlJbmRleCgpID4gMCk7XG4gIHJlYWRvbmx5IGNhblJlZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmhpc3RvcnlJbmRleCgpID49IDAgJiYgdGhpcy5oaXN0b3J5SW5kZXgoKSA8IHRoaXMuaGlzdG9yeSgpLmxlbmd0aCAtIDEpO1xuXG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgY29tcG9uZW50IGluc3RhbmNlLCBvciBudWxsIGlmIG5vbmUgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnQgPSBjb21wdXRlZDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMuZmluZCgoYykgPT4gYy5pZCA9PT0gaWQpID8/IG51bGw7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBvciByZWxvYWRzIGEgcmVwb3J0IGRlZmluaXRpb24gaW50byB0aGUgZGVzaWduZXIuXG4gICAqL1xuICBsb2FkRGVmaW5pdGlvbihkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZikpIGFzIFJlcG9ydERlZmluaXRpb247XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChjbG9uZWQpO1xuXG4gICAgLy8gUHJlc2VydmUgYWN0aXZlIGNvbXBvbmVudCBzZWxlY3Rpb24gaWYgaXQgc3RpbGwgZXhpc3RzIGluIHRoZSBsb2FkZWQgZGVmaW5pdGlvblxuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZElkID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCk7XG4gICAgaWYgKGN1cnJlbnRTZWxlY3RlZElkICYmIGNsb25lZC5jb21wb25lbnRzLnNvbWUoKGMpID0+IGMuaWQgPT09IGN1cnJlbnRTZWxlY3RlZElkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChjdXJyZW50U2VsZWN0ZWRJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZC5zZXQobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0RpcnR5LnNldChmYWxzZSk7XG4gICAgdGhpcy5oaXN0b3J5LnNldChbSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjbG9uZWQpKV0pO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgY29tcG9uZW50IGZvciBwcm9wZXJ0eSBlZGl0aW5nLlxuICAgKi9cbiAgc2VsZWN0Q29tcG9uZW50KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChpZCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmFjdGl2ZVRhYi5zZXQoJ3Byb3BlcnRpZXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIHZpZXcgbW9kZSAoZGVzaWduLCBsaXZlIHByZXZpZXcsIGpzb24gc2NoZW1hKS5cbiAgICovXG4gIHNldFZpZXdNb2RlKG1vZGU6IERlc2lnbmVyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlLnNldChtb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgZWRpdG9yIHRhYi5cbiAgICovXG4gIHNldEFjdGl2ZVRhYih0YWI6IERlc2lnbmVyQWN0aXZlVGFiKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVUYWIuc2V0KHRhYik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBjb21wb25lbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIG9udG8gdGhlIGNhbnZhcy5cbiAgICovXG4gIGFkZENvbXBvbmVudChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgdGFyZ2V0SW5kZXg/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uPlxuICApOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHR5cGUpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBtZXRhPy5jcmVhdGVEZWZhdWx0Q29uZmlnKCkgPz8ge1xuICAgICAgaWQ6IGdlbmVyYXRlSWQodHlwZSksXG4gICAgICB0eXBlLFxuICAgICAgbGFiZWw6IG1ldGE/LmRpc3BsYXlOYW1lID8/IHR5cGUsXG4gICAgICBrZXk6IGAke3R5cGV9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDYpfWAsXG4gICAgfTtcblxuICAgIGNvbnN0IG5ld0NvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiA9IHtcbiAgICAgIGlkOiBnZW5lcmF0ZUlkKHR5cGUpLFxuICAgICAgdHlwZSxcbiAgICAgIGxhYmVsOiBvdmVycmlkZXM/LmxhYmVsID8/IGRlZmF1bHRDb25maWcubGFiZWwgPz8gbWV0YT8uZGlzcGxheU5hbWUgPz8gdHlwZSxcbiAgICAgIGtleTogb3ZlcnJpZGVzPy5rZXkgPz8gZGVmYXVsdENvbmZpZy5rZXkgPz8gYCR7dHlwZX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgNil9YCxcbiAgICAgIG9yZGVyOiAwLFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIGNvbHVtblNwYW46IG92ZXJyaWRlcz8ubGF5b3V0Py5jb2x1bW5TcGFuID8/IGRlZmF1bHRDb25maWcubGF5b3V0Py5jb2x1bW5TcGFuID8/ICh0eXBlID09PSAnYnV0dG9uJyA/IDIgOiA0KSxcbiAgICAgICAgLi4uZGVmYXVsdENvbmZpZy5sYXlvdXQsXG4gICAgICAgIC4uLm92ZXJyaWRlcz8ubGF5b3V0LFxuICAgICAgfSxcbiAgICAgIHByb3BlcnRpZXM6IHsgLi4uKGRlZmF1bHRDb25maWcucHJvcGVydGllcyA/PyB7fSksIC4uLihvdmVycmlkZXM/LnByb3BlcnRpZXMgPz8ge30pIH0sXG4gICAgICB2YWxpZGF0aW9uOiBvdmVycmlkZXM/LnZhbGlkYXRpb24gPz8gKGRlZmF1bHRDb25maWcudmFsaWRhdGlvbiA/IHsgLi4uZGVmYXVsdENvbmZpZy52YWxpZGF0aW9uIH0gOiB1bmRlZmluZWQpLFxuICAgICAgZGF0YVNvdXJjZTogb3ZlcnJpZGVzPy5kYXRhU291cmNlID8/IChkZWZhdWx0Q29uZmlnLmRhdGFTb3VyY2UgPyB7IC4uLmRlZmF1bHRDb25maWcuZGF0YVNvdXJjZSB9IDogdW5kZWZpbmVkKSxcbiAgICAgIGVuYWJsZWQ6IG92ZXJyaWRlcz8uZW5hYmxlZCA/PyBkZWZhdWx0Q29uZmlnLmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSBbLi4udGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50c10uc29ydChcbiAgICAgIChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApXG4gICAgKTtcbiAgICBpZiAodGFyZ2V0SW5kZXggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRJbmRleCA+PSAwICYmIHRhcmdldEluZGV4IDw9IGN1cnJlbnRDb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgY3VycmVudENvbXBvbmVudHMuc3BsaWNlKHRhcmdldEluZGV4LCAwLCBuZXdDb21wb25lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Q29tcG9uZW50cy5wdXNoKG5ld0NvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgLy8gUmVjYWxjdWxhdGUgb3JkZXIgaW5kaWNlc1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcblxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KG5ld0NvbXBvbmVudC5pZCk7XG4gICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY29tcG9uZW50IGJ5IGl0cyBJRC5cbiAgICovXG4gIHJlbW92ZUNvbXBvbmVudChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLmZpbHRlcigoYykgPT4gYy5pZCAhPT0gaWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCkgPT09IGlkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIER1cGxpY2F0ZXMgYW4gZXhpc3RpbmcgY29tcG9uZW50LlxuICAgKi9cbiAgZHVwbGljYXRlQ29tcG9uZW50KGlkOiBzdHJpbmcpOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLmZpbmQoKGMpID0+IGMuaWQgPT09IGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGR1cGxpY2F0ZWQ6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gPSB7XG4gICAgICAuLi5KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nKSksXG4gICAgICBpZDogZ2VuZXJhdGVJZChleGlzdGluZy50eXBlKSxcbiAgICAgIGtleTogZXhpc3Rpbmcua2V5ID8gYCR7ZXhpc3Rpbmcua2V5fV9jb3B5YCA6IHVuZGVmaW5lZCxcbiAgICAgIGxhYmVsOiBleGlzdGluZy5sYWJlbCA/IGAke2V4aXN0aW5nLmxhYmVsfSAoQ29weSlgIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IFsuLi50aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMClcbiAgICApO1xuICAgIGNvbnN0IGluZGV4ID0gY3VycmVudENvbXBvbmVudHMuZmluZEluZGV4KChjKSA9PiBjLmlkID09PSBpZCk7XG4gICAgY3VycmVudENvbXBvbmVudHMuc3BsaWNlKGluZGV4ICsgMSwgMCwgZHVwbGljYXRlZCk7XG4gICAgY3VycmVudENvbXBvbmVudHMuZm9yRWFjaCgoYywgaWR4KSA9PiAoYy5vcmRlciA9IGlkeCArIDEpKTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQoZHVwbGljYXRlZC5pZCk7XG4gICAgcmV0dXJuIGR1cGxpY2F0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSBjb21wb25lbnQgZnJvbSBwcmV2aW91cyBpbmRleCB0byBjdXJyZW50IGluZGV4IChlLmcuIGZyb20gQ0RLIGRyYWcgZHJvcCkuXG4gICAqL1xuICBtb3ZlQ29tcG9uZW50KHByZXZpb3VzSW5kZXg6IG51bWJlciwgY3VycmVudEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocHJldmlvdXNJbmRleCA9PT0gY3VycmVudEluZGV4KSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IFsuLi50aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMClcbiAgICApO1xuICAgIGlmIChwcmV2aW91c0luZGV4IDwgMCB8fCBwcmV2aW91c0luZGV4ID49IGN1cnJlbnRDb21wb25lbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGN1cnJlbnRJbmRleCwgY3VycmVudENvbXBvbmVudHMubGVuZ3RoIC0gMSkpO1xuXG4gICAgY29uc3QgW21vdmVkXSA9IGN1cnJlbnRDb21wb25lbnRzLnNwbGljZShwcmV2aW91c0luZGV4LCAxKTtcbiAgICBjdXJyZW50Q29tcG9uZW50cy5zcGxpY2UodGFyZ2V0SWR4LCAwLCBtb3ZlZCk7XG4gICAgY3VycmVudENvbXBvbmVudHMuZm9yRWFjaCgoYywgaWR4KSA9PiAoYy5vcmRlciA9IGlkeCArIDEpKTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcGFydGlhbCBwcm9wZXJ0aWVzIG9mIGEgY29tcG9uZW50LlxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50KGlkOiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbj4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYywgLi4udXBkYXRlcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgc2luZ2xlIGNvbXBvbmVudCBwcm9wZXJ0eSB2YWx1ZSB3aXRoaW4gYHByb3BlcnRpZXNgLlxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50UHJvcGVydHkoaWQ6IHN0cmluZywgcHJvcEtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5tYXAoKGMpID0+IHtcbiAgICAgIGlmIChjLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgLi4uKGMucHJvcGVydGllcyA/PyB7fSksXG4gICAgICAgICAgICBbcHJvcEtleV06IHZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgbGF5b3V0IHByb3BlcnRpZXMgZm9yIGEgY29tcG9uZW50IChlLmcuIGNvbHVtblNwYW4pLlxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50TGF5b3V0KGlkOiBzdHJpbmcsIGxheW91dDogUGFydGlhbDxDb21wb25lbnRMYXlvdXREZWZpbml0aW9uPik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5tYXAoKGMpID0+IHtcbiAgICAgIGlmIChjLmlkID09PSBpZCkge1xuICAgICAgICBjb25zdCBuZXh0TGF5b3V0ID0ge1xuICAgICAgICAgIC4uLihjLmxheW91dCA/PyB7fSksXG4gICAgICAgICAgLi4ubGF5b3V0LFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhsYXlvdXQpIGFzIChrZXlvZiBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uKVtdKSB7XG4gICAgICAgICAgaWYgKGxheW91dFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXh0TGF5b3V0W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYyxcbiAgICAgICAgICBsYXlvdXQ6IG5leHRMYXlvdXQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcmVwb3J0LWxldmVsIHNldHRpbmdzIChuYW1lLCBkZXNjcmlwdGlvbiwgbGF5b3V0KS5cbiAgICovXG4gIHVwZGF0ZVJlcG9ydFNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPFJlcG9ydERlZmluaXRpb24+KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICAuLi5zZXR0aW5ncyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBncmlkIGRlZmluaXRpb24gc2V0dGluZ3MuXG4gICAqL1xuICB1cGRhdGVHcmlkU2V0dGluZ3MoZ3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gfCB1bmRlZmluZWQsIG9wdGlvbnM/OiB7IHNraXBIaXN0b3J5PzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKG9wdGlvbnM/LnNraXBIaXN0b3J5KSB7XG4gICAgICB0aGlzLmRlZmluaXRpb24udXBkYXRlKChkZWYpID0+ICh7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgZ3JpZCxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMuaXNEaXJ0eS5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgZ3JpZCxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBwcmltYXJ5IGRhdGEgc291cmNlIGZvciB0aGUgcmVwb3J0J3MgcmVzdWx0IGdyaWQuXG4gICAqL1xuICBzZXRHcmlkRGF0YVNvdXJjZShkczogUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdTb3VyY2VzID0gZGVmLmRhdGFTb3VyY2VzID8/IFtdO1xuICAgICAgY29uc3QgaWR4ID0gZXhpc3RpbmdTb3VyY2VzLmZpbmRJbmRleCgocykgPT4gcy5pZCA9PT0gZHMuaWQpO1xuICAgICAgbGV0IG5leHRTb3VyY2VzOiBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbltdO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIG5leHRTb3VyY2VzID0gWy4uLmV4aXN0aW5nU291cmNlc107XG4gICAgICAgIG5leHRTb3VyY2VzW2lkeF0gPSBkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRTb3VyY2VzID0gW2RzLCAuLi5leGlzdGluZ1NvdXJjZXNdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVkR3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gPSB7XG4gICAgICAgIC4uLihkZWYuZ3JpZCA/PyB7XG4gICAgICAgICAgZGF0YVNvdXJjZUlkOiBkcy5pZCxcbiAgICAgICAgICBjb2x1bW5zOiBbXSxcbiAgICAgICAgICBvcHRpb25zOiB7IHBhZ2luYXRpb246IHRydWUsIHBhZ2VTaXplOiAyNSwgc2hvd1Jvd051bWJlcnM6IHRydWUsIHNob3dGb290ZXI6IHRydWUgfSxcbiAgICAgICAgfSksXG4gICAgICAgIGRhdGFTb3VyY2VJZDogZHMuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIGRhdGFTb3VyY2VzOiBuZXh0U291cmNlcyxcbiAgICAgICAgZ3JpZDogdXBkYXRlZEdyaWQsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHBhcmFtZXRlciBtYXBwaW5ncyBmb3IgdGhlIHByaW1hcnkgZ3JpZCBkYXRhIHNvdXJjZS5cbiAgICovXG4gIHVwZGF0ZUdyaWREYXRhU291cmNlUGFyYW1ldGVycyhtYXBwaW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4ge1xuICAgICAgY29uc3QgZ3JpZERzSWQgPSBkZWYuZ3JpZD8uZGF0YVNvdXJjZUlkO1xuICAgICAgY29uc3Qgc291cmNlcyA9IGRlZi5kYXRhU291cmNlcyA/PyBbXTtcbiAgICAgIGNvbnN0IHRhcmdldElkeCA9IHNvdXJjZXMuZmluZEluZGV4KChzKSA9PiBzLmlkID09PSBncmlkRHNJZCB8fCBzLm5hbWUgPT09IGdyaWREc0lkKTtcblxuICAgICAgaWYgKHRhcmdldElkeCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IG5leHRTb3VyY2VzID0gWy4uLnNvdXJjZXNdO1xuICAgICAgICBuZXh0U291cmNlc1t0YXJnZXRJZHhdID0ge1xuICAgICAgICAgIC4uLm5leHRTb3VyY2VzW3RhcmdldElkeF0sXG4gICAgICAgICAgcGFyYW1ldGVyTWFwcGluZ3M6IG1hcHBpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZixcbiAgICAgICAgICBkYXRhU291cmNlczogbmV4dFNvdXJjZXMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWY7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJ0cyB0byB0aGUgcHJldmlvdXMgc3RhdGUgaW4gaGlzdG9yeS5cbiAgICovXG4gIHVuZG8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblVuZG8oKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSAtIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5ld0luZGV4KTtcbiAgICBjb25zdCByZXN0b3JlZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5oaXN0b3J5KClbbmV3SW5kZXhdKSkgYXMgUmVwb3J0RGVmaW5pdGlvbjtcbiAgICB0aGlzLmRlZmluaXRpb24uc2V0KHJlc3RvcmVkKTtcbiAgICB0aGlzLmlzRGlydHkuc2V0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2VzIHRvIHRoZSBuZXh0IHN0YXRlIGluIGhpc3RvcnkuXG4gICAqL1xuICByZWRvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5SZWRvKCkpIHJldHVybjtcbiAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXdJbmRleCk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlzdG9yeSgpW25ld0luZGV4XSkpIGFzIFJlcG9ydERlZmluaXRpb247XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChyZXN0b3JlZCk7XG4gICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgY3VycmVudCBkZWZpbml0aW9uIHN0YXRlIGFzIHNhdmVkLlxuICAgKi9cbiAgbWFya1NhdmVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEaXJ0eS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYW4gaW1tdXRhYmxlIHN0YXRlIGNoYW5nZSBhbmQgcHVzaGVzIHRvIGhpc3RvcnkuXG4gICAqL1xuICBwcml2YXRlIG11dGF0ZURlZmluaXRpb24odXBkYXRlcjogKGN1cnJlbnQ6IFJlcG9ydERlZmluaXRpb24pID0+IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdXBkYXRlcih0aGlzLmRlZmluaXRpb24oKSk7XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChuZXh0KTtcbiAgICB0aGlzLmlzRGlydHkuc2V0KHRydWUpO1xuICAgIHRoaXMucHVzaEhpc3RvcnkobmV4dCk7XG4gIH1cblxuICBwcml2YXRlIHB1c2hIaXN0b3J5KGRlZjogUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRIaXN0ID0gdGhpcy5oaXN0b3J5KCkuc2xpY2UoMCwgdGhpcy5oaXN0b3J5SW5kZXgoKSArIDEpO1xuICAgIGN1cnJlbnRIaXN0LnB1c2goSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZWYpKSk7XG4gICAgaWYgKGN1cnJlbnRIaXN0Lmxlbmd0aCA+IE1BWF9ISVNUT1JZKSB7XG4gICAgICBjdXJyZW50SGlzdC5zaGlmdCgpO1xuICAgIH1cbiAgICB0aGlzLmhpc3Rvcnkuc2V0KGN1cnJlbnRIaXN0KTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQoY3VycmVudEhpc3QubGVuZ3RoIC0gMSk7XG4gIH1cbn1cbiJdfQ==
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBS2xFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2Qjs7Ozs7R0FLRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEQsdUNBQXVDO0lBQzlCLFVBQVUsR0FBRyxNQUFNLENBQW1CO1FBQzdDLEVBQUUsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsYUFBYSxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQy9ELFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFFSCxzQ0FBc0M7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUUzRCxpQ0FBaUM7SUFDeEIsU0FBUyxHQUFHLE1BQU0sQ0FBb0IsWUFBWSxDQUFDLENB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RSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckUsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQzt3R0FuYVUsb0JBQW9COzRHQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWxheW91dC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRhdGFzb3VyY2UubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVnaXN0cnkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3JlZ2lzdHJ5L2NvbXBvbmVudC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkIH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlsaXRpZXMvaWQtZ2VuZXJhdG9yJztcblxuZXhwb3J0IHR5cGUgRGVzaWduZXJWaWV3TW9kZSA9ICdkZXNpZ24nIHwgJ3ByZXZpZXcnIHwgJ2pzb24nO1xuZXhwb3J0IHR5cGUgRGVzaWduZXJBY3RpdmVUYWIgPSAncHJvcGVydGllcycgfCAncmVwb3J0JyB8ICdncmlkJztcblxuY29uc3QgTUFYX0hJU1RPUlkgPSAzMDtcblxuLyoqXG4gKiBEZXNpZ25lclN0YXRlU2VydmljZSBjb29yZGluYXRlcyBzdGF0ZSBmb3IgdGhlIHZpc3VhbCByZXBvcnQgZGVzaWduZXIuXG4gKlxuICogU2NvcGVkIGF0IHRoZSBEZXNpZ25lciBjb21wb25lbnQgbGV2ZWwgKG5vdCByb290KSB0byBlbnN1cmUgbXVsdGlwbGUgZGVzaWduZXJcbiAqIGluc3RhbmNlcyBvciBuYXZpZ2F0aW9uIGZsb3dzIHJlbWFpbiBzdHJpY3RseSBpc29sYXRlZC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlc2lnbmVyU3RhdGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IGluamVjdChDb21wb25lbnRSZWdpc3RyeSk7XG5cbiAgLyoqIEN1cnJlbnQgYWN0aXZlIHJlcG9ydCBkZWZpbml0aW9uICovXG4gIHJlYWRvbmx5IGRlZmluaXRpb24gPSBzaWduYWw8UmVwb3J0RGVmaW5pdGlvbj4oe1xuICAgIGlkOiBnZW5lcmF0ZUlkKCdycHQnKSxcbiAgICBuYW1lOiAnVW50aXRsZWQgUmVwb3J0JyxcbiAgICBzY2hlbWFWZXJzaW9uOiAxLFxuICAgIHZlcnNpb246IDEsXG4gICAgbGF5b3V0OiB7IGNvbHVtbnM6IDEyLCBnYXA6IDE2LCBwYWRkaW5nOiAyNCwgZGlyZWN0aW9uOiAnbHRyJyB9LFxuICAgIGNvbXBvbmVudHM6IFtdLFxuICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgIGRhdGFTb3VyY2VzOiBbXSxcbiAgfSk7XG5cbiAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRCBpbiBjYW52YXMgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnRJZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvKiogQWN0aXZlIHByb3BlcnR5IGVkaXRvciB0YWIgKi9cbiAgcmVhZG9ubHkgYWN0aXZlVGFiID0gc2lnbmFsPERlc2lnbmVyQWN0aXZlVGFiPigncHJvcGVydGllcycpO1xuXG4gIC8qKiBDdXJyZW50IHZpZXcgbW9kZSAoZGVzaWduLCBwcmV2aWV3LCBvciByYXcganNvbikgKi9cbiAgcmVhZG9ubHkgdmlld01vZGUgPSBzaWduYWw8RGVzaWduZXJWaWV3TW9kZT4oJ2Rlc2lnbicpO1xuXG4gIC8qKiBEaXJ0eSBmbGFnIGluZGljYXRpbmcgdW5zYXZlZCBjaGFuZ2VzICovXG4gIHJlYWRvbmx5IGlzRGlydHkgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIEhpc3Rvcnkgc3RhY2sgZm9yIFVuZG8gLyBSZWRvXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeSA9IHNpZ25hbDxSZXBvcnREZWZpbml0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5SW5kZXggPSBzaWduYWw8bnVtYmVyPigtMSk7XG5cbiAgcmVhZG9ubHkgY2FuVW5kbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPiAwKTtcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPj0gMCAmJiB0aGlzLmhpc3RvcnlJbmRleCgpIDwgdGhpcy5oaXN0b3J5KCkubGVuZ3RoIC0gMSk7XG5cbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBjb21wb25lbnQgaW5zdGFuY2UsIG9yIG51bGwgaWYgbm9uZSAqL1xuICByZWFkb25seSBzZWxlY3RlZENvbXBvbmVudCA9IGNvbXB1dGVkPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQoKTtcbiAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmlkID09PSBpZCkgPz8gbnVsbDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIG9yIHJlbG9hZHMgYSByZXBvcnQgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXNpZ25lci5cbiAgICovXG4gIGxvYWREZWZpbml0aW9uKGRlZjogUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmKSkgYXMgUmVwb3J0RGVmaW5pdGlvbjtcbiAgICB0aGlzLmRlZmluaXRpb24uc2V0KGNsb25lZCk7XG5cbiAgICAvLyBQcmVzZXJ2ZSBhY3RpdmUgY29tcG9uZW50IHNlbGVjdGlvbiBpZiBpdCBzdGlsbCBleGlzdHMgaW4gdGhlIGxvYWRlZCBkZWZpbml0aW9uXG4gICAgY29uc3QgY3VycmVudFNlbGVjdGVkSWQgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQoKTtcbiAgICBpZiAoY3VycmVudFNlbGVjdGVkSWQgJiYgY2xvbmVkLmNvbXBvbmVudHMuc29tZSgoYykgPT4gYy5pZCA9PT0gY3VycmVudFNlbGVjdGVkSWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KGN1cnJlbnRTZWxlY3RlZElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzRGlydHkuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmhpc3Rvcnkuc2V0KFtKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNsb25lZCkpXSk7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBjb21wb25lbnQgZm9yIHByb3BlcnR5IGVkaXRpbmcuXG4gICAqL1xuICBzZWxlY3RDb21wb25lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KGlkKTtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlVGFiLnNldCgncHJvcGVydGllcycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgdmlldyBtb2RlIChkZXNpZ24sIGxpdmUgcHJldmlldywganNvbiBzY2hlbWEpLlxuICAgKi9cbiAgc2V0Vmlld01vZGUobW9kZTogRGVzaWduZXJWaWV3TW9kZSk6IHZvaWQge1xuICAgIHRoaXMudmlld01vZGUuc2V0KG1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFjdGl2ZSBlZGl0b3IgdGFiLlxuICAgKi9cbiAgc2V0QWN0aXZlVGFiKHRhYjogRGVzaWduZXJBY3RpdmVUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQodGFiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGNvbXBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgb250byB0aGUgY2FudmFzLlxuICAgKi9cbiAgYWRkQ29tcG9uZW50KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICB0YXJnZXRJbmRleD86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+XG4gICk6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUodHlwZSk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IG1ldGE/LmNyZWF0ZURlZmF1bHRDb25maWcoKSA/PyB7XG4gICAgICBpZDogZ2VuZXJhdGVJZCh0eXBlKSxcbiAgICAgIHR5cGUsXG4gICAgICBsYWJlbDogbWV0YT8uZGlzcGxheU5hbWUgPz8gdHlwZSxcbiAgICAgIGtleTogYCR7dHlwZX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgNil9YCxcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldCh0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLm1hcCgoYykgPT4gYy5rZXkpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3QgYmFzZUtleSA9IG92ZXJyaWRlcz8ua2V5ID8/IGRlZmF1bHRDb25maWcua2V5ID8/IGAke3R5cGV9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDYpfWA7XG4gICAgbGV0IHVuaXF1ZUtleSA9IGJhc2VLZXk7XG4gICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgIHdoaWxlIChleGlzdGluZ0tleXMuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgIHVuaXF1ZUtleSA9IGAke2Jhc2VLZXl9XyR7Y291bnRlcisrfWA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29tcG9uZW50OiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlSWQodHlwZSksXG4gICAgICB0eXBlLFxuICAgICAgbGFiZWw6IG92ZXJyaWRlcz8ubGFiZWwgPz8gZGVmYXVsdENvbmZpZy5sYWJlbCA/PyBtZXRhPy5kaXNwbGF5TmFtZSA/PyB0eXBlLFxuICAgICAga2V5OiB1bmlxdWVLZXksXG4gICAgICBvcmRlcjogMCxcbiAgICAgIGxheW91dDoge1xuICAgICAgICBjb2x1bW5TcGFuOiBvdmVycmlkZXM/LmxheW91dD8uY29sdW1uU3BhbiA/PyBkZWZhdWx0Q29uZmlnLmxheW91dD8uY29sdW1uU3BhbiA/PyAodHlwZSA9PT0gJ2J1dHRvbicgPyAyIDogNCksXG4gICAgICAgIC4uLmRlZmF1bHRDb25maWcubGF5b3V0LFxuICAgICAgICAuLi5vdmVycmlkZXM/LmxheW91dCxcbiAgICAgIH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7IC4uLihkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMgPz8ge30pLCAuLi4ob3ZlcnJpZGVzPy5wcm9wZXJ0aWVzID8/IHt9KSB9LFxuICAgICAgdmFsaWRhdGlvbjogb3ZlcnJpZGVzPy52YWxpZGF0aW9uID8/IChkZWZhdWx0Q29uZmlnLnZhbGlkYXRpb24gPyB7IC4uLmRlZmF1bHRDb25maWcudmFsaWRhdGlvbiB9IDogdW5kZWZpbmVkKSxcbiAgICAgIGRhdGFTb3VyY2U6IG92ZXJyaWRlcz8uZGF0YVNvdXJjZSA/PyAoZGVmYXVsdENvbmZpZy5kYXRhU291cmNlID8geyAuLi5kZWZhdWx0Q29uZmlnLmRhdGFTb3VyY2UgfSA6IHVuZGVmaW5lZCksXG4gICAgICBlbmFibGVkOiBvdmVycmlkZXM/LmVuYWJsZWQgPz8gZGVmYXVsdENvbmZpZy5lbmFibGVkID8/IHRydWUsXG4gICAgfTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gWy4uLnRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHNdLnNvcnQoXG4gICAgICAoYSwgYikgPT4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKVxuICAgICk7XG4gICAgaWYgKHRhcmdldEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0SW5kZXggPj0gMCAmJiB0YXJnZXRJbmRleCA8PSBjdXJyZW50Q29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgIGN1cnJlbnRDb21wb25lbnRzLnNwbGljZSh0YXJnZXRJbmRleCwgMCwgbmV3Q29tcG9uZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudENvbXBvbmVudHMucHVzaChuZXdDb21wb25lbnQpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsY3VsYXRlIG9yZGVyIGluZGljZXNcbiAgICBjdXJyZW50Q29tcG9uZW50cy5mb3JFYWNoKChjLCBpZHgpID0+IChjLm9yZGVyID0gaWR4ICsgMSkpO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG5cbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudChuZXdDb21wb25lbnQuaWQpO1xuICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNvbXBvbmVudCBieSBpdHMgSUQuXG4gICAqL1xuICByZW1vdmVDb21wb25lbnQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maWx0ZXIoKGMpID0+IGMuaWQgIT09IGlkKTtcbiAgICBjdXJyZW50Q29tcG9uZW50cy5mb3JFYWNoKChjLCBpZHgpID0+IChjLm9yZGVyID0gaWR4ICsgMSkpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCgpID09PSBpZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEdXBsaWNhdGVzIGFuIGV4aXN0aW5nIGNvbXBvbmVudC5cbiAgICovXG4gIGR1cGxpY2F0ZUNvbXBvbmVudChpZDogc3RyaW5nKTogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmlkID09PSBpZCk7XG4gICAgaWYgKCFleGlzdGluZykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBkdXBsaWNhdGVkOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uID0ge1xuICAgICAgLi4uSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleGlzdGluZykpLFxuICAgICAgaWQ6IGdlbmVyYXRlSWQoZXhpc3RpbmcudHlwZSksXG4gICAgICBrZXk6IGV4aXN0aW5nLmtleSA/IGAke2V4aXN0aW5nLmtleX1fY29weWAgOiB1bmRlZmluZWQsXG4gICAgICBsYWJlbDogZXhpc3RpbmcubGFiZWwgPyBgJHtleGlzdGluZy5sYWJlbH0gKENvcHkpYCA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSBbLi4udGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50c10uc29ydChcbiAgICAgIChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApXG4gICAgKTtcbiAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRDb21wb25lbnRzLmZpbmRJbmRleCgoYykgPT4gYy5pZCA9PT0gaWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLnNwbGljZShpbmRleCArIDEsIDAsIGR1cGxpY2F0ZWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcblxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KGR1cGxpY2F0ZWQuaWQpO1xuICAgIHJldHVybiBkdXBsaWNhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgY29tcG9uZW50IGZyb20gcHJldmlvdXMgaW5kZXggdG8gY3VycmVudCBpbmRleCAoZS5nLiBmcm9tIENESyBkcmFnIGRyb3ApLlxuICAgKi9cbiAgbW92ZUNvbXBvbmVudChwcmV2aW91c0luZGV4OiBudW1iZXIsIGN1cnJlbnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHByZXZpb3VzSW5kZXggPT09IGN1cnJlbnRJbmRleCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSBbLi4udGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50c10uc29ydChcbiAgICAgIChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApXG4gICAgKTtcbiAgICBpZiAocHJldmlvdXNJbmRleCA8IDAgfHwgcHJldmlvdXNJbmRleCA+PSBjdXJyZW50Q29tcG9uZW50cy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjdXJyZW50SW5kZXgsIGN1cnJlbnRDb21wb25lbnRzLmxlbmd0aCAtIDEpKTtcblxuICAgIGNvbnN0IFttb3ZlZF0gPSBjdXJyZW50Q29tcG9uZW50cy5zcGxpY2UocHJldmlvdXNJbmRleCwgMSk7XG4gICAgY3VycmVudENvbXBvbmVudHMuc3BsaWNlKHRhcmdldElkeCwgMCwgbW92ZWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHBhcnRpYWwgcHJvcGVydGllcyBvZiBhIGNvbXBvbmVudC5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudChpZDogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+KTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLm1hcCgoYykgPT4ge1xuICAgICAgaWYgKGMuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmMsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHNpbmdsZSBjb21wb25lbnQgcHJvcGVydHkgdmFsdWUgd2l0aGluIGBwcm9wZXJ0aWVzYC5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudFByb3BlcnR5KGlkOiBzdHJpbmcsIHByb3BLZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIC4uLihjLnByb3BlcnRpZXMgPz8ge30pLFxuICAgICAgICAgICAgW3Byb3BLZXldOiB2YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGxheW91dCBwcm9wZXJ0aWVzIGZvciBhIGNvbXBvbmVudCAoZS5nLiBjb2x1bW5TcGFuKS5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudExheW91dChpZDogc3RyaW5nLCBsYXlvdXQ6IFBhcnRpYWw8Q29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbj4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gaWQpIHtcbiAgICAgICAgY29uc3QgbmV4dExheW91dCA9IHtcbiAgICAgICAgICAuLi4oYy5sYXlvdXQgPz8ge30pLFxuICAgICAgICAgIC4uLmxheW91dCxcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobGF5b3V0KSBhcyAoa2V5b2YgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbilbXSkge1xuICAgICAgICAgIGlmIChsYXlvdXRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgbmV4dExheW91dFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgbGF5b3V0OiBuZXh0TGF5b3V0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHJlcG9ydC1sZXZlbCBzZXR0aW5ncyAobmFtZSwgZGVzY3JpcHRpb24sIGxheW91dCkuXG4gICAqL1xuICB1cGRhdGVSZXBvcnRTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxSZXBvcnREZWZpbml0aW9uPik6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgLi4uc2V0dGluZ3MsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgZ3JpZCBkZWZpbml0aW9uIHNldHRpbmdzLlxuICAgKi9cbiAgdXBkYXRlR3JpZFNldHRpbmdzKGdyaWQ6IFJlcG9ydEdyaWREZWZpbml0aW9uIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogeyBza2lwSGlzdG9yeT86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5za2lwSGlzdG9yeSkge1xuICAgICAgdGhpcy5kZWZpbml0aW9uLnVwZGF0ZSgoZGVmKSA9PiAoe1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIGdyaWQsXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmlzRGlydHkuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGdyaWQsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgb3IgdXBkYXRlcyB0aGUgcHJpbWFyeSBkYXRhIHNvdXJjZSBmb3IgdGhlIHJlcG9ydCdzIHJlc3VsdCBncmlkLlxuICAgKi9cbiAgc2V0R3JpZERhdGFTb3VyY2UoZHM6IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU291cmNlcyA9IGRlZi5kYXRhU291cmNlcyA/PyBbXTtcbiAgICAgIGNvbnN0IGlkeCA9IGV4aXN0aW5nU291cmNlcy5maW5kSW5kZXgoKHMpID0+IHMuaWQgPT09IGRzLmlkKTtcbiAgICAgIGxldCBuZXh0U291cmNlczogUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb25bXTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICBuZXh0U291cmNlcyA9IFsuLi5leGlzdGluZ1NvdXJjZXNdO1xuICAgICAgICBuZXh0U291cmNlc1tpZHhdID0gZHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U291cmNlcyA9IFtkcywgLi4uZXhpc3RpbmdTb3VyY2VzXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZEdyaWQ6IFJlcG9ydEdyaWREZWZpbml0aW9uID0ge1xuICAgICAgICAuLi4oZGVmLmdyaWQgPz8ge1xuICAgICAgICAgIGRhdGFTb3VyY2VJZDogZHMuaWQsXG4gICAgICAgICAgY29sdW1uczogW10sXG4gICAgICAgICAgb3B0aW9uczogeyBwYWdpbmF0aW9uOiB0cnVlLCBwYWdlU2l6ZTogMjUsIHNob3dSb3dOdW1iZXJzOiB0cnVlLCBzaG93Rm9vdGVyOiB0cnVlIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBkYXRhU291cmNlSWQ6IGRzLmlkLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICBkYXRhU291cmNlczogbmV4dFNvdXJjZXMsXG4gICAgICAgIGdyaWQ6IHVwZGF0ZWRHcmlkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwYXJhbWV0ZXIgbWFwcGluZ3MgZm9yIHRoZSBwcmltYXJ5IGdyaWQgZGF0YSBzb3VyY2UuXG4gICAqL1xuICB1cGRhdGVHcmlkRGF0YVNvdXJjZVBhcmFtZXRlcnMobWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+IHtcbiAgICAgIGNvbnN0IGdyaWREc0lkID0gZGVmLmdyaWQ/LmRhdGFTb3VyY2VJZDtcbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBkZWYuZGF0YVNvdXJjZXMgPz8gW107XG4gICAgICBjb25zdCB0YXJnZXRJZHggPSBzb3VyY2VzLmZpbmRJbmRleCgocykgPT4gcy5pZCA9PT0gZ3JpZERzSWQgfHwgcy5uYW1lID09PSBncmlkRHNJZCk7XG5cbiAgICAgIGlmICh0YXJnZXRJZHggPj0gMCkge1xuICAgICAgICBjb25zdCBuZXh0U291cmNlcyA9IFsuLi5zb3VyY2VzXTtcbiAgICAgICAgbmV4dFNvdXJjZXNbdGFyZ2V0SWR4XSA9IHtcbiAgICAgICAgICAuLi5uZXh0U291cmNlc1t0YXJnZXRJZHhdLFxuICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiBtYXBwaW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZWYsXG4gICAgICAgICAgZGF0YVNvdXJjZXM6IG5leHRTb3VyY2VzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgdG8gdGhlIHByZXZpb3VzIHN0YXRlIGluIGhpc3RvcnkuXG4gICAqL1xuICB1bmRvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5VbmRvKCkpIHJldHVybjtcbiAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgLSAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXdJbmRleCk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlzdG9yeSgpW25ld0luZGV4XSkpIGFzIFJlcG9ydERlZmluaXRpb247XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChyZXN0b3JlZCk7XG4gICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlcyB0byB0aGUgbmV4dCBzdGF0ZSBpbiBoaXN0b3J5LlxuICAgKi9cbiAgcmVkbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVkbygpKSByZXR1cm47XG4gICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmhpc3RvcnlJbmRleCgpICsgMTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQobmV3SW5kZXgpO1xuICAgIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpc3RvcnkoKVtuZXdJbmRleF0pKSBhcyBSZXBvcnREZWZpbml0aW9uO1xuICAgIHRoaXMuZGVmaW5pdGlvbi5zZXQocmVzdG9yZWQpO1xuICAgIHRoaXMuaXNEaXJ0eS5zZXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBzdGF0ZSBhcyBzYXZlZC5cbiAgICovXG4gIG1hcmtTYXZlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlydHkuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFuIGltbXV0YWJsZSBzdGF0ZSBjaGFuZ2UgYW5kIHB1c2hlcyB0byBoaXN0b3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBtdXRhdGVEZWZpbml0aW9uKHVwZGF0ZXI6IChjdXJyZW50OiBSZXBvcnREZWZpbml0aW9uKSA9PiBSZXBvcnREZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHVwZGF0ZXIodGhpcy5kZWZpbml0aW9uKCkpO1xuICAgIHRoaXMuZGVmaW5pdGlvbi5zZXQobmV4dCk7XG4gICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgICB0aGlzLnB1c2hIaXN0b3J5KG5leHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXNoSGlzdG9yeShkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50SGlzdCA9IHRoaXMuaGlzdG9yeSgpLnNsaWNlKDAsIHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxKTtcbiAgICBjdXJyZW50SGlzdC5wdXNoKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmKSkpO1xuICAgIGlmIChjdXJyZW50SGlzdC5sZW5ndGggPiBNQVhfSElTVE9SWSkge1xuICAgICAgY3VycmVudEhpc3Quc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy5oaXN0b3J5LnNldChjdXJyZW50SGlzdCk7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KGN1cnJlbnRIaXN0Lmxlbmd0aCAtIDEpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,207 @@
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, inject, input, output, signal, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import { ReportStoreService } from '../persistence/services/report-store.service';
6
+ import { DesignerComponent } from '../designer/designer.component';
7
+ import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ /**
11
+ * `<bways-report-builder>`
12
+ *
13
+ * Drop-in, single-tag visual report designer component for host applications.
14
+ *
15
+ * Wraps the full visual builder with:
16
+ * - Direct width and height inputs (`width="100%" height="calc(100vh - 64px)"`)
17
+ * - Built-in report selector dropdown and "+ New Report" button
18
+ * - Automatic persistence and menu synchronization
19
+ *
20
+ * Usage:
21
+ * ```html
22
+ * <!-- Drop anywhere in your admin or report management page -->
23
+ * <bways-report-builder width="100%" height="calc(100vh - 64px)" />
24
+ * ```
25
+ */
26
+ export class BwaysReportBuilderComponent {
27
+ store = inject(ReportStoreService);
28
+ destroyRef = inject(DestroyRef);
29
+ /** Width of the builder container. Defaults to '100%'. */
30
+ width = input('100%');
31
+ /** Height of the builder container. Defaults to '100%'. */
32
+ height = input('100%');
33
+ /** Initial report ID to open in the designer. */
34
+ reportId = input(undefined);
35
+ /** Whether to show the top switcher bar with report selector and "+ New" button. */
36
+ showReportList = input(true);
37
+ /** Emitted when a report definition is saved. */
38
+ saved = output();
39
+ /** Emitted when the report definition changes. */
40
+ definitionChange = output();
41
+ /** Emitted when a report is selected from the list. */
42
+ reportSelect = output();
43
+ activeReportId = signal(null);
44
+ reportsList = signal([]);
45
+ saveStatus = signal(null);
46
+ designerKey = signal(1);
47
+ ngOnInit() {
48
+ if (this.reportId()) {
49
+ this.activeReportId.set(this.reportId());
50
+ }
51
+ this.refreshReports();
52
+ }
53
+ onSelectReport(id) {
54
+ const target = id ? id : null;
55
+ this.activeReportId.set(target);
56
+ this.designerKey.update((k) => k + 1);
57
+ if (target) {
58
+ this.reportSelect.emit(target);
59
+ }
60
+ }
61
+ createNewReport() {
62
+ this.activeReportId.set(null);
63
+ this.designerKey.update((k) => k + 1);
64
+ }
65
+ onReportSaved(def) {
66
+ this.activeReportId.set(def.id);
67
+ this.saveStatus.set(`Saved "${def.name}"`);
68
+ this.saved.emit(def);
69
+ // Refresh store summaries so navigation reflects changes immediately
70
+ this.refreshReports();
71
+ setTimeout(() => {
72
+ this.saveStatus.set(null);
73
+ }, 3500);
74
+ }
75
+ refreshReports() {
76
+ this.store
77
+ .loadSummaries()
78
+ .pipe(takeUntilDestroyed(this.destroyRef))
79
+ .subscribe({
80
+ next: (list) => this.reportsList.set(list),
81
+ error: (err) => console.warn('[bways-report] Failed to load reports list:', err),
82
+ });
83
+ }
84
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
85
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BwaysReportBuilderComponent, isStandalone: true, selector: "bways-report-builder", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, showReportList: { classPropertyName: "showReportList", publicName: "showReportList", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", definitionChange: "definitionChange", reportSelect: "reportSelect" }, ngImport: i0, template: `
86
+ <div
87
+ class="rpt-builder-container"
88
+ [style.width]="width()"
89
+ [style.height]="height()"
90
+ >
91
+ @if (showReportList()) {
92
+ <div class="rpt-builder-header">
93
+ <div class="rpt-header-left">
94
+ <span class="rpt-header-label">Report:</span>
95
+ <div class="rpt-select-wrapper">
96
+ <select
97
+ class="rpt-report-select"
98
+ [ngModel]="activeReportId() ?? ''"
99
+ (ngModelChange)="onSelectReport($event)"
100
+ >
101
+ <option value="">-- New Report (unsaved) --</option>
102
+ @for (item of reportsList(); track item.id) {
103
+ <option [value]="item.id">
104
+ {{ item.name }} {{ item.category ? '(' + item.category + ')' : '' }}
105
+ </option>
106
+ }
107
+ </select>
108
+ <rpt-icon name="chevron-down" [size]="12" class="rpt-select-arrow" />
109
+ </div>
110
+
111
+ <button
112
+ type="button"
113
+ class="rpt-btn-new-report"
114
+ (click)="createNewReport()"
115
+ title="Create a new blank report"
116
+ >
117
+ <rpt-icon name="plus" [size]="14" />
118
+ <span>New</span>
119
+ </button>
120
+ </div>
121
+
122
+ <div class="rpt-header-right">
123
+ @if (saveStatus()) {
124
+ <span class="rpt-save-status">
125
+ <rpt-icon name="check" [size]="13" />
126
+ {{ saveStatus() }}
127
+ </span>
128
+ }
129
+ </div>
130
+ </div>
131
+ }
132
+
133
+ <div class="rpt-builder-designer-area">
134
+ @if (designerKey()) {
135
+ <rpt-designer
136
+ [reportId]="activeReportId() ?? undefined"
137
+ (save)="onReportSaved($event)"
138
+ (definitionChange)="definitionChange.emit($event)"
139
+ />
140
+ }
141
+ </div>
142
+ </div>
143
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif)}.rpt-builder-container{display:flex;flex-direction:column;position:relative;overflow:hidden;background:#f8fafc;box-sizing:border-box}.rpt-builder-header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#fff;border-bottom:1px solid #e2e8f0;z-index:10;flex-shrink:0}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-header-label{font-size:.8125rem;font-weight:600;color:#475569}.rpt-select-wrapper{position:relative;display:inline-flex;align-items:center}.rpt-report-select{appearance:none;-webkit-appearance:none;padding:5px 28px 5px 12px;font-size:.8125rem;font-weight:500;color:#0f172a;background:#f8fafc;border:1px solid #cbd5e1;border-radius:6px;outline:none;cursor:pointer;min-width:220px;transition:all .15s ease}.rpt-report-select:focus{background:#fff;border-color:#2563eb;box-shadow:0 0 0 2px #2563eb26}.rpt-select-arrow{position:absolute;right:10px;pointer-events:none;color:#64748b}.rpt-btn-new-report{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;border-radius:6px;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .15s ease}.rpt-btn-new-report:hover{background:#dbeafe;border-color:#93c5fd}.rpt-header-right{display:flex;align-items:center;gap:12px}.rpt-save-status{display:inline-flex;align-items:center;gap:5px;font-size:.75rem;font-weight:600;color:#16a34a;background:#f0fdf4;padding:3px 8px;border-radius:9999px;border:1px solid #bbf7d0;animation:rpt-status-fade .2s ease}@keyframes rpt-status-fade{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.rpt-builder-designer-area{flex:1;width:100%;height:100%;overflow:hidden;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DesignerComponent, selector: "rpt-designer", inputs: ["reportId", "initialReport"], outputs: ["save", "definitionChange"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
144
+ }
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportBuilderComponent, decorators: [{
146
+ type: Component,
147
+ args: [{ selector: 'bways-report-builder', standalone: true, imports: [CommonModule, FormsModule, DesignerComponent, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
148
+ <div
149
+ class="rpt-builder-container"
150
+ [style.width]="width()"
151
+ [style.height]="height()"
152
+ >
153
+ @if (showReportList()) {
154
+ <div class="rpt-builder-header">
155
+ <div class="rpt-header-left">
156
+ <span class="rpt-header-label">Report:</span>
157
+ <div class="rpt-select-wrapper">
158
+ <select
159
+ class="rpt-report-select"
160
+ [ngModel]="activeReportId() ?? ''"
161
+ (ngModelChange)="onSelectReport($event)"
162
+ >
163
+ <option value="">-- New Report (unsaved) --</option>
164
+ @for (item of reportsList(); track item.id) {
165
+ <option [value]="item.id">
166
+ {{ item.name }} {{ item.category ? '(' + item.category + ')' : '' }}
167
+ </option>
168
+ }
169
+ </select>
170
+ <rpt-icon name="chevron-down" [size]="12" class="rpt-select-arrow" />
171
+ </div>
172
+
173
+ <button
174
+ type="button"
175
+ class="rpt-btn-new-report"
176
+ (click)="createNewReport()"
177
+ title="Create a new blank report"
178
+ >
179
+ <rpt-icon name="plus" [size]="14" />
180
+ <span>New</span>
181
+ </button>
182
+ </div>
183
+
184
+ <div class="rpt-header-right">
185
+ @if (saveStatus()) {
186
+ <span class="rpt-save-status">
187
+ <rpt-icon name="check" [size]="13" />
188
+ {{ saveStatus() }}
189
+ </span>
190
+ }
191
+ </div>
192
+ </div>
193
+ }
194
+
195
+ <div class="rpt-builder-designer-area">
196
+ @if (designerKey()) {
197
+ <rpt-designer
198
+ [reportId]="activeReportId() ?? undefined"
199
+ (save)="onReportSaved($event)"
200
+ (definitionChange)="definitionChange.emit($event)"
201
+ />
202
+ }
203
+ </div>
204
+ </div>
205
+ `, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif)}.rpt-builder-container{display:flex;flex-direction:column;position:relative;overflow:hidden;background:#f8fafc;box-sizing:border-box}.rpt-builder-header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#fff;border-bottom:1px solid #e2e8f0;z-index:10;flex-shrink:0}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-header-label{font-size:.8125rem;font-weight:600;color:#475569}.rpt-select-wrapper{position:relative;display:inline-flex;align-items:center}.rpt-report-select{appearance:none;-webkit-appearance:none;padding:5px 28px 5px 12px;font-size:.8125rem;font-weight:500;color:#0f172a;background:#f8fafc;border:1px solid #cbd5e1;border-radius:6px;outline:none;cursor:pointer;min-width:220px;transition:all .15s ease}.rpt-report-select:focus{background:#fff;border-color:#2563eb;box-shadow:0 0 0 2px #2563eb26}.rpt-select-arrow{position:absolute;right:10px;pointer-events:none;color:#64748b}.rpt-btn-new-report{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;border-radius:6px;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .15s ease}.rpt-btn-new-report:hover{background:#dbeafe;border-color:#93c5fd}.rpt-header-right{display:flex;align-items:center;gap:12px}.rpt-save-status{display:inline-flex;align-items:center;gap:5px;font-size:.75rem;font-weight:600;color:#16a34a;background:#f0fdf4;padding:3px 8px;border-radius:9999px;border:1px solid #bbf7d0;animation:rpt-status-fade .2s ease}@keyframes rpt-status-fade{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.rpt-builder-designer-area{flex:1;width:100%;height:100%;overflow:hidden;position:relative}\n"] }]
206
+ }] });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYndheXMtcmVwb3J0LWJ1aWxkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZW1iZWQvYndheXMtcmVwb3J0LWJ1aWxkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7O0FBRXZGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQW1NSCxNQUFNLE9BQU8sMkJBQTJCO0lBQ3JCLEtBQUssR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNuQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWpELDBEQUEwRDtJQUNqRCxLQUFLLEdBQUcsS0FBSyxDQUFTLE1BQU0sQ0FBQyxDQUFDO0lBRXZDLDJEQUEyRDtJQUNsRCxNQUFNLEdBQUcsS0FBSyxDQUFTLE1BQU0sQ0FBQyxDQUFDO0lBRXhDLGlEQUFpRDtJQUN4QyxRQUFRLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUV6RCxvRkFBb0Y7SUFDM0UsY0FBYyxHQUFHLEtBQUssQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUUvQyxpREFBaUQ7SUFDeEMsS0FBSyxHQUFHLE1BQU0sRUFBb0IsQ0FBQztJQUU1QyxrREFBa0Q7SUFDekMsZ0JBQWdCLEdBQUcsTUFBTSxFQUFvQixDQUFDO0lBRXZELHVEQUF1RDtJQUM5QyxZQUFZLEdBQUcsTUFBTSxFQUFVLENBQUM7SUFFaEMsY0FBYyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDN0MsV0FBVyxHQUFHLE1BQU0sQ0FBa0IsRUFBRSxDQUFDLENBQUM7SUFDMUMsVUFBVSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDekMsV0FBVyxHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUV6QyxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFHLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxjQUFjLENBQUMsRUFBVTtRQUN2QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFxQjtRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyQixxRUFBcUU7UUFDckUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsS0FBSzthQUNQLGFBQWEsRUFBRTthQUNmLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDMUMsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsQ0FBQztTQUNqRixDQUFDLENBQUM7SUFDUCxDQUFDO3dHQXpFVSwyQkFBMkI7NEZBQTNCLDJCQUEyQixvc0JBN0w1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBEVCxxN0RBNURTLFlBQVksOEJBQUUsV0FBVywwdkJBQUUsaUJBQWlCLHVJQUFFLGdCQUFnQjs7NEZBK0w3RCwyQkFBMkI7a0JBbE12QyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLG1CQUN4RCx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25Jbml0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uLCBSZXBvcnRTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0U3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2Uvc2VydmljZXMvcmVwb3J0LXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVzaWduZXJDb21wb25lbnQgfSBmcm9tICcuLi9kZXNpZ25lci9kZXNpZ25lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5cbi8qKlxuICogYDxid2F5cy1yZXBvcnQtYnVpbGRlcj5gXG4gKlxuICogRHJvcC1pbiwgc2luZ2xlLXRhZyB2aXN1YWwgcmVwb3J0IGRlc2lnbmVyIGNvbXBvbmVudCBmb3IgaG9zdCBhcHBsaWNhdGlvbnMuXG4gKlxuICogV3JhcHMgdGhlIGZ1bGwgdmlzdWFsIGJ1aWxkZXIgd2l0aDpcbiAqIC0gRGlyZWN0IHdpZHRoIGFuZCBoZWlnaHQgaW5wdXRzIChgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiY2FsYygxMDB2aCAtIDY0cHgpXCJgKVxuICogLSBCdWlsdC1pbiByZXBvcnQgc2VsZWN0b3IgZHJvcGRvd24gYW5kIFwiKyBOZXcgUmVwb3J0XCIgYnV0dG9uXG4gKiAtIEF1dG9tYXRpYyBwZXJzaXN0ZW5jZSBhbmQgbWVudSBzeW5jaHJvbml6YXRpb25cbiAqXG4gKiBVc2FnZTpcbiAqIGBgYGh0bWxcbiAqIDwhLS0gRHJvcCBhbnl3aGVyZSBpbiB5b3VyIGFkbWluIG9yIHJlcG9ydCBtYW5hZ2VtZW50IHBhZ2UgLS0+XG4gKiA8YndheXMtcmVwb3J0LWJ1aWxkZXIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiY2FsYygxMDB2aCAtIDY0cHgpXCIgLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdid2F5cy1yZXBvcnQtYnVpbGRlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBEZXNpZ25lckNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicnB0LWJ1aWxkZXItY29udGFpbmVyXCJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aCgpXCJcbiAgICAgIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0KClcIlxuICAgID5cbiAgICAgIEBpZiAoc2hvd1JlcG9ydExpc3QoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWJ1aWxkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1oZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtaGVhZGVyLWxhYmVsXCI+UmVwb3J0Ojwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LXJlcG9ydC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImFjdGl2ZVJlcG9ydElkKCkgPz8gJydcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VsZWN0UmVwb3J0KCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5ldyBSZXBvcnQgKHVuc2F2ZWQpIC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiByZXBvcnRzTGlzdCgpOyB0cmFjayBpdGVtLmlkKSB7XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJpdGVtLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSB9fSB7eyBpdGVtLmNhdGVnb3J5ID8gJygnICsgaXRlbS5jYXRlZ29yeSArICcpJyA6ICcnIH19XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEyXCIgY2xhc3M9XCJycHQtc2VsZWN0LWFycm93XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInJwdC1idG4tbmV3LXJlcG9ydFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVOZXdSZXBvcnQoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ3JlYXRlIGEgbmV3IGJsYW5rIHJlcG9ydFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicGx1c1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+TmV3PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgQGlmIChzYXZlU3RhdHVzKCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtc2F2ZS1zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIHt7IHNhdmVTdGF0dXMoKSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2IGNsYXNzPVwicnB0LWJ1aWxkZXItZGVzaWduZXItYXJlYVwiPlxuICAgICAgICBAaWYgKGRlc2lnbmVyS2V5KCkpIHtcbiAgICAgICAgICA8cnB0LWRlc2lnbmVyXG4gICAgICAgICAgICBbcmVwb3J0SWRdPVwiYWN0aXZlUmVwb3J0SWQoKSA/PyB1bmRlZmluZWRcIlxuICAgICAgICAgICAgKHNhdmUpPVwib25SZXBvcnRTYXZlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChkZWZpbml0aW9uQ2hhbmdlKT1cImRlZmluaXRpb25DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIFJvYm90bywgc2Fucy1zZXJpZik7XG4gICAgfVxuXG4gICAgLnJwdC1idWlsZGVyLWNvbnRhaW5lciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LWJ1aWxkZXItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtaGVhZGVyLWxlZnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDEwcHg7XG4gICAgfVxuXG4gICAgLnJwdC1oZWFkZXItbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgfVxuXG4gICAgLnJwdC1zZWxlY3Qtd3JhcHBlciB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLnJwdC1yZXBvcnQtc2VsZWN0IHtcbiAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICBwYWRkaW5nOiA1cHggMjhweCA1cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgbWluLXdpZHRoOiAyMjBweDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtcmVwb3J0LXNlbGVjdDpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMjU2M2ViO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMTUpO1xuICAgIH1cblxuICAgIC5ycHQtc2VsZWN0LWFycm93IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiAxMHB4O1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1uZXctcmVwb3J0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgcGFkZGluZzogNXB4IDEycHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIGNvbG9yOiAjMjU2M2ViO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tbmV3LXJlcG9ydDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTNjNWZkO1xuICAgIH1cblxuICAgIC5ycHQtaGVhZGVyLXJpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgIH1cblxuICAgIC5ycHQtc2F2ZS1zdGF0dXMge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxNmEzNGE7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjBmZGY0O1xuICAgICAgcGFkZGluZzogM3B4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgICBhbmltYXRpb246IHJwdC1zdGF0dXMtZmFkZSAyMDBtcyBlYXNlO1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LXN0YXR1cy1mYWRlIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7IH1cbiAgICAgIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XG4gICAgfVxuXG4gICAgLnJwdC1idWlsZGVyLWRlc2lnbmVyLWFyZWEge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBCd2F5c1JlcG9ydEJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gaW5qZWN0KFJlcG9ydFN0b3JlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvKiogV2lkdGggb2YgdGhlIGJ1aWxkZXIgY29udGFpbmVyLiBEZWZhdWx0cyB0byAnMTAwJScuICovXG4gIHJlYWRvbmx5IHdpZHRoID0gaW5wdXQ8c3RyaW5nPignMTAwJScpO1xuXG4gIC8qKiBIZWlnaHQgb2YgdGhlIGJ1aWxkZXIgY29udGFpbmVyLiBEZWZhdWx0cyB0byAnMTAwJScuICovXG4gIHJlYWRvbmx5IGhlaWdodCA9IGlucHV0PHN0cmluZz4oJzEwMCUnKTtcblxuICAvKiogSW5pdGlhbCByZXBvcnQgSUQgdG8gb3BlbiBpbiB0aGUgZGVzaWduZXIuICovXG4gIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRvcCBzd2l0Y2hlciBiYXIgd2l0aCByZXBvcnQgc2VsZWN0b3IgYW5kIFwiKyBOZXdcIiBidXR0b24uICovXG4gIHJlYWRvbmx5IHNob3dSZXBvcnRMaXN0ID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHJlcG9ydCBkZWZpbml0aW9uIGlzIHNhdmVkLiAqL1xuICByZWFkb25seSBzYXZlZCA9IG91dHB1dDxSZXBvcnREZWZpbml0aW9uPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHJlcG9ydCBkZWZpbml0aW9uIGNoYW5nZXMuICovXG4gIHJlYWRvbmx5IGRlZmluaXRpb25DaGFuZ2UgPSBvdXRwdXQ8UmVwb3J0RGVmaW5pdGlvbj4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgcmVwb3J0IGlzIHNlbGVjdGVkIGZyb20gdGhlIGxpc3QuICovXG4gIHJlYWRvbmx5IHJlcG9ydFNlbGVjdCA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgcmVhZG9ubHkgYWN0aXZlUmVwb3J0SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJlcG9ydHNMaXN0ID0gc2lnbmFsPFJlcG9ydFN1bW1hcnlbXT4oW10pO1xuICByZWFkb25seSBzYXZlU3RhdHVzID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBkZXNpZ25lcktleSA9IHNpZ25hbDxudW1iZXI+KDEpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlcG9ydElkKCkpIHtcbiAgICAgIHRoaXMuYWN0aXZlUmVwb3J0SWQuc2V0KHRoaXMucmVwb3J0SWQoKSEpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFJlcG9ydHMoKTtcbiAgfVxuXG4gIG9uU2VsZWN0UmVwb3J0KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBpZCA/IGlkIDogbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldCh0YXJnZXQpO1xuICAgIHRoaXMuZGVzaWduZXJLZXkudXBkYXRlKChrKSA9PiBrICsgMSk7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgdGhpcy5yZXBvcnRTZWxlY3QuZW1pdCh0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZU5ld1JlcG9ydCgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlc2lnbmVyS2V5LnVwZGF0ZSgoaykgPT4gayArIDEpO1xuICB9XG5cbiAgb25SZXBvcnRTYXZlZChkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChkZWYuaWQpO1xuICAgIHRoaXMuc2F2ZVN0YXR1cy5zZXQoYFNhdmVkIFwiJHtkZWYubmFtZX1cImApO1xuICAgIHRoaXMuc2F2ZWQuZW1pdChkZWYpO1xuXG4gICAgLy8gUmVmcmVzaCBzdG9yZSBzdW1tYXJpZXMgc28gbmF2aWdhdGlvbiByZWZsZWN0cyBjaGFuZ2VzIGltbWVkaWF0ZWx5XG4gICAgdGhpcy5yZWZyZXNoUmVwb3J0cygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNhdmVTdGF0dXMuc2V0KG51bGwpO1xuICAgIH0sIDM1MDApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoUmVwb3J0cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlXG4gICAgICAubG9hZFN1bW1hcmllcygpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAobGlzdCkgPT4gdGhpcy5yZXBvcnRzTGlzdC5zZXQobGlzdCksXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tid2F5cy1yZXBvcnRdIEZhaWxlZCB0byBsb2FkIHJlcG9ydHMgbGlzdDonLCBlcnIpLFxuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==