@loxia/mst-viewer 8.1.3-202512020726 → 8.1.3-202512030346

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 (135) hide show
  1. package/esm2022/generated/openapi/api/api.mjs +23 -0
  2. package/esm2022/generated/openapi/api/appConfigController.service.mjs +140 -0
  3. package/esm2022/generated/openapi/api/appConfigController.serviceInterface.mjs +2 -0
  4. package/esm2022/generated/openapi/api/bewegingController.service.mjs +155 -0
  5. package/esm2022/generated/openapi/api/bewegingController.serviceInterface.mjs +2 -0
  6. package/esm2022/generated/openapi/api/class0BuildProperties.service.mjs +140 -0
  7. package/esm2022/generated/openapi/api/class0BuildProperties.serviceInterface.mjs +2 -0
  8. package/esm2022/generated/openapi/api/connectorController.service.mjs +146 -0
  9. package/esm2022/generated/openapi/api/connectorController.serviceInterface.mjs +2 -0
  10. package/esm2022/generated/openapi/api/logController.service.mjs +150 -0
  11. package/esm2022/generated/openapi/api/logController.serviceInterface.mjs +2 -0
  12. package/esm2022/generated/openapi/api/p21Controller.service.mjs +236 -0
  13. package/esm2022/generated/openapi/api/p21Controller.serviceInterface.mjs +2 -0
  14. package/esm2022/generated/openapi/api/sbController.service.mjs +202 -0
  15. package/esm2022/generated/openapi/api/sbController.serviceInterface.mjs +2 -0
  16. package/esm2022/generated/openapi/api.module.mjs +40 -0
  17. package/esm2022/generated/openapi/configuration.mjs +99 -0
  18. package/esm2022/generated/openapi/encoder.mjs +19 -0
  19. package/esm2022/generated/openapi/index.mjs +7 -0
  20. package/esm2022/generated/openapi/model/actieDto.mjs +13 -0
  21. package/esm2022/generated/openapi/model/algemeneRitDto.mjs +13 -0
  22. package/esm2022/generated/openapi/model/bewegingDto.mjs +2 -0
  23. package/esm2022/generated/openapi/model/frontendKeycloakConfig.mjs +13 -0
  24. package/esm2022/generated/openapi/model/frontendProperties.mjs +2 -0
  25. package/esm2022/generated/openapi/model/logDto.mjs +2 -0
  26. package/esm2022/generated/openapi/model/models.mjs +10 -0
  27. package/esm2022/generated/openapi/model/ritRequestDto.mjs +2 -0
  28. package/esm2022/generated/openapi/model/signaleringsbeeldDto.mjs +13 -0
  29. package/esm2022/generated/openapi/model/signaleringsbeeldRequestDto.mjs +13 -0
  30. package/esm2022/generated/openapi/param.mjs +2 -0
  31. package/esm2022/generated/openapi/variables.mjs +9 -0
  32. package/esm2022/generated.version.mjs +2 -0
  33. package/esm2022/lib/atomic-components/message/index.mjs +4 -0
  34. package/esm2022/lib/atomic-components/message/message.component.mjs +34 -0
  35. package/esm2022/lib/atomic-components/message/message.mjs +8 -0
  36. package/esm2022/lib/atomic-components/message/severity.enum.mjs +9 -0
  37. package/esm2022/lib/atomic-components/messages/messages.component.mjs +20 -0
  38. package/esm2022/lib/atomic-components/overlay/overlay.component.mjs +11 -0
  39. package/esm2022/lib/atomic-components/progress-indicator/progress-indicator.component.mjs +11 -0
  40. package/esm2022/lib/atomic-components/progress-indicator/progress-indicator.entity.mjs +8 -0
  41. package/esm2022/lib/atomic-components/services/messages.service.mjs +27 -0
  42. package/esm2022/lib/components/carousel-controls/carousel-controls.component.mjs +40 -0
  43. package/esm2022/lib/components/mstviewer/mstviewer.component.mjs +110 -0
  44. package/esm2022/lib/components/ritdelen-lijst/ritdelen-lijst.component.mjs +267 -0
  45. package/esm2022/lib/components/ritdelen-view/ritdelen-view.component.mjs +103 -0
  46. package/esm2022/lib/components/rpe/rpe.component.mjs +33 -0
  47. package/esm2022/lib/components/svg-visualisatie/svg-visualisatie.component.mjs +273 -0
  48. package/esm2022/lib/components/viewer-controls/viewer-controls.component.mjs +52 -0
  49. package/esm2022/lib/model/alternatief-rit-deel.mjs +7 -0
  50. package/esm2022/lib/model/km-range.mjs +39 -0
  51. package/esm2022/lib/model/melding-event.mjs +7 -0
  52. package/esm2022/lib/model/nieuwe-route.mjs +10 -0
  53. package/esm2022/lib/model/ongeplande-actie.mjs +7 -0
  54. package/esm2022/lib/model/rijwegplan-rijweg-dwang-combinatie.mjs +24 -0
  55. package/esm2022/lib/model/ritdeel.mjs +205 -0
  56. package/esm2022/lib/model/sein-op-ritdeel.mjs +7 -0
  57. package/esm2022/lib/model/wissel-kant-code.mjs +7 -0
  58. package/esm2022/lib/mst-viewer.module.mjs +143 -0
  59. package/esm2022/lib/optimo.mjs +9 -0
  60. package/esm2022/lib/resources/mstlogging.resource.mjs +25 -0
  61. package/esm2022/lib/resources/signaleringsbeeldinfo.resource.mjs +62 -0
  62. package/esm2022/lib/services/base-rest.service.mjs +26 -0
  63. package/esm2022/lib/services/beweging-utils.service.mjs +139 -0
  64. package/esm2022/lib/services/beweging-verrijker.service.mjs +30 -0
  65. package/esm2022/lib/services/connector.service.mjs +30 -0
  66. package/esm2022/lib/services/debug.service.mjs +59 -0
  67. package/esm2022/lib/services/editor.service.mjs +48 -0
  68. package/esm2022/lib/services/print-beweging.service.mjs +66 -0
  69. package/esm2022/lib/services/rit-lezer.service.mjs +104 -0
  70. package/esm2022/lib/services/signalerings-beeld-manager.service.mjs +92 -0
  71. package/esm2022/lib/services/viewer-control.service.mjs +104 -0
  72. package/esm2022/lib/state/actions/actions.mjs +130 -0
  73. package/esm2022/lib/state/actions/ritdelen.actions.mjs +45 -0
  74. package/esm2022/lib/state/effect/bepaal-ongeplande-acties.effect.mjs +78 -0
  75. package/esm2022/lib/state/effect/bepaal-sb-infos.effect.mjs +67 -0
  76. package/esm2022/lib/state/effect/beweging-invoegen.effect.mjs +73 -0
  77. package/esm2022/lib/state/effect/delete-ongeplande-actie.effect.mjs +39 -0
  78. package/esm2022/lib/state/effect/focus-effect.mjs +36 -0
  79. package/esm2022/lib/state/effect/laad-route-files.effect.mjs +64 -0
  80. package/esm2022/lib/state/effect/laad-signaleringsbeelden.effect.mjs +363 -0
  81. package/esm2022/lib/state/effect/rit-goedkeuren.effect.mjs +23 -0
  82. package/esm2022/lib/state/effect/ritdelen.effect.mjs +112 -0
  83. package/esm2022/lib/state/effect/svg-view.effect.mjs +48 -0
  84. package/esm2022/lib/state/mst-editor-state.mjs +89 -0
  85. package/esm2022/lib/state/reducer/rit-delen.reducer.mjs +62 -0
  86. package/esm2022/lib/util/actie-helper.mjs +437 -0
  87. package/esm2022/lib/util/actie-popover-bepaler.mjs +90 -0
  88. package/esm2022/lib/util/date.service.mjs +17 -0
  89. package/esm2022/lib/util/logging-helper.mjs +58 -0
  90. package/esm2022/lib/util/melding-builder.mjs +13 -0
  91. package/esm2022/lib/util/message-builder.mjs +32 -0
  92. package/esm2022/lib/util/multi-map.mjs +76 -0
  93. package/esm2022/lib/util/utils.mjs +35 -0
  94. package/esm2022/lib/util/zone-util.mjs +32 -0
  95. package/esm2022/loxia-mst-viewer.mjs +5 -0
  96. package/esm2022/public-api.mjs +9 -0
  97. package/esm2022/src/generated/openapi/api/api.mjs +23 -0
  98. package/esm2022/src/generated/openapi/api/appConfigController.service.mjs +140 -0
  99. package/esm2022/src/generated/openapi/api/appConfigController.serviceInterface.mjs +2 -0
  100. package/esm2022/src/generated/openapi/api/bewegingController.service.mjs +155 -0
  101. package/esm2022/src/generated/openapi/api/bewegingController.serviceInterface.mjs +2 -0
  102. package/esm2022/src/generated/openapi/api/class0BuildProperties.service.mjs +140 -0
  103. package/esm2022/src/generated/openapi/api/class0BuildProperties.serviceInterface.mjs +2 -0
  104. package/esm2022/src/generated/openapi/api/connectorController.service.mjs +146 -0
  105. package/esm2022/src/generated/openapi/api/connectorController.serviceInterface.mjs +2 -0
  106. package/esm2022/src/generated/openapi/api/logController.service.mjs +150 -0
  107. package/esm2022/src/generated/openapi/api/logController.serviceInterface.mjs +2 -0
  108. package/esm2022/src/generated/openapi/api/p21Controller.service.mjs +236 -0
  109. package/esm2022/src/generated/openapi/api/p21Controller.serviceInterface.mjs +2 -0
  110. package/esm2022/src/generated/openapi/api/sbController.service.mjs +202 -0
  111. package/esm2022/src/generated/openapi/api/sbController.serviceInterface.mjs +2 -0
  112. package/esm2022/src/generated/openapi/api.module.mjs +40 -0
  113. package/esm2022/src/generated/openapi/configuration.mjs +99 -0
  114. package/esm2022/src/generated/openapi/encoder.mjs +19 -0
  115. package/esm2022/src/generated/openapi/index.mjs +7 -0
  116. package/esm2022/src/generated/openapi/loxia-mst-viewer-src-generated-openapi.mjs +5 -0
  117. package/esm2022/src/generated/openapi/model/actieDto.mjs +13 -0
  118. package/esm2022/src/generated/openapi/model/algemeneRitDto.mjs +13 -0
  119. package/esm2022/src/generated/openapi/model/bewegingDto.mjs +2 -0
  120. package/esm2022/src/generated/openapi/model/frontendKeycloakConfig.mjs +13 -0
  121. package/esm2022/src/generated/openapi/model/frontendProperties.mjs +2 -0
  122. package/esm2022/src/generated/openapi/model/logDto.mjs +2 -0
  123. package/esm2022/src/generated/openapi/model/models.mjs +10 -0
  124. package/esm2022/src/generated/openapi/model/ritRequestDto.mjs +2 -0
  125. package/esm2022/src/generated/openapi/model/signaleringsbeeldDto.mjs +13 -0
  126. package/esm2022/src/generated/openapi/model/signaleringsbeeldRequestDto.mjs +13 -0
  127. package/esm2022/src/generated/openapi/param.mjs +2 -0
  128. package/esm2022/src/generated/openapi/variables.mjs +9 -0
  129. package/fesm2022/loxia-mst-viewer-src-generated-openapi.mjs +25 -25
  130. package/fesm2022/loxia-mst-viewer-src-generated-openapi.mjs.map +1 -1
  131. package/fesm2022/loxia-mst-viewer.mjs +154 -154
  132. package/fesm2022/loxia-mst-viewer.mjs.map +1 -1
  133. package/lib/atomic-components/overlay/overlay.component.d.ts +1 -1
  134. package/package.json +10 -6
  135. package/tailwind.scss +1 -1
