angular-three-cannon 2.0.0-beta.9 → 2.1.0
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/README.md +71 -4
- package/body/README.md +49 -0
- package/body/index.d.ts +2 -0
- package/body/lib/body.d.ts +17 -0
- package/body/lib/types.d.ts +49 -0
- package/body/lib/utils.d.ts +50 -0
- package/constraint/README.md +47 -0
- package/constraint/index.d.ts +1 -0
- package/constraint/lib/constraint.d.ts +32 -0
- package/debug/README.md +48 -2
- package/debug/lib/debug.d.ts +15 -33
- package/esm2022/body/angular-three-cannon-body.mjs +5 -0
- package/esm2022/body/index.mjs +2 -0
- package/esm2022/body/lib/body.mjs +108 -0
- package/esm2022/body/lib/types.mjs +2 -0
- package/esm2022/body/lib/utils.mjs +193 -0
- package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
- package/esm2022/constraint/index.mjs +2 -0
- package/esm2022/constraint/lib/constraint.mjs +67 -0
- package/esm2022/debug/lib/debug.mjs +56 -71
- package/esm2022/lib/physics.mjs +79 -176
- package/fesm2022/angular-three-cannon-body.mjs +306 -0
- package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
- package/fesm2022/angular-three-cannon-constraint.mjs +74 -0
- package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
- package/fesm2022/angular-three-cannon-debug.mjs +56 -71
- package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
- package/fesm2022/angular-three-cannon.mjs +79 -176
- package/fesm2022/angular-three-cannon.mjs.map +1 -1
- package/lib/physics.d.ts +31 -49
- package/package.json +25 -15
- package/esm2022/services/angular-three-cannon-services.mjs +0 -5
- package/esm2022/services/index.mjs +0 -7
- package/esm2022/services/lib/body.mjs +0 -293
- package/esm2022/services/lib/constraints.mjs +0 -58
- package/esm2022/services/lib/contact-material.mjs +0 -20
- package/esm2022/services/lib/ray.mjs +0 -30
- package/esm2022/services/lib/raycast-vehicle.mjs +0 -68
- package/esm2022/services/lib/spring.mjs +0 -31
- package/fesm2022/angular-three-cannon-services.mjs +0 -490
- package/fesm2022/angular-three-cannon-services.mjs.map +0 -1
- package/services/README.md +0 -3
- package/services/index.d.ts +0 -6
- package/services/lib/body.d.ts +0 -60
- package/services/lib/constraints.d.ts +0 -31
- package/services/lib/contact-material.d.ts +0 -9
- package/services/lib/ray.d.ts +0 -12
- package/services/lib/raycast-vehicle.d.ts +0 -30
- package/services/lib/spring.d.ts +0 -19
package/esm2022/lib/physics.mjs
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { Component,
|
|
1
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, afterNextRender, computed, inject, input, signal, untracked, } from '@angular/core';
|
|
2
2
|
import { CannonWorkerAPI, } from '@pmndrs/cannon-worker-api';
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import { injectBeforeRender, injectStore } from 'angular-three';
|
|
4
|
+
import { injectAutoEffect } from 'ngxtension/auto-effect';
|
|
5
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
6
|
+
import { InstancedMesh, Matrix4, Quaternion, Vector3 } from 'three';
|
|
5
7
|
import * as i0 from "@angular/core";
|
|
6
|
-
const v = new
|
|
7
|
-
const s = new
|
|
8
|
-
const q = new
|
|
9
|
-
const m = new
|
|
8
|
+
const v = new Vector3();
|
|
9
|
+
const s = new Vector3(1, 1, 1);
|
|
10
|
+
const q = new Quaternion();
|
|
11
|
+
const m = new Matrix4();
|
|
10
12
|
function apply(index, positions, quaternions, scale = s, object) {
|
|
11
13
|
if (index !== undefined) {
|
|
12
14
|
m.compose(v.fromArray(positions, index * 3), q.fromArray(quaternions, index * 4), scale);
|
|
@@ -18,107 +20,68 @@ function apply(index, positions, quaternions, scale = s, object) {
|
|
|
18
20
|
}
|
|
19
21
|
return m.identity();
|
|
20
22
|
}
|
|
21
|
-
|
|
23
|
+
function unique() {
|
|
22
24
|
const values = [];
|
|
23
25
|
return (value) => (values.includes(value) ? false : !!values.push(value));
|
|
26
|
+
}
|
|
27
|
+
const defaultOptions = {
|
|
28
|
+
allowSleep: false,
|
|
29
|
+
axisIndex: 0,
|
|
30
|
+
broadphase: 'Naive',
|
|
31
|
+
defaultContactMaterial: { contactEquationStiffness: 1e6 },
|
|
32
|
+
frictionGravity: null,
|
|
33
|
+
gravity: [0, -9.81, 0],
|
|
34
|
+
isPaused: false,
|
|
35
|
+
iterations: 5,
|
|
36
|
+
maxSubSteps: 10,
|
|
37
|
+
quatNormalizeFast: false,
|
|
38
|
+
quatNormalizeSkip: 0,
|
|
39
|
+
shouldInvalidate: true,
|
|
40
|
+
size: 1000,
|
|
41
|
+
solver: 'GS',
|
|
42
|
+
stepSize: 1 / 60,
|
|
43
|
+
tolerance: 0.001,
|
|
24
44
|
};
|
|
25
|
-
export const [injectNgtcPhysicsApi, provideNgtcPhysicsApi] = createInjectionToken((physics) => physics.api, { isRoot: false, deps: [forwardRef(() => NgtcPhysics)] });
|
|
26
45
|
export class NgtcPhysics {
|
|
27
46
|
constructor() {
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
broadphase: 'Naive',
|
|
32
|
-
defaultContactMaterial: { contactEquationStiffness: 1e6 },
|
|
33
|
-
frictionGravity: null,
|
|
34
|
-
gravity: [0, -9.81, 0],
|
|
35
|
-
isPaused: false,
|
|
36
|
-
iterations: 5,
|
|
37
|
-
maxSubSteps: 10,
|
|
38
|
-
quatNormalizeFast: false,
|
|
39
|
-
quatNormalizeSkip: 0,
|
|
40
|
-
shouldInvalidate: true,
|
|
41
|
-
size: 1000,
|
|
42
|
-
solver: 'GS',
|
|
43
|
-
stepSize: 1 / 60,
|
|
44
|
-
tolerance: 0.001,
|
|
45
|
-
});
|
|
46
|
-
this.zone = inject(NgZone);
|
|
47
|
-
this.injector = inject(Injector);
|
|
48
|
-
this.store = injectNgtStore();
|
|
47
|
+
this.autoEffect = injectAutoEffect();
|
|
48
|
+
this.store = injectStore();
|
|
49
|
+
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
49
50
|
this.invalidate = this.store.select('invalidate');
|
|
50
|
-
|
|
51
|
+
// @ts-expect-error - worker is not nullable, and we don't want to use ! operator
|
|
52
|
+
this.worker = signal(null);
|
|
53
|
+
this.api = {
|
|
51
54
|
bodies: {},
|
|
52
55
|
events: {},
|
|
53
56
|
refs: {},
|
|
54
57
|
scaleOverrides: {},
|
|
55
58
|
subscriptions: {},
|
|
56
|
-
worker:
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
set _isPaused(isPaused) {
|
|
61
|
-
this.inputs.set({ isPaused });
|
|
62
|
-
}
|
|
63
|
-
set _maxSubSteps(maxSubSteps) {
|
|
64
|
-
this.inputs.set({ maxSubSteps });
|
|
65
|
-
}
|
|
66
|
-
set _shouldInvalidate(shouldInvalidate) {
|
|
67
|
-
this.inputs.set({ shouldInvalidate });
|
|
68
|
-
}
|
|
69
|
-
set _stepSize(stepSize) {
|
|
70
|
-
this.inputs.set({ stepSize });
|
|
71
|
-
}
|
|
72
|
-
set _size(size) {
|
|
73
|
-
this.inputs.set({ size });
|
|
74
|
-
}
|
|
75
|
-
set _allowSleep(allowSleep) {
|
|
76
|
-
this.inputs.set({ allowSleep });
|
|
77
|
-
}
|
|
78
|
-
set _axisIndex(axisIndex) {
|
|
79
|
-
this.inputs.set({ axisIndex });
|
|
80
|
-
}
|
|
81
|
-
set _broadphase(broadphase) {
|
|
82
|
-
this.inputs.set({ broadphase });
|
|
83
|
-
}
|
|
84
|
-
set _defaultContactMaterial(defaultContactMaterial) {
|
|
85
|
-
this.inputs.set({ defaultContactMaterial });
|
|
86
|
-
}
|
|
87
|
-
set _frictionGravity(frictionGravity) {
|
|
88
|
-
this.inputs.set({ frictionGravity });
|
|
89
|
-
}
|
|
90
|
-
set _gravity(gravity) {
|
|
91
|
-
this.inputs.set({ gravity });
|
|
92
|
-
}
|
|
93
|
-
set _iterations(iterations) {
|
|
94
|
-
this.inputs.set({ iterations });
|
|
95
|
-
}
|
|
96
|
-
set _quatNormalizeFast(quatNormalizeFast) {
|
|
97
|
-
this.inputs.set({ quatNormalizeFast });
|
|
98
|
-
}
|
|
99
|
-
set _quatNormalizeSkip(quatNormalizeSkip) {
|
|
100
|
-
this.inputs.set({ quatNormalizeSkip });
|
|
101
|
-
}
|
|
102
|
-
set _solver(solver) {
|
|
103
|
-
this.inputs.set({ solver });
|
|
104
|
-
}
|
|
105
|
-
set _tolerance(tolerance) {
|
|
106
|
-
this.inputs.set({ tolerance });
|
|
107
|
-
}
|
|
108
|
-
ngOnInit() {
|
|
109
|
-
this.zone.runOutsideAngular(() => {
|
|
110
|
-
this.api.set({ worker: new CannonWorkerAPI(this.inputs.state()) });
|
|
59
|
+
worker: this.worker.asReadonly(),
|
|
60
|
+
};
|
|
61
|
+
afterNextRender(() => {
|
|
62
|
+
this.worker.set(new CannonWorkerAPI(this.options()));
|
|
111
63
|
this.connectWorker();
|
|
112
64
|
this.updateWorkerState('axisIndex');
|
|
113
65
|
this.updateWorkerState('broadphase');
|
|
114
66
|
this.updateWorkerState('gravity');
|
|
115
67
|
this.updateWorkerState('iterations');
|
|
116
68
|
this.updateWorkerState('tolerance');
|
|
117
|
-
|
|
69
|
+
});
|
|
70
|
+
let timeSinceLastCalled = 0;
|
|
71
|
+
injectBeforeRender(({ delta }) => {
|
|
72
|
+
const [{ isPaused, maxSubSteps, stepSize }, worker] = [this.options(), this.worker()];
|
|
73
|
+
if (isPaused || !worker || stepSize == null)
|
|
74
|
+
return;
|
|
75
|
+
timeSinceLastCalled += delta;
|
|
76
|
+
worker.step({ maxSubSteps, stepSize, timeSinceLastCalled });
|
|
77
|
+
timeSinceLastCalled = 0;
|
|
78
|
+
});
|
|
79
|
+
inject(DestroyRef).onDestroy(() => {
|
|
80
|
+
this.ref?.destroy();
|
|
118
81
|
});
|
|
119
82
|
}
|
|
120
83
|
connectWorker() {
|
|
121
|
-
|
|
84
|
+
this.autoEffect(() => {
|
|
122
85
|
const worker = this.worker();
|
|
123
86
|
if (!worker)
|
|
124
87
|
return;
|
|
@@ -129,34 +92,29 @@ export class NgtcPhysics {
|
|
|
129
92
|
worker.on('collideEnd', this.collideEndHandler.bind(this));
|
|
130
93
|
worker.on('frame', this.frameHandler.bind(this));
|
|
131
94
|
worker.on('rayhit', this.rayhitHandler.bind(this));
|
|
132
|
-
|
|
95
|
+
return () => {
|
|
133
96
|
worker.terminate();
|
|
134
97
|
worker.removeAllListeners();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
98
|
+
};
|
|
99
|
+
});
|
|
137
100
|
}
|
|
138
101
|
updateWorkerState(key) {
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
const [worker, value] = [untracked(this.worker),
|
|
142
|
-
// @ts-expect-error
|
|
102
|
+
const computedValue = computed(() => this.options()[key]);
|
|
103
|
+
this.autoEffect(() => {
|
|
104
|
+
const [worker, value] = [untracked(this.worker), computedValue()];
|
|
105
|
+
// @ts-expect-error - we know key is a valid key of CannonWorkerAPI
|
|
143
106
|
worker[key] = value;
|
|
144
|
-
}
|
|
107
|
+
});
|
|
145
108
|
}
|
|
146
109
|
collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }) {
|
|
147
|
-
const { events, refs } = this.api
|
|
110
|
+
const { events, refs } = this.api;
|
|
148
111
|
const cb = events[target]?.collide;
|
|
149
112
|
if (cb) {
|
|
150
|
-
cb({
|
|
151
|
-
body: refs[body],
|
|
152
|
-
contact: { bi: refs[bi], bj: refs[bj], ...contactRest },
|
|
153
|
-
target: refs[target],
|
|
154
|
-
...rest,
|
|
155
|
-
});
|
|
113
|
+
cb({ body: refs[body], contact: { bi: refs[bi], bj: refs[bj], ...contactRest }, target: refs[target], ...rest });
|
|
156
114
|
}
|
|
157
115
|
}
|
|
158
116
|
collideBeginHandler({ bodyA, bodyB }) {
|
|
159
|
-
const { events, refs } = this.api
|
|
117
|
+
const { events, refs } = this.api;
|
|
160
118
|
const cbA = events[bodyA]?.collideBegin;
|
|
161
119
|
if (cbA)
|
|
162
120
|
cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideBegin' });
|
|
@@ -165,7 +123,7 @@ export class NgtcPhysics {
|
|
|
165
123
|
cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideBegin' });
|
|
166
124
|
}
|
|
167
125
|
collideEndHandler({ bodyA, bodyB }) {
|
|
168
|
-
const { events, refs } = this.api
|
|
126
|
+
const { events, refs } = this.api;
|
|
169
127
|
const cbA = events[bodyA]?.collideEnd;
|
|
170
128
|
if (cbA)
|
|
171
129
|
cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideEnd' });
|
|
@@ -175,8 +133,8 @@ export class NgtcPhysics {
|
|
|
175
133
|
}
|
|
176
134
|
frameHandler({ active, bodies: uuids = [], observations, positions, quaternions, }) {
|
|
177
135
|
const [{ shouldInvalidate }, { bodies, subscriptions, refs, scaleOverrides }, invalidate] = [
|
|
178
|
-
this.
|
|
179
|
-
this.api
|
|
136
|
+
untracked(this.options),
|
|
137
|
+
this.api,
|
|
180
138
|
this.invalidate(),
|
|
181
139
|
];
|
|
182
140
|
for (let i = 0; i < uuids.length; i++) {
|
|
@@ -185,13 +143,13 @@ export class NgtcPhysics {
|
|
|
185
143
|
observations.forEach(([id, value, type]) => {
|
|
186
144
|
const subscription = subscriptions[id] || {};
|
|
187
145
|
const cb = subscription[type];
|
|
188
|
-
//
|
|
146
|
+
// @ts-expect-error - We clearly know the type of the callback, but typescript can't deal with it
|
|
189
147
|
cb && cb(value);
|
|
190
148
|
});
|
|
191
149
|
if (!active)
|
|
192
150
|
return;
|
|
193
151
|
for (const ref of Object.values(refs).filter(unique())) {
|
|
194
|
-
if (ref instanceof
|
|
152
|
+
if (ref instanceof InstancedMesh) {
|
|
195
153
|
for (let i = 0; i < ref.count; i++) {
|
|
196
154
|
const uuid = `${ref.uuid}/${i}`;
|
|
197
155
|
const index = bodies[uuid];
|
|
@@ -210,80 +168,25 @@ export class NgtcPhysics {
|
|
|
210
168
|
invalidate();
|
|
211
169
|
}
|
|
212
170
|
rayhitHandler({ body, ray: { uuid, ...rayRest }, ...rest }) {
|
|
213
|
-
const { events, refs } = this.api
|
|
171
|
+
const { events, refs } = this.api;
|
|
214
172
|
const cb = events[uuid]?.rayhit;
|
|
215
173
|
if (cb)
|
|
216
174
|
cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });
|
|
217
175
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
if (isPaused || !worker)
|
|
223
|
-
return;
|
|
224
|
-
timeSinceLastCalled += delta;
|
|
225
|
-
worker.step({ maxSubSteps, stepSize: stepSize, timeSinceLastCalled });
|
|
226
|
-
timeSinceLastCalled = 0;
|
|
227
|
-
}, { injector: this.injector });
|
|
228
|
-
}
|
|
229
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
230
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { _isPaused: ["isPaused", "_isPaused"], _maxSubSteps: ["maxSubSteps", "_maxSubSteps"], _shouldInvalidate: ["shouldInvalidate", "_shouldInvalidate"], _stepSize: ["stepSize", "_stepSize"], _size: ["size", "_size"], _allowSleep: ["allowSleep", "_allowSleep"], _axisIndex: ["axisIndex", "_axisIndex"], _broadphase: ["broadphase", "_broadphase"], _defaultContactMaterial: ["defaultContactMaterial", "_defaultContactMaterial"], _frictionGravity: ["frictionGravity", "_frictionGravity"], _gravity: ["gravity", "_gravity"], _iterations: ["iterations", "_iterations"], _quatNormalizeFast: ["quatNormalizeFast", "_quatNormalizeFast"], _quatNormalizeSkip: ["quatNormalizeSkip", "_quatNormalizeSkip"], _solver: ["solver", "_solver"], _tolerance: ["tolerance", "_tolerance"] }, providers: [provideNgtcPhysicsApi()], ngImport: i0, template: `<ng-content />`, isInline: true }); }
|
|
176
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
177
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
178
|
+
<ng-content />
|
|
179
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
231
180
|
}
|
|
232
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
181
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, decorators: [{
|
|
233
182
|
type: Component,
|
|
234
183
|
args: [{
|
|
235
184
|
selector: 'ngtc-physics',
|
|
236
185
|
standalone: true,
|
|
237
|
-
template:
|
|
238
|
-
|
|
186
|
+
template: `
|
|
187
|
+
<ng-content />
|
|
188
|
+
`,
|
|
189
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
239
190
|
}]
|
|
240
|
-
}],
|
|
241
|
-
type: Input,
|
|
242
|
-
args: [{ alias: 'isPaused' }]
|
|
243
|
-
}], _maxSubSteps: [{
|
|
244
|
-
type: Input,
|
|
245
|
-
args: [{ alias: 'maxSubSteps' }]
|
|
246
|
-
}], _shouldInvalidate: [{
|
|
247
|
-
type: Input,
|
|
248
|
-
args: [{ alias: 'shouldInvalidate' }]
|
|
249
|
-
}], _stepSize: [{
|
|
250
|
-
type: Input,
|
|
251
|
-
args: [{ alias: 'stepSize' }]
|
|
252
|
-
}], _size: [{
|
|
253
|
-
type: Input,
|
|
254
|
-
args: [{ alias: 'size' }]
|
|
255
|
-
}], _allowSleep: [{
|
|
256
|
-
type: Input,
|
|
257
|
-
args: [{ alias: 'allowSleep' }]
|
|
258
|
-
}], _axisIndex: [{
|
|
259
|
-
type: Input,
|
|
260
|
-
args: [{ alias: 'axisIndex' }]
|
|
261
|
-
}], _broadphase: [{
|
|
262
|
-
type: Input,
|
|
263
|
-
args: [{ alias: 'broadphase' }]
|
|
264
|
-
}], _defaultContactMaterial: [{
|
|
265
|
-
type: Input,
|
|
266
|
-
args: [{ alias: 'defaultContactMaterial' }]
|
|
267
|
-
}], _frictionGravity: [{
|
|
268
|
-
type: Input,
|
|
269
|
-
args: [{ alias: 'frictionGravity' }]
|
|
270
|
-
}], _gravity: [{
|
|
271
|
-
type: Input,
|
|
272
|
-
args: [{ alias: 'gravity' }]
|
|
273
|
-
}], _iterations: [{
|
|
274
|
-
type: Input,
|
|
275
|
-
args: [{ alias: 'iterations' }]
|
|
276
|
-
}], _quatNormalizeFast: [{
|
|
277
|
-
type: Input,
|
|
278
|
-
args: [{ alias: 'quatNormalizeFast' }]
|
|
279
|
-
}], _quatNormalizeSkip: [{
|
|
280
|
-
type: Input,
|
|
281
|
-
args: [{ alias: 'quatNormalizeSkip' }]
|
|
282
|
-
}], _solver: [{
|
|
283
|
-
type: Input,
|
|
284
|
-
args: [{ alias: 'solver' }]
|
|
285
|
-
}], _tolerance: [{
|
|
286
|
-
type: Input,
|
|
287
|
-
args: [{ alias: 'tolerance' }]
|
|
288
|
-
}] } });
|
|
289
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL3NyYy9saWIvcGh5c2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQ04sZUFBZSxHQWlCZixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDOztBQUUvQixNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNqQyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUU5QixTQUFTLEtBQUssQ0FBQyxLQUFhLEVBQUUsU0FBdUIsRUFBRSxXQUF5QixFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBdUI7SUFDbkgsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQ3hCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RixJQUFJLE1BQU0sRUFBRTtZQUNYLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLENBQUMsQ0FBQztLQUNUO0lBQ0QsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtJQUNuQixNQUFNLE1BQU0sR0FBYyxFQUFFLENBQUM7SUFDN0IsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEYsQ0FBQyxDQUFDO0FBMkJGLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUscUJBQXFCLENBQUMsR0FBRyxvQkFBb0IsQ0FDaEYsQ0FBQyxPQUFvQixFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUNyQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FDeEQsQ0FBQztBQVFGLE1BQU0sT0FBTyxXQUFXO0lBTnhCO1FBT1MsV0FBTSxHQUFHLFdBQVcsQ0FBbUI7WUFDOUMsVUFBVSxFQUFFLEtBQUs7WUFDakIsU0FBUyxFQUFFLENBQUM7WUFDWixVQUFVLEVBQUUsT0FBTztZQUNuQixzQkFBc0IsRUFBRSxFQUFFLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtZQUN6RCxlQUFlLEVBQUUsSUFBSTtZQUNyQixPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLENBQUM7WUFDYixXQUFXLEVBQUUsRUFBRTtZQUNmLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUU7WUFDaEIsU0FBUyxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBb0VLLFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1QixVQUFLLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFDekIsZUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJELFFBQUcsR0FBRyxXQUFXLENBQWlCO1lBQ2pDLE1BQU0sRUFBRSxFQUFFO1lBQ1YsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLE1BQU0sRUFBRSxJQUFLO1NBQ2IsQ0FBQyxDQUFDO1FBRUssV0FBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBZ0ozQztJQWpPQSxJQUFrQyxTQUFTLENBQUMsUUFBaUI7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFxQyxZQUFZLENBQUMsV0FBbUI7UUFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUEwQyxpQkFBaUIsQ0FBQyxnQkFBeUI7UUFDcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQWtDLFNBQVMsQ0FBQyxRQUFnQjtRQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQThCLEtBQUssQ0FBQyxJQUFZO1FBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBb0MsV0FBVyxDQUFDLFVBQW1CO1FBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBbUMsVUFBVSxDQUFDLFNBQW9CO1FBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBb0MsV0FBVyxDQUFDLFVBQXNCO1FBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBZ0QsdUJBQXVCLENBQ3RFLHNCQUE4QztRQUU5QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBeUMsZ0JBQWdCLENBQUMsZUFBK0I7UUFDeEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFpQyxRQUFRLENBQUMsT0FBZ0I7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFvQyxXQUFXLENBQUMsVUFBa0I7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUEyQyxrQkFBa0IsQ0FBQyxpQkFBMEI7UUFDdkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQTJDLGtCQUFrQixDQUFDLGlCQUF5QjtRQUN0RixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBZ0MsT0FBTyxDQUFDLE1BQWM7UUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFtQyxVQUFVLENBQUMsU0FBaUI7UUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFtQkQsUUFBUTtRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWE7UUFDcEIsTUFBTSxDQUNMLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDYixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUVwQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRWIsTUFBYyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3RCxNQUFjLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkUsTUFBYyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE1BQWMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDekQsTUFBYyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUU1RCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbEIsTUFBYyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLEVBQ0QsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEdBQTJCO1FBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FDTCxHQUFHLEVBQUU7WUFDSixNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzVELG1CQUFtQjtZQUNuQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQzNCLENBQUM7SUFDSCxDQUFDO0lBRU8sY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQThCO1FBQ2hILE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBRW5DLElBQUksRUFBRSxFQUFFO1lBQ1AsRUFBRSxDQUFDO2dCQUNGLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNoQixPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxXQUFXLEVBQUU7Z0JBQ3ZELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNwQixHQUFHLElBQUk7YUFDUCxDQUFDLENBQUM7U0FDSDtJQUNGLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQW1DO1FBQzVFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBWSxDQUFDO1FBQ3hDLElBQUksR0FBRztZQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLENBQUM7UUFDeEMsSUFBSSxHQUFHO1lBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBaUM7UUFDeEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUM7UUFDdEMsSUFBSSxHQUFHO1lBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDMUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQztRQUN0QyxJQUFJLEdBQUc7WUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRU8sWUFBWSxDQUFDLEVBQ3BCLE1BQU0sRUFDTixNQUFNLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFDbEIsWUFBWSxFQUNaLFNBQVMsRUFDVCxXQUFXLEdBQ2lCO1FBQzVCLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxVQUFVLENBQUMsR0FBRztZQUMzRixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLEVBQUU7U0FDakIsQ0FBQztRQUVGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckI7UUFFRCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDMUMsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsb0ZBQW9GO1lBQ3BGLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBYyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZELElBQUksR0FBRyxZQUFZLEtBQUssQ0FBQyxhQUFhLEVBQUU7Z0JBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNuQyxNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO3dCQUN4QixHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDL0UsR0FBRyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3FCQUN0QztpQkFDRDthQUNEO2lCQUFNO2dCQUNOLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDcEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDNUQ7U0FDRDtRQUNELElBQUksZ0JBQWdCO1lBQUUsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBNkI7UUFDNUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDaEMsSUFBSSxFQUFFO1lBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTyxZQUFZO1FBQ25CLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLGtCQUFrQixDQUNqQixDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNiLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLElBQUksUUFBUSxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBQ2hDLG1CQUFtQixJQUFJLEtBQUssQ0FBQztZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFTLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDLEVBQ0QsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUMzQixDQUFDO0lBQ0gsQ0FBQzs4R0FwUFcsV0FBVztrR0FBWCxXQUFXLGcwQkFGWixDQUFDLHFCQUFxQixFQUFFLENBQUMsMEJBRDFCLGdCQUFnQjs7MkZBR2QsV0FBVztrQkFOdkIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFNBQVMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7aUJBQ3BDOzhCQXFCa0MsU0FBUztzQkFBMUMsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7Z0JBSVMsWUFBWTtzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7Z0JBSVcsaUJBQWlCO3NCQUExRCxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFO2dCQUlGLFNBQVM7c0JBQTFDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO2dCQUlFLEtBQUs7c0JBQWxDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO2dCQUlZLFdBQVc7c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO2dCQUlLLFVBQVU7c0JBQTVDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO2dCQUlPLFdBQVc7c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO2dCQUlrQix1QkFBdUI7c0JBQXRFLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUU7Z0JBTUQsZ0JBQWdCO3NCQUF4RCxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFO2dCQUlGLFFBQVE7c0JBQXhDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUlTLFdBQVc7c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO2dCQUlhLGtCQUFrQjtzQkFBNUQsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtnQkFJTSxrQkFBa0I7c0JBQTVELEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7Z0JBSUwsT0FBTztzQkFBdEMsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7Z0JBSVMsVUFBVTtzQkFBNUMsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCwgTmdab25lLCBlZmZlY3QsIGZvcndhcmRSZWYsIGluamVjdCwgdW50cmFja2VkLCB0eXBlIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Q2Fubm9uV29ya2VyQVBJLFxuXHR0eXBlIEJyb2FkcGhhc2UsXG5cdHR5cGUgQ2Fubm9uV29ya2VyUHJvcHMsXG5cdHR5cGUgQ29sbGlkZUJlZ2luRXZlbnQsXG5cdHR5cGUgQ29sbGlkZUVuZEV2ZW50LFxuXHR0eXBlIENvbGxpZGVFdmVudCxcblx0dHlwZSBDb250YWN0TWF0ZXJpYWxPcHRpb25zLFxuXHR0eXBlIFJheWhpdEV2ZW50LFxuXHR0eXBlIFJlZnMsXG5cdHR5cGUgU29sdmVyLFxuXHR0eXBlIFN1YnNjcmlwdGlvbnMsXG5cdHR5cGUgVHJpcGxldCxcblx0dHlwZSBXb3JrZXJDb2xsaWRlQmVnaW5FdmVudCxcblx0dHlwZSBXb3JrZXJDb2xsaWRlRW5kRXZlbnQsXG5cdHR5cGUgV29ya2VyQ29sbGlkZUV2ZW50LFxuXHR0eXBlIFdvcmtlckZyYW1lTWVzc2FnZSxcblx0dHlwZSBXb3JrZXJSYXloaXRFdmVudCxcbn0gZnJvbSAnQHBtbmRycy9jYW5ub24td29ya2VyLWFwaSc7XG5pbXBvcnQgeyBjcmVhdGVJbmplY3Rpb25Ub2tlbiwgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3ROZ3RTdG9yZSwgc2lnbmFsU3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcblxuY29uc3QgdiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5jb25zdCBzID0gbmV3IFRIUkVFLlZlY3RvcjMoMSwgMSwgMSk7XG5jb25zdCBxID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcbmNvbnN0IG0gPSBuZXcgVEhSRUUuTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBhcHBseShpbmRleDogbnVtYmVyLCBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSwgcXVhdGVybmlvbnM6IEZsb2F0MzJBcnJheSwgc2NhbGUgPSBzLCBvYmplY3Q/OiBUSFJFRS5PYmplY3QzRCkge1xuXHRpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdG0uY29tcG9zZSh2LmZyb21BcnJheShwb3NpdGlvbnMsIGluZGV4ICogMyksIHEuZnJvbUFycmF5KHF1YXRlcm5pb25zLCBpbmRleCAqIDQpLCBzY2FsZSk7XG5cdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0b2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdG9iamVjdC5tYXRyaXguY29weShtKTtcblx0XHR9XG5cdFx0cmV0dXJuIG07XG5cdH1cblx0cmV0dXJuIG0uaWRlbnRpdHkoKTtcbn1cblxuY29uc3QgdW5pcXVlID0gKCkgPT4ge1xuXHRjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuXHRyZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiAodmFsdWVzLmluY2x1ZGVzKHZhbHVlKSA/IGZhbHNlIDogISF2YWx1ZXMucHVzaCh2YWx1ZSkpO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y1BoeXNpY3NTdGF0ZSA9IENhbm5vbldvcmtlclByb3BzICYge1xuXHRpc1BhdXNlZD86IGJvb2xlYW47XG5cdG1heFN1YlN0ZXBzPzogbnVtYmVyO1xuXHRzaG91bGRJbnZhbGlkYXRlPzogYm9vbGVhbjtcblx0c3RlcFNpemU/OiBudW1iZXI7XG59O1xuXG50eXBlIE5ndGNDYW5ub25FdmVudCA9IENvbGxpZGVCZWdpbkV2ZW50IHwgQ29sbGlkZUVuZEV2ZW50IHwgQ29sbGlkZUV2ZW50IHwgUmF5aGl0RXZlbnQ7XG50eXBlIE5ndGNDYWxsYmFja0J5VHlwZTxUIGV4dGVuZHMgeyB0eXBlOiBzdHJpbmcgfT4gPSB7XG5cdFtLIGluIFRbJ3R5cGUnXV0/OiBUIGV4dGVuZHMgeyB0eXBlOiBLIH0gPyAoZTogVCkgPT4gdm9pZCA6IG5ldmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y0Nhbm5vbkV2ZW50cyA9IHsgW3V1aWQ6IHN0cmluZ106IFBhcnRpYWw8Tmd0Y0NhbGxiYWNrQnlUeXBlPE5ndGNDYW5ub25FdmVudD4+IH07XG5cbmV4cG9ydCB0eXBlIFNjYWxlT3ZlcnJpZGVzID0geyBbdXVpZDogc3RyaW5nXTogVEhSRUUuVmVjdG9yMyB9O1xuXG5leHBvcnQgdHlwZSBOZ3RjUGh5c2ljc0FwaSA9IHtcblx0Ym9kaWVzOiB7IFt1dWlkOiBzdHJpbmddOiBudW1iZXIgfTtcblx0ZXZlbnRzOiBOZ3RjQ2Fubm9uRXZlbnRzO1xuXHRyZWZzOiBSZWZzO1xuXHRzY2FsZU92ZXJyaWRlczogU2NhbGVPdmVycmlkZXM7XG5cdHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbnM7XG5cdHdvcmtlcjogQ2Fubm9uV29ya2VyQVBJO1xufTtcblxuZXhwb3J0IGNvbnN0IFtpbmplY3ROZ3RjUGh5c2ljc0FwaSwgcHJvdmlkZU5ndGNQaHlzaWNzQXBpXSA9IGNyZWF0ZUluamVjdGlvblRva2VuKFxuXHQocGh5c2ljczogTmd0Y1BoeXNpY3MpID0+IHBoeXNpY3MuYXBpLFxuXHR7IGlzUm9vdDogZmFsc2UsIGRlcHM6IFtmb3J3YXJkUmVmKCgpID0+IE5ndGNQaHlzaWNzKV0gfSxcbik7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndGMtcGh5c2ljcycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQgLz5gLFxuXHRwcm92aWRlcnM6IFtwcm92aWRlTmd0Y1BoeXNpY3NBcGkoKV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndGNQaHlzaWNzIGltcGxlbWVudHMgT25Jbml0IHtcblx0cHJpdmF0ZSBpbnB1dHMgPSBzaWduYWxTdG9yZTxOZ3RjUGh5c2ljc1N0YXRlPih7XG5cdFx0YWxsb3dTbGVlcDogZmFsc2UsXG5cdFx0YXhpc0luZGV4OiAwLFxuXHRcdGJyb2FkcGhhc2U6ICdOYWl2ZScsXG5cdFx0ZGVmYXVsdENvbnRhY3RNYXRlcmlhbDogeyBjb250YWN0RXF1YXRpb25TdGlmZm5lc3M6IDFlNiB9LFxuXHRcdGZyaWN0aW9uR3Jhdml0eTogbnVsbCxcblx0XHRncmF2aXR5OiBbMCwgLTkuODEsIDBdLFxuXHRcdGlzUGF1c2VkOiBmYWxzZSxcblx0XHRpdGVyYXRpb25zOiA1LFxuXHRcdG1heFN1YlN0ZXBzOiAxMCxcblx0XHRxdWF0Tm9ybWFsaXplRmFzdDogZmFsc2UsXG5cdFx0cXVhdE5vcm1hbGl6ZVNraXA6IDAsXG5cdFx0c2hvdWxkSW52YWxpZGF0ZTogdHJ1ZSxcblx0XHRzaXplOiAxMDAwLFxuXHRcdHNvbHZlcjogJ0dTJyxcblx0XHRzdGVwU2l6ZTogMSAvIDYwLFxuXHRcdHRvbGVyYW5jZTogMC4wMDEsXG5cdH0pO1xuXG5cdEBJbnB1dCh7IGFsaWFzOiAnaXNQYXVzZWQnIH0pIHNldCBfaXNQYXVzZWQoaXNQYXVzZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBpc1BhdXNlZCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnbWF4U3ViU3RlcHMnIH0pIHNldCBfbWF4U3ViU3RlcHMobWF4U3ViU3RlcHM6IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IG1heFN1YlN0ZXBzIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdzaG91bGRJbnZhbGlkYXRlJyB9KSBzZXQgX3Nob3VsZEludmFsaWRhdGUoc2hvdWxkSW52YWxpZGF0ZTogYm9vbGVhbikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHNob3VsZEludmFsaWRhdGUgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3N0ZXBTaXplJyB9KSBzZXQgX3N0ZXBTaXplKHN0ZXBTaXplOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBzdGVwU2l6ZSB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnc2l6ZScgfSkgc2V0IF9zaXplKHNpemU6IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHNpemUgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2FsbG93U2xlZXAnIH0pIHNldCBfYWxsb3dTbGVlcChhbGxvd1NsZWVwOiBib29sZWFuKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgYWxsb3dTbGVlcCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnYXhpc0luZGV4JyB9KSBzZXQgX2F4aXNJbmRleChheGlzSW5kZXg6IDAgfCAxIHwgMikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IGF4aXNJbmRleCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnYnJvYWRwaGFzZScgfSkgc2V0IF9icm9hZHBoYXNlKGJyb2FkcGhhc2U6IEJyb2FkcGhhc2UpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBicm9hZHBoYXNlIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdkZWZhdWx0Q29udGFjdE1hdGVyaWFsJyB9KSBzZXQgX2RlZmF1bHRDb250YWN0TWF0ZXJpYWwoXG5cdFx0ZGVmYXVsdENvbnRhY3RNYXRlcmlhbDogQ29udGFjdE1hdGVyaWFsT3B0aW9ucyxcblx0KSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZGVmYXVsdENvbnRhY3RNYXRlcmlhbCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnZnJpY3Rpb25HcmF2aXR5JyB9KSBzZXQgX2ZyaWN0aW9uR3Jhdml0eShmcmljdGlvbkdyYXZpdHk6IFRyaXBsZXQgfCBudWxsKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZnJpY3Rpb25HcmF2aXR5IH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdncmF2aXR5JyB9KSBzZXQgX2dyYXZpdHkoZ3Jhdml0eTogVHJpcGxldCkge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IGdyYXZpdHkgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2l0ZXJhdGlvbnMnIH0pIHNldCBfaXRlcmF0aW9ucyhpdGVyYXRpb25zOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBpdGVyYXRpb25zIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdxdWF0Tm9ybWFsaXplRmFzdCcgfSkgc2V0IF9xdWF0Tm9ybWFsaXplRmFzdChxdWF0Tm9ybWFsaXplRmFzdDogYm9vbGVhbikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHF1YXROb3JtYWxpemVGYXN0IH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdxdWF0Tm9ybWFsaXplU2tpcCcgfSkgc2V0IF9xdWF0Tm9ybWFsaXplU2tpcChxdWF0Tm9ybWFsaXplU2tpcDogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgcXVhdE5vcm1hbGl6ZVNraXAgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3NvbHZlcicgfSkgc2V0IF9zb2x2ZXIoc29sdmVyOiBTb2x2ZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBzb2x2ZXIgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3RvbGVyYW5jZScgfSkgc2V0IF90b2xlcmFuY2UodG9sZXJhbmNlOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyB0b2xlcmFuY2UgfSk7XG5cdH1cblxuXHRwcml2YXRlIHpvbmUgPSBpbmplY3QoTmdab25lKTtcblx0cHJpdmF0ZSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdE5ndFN0b3JlKCk7XG5cdHByaXZhdGUgaW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cblx0YXBpID0gc2lnbmFsU3RvcmU8Tmd0Y1BoeXNpY3NBcGk+KHtcblx0XHRib2RpZXM6IHt9LFxuXHRcdGV2ZW50czoge30sXG5cdFx0cmVmczoge30sXG5cdFx0c2NhbGVPdmVycmlkZXM6IHt9LFxuXHRcdHN1YnNjcmlwdGlvbnM6IHt9LFxuXHRcdHdvcmtlcjogbnVsbCEsXG5cdH0pO1xuXG5cdHByaXZhdGUgd29ya2VyID0gdGhpcy5hcGkuc2VsZWN0KCd3b3JrZXInKTtcblxuXHRuZ09uSW5pdCgpIHtcblx0XHR0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuXHRcdFx0dGhpcy5hcGkuc2V0KHsgd29ya2VyOiBuZXcgQ2Fubm9uV29ya2VyQVBJKHRoaXMuaW5wdXRzLnN0YXRlKCkpIH0pO1xuXHRcdFx0dGhpcy5jb25uZWN0V29ya2VyKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCdheGlzSW5kZXgnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2Jyb2FkcGhhc2UnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2dyYXZpdHknKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2l0ZXJhdGlvbnMnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ3RvbGVyYW5jZScpO1xuXHRcdFx0dGhpcy5iZWZvcmVSZW5kZXIoKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgY29ubmVjdFdvcmtlcigpIHtcblx0XHRlZmZlY3QoXG5cdFx0XHQob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyKCk7XG5cdFx0XHRcdGlmICghd29ya2VyKSByZXR1cm47XG5cblx0XHRcdFx0d29ya2VyLmNvbm5lY3QoKTtcblx0XHRcdFx0d29ya2VyLmluaXQoKTtcblxuXHRcdFx0XHQod29ya2VyIGFzIGFueSkub24oJ2NvbGxpZGUnLCB0aGlzLmNvbGxpZGVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0XHQod29ya2VyIGFzIGFueSkub24oJ2NvbGxpZGVCZWdpbicsIHRoaXMuY29sbGlkZUJlZ2luSGFuZGxlci5iaW5kKHRoaXMpKTtcblx0XHRcdFx0KHdvcmtlciBhcyBhbnkpLm9uKCdjb2xsaWRlRW5kJywgdGhpcy5jb2xsaWRlRW5kSGFuZGxlci5iaW5kKHRoaXMpKTtcblx0XHRcdFx0KHdvcmtlciBhcyBhbnkpLm9uKCdmcmFtZScsIHRoaXMuZnJhbWVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0XHQod29ya2VyIGFzIGFueSkub24oJ3JheWhpdCcsIHRoaXMucmF5aGl0SGFuZGxlci5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRcdHdvcmtlci50ZXJtaW5hdGUoKTtcblx0XHRcdFx0XHQod29ya2VyIGFzIGFueSkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVXb3JrZXJTdGF0ZShrZXk6IGtleW9mIE5ndGNQaHlzaWNzU3RhdGUpIHtcblx0XHRjb25zdCBjb21wdXRlID0gdGhpcy5pbnB1dHMuc2VsZWN0KGtleSk7XG5cdFx0ZWZmZWN0KFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRjb25zdCBbd29ya2VyLCB2YWx1ZV0gPSBbdW50cmFja2VkKHRoaXMud29ya2VyKSwgY29tcHV0ZSgpXTtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvclxuXHRcdFx0XHR3b3JrZXJba2V5XSA9IHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBjb2xsaWRlSGFuZGxlcih7IGJvZHksIGNvbnRhY3Q6IHsgYmksIGJqLCAuLi5jb250YWN0UmVzdCB9LCB0YXJnZXQsIC4uLnJlc3QgfTogV29ya2VyQ29sbGlkZUV2ZW50WydkYXRhJ10pIHtcblx0XHRjb25zdCB7IGV2ZW50cywgcmVmcyB9ID0gdGhpcy5hcGkuZ2V0KCk7XG5cdFx0Y29uc3QgY2IgPSBldmVudHNbdGFyZ2V0XT8uY29sbGlkZTtcblxuXHRcdGlmIChjYikge1xuXHRcdFx0Y2Ioe1xuXHRcdFx0XHRib2R5OiByZWZzW2JvZHldLFxuXHRcdFx0XHRjb250YWN0OiB7IGJpOiByZWZzW2JpXSwgYmo6IHJlZnNbYmpdLCAuLi5jb250YWN0UmVzdCB9LFxuXHRcdFx0XHR0YXJnZXQ6IHJlZnNbdGFyZ2V0XSxcblx0XHRcdFx0Li4ucmVzdCxcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgY29sbGlkZUJlZ2luSGFuZGxlcih7IGJvZHlBLCBib2R5QiB9OiBXb3JrZXJDb2xsaWRlQmVnaW5FdmVudFsnZGF0YSddKSB7XG5cdFx0Y29uc3QgeyBldmVudHMsIHJlZnMgfSA9IHRoaXMuYXBpLmdldCgpO1xuXHRcdGNvbnN0IGNiQSA9IGV2ZW50c1tib2R5QV0/LmNvbGxpZGVCZWdpbjtcblx0XHRpZiAoY2JBKSBjYkEoeyBib2R5OiByZWZzW2JvZHlCXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5QV0sIHR5cGU6ICdjb2xsaWRlQmVnaW4nIH0pO1xuXHRcdGNvbnN0IGNiQiA9IGV2ZW50c1tib2R5Ql0/LmNvbGxpZGVCZWdpbjtcblx0XHRpZiAoY2JCKSBjYkIoeyBib2R5OiByZWZzW2JvZHlBXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5Ql0sIHR5cGU6ICdjb2xsaWRlQmVnaW4nIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBjb2xsaWRlRW5kSGFuZGxlcih7IGJvZHlBLCBib2R5QiB9OiBXb3JrZXJDb2xsaWRlRW5kRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaS5nZXQoKTtcblx0XHRjb25zdCBjYkEgPSBldmVudHNbYm9keUFdPy5jb2xsaWRlRW5kO1xuXHRcdGlmIChjYkEpIGNiQSh7IGJvZHk6IHJlZnNbYm9keUJdLCBvcDogJ2V2ZW50JywgdGFyZ2V0OiByZWZzW2JvZHlBXSwgdHlwZTogJ2NvbGxpZGVFbmQnIH0pO1xuXHRcdGNvbnN0IGNiQiA9IGV2ZW50c1tib2R5Ql0/LmNvbGxpZGVFbmQ7XG5cdFx0aWYgKGNiQikgY2JCKHsgYm9keTogcmVmc1tib2R5QV0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUJdLCB0eXBlOiAnY29sbGlkZUVuZCcgfSk7XG5cdH1cblxuXHRwcml2YXRlIGZyYW1lSGFuZGxlcih7XG5cdFx0YWN0aXZlLFxuXHRcdGJvZGllczogdXVpZHMgPSBbXSxcblx0XHRvYnNlcnZhdGlvbnMsXG5cdFx0cG9zaXRpb25zLFxuXHRcdHF1YXRlcm5pb25zLFxuXHR9OiBXb3JrZXJGcmFtZU1lc3NhZ2VbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IFt7IHNob3VsZEludmFsaWRhdGUgfSwgeyBib2RpZXMsIHN1YnNjcmlwdGlvbnMsIHJlZnMsIHNjYWxlT3ZlcnJpZGVzIH0sIGludmFsaWRhdGVdID0gW1xuXHRcdFx0dGhpcy5pbnB1dHMuZ2V0KCksXG5cdFx0XHR0aGlzLmFwaS5nZXQoKSxcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpLFxuXHRcdF07XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRib2RpZXNbdXVpZHNbaV1dID0gaTtcblx0XHR9XG5cblx0XHRvYnNlcnZhdGlvbnMuZm9yRWFjaCgoW2lkLCB2YWx1ZSwgdHlwZV0pID0+IHtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbnNbaWRdIHx8IHt9O1xuXHRcdFx0Y29uc3QgY2IgPSBzdWJzY3JpcHRpb25bdHlwZV07XG5cdFx0XHQvLyBIRUxQOiBXZSBjbGVhcmx5IGtub3cgdGhlIHR5cGUgb2YgdGhlIGNhbGxiYWNrLCBidXQgdHlwZXNjcmlwdCBjYW4ndCBkZWFsIHdpdGggaXRcblx0XHRcdGNiICYmIGNiKHZhbHVlIGFzIG5ldmVyKTtcblx0XHR9KTtcblxuXHRcdGlmICghYWN0aXZlKSByZXR1cm47XG5cblx0XHRmb3IgKGNvbnN0IHJlZiBvZiBPYmplY3QudmFsdWVzKHJlZnMpLmZpbHRlcih1bmlxdWUoKSkpIHtcblx0XHRcdGlmIChyZWYgaW5zdGFuY2VvZiBUSFJFRS5JbnN0YW5jZWRNZXNoKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVmLmNvdW50OyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCB1dWlkID0gYCR7cmVmLnV1aWR9LyR7aX1gO1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gYm9kaWVzW3V1aWRdO1xuXHRcdFx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZWYuc2V0TWF0cml4QXQoaSwgYXBwbHkoaW5kZXgsIHBvc2l0aW9ucywgcXVhdGVybmlvbnMsIHNjYWxlT3ZlcnJpZGVzW3V1aWRdKSk7XG5cdFx0XHRcdFx0XHRyZWYuaW5zdGFuY2VNYXRyaXgubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2NhbGUgPSBzY2FsZU92ZXJyaWRlc1tyZWYudXVpZF0gfHwgcmVmLnNjYWxlO1xuXHRcdFx0XHRhcHBseShib2RpZXNbcmVmLnV1aWRdLCBwb3NpdGlvbnMsIHF1YXRlcm5pb25zLCBzY2FsZSwgcmVmKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNob3VsZEludmFsaWRhdGUpIGludmFsaWRhdGUoKTtcblx0fVxuXG5cdHByaXZhdGUgcmF5aGl0SGFuZGxlcih7IGJvZHksIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfTogV29ya2VyUmF5aGl0RXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaS5nZXQoKTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t1dWlkXT8ucmF5aGl0O1xuXHRcdGlmIChjYikgY2IoeyBib2R5OiBib2R5ID8gcmVmc1tib2R5XSA6IG51bGwsIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfSk7XG5cdH1cblxuXHRwcml2YXRlIGJlZm9yZVJlbmRlcigpIHtcblx0XHRsZXQgdGltZVNpbmNlTGFzdENhbGxlZCA9IDA7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKFxuXHRcdFx0KHsgZGVsdGEgfSkgPT4ge1xuXHRcdFx0XHRjb25zdCBbeyBpc1BhdXNlZCwgbWF4U3ViU3RlcHMsIHN0ZXBTaXplIH0sIHdvcmtlcl0gPSBbdGhpcy5pbnB1dHMuZ2V0KCksIHRoaXMud29ya2VyKCldO1xuXHRcdFx0XHRpZiAoaXNQYXVzZWQgfHwgIXdvcmtlcikgcmV0dXJuO1xuXHRcdFx0XHR0aW1lU2luY2VMYXN0Q2FsbGVkICs9IGRlbHRhO1xuXHRcdFx0XHR3b3JrZXIuc3RlcCh7IG1heFN1YlN0ZXBzLCBzdGVwU2l6ZTogc3RlcFNpemUhLCB0aW1lU2luY2VMYXN0Q2FsbGVkIH0pO1xuXHRcdFx0XHR0aW1lU2luY2VMYXN0Q2FsbGVkID0gMDtcblx0XHRcdH0sXG5cdFx0XHR7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG5cdFx0KTtcblx0fVxufVxuIl19
|
|
191
|
+
}], ctorParameters: () => [] });
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL3NyYy9saWIvcGh5c2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBR1YsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNOLGVBQWUsR0FhZixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFZLFVBQVUsRUFBbUIsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDOztBQWUvRixNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztBQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRXhCLFNBQVMsS0FBSyxDQUNiLEtBQWEsRUFDYixTQUE0QixFQUM1QixXQUE4QixFQUM5QixLQUFLLEdBQUcsQ0FBQyxFQUNULE1BQWlCO0lBRWpCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxF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LEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNwRCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RCxDQUFDO1FBQ0YsQ0FBQztRQUNELElBQUksZ0JBQWdCO1lBQUUsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBNkI7UUFDNUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDaEMsSUFBSSxFQUFFO1lBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7OEdBakpXLFdBQVc7a0dBQVgsV0FBVyxrTkFMYjs7RUFFVDs7MkZBR1csV0FBVztrQkFSdkIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDL0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHREZXN0cm95UmVmLFxuXHRFbWJlZGRlZFZpZXdSZWYsXG5cdFNpZ25hbCxcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Q2Fubm9uV29ya2VyQVBJLFxuXHRDYW5ub25Xb3JrZXJQcm9wcyxcblx0Q29sbGlkZUJlZ2luRXZlbnQsXG5cdENvbGxpZGVFbmRFdmVudCxcblx0Q29sbGlkZUV2ZW50LFxuXHRSYXloaXRFdmVudCxcblx0UmVmcyxcblx0U3Vic2NyaXB0aW9ucyxcblx0V29ya2VyQ29sbGlkZUJlZ2luRXZlbnQsXG5cdFdvcmtlckNvbGxpZGVFbmRFdmVudCxcblx0V29ya2VyQ29sbGlkZUV2ZW50LFxuXHRXb3JrZXJGcmFtZU1lc3NhZ2UsXG5cdFdvcmtlclJheWhpdEV2ZW50LFxufSBmcm9tICdAcG1uZHJzL2Nhbm5vbi13b3JrZXItYXBpJztcbmltcG9ydCB7IGluamVjdEJlZm9yZVJlbmRlciwgaW5qZWN0U3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IEluc3RhbmNlZE1lc2gsIE1hdHJpeDQsIE9iamVjdDNELCBRdWF0ZXJuaW9uLCBRdWF0ZXJuaW9uVHVwbGUsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y0Nhbm5vbldvcmtlckV2ZW50cyB7XG5cdGNvbGxpZGU6IFdvcmtlckNvbGxpZGVFdmVudDtcblx0Y29sbGlkZUJlZ2luOiBXb3JrZXJDb2xsaWRlQmVnaW5FdmVudDtcblx0Y29sbGlkZUVuZDogV29ya2VyQ29sbGlkZUVuZEV2ZW50O1xuXHRmcmFtZTogV29ya2VyRnJhbWVNZXNzYWdlO1xuXHRyYXloaXQ6IFdvcmtlclJheWhpdEV2ZW50O1xufVxuXG5leHBvcnQgdHlwZSBOZ3RjQ2Fubm9uV29ya2VyID0gQ2Fubm9uV29ya2VyQVBJICYge1xuXHRvbjogPEsgZXh0ZW5kcyBrZXlvZiBOZ3RjQ2Fubm9uV29ya2VyRXZlbnRzPihldmVudDogSywgY2I6IChkYXRhOiBOZ3RjQ2Fubm9uV29ya2VyRXZlbnRzW0tdWydkYXRhJ10pID0+IHZvaWQpID0+IHZvaWQ7XG5cdHJlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IHYgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgcyA9IG5ldyBWZWN0b3IzKDEsIDEsIDEpO1xuY29uc3QgcSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5jb25zdCBtID0gbmV3IE1hdHJpeDQoKTtcblxuZnVuY3Rpb24gYXBwbHkoXG5cdGluZGV4OiBudW1iZXIsXG5cdHBvc2l0aW9uczogQXJyYXlMaWtlPG51bWJlcj4sXG5cdHF1YXRlcm5pb25zOiBBcnJheUxpa2U8bnVtYmVyPixcblx0c2NhbGUgPSBzLFxuXHRvYmplY3Q/OiBPYmplY3QzRCxcbikge1xuXHRpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdG0uY29tcG9zZSh2LmZyb21BcnJheShwb3NpdGlvbnMsIGluZGV4ICogMyksIHEuZnJvbUFycmF5KHF1YXRlcm5pb25zIGFzIFF1YXRlcm5pb25UdXBsZSwgaW5kZXggKiA0KSwgc2NhbGUpO1xuXHRcdGlmIChvYmplY3QpIHtcblx0XHRcdG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRvYmplY3QubWF0cml4LmNvcHkobSk7XG5cdFx0fVxuXHRcdHJldHVybiBtO1xuXHR9XG5cdHJldHVybiBtLmlkZW50aXR5KCk7XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZSgpIHtcblx0Y29uc3QgdmFsdWVzOiB1bmtub3duW10gPSBbXTtcblx0cmV0dXJuICh2YWx1ZTogdW5rbm93bikgPT4gKHZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkgPyBmYWxzZSA6ICEhdmFsdWVzLnB1c2godmFsdWUpKTtcbn1cblxudHlwZSBOZ3RjQ2Fubm9uRXZlbnQgPSBDb2xsaWRlQmVnaW5FdmVudCB8IENvbGxpZGVFbmRFdmVudCB8IENvbGxpZGVFdmVudCB8IFJheWhpdEV2ZW50O1xudHlwZSBOZ3RjQ2FsbGJhY2tCeVR5cGU8VCBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+ID0ge1xuXHRbSyBpbiBUWyd0eXBlJ11dPzogVCBleHRlbmRzIHsgdHlwZTogSyB9ID8gKGU6IFQpID0+IHZvaWQgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNDYW5ub25FdmVudHMgPSBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsPE5ndGNDYWxsYmFja0J5VHlwZTxOZ3RjQ2Fubm9uRXZlbnQ+Pj47XG5cbmV4cG9ydCB0eXBlIFNjYWxlT3ZlcnJpZGVzID0gUmVjb3JkPHN0cmluZywgVmVjdG9yMz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y1BoeXNpY3NJbnB1dHMgZXh0ZW5kcyBDYW5ub25Xb3JrZXJQcm9wcyB7XG5cdGlzUGF1c2VkPzogYm9vbGVhbjtcblx0bWF4U3ViU3RlcHM/OiBudW1iZXI7XG5cdHNob3VsZEludmFsaWRhdGU/OiBib29sZWFuO1xuXHRzdGVwU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjUGh5c2ljc0FwaSB7XG5cdGJvZGllczogeyBbdXVpZDogc3RyaW5nXTogbnVtYmVyIH07XG5cdGV2ZW50czogTmd0Y0Nhbm5vbkV2ZW50cztcblx0cmVmczogUmVmcztcblx0c2NhbGVPdmVycmlkZXM6IFNjYWxlT3ZlcnJpZGVzO1xuXHRzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25zO1xuXHR3b3JrZXI6IFNpZ25hbDxDYW5ub25Xb3JrZXJBUEk+O1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0Y1BoeXNpY3NJbnB1dHMgPSB7XG5cdGFsbG93U2xlZXA6IGZhbHNlLFxuXHRheGlzSW5kZXg6IDAsXG5cdGJyb2FkcGhhc2U6ICdOYWl2ZScsXG5cdGRlZmF1bHRDb250YWN0TWF0ZXJpYWw6IHsgY29udGFjdEVxdWF0aW9uU3RpZmZuZXNzOiAxZTYgfSxcblx0ZnJpY3Rpb25HcmF2aXR5OiBudWxsLFxuXHRncmF2aXR5OiBbMCwgLTkuODEsIDBdLFxuXHRpc1BhdXNlZDogZmFsc2UsXG5cdGl0ZXJhdGlvbnM6IDUsXG5cdG1heFN1YlN0ZXBzOiAxMCxcblx0cXVhdE5vcm1hbGl6ZUZhc3Q6IGZhbHNlLFxuXHRxdWF0Tm9ybWFsaXplU2tpcDogMCxcblx0c2hvdWxkSW52YWxpZGF0ZTogdHJ1ZSxcblx0c2l6ZTogMTAwMCxcblx0c29sdmVyOiAnR1MnLFxuXHRzdGVwU2l6ZTogMSAvIDYwLFxuXHR0b2xlcmFuY2U6IDAuMDAxLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0Yy1waHlzaWNzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGVudCAvPlxuXHRgLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0Y1BoeXNpY3Mge1xuXHRwcml2YXRlIGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gd29ya2VyIGlzIG5vdCBudWxsYWJsZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlICEgb3BlcmF0b3Jcblx0cHJpdmF0ZSB3b3JrZXIgPSBzaWduYWw8Q2Fubm9uV29ya2VyQVBJPihudWxsKTtcblxuXHRhcGk6IE5ndGNQaHlzaWNzQXBpID0ge1xuXHRcdGJvZGllczoge30sXG5cdFx0ZXZlbnRzOiB7fSxcblx0XHRyZWZzOiB7fSxcblx0XHRzY2FsZU92ZXJyaWRlczoge30sXG5cdFx0c3Vic2NyaXB0aW9uczoge30sXG5cdFx0d29ya2VyOiB0aGlzLndvcmtlci5hc1JlYWRvbmx5KCksXG5cdH07XG5cblx0cHJpdmF0ZSByZWY/OiBFbWJlZGRlZFZpZXdSZWY8eyAkaW1wbGljaXQ6IE5ndGNQaHlzaWNzQXBpIH0+O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHR0aGlzLndvcmtlci5zZXQobmV3IENhbm5vbldvcmtlckFQSSh0aGlzLm9wdGlvbnMoKSkpO1xuXHRcdFx0dGhpcy5jb25uZWN0V29ya2VyKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCdheGlzSW5kZXgnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2Jyb2FkcGhhc2UnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2dyYXZpdHknKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2l0ZXJhdGlvbnMnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ3RvbGVyYW5jZScpO1xuXHRcdH0pO1xuXG5cdFx0bGV0IHRpbWVTaW5jZUxhc3RDYWxsZWQgPSAwO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBkZWx0YSB9KSA9PiB7XG5cdFx0XHRjb25zdCBbeyBpc1BhdXNlZCwgbWF4U3ViU3RlcHMsIHN0ZXBTaXplIH0sIHdvcmtlcl0gPSBbdGhpcy5vcHRpb25zKCksIHRoaXMud29ya2VyKCldO1xuXHRcdFx0aWYgKGlzUGF1c2VkIHx8ICF3b3JrZXIgfHwgc3RlcFNpemUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCArPSBkZWx0YTtcblx0XHRcdHdvcmtlci5zdGVwKHsgbWF4U3ViU3RlcHMsIHN0ZXBTaXplLCB0aW1lU2luY2VMYXN0Q2FsbGVkIH0pO1xuXHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCA9IDA7XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdHRoaXMucmVmPy5kZXN0cm95KCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbm5lY3RXb3JrZXIoKSB7XG5cdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyKCkgYXMgTmd0Y0Nhbm5vbldvcmtlcjtcblx0XHRcdGlmICghd29ya2VyKSByZXR1cm47XG5cblx0XHRcdHdvcmtlci5jb25uZWN0KCk7XG5cdFx0XHR3b3JrZXIuaW5pdCgpO1xuXG5cdFx0XHR3b3JrZXIub24oJ2NvbGxpZGUnLCB0aGlzLmNvbGxpZGVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdjb2xsaWRlQmVnaW4nLCB0aGlzLmNvbGxpZGVCZWdpbkhhbmRsZXIuYmluZCh0aGlzKSk7XG5cdFx0XHR3b3JrZXIub24oJ2NvbGxpZGVFbmQnLCB0aGlzLmNvbGxpZGVFbmRIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdmcmFtZScsIHRoaXMuZnJhbWVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdyYXloaXQnLCB0aGlzLnJheWhpdEhhbmRsZXIuYmluZCh0aGlzKSk7XG5cblx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdHdvcmtlci50ZXJtaW5hdGUoKTtcblx0XHRcdFx0d29ya2VyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuXHRcdFx0fTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlV29ya2VyU3RhdGUoa2V5OiBrZXlvZiBOZ3RjUGh5c2ljc0lucHV0cykge1xuXHRcdGNvbnN0IGNvbXB1dGVkVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKVtrZXldKTtcblxuXHRcdHRoaXMuYXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbd29ya2VyLCB2YWx1ZV0gPSBbdW50cmFja2VkKHRoaXMud29ya2VyKSwgY29tcHV0ZWRWYWx1ZSgpXTtcblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSB3ZSBrbm93IGtleSBpcyBhIHZhbGlkIGtleSBvZiBDYW5ub25Xb3JrZXJBUElcblx0XHRcdHdvcmtlcltrZXldID0gdmFsdWU7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVIYW5kbGVyKHsgYm9keSwgY29udGFjdDogeyBiaSwgYmosIC4uLmNvbnRhY3RSZXN0IH0sIHRhcmdldCwgLi4ucmVzdCB9OiBXb3JrZXJDb2xsaWRlRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t0YXJnZXRdPy5jb2xsaWRlO1xuXHRcdGlmIChjYikge1xuXHRcdFx0Y2IoeyBib2R5OiByZWZzW2JvZHldLCBjb250YWN0OiB7IGJpOiByZWZzW2JpXSwgYmo6IHJlZnNbYmpdLCAuLi5jb250YWN0UmVzdCB9LCB0YXJnZXQ6IHJlZnNbdGFyZ2V0XSwgLi4ucmVzdCB9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVCZWdpbkhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUJlZ2luRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYkEgPSBldmVudHNbYm9keUFdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQSkgY2JBKHsgYm9keTogcmVmc1tib2R5Ql0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUFdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQikgY2JCKHsgYm9keTogcmVmc1tib2R5QV0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUJdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0fVxuXG5cdHByaXZhdGUgY29sbGlkZUVuZEhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUVuZEV2ZW50WydkYXRhJ10pIHtcblx0XHRjb25zdCB7IGV2ZW50cywgcmVmcyB9ID0gdGhpcy5hcGk7XG5cdFx0Y29uc3QgY2JBID0gZXZlbnRzW2JvZHlBXT8uY29sbGlkZUVuZDtcblx0XHRpZiAoY2JBKSBjYkEoeyBib2R5OiByZWZzW2JvZHlCXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5QV0sIHR5cGU6ICdjb2xsaWRlRW5kJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlRW5kO1xuXHRcdGlmIChjYkIpIGNiQih7IGJvZHk6IHJlZnNbYm9keUFdLCBvcDogJ2V2ZW50JywgdGFyZ2V0OiByZWZzW2JvZHlCXSwgdHlwZTogJ2NvbGxpZGVFbmQnIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBmcmFtZUhhbmRsZXIoe1xuXHRcdGFjdGl2ZSxcblx0XHRib2RpZXM6IHV1aWRzID0gW10sXG5cdFx0b2JzZXJ2YXRpb25zLFxuXHRcdHBvc2l0aW9ucyxcblx0XHRxdWF0ZXJuaW9ucyxcblx0fTogV29ya2VyRnJhbWVNZXNzYWdlWydkYXRhJ10pIHtcblx0XHRjb25zdCBbeyBzaG91bGRJbnZhbGlkYXRlIH0sIHsgYm9kaWVzLCBzdWJzY3JpcHRpb25zLCByZWZzLCBzY2FsZU92ZXJyaWRlcyB9LCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpLFxuXHRcdFx0dGhpcy5hcGksXG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKSxcblx0XHRdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdXVpZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGJvZGllc1t1dWlkc1tpXV0gPSBpO1xuXHRcdH1cblx0XHRvYnNlcnZhdGlvbnMuZm9yRWFjaCgoW2lkLCB2YWx1ZSwgdHlwZV0pID0+IHtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbnNbaWRdIHx8IHt9O1xuXHRcdFx0Y29uc3QgY2IgPSBzdWJzY3JpcHRpb25bdHlwZV07XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2UgY2xlYXJseSBrbm93IHRoZSB0eXBlIG9mIHRoZSBjYWxsYmFjaywgYnV0IHR5cGVzY3JpcHQgY2FuJ3QgZGVhbCB3aXRoIGl0XG5cdFx0XHRjYiAmJiBjYih2YWx1ZSk7XG5cdFx0fSk7XG5cdFx0aWYgKCFhY3RpdmUpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IHJlZiBvZiBPYmplY3QudmFsdWVzKHJlZnMpLmZpbHRlcih1bmlxdWUoKSkpIHtcblx0XHRcdGlmIChyZWYgaW5zdGFuY2VvZiBJbnN0YW5jZWRNZXNoKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVmLmNvdW50OyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCB1dWlkID0gYCR7cmVmLnV1aWR9LyR7aX1gO1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gYm9kaWVzW3V1aWRdO1xuXHRcdFx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZWYuc2V0TWF0cml4QXQoaSwgYXBwbHkoaW5kZXgsIHBvc2l0aW9ucywgcXVhdGVybmlvbnMsIHNjYWxlT3ZlcnJpZGVzW3V1aWRdKSk7XG5cdFx0XHRcdFx0XHRyZWYuaW5zdGFuY2VNYXRyaXgubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2NhbGUgPSBzY2FsZU92ZXJyaWRlc1tyZWYudXVpZF0gfHwgcmVmLnNjYWxlO1xuXHRcdFx0XHRhcHBseShib2RpZXNbcmVmLnV1aWRdLCBwb3NpdGlvbnMsIHF1YXRlcm5pb25zLCBzY2FsZSwgcmVmKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNob3VsZEludmFsaWRhdGUpIGludmFsaWRhdGUoKTtcblx0fVxuXG5cdHByaXZhdGUgcmF5aGl0SGFuZGxlcih7IGJvZHksIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfTogV29ya2VyUmF5aGl0RXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t1dWlkXT8ucmF5aGl0O1xuXHRcdGlmIChjYikgY2IoeyBib2R5OiBib2R5ID8gcmVmc1tib2R5XSA6IG51bGwsIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfSk7XG5cdH1cbn1cbiJdfQ==
|