@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.
- package/esm2022/generated/openapi/api/api.mjs +23 -0
- package/esm2022/generated/openapi/api/appConfigController.service.mjs +140 -0
- package/esm2022/generated/openapi/api/appConfigController.serviceInterface.mjs +2 -0
- package/esm2022/generated/openapi/api/bewegingController.service.mjs +155 -0
- package/esm2022/generated/openapi/api/bewegingController.serviceInterface.mjs +2 -0
- package/esm2022/generated/openapi/api/class0BuildProperties.service.mjs +140 -0
- package/esm2022/generated/openapi/api/class0BuildProperties.serviceInterface.mjs +2 -0
- package/esm2022/generated/openapi/api/connectorController.service.mjs +146 -0
- package/esm2022/generated/openapi/api/connectorController.serviceInterface.mjs +2 -0
- package/esm2022/generated/openapi/api/logController.service.mjs +150 -0
- package/esm2022/generated/openapi/api/logController.serviceInterface.mjs +2 -0
- package/esm2022/generated/openapi/api/p21Controller.service.mjs +236 -0
- package/esm2022/generated/openapi/api/p21Controller.serviceInterface.mjs +2 -0
- package/esm2022/generated/openapi/api/sbController.service.mjs +202 -0
- package/esm2022/generated/openapi/api/sbController.serviceInterface.mjs +2 -0
- package/esm2022/generated/openapi/api.module.mjs +40 -0
- package/esm2022/generated/openapi/configuration.mjs +99 -0
- package/esm2022/generated/openapi/encoder.mjs +19 -0
- package/esm2022/generated/openapi/index.mjs +7 -0
- package/esm2022/generated/openapi/model/actieDto.mjs +13 -0
- package/esm2022/generated/openapi/model/algemeneRitDto.mjs +13 -0
- package/esm2022/generated/openapi/model/bewegingDto.mjs +2 -0
- package/esm2022/generated/openapi/model/frontendKeycloakConfig.mjs +13 -0
- package/esm2022/generated/openapi/model/frontendProperties.mjs +2 -0
- package/esm2022/generated/openapi/model/logDto.mjs +2 -0
- package/esm2022/generated/openapi/model/models.mjs +10 -0
- package/esm2022/generated/openapi/model/ritRequestDto.mjs +2 -0
- package/esm2022/generated/openapi/model/signaleringsbeeldDto.mjs +13 -0
- package/esm2022/generated/openapi/model/signaleringsbeeldRequestDto.mjs +13 -0
- package/esm2022/generated/openapi/param.mjs +2 -0
- package/esm2022/generated/openapi/variables.mjs +9 -0
- package/esm2022/generated.version.mjs +2 -0
- package/esm2022/lib/atomic-components/message/index.mjs +4 -0
- package/esm2022/lib/atomic-components/message/message.component.mjs +34 -0
- package/esm2022/lib/atomic-components/message/message.mjs +8 -0
- package/esm2022/lib/atomic-components/message/severity.enum.mjs +9 -0
- package/esm2022/lib/atomic-components/messages/messages.component.mjs +20 -0
- package/esm2022/lib/atomic-components/overlay/overlay.component.mjs +11 -0
- package/esm2022/lib/atomic-components/progress-indicator/progress-indicator.component.mjs +11 -0
- package/esm2022/lib/atomic-components/progress-indicator/progress-indicator.entity.mjs +8 -0
- package/esm2022/lib/atomic-components/services/messages.service.mjs +27 -0
- package/esm2022/lib/components/carousel-controls/carousel-controls.component.mjs +40 -0
- package/esm2022/lib/components/mstviewer/mstviewer.component.mjs +110 -0
- package/esm2022/lib/components/ritdelen-lijst/ritdelen-lijst.component.mjs +267 -0
- package/esm2022/lib/components/ritdelen-view/ritdelen-view.component.mjs +103 -0
- package/esm2022/lib/components/rpe/rpe.component.mjs +33 -0
- package/esm2022/lib/components/svg-visualisatie/svg-visualisatie.component.mjs +273 -0
- package/esm2022/lib/components/viewer-controls/viewer-controls.component.mjs +52 -0
- package/esm2022/lib/model/alternatief-rit-deel.mjs +7 -0
- package/esm2022/lib/model/km-range.mjs +39 -0
- package/esm2022/lib/model/melding-event.mjs +7 -0
- package/esm2022/lib/model/nieuwe-route.mjs +10 -0
- package/esm2022/lib/model/ongeplande-actie.mjs +7 -0
- package/esm2022/lib/model/rijwegplan-rijweg-dwang-combinatie.mjs +24 -0
- package/esm2022/lib/model/ritdeel.mjs +205 -0
- package/esm2022/lib/model/sein-op-ritdeel.mjs +7 -0
- package/esm2022/lib/model/wissel-kant-code.mjs +7 -0
- package/esm2022/lib/mst-viewer.module.mjs +143 -0
- package/esm2022/lib/optimo.mjs +9 -0
- package/esm2022/lib/resources/mstlogging.resource.mjs +25 -0
- package/esm2022/lib/resources/signaleringsbeeldinfo.resource.mjs +62 -0
- package/esm2022/lib/services/base-rest.service.mjs +26 -0
- package/esm2022/lib/services/beweging-utils.service.mjs +139 -0
- package/esm2022/lib/services/beweging-verrijker.service.mjs +30 -0
- package/esm2022/lib/services/connector.service.mjs +30 -0
- package/esm2022/lib/services/debug.service.mjs +59 -0
- package/esm2022/lib/services/editor.service.mjs +48 -0
- package/esm2022/lib/services/print-beweging.service.mjs +66 -0
- package/esm2022/lib/services/rit-lezer.service.mjs +104 -0
- package/esm2022/lib/services/signalerings-beeld-manager.service.mjs +92 -0
- package/esm2022/lib/services/viewer-control.service.mjs +104 -0
- package/esm2022/lib/state/actions/actions.mjs +130 -0
- package/esm2022/lib/state/actions/ritdelen.actions.mjs +45 -0
- package/esm2022/lib/state/effect/bepaal-ongeplande-acties.effect.mjs +78 -0
- package/esm2022/lib/state/effect/bepaal-sb-infos.effect.mjs +67 -0
- package/esm2022/lib/state/effect/beweging-invoegen.effect.mjs +73 -0
- package/esm2022/lib/state/effect/delete-ongeplande-actie.effect.mjs +39 -0
- package/esm2022/lib/state/effect/focus-effect.mjs +36 -0
- package/esm2022/lib/state/effect/laad-route-files.effect.mjs +64 -0
- package/esm2022/lib/state/effect/laad-signaleringsbeelden.effect.mjs +363 -0
- package/esm2022/lib/state/effect/rit-goedkeuren.effect.mjs +23 -0
- package/esm2022/lib/state/effect/ritdelen.effect.mjs +112 -0
- package/esm2022/lib/state/effect/svg-view.effect.mjs +48 -0
- package/esm2022/lib/state/mst-editor-state.mjs +89 -0
- package/esm2022/lib/state/reducer/rit-delen.reducer.mjs +62 -0
- package/esm2022/lib/util/actie-helper.mjs +437 -0
- package/esm2022/lib/util/actie-popover-bepaler.mjs +90 -0
- package/esm2022/lib/util/date.service.mjs +17 -0
- package/esm2022/lib/util/logging-helper.mjs +58 -0
- package/esm2022/lib/util/melding-builder.mjs +13 -0
- package/esm2022/lib/util/message-builder.mjs +32 -0
- package/esm2022/lib/util/multi-map.mjs +76 -0
- package/esm2022/lib/util/utils.mjs +35 -0
- package/esm2022/lib/util/zone-util.mjs +32 -0
- package/esm2022/loxia-mst-viewer.mjs +5 -0
- package/esm2022/public-api.mjs +9 -0
- package/esm2022/src/generated/openapi/api/api.mjs +23 -0
- package/esm2022/src/generated/openapi/api/appConfigController.service.mjs +140 -0
- package/esm2022/src/generated/openapi/api/appConfigController.serviceInterface.mjs +2 -0
- package/esm2022/src/generated/openapi/api/bewegingController.service.mjs +155 -0
- package/esm2022/src/generated/openapi/api/bewegingController.serviceInterface.mjs +2 -0
- package/esm2022/src/generated/openapi/api/class0BuildProperties.service.mjs +140 -0
- package/esm2022/src/generated/openapi/api/class0BuildProperties.serviceInterface.mjs +2 -0
- package/esm2022/src/generated/openapi/api/connectorController.service.mjs +146 -0
- package/esm2022/src/generated/openapi/api/connectorController.serviceInterface.mjs +2 -0
- package/esm2022/src/generated/openapi/api/logController.service.mjs +150 -0
- package/esm2022/src/generated/openapi/api/logController.serviceInterface.mjs +2 -0
- package/esm2022/src/generated/openapi/api/p21Controller.service.mjs +236 -0
- package/esm2022/src/generated/openapi/api/p21Controller.serviceInterface.mjs +2 -0
- package/esm2022/src/generated/openapi/api/sbController.service.mjs +202 -0
- package/esm2022/src/generated/openapi/api/sbController.serviceInterface.mjs +2 -0
- package/esm2022/src/generated/openapi/api.module.mjs +40 -0
- package/esm2022/src/generated/openapi/configuration.mjs +99 -0
- package/esm2022/src/generated/openapi/encoder.mjs +19 -0
- package/esm2022/src/generated/openapi/index.mjs +7 -0
- package/esm2022/src/generated/openapi/loxia-mst-viewer-src-generated-openapi.mjs +5 -0
- package/esm2022/src/generated/openapi/model/actieDto.mjs +13 -0
- package/esm2022/src/generated/openapi/model/algemeneRitDto.mjs +13 -0
- package/esm2022/src/generated/openapi/model/bewegingDto.mjs +2 -0
- package/esm2022/src/generated/openapi/model/frontendKeycloakConfig.mjs +13 -0
- package/esm2022/src/generated/openapi/model/frontendProperties.mjs +2 -0
- package/esm2022/src/generated/openapi/model/logDto.mjs +2 -0
- package/esm2022/src/generated/openapi/model/models.mjs +10 -0
- package/esm2022/src/generated/openapi/model/ritRequestDto.mjs +2 -0
- package/esm2022/src/generated/openapi/model/signaleringsbeeldDto.mjs +13 -0
- package/esm2022/src/generated/openapi/model/signaleringsbeeldRequestDto.mjs +13 -0
- package/esm2022/src/generated/openapi/param.mjs +2 -0
- package/esm2022/src/generated/openapi/variables.mjs +9 -0
- package/fesm2022/loxia-mst-viewer-src-generated-openapi.mjs +25 -25
- package/fesm2022/loxia-mst-viewer-src-generated-openapi.mjs.map +1 -1
- package/fesm2022/loxia-mst-viewer.mjs +154 -154
- package/fesm2022/loxia-mst-viewer.mjs.map +1 -1
- package/lib/atomic-components/overlay/overlay.component.d.ts +1 -1
- package/package.json +10 -6
- package/tailwind.scss +1 -1
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { JsJavaUtil } from '@loxia/rijwegen';
|
|
3
|
+
import { KmRange } from '../model/km-range';
|
|
4
|
+
import { WisselKantCode } from '../model/wissel-kant-code';
|
|
5
|
+
import { MeldingBuilder } from './melding-builder';
|
|
6
|
+
import { MessageBuilder } from './message-builder';
|
|
7
|
+
import { ArrayMultimap } from './multi-map';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../services/signalerings-beeld-manager.service";
|
|
10
|
+
import * as i2 from "../resources/mstlogging.resource";
|
|
11
|
+
import * as i3 from "../atomic-components/services/messages.service";
|
|
12
|
+
import * as i4 from "@ngrx/store";
|
|
13
|
+
import * as i5 from "./logging-helper";
|
|
14
|
+
/**
|
|
15
|
+
* export const RIT_ACTIE_1 = 1;
|
|
16
|
+
* export const RIT_ACTIE_SLIJPEN_VIADUCT_KLEIN = 2;
|
|
17
|
+
* export const RIT_ACTIE_SLIJPEN_BOOG = 3;
|
|
18
|
+
*/
|
|
19
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_KLEIN = 4;
|
|
20
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_GROOT = 5;
|
|
21
|
+
/**
|
|
22
|
+
* export const RIT_ACTIE_SLIJPEN_OVERWEG = 6;
|
|
23
|
+
* export const RIT_ACTIE_SLIJPEN_BRUG_GROOT = 7;
|
|
24
|
+
* export const RIT_ACTIE_SLIJPEN_BRUG_KLEIN = 8;
|
|
25
|
+
* export const RIT_ACTIE_SLIJPEN_SPOORTAK = 9;
|
|
26
|
+
*/
|
|
27
|
+
export const RIT_ACTIE_VST = 10;
|
|
28
|
+
/**
|
|
29
|
+
* export const RIT_ACTIE_BVLBLD_T = 11;
|
|
30
|
+
* export const RIT_ACTIE_SLIJPEN_VIADUCT_GROOT = 12;
|
|
31
|
+
* export const RIT_ACTIE_PANTCONT_T = 13;
|
|
32
|
+
* export const RIT_ACTIE_RIJDRLIG_T = 14;
|
|
33
|
+
* export const RIT_ACTIE_SPSTLAPR_T = 15;
|
|
34
|
+
* export const RIT_ACTIE_SPSTOPPDEF_T = 16;
|
|
35
|
+
* export const RIT_ACTIE_SPSTOPPBLD_T = 17;
|
|
36
|
+
* export const RIT_ACTIE_SPSTDEF_T = 18;
|
|
37
|
+
* export const RIT_ACTIE_SPSTDWPR_T = 19;
|
|
38
|
+
* export const RIT_ACTIE_BAANBLD_T = 20;
|
|
39
|
+
* export const RIT_ACTIE_SPGEOM_T = 21;
|
|
40
|
+
* export const RIT_ACTIE_22 = 22;
|
|
41
|
+
* export const RIT_ACTIE_23 = 23;
|
|
42
|
+
* export const RIT_ACTIE_RIJDRDIK_T = 24;
|
|
43
|
+
* export const RIT_ACTIE_SLIJPEN_TUNNEL = 25;
|
|
44
|
+
*/
|
|
45
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_2_KOMMA_5 = 26;
|
|
46
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_29 = 27;
|
|
47
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_20 = 28;
|
|
48
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_18_KOMMA_5 = 29;
|
|
49
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_18 = 30;
|
|
50
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_15 = 31;
|
|
51
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_12 = 32;
|
|
52
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_10 = 33;
|
|
53
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_34_KOMMA_7 = 34;
|
|
54
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_9 = 35;
|
|
55
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_7_KOMMA_5 = 36;
|
|
56
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_7 = 37;
|
|
57
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_6 = 38;
|
|
58
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_5 = 39;
|
|
59
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_4_KOMMA_5 = 40;
|
|
60
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_4 = 41;
|
|
61
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_3_KOMMA_5 = 42;
|
|
62
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_8 = 43;
|
|
63
|
+
export const RIT_ACTIE_SLIJPEN_WISSEL_1_OP_39_KOMMA_1 = 44;
|
|
64
|
+
export class MstKilometrering {
|
|
65
|
+
constructor(kmLint, kmWaarde) {
|
|
66
|
+
this.kmLint = kmLint;
|
|
67
|
+
this.kmWaarde = kmWaarde;
|
|
68
|
+
}
|
|
69
|
+
getKmLint() {
|
|
70
|
+
return this.kmLint;
|
|
71
|
+
}
|
|
72
|
+
getKmWaarde() {
|
|
73
|
+
return this.kmWaarde;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export class ActieHelper {
|
|
77
|
+
static { this.HALF_ENGELS_WISSEL = 'HalveEngelseWissel'; }
|
|
78
|
+
static { this.ENGELS_WISSEL = 'EngelseWissel'; }
|
|
79
|
+
static { this.SLIJPEN_WISSEL_ACTIES = [
|
|
80
|
+
RIT_ACTIE_SLIJPEN_WISSEL_KLEIN,
|
|
81
|
+
RIT_ACTIE_SLIJPEN_WISSEL_GROOT,
|
|
82
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_2_KOMMA_5,
|
|
83
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_29,
|
|
84
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_20,
|
|
85
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_18_KOMMA_5,
|
|
86
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_18,
|
|
87
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_15,
|
|
88
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_12,
|
|
89
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_10,
|
|
90
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_34_KOMMA_7,
|
|
91
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_9,
|
|
92
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_7_KOMMA_5,
|
|
93
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_7,
|
|
94
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_6,
|
|
95
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_5,
|
|
96
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_4_KOMMA_5,
|
|
97
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_4,
|
|
98
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_3_KOMMA_5,
|
|
99
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_8,
|
|
100
|
+
RIT_ACTIE_SLIJPEN_WISSEL_1_OP_39_KOMMA_1
|
|
101
|
+
]; }
|
|
102
|
+
constructor(sbmService, mstLogResource, messagesService, store, loggingHelper) {
|
|
103
|
+
this.sbmService = sbmService;
|
|
104
|
+
this.mstLogResource = mstLogResource;
|
|
105
|
+
this.messagesService = messagesService;
|
|
106
|
+
this.store = store;
|
|
107
|
+
this.loggingHelper = loggingHelper;
|
|
108
|
+
this.store.select('debug').subscribe(debug => this.debug = debug);
|
|
109
|
+
}
|
|
110
|
+
static getActieTopoElements(ritDeel, sbmService) {
|
|
111
|
+
const actieTopoElements = ritDeel.getTopologieElementen().slice();
|
|
112
|
+
const extraTopoElement = ActieHelper.getVoorSectieVanBeginSein(ritDeel, sbmService);
|
|
113
|
+
if (extraTopoElement) {
|
|
114
|
+
actieTopoElements.splice(0, 0, extraTopoElement);
|
|
115
|
+
}
|
|
116
|
+
return actieTopoElements;
|
|
117
|
+
}
|
|
118
|
+
static isVSTActie(actie) {
|
|
119
|
+
return actie.ritActieTypeId === RIT_ACTIE_VST;
|
|
120
|
+
}
|
|
121
|
+
static isWisselSlijpenActie(actie) {
|
|
122
|
+
return this.SLIJPEN_WISSEL_ACTIES.indexOf(actie.ritActieTypeId) >= 0;
|
|
123
|
+
}
|
|
124
|
+
static bepaalTakId(actie) {
|
|
125
|
+
return actie.pplgNaam + '-' + actie.wisselNaam + '-' + actie.wisselKantCode;
|
|
126
|
+
}
|
|
127
|
+
static isHeelOfHalfEngelsWisselActie(actie) {
|
|
128
|
+
return actie.infraObjectType === this.HALF_ENGELS_WISSEL || actie.infraObjectType === this.ENGELS_WISSEL;
|
|
129
|
+
}
|
|
130
|
+
static getVSTActieOmschrijving(actie) {
|
|
131
|
+
if (this.isEngelseWissel(actie)) {
|
|
132
|
+
const wisselNamen = this.getWisselDelen(actie.wisselNaam);
|
|
133
|
+
const kantCodes = this.getKantCodes(actie.wisselKantCode);
|
|
134
|
+
return `VST ${wisselNamen[0]} ${kantCodes[0]} - ${wisselNamen[1]} ${kantCodes[1]}`;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
return `VST ${actie.wisselNaam} ${ActieHelper.getKantcodeTekst(actie.wisselKantCode)}`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
static actieComparator(actie1, actie2) {
|
|
141
|
+
if (actie1.vanKilometrering !== actie2.vanKilometrering) {
|
|
142
|
+
return actie1.vanKilometrering > actie2.vanKilometrering ? 1 : -1;
|
|
143
|
+
}
|
|
144
|
+
if (actie1.ritActieTypeOmschrijving !== actie2.ritActieTypeOmschrijving) {
|
|
145
|
+
return actie1.ritActieTypeOmschrijving > actie2.ritActieTypeOmschrijving ? 1 : -1;
|
|
146
|
+
}
|
|
147
|
+
if (actie1.wisselNaam !== actie2.wisselNaam) {
|
|
148
|
+
return actie1.wisselNaam > actie2.wisselNaam ? 1 : -1;
|
|
149
|
+
}
|
|
150
|
+
if (actie1.wisselKantCode !== actie2.wisselKantCode) {
|
|
151
|
+
return actie1.wisselKantCode > actie2.wisselKantCode ? 1 : -1;
|
|
152
|
+
}
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
static getWisselKantCodes(actie) {
|
|
156
|
+
const wisselKantCodes = [];
|
|
157
|
+
const namen = this.getWisselDelen(actie.wisselNaam);
|
|
158
|
+
const kantCodes = this.getKantCodes(actie.wisselKantCode);
|
|
159
|
+
for (let i = 0; i < namen.length; i++) {
|
|
160
|
+
wisselKantCodes.push(new WisselKantCode(namen[i], kantCodes[i]));
|
|
161
|
+
}
|
|
162
|
+
return wisselKantCodes;
|
|
163
|
+
}
|
|
164
|
+
static getWisselDelen(wisselNaam) {
|
|
165
|
+
return wisselNaam.split('|');
|
|
166
|
+
}
|
|
167
|
+
static getKantCodes(kantCodes) {
|
|
168
|
+
if (kantCodes.length === 2) {
|
|
169
|
+
return [kantCodes.charAt(0), kantCodes.charAt(1)];
|
|
170
|
+
}
|
|
171
|
+
return [kantCodes];
|
|
172
|
+
}
|
|
173
|
+
static getVoorSectieVanBeginSein(ritDeel, sbmService) {
|
|
174
|
+
// RPE toont een rijweg vanaf de sectiescheiding behorend bij het beginsein. MST levert bewegingen waarbij acties gedaan moeten
|
|
175
|
+
// worden tussen het beginsein en de genoemde sectiescheiding. Om deze te kunnen tonen voegen we de voorsectie van het beginsein
|
|
176
|
+
// toe aan de lijst met route elementen.
|
|
177
|
+
const beginRouteSein = ritDeel.getRoute().getBeginSein();
|
|
178
|
+
const sbSein = sbmService.getSBSein(beginRouteSein);
|
|
179
|
+
return sbSein ? sbSein.getVoorSectie() : null;
|
|
180
|
+
}
|
|
181
|
+
// make sure the elems are sorted in ascending order
|
|
182
|
+
static sorteerTopoElementen(topoElems) {
|
|
183
|
+
const topoElementen = topoElems.slice();
|
|
184
|
+
let lint = null;
|
|
185
|
+
let first = null;
|
|
186
|
+
let second = null;
|
|
187
|
+
for (const topoElement of topoElementen) {
|
|
188
|
+
let kilometreringen = null;
|
|
189
|
+
const kms = JsJavaUtil.listToArray(topoElement.getKilometreringen());
|
|
190
|
+
if (kms !== null && kms.length > 0) {
|
|
191
|
+
kilometreringen = kms;
|
|
192
|
+
}
|
|
193
|
+
if (kilometreringen && !first) {
|
|
194
|
+
first = kilometreringen[0].getKmWaarde();
|
|
195
|
+
lint = kilometreringen[0].getKmLint();
|
|
196
|
+
}
|
|
197
|
+
else if (kilometreringen && first && !second) {
|
|
198
|
+
const km = KmRange.getKilometrering(lint, kilometreringen);
|
|
199
|
+
if (km) {
|
|
200
|
+
second = km.getKmWaarde();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (first && second && first > second) {
|
|
204
|
+
topoElementen.reverse();
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return topoElementen;
|
|
209
|
+
}
|
|
210
|
+
static corrigeerTopoElementenZonderKms(topoElementenZonderKms, vanKilometreringen, totKilometreringen, kmRanges) {
|
|
211
|
+
topoElementenZonderKms.forEach(e => {
|
|
212
|
+
if (!vanKilometreringen && totKilometreringen) {
|
|
213
|
+
vanKilometreringen = [new MstKilometrering(totKilometreringen[0].getKmLint(), -100000)];
|
|
214
|
+
}
|
|
215
|
+
if (!totKilometreringen && vanKilometreringen) {
|
|
216
|
+
totKilometreringen = [new MstKilometrering(vanKilometreringen[0].getKmLint(), 100000)];
|
|
217
|
+
}
|
|
218
|
+
if (vanKilometreringen[0] > totKilometreringen[0]) {
|
|
219
|
+
kmRanges.push(KmRange.rangeVoorStrekObject(e, this.addKm(vanKilometreringen, -1), this.addKm(totKilometreringen, 1)));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
kmRanges.push(KmRange.rangeVoorStrekObject(e, this.addKm(vanKilometreringen, 1), this.addKm(totKilometreringen, -1)));
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
static addKm(kms, aantal) {
|
|
227
|
+
const retval = [];
|
|
228
|
+
for (const km of kms) {
|
|
229
|
+
retval.push(new MstKilometrering(km.getKmLint(), km.getKmWaarde() + aantal));
|
|
230
|
+
}
|
|
231
|
+
return retval;
|
|
232
|
+
}
|
|
233
|
+
static kanActiesBepalen(ritdeel) {
|
|
234
|
+
return ritdeel.isZichtbaar() && ritdeel.acties;
|
|
235
|
+
}
|
|
236
|
+
static isKilometreringAanwezig(fragmenten) {
|
|
237
|
+
let aanwezig = false;
|
|
238
|
+
for (const fragment of fragmenten) {
|
|
239
|
+
const kms = JsJavaUtil.listToArray(fragment.getKilometreringen());
|
|
240
|
+
if (kms !== null && kms.length > 0) {
|
|
241
|
+
aanwezig = true;
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return aanwezig;
|
|
246
|
+
}
|
|
247
|
+
static bepaalSpoortakFragmenten(spoortak) {
|
|
248
|
+
return JsJavaUtil.listToArray(spoortak.getTakElementen());
|
|
249
|
+
}
|
|
250
|
+
static bepaalSpoortakFragmentenPuics(fragmenten) {
|
|
251
|
+
const puics = [];
|
|
252
|
+
fragmenten.forEach(deel => puics.push(deel.getPuic()));
|
|
253
|
+
return puics;
|
|
254
|
+
}
|
|
255
|
+
static isEngelseWissel(actie) {
|
|
256
|
+
return actie.wisselNaam.includes('|') && actie.wisselKantCode.length === 2;
|
|
257
|
+
}
|
|
258
|
+
static getKantcodeTekst(kantcode) {
|
|
259
|
+
let tekst = 'Voor';
|
|
260
|
+
if (this.isKantCodeLinks(kantcode)) {
|
|
261
|
+
tekst = 'Links';
|
|
262
|
+
}
|
|
263
|
+
else if (this.isKantCodeRechts(kantcode)) {
|
|
264
|
+
tekst = 'Rechts';
|
|
265
|
+
}
|
|
266
|
+
return tekst;
|
|
267
|
+
}
|
|
268
|
+
static isKantCodeRechts(kantcode) {
|
|
269
|
+
return kantcode === 'R';
|
|
270
|
+
}
|
|
271
|
+
static isKantCodeLinks(kantcode) {
|
|
272
|
+
return kantcode === 'L';
|
|
273
|
+
}
|
|
274
|
+
bepaalPuicsVoorActie(actie) {
|
|
275
|
+
let puics;
|
|
276
|
+
if (ActieHelper.isVSTActie(actie)) {
|
|
277
|
+
puics = this.bepaalPuicsVoorVSTActie(actie);
|
|
278
|
+
}
|
|
279
|
+
else if (ActieHelper.isWisselSlijpenActie(actie)) {
|
|
280
|
+
puics = this.bepaalPuicVoorWisselSlijpenActie(actie);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
puics = this.bepaalActiePuicsVoorSpoortak(actie);
|
|
284
|
+
}
|
|
285
|
+
return puics;
|
|
286
|
+
}
|
|
287
|
+
bepaalActiePuicsUitRitdeel(ritDeel) {
|
|
288
|
+
const map = new ArrayMultimap();
|
|
289
|
+
if (ActieHelper.kanActiesBepalen(ritDeel)) {
|
|
290
|
+
ritDeel.acties.forEach(a => {
|
|
291
|
+
map.putAll(a, this.bepaalPuicsVoorActie(a));
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
return map;
|
|
295
|
+
}
|
|
296
|
+
bepaalActiesPuics(acties, topoElem) {
|
|
297
|
+
const topoElementen = ActieHelper.sorteerTopoElementen(topoElem);
|
|
298
|
+
const kmRanges = this.verwerkTopoElementen(topoElementen);
|
|
299
|
+
return this.verwerkActies(acties, kmRanges);
|
|
300
|
+
}
|
|
301
|
+
verwerkActies(acties, kmRanges) {
|
|
302
|
+
const actieZonderElementen = [];
|
|
303
|
+
const logMeldingDTOs = [];
|
|
304
|
+
const retval = new ArrayMultimap();
|
|
305
|
+
acties.forEach(actie => {
|
|
306
|
+
if (ActieHelper.isWisselSlijpenActie(actie)) {
|
|
307
|
+
const puicArray = this.bepaalPuicVoorWisselSlijpenActie(actie);
|
|
308
|
+
retval.putAll(actie, puicArray);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
const puics = [];
|
|
312
|
+
kmRanges.forEach(kmRange => {
|
|
313
|
+
let vanKilometrering = new MstKilometrering(actie.vanKilometerlint, actie.vanKilometrering);
|
|
314
|
+
let totKilometrering = new MstKilometrering(actie.totKilometerlint, actie.totKilometrering);
|
|
315
|
+
if (actie.vanKilometrering > actie.totKilometrering) {
|
|
316
|
+
const temp = { van: vanKilometrering, tot: totKilometrering };
|
|
317
|
+
vanKilometrering = temp.tot;
|
|
318
|
+
totKilometrering = temp.van;
|
|
319
|
+
}
|
|
320
|
+
if (kmRange.heeftOverlap(vanKilometrering, totKilometrering)) {
|
|
321
|
+
puics.push(kmRange.topologyElement.getPuic());
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
if (puics.length === 0) {
|
|
325
|
+
actieZonderElementen.push(actie.id);
|
|
326
|
+
const melding = MeldingBuilder.actieHighlightError(actieZonderElementen);
|
|
327
|
+
logMeldingDTOs.push(this.loggingHelper.maakLogDTO(melding, actie));
|
|
328
|
+
}
|
|
329
|
+
retval.putAll(actie, puics);
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
this.logLegeMeldingDto(logMeldingDTOs);
|
|
333
|
+
return retval;
|
|
334
|
+
}
|
|
335
|
+
logLegeMeldingDto(logDto) {
|
|
336
|
+
if (logDto.length > 0) {
|
|
337
|
+
return this.mstLogResource.logMessages(logDto);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
verwerkTopoElementen(topoElementen) {
|
|
341
|
+
const kmRanges = [];
|
|
342
|
+
let topoElementenZonderKms = [];
|
|
343
|
+
let laatstePuntKms = null;
|
|
344
|
+
topoElementen.forEach(elem => {
|
|
345
|
+
const kms = JsJavaUtil.listToArray(elem.getKilometreringen());
|
|
346
|
+
if (kms.length > 0) {
|
|
347
|
+
ActieHelper.corrigeerTopoElementenZonderKms(topoElementenZonderKms, laatstePuntKms, kms, kmRanges);
|
|
348
|
+
topoElementenZonderKms = [];
|
|
349
|
+
kmRanges.push(KmRange.rangeVoorPuntObject(elem));
|
|
350
|
+
laatstePuntKms = kms;
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
topoElementenZonderKms.push(elem);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
if (topoElementenZonderKms.length > 0 && laatstePuntKms) {
|
|
357
|
+
ActieHelper.corrigeerTopoElementenZonderKms(topoElementenZonderKms, laatstePuntKms, null, kmRanges);
|
|
358
|
+
}
|
|
359
|
+
return kmRanges;
|
|
360
|
+
}
|
|
361
|
+
bepaalActiePuicsVoorSpoortak(actie) {
|
|
362
|
+
const spoortak = this.sbmService.getSbSpoortak(ActieHelper.bepaalTakId(actie));
|
|
363
|
+
let puics = [];
|
|
364
|
+
if (!spoortak) {
|
|
365
|
+
return puics;
|
|
366
|
+
}
|
|
367
|
+
const fragmenten = ActieHelper.bepaalSpoortakFragmenten(spoortak);
|
|
368
|
+
if (ActieHelper.isKilometreringAanwezig(fragmenten)) {
|
|
369
|
+
const map = this.bepaalActiesPuics([actie], fragmenten);
|
|
370
|
+
for (const key of Array.from(map.keys())) {
|
|
371
|
+
map.get(key).forEach(x => puics.push(x));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
puics = ActieHelper.bepaalSpoortakFragmentenPuics(fragmenten);
|
|
376
|
+
}
|
|
377
|
+
return puics;
|
|
378
|
+
}
|
|
379
|
+
bepaalPuicsVoorVSTActie(actie) {
|
|
380
|
+
if (ActieHelper.isHeelOfHalfEngelsWisselActie(actie)) {
|
|
381
|
+
const retval = [];
|
|
382
|
+
const wisselDelen = ActieHelper.getWisselDelen(actie.wisselNaam);
|
|
383
|
+
const puicsEersteWissel = this.bepaalWisselPuics(wisselDelen[0], actie.pplgNaam, actie.wisselKantCode[0]);
|
|
384
|
+
const puicsTweedeWissel = this.bepaalWisselPuics(wisselDelen[1], actie.pplgNaam, actie.wisselKantCode[1]);
|
|
385
|
+
const puic1 = this.sbmService.getEersteVerbindingPuicVoorSplitEngelseWissel(wisselDelen[0], actie.wisselKantCode[0]);
|
|
386
|
+
if (puic1 !== '') {
|
|
387
|
+
retval.push(puic1);
|
|
388
|
+
}
|
|
389
|
+
const puic2 = this.sbmService.getEersteVerbindingPuicVoorSplitEngelseWissel(wisselDelen[1], actie.wisselKantCode[1]);
|
|
390
|
+
if (puic2 !== '') {
|
|
391
|
+
retval.push(puic2);
|
|
392
|
+
}
|
|
393
|
+
retval.push(...puicsEersteWissel);
|
|
394
|
+
retval.push(...puicsTweedeWissel);
|
|
395
|
+
return retval;
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
return this.bepaalWisselPuics(actie.wisselNaam, actie.pplgNaam, actie.wisselKantCode);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
bepaalWisselPuics(wisselNaam, pplgNaam, kantcode) {
|
|
402
|
+
const wissel = this.sbmService.getSBWissel(wisselNaam, pplgNaam);
|
|
403
|
+
if (!wissel) {
|
|
404
|
+
return [];
|
|
405
|
+
}
|
|
406
|
+
const kantElement = this.bepaalKantElement(kantcode, wissel);
|
|
407
|
+
if (!kantElement) {
|
|
408
|
+
return [];
|
|
409
|
+
}
|
|
410
|
+
const storingSymboolPuic = wissel.getStoringSymboolPuic();
|
|
411
|
+
return [storingSymboolPuic, kantElement.getPuic()];
|
|
412
|
+
}
|
|
413
|
+
bepaalKantElement(kantcode, wissel) {
|
|
414
|
+
if (ActieHelper.isKantCodeRechts(kantcode)) {
|
|
415
|
+
return wissel.getRight();
|
|
416
|
+
}
|
|
417
|
+
if (ActieHelper.isKantCodeLinks(kantcode)) {
|
|
418
|
+
return wissel.getLeft();
|
|
419
|
+
}
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
bepaalPuicVoorWisselSlijpenActie(actie) {
|
|
423
|
+
const storingsSymboolPuic = this.sbmService.getSBWissel(actie.wisselNaam, actie.pplgNaam)?.getStoringSymboolPuic();
|
|
424
|
+
if (!storingsSymboolPuic && this.debug) {
|
|
425
|
+
const melding = MeldingBuilder.actieHighlightError([actie.id]);
|
|
426
|
+
this.messagesService.showMessage(MessageBuilder.actieHighlightError([actie.id]));
|
|
427
|
+
this.mstLogResource.logMessages([this.loggingHelper.maakLogDTO(melding, actie)]);
|
|
428
|
+
}
|
|
429
|
+
return storingsSymboolPuic ? [storingsSymboolPuic] : [];
|
|
430
|
+
}
|
|
431
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ActieHelper, deps: [{ token: i1.SignaleringsBeeldManagerService }, { token: i2.MstLoggingResource }, { token: i3.MessagesService }, { token: i4.Store }, { token: i5.LoggingHelper }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
432
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ActieHelper }); }
|
|
433
|
+
}
|
|
434
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ActieHelper, decorators: [{
|
|
435
|
+
type: Injectable
|
|
436
|
+
}], ctorParameters: () => [{ type: i1.SignaleringsBeeldManagerService }, { type: i2.MstLoggingResource }, { type: i3.MessagesService }, { type: i4.Store }, { type: i5.LoggingHelper }] });
|
|
437
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aWUtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXN0LXZpZXdlci9zcmMvbGliL3V0aWwvYWN0aWUtaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBSXJELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7O0FBSTVDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxDQUFDO0FBQ2hEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUNoQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHLEVBQUUsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLEVBQUUsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLEVBQUUsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0sd0NBQXdDLEdBQUcsRUFBRSxDQUFDO0FBQzNELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLEVBQUUsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRyxFQUFFLENBQUM7QUFDMUQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsRUFBRSxDQUFDO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLEVBQUUsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLENBQUM7QUFDbEQsTUFBTSxDQUFDLE1BQU0sdUNBQXVDLEdBQUcsRUFBRSxDQUFDO0FBQzFELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLEVBQUUsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRyxFQUFFLENBQUM7QUFDMUQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsRUFBRSxDQUFDO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLEVBQUUsQ0FBQztBQUUzRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3pCLFlBQTZCLE1BQWMsRUFBbUIsUUFBZ0I7UUFBakQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFtQixhQUFRLEdBQVIsUUFBUSxDQUFRO0lBQzlFLENBQUM7SUFFRCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQUdELE1BQU0sT0FBTyxXQUFXO2FBQ0osdUJBQWtCLEdBQUcsb0JBQW9CLEFBQXZCLENBQXdCO2FBQzFDLGtCQUFhLEdBQUcsZUFBZSxBQUFsQixDQUFtQjthQUNoQywwQkFBcUIsR0FBRztRQUNwQyw4QkFBOEI7UUFDOUIsOEJBQThCO1FBQzlCLHVDQUF1QztRQUN2QyxnQ0FBZ0M7UUFDaEMsZ0NBQWdDO1FBQ2hDLHdDQUF3QztRQUN4QyxnQ0FBZ0M7UUFDaEMsZ0NBQWdDO1FBQ2hDLGdDQUFnQztRQUNoQyxnQ0FBZ0M7UUFDaEMsd0NBQXdDO1FBQ3hDLCtCQUErQjtRQUMvQix1Q0FBdUM7UUFDdkMsK0JBQStCO1FBQy9CLCtCQUErQjtRQUMvQiwrQkFBK0I7UUFDL0IsdUNBQXVDO1FBQ3ZDLCtCQUErQjtRQUMvQix1Q0FBdUM7UUFDdkMsK0JBQStCO1FBQy9CLHdDQUF3QztLQUFDLEFBckJSLENBcUJTO0lBSTlDLFlBQTZCLFVBQTJDLEVBQzNDLGNBQWtDLEVBQ2xDLGVBQWdDLEVBQ2hDLEtBQTRCLEVBQzVCLGFBQTRCO1FBSjVCLGVBQVUsR0FBVixVQUFVLENBQWlDO1FBQzNDLG1CQUFjLEdBQWQsY0FBYyxDQUFvQjtRQUNsQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsVUFBSyxHQUFMLEtBQUssQ0FBdUI7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU0sTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQWdCLEVBQUUsVUFBMkM7UUFDNUYsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsRSxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEYsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSztRQUNuQixPQUFPLEtBQUssQ0FBQyxjQUFjLEtBQUssYUFBYSxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBSztRQUM3QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLO1FBQ3BCLE9BQU8sS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztJQUNoRixDQUFDO0lBRUQsTUFBTSxDQUFDLDZCQUE2QixDQUFDLEtBQVk7UUFDN0MsT0FBTyxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDN0csQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFZO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sT0FBUSxXQUFXLENBQUMsQ0FBQyxDQUFFLElBQUssU0FBUyxDQUFDLENBQUMsQ0FBRSxNQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUUsSUFBSyxTQUFTLENBQUMsQ0FBQyxDQUFFLEVBQUUsQ0FBQztRQUMvRixDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sT0FBUSxLQUFLLENBQUMsVUFBVyxJQUFLLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFFLEVBQUUsQ0FBQztRQUMvRixDQUFDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBYSxFQUFFLE1BQWE7UUFDdEQsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEtBQUssTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEQsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsS0FBSyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUN0RSxPQUFPLE1BQU0sQ0FBQyx3QkFBd0IsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUMsT0FBTyxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLGNBQWMsS0FBSyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbEQsT0FBTyxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFZO1FBQ2xDLE1BQU0sZUFBZSxHQUFxQixFQUFFLENBQUM7UUFFN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFrQjtRQUNwQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBaUI7UUFDakMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxNQUFNLENBQUMseUJBQXlCLENBQUMsT0FBZ0IsRUFBRSxVQUEyQztRQUNsRywrSEFBK0g7UUFDL0gsZ0lBQWdJO1FBQ2hJLHdDQUF3QztRQUN4QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEQsQ0FBQztJQUVMLG9EQUFvRDtJQUN4QyxNQUFNLENBQUMsb0JBQW9CLENBQUMsU0FBbUM7UUFDbkUsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRWxCLEtBQUssTUFBTSxXQUFXLElBQUksYUFBYSxFQUFFLENBQUM7WUFDdEMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBRTNCLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUNyRSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsZUFBZSxHQUFHLEdBQUcsQ0FBQztZQUMxQixDQUFDO1lBRUQsSUFBSSxlQUFlLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxDQUFDO2lCQUFNLElBQUksZUFBZSxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNMLE1BQU0sR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlCLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxLQUFLLElBQUksTUFBTSxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQztnQkFDcEMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixNQUFNO1lBQ1YsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO0lBRU8sTUFBTSxDQUFDLCtCQUErQixDQUFDLHNCQUFzQixFQUFFLGtCQUEwQyxFQUNsRSxrQkFBMEMsRUFBRSxRQUFtQjtRQUMxRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGtCQUFrQixFQUFFLENBQUM7Z0JBQzVDLGtCQUFrQixHQUFHLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDNUYsQ0FBQztZQUNELElBQUksQ0FBQyxrQkFBa0IsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUM1QyxrQkFBa0IsR0FBRyxDQUFDLElBQUksZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMzRixDQUFDO1lBRUQsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFILENBQUM7aUJBQU0sQ0FBQztnQkFDSixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFILENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQW9CLEVBQUUsTUFBYztRQUNyRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQWdCO1FBQzVDLE9BQU8sT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDbkQsQ0FBQztJQUVPLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxVQUFvQztRQUN2RSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDbEUsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLE1BQU07WUFDVixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsUUFBeUI7UUFDN0QsT0FBTyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxNQUFNLENBQUMsNkJBQTZCLENBQUMsVUFBb0M7UUFDN0UsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBWTtRQUN2QyxPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQWdCO1FBQzVDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ3BCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3pDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDNUMsT0FBTyxRQUFRLEtBQUssR0FBRyxDQUFDO0lBQzVCLENBQUM7SUFFTyxNQUFNLENBQUMsZUFBZSxDQUFDLFFBQWdCO1FBQzNDLE9BQU8sUUFBUSxLQUFLLEdBQUcsQ0FBQztJQUM1QixDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBWTtRQUM3QixJQUFJLEtBQUssQ0FBQztRQUNWLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQzthQUFNLElBQUksV0FBVyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakQsS0FBSyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sQ0FBQztZQUNKLEtBQUssR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxPQUFPO1FBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksYUFBYSxFQUFpQixDQUFDO1FBQy9DLElBQUksV0FBVyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQWUsRUFBRSxRQUEyQjtRQUMxRCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFlLEVBQUUsUUFBbUI7UUFDdEQsTUFBTSxvQkFBb0IsR0FBYSxFQUFFLENBQUM7UUFDMUMsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO1FBRXBDLE1BQU0sTUFBTSxHQUFHLElBQUksYUFBYSxFQUFpQixDQUFDO1FBQ2xELE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxXQUFXLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNwQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNqQixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUN2QixJQUFJLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUM1RixJQUFJLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzt3QkFDbEQsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLENBQUM7d0JBQzlELGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7d0JBQzVCLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQ2hDLENBQUM7b0JBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLEVBQUUsQ0FBQzt3QkFDM0QsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7b0JBQ2xELENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNyQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNwQyxNQUFNLE9BQU8sR0FBaUIsY0FBYyxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLENBQUM7b0JBQ3ZGLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFnQjtRQUN0QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLGFBQXVDO1FBQ2hFLE1BQU0sUUFBUSxHQUFjLEVBQUUsQ0FBQztRQUUvQixJQUFJLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLGNBQWMsR0FBb0IsSUFBSSxDQUFDO1FBQzNDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekIsTUFBTSxHQUFHLEdBQW9CLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUMvRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQyxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7Z0JBQzVCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELGNBQWMsR0FBRyxHQUFHLENBQUM7WUFDekIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7WUFDdEQsV0FBVyxDQUFDLCtCQUErQixDQUFDLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxLQUFZO1FBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUUvRSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLElBQUksV0FBVyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLEtBQUssR0FBRyxXQUFXLENBQUMsNkJBQTZCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxLQUFZO1FBQ3hDLElBQUksV0FBVyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFMUcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyw2Q0FBNkMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JILElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsNkNBQTZDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNySCxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztZQUNsQyxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUYsQ0FBQztJQUNMLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxVQUFrQixFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7UUFDNUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUUxRCxPQUFPLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsTUFBcUI7UUFDN0QsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxXQUFXLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxLQUFZO1FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztRQUNuSCxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JDLE1BQU0sT0FBTyxHQUFpQixjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBQ0QsT0FBTyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUQsQ0FBQzs4R0F2WVEsV0FBVztrSEFBWCxXQUFXOzsyRkFBWCxXQUFXO2tCQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSnNKYXZhVXRpbCwgc2JibGFkIH0gZnJvbSAnQGxveGlhL3JpandlZ2VuJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgTG9nRHRvIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL29wZW5hcGknO1xuaW1wb3J0IHsgTWVzc2FnZXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRvbWljLWNvbXBvbmVudHMvc2VydmljZXMvbWVzc2FnZXMuc2VydmljZSc7XG5pbXBvcnQgeyBLbVJhbmdlIH0gZnJvbSAnLi4vbW9kZWwva20tcmFuZ2UnO1xuaW1wb3J0IHsgTWVsZGluZ0V2ZW50IH0gZnJvbSAnLi4vbW9kZWwvbWVsZGluZy1ldmVudCc7XG5pbXBvcnQgeyBSaXRkZWVsIH0gZnJvbSAnLi4vbW9kZWwvcml0ZGVlbCc7XG5pbXBvcnQgeyBXaXNzZWxLYW50Q29kZSB9IGZyb20gJy4uL21vZGVsL3dpc3NlbC1rYW50LWNvZGUnO1xuaW1wb3J0IHsgQWN0aWUgfSBmcm9tICcuLi9vcHRpbW8nO1xuaW1wb3J0IHsgTXN0TG9nZ2luZ1Jlc291cmNlIH0gZnJvbSAnLi4vcmVzb3VyY2VzL21zdGxvZ2dpbmcucmVzb3VyY2UnO1xuaW1wb3J0IHsgU2lnbmFsZXJpbmdzQmVlbGRNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3NpZ25hbGVyaW5ncy1iZWVsZC1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTXN0RWRpdG9yU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9tc3QtZWRpdG9yLXN0YXRlJztcbmltcG9ydCB7IExvZ2dpbmdIZWxwZXIgfSBmcm9tICcuL2xvZ2dpbmctaGVscGVyJztcbmltcG9ydCB7IE1lbGRpbmdCdWlsZGVyIH0gZnJvbSAnLi9tZWxkaW5nLWJ1aWxkZXInO1xuaW1wb3J0IHsgTWVzc2FnZUJ1aWxkZXIgfSBmcm9tICcuL21lc3NhZ2UtYnVpbGRlcic7XG5pbXBvcnQgeyBBcnJheU11bHRpbWFwIH0gZnJvbSAnLi9tdWx0aS1tYXAnO1xuaW1wb3J0IEtpbG9tZXRyZXJpbmcgPSBzYmJsYWQuS2lsb21ldHJlcmluZztcbmltcG9ydCBUb3BvbG9neUVsZW1lbnQgPSBzYmJsYWQuVG9wb2xvZ3lFbGVtZW50O1xuXG4vKipcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfMSA9IDE7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFX1NMSUpQRU5fVklBRFVDVF9LTEVJTiA9IDI7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFX1NMSUpQRU5fQk9PRyA9IDM7XG4gKi9cbmV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfS0xFSU4gPSA0O1xuZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF9HUk9PVCA9IDU7XG4vKipcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9PVkVSV0VHID0gNjtcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9CUlVHX0dST09UID0gNztcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9CUlVHX0tMRUlOID0gODtcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9TUE9PUlRBSyA9IDk7XG4gKi9cbmV4cG9ydCBjb25zdCBSSVRfQUNUSUVfVlNUID0gMTA7XG4vKipcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfQlZMQkxEX1QgPSAxMTtcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9WSUFEVUNUX0dST09UID0gMTI7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFX1BBTlRDT05UX1QgPSAxMztcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfUklKRFJMSUdfVCA9IDE0O1xuICogZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TUFNUTEFQUl9UID0gMTU7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFX1NQU1RPUFBERUZfVCA9IDE2O1xuICogZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TUFNUT1BQQkxEX1QgPSAxNztcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU1BTVERFRl9UID0gMTg7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFX1NQU1REV1BSX1QgPSAxOTtcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfQkFBTkJMRF9UID0gMjA7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFX1NQR0VPTV9UID0gMjE7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFXzIyID0gMjI7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFXzIzID0gMjM7XG4gKiBleHBvcnQgY29uc3QgUklUX0FDVElFX1JJSkRSRElLX1QgPSAyNDtcbiAqIGV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9UVU5ORUwgPSAyNTtcbiAqL1xuZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzJfS09NTUFfNSA9IDI2O1xuZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzI5ID0gMjc7XG5leHBvcnQgY29uc3QgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfMjAgPSAyODtcbmV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF8xOF9LT01NQV81ID0gMjk7XG5leHBvcnQgY29uc3QgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfMTggPSAzMDtcbmV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF8xNSA9IDMxO1xuZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzEyID0gMzI7XG5leHBvcnQgY29uc3QgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfMTAgPSAzMztcbmV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF8zNF9LT01NQV83ID0gMzQ7XG5leHBvcnQgY29uc3QgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfOSA9IDM1O1xuZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzdfS09NTUFfNSA9IDM2O1xuZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzcgPSAzNztcbmV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF82ID0gMzg7XG5leHBvcnQgY29uc3QgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfNSA9IDM5O1xuZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzRfS09NTUFfNSA9IDQwO1xuZXhwb3J0IGNvbnN0IFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzQgPSA0MTtcbmV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF8zX0tPTU1BXzUgPSA0MjtcbmV4cG9ydCBjb25zdCBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF84ID0gNDM7XG5leHBvcnQgY29uc3QgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfMzlfS09NTUFfMSA9IDQ0O1xuXG5leHBvcnQgY2xhc3MgTXN0S2lsb21ldHJlcmluZyBpbXBsZW1lbnRzIHNiYmxhZC5LaWxvbWV0cmVyaW5nIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGttTGludDogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IGttV2FhcmRlOiBudW1iZXIpIHtcbiAgICB9XG5cbiAgICBnZXRLbUxpbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua21MaW50O1xuICAgIH1cblxuICAgIGdldEttV2FhcmRlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmttV2FhcmRlO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFjdGllSGVscGVyIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgSEFMRl9FTkdFTFNfV0lTU0VMID0gJ0hhbHZlRW5nZWxzZVdpc3NlbCc7XG4gICAgc3RhdGljIHJlYWRvbmx5IEVOR0VMU19XSVNTRUwgPSAnRW5nZWxzZVdpc3NlbCc7XG4gICAgc3RhdGljIHJlYWRvbmx5IFNMSUpQRU5fV0lTU0VMX0FDVElFUyA9IFtcbiAgICAgICAgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMX0tMRUlOLFxuICAgICAgICBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfR1JPT1QsXG4gICAgICAgIFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzJfS09NTUFfNSxcbiAgICAgICAgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfMjksXG4gICAgICAgIFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzIwLFxuICAgICAgICBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF8xOF9LT01NQV81LFxuICAgICAgICBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF8xOCxcbiAgICAgICAgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfMTUsXG4gICAgICAgIFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzEyLFxuICAgICAgICBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF8xMCxcbiAgICAgICAgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfMzRfS09NTUFfNyxcbiAgICAgICAgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfOSxcbiAgICAgICAgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfN19LT01NQV81LFxuICAgICAgICBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF83LFxuICAgICAgICBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF82LFxuICAgICAgICBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF81LFxuICAgICAgICBSSVRfQUNUSUVfU0xJSlBFTl9XSVNTRUxfMV9PUF80X0tPTU1BXzUsXG4gICAgICAgIFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzQsXG4gICAgICAgIFJJVF9BQ1RJRV9TTElKUEVOX1dJU1NFTF8xX09QXzNfS09NTUFfNSxcbiAgICAgICAgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfOCxcbiAgICAgICAgUklUX0FDVElFX1NMSUpQRU5fV0lTU0VMXzFfT1BfMzlfS09NTUFfMV07XG5cbiAgICBwcml2YXRlIGRlYnVnOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzYm1TZXJ2aWNlOiBTaWduYWxlcmluZ3NCZWVsZE1hbmFnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbXN0TG9nUmVzb3VyY2U6IE1zdExvZ2dpbmdSZXNvdXJjZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VzU2VydmljZTogTWVzc2FnZXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU6IFN0b3JlPE1zdEVkaXRvclN0YXRlPixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dpbmdIZWxwZXI6IExvZ2dpbmdIZWxwZXIpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoJ2RlYnVnJykuc3Vic2NyaWJlKGRlYnVnID0+IHRoaXMuZGVidWcgPSBkZWJ1Zyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBY3RpZVRvcG9FbGVtZW50cyhyaXREZWVsOiBSaXRkZWVsLCBzYm1TZXJ2aWNlOiBTaWduYWxlcmluZ3NCZWVsZE1hbmFnZXJTZXJ2aWNlKTogVG9wb2xvZ3lFbGVtZW50W10ge1xuICAgICAgICBjb25zdCBhY3RpZVRvcG9FbGVtZW50cyA9IHJpdERlZWwuZ2V0VG9wb2xvZ2llRWxlbWVudGVuKCkuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgZXh0cmFUb3BvRWxlbWVudCA9IEFjdGllSGVscGVyLmdldFZvb3JTZWN0aWVWYW5CZWdpblNlaW4ocml0RGVlbCwgc2JtU2VydmljZSk7XG4gICAgICAgIGlmIChleHRyYVRvcG9FbGVtZW50KSB7XG4gICAgICAgICAgICBhY3RpZVRvcG9FbGVtZW50cy5zcGxpY2UoMCwgMCwgZXh0cmFUb3BvRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjdGllVG9wb0VsZW1lbnRzO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc1ZTVEFjdGllKGFjdGllKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhY3RpZS5yaXRBY3RpZVR5cGVJZCA9PT0gUklUX0FDVElFX1ZTVDtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNXaXNzZWxTbGlqcGVuQWN0aWUoYWN0aWUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuU0xJSlBFTl9XSVNTRUxfQUNUSUVTLmluZGV4T2YoYWN0aWUucml0QWN0aWVUeXBlSWQpID49IDA7XG4gICAgfVxuXG4gICAgc3RhdGljIGJlcGFhbFRha0lkKGFjdGllKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGFjdGllLnBwbGdOYWFtICsgJy0nICsgYWN0aWUud2lzc2VsTmFhbSArICctJyArIGFjdGllLndpc3NlbEthbnRDb2RlO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc0hlZWxPZkhhbGZFbmdlbHNXaXNzZWxBY3RpZShhY3RpZTogQWN0aWUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGFjdGllLmluZnJhT2JqZWN0VHlwZSA9PT0gdGhpcy5IQUxGX0VOR0VMU19XSVNTRUwgfHwgYWN0aWUuaW5mcmFPYmplY3RUeXBlID09PSB0aGlzLkVOR0VMU19XSVNTRUw7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFZTVEFjdGllT21zY2hyaWp2aW5nKGFjdGllOiBBY3RpZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5nZWxzZVdpc3NlbChhY3RpZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpc3NlbE5hbWVuID0gdGhpcy5nZXRXaXNzZWxEZWxlbihhY3RpZS53aXNzZWxOYWFtKTtcbiAgICAgICAgICAgIGNvbnN0IGthbnRDb2RlcyA9IHRoaXMuZ2V0S2FudENvZGVzKGFjdGllLndpc3NlbEthbnRDb2RlKTtcbiAgICAgICAgICAgIHJldHVybiBgVlNUICR7IHdpc3NlbE5hbWVuWzBdIH0gJHsga2FudENvZGVzWzBdIH0gLSAkeyB3aXNzZWxOYW1lblsxXSB9ICR7IGthbnRDb2Rlc1sxXSB9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgVlNUICR7IGFjdGllLndpc3NlbE5hYW0gfSAkeyBBY3RpZUhlbHBlci5nZXRLYW50Y29kZVRla3N0KGFjdGllLndpc3NlbEthbnRDb2RlKSB9YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWN0aWVDb21wYXJhdG9yKGFjdGllMTogQWN0aWUsIGFjdGllMjogQWN0aWUpOiBudW1iZXIge1xuICAgICAgICBpZiAoYWN0aWUxLnZhbktpbG9tZXRyZXJpbmcgIT09IGFjdGllMi52YW5LaWxvbWV0cmVyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aWUxLnZhbktpbG9tZXRyZXJpbmcgPiBhY3RpZTIudmFuS2lsb21ldHJlcmluZyA/IDEgOiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aWUxLnJpdEFjdGllVHlwZU9tc2NocmlqdmluZyAhPT0gYWN0aWUyLnJpdEFjdGllVHlwZU9tc2NocmlqdmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGllMS5yaXRBY3RpZVR5cGVPbXNjaHJpanZpbmcgPiBhY3RpZTIucml0QWN0aWVUeXBlT21zY2hyaWp2aW5nID8gMSA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3RpZTEud2lzc2VsTmFhbSAhPT0gYWN0aWUyLndpc3NlbE5hYW0pIHtcbiAgICAgICAgICAgIHJldHVybiBhY3RpZTEud2lzc2VsTmFhbSA+IGFjdGllMi53aXNzZWxOYWFtID8gMSA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3RpZTEud2lzc2VsS2FudENvZGUgIT09IGFjdGllMi53aXNzZWxLYW50Q29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGllMS53aXNzZWxLYW50Q29kZSA+IGFjdGllMi53aXNzZWxLYW50Q29kZSA/IDEgOiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0V2lzc2VsS2FudENvZGVzKGFjdGllOiBBY3RpZSk6IFdpc3NlbEthbnRDb2RlW10ge1xuICAgICAgICBjb25zdCB3aXNzZWxLYW50Q29kZXM6IFdpc3NlbEthbnRDb2RlW10gPSBbXTtcblxuICAgICAgICBjb25zdCBuYW1lbiA9IHRoaXMuZ2V0V2lzc2VsRGVsZW4oYWN0aWUud2lzc2VsTmFhbSk7XG4gICAgICAgIGNvbnN0IGthbnRDb2RlcyA9IHRoaXMuZ2V0S2FudENvZGVzKGFjdGllLndpc3NlbEthbnRDb2RlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgd2lzc2VsS2FudENvZGVzLnB1c2gobmV3IFdpc3NlbEthbnRDb2RlKG5hbWVuW2ldLCBrYW50Q29kZXNbaV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3aXNzZWxLYW50Q29kZXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFdpc3NlbERlbGVuKHdpc3NlbE5hYW06IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHdpc3NlbE5hYW0uc3BsaXQoJ3wnKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0S2FudENvZGVzKGthbnRDb2Rlczogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAoa2FudENvZGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIFtrYW50Q29kZXMuY2hhckF0KDApLCBrYW50Q29kZXMuY2hhckF0KDEpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2thbnRDb2Rlc107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Vm9vclNlY3RpZVZhbkJlZ2luU2VpbihyaXREZWVsOiBSaXRkZWVsLCBzYm1TZXJ2aWNlOiBTaWduYWxlcmluZ3NCZWVsZE1hbmFnZXJTZXJ2aWNlKTogVG9wb2xvZ3lFbGVtZW50IHtcbiAgICAgICAgLy8gUlBFIHRvb250IGVlbiByaWp3ZWcgdmFuYWYgZGUgc2VjdGllc2NoZWlkaW5nIGJlaG9yZW5kIGJpaiBoZXQgYmVnaW5zZWluLiBNU1QgbGV2ZXJ0IGJld2VnaW5nZW4gd2FhcmJpaiBhY3RpZXMgZ2VkYWFuIG1vZXRlblxuICAgICAgICAvLyB3b3JkZW4gdHVzc2VuIGhldCBiZWdpbnNlaW4gZW4gZGUgZ2Vub2VtZGUgc2VjdGllc2NoZWlkaW5nLiBPbSBkZXplIHRlIGt1bm5lbiB0b25lbiB2b2VnZW4gd2UgZGUgdm9vcnNlY3RpZSB2YW4gaGV0IGJlZ2luc2VpblxuICAgICAgICAvLyB0b2UgYWFuIGRlIGxpanN0IG1ldCByb3V0ZSBlbGVtZW50ZW4uXG4gICAgICAgIGNvbnN0IGJlZ2luUm91dGVTZWluID0gcml0RGVlbC5nZXRSb3V0ZSgpLmdldEJlZ2luU2VpbigpO1xuICAgICAgICBjb25zdCBzYlNlaW4gPSBzYm1TZXJ2aWNlLmdldFNCU2VpbihiZWdpblJvdXRlU2Vpbik7XG4gICAgICAgIHJldHVybiBzYlNlaW4gPyBzYlNlaW4uZ2V0Vm9vclNlY3RpZSgpIDogbnVsbDtcbiAgICB9XG5cbi8vIG1ha2Ugc3VyZSB0aGUgZWxlbXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXJcbiAgICBwcml2YXRlIHN0YXRpYyBzb3J0ZWVyVG9wb0VsZW1lbnRlbih0b3BvRWxlbXM6IHNiYmxhZC5Ub3BvbG9neUVsZW1lbnRbXSk6IHNiYmxhZC5Ub3BvbG9neUVsZW1lbnRbXSB7XG4gICAgICAgIGNvbnN0IHRvcG9FbGVtZW50ZW4gPSB0b3BvRWxlbXMuc2xpY2UoKTtcbiAgICAgICAgbGV0IGxpbnQgPSBudWxsO1xuICAgICAgICBsZXQgZmlyc3QgPSBudWxsO1xuICAgICAgICBsZXQgc2Vjb25kID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IHRvcG9FbGVtZW50IG9mIHRvcG9FbGVtZW50ZW4pIHtcbiAgICAgICAgICAgIGxldCBraWxvbWV0cmVyaW5nZW4gPSBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBrbXMgPSBKc0phdmFVdGlsLmxpc3RUb0FycmF5KHRvcG9FbGVtZW50LmdldEtpbG9tZXRyZXJpbmdlbigpKTtcbiAgICAgICAgICAgIGlmIChrbXMgIT09IG51bGwgJiYga21zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBraWxvbWV0cmVyaW5nZW4gPSBrbXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChraWxvbWV0cmVyaW5nZW4gJiYgIWZpcnN0KSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPSBraWxvbWV0cmVyaW5nZW5bMF0uZ2V0S21XYWFyZGUoKTtcbiAgICAgICAgICAgICAgICBsaW50ID0ga2lsb21ldHJlcmluZ2VuWzBdLmdldEttTGludCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChraWxvbWV0cmVyaW5nZW4gJiYgZmlyc3QgJiYgIXNlY29uZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGttID0gS21SYW5nZS5nZXRLaWxvbWV0cmVyaW5nKGxpbnQsIGtpbG9tZXRyZXJpbmdlbik7XG4gICAgICAgICAgICAgICAgaWYgKGttKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IGttLmdldEttV2FhcmRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCAmJiBmaXJzdCA+IHNlY29uZCkge1xuICAgICAgICAgICAgICAgIHRvcG9FbGVtZW50ZW4ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b3BvRWxlbWVudGVuO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvcnJpZ2VlclRvcG9FbGVtZW50ZW5ab25kZXJLbXModG9wb0VsZW1lbnRlblpvbmRlckttcywgdmFuS2lsb21ldHJlcmluZ2VuOiBzYmJsYWQuS2lsb21ldHJlcmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90S2lsb21ldHJlcmluZ2VuOiBzYmJsYWQuS2lsb21ldHJlcmluZ1tdLCBrbVJhbmdlczogS21SYW5nZVtdKTogdm9pZCB7XG4gICAgICAgIHRvcG9FbGVtZW50ZW5ab25kZXJLbXMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgIGlmICghdmFuS2lsb21ldHJlcmluZ2VuICYmIHRvdEtpbG9tZXRyZXJpbmdlbikge1xuICAgICAgICAgICAgICAgIHZhbktpbG9tZXRyZXJpbmdlbiA9IFtuZXcgTXN0S2lsb21ldHJlcmluZyh0b3RLaWxvbWV0cmVyaW5nZW5bMF0uZ2V0S21MaW50KCksIC0xMDAwMDApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdG90S2lsb21ldHJlcmluZ2VuICYmIHZhbktpbG9tZXRyZXJpbmdlbikge1xuICAgICAgICAgICAgICAgIHRvdEtpbG9tZXRyZXJpbmdlbiA9IFtuZXcgTXN0S2lsb21ldHJlcmluZyh2YW5LaWxvbWV0cmVyaW5nZW5bMF0uZ2V0S21MaW50KCksIDEwMDAwMCldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFuS2lsb21ldHJlcmluZ2VuWzBdID4gdG90S2lsb21ldHJlcmluZ2VuWzBdKSB7XG4gICAgICAgICAgICAgICAga21SYW5nZXMucHVzaChLbVJhbmdlLnJhbmdlVm9vclN0cmVrT2JqZWN0KGUsIHRoaXMuYWRkS20odmFuS2lsb21ldHJlcmluZ2VuLCAtMSksIHRoaXMuYWRkS20odG90S2lsb21ldHJlcmluZ2VuLCAxKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBrbVJhbmdlcy5wdXNoKEttUmFuZ2UucmFuZ2VWb29yU3RyZWtPYmplY3QoZSwgdGhpcy5hZGRLbSh2YW5LaWxvbWV0cmVyaW5nZW4sIDEpLCB0aGlzLmFkZEttKHRvdEtpbG9tZXRyZXJpbmdlbiwgLTEpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFkZEttKGttczogS2lsb21ldHJlcmluZ1tdLCBhYW50YWw6IG51bWJlcik6IEtpbG9tZXRyZXJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHJldHZhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGttIG9mIGttcykge1xuICAgICAgICAgICAgcmV0dmFsLnB1c2gobmV3IE1zdEtpbG9tZXRyZXJpbmcoa20uZ2V0S21MaW50KCksIGttLmdldEttV2FhcmRlKCkgKyBhYW50YWwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0dmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGthbkFjdGllc0JlcGFsZW4ocml0ZGVlbDogUml0ZGVlbCk6IEFjdGllW10ge1xuICAgICAgICByZXR1cm4gcml0ZGVlbC5pc1ppY2h0YmFhcigpICYmIHJpdGRlZWwuYWN0aWVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzS2lsb21ldHJlcmluZ0FhbndlemlnKGZyYWdtZW50ZW46IHNiYmxhZC5Ub3BvbG9neUVsZW1lbnRbXSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgYWFud2V6aWcgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudGVuKSB7XG4gICAgICAgICAgICBjb25zdCBrbXMgPSBKc0phdmFVdGlsLmxpc3RUb0FycmF5KGZyYWdtZW50LmdldEtpbG9tZXRyZXJpbmdlbigpKTtcbiAgICAgICAgICAgIGlmIChrbXMgIT09IG51bGwgJiYga21zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhYW53ZXppZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFhbndlemlnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGJlcGFhbFNwb29ydGFrRnJhZ21lbnRlbihzcG9vcnRhazogc2JibGFkLlNwb29ydGFrKTogc2JibGFkLlRvcG9sb2d5RWxlbWVudFtdIHtcbiAgICAgICAgcmV0dXJuIEpzSmF2YVV0aWwubGlzdFRvQXJyYXkoc3Bvb3J0YWsuZ2V0VGFrRWxlbWVudGVuKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGJlcGFhbFNwb29ydGFrRnJhZ21lbnRlblB1aWNzKGZyYWdtZW50ZW46IHNiYmxhZC5Ub3BvbG9neUVsZW1lbnRbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgcHVpY3MgPSBbXTtcbiAgICAgICAgZnJhZ21lbnRlbi5mb3JFYWNoKGRlZWwgPT4gcHVpY3MucHVzaChkZWVsLmdldFB1aWMoKSkpO1xuICAgICAgICByZXR1cm4gcHVpY3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFbmdlbHNlV2lzc2VsKGFjdGllOiBBY3RpZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gYWN0aWUud2lzc2VsTmFhbS5pbmNsdWRlcygnfCcpICYmIGFjdGllLndpc3NlbEthbnRDb2RlLmxlbmd0aCA9PT0gMjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRLYW50Y29kZVRla3N0KGthbnRjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgdGVrc3QgPSAnVm9vcic7XG4gICAgICAgIGlmICh0aGlzLmlzS2FudENvZGVMaW5rcyhrYW50Y29kZSkpIHtcbiAgICAgICAgICAgIHRla3N0ID0gJ0xpbmtzJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzS2FudENvZGVSZWNodHMoa2FudGNvZGUpKSB7XG4gICAgICAgICAgICB0ZWtzdCA9ICdSZWNodHMnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZWtzdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0thbnRDb2RlUmVjaHRzKGthbnRjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGthbnRjb2RlID09PSAnUic7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNLYW50Q29kZUxpbmtzKGthbnRjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGthbnRjb2RlID09PSAnTCc7XG4gICAgfVxuXG4gICAgYmVwYWFsUHVpY3NWb29yQWN0aWUoYWN0aWU6IEFjdGllKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcHVpY3M7XG4gICAgICAgIGlmIChBY3RpZUhlbHBlci5pc1ZTVEFjdGllKGFjdGllKSkge1xuICAgICAgICAgICAgcHVpY3MgPSB0aGlzLmJlcGFhbFB1aWNzVm9vclZTVEFjdGllKGFjdGllKTtcbiAgICAgICAgfSBlbHNlIGlmIChBY3RpZUhlbHBlci5pc1dpc3NlbFNsaWpwZW5BY3RpZShhY3RpZSkpIHtcbiAgICAgICAgICAgIHB1aWNzID0gdGhpcy5iZXBhYWxQdWljVm9vcldpc3NlbFNsaWpwZW5BY3RpZShhY3RpZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwdWljcyA9IHRoaXMuYmVwYWFsQWN0aWVQdWljc1Zvb3JTcG9vcnRhayhhY3RpZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHB1aWNzO1xuICAgIH1cblxuICAgIGJlcGFhbEFjdGllUHVpY3NVaXRSaXRkZWVsKHJpdERlZWwpOiBBcnJheU11bHRpbWFwPEFjdGllLCBzdHJpbmc+IHsvLyB2b29yIGhpZ2hsaWdodHNcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IEFycmF5TXVsdGltYXA8QWN0aWUsIHN0cmluZz4oKTtcbiAgICAgICAgaWYgKEFjdGllSGVscGVyLmthbkFjdGllc0JlcGFsZW4ocml0RGVlbCkpIHtcbiAgICAgICAgICAgIHJpdERlZWwuYWN0aWVzLmZvckVhY2goYSA9PiB7XG4gICAgICAgICAgICAgICAgbWFwLnB1dEFsbChhLCB0aGlzLmJlcGFhbFB1aWNzVm9vckFjdGllKGEpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuXG4gICAgYmVwYWFsQWN0aWVzUHVpY3MoYWN0aWVzOiBBY3RpZVtdLCB0b3BvRWxlbTogVG9wb2xvZ3lFbGVtZW50W10pOiBBcnJheU11bHRpbWFwPEFjdGllLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgdG9wb0VsZW1lbnRlbiA9IEFjdGllSGVscGVyLnNvcnRlZXJUb3BvRWxlbWVudGVuKHRvcG9FbGVtKTtcblxuICAgICAgICBjb25zdCBrbVJhbmdlcyA9IHRoaXMudmVyd2Vya1RvcG9FbGVtZW50ZW4odG9wb0VsZW1lbnRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcndlcmtBY3RpZXMoYWN0aWVzLCBrbVJhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2ZXJ3ZXJrQWN0aWVzKGFjdGllczogQWN0aWVbXSwga21SYW5nZXM6IEttUmFuZ2VbXSk6IEFycmF5TXVsdGltYXA8QWN0aWUsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBhY3RpZVpvbmRlckVsZW1lbnRlbjogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgY29uc3QgbG9nTWVsZGluZ0RUT3M6IExvZ0R0b1tdID0gW107XG5cbiAgICAgICAgY29uc3QgcmV0dmFsID0gbmV3IEFycmF5TXVsdGltYXA8QWN0aWUsIHN0cmluZz4oKTtcbiAgICAgICAgYWN0aWVzLmZvckVhY2goYWN0aWUgPT4ge1xuICAgICAgICAgICAgaWYgKEFjdGllSGVscGVyLmlzV2lzc2VsU2xpanBlbkFjdGllKGFjdGllKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1aWNBcnJheSA9IHRoaXMuYmVwYWFsUHVpY1Zvb3JXaXNzZWxTbGlqcGVuQWN0aWUoYWN0aWUpO1xuICAgICAgICAgICAgICAgIHJldHZhbC5wdXRBbGwoYWN0aWUsIHB1aWNBcnJheSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1aWNzID0gW107XG4gICAgICAgICAgICAgICAga21SYW5nZXMuZm9yRWFjaChrbVJhbmdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbktpbG9tZXRyZXJpbmcgPSBuZXcgTXN0S2lsb21ldHJlcmluZyhhY3RpZS52YW5LaWxvbWV0ZXJsaW50LCBhY3RpZS52YW5LaWxvbWV0cmVyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdEtpbG9tZXRyZXJpbmcgPSBuZXcgTXN0S2lsb21ldHJlcmluZyhhY3RpZS50b3RLaWxvbWV0ZXJsaW50LCBhY3RpZS50b3RLaWxvbWV0cmVyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGllLnZhbktpbG9tZXRyZXJpbmcgPiBhY3RpZS50b3RLaWxvbWV0cmVyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0geyB2YW46IHZhbktpbG9tZXRyZXJpbmcsIHRvdDogdG90S2lsb21ldHJlcmluZyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFuS2lsb21ldHJlcmluZyA9IHRlbXAudG90O1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90S2lsb21ldHJlcmluZyA9IHRlbXAudmFuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChrbVJhbmdlLmhlZWZ0T3ZlcmxhcCh2YW5LaWxvbWV0cmVyaW5nLCB0b3RLaWxvbWV0cmVyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVpY3MucHVzaChrbVJhbmdlLnRvcG9sb2d5RWxlbWVudC5nZXRQdWljKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHB1aWNzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhY3RpZVpvbmRlckVsZW1lbnRlbi5wdXNoKGFjdGllLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVsZGluZzogTWVsZGluZ0V2ZW50ID0gTWVsZGluZ0J1aWxkZXIuYWN0aWVIaWdobGlnaHRFcnJvcihhY3RpZVpvbmRlckVsZW1lbnRlbik7XG4gICAgICAgICAgICAgICAgICAgIGxvZ01lbGRpbmdEVE9zLnB1c2godGhpcy5sb2dnaW5nSGVscGVyLm1hYWtMb2dEVE8obWVsZGluZywgYWN0aWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dmFsLnB1dEFsbChhY3RpZSwgcHVpY3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sb2dMZWdlTWVsZGluZ0R0byhsb2dNZWxkaW5nRFRPcyk7XG4gICAgICAgIHJldHVybiByZXR2YWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dMZWdlTWVsZGluZ0R0byhsb2dEdG86IExvZ0R0b1tdKTogdm9pZCB7XG4gICAgICAgIGlmIChsb2dEdG8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubXN0TG9nUmVzb3VyY2UubG9nTWVzc2FnZXMobG9nRHRvKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmVyd2Vya1RvcG9FbGVtZW50ZW4odG9wb0VsZW1lbnRlbjogc2JibGFkLlRvcG9sb2d5RWxlbWVudFtdKTogS21SYW5nZVtdIHtcbiAgICAgICAgY29uc3Qga21SYW5nZXM6IEttUmFuZ2VbXSA9IFtdO1xuXG4gICAgICAgIGxldCB0b3BvRWxlbWVudGVuWm9uZGVyS21zID0gW107XG4gICAgICAgIGxldCBsYWF0c3RlUHVudEttczogS2lsb21ldHJlcmluZ1tdID0gbnVsbDtcbiAgICAgICAgdG9wb0VsZW1lbnRlbi5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgY29uc3Qga21zOiBLaWxvbWV0cmVyaW5nW10gPSBKc0phdmFVdGlsLmxpc3RUb0FycmF5KGVsZW0uZ2V0S2lsb21ldHJlcmluZ2VuKCkpO1xuICAgICAgICAgICAgaWYgKGttcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQWN0aWVIZWxwZXIuY29ycmlnZWVyVG9wb0VsZW1lbnRlblpvbmRlckttcyh0b3BvRWxlbWVudGVuWm9uZGVyS21zLCBsYWF0c3RlUHVudEttcywga21zLCBrbVJhbmdlcyk7XG4gICAgICAgICAgICAgICAgdG9wb0VsZW1lbnRlblpvbmRlckttcyA9IFtdO1xuICAgICAgICAgICAgICAgIGttUmFuZ2VzLnB1c2goS21SYW5nZS5yYW5nZVZvb3JQdW50T2JqZWN0KGVsZW0pKTtcbiAgICAgICAgICAgICAgICBsYWF0c3RlUHVudEttcyA9IGttcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9wb0VsZW1lbnRlblpvbmRlckttcy5wdXNoKGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRvcG9FbGVtZW50ZW5ab25kZXJLbXMubGVuZ3RoID4gMCAmJiBsYWF0c3RlUHVudEttcykge1xuICAgICAgICAgICAgQWN0aWVIZWxwZXIuY29ycmlnZWVyVG9wb0VsZW1lbnRlblpvbmRlckttcyh0b3BvRWxlbWVudGVuWm9uZGVyS21zLCBsYWF0c3RlUHVudEttcywgbnVsbCwga21SYW5nZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrbVJhbmdlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGJlcGFhbEFjdGllUHVpY3NWb29yU3Bvb3J0YWsoYWN0aWU6IEFjdGllKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBzcG9vcnRhayA9IHRoaXMuc2JtU2VydmljZS5nZXRTYlNwb29ydGFrKEFjdGllSGVscGVyLmJlcGFhbFRha0lkKGFjdGllKSk7XG5cbiAgICAgICAgbGV0IHB1aWNzID0gW107XG4gICAgICAgIGlmICghc3Bvb3J0YWspIHtcbiAgICAgICAgICAgIHJldHVybiBwdWljcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcmFnbWVudGVuID0gQWN0aWVIZWxwZXIuYmVwYWFsU3Bvb3J0YWtGcmFnbWVudGVuKHNwb29ydGFrKTtcbiAgICAgICAgaWYgKEFjdGllSGVscGVyLmlzS2lsb21ldHJlcmluZ0FhbndlemlnKGZyYWdtZW50ZW4pKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLmJlcGFhbEFjdGllc1B1aWNzKFthY3RpZV0sIGZyYWdtZW50ZW4pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgQXJyYXkuZnJvbShtYXAua2V5cygpKSkge1xuICAgICAgICAgICAgICAgIG1hcC5nZXQoa2V5KS5mb3JFYWNoKHggPT4gcHVpY3MucHVzaCh4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwdWljcyA9IEFjdGllSGVscGVyLmJlcGFhbFNwb29ydGFrRnJhZ21lbnRlblB1aWNzKGZyYWdtZW50ZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwdWljcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGJlcGFhbFB1aWNzVm9vclZTVEFjdGllKGFjdGllOiBBY3RpZSk6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKEFjdGllSGVscGVyLmlzSGVlbE9mSGFsZkVuZ2Vsc1dpc3NlbEFjdGllKGFjdGllKSkge1xuICAgICAgICAgICAgY29uc3QgcmV0dmFsID0gW107XG4gICAgICAgICAgICBjb25zdCB3aXNzZWxEZWxlbiA9IEFjdGllSGVscGVyLmdldFdpc3NlbERlbGVuKGFjdGllLndpc3NlbE5hYW0pO1xuICAgICAgICAgICAgY29uc3QgcHVpY3NFZXJzdGVXaXNzZWwgPSB0aGlzLmJlcGFhbFdpc3NlbFB1aWNzKHdpc3NlbERlbGVuWzBdLCBhY3RpZS5wcGxnTmFhbSwgYWN0aWUud2lzc2VsS2FudENvZGVbMF0pO1xuICAgICAgICAgICAgY29uc3QgcHVpY3NUd2VlZGVXaXNzZWwgPSB0aGlzLmJlcGFhbFdpc3NlbFB1aWNzKHdpc3NlbERlbGVuWzFdLCBhY3RpZS5wcGxnTmFhbSwgYWN0aWUud2lzc2VsS2FudENvZGVbMV0pO1xuXG4gICAgICAgICAgICBjb25zdCBwdWljMSA9IHRoaXMuc2JtU2VydmljZS5nZXRFZXJzdGVWZXJiaW5kaW5nUHVpY1Zvb3JTcGxpdEVuZ2Vsc2VXaXNzZWwod2lzc2VsRGVsZW5bMF0sIGFjdGllLndpc3NlbEthbnRDb2RlWzBdKTtcbiAgICAgICAgICAgIGlmIChwdWljMSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR2YWwucHVzaChwdWljMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwdWljMiA9IHRoaXMuc2JtU2VydmljZS5nZXRFZXJzdGVWZXJiaW5kaW5nUHVpY1Zvb3JTcGxpdEVuZ2Vsc2VXaXNzZWwod2lzc2VsRGVsZW5bMV0sIGFjdGllLndpc3NlbEthbnRDb2RlWzFdKTtcbiAgICAgICAgICAgIGlmIChwdWljMiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR2YWwucHVzaChwdWljMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR2YWwucHVzaCguLi5wdWljc0VlcnN0ZVdpc3NlbCk7XG4gICAgICAgICAgICByZXR2YWwucHVzaCguLi5wdWljc1R3ZWVkZVdpc3NlbCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmVwYWFsV2lzc2VsUHVpY3MoYWN0aWUud2lzc2VsTmFhbSwgYWN0aWUucHBsZ05hYW0sIGFjdGllLndpc3NlbEthbnRDb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYmVwYWFsV2lzc2VsUHVpY3Mod2lzc2VsTmFhbTogc3RyaW5nLCBwcGxnTmFhbTogc3RyaW5nLCBrYW50Y29kZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCB3aXNzZWwgPSB0aGlzLnNibVNlcnZpY2UuZ2V0U0JXaXNzZWwod2lzc2VsTmFhbSwgcHBsZ05hYW0pO1xuICAgICAgICBpZiAoIXdpc3NlbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGthbnRFbGVtZW50ID0gdGhpcy5iZXBhYWxLYW50RWxlbWVudChrYW50Y29kZSwgd2lzc2VsKTtcbiAgICAgICAgaWYgKCFrYW50RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0b3JpbmdTeW1ib29sUHVpYyA9IHdpc3NlbC5nZXRTdG9yaW5nU3ltYm9vbFB1aWMoKTtcblxuICAgICAgICByZXR1cm4gW3N0b3JpbmdTeW1ib29sUHVpYywga2FudEVsZW1lbnQuZ2V0UHVpYygpXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJlcGFhbEthbnRFbGVtZW50KGthbnRjb2RlOiBzdHJpbmcsIHdpc3NlbDogc2JibGFkLldpc3NlbCk6IHNiYmxhZC5TcG9vcnRha0ZyYWdtZW50IHtcbiAgICAgICAgaWYgKEFjdGllSGVscGVyLmlzS2FudENvZGVSZWNodHMoa2FudGNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2lzc2VsLmdldFJpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFjdGllSGVscGVyLmlzS2FudENvZGVMaW5rcyhrYW50Y29kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXNzZWwuZ2V0TGVmdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmVwYWFsUHVpY1Zvb3JXaXNzZWxTbGlqcGVuQWN0aWUoYWN0aWU6IEFjdGllKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBzdG9yaW5nc1N5bWJvb2xQdWljID0gdGhpcy5zYm1TZXJ2aWNlLmdldFNCV2lzc2VsKGFjdGllLndpc3NlbE5hYW0sIGFjdGllLnBwbGdOYWFtKT8uZ2V0U3RvcmluZ1N5bWJvb2xQdWljKCk7XG4gICAgICAgIGlmICghc3RvcmluZ3NTeW1ib29sUHVpYyAmJiB0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zdCBtZWxkaW5nOiBNZWxkaW5nRXZlbnQgPSBNZWxkaW5nQnVpbGRlci5hY3RpZUhpZ2hsaWdodEVycm9yKFthY3RpZS5pZF0pO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlc1NlcnZpY2Uuc2hvd01lc3NhZ2UoTWVzc2FnZUJ1aWxkZXIuYWN0aWVIaWdobGlnaHRFcnJvcihbYWN0aWUuaWRdKSk7XG4gICAgICAgICAgICB0aGlzLm1zdExvZ1Jlc291cmNlLmxvZ01lc3NhZ2VzKFt0aGlzLmxvZ2dpbmdIZWxwZXIubWFha0xvZ0RUTyhtZWxkaW5nLCBhY3RpZSldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RvcmluZ3NTeW1ib29sUHVpYyA/IFtzdG9yaW5nc1N5bWJvb2xQdWljXSA6IFtdO1xuICAgIH1cbn1cblxuXG4iXX0=
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { PopoverInfo } from '@loxia/imx-viewer';
|
|
2
|
+
import { ActieHelper } from './actie-helper';
|
|
3
|
+
import { ArrayMultimap } from './multi-map';
|
|
4
|
+
export class ActiePopoverBepaler {
|
|
5
|
+
static bepaalPopoverInfos(ritDelen, ritActieTopoPuics, ongeplandeActies) {
|
|
6
|
+
const puicNaarActieMap = this.bepaalPuicNaarActieMap(ritDelen, ritActieTopoPuics);
|
|
7
|
+
const puicNaarOngeplandeActieMap = this.bepaalPuicNaarOngeplandeActieMap(ongeplandeActies);
|
|
8
|
+
const puics = puicNaarActieMap.keys();
|
|
9
|
+
puics.push(...puicNaarOngeplandeActieMap.keys().filter(p => !puics.includes(p)));
|
|
10
|
+
const infos = [];
|
|
11
|
+
puics.forEach(puic => {
|
|
12
|
+
let content = '';
|
|
13
|
+
const treinNummerActieInfosGepland = puicNaarActieMap.get(puic).sort(this.sortTreinNummerActieInfo());
|
|
14
|
+
const treinNummerActieInfosOngepland = puicNaarOngeplandeActieMap.get(puic).sort(this.sortTreinNummerActieInfo());
|
|
15
|
+
const showTreinNummer = treinNummerActieInfosGepland.some(i => !!i.treinNummer)
|
|
16
|
+
|| treinNummerActieInfosOngepland.some(i => !!i.treinNummer);
|
|
17
|
+
treinNummerActieInfosGepland.forEach(a => content = this.vulPopoverContent(content, a, 'popovertekst-gepland', showTreinNummer));
|
|
18
|
+
treinNummerActieInfosOngepland.forEach(a => content = this.vulPopoverContent(content, a, 'popovertekst-ongepland', showTreinNummer));
|
|
19
|
+
const info = this.createPopoverInfo(content, puic, showTreinNummer);
|
|
20
|
+
infos.push(info);
|
|
21
|
+
});
|
|
22
|
+
return infos;
|
|
23
|
+
}
|
|
24
|
+
static createPopoverInfo(content, puic, showTreinNummer) {
|
|
25
|
+
const info = new PopoverInfo([puic], content);
|
|
26
|
+
info.popoverTitleContent = showTreinNummer ? '<span class="treinnummer">Trein #</span><span>Acties</span>' : 'Acties';
|
|
27
|
+
return info;
|
|
28
|
+
}
|
|
29
|
+
static sortTreinNummerActieInfo() {
|
|
30
|
+
return (a1, a2) => ActieHelper.actieComparator(a1.actie, a2.actie);
|
|
31
|
+
}
|
|
32
|
+
static bepaalPuicNaarOngeplandeActieMap(ongeplandeActies) {
|
|
33
|
+
const puicNaarOngeplandeActieMap = new ArrayMultimap();
|
|
34
|
+
if (ongeplandeActies.size() > 0) {
|
|
35
|
+
ongeplandeActies.entries.forEach(entry => {
|
|
36
|
+
const treinNummerActieInfos = puicNaarOngeplandeActieMap.get(entry.key);
|
|
37
|
+
if (!treinNummerActieInfos?.map(({ actie }) => actie).includes(entry.value.actie)) {
|
|
38
|
+
puicNaarOngeplandeActieMap.put(entry.key, { treinNummer: undefined, actie: entry.value.actie });
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return puicNaarOngeplandeActieMap;
|
|
43
|
+
}
|
|
44
|
+
static bepaalPuicNaarActieMap(ritDelen, ritActieTopoPuics) {
|
|
45
|
+
const puicNaarActieMap = new ArrayMultimap();
|
|
46
|
+
ritDelen.forEach(ritDeel => {
|
|
47
|
+
if (ritDeel.isZichtbaar() && ritDeel.acties.length !== 0) {
|
|
48
|
+
ritDeel.acties.forEach(ritActie => {
|
|
49
|
+
const puics = ritActieTopoPuics.get(ritActie);
|
|
50
|
+
puics.forEach(puic => {
|
|
51
|
+
this.addToPuicNaarActieMapIfNotExists(puicNaarActieMap, puic, ritActie, ritDeel.beweging?.treinNummer);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return puicNaarActieMap;
|
|
57
|
+
}
|
|
58
|
+
static addToPuicNaarActieMapIfNotExists(puicNaarActieMap, puic, ritActie, treinNummer) {
|
|
59
|
+
const treinNummerActieInfos = puicNaarActieMap.get(puic);
|
|
60
|
+
if (!(treinNummerActieInfos?.find(({ actie }) => actie === ritActie))) {
|
|
61
|
+
const actieInfo = { treinNummer, actie: ritActie };
|
|
62
|
+
puicNaarActieMap.put(puic, actieInfo);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
static vulPopoverContent(content, { treinNummer, actie }, clazz, showTreinNummer) {
|
|
66
|
+
let retval = content;
|
|
67
|
+
const treinnummerClass = showTreinNummer ? 'class="treinnummer"' : 'class="no-treinnummer"';
|
|
68
|
+
retval += '<div class="nowrap ' + clazz + '">';
|
|
69
|
+
retval += `<span ${treinnummerClass}>${treinNummer || '-'}</span>`;
|
|
70
|
+
let actieOmschrijving = '';
|
|
71
|
+
if (ActieHelper.isVSTActie(actie)) {
|
|
72
|
+
actieOmschrijving += ActieHelper.getVSTActieOmschrijving(actie);
|
|
73
|
+
}
|
|
74
|
+
else if (ActieHelper.isWisselSlijpenActie(actie)) {
|
|
75
|
+
actieOmschrijving += `${actie.ritActieTypeOmschrijving} ${actie.wisselNaam}`;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
actieOmschrijving += `${actie.ritActieTypeOmschrijving} ${actie.vanKilometerlint} ${actie.vanKilometrering}`;
|
|
79
|
+
actieOmschrijving += '-';
|
|
80
|
+
if (actie.totKilometerlint !== actie.vanKilometerlint) {
|
|
81
|
+
actieOmschrijving += actie.totKilometerlint;
|
|
82
|
+
actieOmschrijving += ' ';
|
|
83
|
+
}
|
|
84
|
+
actieOmschrijving += actie.totKilometrering;
|
|
85
|
+
}
|
|
86
|
+
retval += `<span>${actieOmschrijving}</span></div>`;
|
|
87
|
+
return retval;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aWUtcG9wb3Zlci1iZXBhbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXN0LXZpZXdlci9zcmMvbGliL3V0aWwvYWN0aWUtcG9wb3Zlci1iZXBhbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUloRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQU81QyxNQUFNLE9BQU8sbUJBQW1CO0lBQzVCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFtQixFQUFFLGlCQUErQyxFQUNwRSxnQkFBd0Q7UUFDOUUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDbEYsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUzRixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsMEJBQTBCLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqRixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSw0QkFBNEIsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFD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Q0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9wb3ZlckluZm8gfSBmcm9tICdAbG94aWEvaW14LXZpZXdlcic7XG5pbXBvcnQgeyBPbmdlcGxhbmRlQWN0aWUgfSBmcm9tICcuLi9tb2RlbC9vbmdlcGxhbmRlLWFjdGllJztcbmltcG9ydCB7IFJpdGRlZWwgfSBmcm9tICcuLi9tb2RlbC9yaXRkZWVsJztcbmltcG9ydCB7IEFjdGllIH0gZnJvbSAnLi4vb3B0aW1vJztcbmltcG9ydCB7IEFjdGllSGVscGVyIH0gZnJvbSAnLi9hY3RpZS1oZWxwZXInO1xuaW1wb3J0IHsgQXJyYXlNdWx0aW1hcCB9IGZyb20gJy4vbXVsdGktbWFwJztcblxuaW50ZXJmYWNlIFRyZWluTnVtbWVyQWN0aWVJbmZvIHtcbiAgICB0cmVpbk51bW1lcjogbnVtYmVyO1xuICAgIGFjdGllOiBBY3RpZTtcbn1cblxuZXhwb3J0IGNsYXNzIEFjdGllUG9wb3ZlckJlcGFsZXIge1xuICAgIHN0YXRpYyBiZXBhYWxQb3BvdmVySW5mb3Mocml0RGVsZW46IFJpdGRlZWxbXSwgcml0QWN0aWVUb3BvUHVpY3M6IEFycmF5TXVsdGltYXA8QWN0aWUsIHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmdlcGxhbmRlQWN0aWVzOiBBcnJheU11bHRpbWFwPHN0cmluZywgT25nZXBsYW5kZUFjdGllPik6IFBvcG92ZXJJbmZvW10ge1xuICAgICAgICBjb25zdCBwdWljTmFhckFjdGllTWFwID0gdGhpcy5iZXBhYWxQdWljTmFhckFjdGllTWFwKHJpdERlbGVuLCByaXRBY3RpZVRvcG9QdWljcyk7XG4gICAgICAgIGNvbnN0IHB1aWNOYWFyT25nZXBsYW5kZUFjdGllTWFwID0gdGhpcy5iZXBhYWxQdWljTmFhck9uZ2VwbGFuZGVBY3RpZU1hcChvbmdlcGxhbmRlQWN0aWVzKTtcblxuICAgICAgICBjb25zdCBwdWljcyA9IHB1aWNOYWFyQWN0aWVNYXAua2V5cygpO1xuICAgICAgICBwdWljcy5wdXNoKC4uLnB1aWNOYWFyT25nZXBsYW5kZUFjdGllTWFwLmtleXMoKS5maWx0ZXIocCA9PiAhcHVpY3MuaW5jbHVkZXMocCkpKTtcblxuICAgICAgICBjb25zdCBpbmZvcyA9IFtdO1xuICAgICAgICBwdWljcy5mb3JFYWNoKHB1aWMgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAnJztcbiAgICAgICAgICAgIGNvbnN0IHRyZWluTnVtbWVyQWN0aWVJbmZvc0dlcGxhbmQgPSBwdWljTmFhckFjdGllTWFwLmdldChwdWljKS5zb3J0KHRoaXMuc29ydFRyZWluTnVtbWVyQWN0aWVJbmZvKCkpO1xuICAgICAgICAgICAgY29uc3QgdHJlaW5OdW1tZXJBY3RpZUluZm9zT25nZXBsYW5kID0gcHVpY05hYXJPbmdlcGxhbmRlQWN0aWVNYXAuZ2V0KHB1aWMpLnNvcnQodGhpcy5zb3J0VHJlaW5OdW1tZXJBY3RpZUluZm8oKSk7XG4gICAgICAgICAgICBjb25zdCBzaG93VHJlaW5OdW1tZXIgPSB0cmVpbk51bW1lckFjdGllSW5mb3NHZXBsYW5kLnNvbWUoaSA9PiAhIWkudHJlaW5OdW1tZXIpXG4gICAgICAgICAgICAgICAgfHwgdHJlaW5OdW1tZXJBY3RpZUluZm9zT25nZXBsYW5kLnNvbWUoaSA9PiAhIWkudHJlaW5OdW1tZXIpO1xuICAgICAgICAgICAgdHJlaW5OdW1tZXJBY3RpZUluZm9zR2VwbGFuZC5mb3JFYWNoKGEgPT4gY29udGVudCA9IHRoaXMudnVsUG9wb3ZlckNvbnRlbnQoY29udGVudCwgYSwgJ3BvcG92ZXJ0ZWtzdC1nZXBsYW5kJywgc2hvd1RyZWluTnVtbWVyKSk7XG4gICAgICAgICAgICB0cmVpbk51bW1lckFjdGllSW5mb3NPbmdlcGxhbmQuZm9yRWFjaChhID0+IGNvbnRlbnQgPSB0aGlzLnZ1bFBvcG92ZXJDb250ZW50KGNvbnRlbnQsIGEsICdwb3BvdmVydGVrc3Qtb25nZXBsYW5kJywgc2hvd1RyZWluTnVtbWVyKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZVBvcG92ZXJJbmZvKGNvbnRlbnQsIHB1aWMsIHNob3dUcmVpbk51bW1lcik7XG4gICAgICAgICAgICBpbmZvcy5wdXNoKGluZm8pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluZm9zO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZVBvcG92ZXJJbmZvKGNvbnRlbnQ6IHN0cmluZywgcHVpYzogc3RyaW5nLCBzaG93VHJlaW5OdW1tZXI6IGJvb2xlYW4pOiBQb3BvdmVySW5mbyB7XG4gICAgICAgIGNvbnN0IGluZm8gPSBuZXcgUG9wb3ZlckluZm8oW3B1aWNdLCBjb250ZW50KTtcbiAgICAgICAgaW5mby5wb3BvdmVyVGl0bGVDb250ZW50ID0gc2hvd1RyZWluTnVtbWVyID8gJzxzcGFuIGNsYXNzPVwidHJlaW5udW1tZXJcIj5UcmVpbiAjPC9zcGFuPjxzcGFuPkFjdGllczwvc3Bhbj4nIDogJ0FjdGllcyc7XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNvcnRUcmVpbk51bW1lckFjdGllSW5mbygpOiAoYTogVHJlaW5OdW1tZXJBY3RpZUluZm8sIGI6IFRyZWluTnVtbWVyQWN0aWVJbmZvKSA9PiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKGExLCBhMik6IG51bWJlciA9PiBBY3RpZUhlbHBlci5hY3RpZUNvbXBhcmF0b3IoYTEuYWN0aWUsIGEyLmFjdGllKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBiZXBhYWxQdWljTmFhck9uZ2VwbGFuZGVBY3RpZU1hcChvbmdlcGxhbmRlQWN0aWVzOiBBcnJheU11bHRpbWFwPHN0cmluZywgT25nZXBsYW5kZUFjdGllPik6IEFycmF5TXVsdGltYXA8c3RyaW5nLCBUcmVpbk51bW1lckFjdGllSW5mbz4ge1xuICAgICAgICBjb25zdCBwdWljTmFhck9uZ2VwbGFuZGVBY3RpZU1hcCA9IG5ldyBBcnJheU11bHRpbWFwPHN0cmluZywgVHJlaW5OdW1tZXJBY3RpZUluZm8+KCk7XG4gICAgICAgIGlmIChvbmdlcGxhbmRlQWN0aWVzLnNpemUoKSA+IDApIHtcbiAgICAgICAgICAgIG9uZ2VwbGFuZGVBY3RpZXMuZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmVpbk51bW1lckFjdGllSW5mb3MgPSBwdWljTmFhck9uZ2VwbGFuZGVBY3RpZU1hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRyZWluTnVtbWVyQWN0aWVJbmZvcz8ubWFwKCh7IGFjdGllIH0pID0+IGFjdGllKS5pbmNsdWRlcyhlbnRyeS52YWx1ZS5hY3RpZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVpY05hYXJPbmdlcGxhbmRlQWN0aWVNYXAucHV0KGVudHJ5LmtleSwgeyB0cmVpbk51bW1lcjogdW5kZWZpbmVkLCBhY3RpZTogZW50cnkudmFsdWUuYWN0aWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHB1aWNOYWFyT25nZXBsYW5kZUFjdGllTWFwO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGJlcGFhbFB1aWNOYWFyQWN0aWVNYXAocml0RGVsZW46IFJpdGRlZWxbXSwgcml0QWN0aWVUb3BvUHVpY3M6IEFycmF5TXVsdGltYXA8QWN0aWUsIHN0cmluZz4pOiBBcnJheU11bHRpbWFwPHN0cmluZywgVHJlaW5OdW1tZXJBY3RpZUluZm8+IHtcbiAgICAgICAgY29uc3QgcHVpY05hYXJBY3RpZU1hcCA9IG5ldyBBcnJheU11bHRpbWFwPHN0cmluZywgVHJlaW5OdW1tZXJBY3RpZUluZm8+KCk7XG4gICAgICAgIHJpdERlbGVuLmZvckVhY2gocml0RGVlbCA9PiB7XG4gICAgICAgICAgICBpZiAocml0RGVlbC5pc1ppY2h0YmFhcigpICYmIHJpdERlZWwuYWN0aWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJpdERlZWwuYWN0aWVzLmZvckVhY2gocml0QWN0aWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdWljcyA9IHJpdEFjdGllVG9wb1B1aWNzLmdldChyaXRBY3RpZSk7XG4gICAgICAgICAgICAgICAgICAgIHB1aWNzLmZvckVhY2gocHVpYyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFRvUHVpY05hYXJBY3RpZU1hcElmTm90RXhpc3RzKHB1aWNOYWFyQWN0aWVNYXAsIHB1aWMsIHJpdEFjdGllLCByaXREZWVsLmJld2VnaW5nPy50cmVpbk51bW1lcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHB1aWNOYWFyQWN0aWVNYXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkVG9QdWljTmFhckFjdGllTWFwSWZOb3RFeGlzdHMocHVpY05hYXJBY3RpZU1hcDogQXJyYXlNdWx0aW1hcDxzdHJpbmcsIFRyZWluTnVtbWVyQWN0aWVJbmZvPiwgcHVpYzogc3RyaW5nLCByaXRBY3RpZTogQWN0aWUsIHRyZWluTnVtbWVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJlaW5OdW1tZXJBY3RpZUluZm9zID0gcHVpY05hYXJBY3RpZU1hcC5nZXQocHVpYyk7XG4gICAgICAgIGlmICghKHRyZWluTnVtbWVyQWN0aWVJbmZvcz8uZmluZCgoeyBhY3RpZSB9KSA9PiBhY3RpZSA9PT0gcml0QWN0aWUpKSkge1xuICAgICAgICAgICAgY29uc3QgYWN0aWVJbmZvOiBUcmVpbk51bW1lckFjdGllSW5mbyA9IHsgdHJlaW5OdW1tZXIsIGFjdGllOiByaXRBY3RpZSB9O1xuICAgICAgICAgICAgcHVpY05hYXJBY3RpZU1hcC5wdXQocHVpYywgYWN0aWVJbmZvKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHZ1bFBvcG92ZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZywgeyB0cmVpbk51bW1lciwgYWN0aWUgfTogVHJlaW5OdW1tZXJBY3RpZUluZm8sIGNsYXp6OiBzdHJpbmcsIHNob3dUcmVpbk51bW1lcjogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXR2YWwgPSBjb250ZW50O1xuICAgICAgICBjb25zdCB0cmVpbm51bW1lckNsYXNzID0gc2hvd1RyZWluTnVtbWVyID8gJ2NsYXNzPVwidHJlaW5udW1tZXJcIicgOiAnY2xhc3M9XCJuby10cmVpbm51bW1lclwiJztcblxuICAgICAgICByZXR2YWwgKz0gJzxkaXYgY2xhc3M9XCJub3dyYXAgJyArIGNsYXp6ICsgJ1wiPic7XG4gICAgICAgIHJldHZhbCArPSBgPHNwYW4gJHsgdHJlaW5udW1tZXJDbGFzcyB9PiR7IHRyZWluTnVtbWVyIHx8ICctJyB9PC9zcGFuPmA7XG5cbiAgICAgICAgbGV0IGFjdGllT21zY2hyaWp2aW5nID0gJyc7XG4gICAgICAgIGlmIChBY3RpZUhlbHBlci5pc1ZTVEFjdGllKGFjdGllKSkge1xuICAgICAgICAgICAgYWN0aWVPbXNjaHJpanZpbmcgKz0gQWN0aWVIZWxwZXIuZ2V0VlNUQWN0aWVPbXNjaHJpanZpbmcoYWN0aWUpO1xuICAgICAgICB9IGVsc2UgaWYgKEFjdGllSGVscGVyLmlzV2lzc2VsU2xpanBlbkFjdGllKGFjdGllKSkge1xuICAgICAgICAgICAgYWN0aWVPbXNjaHJpanZpbmcgKz0gYCR7IGFjdGllLnJpdEFjdGllVHlwZU9tc2NocmlqdmluZyB9ICR7IGFjdGllLndpc3NlbE5hYW0gfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY3RpZU9tc2NocmlqdmluZyArPSBgJHsgYWN0aWUucml0QWN0aWVUeXBlT21zY2hyaWp2aW5nIH0gJHsgYWN0aWUudmFuS2lsb21ldGVybGludCB9ICR7IGFjdGllLnZhbktpbG9tZXRyZXJpbmcgfWA7XG4gICAgICAgICAgICBhY3RpZU9tc2NocmlqdmluZyArPSAnLSc7XG4gICAgICAgICAgICBpZiAoYWN0aWUudG90S2lsb21ldGVybGludCAhPT0gYWN0aWUudmFuS2lsb21ldGVybGludCkge1xuICAgICAgICAgICAgICAgIGFjdGllT21zY2hyaWp2aW5nICs9IGFjdGllLnRvdEtpbG9tZXRlcmxpbnQ7XG4gICAgICAgICAgICAgICAgYWN0aWVPbXNjaHJpanZpbmcgKz0gJyAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWN0aWVPbXNjaHJpanZpbmcgKz0gYWN0aWUudG90S2lsb21ldHJlcmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR2YWwgKz0gYDxzcGFuPiR7IGFjdGllT21zY2hyaWp2aW5nIH08L3NwYW4+PC9kaXY+YDtcbiAgICAgICAgcmV0dXJuIHJldHZhbDtcbiAgICB9XG59XG4iXX0=
|