@@ -0,0 +1,110 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { select } from '@ngrx/store';
3
+ import { Subscription } from 'rxjs';
4
+ import { version } from '../../../generated.version';
5
+ import * as MstActions from '../../state/actions/actions';
6
+ import { SetBaseUrl, SetIaVersie, SetOngeplandeActiesBepaald } from '../../state/actions/actions';
7
+ import { setRitdelenAfterUpdate } from '../../state/actions/ritdelen.actions';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@ngrx/store";
10
+ import * as i2 from "../../services/viewer-control.service";
11
+ import * as i3 from "../../services/debug.service";
12
+ import * as i4 from "../../services/print-beweging.service";
13
+ import * as i5 from "@angular/common";
14
+ import * as i6 from "../../atomic-components/overlay/overlay.component";
15
+ import * as i7 from "../../atomic-components/progress-indicator/progress-indicator.component";
16
+ import * as i8 from "../rpe/rpe.component";
17
+ import * as i9 from "../ritdelen-lijst/ritdelen-lijst.component";
18
+ import * as i10 from "../ritdelen-view/ritdelen-view.component";
19
+ import * as i11 from "../viewer-controls/viewer-controls.component";
20
+ import * as i12 from "../svg-visualisatie/svg-visualisatie.component";
21
+ import * as i13 from "../../atomic-components/messages/messages.component";
22
+ export class MstviewerComponent {
23
+ constructor(store, viewerControlsService, debugService, printBewegingService) {
24
+ this.store = store;
25
+ this.viewerControlsService = viewerControlsService;
26
+ this.debugService = debugService;
27
+ this.printBewegingService = printBewegingService;
28
+ this.paginationSize = 4;
29
+ this.baseurl = 'https://acceptatie.raildesign.nl';
30
+ this.goedgekeurd = new EventEmitter();
31
+ this.subscriptions = new Subscription();
32
+ this.subscriptions.add(this.store.select('nieuweBewegingen').subscribe(nieuweRit => {
33
+ if (this.treinpad) {
34
+ this.treinpad.bewegingen = nieuweRit;
35
+ store.dispatch(setRitdelenAfterUpdate([]));
36
+ store.dispatch(SetOngeplandeActiesBepaald(false));
37
+ this.bepaalSbInfos(true);
38
+ }
39
+ }));
40
+ this.progressIndicator$ = this.store.pipe(select(s => s.progressState?.progressIndicator));
41
+ }
42
+ ngOnInit() {
43
+ // eslint-disable-next-line no-console
44
+ console.log('MST viewer versie: ' + version);
45
+ }
46
+ ngOnChanges({ debug, baseurl, treinpad, ongeplandeActies, iaversieinfo }) {
47
+ if (debug) {
48
+ this.debugService.setDebugFlag(debug.currentValue);
49
+ }
50
+ if (baseurl) {
51
+ this.store.dispatch(SetBaseUrl(baseurl.currentValue));
52
+ }
53
+ if (treinpad || ongeplandeActies) {
54
+ this.bepaalSbInfos();
55
+ }
56
+ if (iaversieinfo) {
57
+ this.store.dispatch(SetIaVersie(iaversieinfo.currentValue));
58
+ this.bepaalSbInfos();
59
+ }
60
+ if (ongeplandeActies) {
61
+ this.store.dispatch(SetOngeplandeActiesBepaald(false));
62
+ }
63
+ }
64
+ ngOnDestroy() {
65
+ this.debugService.setDebugFlag(false);
66
+ this.subscriptions.unsubscribe();
67
+ }
68
+ focusRitdeel(ritdeel) {
69
+ this.store.dispatch(MstActions.focusOpRitdeel(ritdeel, this.paginationSize, this.iaversieinfo));
70
+ }
71
+ focusPuic(puics) {
72
+ this.store.dispatch(MstActions.focusOpIds(puics));
73
+ }
74
+ bepaalSbInfos(ritGewijzigdToegestaan = false) {
75
+ if (this.treinpad && this.ongeplandeActies && this.iaversieinfo?.versie) {
76
+ this.store.dispatch(MstActions.bepaalSbInfos(this.treinpad, this.ongeplandeActies, this.iaversieinfo?.versie, ritGewijzigdToegestaan, this.paginationSize));
77
+ }
78
+ }
79
+ printFocusBeweging(bewegingId) {
80
+ return this.printBewegingService.printBeweging(bewegingId, this.paginationSize, this.iaversieinfo);
81
+ }
82
+ keurAlleActiesGoed() {
83
+ this.viewerControlsService.keurAlleActiesGoed(this.ongeplandeActies);
84
+ }
85
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: MstviewerComponent, deps: [{ token: i1.Store }, { token: i2.ViewerControlService }, { token: i3.DebugService }, { token: i4.PrintBewegingService }], target: i0.ɵɵFactoryTarget.Component }); }
86
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: MstviewerComponent, selector: "mst-viewer", inputs: { iaversieinfo: "iaversieinfo", treinpad: "treinpad", ongeplandeActies: "ongeplandeActies", paginationSize: "paginationSize", baseurl: "baseurl", debug: "debug", viewer: "viewer", useClickArea: "useClickArea" }, outputs: { goedgekeurd: "goedgekeurd" }, usesOnChanges: true, ngImport: i0, template: "<loxia-messages></loxia-messages>\n<loxia-overlay *ngIf=\"(progressIndicator$ | async)\">\n <loxia-progress-indicator id=\"progress-indicator\" [border]=\"false\" upperText=\"\">\n </loxia-progress-indicator>\n</loxia-overlay>\n\n<div style=\"position: relative\">\n <rpe-component [baseurl]=\"baseurl\" path=\"/mst/editor/editor.nocache.js\"></rpe-component>\n\n <svg-visualisatie [useClickArea]=\"useClickArea\" [nietGeplandeActies]=\"ongeplandeActies\"></svg-visualisatie>\n\n <nav [class.active]=\"(viewerControlsService.sideNavOpen$ | async) === false\" id=\"sidebar\">\n <div id=\"dismiss\">\n <em id=\"verbergSideNav\" class=\"fa fa-arrow-left\" (click)=\"viewerControlsService.toggleSideNavVisible()\">&times;</em>\n </div>\n <ritdelen-lijst *ngIf=\"!viewer\" (focusEmitter)=\"focusRitdeel($event)\" (keurAlleActiesGoed)=\"keurAlleActiesGoed()\"\n [nietGeplandeActies]=\"ongeplandeActies\"></ritdelen-lijst>\n <ritdelen-view *ngIf=\"viewer\" (focusEmitter)=\"focusRitdeel($event)\"></ritdelen-view>\n </nav>\n\n <viewer-controls [paginationSize]=\"paginationSize\"\n [iaversieinfo]=\"iaversieinfo\"\n [treinpad]=\"treinpad\"\n [goedgekeurd]=\"goedgekeurd\"\n ></viewer-controls>\n\n</div>\n", styles: ["#sidebar{min-width:350px;max-width:475px;background:#fff;transition:all .3s;height:93vh;position:absolute;top:0;z-index:20}#sidebar.active{margin-left:-475px}#sidebar .sidebar-header{padding:20px;background:#6d7fcc}#dismiss{width:20px;height:20px;position:absolute;cursor:pointer;top:5px;right:0;color:#000;z-index:300}[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.OverlayComponent, selector: "loxia-overlay" }, { kind: "component", type: i7.ProgressIndicatorComponent, selector: "loxia-progress-indicator" }, { kind: "component", type: i8.RpeComponent, selector: "rpe-component", inputs: ["baseurl", "path"] }, { kind: "component", type: i9.RitdelenLijstComponent, selector: "ritdelen-lijst", inputs: ["nietGeplandeActies"], outputs: ["focusEmitter", "keurAlleActiesGoed"] }, { kind: "component", type: i10.RitdelenViewComponent, selector: "ritdelen-view", outputs: ["focusEmitter"] }, { kind: "component", type: i11.ViewerControlsComponent, selector: "viewer-controls", inputs: ["paginationSize", "iaversieinfo", "treinpad", "goedgekeurd"] }, { kind: "component", type: i12.SvgVisualisatieComponent, selector: "svg-visualisatie", inputs: ["nietGeplandeActies", "useClickArea"] }, { kind: "component", type: i13.MessagesComponent, selector: "loxia-messages" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); }
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: MstviewerComponent, decorators: [{
89
+ type: Component,
90
+ args: [{ selector: 'mst-viewer', template: "<loxia-messages></loxia-messages>\n<loxia-overlay *ngIf=\"(progressIndicator$ | async)\">\n <loxia-progress-indicator id=\"progress-indicator\" [border]=\"false\" upperText=\"\">\n </loxia-progress-indicator>\n</loxia-overlay>\n\n<div style=\"position: relative\">\n <rpe-component [baseurl]=\"baseurl\" path=\"/mst/editor/editor.nocache.js\"></rpe-component>\n\n <svg-visualisatie [useClickArea]=\"useClickArea\" [nietGeplandeActies]=\"ongeplandeActies\"></svg-visualisatie>\n\n <nav [class.active]=\"(viewerControlsService.sideNavOpen$ | async) === false\" id=\"sidebar\">\n <div id=\"dismiss\">\n <em id=\"verbergSideNav\" class=\"fa fa-arrow-left\" (click)=\"viewerControlsService.toggleSideNavVisible()\">&times;</em>\n </div>\n <ritdelen-lijst *ngIf=\"!viewer\" (focusEmitter)=\"focusRitdeel($event)\" (keurAlleActiesGoed)=\"keurAlleActiesGoed()\"\n [nietGeplandeActies]=\"ongeplandeActies\"></ritdelen-lijst>\n <ritdelen-view *ngIf=\"viewer\" (focusEmitter)=\"focusRitdeel($event)\"></ritdelen-view>\n </nav>\n\n <viewer-controls [paginationSize]=\"paginationSize\"\n [iaversieinfo]=\"iaversieinfo\"\n [treinpad]=\"treinpad\"\n [goedgekeurd]=\"goedgekeurd\"\n ></viewer-controls>\n\n</div>\n", styles: ["#sidebar{min-width:350px;max-width:475px;background:#fff;transition:all .3s;height:93vh;position:absolute;top:0;z-index:20}#sidebar.active{margin-left:-475px}#sidebar .sidebar-header{padding:20px;background:#6d7fcc}#dismiss{width:20px;height:20px;position:absolute;cursor:pointer;top:5px;right:0;color:#000;z-index:300}[hidden]{display:none}\n"] }]
91
+ }], ctorParameters: () => [{ type: i1.Store }, { type: i2.ViewerControlService }, { type: i3.DebugService }, { type: i4.PrintBewegingService }], propDecorators: { iaversieinfo: [{
92
+ type: Input
93
+ }], treinpad: [{
94
+ type: Input
95
+ }], ongeplandeActies: [{
96
+ type: Input
97
+ }], paginationSize: [{
98
+ type: Input
99
+ }], baseurl: [{
100
+ type: Input
101
+ }], debug: [{
102
+ type: Input
103
+ }], viewer: [{
104
+ type: Input
105
+ }], useClickArea: [{
106
+ type: Input
107
+ }], goedgekeurd: [{
108
+ type: Output
109
+ }] } });
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXN0dmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21zdC12aWV3ZXIvc3JjL2xpYi9jb21wb25lbnRzL21zdHZpZXdlci9tc3R2aWV3ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXN0LXZpZXdlci9zcmMvbGliL2NvbXBvbmVudHMvbXN0dmlld2VyL21zdHZpZXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLE1BQU0sRUFBUyxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU9yRCxPQUFPLEtBQUssVUFBVSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVE5RSxNQUFNLE9BQU8sa0JBQWtCO0lBZ0IzQixZQUFvQixLQUE0QixFQUM3QixxQkFBMkMsRUFDMUMsWUFBMEIsRUFDMUIsb0JBQTBDO1FBSDFDLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBQzdCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDMUMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQWZyRCxtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQUcsa0NBQWtDLENBQUM7UUFLNUMsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUl0RCxrQkFBYSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBT3JELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQy9FLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7Z0JBQ3JDLEtBQUssQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCxRQUFRO1FBQ0osc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBaUI7UUFDbkYsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxRQUFRLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksWUFBWSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxZQUFZLENBQUMsT0FBZ0I7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWU7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxhQUFhLENBQUMsc0JBQXNCLEdBQUcsS0FBSztRQUN4QyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDdEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNoSyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQWtCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RSxDQUFDOzhHQWpGUSxrQkFBa0I7a0dBQWxCLGtCQUFrQiw0VUNwQi9CLGswQ0EyQkE7OzJGRFBhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDSSxZQUFZOzJLQUtiLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2VsZWN0LCBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uL2dlbmVyYXRlZC52ZXJzaW9uJztcbmltcG9ydCB7IFByb2dyZXNzSW5kaWNhdG9yIH0gZnJvbSAnLi4vLi4vYXRvbWljLWNvbXBvbmVudHMvcHJvZ3Jlc3MtaW5kaWNhdG9yL3Byb2dyZXNzLWluZGljYXRvci5lbnRpdHknO1xuaW1wb3J0IHsgUml0ZGVlbCB9IGZyb20gJy4uLy4uL21vZGVsL3JpdGRlZWwnO1xuaW1wb3J0IHsgQWN0aWUsIEluZnJhTW9kZWwsIFJpdCB9IGZyb20gJy4uLy4uL29wdGltbyc7XG5pbXBvcnQgeyBEZWJ1Z1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kZWJ1Zy5zZXJ2aWNlJztcbmltcG9ydCB7IFByaW50QmV3ZWdpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJpbnQtYmV3ZWdpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBWaWV3ZXJDb250cm9sU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZpZXdlci1jb250cm9sLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgTXN0QWN0aW9ucyBmcm9tICcuLi8uLi9zdGF0ZS9hY3Rpb25zL2FjdGlvbnMnO1xuaW1wb3J0IHsgU2V0QmFzZVVybCwgU2V0SWFWZXJzaWUsIFNldE9uZ2VwbGFuZGVBY3RpZXNCZXBhYWxkIH0gZnJvbSAnLi4vLi4vc3RhdGUvYWN0aW9ucy9hY3Rpb25zJztcbmltcG9ydCB7IHNldFJpdGRlbGVuQWZ0ZXJVcGRhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZS9hY3Rpb25zL3JpdGRlbGVuLmFjdGlvbnMnO1xuaW1wb3J0IHsgTXN0RWRpdG9yU3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZS9tc3QtZWRpdG9yLXN0YXRlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdtc3Qtdmlld2VyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbXN0dmlld2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tc3R2aWV3ZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNc3R2aWV3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBpYXZlcnNpZWluZm86IEluZnJhTW9kZWw7XG4gICAgQElucHV0KCkgdHJlaW5wYWQ6IFJpdDtcbiAgICBASW5wdXQoKSBvbmdlcGxhbmRlQWN0aWVzOiBBY3RpZVtdO1xuICAgIEBJbnB1dCgpIHBhZ2luYXRpb25TaXplID0gNDtcbiAgICBASW5wdXQoKSBiYXNldXJsID0gJ2h0dHBzOi8vYWNjZXB0YXRpZS5yYWlsZGVzaWduLm5sJztcbiAgICBASW5wdXQoKSBkZWJ1ZzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB2aWV3ZXI6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdXNlQ2xpY2tBcmVhOiBib29sZWFuO1xuXG4gICAgQE91dHB1dCgpIGdvZWRnZWtldXJkOiBFdmVudEVtaXR0ZXI8Uml0PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHByb2dyZXNzSW5kaWNhdG9yJDogT2JzZXJ2YWJsZTxQcm9ncmVzc0luZGljYXRvcj47XG5cbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmU6IFN0b3JlPE1zdEVkaXRvclN0YXRlPixcbiAgICAgICAgICAgICAgICBwdWJsaWMgdmlld2VyQ29udHJvbHNTZXJ2aWNlOiBWaWV3ZXJDb250cm9sU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRlYnVnU2VydmljZTogRGVidWdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcHJpbnRCZXdlZ2luZ1NlcnZpY2U6IFByaW50QmV3ZWdpbmdTZXJ2aWNlKSB7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnN0b3JlLnNlbGVjdCgnbmlldXdlQmV3ZWdpbmdlbicpLnN1YnNjcmliZShuaWV1d2VSaXQgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJlaW5wYWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWlucGFkLmJld2VnaW5nZW4gPSBuaWV1d2VSaXQ7XG4gICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goc2V0Uml0ZGVsZW5BZnRlclVwZGF0ZShbXSkpO1xuICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKFNldE9uZ2VwbGFuZGVBY3RpZXNCZXBhYWxkKGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5iZXBhYWxTYkluZm9zKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NJbmRpY2F0b3IkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChzID0+IHMucHJvZ3Jlc3NTdGF0ZT8ucHJvZ3Jlc3NJbmRpY2F0b3IpKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coJ01TVCB2aWV3ZXIgdmVyc2llOiAnICsgdmVyc2lvbik7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoeyBkZWJ1ZywgYmFzZXVybCwgdHJlaW5wYWQsIG9uZ2VwbGFuZGVBY3RpZXMsIGlhdmVyc2llaW5mbyB9OiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z1NlcnZpY2Uuc2V0RGVidWdGbGFnKGRlYnVnLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2V1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goU2V0QmFzZVVybChiYXNldXJsLmN1cnJlbnRWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmVpbnBhZCB8fCBvbmdlcGxhbmRlQWN0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLmJlcGFhbFNiSW5mb3MoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWF2ZXJzaWVpbmZvKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFNldElhVmVyc2llKGlhdmVyc2llaW5mby5jdXJyZW50VmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMuYmVwYWFsU2JJbmZvcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbmdlcGxhbmRlQWN0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFNldE9uZ2VwbGFuZGVBY3RpZXNCZXBhYWxkKGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZWJ1Z1NlcnZpY2Uuc2V0RGVidWdGbGFnKGZhbHNlKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgZm9jdXNSaXRkZWVsKHJpdGRlZWw6IFJpdGRlZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChNc3RBY3Rpb25zLmZvY3VzT3BSaXRkZWVsKHJpdGRlZWwsIHRoaXMucGFnaW5hdGlvblNpemUsIHRoaXMuaWF2ZXJzaWVpbmZvKSk7XG4gICAgfVxuXG4gICAgZm9jdXNQdWljKHB1aWNzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKE1zdEFjdGlvbnMuZm9jdXNPcElkcyhwdWljcykpO1xuICAgIH1cblxuICAgIGJlcGFhbFNiSW5mb3Mocml0R2V3aWp6aWdkVG9lZ2VzdGFhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRyZWlucGFkICYmIHRoaXMub25nZXBsYW5kZUFjdGllcyAmJiB0aGlzLmlhdmVyc2llaW5mbz8udmVyc2llKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKE1zdEFjdGlvbnMuYmVwYWFsU2JJbmZvcyh0aGlzLnRyZWlucGFkLCB0aGlzLm9uZ2VwbGFuZGVBY3RpZXMsIHRoaXMuaWF2ZXJzaWVpbmZvPy52ZXJzaWUsIHJpdEdld2lqemlnZFRvZWdlc3RhYW4sIHRoaXMucGFnaW5hdGlvblNpemUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaW50Rm9jdXNCZXdlZ2luZyhiZXdlZ2luZ0lkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJpbnRCZXdlZ2luZ1NlcnZpY2UucHJpbnRCZXdlZ2luZyhiZXdlZ2luZ0lkLCB0aGlzLnBhZ2luYXRpb25TaXplLCB0aGlzLmlhdmVyc2llaW5mbyk7XG4gICAgfVxuXG4gICAga2V1ckFsbGVBY3RpZXNHb2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZpZXdlckNvbnRyb2xzU2VydmljZS5rZXVyQWxsZUFjdGllc0dvZWQodGhpcy5vbmdlcGxhbmRlQWN0aWVzKTtcbiAgICB9XG59XG4iLCI8bG94aWEtbWVzc2FnZXM+PC9sb3hpYS1tZXNzYWdlcz5cbjxsb3hpYS1vdmVybGF5ICpuZ0lmPVwiKHByb2dyZXNzSW5kaWNhdG9yJCB8IGFzeW5jKVwiPlxuICAgIDxsb3hpYS1wcm9ncmVzcy1pbmRpY2F0b3IgaWQ9XCJwcm9ncmVzcy1pbmRpY2F0b3JcIiBbYm9yZGVyXT1cImZhbHNlXCIgdXBwZXJUZXh0PVwiXCI+XG4gICAgPC9sb3hpYS1wcm9ncmVzcy1pbmRpY2F0b3I+XG48L2xveGlhLW92ZXJsYXk+XG5cbjxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIj5cbiAgICA8cnBlLWNvbXBvbmVudCBbYmFzZXVybF09XCJiYXNldXJsXCIgcGF0aD1cIi9tc3QvZWRpdG9yL2VkaXRvci5ub2NhY2hlLmpzXCI+PC9ycGUtY29tcG9uZW50PlxuXG4gICAgPHN2Zy12aXN1YWxpc2F0aWUgW3VzZUNsaWNrQXJlYV09XCJ1c2VDbGlja0FyZWFcIiBbbmlldEdlcGxhbmRlQWN0aWVzXT1cIm9uZ2VwbGFuZGVBY3RpZXNcIj48L3N2Zy12aXN1YWxpc2F0aWU+XG5cbiAgICA8bmF2IFtjbGFzcy5hY3RpdmVdPVwiKHZpZXdlckNvbnRyb2xzU2VydmljZS5zaWRlTmF2T3BlbiQgfCBhc3luYykgPT09IGZhbHNlXCIgaWQ9XCJzaWRlYmFyXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkaXNtaXNzXCI+XG4gICAgICAgICAgICA8ZW0gaWQ9XCJ2ZXJiZXJnU2lkZU5hdlwiIGNsYXNzPVwiZmEgZmEtYXJyb3ctbGVmdFwiIChjbGljayk9XCJ2aWV3ZXJDb250cm9sc1NlcnZpY2UudG9nZ2xlU2lkZU5hdlZpc2libGUoKVwiPiZ0aW1lczs8L2VtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHJpdGRlbGVuLWxpanN0ICpuZ0lmPVwiIXZpZXdlclwiIChmb2N1c0VtaXR0ZXIpPVwiZm9jdXNSaXRkZWVsKCRldmVudClcIiAoa2V1ckFsbGVBY3RpZXNHb2VkKT1cImtldXJBbGxlQWN0aWVzR29lZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuaWV0R2VwbGFuZGVBY3RpZXNdPVwib25nZXBsYW5kZUFjdGllc1wiPjwvcml0ZGVsZW4tbGlqc3Q+XG4gICAgICAgIDxyaXRkZWxlbi12aWV3ICpuZ0lmPVwidmlld2VyXCIgKGZvY3VzRW1pdHRlcik9XCJmb2N1c1JpdGRlZWwoJGV2ZW50KVwiPjwvcml0ZGVsZW4tdmlldz5cbiAgICA8L25hdj5cblxuICAgIDx2aWV3ZXItY29udHJvbHMgW3BhZ2luYXRpb25TaXplXT1cInBhZ2luYXRpb25TaXplXCJcbiAgICAgICAgICAgICAgICAgICAgIFtpYXZlcnNpZWluZm9dPVwiaWF2ZXJzaWVpbmZvXCJcbiAgICAgICAgICAgICAgICAgICAgIFt0cmVpbnBhZF09XCJ0cmVpbnBhZFwiXG4gICAgICAgICAgICAgICAgICAgICBbZ29lZGdla2V1cmRdPVwiZ29lZGdla2V1cmRcIlxuICAgID48L3ZpZXdlci1jb250cm9scz5cblxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,267 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { JsJavaUtil } from '@loxia/rijwegen';
3
+ import { combineLatest } from 'rxjs';
4
+ import { filter } from 'rxjs/operators';
5
+ import { OngeplandeActie } from '../../model/ongeplande-actie';
6
+ import * as MstActions from '../../state/actions/actions';
7
+ import * as RitdelenActions from '../../state/actions/ritdelen.actions';
8
+ import { ActieHelper } from '../../util/actie-helper';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@ngrx/store";
11
+ import * as i2 from "../../services/signalerings-beeld-manager.service";
12
+ import * as i3 from "@angular/common";
13
+ export class RitdelenLijstComponent {
14
+ constructor(store, sbmService) {
15
+ this.store = store;
16
+ this.sbmService = sbmService;
17
+ this.focusEmitter = new EventEmitter();
18
+ this.keurAlleActiesGoed = new EventEmitter();
19
+ this.selectedRitdeelActies = [];
20
+ this.selectedRitdeelOngeplandeActies = [];
21
+ this.NG_ACTIE_PREFIX = '* ';
22
+ this.subscriptions = [];
23
+ this.subscriptions.push(store.select('ritDelen').subscribe((ritdelen) => {
24
+ this.ritdeelViewModels = ritdelen?.map(ritdeel => {
25
+ return new RitdeelViewModel(ritdeel, this.selectedRitdeelClass(ritdeel), this.isRitdeelZichtbaar(ritdeel), this.getTitle(ritdeel), ritdeel.isNietBeschikbaar(), this.isRitdeelNieuw(ritdeel), ritdeel.getVanPrlSpoor(), ritdeel.getNaarPrlSpoorText(), ritdeel.getDwangNummer(), ritdeel.getPplgString(), this.getTreinNummer(ritdeel));
26
+ });
27
+ }));
28
+ this.subscriptions.push(store.select('ongeplandeActies').subscribe(acties => this.ongeplandeActiesMap = acties));
29
+ this.subscriptions.push(store.select('geplandeActies').subscribe(acties => this.geplandeActies = acties));
30
+ this.subscriptions.push(store.select('editable').subscribe(editable => this.editable = editable));
31
+ // listen to changes from svg-viewer-component, saving ritdeel in store isn't cool because of all the gwt in it. This is
32
+ // just to make changes within the angular lifecycle.
33
+ this.subscriptions.push(store.select('selectedRitdeelId').pipe(filter(id => !id)).subscribe(this.deselectRitdeel));
34
+ this.subscriptions.push(combineLatest([
35
+ this.store.select('ritDelen'),
36
+ this.store.select('ongeplandeActies')
37
+ ]).subscribe(() => this.updateOngeplandeActiesList()));
38
+ }
39
+ ngOnDestroy() {
40
+ this.subscriptions.forEach(s => s.unsubscribe());
41
+ }
42
+ isRitdeelZichtbaar(ritdeel) {
43
+ return ritdeel.isZichtbaar();
44
+ }
45
+ toggleRitdeelZichtbaarheid(ritdeel) {
46
+ this.deselectRitdeel();
47
+ this.store.dispatch(RitdelenActions.toggleRitdeelZichtbaar(ritdeel));
48
+ }
49
+ toggleZichtbaarheidAlleRitdelen(checked) {
50
+ this.deselectRitdeel();
51
+ this.store.dispatch(RitdelenActions.setZichtbaarheidAlleRitdelen(checked));
52
+ }
53
+ isRitdeelNieuw(ritdeel) {
54
+ return ritdeel.isNieuw() ? '+' : '';
55
+ }
56
+ getTitle(ritdeel) {
57
+ return ritdeel.getBewegingId();
58
+ }
59
+ getTreinNummer(ritdeel) {
60
+ return ritdeel.getTreinNummer();
61
+ }
62
+ deleteRitdeel(ritdeel) {
63
+ ritdeel.acties.forEach(actie => {
64
+ this.verhuisActieNaarOngepland(actie);
65
+ });
66
+ this.deselectRitdeel();
67
+ this.store.dispatch(RitdelenActions.deleteRitdeel(ritdeel));
68
+ }
69
+ deleteActiesUitRit() {
70
+ this.selectedRitdeel.acties.slice().forEach(actie => {
71
+ this.deleteActieUitRit(actie);
72
+ });
73
+ }
74
+ deleteActieUitRit(actie) {
75
+ const acties = this.selectedRitdeel.acties;
76
+ const idx = acties.indexOf(actie);
77
+ if (idx >= 0) {
78
+ this.verhuisActieNaarOngepland(actie);
79
+ this.store.dispatch(RitdelenActions.deleteRitdeelActie(this.selectedRitdeel, acties[idx]));
80
+ }
81
+ const index = this.nietGeplandeActies.indexOf(actie);
82
+ if (index < 0) {
83
+ this.nietGeplandeActies.push(actie);
84
+ }
85
+ }
86
+ verhuisActieNaarOngepland(actie) {
87
+ const puics = this.geplandeActies.get(actie);
88
+ if (puics && puics.length > 0) {
89
+ this.store.dispatch(MstActions.AddOngeplandeActie(new OngeplandeActie(actie, puics)));
90
+ this.store.dispatch(MstActions.DeleteGeplandeActie(actie, puics));
91
+ }
92
+ }
93
+ voegActiesToeAanRit() {
94
+ const acties = this.selectedRitdeelOngeplandeActies;
95
+ acties.slice().forEach(actie => {
96
+ this.voegActieToeAanRit(actie);
97
+ });
98
+ }
99
+ voegActieToeAanRit(ongeplandeActie) {
100
+ const idx = this.selectedRitdeelOngeplandeActies.indexOf(ongeplandeActie);
101
+ if (idx >= 0) {
102
+ this.store.dispatch(RitdelenActions.addRitdeelActie(this.selectedRitdeel, this.selectedRitdeelOngeplandeActies[idx].actie));
103
+ this.store.dispatch(MstActions.AddGeplandeActie(ongeplandeActie.actie, ongeplandeActie.puics));
104
+ this.store.dispatch(MstActions.DeleteOngeplandeActie(ongeplandeActie));
105
+ }
106
+ }
107
+ updateOngeplandeActiesList() {
108
+ if (this.selectedRitdeel) {
109
+ this.selectedRitdeelOngeplandeActies = [];
110
+ const ritPuics = [];
111
+ const ritdeelTopoElements = ActieHelper.getActieTopoElements(this.selectedRitdeel, this.sbmService);
112
+ const wisselObjecten = JsJavaUtil.listToArray(this.selectedRitdeel.getRoute().getWisselObjectenInDeRoute());
113
+ ritdeelTopoElements.forEach(elem => ritPuics.push(elem.getPuic()));
114
+ const ongeplandeActiesArray = this.ongeplandeActiesMap.values();
115
+ ongeplandeActiesArray.forEach(oa => {
116
+ const acties = this.ritdeelViewModels.flatMap(rd => rd.ritdeel.acties);
117
+ const alreadyAdded = acties.filter(a => a.id === oa.actie.id).length > 0;
118
+ if (!alreadyAdded) {
119
+ let oaMatch;
120
+ if (ActieHelper.isVSTActie(oa.actie)) {
121
+ oaMatch = this.matchedWisselMetKantCodeInVSTActie(oa, wisselObjecten) ? oa : undefined;
122
+ }
123
+ else if (oa.puics.filter(p => ritPuics.includes(p) || this.bevatWisselPuic(ritPuics, p)).length > 0) {
124
+ oaMatch = oa;
125
+ }
126
+ const alreadyAddedAsOngepland = this.selectedRitdeelOngeplandeActies.filter(a => a.actie.id === oa.actie.id).length > 0;
127
+ if (oaMatch && !alreadyAddedAsOngepland) {
128
+ this.selectedRitdeelOngeplandeActies.push(oaMatch);
129
+ }
130
+ }
131
+ });
132
+ }
133
+ }
134
+ matchedWisselMetKantCodeInVSTActie(ongeplandeActie, wissels) {
135
+ const pplg = ongeplandeActie.actie.pplgNaam;
136
+ const wisselKantCodes = ActieHelper.getWisselKantCodes(ongeplandeActie.actie);
137
+ let gevondenWissels = 0;
138
+ let gevondenWisselKantCodes = 0;
139
+ wisselKantCodes.forEach((wisselKantCode) => {
140
+ const gevondenWissel = this.findWisselOpNaamEnPplg(wissels, wisselKantCode.naam, pplg);
141
+ if (gevondenWissel) {
142
+ gevondenWissels++;
143
+ if (this.getKantCode(gevondenWissel.getStand()) === wisselKantCode.kantCode) {
144
+ gevondenWisselKantCodes++;
145
+ }
146
+ }
147
+ });
148
+ return gevondenWissels > 0 && gevondenWissels === gevondenWisselKantCodes;
149
+ }
150
+ findWisselOpNaamEnPplg(wissels, wisselNaam, pplgNaam) {
151
+ return wissels.find(wo => wo.getName() === wisselNaam && wo.getPPLG() === pplgNaam);
152
+ }
153
+ bevatWisselPuic(ritPuics, p) {
154
+ return ritPuics.includes(this.sbmService.getWisselMetStoringskaderPuic(p)?.getPuic());
155
+ }
156
+ selectedRitdeelClass(ritdeel) {
157
+ if (ritdeel.getZichtbaarheidBuitenPaginatie()) {
158
+ if (ritdeel.equals(this.selectedRitdeel)) {
159
+ return 'selected';
160
+ }
161
+ return 'visible-outside-window';
162
+ }
163
+ if (ritdeel.isNietBeschikbaar()) {
164
+ return 'disabled';
165
+ }
166
+ if (ritdeel.equals(this.selectedRitdeel)) {
167
+ return 'selected';
168
+ }
169
+ return '';
170
+ }
171
+ selectRitdeel(event, ritdeel) {
172
+ if (event?.ctrlKey) {
173
+ this.focusEmitter.emit(ritdeel);
174
+ }
175
+ else {
176
+ if (ritdeel?.equals(this.selectedRitdeel)) {
177
+ this.deselectRitdeel();
178
+ return;
179
+ }
180
+ this.selectedRitdeel = ritdeel;
181
+ this.disableActieKnoppenVanRitdeel = !this.selectedRitdeel.isZichtbaar();
182
+ if (ritdeel.acties) {
183
+ this.selectedRitdeelActies = ritdeel.acties;
184
+ this.updateOngeplandeActiesList();
185
+ }
186
+ else {
187
+ this.selectedRitdeelActies = [];
188
+ this.selectedRitdeelOngeplandeActies = [];
189
+ }
190
+ }
191
+ }
192
+ actieOmschrijvingTekst(actie) {
193
+ const prefix = this.bepaalPrefixVoorActieOmschrijving(actie);
194
+ if (ActieHelper.isVSTActie(actie)) {
195
+ return this.maakVstActieOmschrijving(actie, prefix);
196
+ }
197
+ return prefix + actie.ritActieTypeOmschrijving;
198
+ }
199
+ maakVstActieOmschrijving(actie, prefix) {
200
+ return `${prefix}${ActieHelper.getVSTActieOmschrijving(actie)}`;
201
+ }
202
+ bepaalPrefixVoorActieOmschrijving(actie) {
203
+ const prefix = '';
204
+ if (this.selectedRitdeel.acties.includes(actie)) {
205
+ // Afwijkende naam bij niet gevisualiseerde actie in rit
206
+ const puics = this.geplandeActies.get(actie);
207
+ return puics.length > 0 ? prefix : this.NG_ACTIE_PREFIX;
208
+ }
209
+ return prefix;
210
+ }
211
+ actieVanKmTekst(actie) {
212
+ if (ActieHelper.isWisselSlijpenActie(actie)) {
213
+ return actie.wisselNaam;
214
+ }
215
+ return actie.vanKilometerlint ? actie.vanKilometerlint + ' ' + actie.vanKilometrering : '-';
216
+ }
217
+ actieTotKmTekst(actie) {
218
+ return actie.totKilometerlint ? actie.totKilometerlint + ' ' + actie.totKilometrering : '-';
219
+ }
220
+ deselectRitdeel() {
221
+ this.disableActieKnoppenVanRitdeel = false;
222
+ this.selectedRitdeel = undefined;
223
+ this.selectedRitdeelActies = [];
224
+ this.selectedRitdeelOngeplandeActies = [];
225
+ }
226
+ getPplgString(ritdeel) {
227
+ return ritdeel.getPplgString();
228
+ }
229
+ getKantCode(stand) {
230
+ if (stand === window['domein'].Stand.LINKS) {
231
+ return 'L';
232
+ }
233
+ return 'R';
234
+ }
235
+ planAlleRitActies() {
236
+ this.keurAlleActiesGoed.emit();
237
+ this.deselectRitdeel();
238
+ }
239
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RitdelenLijstComponent, deps: [{ token: i1.Store }, { token: i2.SignaleringsBeeldManagerService }], target: i0.ɵɵFactoryTarget.Component }); }
240
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: RitdelenLijstComponent, selector: "ritdelen-lijst", inputs: { nietGeplandeActies: "nietGeplandeActies" }, outputs: { focusEmitter: "focusEmitter", keurAlleActiesGoed: "keurAlleActiesGoed" }, ngImport: i0, template: "<div id=\"ritdelen-lijst\">\n <div class=\"sidebar-header\">\n <h3 [attr.data-test-id]=\"'title-rit-details'\">Ritdetails</h3>\n </div>\n <div class=\"panes-container\">\n <div class=\"top-pane tableFixHead\" id=\"top-pane\">\n <table class=\"table\" aria-hidden=\"true\" [attr.data-test-id]=\"'table-rit-details'\">\n <thead>\n <tr>\n <th scope=\"col\">\n <input #input\n type=\"checkbox\"\n checked\n class=\"checkbox col-visibility\"\n (change)=\"toggleZichtbaarheidAlleRitdelen(input.checked)\"\n id=\"ritdetails-selecteerAlles\"\n title=\"Selecteer alles\"\n [attr.data-test-id]=\"'checkbox-alle-bewegingen'\">\n </th>\n <th scope=\"col\"></th>\n <th scope=\"col\">Van</th>\n <th scope=\"col\">Naar</th>\n <th scope=\"col\">DW</th>\n <th scope=\"col\">PPLG(s)</th>\n <th scope=\"col\">Treinnr.</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n\n <tr *ngFor=\"let ritdeelViewModel of ritdeelViewModels; let i = index\"\n class=\"{{ selectedRitdeelClass(ritdeelViewModel.ritdeel) }}\" id=\"ritdetails-r{{i}}\">\n <td>\n <input id=\"ritdetails-r{{i}}-zichtbaar\"\n [attr.data-test-id]=\"'checkbox-r'+i\"\n type=\"checkbox\"\n class=\"checkbox col-visibility\"\n [checked]=\"ritdeelViewModel.isZichtbaar\"\n [title]=\"ritdeelViewModel.title\"\n (change)=\"toggleRitdeelZichtbaarheid(ritdeelViewModel.ritdeel)\"\n [hidden]=\"ritdeelViewModel.isNietBeschikbaar\"/>\n </td>\n <td id=\"ritdetails-r{{i}}-gewijzigd\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.isNieuw}}</td>\n <td id=\"ritdetails-r{{i}}-vanSpoor\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.vanPrlSpoor}}</td>\n <td id=\"ritdetails-r{{i}}-naarSpoor\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.naarPrlSpoor}}</td>\n <td id=\"ritdetails-r{{i}}-dwangNummer\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.dwangNummer}}</td>\n <td id=\"ritdetails-r{{i}}-pplgs\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.pplgString}}</td>\n <td id=\"ritdetails-r{{i}}-treinNummer\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.treinNummer}}</td>\n <td style=\"text-align:right\">\n <button *ngIf=\"editable\"\n id=\"ritdetails-r{{i}}-del\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-danger btn-sm\"\n (click)=\"deleteRitdeel(ritdeelViewModel.ritdeel)\">X\n </button>\n </td>\n </tr>\n\n </table>\n </div>\n <div class=\"actie-pane\">\n <div *ngIf=\"selectedRitdeel && (selectedRitdeelActies.length > 0 || selectedRitdeelOngeplandeActies.length > 0) \"\n id=\"actie-pane\">\n <h4>Geplande acties</h4>\n <table aria-hidden=\"true\">\n <tr>\n <th scope=\"col\">Actie</th>\n <th scope=\"col\">Van</th>\n <th scope=\"col\">Tot</th>\n <th scope=\"col\">\n <button *ngIf=\"editable\"\n [hidden]=\"selectedRitdeelActies.length===0\"\n id=\"bulkSetOngeplandButton\"\n [attr.data-test-id]=\"'unplan-all-actions'\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-danger btn-sm\"\n (click)=\"deleteActiesUitRit()\"\n [disabled]=\"disableActieKnoppenVanRitdeel\">X\n </button>\n </th>\n </tr>\n\n <tr *ngFor=\"let actie of selectedRitdeelActies; let i = index\" id=\"ritdetails-a{{i}}\">\n <td id=\"ritdetails-a{{i}}-omschrijving\" class=\"nowrap\">{{ actieOmschrijvingTekst(actie) }}</td>\n <td id=\"ritdetails-a{{i}}-vanKmLint\">{{ actieVanKmTekst(actie)}}</td>\n <td id=\"ritdetails-a{{i}}-totKmLint\">{{ actieTotKmTekst(actie)}}</td>\n <td style=\"text-align:right\">\n <button *ngIf=\"editable\"\n id=\"ritdetails-a{{i}}-del\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-danger btn-sm\"\n (click)=\"deleteActieUitRit(actie)\"\n [disabled]=\"disableActieKnoppenVanRitdeel\">X\n </button>\n </td>\n </tr>\n </table>\n <h4>Ongeplande acties</h4>\n <table aria-hidden=\"true\">\n <tr>\n <th scope=\"col\">Actie</th>\n <th scope=\"col\">Van</th>\n <th scope=\"col\">Tot</th>\n <th scope=\"col\">\n <button *ngIf=\"editable\"\n [hidden]=\"selectedRitdeelOngeplandeActies.length===0\"\n id=\"bulkSetGeplandButton\"\n [attr.data-test-id]=\"'plan-all-actions'\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-success loxia-btn-sm\"\n (click)=\"voegActiesToeAanRit()\"\n [disabled]=\"disableActieKnoppenVanRitdeel\">^\n </button>\n </th>\n </tr>\n\n <tr *ngFor=\"let ongeplandeActie of selectedRitdeelOngeplandeActies; let i = index\"\n id=\"ritdetails-oa{{i}}\">\n <td id=\"ritdetails-oa{{i}}-omschrijving\" class=\"nowrap\">{{actieOmschrijvingTekst(ongeplandeActie.actie) }}</td>\n <td id=\"ritdetails-oa{{i}}-vanKmLint\">{{ actieVanKmTekst(ongeplandeActie.actie)}}</td>\n <td id=\"ritdetails-oa{{i}}-totKmLint\">{{ actieTotKmTekst(ongeplandeActie.actie)}}</td>\n <td style=\"text-align:right\">\n <button *ngIf=\"editable\"\n id=\"ritdetails-oa{{i}}-del\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-success loxia-btn-sm\"\n (click)=\"voegActieToeAanRit(ongeplandeActie)\"\n [disabled]=\"disableActieKnoppenVanRitdeel\">^\n </button>\n </td>\n </tr>\n </table>\n </div>\n </div>\n <div class=\"knop-pane\">\n <button type=\"button\"\n class=\"loxia-btn loxia-btn-primary loxia-btn-sm\"\n [attr.data-test-id]=\"'plan-all-actions-for-file'\"\n [innerText]=\"'Plan acties hele rit'\"\n (click)=\"planAlleRitActies()\">\n </button>\n </div>\n </div>\n</div>\n", styles: [".panes-container{display:inline;height:100%;border:1px solid black}table{width:100%}th{padding:5px;z-index:1000}td{padding:4px}tr:nth-child(2n){background:#f0f0f0}tr:nth-child(odd){background:#fff}.top-pane{height:45vh;overflow:auto}.actie-pane{height:35vh;overflow:auto}.knop-pane{height:5vh;justify-content:center;display:flex;align-items:center}.panes-container,.panes-separator,.top-pane,.actie-pane{margin:0;padding:0;width:100%}.selected{background:#ffff80!important}.disabled{background:gray!important}.visible-outside-window{background:#87cefa!important}.table-scroll-header-fix tbody{display:block;height:40vh;overflow:auto}.tableFixHead{overflow-y:auto}.tableFixHead thead th{position:sticky;top:0;background-color:#fff}.table{margin-bottom:0}.table td,.table th{border-top:none;border-bottom:none;padding-left:.75em}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
241
+ }
242
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RitdelenLijstComponent, decorators: [{
243
+ type: Component,
244
+ args: [{ selector: 'ritdelen-lijst', changeDetection: ChangeDetectionStrategy.Default, template: "<div id=\"ritdelen-lijst\">\n <div class=\"sidebar-header\">\n <h3 [attr.data-test-id]=\"'title-rit-details'\">Ritdetails</h3>\n </div>\n <div class=\"panes-container\">\n <div class=\"top-pane tableFixHead\" id=\"top-pane\">\n <table class=\"table\" aria-hidden=\"true\" [attr.data-test-id]=\"'table-rit-details'\">\n <thead>\n <tr>\n <th scope=\"col\">\n <input #input\n type=\"checkbox\"\n checked\n class=\"checkbox col-visibility\"\n (change)=\"toggleZichtbaarheidAlleRitdelen(input.checked)\"\n id=\"ritdetails-selecteerAlles\"\n title=\"Selecteer alles\"\n [attr.data-test-id]=\"'checkbox-alle-bewegingen'\">\n </th>\n <th scope=\"col\"></th>\n <th scope=\"col\">Van</th>\n <th scope=\"col\">Naar</th>\n <th scope=\"col\">DW</th>\n <th scope=\"col\">PPLG(s)</th>\n <th scope=\"col\">Treinnr.</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n\n <tr *ngFor=\"let ritdeelViewModel of ritdeelViewModels; let i = index\"\n class=\"{{ selectedRitdeelClass(ritdeelViewModel.ritdeel) }}\" id=\"ritdetails-r{{i}}\">\n <td>\n <input id=\"ritdetails-r{{i}}-zichtbaar\"\n [attr.data-test-id]=\"'checkbox-r'+i\"\n type=\"checkbox\"\n class=\"checkbox col-visibility\"\n [checked]=\"ritdeelViewModel.isZichtbaar\"\n [title]=\"ritdeelViewModel.title\"\n (change)=\"toggleRitdeelZichtbaarheid(ritdeelViewModel.ritdeel)\"\n [hidden]=\"ritdeelViewModel.isNietBeschikbaar\"/>\n </td>\n <td id=\"ritdetails-r{{i}}-gewijzigd\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.isNieuw}}</td>\n <td id=\"ritdetails-r{{i}}-vanSpoor\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.vanPrlSpoor}}</td>\n <td id=\"ritdetails-r{{i}}-naarSpoor\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.naarPrlSpoor}}</td>\n <td id=\"ritdetails-r{{i}}-dwangNummer\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.dwangNummer}}</td>\n <td id=\"ritdetails-r{{i}}-pplgs\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.pplgString}}</td>\n <td id=\"ritdetails-r{{i}}-treinNummer\" (click)=\"selectRitdeel($event, ritdeelViewModel.ritdeel)\">{{ritdeelViewModel.treinNummer}}</td>\n <td style=\"text-align:right\">\n <button *ngIf=\"editable\"\n id=\"ritdetails-r{{i}}-del\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-danger btn-sm\"\n (click)=\"deleteRitdeel(ritdeelViewModel.ritdeel)\">X\n </button>\n </td>\n </tr>\n\n </table>\n </div>\n <div class=\"actie-pane\">\n <div *ngIf=\"selectedRitdeel && (selectedRitdeelActies.length > 0 || selectedRitdeelOngeplandeActies.length > 0) \"\n id=\"actie-pane\">\n <h4>Geplande acties</h4>\n <table aria-hidden=\"true\">\n <tr>\n <th scope=\"col\">Actie</th>\n <th scope=\"col\">Van</th>\n <th scope=\"col\">Tot</th>\n <th scope=\"col\">\n <button *ngIf=\"editable\"\n [hidden]=\"selectedRitdeelActies.length===0\"\n id=\"bulkSetOngeplandButton\"\n [attr.data-test-id]=\"'unplan-all-actions'\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-danger btn-sm\"\n (click)=\"deleteActiesUitRit()\"\n [disabled]=\"disableActieKnoppenVanRitdeel\">X\n </button>\n </th>\n </tr>\n\n <tr *ngFor=\"let actie of selectedRitdeelActies; let i = index\" id=\"ritdetails-a{{i}}\">\n <td id=\"ritdetails-a{{i}}-omschrijving\" class=\"nowrap\">{{ actieOmschrijvingTekst(actie) }}</td>\n <td id=\"ritdetails-a{{i}}-vanKmLint\">{{ actieVanKmTekst(actie)}}</td>\n <td id=\"ritdetails-a{{i}}-totKmLint\">{{ actieTotKmTekst(actie)}}</td>\n <td style=\"text-align:right\">\n <button *ngIf=\"editable\"\n id=\"ritdetails-a{{i}}-del\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-danger btn-sm\"\n (click)=\"deleteActieUitRit(actie)\"\n [disabled]=\"disableActieKnoppenVanRitdeel\">X\n </button>\n </td>\n </tr>\n </table>\n <h4>Ongeplande acties</h4>\n <table aria-hidden=\"true\">\n <tr>\n <th scope=\"col\">Actie</th>\n <th scope=\"col\">Van</th>\n <th scope=\"col\">Tot</th>\n <th scope=\"col\">\n <button *ngIf=\"editable\"\n [hidden]=\"selectedRitdeelOngeplandeActies.length===0\"\n id=\"bulkSetGeplandButton\"\n [attr.data-test-id]=\"'plan-all-actions'\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-success loxia-btn-sm\"\n (click)=\"voegActiesToeAanRit()\"\n [disabled]=\"disableActieKnoppenVanRitdeel\">^\n </button>\n </th>\n </tr>\n\n <tr *ngFor=\"let ongeplandeActie of selectedRitdeelOngeplandeActies; let i = index\"\n id=\"ritdetails-oa{{i}}\">\n <td id=\"ritdetails-oa{{i}}-omschrijving\" class=\"nowrap\">{{actieOmschrijvingTekst(ongeplandeActie.actie) }}</td>\n <td id=\"ritdetails-oa{{i}}-vanKmLint\">{{ actieVanKmTekst(ongeplandeActie.actie)}}</td>\n <td id=\"ritdetails-oa{{i}}-totKmLint\">{{ actieTotKmTekst(ongeplandeActie.actie)}}</td>\n <td style=\"text-align:right\">\n <button *ngIf=\"editable\"\n id=\"ritdetails-oa{{i}}-del\"\n type=\"button\"\n class=\"loxia-btn loxia-btn-success loxia-btn-sm\"\n (click)=\"voegActieToeAanRit(ongeplandeActie)\"\n [disabled]=\"disableActieKnoppenVanRitdeel\">^\n </button>\n </td>\n </tr>\n </table>\n </div>\n </div>\n <div class=\"knop-pane\">\n <button type=\"button\"\n class=\"loxia-btn loxia-btn-primary loxia-btn-sm\"\n [attr.data-test-id]=\"'plan-all-actions-for-file'\"\n [innerText]=\"'Plan acties hele rit'\"\n (click)=\"planAlleRitActies()\">\n </button>\n </div>\n </div>\n</div>\n", styles: [".panes-container{display:inline;height:100%;border:1px solid black}table{width:100%}th{padding:5px;z-index:1000}td{padding:4px}tr:nth-child(2n){background:#f0f0f0}tr:nth-child(odd){background:#fff}.top-pane{height:45vh;overflow:auto}.actie-pane{height:35vh;overflow:auto}.knop-pane{height:5vh;justify-content:center;display:flex;align-items:center}.panes-container,.panes-separator,.top-pane,.actie-pane{margin:0;padding:0;width:100%}.selected{background:#ffff80!important}.disabled{background:gray!important}.visible-outside-window{background:#87cefa!important}.table-scroll-header-fix tbody{display:block;height:40vh;overflow:auto}.tableFixHead{overflow-y:auto}.tableFixHead thead th{position:sticky;top:0;background-color:#fff}.table{margin-bottom:0}.table td,.table th{border-top:none;border-bottom:none;padding-left:.75em}\n"] }]
245
+ }], ctorParameters: () => [{ type: i1.Store }, { type: i2.SignaleringsBeeldManagerService }], propDecorators: { nietGeplandeActies: [{
246
+ type: Input
247
+ }], focusEmitter: [{
248
+ type: Output
249
+ }], keurAlleActiesGoed: [{
250
+ type: Output
251
+ }] } });
252
+ class RitdeelViewModel {
253
+ constructor(ritdeel, selectedRitdeelClass, isZichtbaar, title, isNietBeschikbaar, isNieuw, vanPrlSpoor, naarPrlSpoor, dwangNummer, pplgString, treinNummer) {
254
+ this.ritdeel = ritdeel;
255
+ this.selectedRitdeelClass = selectedRitdeelClass;
256
+ this.isZichtbaar = isZichtbaar;
257
+ this.title = title;
258
+ this.isNietBeschikbaar = isNietBeschikbaar;
259
+ this.isNieuw = isNieuw;
260
+ this.vanPrlSpoor = vanPrlSpoor;
261
+ this.naarPrlSpoor = naarPrlSpoor;
262
+ this.dwangNummer = dwangNummer;
263
+ this.pplgString = pplgString;
264
+ this.treinNummer = treinNummer;
265
+ }
266
+ }
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicml0ZGVsZW4tbGlqc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXN0LXZpZXdlci9zcmMvbGliL2NvbXBvbmVudHMvcml0ZGVsZW4tbGlqc3Qvcml0ZGVsZW4tbGlqc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXN0LXZpZXdlci9zcmMvbGliL2NvbXBvbmVudHMvcml0ZGVsZW4tbGlqc3Qvcml0ZGVsZW4tbGlqc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQVMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFbkQsT0FBTyxFQUFDLGFBQWEsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBSTdELE9BQU8sS0FBSyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxLQUFLLGVBQWUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV4RSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBU3BELE1BQU0sT0FBTyxzQkFBc0I7SUFrQi9CLFlBQTZCLEtBQTRCLEVBQW1CLFVBQTJDO1FBQTFGLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBQW1CLGVBQVUsR0FBVixVQUFVLENBQWlDO1FBZjdHLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUMzQyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSWxELDBCQUFxQixHQUFZLEVBQUUsQ0FBQztRQUNwQyxv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dHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7ZG9tZWluLCBKc0phdmFVdGlsfSBmcm9tICdAbG94aWEvcmlqd2VnZW4nO1xuaW1wb3J0IHtTdG9yZX0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7T25nZXBsYW5kZUFjdGllfSBmcm9tICcuLi8uLi9tb2RlbC9vbmdlcGxhbmRlLWFjdGllJztcbmltcG9ydCB7Uml0ZGVlbH0gZnJvbSAnLi4vLi4vbW9kZWwvcml0ZGVlbCc7XG5pbXBvcnQge0FjdGllfSBmcm9tICcuLi8uLi9vcHRpbW8nO1xuaW1wb3J0IHtTaWduYWxlcmluZ3NCZWVsZE1hbmFnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zaWduYWxlcmluZ3MtYmVlbGQtbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIE1zdEFjdGlvbnMgZnJvbSAnLi4vLi4vc3RhdGUvYWN0aW9ucy9hY3Rpb25zJztcbmltcG9ydCAqIGFzIFJpdGRlbGVuQWN0aW9ucyBmcm9tICcuLi8uLi9zdGF0ZS9hY3Rpb25zL3JpdGRlbGVuLmFjdGlvbnMnO1xuaW1wb3J0IHtNc3RFZGl0b3JTdGF0ZX0gZnJvbSAnLi4vLi4vc3RhdGUvbXN0LWVkaXRvci1zdGF0ZSc7XG5pbXBvcnQge0FjdGllSGVscGVyfSBmcm9tICcuLi8uLi91dGlsL2FjdGllLWhlbHBlcic7XG5pbXBvcnQge0FycmF5TXVsdGltYXB9IGZyb20gJy4uLy4uL3V0aWwvbXVsdGktbWFwJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdyaXRkZWxlbi1saWpzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3JpdGRlbGVuLWxpanN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9yaXRkZWxlbi1saWpzdC5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdFxufSlcbmV4cG9ydCBjbGFzcyBSaXRkZWxlbkxpanN0Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBuaWV0R2VwbGFuZGVBY3RpZXM6IEFjdGllW107XG5cbiAgICBAT3V0cHV0KCkgZm9jdXNFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxSaXRkZWVsPigpO1xuICAgIEBPdXRwdXQoKSBrZXVyQWxsZUFjdGllc0dvZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICByaXRkZWVsVmlld01vZGVsczogUml0ZGVlbFZpZXdNb2RlbFtdO1xuICAgIHNlbGVjdGVkUml0ZGVlbDogUml0ZGVlbDtcbiAgICBzZWxlY3RlZFJpdGRlZWxBY3RpZXM6IEFjdGllW10gPSBbXTtcbiAgICBzZWxlY3RlZFJpdGRlZWxPbmdlcGxhbmRlQWN0aWVzOiBPbmdlcGxhbmRlQWN0aWVbXSA9IFtdO1xuICAgIGRpc2FibGVBY3RpZUtub3BwZW5WYW5SaXRkZWVsOiBib29sZWFuO1xuICAgIGVkaXRhYmxlOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBvbmdlcGxhbmRlQWN0aWVzTWFwOiBBcnJheU11bHRpbWFwPHN0cmluZywgT25nZXBsYW5kZUFjdGllPjtcbiAgICBwcml2YXRlIGdlcGxhbmRlQWN0aWVzOiBBcnJheU11bHRpbWFwPEFjdGllLCBzdHJpbmc+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTkdfQUNUSUVfUFJFRklYID0gJyogJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBTdG9yZTxNc3RFZGl0b3JTdGF0ZT4sIHByaXZhdGUgcmVhZG9ubHkgc2JtU2VydmljZTogU2lnbmFsZXJpbmdzQmVlbGRNYW5hZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdG9yZS5zZWxlY3QoJ3JpdERlbGVuJykuc3Vic2NyaWJlKChyaXRkZWxlbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yaXRkZWVsVmlld01vZGVscyA9IHJpdGRlbGVuPy5tYXAocml0ZGVlbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSaXRkZWVsVmlld01vZGVsKFxuICAgICAgICAgICAgICAgICAgICByaXRkZWVsLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUml0ZGVlbENsYXNzKHJpdGRlZWwpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUml0ZGVlbFppY2h0YmFhcihyaXRkZWVsKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUaXRsZShyaXRkZWVsKSxcbiAgICAgICAgICAgICAgICAgICAgcml0ZGVlbC5pc05pZXRCZXNjaGlrYmFhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUml0ZGVlbE5pZXV3KHJpdGRlZWwpLFxuICAgICAgICAgICAgICAgICAgICByaXRkZWVsLmdldFZhblBybFNwb29yKCksXG4gICAgICAgICAgICAgICAgICAgIHJpdGRlZWwuZ2V0TmFhclBybFNwb29yVGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICByaXRkZWVsLmdldER3YW5nTnVtbWVyKCksXG4gICAgICAgICAgICAgICAgICAgIHJpdGRlZWwuZ2V0UHBsZ1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRyZWluTnVtbWVyKHJpdGRlZWwpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3RvcmUuc2VsZWN0KCdvbmdlcGxhbmRlQWN0aWVzJykuc3Vic2NyaWJlKGFjdGllcyA9PiB0aGlzLm9uZ2VwbGFuZGVBY3RpZXNNYXAgPSBhY3RpZXMpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3RvcmUuc2VsZWN0KCdnZXBsYW5kZUFjdGllcycpLnN1YnNjcmliZShhY3RpZXMgPT4gdGhpcy5nZXBsYW5kZUFjdGllcyA9IGFjdGllcykpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdG9yZS5zZWxlY3QoJ2VkaXRhYmxlJykuc3Vic2NyaWJlKGVkaXRhYmxlID0+IHRoaXMuZWRpdGFibGUgPSBlZGl0YWJsZSkpO1xuXG4gICAgICAgIC8vIGxpc3RlbiB0byBjaGFuZ2VzIGZyb20gc3ZnLXZpZXdlci1jb21wb25lbnQsIHNhdmluZyByaXRkZWVsIGluIHN0b3JlIGlzbid0IGNvb2wgYmVjYXVzZSBvZiBhbGwgdGhlIGd3dCBpbiBpdC4gVGhpcyBpc1xuICAgICAgICAvLyBqdXN0IHRvIG1ha2UgY2hhbmdlcyB3aXRoaW4gdGhlIGFuZ3VsYXIgbGlmZWN5Y2xlLlxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdG9yZS5zZWxlY3QoJ3NlbGVjdGVkUml0ZGVlbElkJykucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihpZCA9PiAhaWQpKS5zdWJzY3JpYmUodGhpcy5kZXNlbGVjdFJpdGRlZWxcbiAgICAgICAgKSk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KCdyaXREZWxlbicpLFxuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoJ29uZ2VwbGFuZGVBY3RpZXMnKV1cbiAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVPbmdlcGxhbmRlQWN0aWVzTGlzdCgpKSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB9XG5cbiAgICBpc1JpdGRlZWxaaWNodGJhYXIocml0ZGVlbDogUml0ZGVlbCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcml0ZGVlbC5pc1ppY2h0YmFhcigpO1xuICAgIH1cblxuICAgIHRvZ2dsZVJpdGRlZWxaaWNodGJhYXJoZWlkKHJpdGRlZWw6IFJpdGRlZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXNlbGVjdFJpdGRlZWwoKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChSaXRkZWxlbkFjdGlvbnMudG9nZ2xlUml0ZGVlbFppY2h0YmFhcihyaXRkZWVsKSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlWmljaHRiYWFyaGVpZEFsbGVSaXRkZWxlbihjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzZWxlY3RSaXRkZWVsKCk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goUml0ZGVsZW5BY3Rpb25zLnNldFppY2h0YmFhcmhlaWRBbGxlUml0ZGVsZW4oY2hlY2tlZCkpO1xuICAgIH1cblxuICAgIGlzUml0ZGVlbE5pZXV3KHJpdGRlZWw6IFJpdGRlZWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcml0ZGVlbC5pc05pZXV3KCkgPyAnKycgOiAnJztcbiAgICB9XG5cbiAgICBnZXRUaXRsZShyaXRkZWVsOiBSaXRkZWVsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHJpdGRlZWwuZ2V0QmV3ZWdpbmdJZCgpO1xuICAgIH1cblxuICAgIGdldFRyZWluTnVtbWVyKHJpdGRlZWw6IFJpdGRlZWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcml0ZGVlbC5nZXRUcmVpbk51bW1lcigpO1xuICAgIH1cblxuICAgIGRlbGV0ZVJpdGRlZWwocml0ZGVlbDogUml0ZGVlbCk6IHZvaWQge1xuICAgICAgICByaXRkZWVsLmFjdGllcy5mb3JFYWNoKGFjdGllID0+IHtcbiAgICAgICAgICAgIHRoaXMudmVyaHVpc0FjdGllTmFhck9uZ2VwbGFuZChhY3RpZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRlc2VsZWN0Uml0ZGVlbCgpO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFJpdGRlbGVuQWN0aW9ucy5kZWxldGVSaXRkZWVsKHJpdGRlZWwpKTtcbiAgICB9XG5cbiAgICBkZWxldGVBY3RpZXNVaXRSaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSaXRkZWVsLmFjdGllcy5zbGljZSgpLmZvckVhY2goYWN0aWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVBY3RpZVVpdFJpdChhY3RpZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlbGV0ZUFjdGllVWl0Uml0KGFjdGllKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFjdGllcyA9IHRoaXMuc2VsZWN0ZWRSaXRkZWVsLmFjdGllcztcbiAgICAgICAgY29uc3QgaWR4ID0gYWN0aWVzLmluZGV4T2YoYWN0aWUpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVyaHVpc0FjdGllTmFhck9uZ2VwbGFuZChhY3RpZSk7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFJpdGRlbGVuQWN0aW9ucy5kZWxldGVSaXRkZWVsQWN0aWUodGhpcy5zZWxlY3RlZFJpdGRlZWwsIGFjdGllc1tpZHhdKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm5pZXRHZXBsYW5kZUFjdGllcy5pbmRleE9mKGFjdGllKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5uaWV0R2VwbGFuZGVBY3RpZXMucHVzaChhY3RpZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZlcmh1aXNBY3RpZU5hYXJPbmdlcGxhbmQoYWN0aWUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHVpY3MgPSB0aGlzLmdlcGxhbmRlQWN0aWVzLmdldChhY3RpZSk7XG5cbiAgICAgICAgaWYgKHB1aWNzICYmIHB1aWNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goTXN0QWN0aW9ucy5BZGRPbmdlcGxhbmRlQWN0aWUobmV3IE9uZ2VwbGFuZGVBY3RpZShhY3RpZSwgcHVpY3MpKSk7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKE1zdEFjdGlvbnMuRGVsZXRlR2VwbGFuZGVBY3RpZShhY3RpZSwgcHVpY3MpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZvZWdBY3RpZXNUb2VBYW5SaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFjdGllcyA9IHRoaXMuc2VsZWN0ZWRSaXRkZWVsT25nZXBsYW5kZUFjdGllcztcbiAgICAgICAgYWN0aWVzLnNsaWNlKCkuZm9yRWFjaChhY3RpZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZvZWdBY3RpZVRvZUFhblJpdChhY3RpZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZvZWdBY3RpZVRvZUFhblJpdChvbmdlcGxhbmRlQWN0aWU6IE9uZ2VwbGFuZGVBY3RpZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLnNlbGVjdGVkUml0ZGVlbE9uZ2VwbGFuZGVBY3RpZXMuaW5kZXhPZihvbmdlcGxhbmRlQWN0aWUpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goUml0ZGVsZW5BY3Rpb25zLmFkZFJpdGRlZWxBY3RpZSh0aGlzLnNlbGVjdGVkUml0ZGVlbCwgdGhpcy5zZWxlY3RlZFJpdGRlZWxPbmdlcGxhbmRlQWN0aWVzW2lkeF0uYWN0aWUpKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goTXN0QWN0aW9ucy5BZGRHZXBsYW5kZUFjdGllKG9uZ2VwbGFuZGVBY3RpZS5hY3RpZSwgb25nZXBsYW5kZUFjdGllLnB1aWNzKSk7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKE1zdEFjdGlvbnMuRGVsZXRlT25nZXBsYW5kZUFjdGllKG9uZ2VwbGFuZGVBY3RpZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlT25nZXBsYW5kZUFjdGllc0xpc3QoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUml0ZGVlbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJpdGRlZWxPbmdlcGxhbmRlQWN0aWVzID0gW107XG4gICAgICAgICAgICBjb25zdCByaXRQdWljczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJpdGRlZWxUb3BvRWxlbWVudHMgPSBBY3RpZUhlbHBlci5nZXRBY3RpZVRvcG9FbGVtZW50cyh0aGlzLnNlbGVjdGVkUml0ZGVlbCwgdGhpcy5zYm1TZXJ2aWNlKTtcbiAgICAgICAgICAgIGNvbnN0IHdpc3NlbE9iamVjdGVuOiBkb21laW4uV2lzc2VsW10gPSBKc0phdmFVdGlsLmxpc3RUb0FycmF5KHRoaXMuc2VsZWN0ZWRSaXRkZWVsLmdldFJvdXRlKCkuZ2V0V2lzc2VsT2JqZWN0ZW5JbkRlUm91dGUoKSk7XG5cbiAgICAgICAgICAgIHJpdGRlZWxUb3BvRWxlbWVudHMuZm9yRWFjaChlbGVtID0+IHJpdFB1aWNzLnB1c2goZWxlbS5nZXRQdWljKCkpKTtcbiAgICAgICAgICAgIGNvbnN0IG9uZ2VwbGFuZGVBY3RpZXNBcnJheSA9IHRoaXMub25nZXBsYW5kZUFjdGllc01hcC52YWx1ZXMoKTtcbiAgICAgICAgICAgIG9uZ2VwbGFuZGVBY3RpZXNBcnJheS5mb3JFYWNoKG9hID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpZXMgPSB0aGlzLnJpdGRlZWxWaWV3TW9kZWxzLmZsYXRNYXAocmQgPT4gcmQucml0ZGVlbC5hY3RpZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlBZGRlZCA9IGFjdGllcy5maWx0ZXIoYSA9PiBhLmlkID09PSBvYS5hY3RpZS5pZCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlBZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2FNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFjdGllSGVscGVyLmlzVlNUQWN0aWUob2EuYWN0aWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYU1hdGNoID0gdGhpcy5tYXRjaGVkV2lzc2VsTWV0S2FudENvZGVJblZTVEFjdGllKG9hLCB3aXNzZWxPYmplY3RlbikgPyBvYSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYS5wdWljcy5maWx0ZXIocCA9PiByaXRQdWljcy5pbmNsdWRlcyhwKSB8fCB0aGlzLmJldmF0V2lzc2VsUHVpYyhyaXRQdWljcywgcCkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9hTWF0Y2ggPSBvYTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlBZGRlZEFzT25nZXBsYW5kID0gdGhpcy5zZWxlY3RlZFJpdGRlZWxPbmdlcGxhbmRlQWN0aWVzLmZpbHRlcihhID0+IGEuYWN0aWUuaWQgPT09IG9hLmFjdGllLmlkKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2FNYXRjaCAmJiAhYWxyZWFkeUFkZGVkQXNPbmdlcGxhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSaXRkZWVsT25nZXBsYW5kZUFjdGllcy5wdXNoKG9hTWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtYXRjaGVkV2lzc2VsTWV0S2FudENvZGVJblZTVEFjdGllKG9uZ2VwbGFuZGVBY3RpZTogT25nZXBsYW5kZUFjdGllLCB3aXNzZWxzOiBkb21laW4uV2lzc2VsW10pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcHBsZyA9IG9uZ2VwbGFuZGVBY3RpZS5hY3RpZS5wcGxnTmFhbTtcbiAgICAgICAgY29uc3Qgd2lzc2VsS2FudENvZGVzID0gQWN0aWVIZWxwZXIuZ2V0V2lzc2VsS2FudENvZGVzKG9uZ2VwbGFuZGVBY3RpZS5hY3RpZSk7XG5cbiAgICAgICAgbGV0IGdldm9uZGVuV2lzc2VscyA9IDA7XG4gICAgICAgIGxldCBnZXZvbmRlbldpc3NlbEthbnRDb2RlcyA9IDA7XG5cbiAgICAgICAgd2lzc2VsS2FudENvZGVzLmZvckVhY2goKHdpc3NlbEthbnRDb2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBnZXZvbmRlbldpc3NlbCA9IHRoaXMuZmluZFdpc3NlbE9wTmFhbUVuUHBsZyh3aXNzZWxzLCB3aXNzZWxLYW50Q29kZS5uYWFtLCBwcGxnKTtcblxuICAgICAgICAgICAgaWYgKGdldm9uZGVuV2lzc2VsKSB7XG4gICAgICAgICAgICAgICAgZ2V2b25kZW5XaXNzZWxzKys7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0S2FudENvZGUoZ2V2b25kZW5XaXNzZWwuZ2V0U3RhbmQoKSkgPT09IHdpc3NlbEthbnRDb2RlLmthbnRDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldm9uZGVuV2lzc2VsS2FudENvZGVzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZ2V2b25kZW5XaXNzZWxzID4gMCAmJiBnZXZvbmRlbldpc3NlbHMgPT09IGdldm9uZGVuV2lzc2VsS2FudENvZGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFdpc3NlbE9wTmFhbUVuUHBsZyh3aXNzZWxzOiBkb21laW4uV2lzc2VsW10sIHdpc3NlbE5hYW06IHN0cmluZywgcHBsZ05hYW06IHN0cmluZyk6IGRvbWVpbi5XaXNzZWwge1xuICAgICAgICByZXR1cm4gd2lzc2Vscy5maW5kKHdvID0+IHdvLmdldE5hbWUoKSA9PT0gd2lzc2VsTmFhbSAmJiB3by5nZXRQUExHKCkgPT09IHBwbGdOYWFtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJldmF0V2lzc2VsUHVpYyhyaXRQdWljczogc3RyaW5nW10sIHApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJpdFB1aWNzLmluY2x1ZGVzKHRoaXMuc2JtU2VydmljZS5nZXRXaXNzZWxNZXRTdG9yaW5nc2thZGVyUHVpYyhwKT8uZ2V0UHVpYygpKTtcbiAgICB9XG5cbiAgICBzZWxlY3RlZFJpdGRlZWxDbGFzcyhyaXRkZWVsOiBSaXRkZWVsKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHJpdGRlZWwuZ2V0WmljaHRiYWFyaGVpZEJ1aXRlblBhZ2luYXRpZSgpKSB7XG4gICAgICAgICAgICBpZiAocml0ZGVlbC5lcXVhbHModGhpcy5zZWxlY3RlZFJpdGRlZWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzZWxlY3RlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ3Zpc2libGUtb3V0c2lkZS13aW5kb3cnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyaXRkZWVsLmlzTmlldEJlc2NoaWtiYWFyKCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnZGlzYWJsZWQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyaXRkZWVsLmVxdWFscyh0aGlzLnNlbGVjdGVkUml0ZGVlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnc2VsZWN0ZWQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBzZWxlY3RSaXRkZWVsKGV2ZW50OiBNb3VzZUV2ZW50LCByaXRkZWVsOiBSaXRkZWVsKTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudD8uY3RybEtleSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0VtaXR0ZXIuZW1pdChyaXRkZWVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyaXRkZWVsPy5lcXVhbHModGhpcy5zZWxlY3RlZFJpdGRlZWwpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFJpdGRlZWwoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSaXRkZWVsID0gcml0ZGVlbDtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUFjdGllS25vcHBlblZhblJpdGRlZWwgPSAhdGhpcy5zZWxlY3RlZFJpdGRlZWwuaXNaaWNodGJhYXIoKTtcblxuICAgICAgICAgICAgaWYgKHJpdGRlZWwuYWN0aWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJpdGRlZWxBY3RpZXMgPSByaXRkZWVsLmFjdGllcztcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9uZ2VwbGFuZGVBY3RpZXNMaXN0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSaXRkZWVsQWN0aWVzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJpdGRlZWxPbmdlcGxhbmRlQWN0aWVzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhY3RpZU9tc2NocmlqdmluZ1Rla3N0KGFjdGllOiBBY3RpZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuYmVwYWFsUHJlZml4Vm9vckFjdGllT21zY2hyaWp2aW5nKGFjdGllKTtcbiAgICAgICAgaWYgKEFjdGllSGVscGVyLmlzVlNUQWN0aWUoYWN0aWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWFrVnN0QWN0aWVPbXNjaHJpanZpbmcoYWN0aWUsIHByZWZpeCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeCArIGFjdGllLnJpdEFjdGllVHlwZU9tc2NocmlqdmluZztcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hYWtWc3RBY3RpZU9tc2NocmlqdmluZyhhY3RpZTogQWN0aWUsIHByZWZpeDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAkeyBwcmVmaXggfSR7IEFjdGllSGVscGVyLmdldFZTVEFjdGllT21zY2hyaWp2aW5nKGFjdGllKSB9YDtcbiAgICB9XG5cbiAgICBiZXBhYWxQcmVmaXhWb29yQWN0aWVPbXNjaHJpanZpbmcoYWN0aWU6IEFjdGllKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gJyc7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUml0ZGVlbC5hY3RpZXMuaW5jbHVkZXMoYWN0aWUpKSB7XG4gICAgICAgICAgICAvLyBBZndpamtlbmRlIG5hYW0gYmlqIG5pZXQgZ2V2aXN1YWxpc2VlcmRlIGFjdGllIGluIHJpdFxuICAgICAgICAgICAgY29uc3QgcHVpY3MgPSB0aGlzLmdlcGxhbmRlQWN0aWVzLmdldChhY3RpZSk7XG4gICAgICAgICAgICByZXR1cm4gcHVpY3MubGVuZ3RoID4gMCA/IHByZWZpeCA6IHRoaXMuTkdfQUNUSUVfUFJFRklYO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxuXG4gICAgYWN0aWVWYW5LbVRla3N0KGFjdGllOiBBY3RpZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChBY3RpZUhlbHBlci5pc1dpc3NlbFNsaWpwZW5BY3RpZShhY3RpZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhY3RpZS53aXNzZWxOYWFtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3RpZS52YW5LaWxvbWV0ZXJsaW50ID8gYWN0aWUudmFuS2lsb21ldGVybGludCArICcgJyArIGFjdGllLnZhbktpbG9tZXRyZXJpbmcgOiAnLSc7XG4gICAgfVxuXG4gICAgYWN0aWVUb3RLbVRla3N0KGFjdGllOiBBY3RpZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBhY3RpZS50b3RLaWxvbWV0ZXJsaW50ID8gYWN0aWUudG90S2lsb21ldGVybGludCArICcgJyArIGFjdGllLnRvdEtpbG9tZXRyZXJpbmcgOiAnLSc7XG4gICAgfVxuXG4gICAgZGVzZWxlY3RSaXRkZWVsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVBY3RpZUtub3BwZW5WYW5SaXRkZWVsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSaXRkZWVsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUml0ZGVlbEFjdGllcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUml0ZGVlbE9uZ2VwbGFuZGVBY3RpZXMgPSBbXTtcbiAgICB9XG5cbiAgICBnZXRQcGxnU3RyaW5nKHJpdGRlZWw6IFJpdGRlZWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcml0ZGVlbC5nZXRQcGxnU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLYW50Q29kZShzdGFuZDogZG9tZWluLlN0YW5kKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN0YW5kID09PSB3aW5kb3dbJ2RvbWVpbiddLlN0YW5kLkxJTktTKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0wnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnUic7XG4gICAgfVxuXG4gICAgcGxhbkFsbGVSaXRBY3RpZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V1ckFsbGVBY3RpZXNHb2VkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5kZXNlbGVjdFJpdGRlZWwoKTtcbiAgICB9XG59XG5cbmNsYXNzIFJpdGRlZWxWaWV3TW9kZWwge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICByZWFkb25seSByaXRkZWVsOiBSaXRkZWVsLFxuICAgICAgICByZWFkb25seSBzZWxlY3RlZFJpdGRlZWxDbGFzczogc3RyaW5nLFxuICAgICAgICByZWFkb25seSBpc1ppY2h0YmFhcjogYm9vbGVhbixcbiAgICAgICAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZyxcbiAgICAgICAgcmVhZG9ubHkgaXNOaWV0QmVzY2hpa2JhYXI6IGJvb2xlYW4sXG4gICAgICAgIHJlYWRvbmx5IGlzTmlldXc6IHN0cmluZyxcbiAgICAgICAgcmVhZG9ubHkgdmFuUHJsU3Bvb3I6IHN0cmluZyxcbiAgICAgICAgcmVhZG9ubHkgbmFhclBybFNwb29yOiBzdHJpbmcsXG4gICAgICAgIHJlYWRvbmx5IGR3YW5nTnVtbWVyOiBudW1iZXIsXG4gICAgICAgIHJlYWRvbmx5IHBwbGdTdHJpbmc6IHN0cmluZyxcbiAgICAgICAgcmVhZG9ubHkgdHJlaW5OdW1tZXI6IHN0cmluZ1xuICAgICkge1xuICAgIH1cbn1cbiIsIjxkaXYgaWQ9XCJyaXRkZWxlbi1saWpzdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzaWRlYmFyLWhlYWRlclwiPlxuICAgICAgICA8aDMgW2F0dHIuZGF0YS10ZXN0LWlkXT1cIid0aXRsZS1yaXQtZGV0YWlscydcIj5SaXRkZXRhaWxzPC9oMz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFuZXMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcGFuZSB0YWJsZUZpeEhlYWRcIiBpZD1cInRvcC1wYW5lXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFthdHRyLmRhdGEtdGVzdC1pZF09XCIndGFibGUtcml0LWRldGFpbHMnXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI2lucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveCBjb2wtdmlzaWJpbGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVaaWNodGJhYXJoZWlkQWxsZVJpdGRlbGVuKGlucHV0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInJpdGRldGFpbHMtc2VsZWN0ZWVyQWxsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiU2VsZWN0ZWVyIGFsbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3QtaWRdPVwiJ2NoZWNrYm94LWFsbGUtYmV3ZWdpbmdlbidcIj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+VmFuPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+TmFhcjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkRXPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+UFBMRyhzKTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlRyZWlubnIuPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG5cbiAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJpdGRlZWxWaWV3TW9kZWwgb2Ygcml0ZGVlbFZpZXdNb2RlbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7IHNlbGVjdGVkUml0ZGVlbENsYXNzKHJpdGRlZWxWaWV3TW9kZWwucml0ZGVlbCkgfX1cIiBpZD1cInJpdGRldGFpbHMtcnt7aX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInJpdGRldGFpbHMtcnt7aX19LXppY2h0YmFhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0LWlkXT1cIidjaGVja2JveC1yJytpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3ggY29sLXZpc2liaWxpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJpdGRlZWxWaWV3TW9kZWwuaXNaaWNodGJhYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyaXRkZWVsVmlld01vZGVsLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVJpdGRlZWxaaWNodGJhYXJoZWlkKHJpdGRlZWxWaWV3TW9kZWwucml0ZGVlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwicml0ZGVlbFZpZXdNb2RlbC5pc05pZXRCZXNjaGlrYmFhclwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGlkPVwicml0ZGV0YWlscy1ye3tpfX0tZ2V3aWp6aWdkXCIgKGNsaWNrKT1cInNlbGVjdFJpdGRlZWwoJGV2ZW50LCByaXRkZWVsVmlld01vZGVsLnJpdGRlZWwpXCI+e3tyaXRkZWVsVmlld01vZGVsLmlzTmlldXd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBpZD1cInJpdGRldGFpbHMtcnt7aX19LXZhblNwb29yXCIgKGNsaWNrKT1cInNlbGVjdFJpdGRlZWwoJGV2ZW50LCByaXRkZWVsVmlld01vZGVsLnJpdGRlZWwpXCI+e3tyaXRkZWVsVmlld01vZGVsLnZhblBybFNwb29yfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9XCJyaXRkZXRhaWxzLXJ7e2l9fS1uYWFyU3Bvb3JcIiAoY2xpY2spPVwic2VsZWN0Uml0ZGVlbCgkZXZlbnQsIHJpdGRlZWxWaWV3TW9kZWwucml0ZGVlbClcIj57e3JpdGRlZWxWaWV3TW9kZWwubmFhclBybFNwb29yfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9XCJyaXRkZXRhaWxzLXJ7e2l9fS1kd2FuZ051bW1lclwiIChjbGljayk9XCJzZWxlY3RSaXRkZWVsKCRldmVudCwgcml0ZGVlbFZpZXdNb2RlbC5yaXRkZWVsKVwiPnt7cml0ZGVlbFZpZXdNb2RlbC5kd2FuZ051bW1lcn19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGlkPVwicml0ZGV0YWlscy1ye3tpfX0tcHBsZ3NcIiAoY2xpY2spPVwic2VsZWN0Uml0ZGVlbCgkZXZlbnQsIHJpdGRlZWxWaWV3TW9kZWwucml0ZGVlbClcIj57e3JpdGRlZWxWaWV3TW9kZWwucHBsZ1N0cmluZ319PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGlkPVwicml0ZGV0YWlscy1ye3tpfX0tdHJlaW5OdW1tZXJcIiAoY2xpY2spPVwic2VsZWN0Uml0ZGVlbCgkZXZlbnQsIHJpdGRlZWxWaWV3TW9kZWwucml0ZGVlbClcIj57e3JpdGRlZWxWaWV3TW9kZWwudHJlaW5OdW1tZXJ9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246cmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicml0ZGV0YWlscy1ye3tpfX0tZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG94aWEtYnRuIGxveGlhLWJ0bi1kYW5nZXIgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJpdGRlZWwocml0ZGVlbFZpZXdNb2RlbC5yaXRkZWVsKVwiPlhcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aWUtcGFuZVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkUml0ZGVlbCAgJiYgKHNlbGVjdGVkUml0ZGVlbEFjdGllcy5sZW5ndGggPiAwIHx8IHNlbGVjdGVkUml0ZGVlbE9uZ2VwbGFuZGVBY3RpZXMubGVuZ3RoID4gMCkgXCJcbiAgICAgICAgICAgICAgICAgaWQ9XCJhY3RpZS1wYW5lXCI+XG4gICAgICAgICAgICAgICAgPGg0PkdlcGxhbmRlIGFjdGllczwvaDQ+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5BY3RpZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5WYW48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+VG90PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cInNlbGVjdGVkUml0ZGVlbEFjdGllcy5sZW5ndGg9PT0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYnVsa1NldE9uZ2VwbGFuZEJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3QtaWRdPVwiJ3VucGxhbi1hbGwtYWN0aW9ucydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxveGlhLWJ0biBsb3hpYS1idG4tZGFuZ2VyIGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQWN0aWVzVWl0Uml0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVBY3RpZUtub3BwZW5WYW5SaXRkZWVsXCI+WFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cblxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGFjdGllIG9mIHNlbGVjdGVkUml0ZGVlbEFjdGllczsgbGV0IGkgPSBpbmRleFwiIGlkPVwicml0ZGV0YWlscy1he3tpfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBpZD1cInJpdGRldGFpbHMtYXt7aX19LW9tc2NocmlqdmluZ1wiIGNsYXNzPVwibm93cmFwXCI+e3sgYWN0aWVPbXNjaHJpanZpbmdUZWtzdChhY3RpZSkgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPVwicml0ZGV0YWlscy1he3tpfX0tdmFuS21MaW50XCI+e3sgYWN0aWVWYW5LbVRla3N0KGFjdGllKX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBpZD1cInJpdGRldGFpbHMtYXt7aX19LXRvdEttTGludFwiPnt7IGFjdGllVG90S21UZWtzdChhY3RpZSl9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicml0ZGV0YWlscy1he3tpfX0tZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsb3hpYS1idG4gbG94aWEtYnRuLWRhbmdlciBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUFjdGllVWl0Uml0KGFjdGllKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZUFjdGllS25vcHBlblZhblJpdGRlZWxcIj5YXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgPGg0Pk9uZ2VwbGFuZGUgYWN0aWVzPC9oND5cbiAgICAgICAgICAgICAgICA8dGFibGUgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkFjdGllPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlZhbjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5Ub3Q8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwic2VsZWN0ZWRSaXRkZWVsT25nZXBsYW5kZUFjdGllcy5sZW5ndGg9PT0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYnVsa1NldEdlcGxhbmRCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0LWlkXT1cIidwbGFuLWFsbC1hY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG94aWEtYnRuIGxveGlhLWJ0bi1zdWNjZXNzIGxveGlhLWJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidm9lZ0FjdGllc1RvZUFhblJpdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlQWN0aWVLbm9wcGVuVmFuUml0ZGVlbFwiPl5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBvbmdlcGxhbmRlQWN0aWUgb2Ygc2VsZWN0ZWRSaXRkZWVsT25nZXBsYW5kZUFjdGllczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInJpdGRldGFpbHMtb2F7e2l9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPVwicml0ZGV0YWlscy1vYXt7aX19LW9tc2NocmlqdmluZ1wiIGNsYXNzPVwibm93cmFwXCI+e3thY3RpZU9tc2NocmlqdmluZ1Rla3N0KG9uZ2VwbGFuZGVBY3RpZS5hY3RpZSkgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPVwicml0ZGV0YWlscy1vYXt7aX19LXZhbkttTGludFwiPnt7IGFjdGllVmFuS21UZWtzdChvbmdlcGxhbmRlQWN0aWUuYWN0aWUpfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPVwicml0ZGV0YWlscy1vYXt7aX19LXRvdEttTGludFwiPnt7IGFjdGllVG90S21UZWtzdChvbmdlcGxhbmRlQWN0aWUuYWN0aWUpfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInJpdGRldGFpbHMtb2F7e2l9fS1kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxveGlhLWJ0biBsb3hpYS1idG4tc3VjY2VzcyBsb3hpYS1idG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZvZWdBY3RpZVRvZUFhblJpdChvbmdlcGxhbmRlQWN0aWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlQWN0aWVLbm9wcGVuVmFuUml0ZGVlbFwiPl5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImtub3AtcGFuZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsb3hpYS1idG4gbG94aWEtYnRuLXByaW1hcnkgbG94aWEtYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0LWlkXT1cIidwbGFuLWFsbC1hY3Rpb25zLWZvci1maWxlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpbm5lclRleHRdPVwiJ1BsYW4gYWN0aWVzIGhlbGUgcml0J1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwbGFuQWxsZVJpdEFjdGllcygpXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==