@textbus/collaborate 3.0.0-alpha.1 → 3.0.0-alpha.11
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +2 -1
- package/bundles/collaborate.d.ts +4 -4
- package/bundles/collaborate.js +60 -32
- package/package.json +4 -4
- package/src/collaborate-cursor.ts +0 -293
- package/src/collaborate.ts +0 -738
- package/src/public-api.ts +0 -18
- package/src/unknown.component.ts +0 -22
- package/tsconfig-build.json +0 -28
package/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
Textbus
|
2
2
|
=====================
|
3
3
|
|
4
|
-
Textbus 是一套用于构建富交互的富文本编辑框架。和大多数富文本编辑器不同的是,Textbus 以组件为核心,格式为辅助,并大幅简化了富文本编辑器开发中常见
|
4
|
+
Textbus 是一套用于构建富交互的富文本编辑框架。和大多数富文本编辑器不同的是,Textbus 以组件为核心,格式为辅助,并大幅简化了富文本编辑器开发中常见
|
5
|
+
API,且提供了更高的抽象层,使 Textbus 不仅易于上手,同时还能驱动复杂的富文本应用。
|
5
6
|
|
6
7
|
本项目为 Textbus 协作编辑实现,提供了多人在线协作编辑能力的支持。
|
7
8
|
|
package/bundles/collaborate.d.ts
CHANGED
@@ -61,10 +61,10 @@ export declare class Collaborate implements History {
|
|
61
61
|
protected syncRootComponent(root: YMap<any>, rootComponent: ComponentInstance): void;
|
62
62
|
protected restoreCursorLocation(position: CursorPosition): void;
|
63
63
|
protected getRelativeCursorLocation(): CursorPosition | null;
|
64
|
-
protected
|
65
|
-
protected
|
66
|
-
protected
|
67
|
-
protected
|
64
|
+
protected syncSlotContent(content: YText, slot: Slot): void;
|
65
|
+
protected syncSlotState(remoteSlot: YMap<any>, slot: Slot): void;
|
66
|
+
protected syncComponentSlots(remoteSlots: YArray<any>, component: ComponentInstance): void;
|
67
|
+
protected syncComponentState(remoteComponent: YMap<any>, component: ComponentInstance): void;
|
68
68
|
protected runLocalUpdate(fn: () => void, record?: boolean): void;
|
69
69
|
protected runRemoteUpdate(tr: Transaction, fn: () => void): void;
|
70
70
|
protected createSharedComponentByComponent(component: ComponentInstance): YMap<any>;
|
package/bundles/collaborate.js
CHANGED
@@ -219,13 +219,13 @@ let Collaborate = class Collaborate {
|
|
219
219
|
rootComponent.slots.clean();
|
220
220
|
slots.forEach(sharedSlot => {
|
221
221
|
const slot = this.createSlotBySharedSlot(sharedSlot);
|
222
|
-
this.
|
223
|
-
this.
|
222
|
+
this.syncSlotContent(sharedSlot.get('content'), slot);
|
223
|
+
this.syncSlotState(sharedSlot, slot);
|
224
224
|
rootComponent.slots.insert(slot);
|
225
225
|
});
|
226
226
|
}
|
227
|
-
this.
|
228
|
-
this.
|
227
|
+
this.syncComponentState(root, rootComponent);
|
228
|
+
this.syncComponentSlots(slots, rootComponent);
|
229
229
|
}
|
230
230
|
restoreCursorLocation(position) {
|
231
231
|
const anchorPosition = createAbsolutePositionFromRelativePosition(position.anchor, this.yDoc);
|
@@ -260,11 +260,30 @@ let Collaborate = class Collaborate {
|
|
260
260
|
}
|
261
261
|
return null;
|
262
262
|
}
|
263
|
-
|
263
|
+
syncSlotContent(content, slot) {
|
264
264
|
this.contentMap.set(slot, content);
|
265
265
|
const syncRemote = (ev, tr) => {
|
266
266
|
this.runRemoteUpdate(tr, () => {
|
267
267
|
slot.retain(0);
|
268
|
+
ev.keysChanged.forEach(key => {
|
269
|
+
const change = ev.keys.get(key);
|
270
|
+
if (!change) {
|
271
|
+
return;
|
272
|
+
}
|
273
|
+
const updateType = change.action;
|
274
|
+
if (updateType === 'update' || updateType === 'add') {
|
275
|
+
const attribute = this.factory.getAttribute(key);
|
276
|
+
if (attribute) {
|
277
|
+
slot.setAttribute(attribute, content.getAttribute(key));
|
278
|
+
}
|
279
|
+
}
|
280
|
+
else if (updateType === 'delete') {
|
281
|
+
const attribute = this.factory.getAttribute(key);
|
282
|
+
if (attribute) {
|
283
|
+
slot.removeAttribute(attribute);
|
284
|
+
}
|
285
|
+
}
|
286
|
+
});
|
268
287
|
ev.delta.forEach(action => {
|
269
288
|
if (Reflect.has(action, 'retain')) {
|
270
289
|
if (action.attributes) {
|
@@ -289,8 +308,8 @@ let Collaborate = class Collaborate {
|
|
289
308
|
const sharedComponent = action.insert;
|
290
309
|
const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent);
|
291
310
|
const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent);
|
292
|
-
this.
|
293
|
-
this.
|
311
|
+
this.syncComponentSlots(sharedComponent.get('slots'), component);
|
312
|
+
this.syncComponentState(sharedComponent, component);
|
294
313
|
slot.insert(component);
|
295
314
|
}
|
296
315
|
if (this.selection.isSelected) {
|
@@ -315,16 +334,6 @@ let Collaborate = class Collaborate {
|
|
315
334
|
}
|
316
335
|
}
|
317
336
|
}
|
318
|
-
else if (action.attributes) {
|
319
|
-
slot.updateState(draft => {
|
320
|
-
if (typeof draft === 'object' && draft !== null) {
|
321
|
-
Object.assign(draft, action.attributes);
|
322
|
-
}
|
323
|
-
else {
|
324
|
-
return action.attributes;
|
325
|
-
}
|
326
|
-
});
|
327
|
-
}
|
328
337
|
});
|
329
338
|
});
|
330
339
|
};
|
@@ -383,6 +392,12 @@ let Collaborate = class Collaborate {
|
|
383
392
|
content.insert(0, '\n', (_a = delta[0]) === null || _a === void 0 ? void 0 : _a.attributes);
|
384
393
|
}
|
385
394
|
}
|
395
|
+
else if (action.type === 'attrSet') {
|
396
|
+
content.setAttribute(action.name, action.value);
|
397
|
+
}
|
398
|
+
else if (action.type === 'attrRemove') {
|
399
|
+
content.removeAttribute(action.name);
|
400
|
+
}
|
386
401
|
}
|
387
402
|
});
|
388
403
|
});
|
@@ -396,7 +411,7 @@ let Collaborate = class Collaborate {
|
|
396
411
|
sub.unsubscribe();
|
397
412
|
});
|
398
413
|
}
|
399
|
-
|
414
|
+
syncSlotState(remoteSlot, slot) {
|
400
415
|
const syncRemote = (ev, tr) => {
|
401
416
|
this.runRemoteUpdate(tr, () => {
|
402
417
|
ev.keysChanged.forEach(key => {
|
@@ -427,11 +442,12 @@ let Collaborate = class Collaborate {
|
|
427
442
|
sub.unsubscribe();
|
428
443
|
});
|
429
444
|
}
|
430
|
-
|
445
|
+
syncComponentSlots(remoteSlots, component) {
|
431
446
|
const slots = component.slots;
|
432
447
|
const syncRemote = (ev, tr) => {
|
433
448
|
this.runRemoteUpdate(tr, () => {
|
434
449
|
let index = 0;
|
450
|
+
slots.retain(index);
|
435
451
|
ev.delta.forEach(action => {
|
436
452
|
if (Reflect.has(action, 'retain')) {
|
437
453
|
index += action.retain;
|
@@ -441,8 +457,8 @@ let Collaborate = class Collaborate {
|
|
441
457
|
action.insert.forEach(item => {
|
442
458
|
const slot = this.createSlotBySharedSlot(item);
|
443
459
|
slots.insert(slot);
|
444
|
-
this.
|
445
|
-
this.
|
460
|
+
this.syncSlotContent(item.get('content'), slot);
|
461
|
+
this.syncSlotState(item, slot);
|
446
462
|
index++;
|
447
463
|
});
|
448
464
|
}
|
@@ -485,7 +501,7 @@ let Collaborate = class Collaborate {
|
|
485
501
|
sub.unsubscribe();
|
486
502
|
});
|
487
503
|
}
|
488
|
-
|
504
|
+
syncComponentState(remoteComponent, component) {
|
489
505
|
const syncRemote = (ev, tr) => {
|
490
506
|
this.runRemoteUpdate(tr, () => {
|
491
507
|
ev.keysChanged.forEach(key => {
|
@@ -548,8 +564,8 @@ let Collaborate = class Collaborate {
|
|
548
564
|
const sharedSlot = this.createSharedSlotBySlot(slot);
|
549
565
|
sharedSlots.push([sharedSlot]);
|
550
566
|
});
|
551
|
-
this.
|
552
|
-
this.
|
567
|
+
this.syncComponentSlots(sharedSlots, component);
|
568
|
+
this.syncComponentState(sharedComponent, component);
|
553
569
|
return sharedComponent;
|
554
570
|
}
|
555
571
|
createSharedSlotBySlot(slot) {
|
@@ -578,8 +594,11 @@ let Collaborate = class Collaborate {
|
|
578
594
|
}
|
579
595
|
offset += i.insert.length;
|
580
596
|
});
|
581
|
-
|
582
|
-
|
597
|
+
slot.getAttributes().forEach(item => {
|
598
|
+
sharedContent.setAttribute(item[0].name, item[1]);
|
599
|
+
});
|
600
|
+
this.syncSlotContent(sharedContent, slot);
|
601
|
+
this.syncSlotState(sharedSlot, slot);
|
583
602
|
return sharedSlot;
|
584
603
|
}
|
585
604
|
createComponentBySharedComponent(yMap, canInsertInlineComponent) {
|
@@ -602,8 +621,8 @@ let Collaborate = class Collaborate {
|
|
602
621
|
sharedSlot = this.createSharedSlotBySlot(slot);
|
603
622
|
sharedSlots.push([sharedSlot]);
|
604
623
|
}
|
605
|
-
this.
|
606
|
-
this.
|
624
|
+
this.syncSlotState(sharedSlot, slot);
|
625
|
+
this.syncSlotContent(sharedSlot.get('content'), slot);
|
607
626
|
});
|
608
627
|
return instance;
|
609
628
|
}
|
@@ -615,21 +634,30 @@ let Collaborate = class Collaborate {
|
|
615
634
|
const slot = this.factory.createSlot({
|
616
635
|
schema: sharedSlot.get('schema'),
|
617
636
|
state: sharedSlot.get('state'),
|
637
|
+
attributes: {},
|
618
638
|
formats: {},
|
619
639
|
content: []
|
620
640
|
});
|
641
|
+
const attrs = content.getAttributes();
|
642
|
+
Object.keys(attrs).forEach(key => {
|
643
|
+
const attribute = this.factory.getAttribute(key);
|
644
|
+
if (attribute) {
|
645
|
+
slot.setAttribute(attribute, attrs[key]);
|
646
|
+
}
|
647
|
+
});
|
621
648
|
for (const action of delta) {
|
622
649
|
if (action.insert) {
|
623
650
|
if (typeof action.insert === 'string') {
|
624
|
-
|
651
|
+
const formats = remoteFormatsToLocal(this.factory, action.attributes);
|
652
|
+
slot.insert(action.insert, formats);
|
625
653
|
}
|
626
654
|
else {
|
627
655
|
const sharedComponent = action.insert;
|
628
656
|
const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent);
|
629
657
|
const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent);
|
630
658
|
slot.insert(component, remoteFormatsToLocal(this.factory, action.attributes));
|
631
|
-
this.
|
632
|
-
this.
|
659
|
+
this.syncComponentSlots(sharedComponent.get('slots'), component);
|
660
|
+
this.syncComponentState(sharedComponent, component);
|
633
661
|
}
|
634
662
|
}
|
635
663
|
else {
|
@@ -686,4 +714,4 @@ function remoteFormatsToLocal(factory, attrs) {
|
|
686
714
|
}
|
687
715
|
return formats;
|
688
716
|
}
|
689
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxlQUFlLENBQUE7QUFDckYsT0FBTyxFQUNMLFlBQVksRUFFWixXQUFXLEVBQ1gsVUFBVSxFQUNWLE9BQU8sRUFHUCxrQkFBa0IsRUFDbEIsU0FBUyxFQUNULGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsU0FBUyxFQUVULElBQUksRUFDSixPQUFPLEVBQ1IsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLEtBQUssSUFBSSxNQUFNLEVBQ2YsR0FBRyxJQUFJLElBQUksRUFDWCxHQUFHLElBQUksSUFBSSxFQUVYLElBQUksSUFBSSxLQUFLLEVBRWIsV0FBVyxFQUNYLDBDQUEwQyxFQUMxQyxtQ0FBbUMsRUFDcEMsTUFBTSxLQUFLLENBQUE7QUFFWixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sc0JBQXNCLENBQUE7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFNUQsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7QUFPbkQsTUFBTSxVQUFVO0lBQWhCO1FBQ1Usb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFBO1FBQzVDLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQTtJQXNDdEQsQ0FBQztJQWxDQyxHQUFHLENBQUMsR0FBUSxFQUFFLEtBQVU7UUFDdEIsSUFBSSxHQUFHLFlBQVksSUFBSSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENB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R0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQy9GLElBQUksRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFBO2FBQ0w7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRixDQUFBO0FBcm5CWSxXQUFXO0lBRHZCLFVBQVUsRUFBRTtJQXNDRSxXQUFBLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBOzZDQUNDLGdCQUFnQjtRQUNmLGlCQUFpQjtRQUN4QixVQUFVO1FBQ1gsU0FBUztRQUNYLE9BQU87UUFDTCxTQUFTO1FBQ1gsT0FBTztHQTVDM0IsV0FBVyxDQXFuQnZCO1NBcm5CWSxXQUFXO0FBdW5CeEIsU0FBUyxvQkFBb0IsQ0FBQyxPQUFnQixFQUFFLEtBQVc7SUFDekQsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFBO0lBQzNCLElBQUksS0FBSyxFQUFFO1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMzQyxJQUFJLFNBQVMsRUFBRTtnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDdEM7UUFDSCxDQUFDLENBQUMsQ0FBQTtLQUNIO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAnQHRhbmJvL3N0cmVhbSdcbmltcG9ydCB7XG4gIENoYW5nZU9yaWdpbixcbiAgQ29tcG9uZW50SW5zdGFuY2UsXG4gIENvbnRlbnRUeXBlLFxuICBDb250cm9sbGVyLFxuICBGYWN0b3J5LFxuICBGb3JtYXRzLFxuICBIaXN0b3J5LFxuICBISVNUT1JZX1NUQUNLX1NJWkUsXG4gIG1ha2VFcnJvcixcbiAgUm9vdENvbXBvbmVudFJlZixcbiAgU2NoZWR1bGVyLFxuICBTZWxlY3Rpb24sXG4gIFNlbGVjdGlvblBhdGhzLFxuICBTbG90LFxuICBTdGFydGVyXG59IGZyb20gJ0B0ZXh0YnVzL2NvcmUnXG5pbXBvcnQge1xuICBBcnJheSBhcyBZQXJyYXksXG4gIERvYyBhcyBZRG9jLFxuICBNYXAgYXMgWU1hcCxcbiAgUmVsYXRpdmVQb3NpdGlvbixcbiAgVGV4dCBhcyBZVGV4dCxcbiAgVHJhbnNhY3Rpb24sXG4gIFVuZG9NYW5hZ2VyLFxuICBjcmVhdGVBYnNvbHV0ZVBvc2l0aW9uRnJvbVJlbGF0aXZlUG9zaXRpb24sXG4gIGNyZWF0ZVJlbGF0aXZlUG9zaXRpb25Gcm9tVHlwZUluZGV4XG59IGZyb20gJ3lqcydcblxuaW1wb3J0IHsgQ29sbGFib3JhdGVDdXJzb3IsIFJlbW90ZVNlbGVjdGlvbiB9IGZyb20gJy4vY29sbGFib3JhdGUtY3Vyc29yJ1xuaW1wb3J0IHsgY3JlYXRlVW5rbm93bkNvbXBvbmVudCB9IGZyb20gJy4vdW5rbm93bi5jb21wb25lbnQnXG5cbmNvbnN0IGNvbGxhYm9yYXRlRXJyb3JGbiA9IG1ha2VFcnJvcignQ29sbGFib3JhdGUnKVxuXG5pbnRlcmZhY2UgQ3Vyc29yUG9zaXRpb24ge1xuICBhbmNob3I6IFJlbGF0aXZlUG9zaXRpb25cbiAgZm9jdXM6IFJlbGF0aXZlUG9zaXRpb25cbn1cblxuY2xhc3MgQ29udGVudE1hcCB7XG4gIHByaXZhdGUgc2xvdEFuZFlUZXh0TWFwID0gbmV3IFdlYWtNYXA8U2xvdCwgWVRleHQ+KClcbiAgcHJpdmF0ZSB5VGV4dEFuZFNMb3RNYXAgPSBuZXcgV2Vha01hcDxZVGV4dCwgU2xvdD4oKVxuXG4gIHNldChrZXk6IFNsb3QsIHZhbHVlOiBZVGV4dCk6IHZvaWRcbiAgc2V0KGtleTogWVRleHQsIHZhbHVlOiBTbG90KTogdm9pZFxuICBzZXQoa2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoa2V5IGluc3RhbmNlb2YgU2xvdCkge1xuICAgICAgdGhpcy5zbG90QW5kWVRleHRNYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgICB0aGlzLnlUZXh0QW5kU0xvdE1hcC5zZXQodmFsdWUsIGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zbG90QW5kWVRleHRNYXAuc2V0KHZhbHVlLCBrZXkpXG4gICAgICB0aGlzLnlUZXh0QW5kU0xvdE1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5OiBTbG90KTogWVRleHQgfCBudWxsXG4gIGdldChrZXk6IFlUZXh0KTogU2xvdCB8IG51bGxcbiAgZ2V0KGtleTogYW55KSB7XG4gICAgaWYgKGtleSBpbnN0YW5jZW9mIFNsb3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsb3RBbmRZVGV4dE1hcC5nZXQoa2V5KSB8fCBudWxsXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnlUZXh0QW5kU0xvdE1hcC5nZXQoa2V5KSB8fCBudWxsXG4gIH1cblxuICBkZWxldGUoa2V5OiBTbG90IHwgWVRleHQpIHtcbiAgICBpZiAoa2V5IGluc3RhbmNlb2YgU2xvdCkge1xuICAgICAgY29uc3QgdiA9IHRoaXMuc2xvdEFuZFlUZXh0TWFwLmdldChrZXkpXG4gICAgICB0aGlzLnNsb3RBbmRZVGV4dE1hcC5kZWxldGUoa2V5KVxuICAgICAgaWYgKHYpIHtcbiAgICAgICAgdGhpcy55VGV4dEFuZFNMb3RNYXAuZGVsZXRlKHYpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnlUZXh0QW5kU0xvdE1hcC5nZXQoa2V5KVxuICAgICAgdGhpcy55VGV4dEFuZFNMb3RNYXAuZGVsZXRlKGtleSlcbiAgICAgIGlmICh2KSB7XG4gICAgICAgIHRoaXMuc2xvdEFuZFlUZXh0TWFwLmRlbGV0ZSh2KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgVXBkYXRlIHtcbiAgcmVjb3JkOiBib29sZWFuXG4gIGFjdGlvbnM6IEFycmF5PCgpID0+IHZvaWQ+XG59XG5cbmludGVyZmFjZSBVcGRhdGVJdGVtIHtcbiAgcmVjb3JkOiBib29sZWFuXG5cbiAgYWN0aW9uKCk6IHZvaWRcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbGxhYm9yYXRlIGltcGxlbWVudHMgSGlzdG9yeSB7XG4gIG9uU2VsZWN0aW9uQ2hhbmdlOiBPYnNlcnZhYmxlPFNlbGVjdGlvblBhdGhzPlxuICB5RG9jID0gbmV3IFlEb2MoKVxuICBvbkJhY2s6IE9ic2VydmFibGU8dm9pZD5cbiAgb25Gb3J3YXJkOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uQ2hhbmdlOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uUHVzaDogT2JzZXJ2YWJsZTx2b2lkPlxuXG4gIGdldCBjYW5CYWNrKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblVuZG8oKSB8fCBmYWxzZVxuICB9XG5cbiAgZ2V0IGNhbkZvcndhcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uY2FuUmVkbygpIHx8IGZhbHNlXG4gIH1cblxuICBwcm90ZWN0ZWQgYmFja0V2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcm90ZWN0ZWQgZm9yd2FyZEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByb3RlY3RlZCBwdXNoRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgcHJvdGVjdGVkIG1hbmFnZXI6IFVuZG9NYW5hZ2VyIHwgbnVsbCA9IG51bGxcblxuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXVxuICBwcm90ZWN0ZWQgdXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG5cbiAgcHJvdGVjdGVkIGNvbnRlbnRTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8U2xvdCwgKCkgPT4gdm9pZD4oKVxuICBwcm90ZWN0ZWQgc2xvdFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJvdGVjdGVkIHNsb3RzU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG4gIHByb3RlY3RlZCBjb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxDb21wb25lbnRJbnN0YW5jZSwgKCkgPT4gdm9pZD4oKVxuXG4gIHByb3RlY3RlZCBzZWxlY3Rpb25DaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblBhdGhzPigpXG4gIHByb3RlY3RlZCBjb250ZW50TWFwID0gbmV3IENvbnRlbnRNYXAoKVxuXG4gIHByb3RlY3RlZCB1cGRhdGVSZW1vdGVBY3Rpb25zOiBBcnJheTxVcGRhdGVJdGVtPiA9IFtdXG4gIHByb3RlY3RlZCBub1JlY29yZCA9IHt9XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChISVNUT1JZX1NUQUNLX1NJWkUpIHByb3RlY3RlZCBzdGFja1NpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHJvb3RDb21wb25lbnRSZWY6IFJvb3RDb21wb25lbnRSZWYsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjb2xsYWJvcmF0ZUN1cnNvcjogQ29sbGFib3JhdGVDdXJzb3IsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgc2NoZWR1bGVyOiBTY2hlZHVsZXIsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBmYWN0b3J5OiBGYWN0b3J5LFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgc2VsZWN0aW9uOiBTZWxlY3Rpb24sXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBzdGFydGVyOiBTdGFydGVyKSB7XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKCkucGlwZShkZWxheSgpKVxuICAgIHRoaXMub25CYWNrID0gdGhpcy5iYWNrRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uRm9yd2FyZCA9IHRoaXMuZm9yd2FyZEV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMuY2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uUHVzaCA9IHRoaXMucHVzaEV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICBsaXN0ZW4oKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMueURvYy5nZXRNYXAoJ1Jvb3RDb21wb25lbnQnKVxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuY29tcG9uZW50IVxuICAgIHRoaXMubWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihyb290LCB7XG4gICAgICB0cmFja2VkT3JpZ2luczogbmV3IFNldDxhbnk+KFt0aGlzLnlEb2NdKVxuICAgIH0pXG4gICAgY29uc3QgY3Vyc29yS2V5ID0gJ2N1cnNvci1wb3NpdGlvbidcbiAgICB0aGlzLm1hbmFnZXIub24oJ3N0YWNrLWl0ZW0tYWRkZWQnLCBldmVudCA9PiB7XG4gICAgICBldmVudC5zdGFja0l0ZW0ubWV0YS5zZXQoY3Vyc29yS2V5LCB0aGlzLmdldFJlbGF0aXZlQ3Vyc29yTG9jYXRpb24oKSlcbiAgICAgIGlmICh0aGlzLm1hbmFnZXIhLnVuZG9TdGFjay5sZW5ndGggPiB0aGlzLnN0YWNrU2l6ZSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIhLnVuZG9TdGFjay5zaGlmdCgpXG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQub3JpZ2luID09PSB0aGlzLnlEb2MpIHtcbiAgICAgICAgdGhpcy5wdXNoRXZlbnQubmV4dCgpXG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZUV2ZW50Lm5leHQoKVxuICAgIH0pXG4gICAgdGhpcy5tYW5hZ2VyLm9uKCdzdGFjay1pdGVtLXBvcHBlZCcsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZXZlbnQuc3RhY2tJdGVtLm1ldGEuZ2V0KGN1cnNvcktleSkgYXMgQ3Vyc29yUG9zaXRpb25cbiAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnJlc3RvcmVDdXJzb3JMb2NhdGlvbihwb3NpdGlvbilcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZWxlY3Rpb24ub25DaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRQYXRocygpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQubmV4dChwYXRocylcbiAgICAgIH0pLFxuICAgICAgdGhpcy5zY2hlZHVsZXIub25Eb2NDaGFuZ2VkLnBpcGUoXG4gICAgICAgIG1hcChpdGVtID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5maWx0ZXIoaSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaS5mcm9tICE9PSBDaGFuZ2VPcmlnaW4uUmVtb3RlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5sZW5ndGhcbiAgICAgICAgfSlcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlczogVXBkYXRlW10gPSBbXVxuXG4gICAgICAgIGxldCB1cGRhdGU6IFVwZGF0ZSB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucykge1xuICAgICAgICAgIGlmICghdXBkYXRlKSB7XG4gICAgICAgICAgICB1cGRhdGUgPSB7XG4gICAgICAgICAgICAgIHJlY29yZDogaXRlbS5yZWNvcmQsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVzLnB1c2godXBkYXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodXBkYXRlLnJlY29yZCA9PT0gaXRlbS5yZWNvcmQpIHtcbiAgICAgICAgICAgIHVwZGF0ZS5hY3Rpb25zLnB1c2goaXRlbS5hY3Rpb24pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwZGF0ZSA9IHtcbiAgICAgICAgICAgICAgcmVjb3JkOiBpdGVtLnJlY29yZCxcbiAgICAgICAgICAgICAgYWN0aW9uczogW2l0ZW0uYWN0aW9uXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKHVwZGF0ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVJlbW90ZUFjdGlvbnMgPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB1cGRhdGVzKSB7XG4gICAgICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uYWN0aW9ucy5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgICAgICAgZm4oKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9LCBpdGVtLnJlY29yZCA/IHRoaXMueURvYyA6IHRoaXMubm9SZWNvcmQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuc3luY1Jvb3RDb21wb25lbnQocm9vdCwgcm9vdENvbXBvbmVudClcbiAgfVxuXG4gIHVwZGF0ZVJlbW90ZVNlbGVjdGlvbihwYXRoczogUmVtb3RlU2VsZWN0aW9uW10pIHtcbiAgICB0aGlzLmNvbGxhYm9yYXRlQ3Vyc29yLmRyYXcocGF0aHMpXG4gIH1cblxuICBiYWNrKCkge1xuICAgIGlmICh0aGlzLmNhbkJhY2spIHtcbiAgICAgIHRoaXMubWFuYWdlcj8udW5kbygpXG4gICAgICB0aGlzLmJhY2tFdmVudC5uZXh0KClcbiAgICB9XG4gIH1cblxuICBmb3J3YXJkKCkge1xuICAgIGlmICh0aGlzLmNhbkZvcndhcmQpIHtcbiAgICAgIHRoaXMubWFuYWdlcj8ucmVkbygpXG4gICAgICB0aGlzLmZvcndhcmRFdmVudC5uZXh0KClcbiAgICB9XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLm1hbmFnZXI/LmNsZWFyKClcbiAgICB0aGlzLmNoYW5nZUV2ZW50Lm5leHQoKVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChpID0+IGkudW5zdWJzY3JpYmUoKSlcbiAgICB0aGlzLmNvbGxhYm9yYXRlQ3Vyc29yLmRlc3Ryb3koKVxuICAgIHRoaXMubWFuYWdlcj8uZGVzdHJveSgpXG4gIH1cblxuICBwcm90ZWN0ZWQgc3luY1Jvb3RDb21wb25lbnQocm9vdDogWU1hcDxhbnk+LCByb290Q29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIGxldCBzbG90cyA9IHJvb3QuZ2V0KCdzbG90cycpIGFzIFlBcnJheTxZTWFwPGFueT4+XG4gICAgaWYgKCFzbG90cykge1xuICAgICAgc2xvdHMgPSBuZXcgWUFycmF5KClcbiAgICAgIHJvb3RDb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goaSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3QoaSlcbiAgICAgICAgc2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgICB9KVxuICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgcm9vdC5zZXQoJ3N0YXRlJywgcm9vdENvbXBvbmVudC5zdGF0ZSlcbiAgICAgICAgcm9vdC5zZXQoJ3Nsb3RzJywgc2xvdHMpXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoc2xvdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByb290Q29tcG9uZW50LnVwZGF0ZVN0YXRlKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvb3QuZ2V0KCdzdGF0ZScpXG4gICAgICB9KVxuICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgcm9vdENvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KGkpXG4gICAgICAgICAgc2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByb290Q29tcG9uZW50LnVwZGF0ZVN0YXRlKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvb3QuZ2V0KCdzdGF0ZScpXG4gICAgICB9KVxuICAgICAgcm9vdENvbXBvbmVudC5zbG90cy5jbGVhbigpXG4gICAgICBzbG90cy5mb3JFYWNoKHNoYXJlZFNsb3QgPT4ge1xuICAgICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3QpXG4gICAgICAgIHRoaXMuc3luY0NvbnRlbnQoc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSwgc2xvdClcbiAgICAgICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgICAgICByb290Q29tcG9uZW50LnNsb3RzLmluc2VydChzbG90KVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5zeW5jQ29tcG9uZW50KHJvb3QsIHJvb3RDb21wb25lbnQpXG4gICAgdGhpcy5zeW5jU2xvdHMoc2xvdHMsIHJvb3RDb21wb25lbnQpXG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzdG9yZUN1cnNvckxvY2F0aW9uKHBvc2l0aW9uOiBDdXJzb3JQb3NpdGlvbikge1xuICAgIGNvbnN0IGFuY2hvclBvc2l0aW9uID0gY3JlYXRlQWJzb2x1dGVQb3NpdGlvbkZyb21SZWxhdGl2ZVBvc2l0aW9uKHBvc2l0aW9uLmFuY2hvciwgdGhpcy55RG9jKVxuICAgIGNvbnN0IGZvY3VzUG9zaXRpb24gPSBjcmVhdGVBYnNvbHV0ZVBvc2l0aW9uRnJvbVJlbGF0aXZlUG9zaXRpb24ocG9zaXRpb24uZm9jdXMsIHRoaXMueURvYylcbiAgICBpZiAoYW5jaG9yUG9zaXRpb24gJiYgZm9jdXNQb3NpdGlvbikge1xuICAgICAgY29uc3QgZm9jdXNTbG90ID0gdGhpcy5jb250ZW50TWFwLmdldChmb2N1c1Bvc2l0aW9uLnR5cGUgYXMgWVRleHQpXG4gICAgICBjb25zdCBhbmNob3JTbG90ID0gdGhpcy5jb250ZW50TWFwLmdldChhbmNob3JQb3NpdGlvbi50eXBlIGFzIFlUZXh0KVxuICAgICAgaWYgKGZvY3VzU2xvdCAmJiBhbmNob3JTbG90KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEJhc2VBbmRFeHRlbnQoYW5jaG9yU2xvdCwgYW5jaG9yUG9zaXRpb24uaW5kZXgsIGZvY3VzU2xvdCwgZm9jdXNQb3NpdGlvbi5pbmRleClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uLnVuU2VsZWN0KClcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZWxhdGl2ZUN1cnNvckxvY2F0aW9uKCk6IEN1cnNvclBvc2l0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgeyBhbmNob3JTbG90LCBhbmNob3JPZmZzZXQsIGZvY3VzU2xvdCwgZm9jdXNPZmZzZXQgfSA9IHRoaXMuc2VsZWN0aW9uXG4gICAgaWYgKGFuY2hvclNsb3QpIHtcbiAgICAgIGNvbnN0IGFuY2hvcllUZXh0ID0gdGhpcy5jb250ZW50TWFwLmdldChhbmNob3JTbG90KVxuICAgICAgaWYgKGFuY2hvcllUZXh0KSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclBvc2l0aW9uID0gY3JlYXRlUmVsYXRpdmVQb3NpdGlvbkZyb21UeXBlSW5kZXgoYW5jaG9yWVRleHQsIGFuY2hvck9mZnNldCEpXG4gICAgICAgIGlmIChmb2N1c1Nsb3QpIHtcbiAgICAgICAgICBjb25zdCBmb2N1c1lUZXh0ID0gdGhpcy5jb250ZW50TWFwLmdldChmb2N1c1Nsb3QpXG4gICAgICAgICAgaWYgKGZvY3VzWVRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzUG9zaXRpb24gPSBjcmVhdGVSZWxhdGl2ZVBvc2l0aW9uRnJvbVR5cGVJbmRleChmb2N1c1lUZXh0LCBmb2N1c09mZnNldCEpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBmb2N1czogZm9jdXNQb3NpdGlvbixcbiAgICAgICAgICAgICAgYW5jaG9yOiBhbmNob3JQb3NpdGlvblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcHJvdGVjdGVkIHN5bmNDb250ZW50KGNvbnRlbnQ6IFlUZXh0LCBzbG90OiBTbG90KSB7XG4gICAgdGhpcy5jb250ZW50TWFwLnNldChzbG90LCBjb250ZW50KVxuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBzbG90LnJldGFpbigwKVxuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IHJlbW90ZUZvcm1hdHNUb0xvY2FsKHRoaXMuZmFjdG9yeSwgYWN0aW9uLmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgIGlmIChmb3JtYXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNsb3QucmV0YWluKGFjdGlvbi5yZXRhaW4hLCBmb3JtYXRzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNsb3QucmV0YWluKHNsb3QuaW5kZXggKyBhY3Rpb24ucmV0YWluKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2xvdC5yZXRhaW4oYWN0aW9uLnJldGFpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDFcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmluc2VydC5sZW5ndGhcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoYWN0aW9uLmluc2VydCwgcmVtb3RlRm9ybWF0c1RvTG9jYWwodGhpcy5mYWN0b3J5LCBhY3Rpb24uYXR0cmlidXRlcykpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBhY3Rpb24uaW5zZXJ0IGFzIFlNYXA8YW55PlxuICAgICAgICAgICAgICBjb25zdCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQgPSBzbG90LnNjaGVtYS5pbmNsdWRlcyhDb250ZW50VHlwZS5JbmxpbmVDb21wb25lbnQpXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZENvbXBvbmVudC5nZXQoJ3Nsb3RzJyksIGNvbXBvbmVudClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgICAgICAgICAgICBzbG90Lmluc2VydChjb21wb25lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uYW5jaG9yU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5hbmNob3JPZmZzZXQhID4gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRBbmNob3Ioc2xvdCwgdGhpcy5zZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ISArIGxlbmd0aClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uZm9jdXNTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ISA+IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0Rm9jdXMoc2xvdCwgdGhpcy5zZWxlY3Rpb24uZm9jdXNPZmZzZXQhICsgbGVuZ3RoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZGVsZXRlKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHNsb3QuaW5kZXhcbiAgICAgICAgICAgIHNsb3QucmV0YWluKHNsb3QuaW5kZXgpXG4gICAgICAgICAgICBzbG90LmRlbGV0ZShhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmFuY2hvclNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEFuY2hvcihzbG90LCB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgLSBhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5mb2N1c1Nsb3QgJiYgdGhpcy5zZWxlY3Rpb24uZm9jdXNPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0Rm9jdXMoc2xvdCwgdGhpcy5zZWxlY3Rpb24uZm9jdXNPZmZzZXQhIC0gYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHNsb3QudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ID09PSAnb2JqZWN0JyAmJiBkcmFmdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIGFjdGlvbi5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb24uYXR0cmlidXRlc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnRlbnQub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdC5vbkNvbnRlbnRDaGFuZ2UucGlwZShmaWx0ZXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICF0aGlzLnNjaGVkdWxlci5pZ25vcmVDaGFuZ2VzXG4gICAgfSkpLnN1YnNjcmliZShhY3Rpb25zID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMFxuICAgICAgICBsZXQgbGVuZ3RoID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAncmV0YWluJykge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IGFjdGlvbi5mb3JtYXRzXG4gICAgICAgICAgICBpZiAoZm9ybWF0cykge1xuICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZm9ybWF0cylcbiAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAgICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHRoaXMuZmFjdG9yeS5nZXRGb3JtYXR0ZXIoa2V5KVxuICAgICAgICAgICAgICAgIGlmICghZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICBsZW5ndGgtLVxuICAgICAgICAgICAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShmb3JtYXRzLCBrZXkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5mb3JtYXQob2Zmc2V0LCBhY3Rpb24ub2Zmc2V0LCBmb3JtYXRzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvZmZzZXQgPSBhY3Rpb24ub2Zmc2V0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2luc2VydCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcbiAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBkZWx0YS5sZW5ndGggPT09IDEgJiYgZGVsdGFbMF0uaW5zZXJ0ID09PSBTbG90LmVtcHR5UGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGxlbmd0aCA9IGFjdGlvbi5jb250ZW50Lmxlbmd0aFxuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydChvZmZzZXQsIGFjdGlvbi5jb250ZW50LCBhY3Rpb24uZm9ybWF0cyB8fCB7fSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxlbmd0aCA9IDFcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChhY3Rpb24ucmVmIGFzIENvbXBvbmVudEluc3RhbmNlKVxuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydEVtYmVkKG9mZnNldCwgc2hhcmVkQ29tcG9uZW50LCBhY3Rpb24uZm9ybWF0cyB8fCB7fSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzRW1wdHkgJiYgb2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZGVsZXRlKGNvbnRlbnQubGVuZ3RoIC0gMSwgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZGVsZXRlKG9mZnNldCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0KDAsICdcXG4nLCBkZWx0YVswXT8uYXR0cmlidXRlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHN1Yi5hZGQoc2xvdC5vbkNoaWxkQ29tcG9uZW50UmVtb3ZlLnN1YnNjcmliZShjb21wb25lbnRzID0+IHtcbiAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChjKVxuICAgICAgfSlcbiAgICB9KSlcbiAgICB0aGlzLmNvbnRlbnRTeW5jQ2FjaGVzLnNldChzbG90LCAoKSA9PiB7XG4gICAgICBjb250ZW50LnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIHN5bmNTbG90KHJlbW90ZVNsb3Q6IFlNYXA8YW55Piwgc2xvdDogU2xvdCkge1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5rZXlzQ2hhbmdlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoZXYudGFyZ2V0IGFzIFlNYXA8YW55PikuZ2V0KCdzdGF0ZScpXG4gICAgICAgICAgICBzbG90LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkcmFmdCA9PT0gJ29iamVjdCcgJiYgZHJhZnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBzdGF0ZSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVTbG90Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3Qub25TdGF0ZUNoYW5nZS5waXBlKGZpbHRlcigoKSA9PiB7XG4gICAgICByZXR1cm4gIXRoaXMuc2NoZWR1bGVyLmlnbm9yZUNoYW5nZXNcbiAgICB9KSkuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgcmVtb3RlU2xvdC5zZXQoJ3N0YXRlJywgY2hhbmdlLm5ld1N0YXRlKVxuICAgICAgfSwgY2hhbmdlLnJlY29yZClcbiAgICB9KVxuICAgIHRoaXMuc2xvdFN0YXRlU3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgcmVtb3RlU2xvdC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW5jU2xvdHMocmVtb3RlU2xvdHM6IFlBcnJheTxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc2xvdHMgPSBjb21wb25lbnQuc2xvdHNcbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBpbmRleCArPSBhY3Rpb24ucmV0YWluXG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oaW5kZXgpXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgICAgICAoYWN0aW9uLmluc2VydCBhcyBBcnJheTxZTWFwPGFueT4+KS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KGl0ZW0pXG4gICAgICAgICAgICAgIHNsb3RzLmluc2VydChzbG90KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb250ZW50KGl0ZW0uZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3QoaXRlbSwgc2xvdClcbiAgICAgICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5kZWxldGUpIHtcbiAgICAgICAgICAgIHNsb3RzLnJldGFpbihpbmRleClcbiAgICAgICAgICAgIHNsb3RzLmRlbGV0ZShhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJlbW90ZVNsb3RzLm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3RzLm9uQ2hhbmdlLnBpcGUoZmlsdGVyKCgpID0+IHtcbiAgICAgIHJldHVybiAhdGhpcy5zY2hlZHVsZXIuaWdub3JlQ2hhbmdlc1xuICAgIH0pKS5zdWJzY3JpYmUob3BlcmF0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXBwbHlBY3Rpb25zID0gb3BlcmF0aW9ucy5hcHBseVxuICAgICAgICBsZXQgaW5kZXg6IG51bWJlclxuICAgICAgICBhcHBseUFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGluZGV4ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnRTbG90Jykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChhY3Rpb24ucmVmKVxuICAgICAgICAgICAgcmVtb3RlU2xvdHMuaW5zZXJ0KGluZGV4LCBbc2hhcmVkU2xvdF0pXG4gICAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmRlbGV0ZShpbmRleCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHN1Yi5hZGQoc2xvdHMub25DaGlsZFNsb3RSZW1vdmUuc3Vic2NyaWJlKHNsb3RzID0+IHtcbiAgICAgIHNsb3RzLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlTbG90KHNsb3QpXG4gICAgICB9KVxuICAgIH0pKVxuXG4gICAgdGhpcy5zbG90c1N5bmNDYWNoZXMuc2V0KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgcmVtb3RlU2xvdHMudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgc3luY0NvbXBvbmVudChyZW1vdGVDb21wb25lbnQ6IFlNYXA8YW55PiwgY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5rZXlzQ2hhbmdlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoZXYudGFyZ2V0IGFzIFlNYXA8YW55PikuZ2V0KCdzdGF0ZScpXG4gICAgICAgICAgICBjb21wb25lbnQudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ID09PSAnb2JqZWN0JyAmJiBkcmFmdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIHN0YXRlKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJlbW90ZUNvbXBvbmVudC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBjb21wb25lbnQub25TdGF0ZUNoYW5nZS5waXBlKGZpbHRlcigoKSA9PiB7XG4gICAgICByZXR1cm4gIXRoaXMuc2NoZWR1bGVyLmlnbm9yZUNoYW5nZXNcbiAgICB9KSkuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgcmVtb3RlQ29tcG9uZW50LnNldCgnc3RhdGUnLCBjaGFuZ2UubmV3U3RhdGUpXG4gICAgICB9LCBjaGFuZ2UucmVjb3JkKVxuICAgIH0pXG4gICAgdGhpcy5jb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMuc2V0KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgcmVtb3RlQ29tcG9uZW50LnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIHJ1bkxvY2FsVXBkYXRlKGZuOiAoKSA9PiB2b2lkLCByZWNvcmQgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMudXBkYXRlRnJvbVJlbW90ZSB8fCB0aGlzLmNvbnRyb2xsZXIucmVhZG9ubHkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVJlbW90ZUFjdGlvbnMucHVzaCh7XG4gICAgICByZWNvcmQsXG4gICAgICBhY3Rpb246IGZuXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBydW5SZW1vdGVVcGRhdGUodHI6IFRyYW5zYWN0aW9uLCBmbjogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0ci5vcmlnaW4gPT09IHRoaXMueURvYykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMudXBkYXRlRnJvbVJlbW90ZSA9IHRydWVcbiAgICBpZiAodHIub3JpZ2luID09PSB0aGlzLm1hbmFnZXIpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVyLmhpc3RvcnlBcHBseVRyYW5zYWN0KGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjaGVkdWxlci5yZW1vdGVVcGRhdGVUcmFuc2FjdChmbilcbiAgICB9XG4gICAgdGhpcy51cGRhdGVGcm9tUmVtb3RlID0gZmFsc2VcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc3RhdGUnLCBjb21wb25lbnQuc3RhdGUpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnbmFtZScsIGNvbXBvbmVudC5uYW1lKVxuICAgIGNvbnN0IHNoYXJlZFNsb3RzID0gbmV3IFlBcnJheSgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc2xvdHMnLCBzaGFyZWRTbG90cylcbiAgICBjb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICBzaGFyZWRTbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICB9KVxuICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZFNsb3RzLCBjb21wb25lbnQpXG4gICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgIHJldHVybiBzaGFyZWRDb21wb25lbnRcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3Q6IFNsb3QpOiBZTWFwPGFueT4ge1xuICAgIGNvbnN0IHNoYXJlZFNsb3QgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ3NjaGVtYScsIHNsb3Quc2NoZW1hKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzdGF0ZScsIHNsb3Quc3RhdGUpXG4gICAgY29uc3Qgc2hhcmVkQ29udGVudCA9IG5ldyBZVGV4dCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ2NvbnRlbnQnLCBzaGFyZWRDb250ZW50KVxuICAgIGxldCBvZmZzZXQgPSAwXG4gICAgc2xvdC50b0RlbHRhKCkuZm9yRWFjaChpID0+IHtcbiAgICAgIGxldCBmb3JtYXRzOiBhbnkgPSB7fVxuICAgICAgaWYgKGkuZm9ybWF0cykge1xuICAgICAgICBpLmZvcm1hdHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBmb3JtYXRzW2l0ZW1bMF0ubmFtZV0gPSBpdGVtWzFdXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXRzID0gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2hhcmVkQ29udGVudC5pbnNlcnQob2Zmc2V0LCBpLmluc2VydCwgZm9ybWF0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoaS5pbnNlcnQpXG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0RW1iZWQob2Zmc2V0LCBzaGFyZWRDb21wb25lbnQsIGZvcm1hdHMpXG4gICAgICB9XG4gICAgICBvZmZzZXQgKz0gaS5pbnNlcnQubGVuZ3RoXG4gICAgfSlcbiAgICB0aGlzLnN5bmNDb250ZW50KHNoYXJlZENvbnRlbnQsIHNsb3QpXG4gICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgIHJldHVybiBzaGFyZWRTbG90XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoeU1hcDogWU1hcDxhbnk+LCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQ6IGJvb2xlYW4pOiBDb21wb25lbnRJbnN0YW5jZSB7XG4gICAgY29uc3Qgc2hhcmVkU2xvdHMgPSB5TWFwLmdldCgnc2xvdHMnKSBhcyBZQXJyYXk8WU1hcDxhbnk+PlxuICAgIGNvbnN0IHNsb3RzOiBTbG90W10gPSBbXVxuICAgIHNoYXJlZFNsb3RzLmZvckVhY2goc2hhcmVkU2xvdCA9PiB7XG4gICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3QpXG4gICAgICBzbG90cy5wdXNoKHNsb3QpXG4gICAgfSlcbiAgICBjb25zdCBuYW1lID0geU1hcC5nZXQoJ25hbWUnKVxuICAgIGNvbnN0IHN0YXRlID0geU1hcC5nZXQoJ3N0YXRlJylcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZmFjdG9yeS5jcmVhdGVDb21wb25lbnRCeURhdGEobmFtZSwge1xuICAgICAgc3RhdGUsXG4gICAgICBzbG90c1xuICAgIH0pXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5zbG90cy50b0FycmF5KCkuZm9yRWFjaCgoc2xvdCwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNoYXJlZFNsb3QgPSBzaGFyZWRTbG90cy5nZXQoaW5kZXgpXG4gICAgICAgIGlmICghc2hhcmVkU2xvdCkge1xuICAgICAgICAgIHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3Qoc2xvdClcbiAgICAgICAgICBzaGFyZWRTbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNTbG90KHNoYXJlZFNsb3QsIHNsb3QpXG4gICAgICAgIHRoaXMuc3luY0NvbnRlbnQoc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSwgc2xvdClcbiAgICAgIH0pXG4gICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVVua25vd25Db21wb25lbnQobmFtZSwgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50KS5jcmVhdGVJbnN0YW5jZSh0aGlzLnN0YXJ0ZXIpXG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChzaGFyZWRTbG90OiBZTWFwPGFueT4pOiBTbG90IHtcbiAgICBjb25zdCBjb250ZW50ID0gc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSBhcyBZVGV4dFxuICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcblxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLmZhY3RvcnkuY3JlYXRlU2xvdCh7XG4gICAgICBzY2hlbWE6IHNoYXJlZFNsb3QuZ2V0KCdzY2hlbWEnKSxcbiAgICAgIHN0YXRlOiBzaGFyZWRTbG90LmdldCgnc3RhdGUnKSxcbiAgICAgIGZvcm1hdHM6IHt9LFxuICAgICAgY29udGVudDogW11cbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgZGVsdGEpIHtcbiAgICAgIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzbG90Lmluc2VydChhY3Rpb24uaW5zZXJ0LCByZW1vdGVGb3JtYXRzVG9Mb2NhbCh0aGlzLmZhY3RvcnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBhY3Rpb24uaW5zZXJ0IGFzIFlNYXA8YW55PlxuICAgICAgICAgIGNvbnN0IGNhbkluc2VydElubGluZUNvbXBvbmVudCA9IHNsb3Quc2NoZW1hLmluY2x1ZGVzKENvbnRlbnRUeXBlLklubGluZUNvbXBvbmVudClcbiAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50KVxuICAgICAgICAgIHNsb3QuaW5zZXJ0KGNvbXBvbmVudCwgcmVtb3RlRm9ybWF0c1RvTG9jYWwodGhpcy5mYWN0b3J5LCBhY3Rpb24uYXR0cmlidXRlcykpXG4gICAgICAgICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkQ29tcG9uZW50LmdldCgnc2xvdHMnKSwgY29tcG9uZW50KVxuICAgICAgICAgIHRoaXMuc3luY0NvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgY29sbGFib3JhdGVFcnJvckZuKCd1bmV4cGVjdGVkIGRlbHRhIGFjdGlvbi4nKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2xvdFxuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90OiBTbG90KSB7XG4gICAgdGhpcy5jb250ZW50TWFwLmRlbGV0ZShzbG90KTtcbiAgICBbdGhpcy5jb250ZW50U3luY0NhY2hlcy5nZXQoc2xvdCksIHRoaXMuc2xvdFN0YXRlU3luY0NhY2hlcy5nZXQoc2xvdCldLmZvckVhY2goZm4gPT4ge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHNsb3Quc2xpY2VDb250ZW50KCkuZm9yRWFjaChpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIFt0aGlzLnNsb3RzU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KSwgdGhpcy5jb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMuZ2V0KGNvbXBvbmVudCldLmZvckVhY2goZm4gPT4ge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKClcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChzbG90ID0+IHtcbiAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlTbG90KHNsb3QpXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdGVGb3JtYXRzVG9Mb2NhbChmYWN0b3J5OiBGYWN0b3J5LCBhdHRycz86IGFueSwpIHtcbiAgY29uc3QgZm9ybWF0czogRm9ybWF0cyA9IFtdXG4gIGlmIChhdHRycykge1xuICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBmYWN0b3J5LmdldEZvcm1hdHRlcihrZXkpXG4gICAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICAgIGZvcm1hdHMucHVzaChbZm9ybWF0dGVyLCBhdHRyc1trZXldXSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiBmb3JtYXRzXG59XG4iXX0=
|
717
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxlQUFlLENBQUE7QUFDckYsT0FBTyxFQUNMLFlBQVksRUFFWixXQUFXLEVBQ1gsVUFBVSxFQUNWLE9BQU8sRUFHUCxrQkFBa0IsRUFDbEIsU0FBUyxFQUNULGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsU0FBUyxFQUVULElBQUksRUFDSixPQUFPLEVBQ1IsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLEtBQUssSUFBSSxNQUFNLEVBQ2YsR0FBRyxJQUFJLElBQUksRUFDWCxHQUFHLElBQUksSUFBSSxFQUVYLElBQUksSUFBSSxLQUFLLEVBRWIsV0FBVyxFQUNYLDBDQUEwQyxFQUMxQyxtQ0FBbUMsRUFDcEMsTUFBTSxLQUFLLENBQUE7QUFFWixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sc0JBQXNCLENBQUE7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFNUQsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7QUFPbkQsTUFBTSxVQUFVO0lBQWhCO1FBQ1Usb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFBO1FBQzVDLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQTtJQXNDdEQsQ0FBQztJQWxDQyxHQUFHLENBQUMsR0FBUSxFQUFFLEtBQVU7UUFDdEIsSUFBSSxHQUFHLFlBQVksSUFBSSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7U0FDckM7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7U0FDckM7SUFDSCxDQUFDO0lBSUQsR0FBRyxDQUFDLEdBQVE7UUFDVixJQUFJLEdBQUcsWUFBWSxJQUFJLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUE7U0FDN0M7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQTtJQUM5QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQWlCO1FBQ3RCLElBQUksR0FBRyxZQUFZLElBQUksRUFBRTtZQUN2QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoQyxJQUFJLENBQUMsRUFBRTtnQkFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUMvQjtTQUNGO2FBQU07WUFDTCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoQyxJQUFJLENBQUMsRUFBRTtnQkFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUMvQjtTQUNGO0lBQ0gsQ0FBQztDQUNGO0FBY0QsSUFBYSxXQUFXLEdBQXhCLE1BQWEsV0FBVztJQXFDdEIsWUFBa0QsU0FBaUIsRUFDN0MsZ0JBQWtDLEVBQ2xDLGlCQUFvQyxFQUNwQyxVQUFzQixFQUN0QixTQUFvQixFQUNwQixPQUFnQixFQUNoQixTQUFvQixFQUNwQixPQUFnQjtRQVBZLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDN0MscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQTFDdEMsU0FBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFjUCxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtRQUMvQixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUE7UUFDbEMsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO1FBQ2pDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO1FBRS9CLFlBQU8sR0FBdUIsSUFBSSxDQUFBO1FBRWxDLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQTtRQUNsQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFFeEIsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQW9CLENBQUE7UUFDbkQsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQW9CLENBQUE7UUFDckQsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBaUMsQ0FBQTtRQUM5RCw2QkFBd0IsR0FBRyxJQUFJLE9BQU8sRUFBaUMsQ0FBQTtRQUV2RSx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQTtRQUNwRCxlQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQTtRQUU3Qix3QkFBbUIsR0FBc0IsRUFBRSxDQUFBO1FBQzNDLGFBQVEsR0FBRyxFQUFFLENBQUE7UUFVckIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUMvRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDN0MsQ0FBQztJQTFDRCxJQUFJLE9BQU87O1FBQ1QsT0FBTyxDQUFBLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsT0FBTyxFQUFFLEtBQUksS0FBSyxDQUFBO0lBQ3pDLENBQUM7SUFFRCxJQUFJLFVBQVU7O1FBQ1osT0FBTyxDQUFBLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsT0FBTyxFQUFFLEtBQUksS0FBSyxDQUFBO0lBQ3pDLENBQUM7SUFzQ0QsTUFBTTtRQUNKLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFVLENBQUE7UUFDdEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7WUFDbkMsY0FBYyxFQUFFLElBQUksR0FBRyxDQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFBO1FBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQTtZQUNyRSxJQUFJLElBQUksQ0FBQyxPQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsT0FBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTthQUNoQztZQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFBO2FBQ3RCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUN6QixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzNDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQW1CLENBQUE7WUFDdEUsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFBO2FBQ3JDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFBO1lBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdkMsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUM5QixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JCLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsTUFBTSxDQUFBO1lBQ3ZDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLEVBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO1FBQ3BCLENBQUMsQ0FBQyxDQUNILENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQTtZQUU1QixJQUFJLE1BQU0sR0FBa0IsSUFBSSxDQUFBO1lBRWhDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUMzQyxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNYLE1BQU0sR0FBRzt3QkFDUCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07d0JBQ25CLE9BQU8sRUFBRSxFQUFFO3FCQUNaLENBQUE7b0JBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtpQkFDckI7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ2pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtpQkFDakM7cUJBQU07b0JBQ0wsTUFBTSxHQUFHO3dCQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTt3QkFDbkIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztxQkFDdkIsQ0FBQTtvQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2lCQUNyQjthQUNGO1lBRUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQTtZQUU3QixLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sRUFBRTtnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFO29CQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTt3QkFDeEIsRUFBRSxFQUFFLENBQUE7b0JBQ04sQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTthQUM1QztRQUNILENBQUMsQ0FBQyxDQUNILENBQUE7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUF3QjtRQUM1QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFFRCxJQUFJOztRQUNGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLElBQUksRUFBRSxDQUFBO1lBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUE7U0FDdEI7SUFDSCxDQUFDO0lBRUQsT0FBTzs7UUFDTCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxJQUFJLEVBQUUsQ0FBQTtZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFBO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELEtBQUs7O1FBQ0gsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxLQUFLLEVBQUUsQ0FBQTtRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3pCLENBQUM7SUFFRCxPQUFPOztRQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2hDLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsT0FBTyxFQUFFLENBQUE7SUFDekIsQ0FBQztJQUVTLGlCQUFpQixDQUFDLElBQWUsRUFBRSxhQUFnQztRQUMzRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBc0IsQ0FBQTtRQUNsRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsS0FBSyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUE7WUFDcEIsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7WUFDMUIsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDMUIsQ0FBQyxDQUFDLENBQUE7U0FDSDthQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7Z0JBQzdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMxQixDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtvQkFDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7Z0JBQzFCLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7U0FDSDthQUFNO1lBQ0wsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7Z0JBQzdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMxQixDQUFDLENBQUMsQ0FBQTtZQUNGLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDM0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUNwQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNsQyxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxRQUF3QjtRQUN0RCxNQUFNLGNBQWMsR0FBRywwQ0FBMEMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3RixNQUFNLGFBQWEsR0FBRywwQ0FBMEMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzRixJQUFJLGNBQWMsSUFBSSxhQUFhLEVBQUU7WUFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQWEsQ0FBQyxDQUFBO1lBQ2xFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFhLENBQUMsQ0FBQTtZQUNwRSxJQUFJLFNBQVMsSUFBSSxVQUFVLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDakcsT0FBTTthQUNQO1NBQ0Y7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQzNCLENBQUM7SUFFUyx5QkFBeUI7UUFDakMsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7UUFDM0UsSUFBSSxVQUFVLEVBQUU7WUFDZCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUNuRCxJQUFJLFdBQVcsRUFBRTtnQkFDZixNQUFNLGNBQWMsR0FBRyxtQ0FBbUMsQ0FBQyxXQUFXLEVBQUUsWUFBYSxDQUFDLENBQUE7Z0JBQ3RGLElBQUksU0FBUyxFQUFFO29CQUNiLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO29CQUNqRCxJQUFJLFVBQVUsRUFBRTt3QkFDZCxNQUFNLGFBQWEsR0FBRyxtQ0FBbUMsQ0FBQyxVQUFVLEVBQUUsV0FBWSxDQUFDLENBQUE7d0JBQ25GLE9BQU87NEJBQ0wsS0FBSyxFQUFFLGFBQWE7NEJBQ3BCLE1BQU0sRUFBRSxjQUFjO3lCQUN2QixDQUFBO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVTLGVBQWUsQ0FBQyxPQUFjLEVBQUUsSUFBVTtRQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNkLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtvQkFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRTt3QkFDWCxPQUFNO3FCQUNQO29CQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7b0JBQ2hDLElBQUksVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO3dCQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTt3QkFDaEQsSUFBSSxTQUFTLEVBQUU7NEJBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO3lCQUN4RDtxQkFDRjt5QkFBTSxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUU7d0JBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO3dCQUNoRCxJQUFJLFNBQVMsRUFBRTs0QkFDYixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO3lCQUNoQztxQkFDRjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtnQkFDRixFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDeEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTt3QkFDakMsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFOzRCQUNyQixNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTs0QkFDckUsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO2dDQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7NkJBQ3JDOzRCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7eUJBQ3hDOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO3lCQUMzQjtxQkFDRjt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7d0JBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7d0JBQ3hCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQTt3QkFDZCxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7NEJBQ3JDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQTs0QkFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7eUJBQ2xGOzZCQUFNOzRCQUNMLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFtQixDQUFBOzRCQUNsRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQTs0QkFDbEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBOzRCQUNsRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTs0QkFDaEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQTs0QkFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTt5QkFDdkI7d0JBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTs0QkFDN0IsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFhLEdBQUcsS0FBSyxFQUFFO2dDQUM5RSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFhLEdBQUcsTUFBTSxDQUFDLENBQUE7NkJBQ3RFOzRCQUNELElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBWSxHQUFHLEtBQUssRUFBRTtnQ0FDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBWSxHQUFHLE1BQU0sQ0FBQyxDQUFBOzZCQUNwRTt5QkFDRjtxQkFDRjt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7d0JBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7d0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTt3QkFDMUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTs0QkFDN0IsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFhLElBQUksS0FBSyxFQUFFO2dDQUMvRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBOzZCQUM1RTs0QkFDRCxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVksSUFBSSxLQUFLLEVBQUU7Z0NBQzdFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7NkJBQzNFO3lCQUNGO3FCQUNGO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUE7UUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRTNCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFBO1FBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFOztnQkFDdkIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO2dCQUNkLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQTtnQkFDZCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtvQkFDNUIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTt3QkFDNUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQTt3QkFDOUIsSUFBSSxPQUFPLEVBQUU7NEJBQ1gsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTs0QkFDakMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTs0QkFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQ0FDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7Z0NBQ2hELElBQUksQ0FBQyxTQUFTLEVBQUU7b0NBQ2QsTUFBTSxFQUFFLENBQUE7b0NBQ1IsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUE7aUNBQ3JDOzRCQUNILENBQUMsQ0FBQyxDQUFBOzRCQUNGLElBQUksTUFBTSxFQUFFO2dDQUNWLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7NkJBQy9DO3lCQUNGOzZCQUFNOzRCQUNMLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFBO3lCQUN2QjtxQkFDRjt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO3dCQUNuQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7d0JBQy9CLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFBO3dCQUMvRSxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7NEJBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQTs0QkFDOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFBO3lCQUM3RDs2QkFBTTs0QkFDTCxNQUFNLEdBQUcsQ0FBQyxDQUFBOzRCQUNWLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLENBQUMsR0FBd0IsQ0FBQyxDQUFBOzRCQUM5RixPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQTt5QkFDbkU7d0JBRUQsSUFBSSxPQUFPLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTs0QkFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTt5QkFDdEM7d0JBQ0QsTUFBTSxJQUFJLE1BQU0sQ0FBQTtxQkFDakI7eUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTt3QkFDbkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO3dCQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7NEJBQ2xCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTt5QkFDckM7d0JBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTs0QkFDeEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQUEsS0FBSyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxVQUFVLENBQUMsQ0FBQTt5QkFDOUM7cUJBQ0Y7eUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTt3QkFDcEMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtxQkFDaEQ7eUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTt3QkFDdkMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7cUJBQ3JDO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUVGLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6RCxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNyQixJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdkMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDN0IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ25CLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVTLGFBQWEsQ0FBQyxVQUFxQixFQUFFLElBQVU7UUFDdkQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUM1QixFQUFFLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDM0IsSUFBSSxHQUFHLEtBQUssT0FBTyxFQUFFO3dCQUNuQixNQUFNLEtBQUssR0FBSSxFQUFFLENBQUMsTUFBb0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7d0JBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQ3ZCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0NBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBOzZCQUM1QjtpQ0FBTTtnQ0FDTCxPQUFPLEtBQUssQ0FBQTs2QkFDYjt3QkFDSCxDQUFDLENBQUMsQ0FBQTtxQkFDSDtnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFBO1FBQ0QsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUU5QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQTtRQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbkIsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDdEMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUNoQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDbkIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRVMsa0JBQWtCLENBQUMsV0FBd0IsRUFBRSxTQUE0QjtRQUNqRixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFBO1FBQzdCLE1BQU0sVUFBVSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDNUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFBO2dCQUNiLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ25CLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN4QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFO3dCQUNqQyxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQTt3QkFDdEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtxQkFDcEI7eUJBQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO3dCQUN2QixNQUFNLENBQUMsTUFBMkIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTs0QkFDOUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTs0QkFDbEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBOzRCQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTs0QkFDOUIsS0FBSyxFQUFFLENBQUE7d0JBQ1QsQ0FBQyxDQUFDLENBQUE7cUJBQ0g7eUJBQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO3dCQUN4QixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtxQkFDNUI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQTtRQUNELFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFL0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUE7UUFDdEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUE7Z0JBQ3JDLElBQUksS0FBYSxDQUFBO2dCQUNqQixZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUM1QixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO3dCQUM1QixLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTtxQkFDdEI7eUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTt3QkFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTt3QkFDMUQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO3dCQUN2QyxLQUFLLEVBQUUsQ0FBQTtxQkFDUjt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO3dCQUNuQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7cUJBQ3hDO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUVGLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDckMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUN2QyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ2pDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNuQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxlQUEwQixFQUFFLFNBQTRCO1FBQ25GLE1BQU0sVUFBVSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDNUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzNCLElBQUksR0FBRyxLQUFLLE9BQU8sRUFBRTt3QkFDbkIsTUFBTSxLQUFLLEdBQUksRUFBRSxDQUFDLE1BQW9CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO3dCQUNuRCxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUM1QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dDQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTs2QkFDNUI7aUNBQU07Z0NBQ0wsT0FBTyxLQUFLLENBQUE7NkJBQ2I7d0JBQ0gsQ0FBQyxDQUFDLENBQUE7cUJBQ0g7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQTtRQUNELGVBQWUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFbkMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNuRCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUE7UUFDdEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMvQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ25CLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1lBQ2hELGVBQWUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDckMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ25CLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVTLGNBQWMsQ0FBQyxFQUFjLEVBQUUsTUFBTSxHQUFHLElBQUk7UUFDcEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDckQsT0FBTTtTQUNQO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztZQUM1QixNQUFNO1lBQ04sTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDLENBQUE7SUFDSixDQUFDO0lBRVMsZUFBZSxDQUFDLEVBQWUsRUFBRSxFQUFjO1FBQ3ZELElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzNCLE9BQU07U0FDUDtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUE7UUFDNUIsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUN4QzthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUN4QztRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7SUFDL0IsQ0FBQztJQUVTLGdDQUFnQyxDQUFDLFNBQTRCO1FBQ3JFLE1BQU0sZUFBZSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFDbEMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzQyxNQUFNLFdBQVcsR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFBO1FBQ2hDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQ3pDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNwRCxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUNoQyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNuRCxPQUFPLGVBQWUsQ0FBQTtJQUN4QixDQUFDO0lBRVMsc0JBQXNCLENBQUMsSUFBVTtRQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzdCLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNyQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQTtRQUNqQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUN4QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLElBQUksT0FBTyxHQUFRLEVBQUUsQ0FBQTtZQUNyQixJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNqQyxDQUFDLENBQUMsQ0FBQTthQUNIO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxJQUFJLENBQUE7YUFDZjtZQUNELElBQUksT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRTtnQkFDaEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTthQUNoRDtpQkFBTTtnQkFDTCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUN2RSxhQUFhLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUE7YUFDNUQ7WUFDRCxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUE7UUFDM0IsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNuRCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3BDLE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFUyxnQ0FBZ0MsQ0FBQyxJQUFlLEVBQUUsd0JBQWlDO1FBQzNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFzQixDQUFBO1FBQzFELE1BQU0sS0FBSyxHQUFXLEVBQUUsQ0FBQTtRQUN4QixXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUNwRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFO1lBQ3hELEtBQUs7WUFDTCxLQUFLO1NBQ04sQ0FBQyxDQUFBO1FBQ0YsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0MsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDdkMsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDZixVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFBO29CQUM5QyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtpQkFDL0I7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN2RCxDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU8sUUFBUSxDQUFBO1NBQ2hCO1FBQ0QsT0FBTyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzVGLENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxVQUFxQjtRQUNwRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBVSxDQUFBO1FBQ2xELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUUvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUNuQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDaEMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQzlCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUMsQ0FBQTtRQUVGLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoRCxJQUFJLFNBQVMsRUFBRTtnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTthQUN6QztRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDMUIsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUNqQixJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7b0JBQ3JDLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7aUJBQ3BDO3FCQUFNO29CQUNMLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFtQixDQUFBO29CQUNsRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtvQkFDbEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBO29CQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO29CQUM3RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtvQkFDaEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQTtpQkFDcEQ7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUE7YUFDckQ7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVTLHdCQUF3QixDQUFDLElBQVU7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDbEYsSUFBSSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUE7YUFDTDtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM5QixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDekIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3RDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRVMsNkJBQTZCLENBQUMsU0FBNEI7UUFDbEUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQy9GLElBQUksRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFBO2FBQ0w7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRixDQUFBO0FBaHBCWSxXQUFXO0lBRHZCLFVBQVUsRUFBRTtJQXNDRSxXQUFBLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBOzZDQUNDLGdCQUFnQjtRQUNmLGlCQUFpQjtRQUN4QixVQUFVO1FBQ1gsU0FBUztRQUNYLE9BQU87UUFDTCxTQUFTO1FBQ1gsT0FBTztHQTVDM0IsV0FBVyxDQWdwQnZCO1NBaHBCWSxXQUFXO0FBa3BCeEIsU0FBUyxvQkFBb0IsQ0FBQyxPQUFnQixFQUFFLEtBQVc7SUFDekQsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFBO0lBQzNCLElBQUksS0FBSyxFQUFFO1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMzQyxJQUFJLFNBQVMsRUFBRTtnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDdEM7UUFDSCxDQUFDLENBQUMsQ0FBQTtLQUNIO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAnQHRhbmJvL3N0cmVhbSdcbmltcG9ydCB7XG4gIENoYW5nZU9yaWdpbixcbiAgQ29tcG9uZW50SW5zdGFuY2UsXG4gIENvbnRlbnRUeXBlLFxuICBDb250cm9sbGVyLFxuICBGYWN0b3J5LFxuICBGb3JtYXRzLFxuICBIaXN0b3J5LFxuICBISVNUT1JZX1NUQUNLX1NJWkUsXG4gIG1ha2VFcnJvcixcbiAgUm9vdENvbXBvbmVudFJlZixcbiAgU2NoZWR1bGVyLFxuICBTZWxlY3Rpb24sXG4gIFNlbGVjdGlvblBhdGhzLFxuICBTbG90LFxuICBTdGFydGVyXG59IGZyb20gJ0B0ZXh0YnVzL2NvcmUnXG5pbXBvcnQge1xuICBBcnJheSBhcyBZQXJyYXksXG4gIERvYyBhcyBZRG9jLFxuICBNYXAgYXMgWU1hcCxcbiAgUmVsYXRpdmVQb3NpdGlvbixcbiAgVGV4dCBhcyBZVGV4dCxcbiAgVHJhbnNhY3Rpb24sXG4gIFVuZG9NYW5hZ2VyLFxuICBjcmVhdGVBYnNvbHV0ZVBvc2l0aW9uRnJvbVJlbGF0aXZlUG9zaXRpb24sXG4gIGNyZWF0ZVJlbGF0aXZlUG9zaXRpb25Gcm9tVHlwZUluZGV4XG59IGZyb20gJ3lqcydcblxuaW1wb3J0IHsgQ29sbGFib3JhdGVDdXJzb3IsIFJlbW90ZVNlbGVjdGlvbiB9IGZyb20gJy4vY29sbGFib3JhdGUtY3Vyc29yJ1xuaW1wb3J0IHsgY3JlYXRlVW5rbm93bkNvbXBvbmVudCB9IGZyb20gJy4vdW5rbm93bi5jb21wb25lbnQnXG5cbmNvbnN0IGNvbGxhYm9yYXRlRXJyb3JGbiA9IG1ha2VFcnJvcignQ29sbGFib3JhdGUnKVxuXG5pbnRlcmZhY2UgQ3Vyc29yUG9zaXRpb24ge1xuICBhbmNob3I6IFJlbGF0aXZlUG9zaXRpb25cbiAgZm9jdXM6IFJlbGF0aXZlUG9zaXRpb25cbn1cblxuY2xhc3MgQ29udGVudE1hcCB7XG4gIHByaXZhdGUgc2xvdEFuZFlUZXh0TWFwID0gbmV3IFdlYWtNYXA8U2xvdCwgWVRleHQ+KClcbiAgcHJpdmF0ZSB5VGV4dEFuZFNMb3RNYXAgPSBuZXcgV2Vha01hcDxZVGV4dCwgU2xvdD4oKVxuXG4gIHNldChrZXk6IFNsb3QsIHZhbHVlOiBZVGV4dCk6IHZvaWRcbiAgc2V0KGtleTogWVRleHQsIHZhbHVlOiBTbG90KTogdm9pZFxuICBzZXQoa2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoa2V5IGluc3RhbmNlb2YgU2xvdCkge1xuICAgICAgdGhpcy5zbG90QW5kWVRleHRNYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgICB0aGlzLnlUZXh0QW5kU0xvdE1hcC5zZXQodmFsdWUsIGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zbG90QW5kWVRleHRNYXAuc2V0KHZhbHVlLCBrZXkpXG4gICAgICB0aGlzLnlUZXh0QW5kU0xvdE1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5OiBTbG90KTogWVRleHQgfCBudWxsXG4gIGdldChrZXk6IFlUZXh0KTogU2xvdCB8IG51bGxcbiAgZ2V0KGtleTogYW55KSB7XG4gICAgaWYgKGtleSBpbnN0YW5jZW9mIFNsb3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsb3RBbmRZVGV4dE1hcC5nZXQoa2V5KSB8fCBudWxsXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnlUZXh0QW5kU0xvdE1hcC5nZXQoa2V5KSB8fCBudWxsXG4gIH1cblxuICBkZWxldGUoa2V5OiBTbG90IHwgWVRleHQpIHtcbiAgICBpZiAoa2V5IGluc3RhbmNlb2YgU2xvdCkge1xuICAgICAgY29uc3QgdiA9IHRoaXMuc2xvdEFuZFlUZXh0TWFwLmdldChrZXkpXG4gICAgICB0aGlzLnNsb3RBbmRZVGV4dE1hcC5kZWxldGUoa2V5KVxuICAgICAgaWYgKHYpIHtcbiAgICAgICAgdGhpcy55VGV4dEFuZFNMb3RNYXAuZGVsZXRlKHYpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnlUZXh0QW5kU0xvdE1hcC5nZXQoa2V5KVxuICAgICAgdGhpcy55VGV4dEFuZFNMb3RNYXAuZGVsZXRlKGtleSlcbiAgICAgIGlmICh2KSB7XG4gICAgICAgIHRoaXMuc2xvdEFuZFlUZXh0TWFwLmRlbGV0ZSh2KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgVXBkYXRlIHtcbiAgcmVjb3JkOiBib29sZWFuXG4gIGFjdGlvbnM6IEFycmF5PCgpID0+IHZvaWQ+XG59XG5cbmludGVyZmFjZSBVcGRhdGVJdGVtIHtcbiAgcmVjb3JkOiBib29sZWFuXG5cbiAgYWN0aW9uKCk6IHZvaWRcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbGxhYm9yYXRlIGltcGxlbWVudHMgSGlzdG9yeSB7XG4gIG9uU2VsZWN0aW9uQ2hhbmdlOiBPYnNlcnZhYmxlPFNlbGVjdGlvblBhdGhzPlxuICB5RG9jID0gbmV3IFlEb2MoKVxuICBvbkJhY2s6IE9ic2VydmFibGU8dm9pZD5cbiAgb25Gb3J3YXJkOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uQ2hhbmdlOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uUHVzaDogT2JzZXJ2YWJsZTx2b2lkPlxuXG4gIGdldCBjYW5CYWNrKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblVuZG8oKSB8fCBmYWxzZVxuICB9XG5cbiAgZ2V0IGNhbkZvcndhcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uY2FuUmVkbygpIHx8IGZhbHNlXG4gIH1cblxuICBwcm90ZWN0ZWQgYmFja0V2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcm90ZWN0ZWQgZm9yd2FyZEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByb3RlY3RlZCBwdXNoRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgcHJvdGVjdGVkIG1hbmFnZXI6IFVuZG9NYW5hZ2VyIHwgbnVsbCA9IG51bGxcblxuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXVxuICBwcm90ZWN0ZWQgdXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG5cbiAgcHJvdGVjdGVkIGNvbnRlbnRTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8U2xvdCwgKCkgPT4gdm9pZD4oKVxuICBwcm90ZWN0ZWQgc2xvdFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJvdGVjdGVkIHNsb3RzU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG4gIHByb3RlY3RlZCBjb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxDb21wb25lbnRJbnN0YW5jZSwgKCkgPT4gdm9pZD4oKVxuXG4gIHByb3RlY3RlZCBzZWxlY3Rpb25DaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblBhdGhzPigpXG4gIHByb3RlY3RlZCBjb250ZW50TWFwID0gbmV3IENvbnRlbnRNYXAoKVxuXG4gIHByb3RlY3RlZCB1cGRhdGVSZW1vdGVBY3Rpb25zOiBBcnJheTxVcGRhdGVJdGVtPiA9IFtdXG4gIHByb3RlY3RlZCBub1JlY29yZCA9IHt9XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChISVNUT1JZX1NUQUNLX1NJWkUpIHByb3RlY3RlZCBzdGFja1NpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHJvb3RDb21wb25lbnRSZWY6IFJvb3RDb21wb25lbnRSZWYsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjb2xsYWJvcmF0ZUN1cnNvcjogQ29sbGFib3JhdGVDdXJzb3IsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgc2NoZWR1bGVyOiBTY2hlZHVsZXIsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBmYWN0b3J5OiBGYWN0b3J5LFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgc2VsZWN0aW9uOiBTZWxlY3Rpb24sXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBzdGFydGVyOiBTdGFydGVyKSB7XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKCkucGlwZShkZWxheSgpKVxuICAgIHRoaXMub25CYWNrID0gdGhpcy5iYWNrRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uRm9yd2FyZCA9IHRoaXMuZm9yd2FyZEV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMuY2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uUHVzaCA9IHRoaXMucHVzaEV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICBsaXN0ZW4oKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMueURvYy5nZXRNYXAoJ1Jvb3RDb21wb25lbnQnKVxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuY29tcG9uZW50IVxuICAgIHRoaXMubWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihyb290LCB7XG4gICAgICB0cmFja2VkT3JpZ2luczogbmV3IFNldDxhbnk+KFt0aGlzLnlEb2NdKVxuICAgIH0pXG4gICAgY29uc3QgY3Vyc29yS2V5ID0gJ2N1cnNvci1wb3NpdGlvbidcbiAgICB0aGlzLm1hbmFnZXIub24oJ3N0YWNrLWl0ZW0tYWRkZWQnLCBldmVudCA9PiB7XG4gICAgICBldmVudC5zdGFja0l0ZW0ubWV0YS5zZXQoY3Vyc29yS2V5LCB0aGlzLmdldFJlbGF0aXZlQ3Vyc29yTG9jYXRpb24oKSlcbiAgICAgIGlmICh0aGlzLm1hbmFnZXIhLnVuZG9TdGFjay5sZW5ndGggPiB0aGlzLnN0YWNrU2l6ZSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIhLnVuZG9TdGFjay5zaGlmdCgpXG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQub3JpZ2luID09PSB0aGlzLnlEb2MpIHtcbiAgICAgICAgdGhpcy5wdXNoRXZlbnQubmV4dCgpXG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZUV2ZW50Lm5leHQoKVxuICAgIH0pXG4gICAgdGhpcy5tYW5hZ2VyLm9uKCdzdGFjay1pdGVtLXBvcHBlZCcsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZXZlbnQuc3RhY2tJdGVtLm1ldGEuZ2V0KGN1cnNvcktleSkgYXMgQ3Vyc29yUG9zaXRpb25cbiAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnJlc3RvcmVDdXJzb3JMb2NhdGlvbihwb3NpdGlvbilcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZWxlY3Rpb24ub25DaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRQYXRocygpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQubmV4dChwYXRocylcbiAgICAgIH0pLFxuICAgICAgdGhpcy5zY2hlZHVsZXIub25Eb2NDaGFuZ2VkLnBpcGUoXG4gICAgICAgIG1hcChpdGVtID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5maWx0ZXIoaSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaS5mcm9tICE9PSBDaGFuZ2VPcmlnaW4uUmVtb3RlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5sZW5ndGhcbiAgICAgICAgfSlcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlczogVXBkYXRlW10gPSBbXVxuXG4gICAgICAgIGxldCB1cGRhdGU6IFVwZGF0ZSB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucykge1xuICAgICAgICAgIGlmICghdXBkYXRlKSB7XG4gICAgICAgICAgICB1cGRhdGUgPSB7XG4gICAgICAgICAgICAgIHJlY29yZDogaXRlbS5yZWNvcmQsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVzLnB1c2godXBkYXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodXBkYXRlLnJlY29yZCA9PT0gaXRlbS5yZWNvcmQpIHtcbiAgICAgICAgICAgIHVwZGF0ZS5hY3Rpb25zLnB1c2goaXRlbS5hY3Rpb24pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwZGF0ZSA9IHtcbiAgICAgICAgICAgICAgcmVjb3JkOiBpdGVtLnJlY29yZCxcbiAgICAgICAgICAgICAgYWN0aW9uczogW2l0ZW0uYWN0aW9uXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKHVwZGF0ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVJlbW90ZUFjdGlvbnMgPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB1cGRhdGVzKSB7XG4gICAgICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uYWN0aW9ucy5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgICAgICAgZm4oKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9LCBpdGVtLnJlY29yZCA/IHRoaXMueURvYyA6IHRoaXMubm9SZWNvcmQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuc3luY1Jvb3RDb21wb25lbnQocm9vdCwgcm9vdENvbXBvbmVudClcbiAgfVxuXG4gIHVwZGF0ZVJlbW90ZVNlbGVjdGlvbihwYXRoczogUmVtb3RlU2VsZWN0aW9uW10pIHtcbiAgICB0aGlzLmNvbGxhYm9yYXRlQ3Vyc29yLmRyYXcocGF0aHMpXG4gIH1cblxuICBiYWNrKCkge1xuICAgIGlmICh0aGlzLmNhbkJhY2spIHtcbiAgICAgIHRoaXMubWFuYWdlcj8udW5kbygpXG4gICAgICB0aGlzLmJhY2tFdmVudC5uZXh0KClcbiAgICB9XG4gIH1cblxuICBmb3J3YXJkKCkge1xuICAgIGlmICh0aGlzLmNhbkZvcndhcmQpIHtcbiAgICAgIHRoaXMubWFuYWdlcj8ucmVkbygpXG4gICAgICB0aGlzLmZvcndhcmRFdmVudC5uZXh0KClcbiAgICB9XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLm1hbmFnZXI/LmNsZWFyKClcbiAgICB0aGlzLmNoYW5nZUV2ZW50Lm5leHQoKVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChpID0+IGkudW5zdWJzY3JpYmUoKSlcbiAgICB0aGlzLmNvbGxhYm9yYXRlQ3Vyc29yLmRlc3Ryb3koKVxuICAgIHRoaXMubWFuYWdlcj8uZGVzdHJveSgpXG4gIH1cblxuICBwcm90ZWN0ZWQgc3luY1Jvb3RDb21wb25lbnQocm9vdDogWU1hcDxhbnk+LCByb290Q29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIGxldCBzbG90cyA9IHJvb3QuZ2V0KCdzbG90cycpIGFzIFlBcnJheTxZTWFwPGFueT4+XG4gICAgaWYgKCFzbG90cykge1xuICAgICAgc2xvdHMgPSBuZXcgWUFycmF5KClcbiAgICAgIHJvb3RDb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goaSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3QoaSlcbiAgICAgICAgc2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgICB9KVxuICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgcm9vdC5zZXQoJ3N0YXRlJywgcm9vdENvbXBvbmVudC5zdGF0ZSlcbiAgICAgICAgcm9vdC5zZXQoJ3Nsb3RzJywgc2xvdHMpXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoc2xvdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByb290Q29tcG9uZW50LnVwZGF0ZVN0YXRlKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvb3QuZ2V0KCdzdGF0ZScpXG4gICAgICB9KVxuICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgcm9vdENvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KGkpXG4gICAgICAgICAgc2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByb290Q29tcG9uZW50LnVwZGF0ZVN0YXRlKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvb3QuZ2V0KCdzdGF0ZScpXG4gICAgICB9KVxuICAgICAgcm9vdENvbXBvbmVudC5zbG90cy5jbGVhbigpXG4gICAgICBzbG90cy5mb3JFYWNoKHNoYXJlZFNsb3QgPT4ge1xuICAgICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3QpXG4gICAgICAgIHRoaXMuc3luY1Nsb3RDb250ZW50KHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICAgIHRoaXMuc3luY1Nsb3RTdGF0ZShzaGFyZWRTbG90LCBzbG90KVxuICAgICAgICByb290Q29tcG9uZW50LnNsb3RzLmluc2VydChzbG90KVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5zeW5jQ29tcG9uZW50U3RhdGUocm9vdCwgcm9vdENvbXBvbmVudClcbiAgICB0aGlzLnN5bmNDb21wb25lbnRTbG90cyhzbG90cywgcm9vdENvbXBvbmVudClcbiAgfVxuXG4gIHByb3RlY3RlZCByZXN0b3JlQ3Vyc29yTG9jYXRpb24ocG9zaXRpb246IEN1cnNvclBvc2l0aW9uKSB7XG4gICAgY29uc3QgYW5jaG9yUG9zaXRpb24gPSBjcmVhdGVBYnNvbHV0ZVBvc2l0aW9uRnJvbVJlbGF0aXZlUG9zaXRpb24ocG9zaXRpb24uYW5jaG9yLCB0aGlzLnlEb2MpXG4gICAgY29uc3QgZm9jdXNQb3NpdGlvbiA9IGNyZWF0ZUFic29sdXRlUG9zaXRpb25Gcm9tUmVsYXRpdmVQb3NpdGlvbihwb3NpdGlvbi5mb2N1cywgdGhpcy55RG9jKVxuICAgIGlmIChhbmNob3JQb3NpdGlvbiAmJiBmb2N1c1Bvc2l0aW9uKSB7XG4gICAgICBjb25zdCBmb2N1c1Nsb3QgPSB0aGlzLmNvbnRlbnRNYXAuZ2V0KGZvY3VzUG9zaXRpb24udHlwZSBhcyBZVGV4dClcbiAgICAgIGNvbnN0IGFuY2hvclNsb3QgPSB0aGlzLmNvbnRlbnRNYXAuZ2V0KGFuY2hvclBvc2l0aW9uLnR5cGUgYXMgWVRleHQpXG4gICAgICBpZiAoZm9jdXNTbG90ICYmIGFuY2hvclNsb3QpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0QmFzZUFuZEV4dGVudChhbmNob3JTbG90LCBhbmNob3JQb3NpdGlvbi5pbmRleCwgZm9jdXNTbG90LCBmb2N1c1Bvc2l0aW9uLmluZGV4KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rpb24udW5TZWxlY3QoKVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlbGF0aXZlQ3Vyc29yTG9jYXRpb24oKTogQ3Vyc29yUG9zaXRpb24gfCBudWxsIHtcbiAgICBjb25zdCB7IGFuY2hvclNsb3QsIGFuY2hvck9mZnNldCwgZm9jdXNTbG90LCBmb2N1c09mZnNldCB9ID0gdGhpcy5zZWxlY3Rpb25cbiAgICBpZiAoYW5jaG9yU2xvdCkge1xuICAgICAgY29uc3QgYW5jaG9yWVRleHQgPSB0aGlzLmNvbnRlbnRNYXAuZ2V0KGFuY2hvclNsb3QpXG4gICAgICBpZiAoYW5jaG9yWVRleHQpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yUG9zaXRpb24gPSBjcmVhdGVSZWxhdGl2ZVBvc2l0aW9uRnJvbVR5cGVJbmRleChhbmNob3JZVGV4dCwgYW5jaG9yT2Zmc2V0ISlcbiAgICAgICAgaWYgKGZvY3VzU2xvdCkge1xuICAgICAgICAgIGNvbnN0IGZvY3VzWVRleHQgPSB0aGlzLmNvbnRlbnRNYXAuZ2V0KGZvY3VzU2xvdClcbiAgICAgICAgICBpZiAoZm9jdXNZVGV4dCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNQb3NpdGlvbiA9IGNyZWF0ZVJlbGF0aXZlUG9zaXRpb25Gcm9tVHlwZUluZGV4KGZvY3VzWVRleHQsIGZvY3VzT2Zmc2V0ISlcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGZvY3VzOiBmb2N1c1Bvc2l0aW9uLFxuICAgICAgICAgICAgICBhbmNob3I6IGFuY2hvclBvc2l0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBwcm90ZWN0ZWQgc3luY1Nsb3RDb250ZW50KGNvbnRlbnQ6IFlUZXh0LCBzbG90OiBTbG90KSB7XG4gICAgdGhpcy5jb250ZW50TWFwLnNldChzbG90LCBjb250ZW50KVxuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBzbG90LnJldGFpbigwKVxuICAgICAgICBldi5rZXlzQ2hhbmdlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlID0gZXYua2V5cy5nZXQoa2V5KVxuICAgICAgICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdXBkYXRlVHlwZSA9IGNoYW5nZS5hY3Rpb25cbiAgICAgICAgICBpZiAodXBkYXRlVHlwZSA9PT0gJ3VwZGF0ZScgfHwgdXBkYXRlVHlwZSA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHRoaXMuZmFjdG9yeS5nZXRBdHRyaWJ1dGUoa2V5KVxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICBzbG90LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGNvbnRlbnQuZ2V0QXR0cmlidXRlKGtleSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh1cGRhdGVUeXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gdGhpcy5mYWN0b3J5LmdldEF0dHJpYnV0ZShrZXkpXG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgIHNsb3QucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGV2LmRlbHRhLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoUmVmbGVjdC5oYXMoYWN0aW9uLCAncmV0YWluJykpIHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24uYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBjb25zdCBmb3JtYXRzID0gcmVtb3RlRm9ybWF0c1RvTG9jYWwodGhpcy5mYWN0b3J5LCBhY3Rpb24uYXR0cmlidXRlcylcbiAgICAgICAgICAgICAgaWYgKGZvcm1hdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2xvdC5yZXRhaW4oYWN0aW9uLnJldGFpbiEsIGZvcm1hdHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2xvdC5yZXRhaW4oc2xvdC5pbmRleCArIGFjdGlvbi5yZXRhaW4pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzbG90LnJldGFpbihhY3Rpb24ucmV0YWluKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmluc2VydCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzbG90LmluZGV4XG4gICAgICAgICAgICBsZXQgbGVuZ3RoID0gMVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaW5zZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBsZW5ndGggPSBhY3Rpb24uaW5zZXJ0Lmxlbmd0aFxuICAgICAgICAgICAgICBzbG90Lmluc2VydChhY3Rpb24uaW5zZXJ0LCByZW1vdGVGb3JtYXRzVG9Mb2NhbCh0aGlzLmZhY3RvcnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IGFjdGlvbi5pbnNlcnQgYXMgWU1hcDxhbnk+XG4gICAgICAgICAgICAgIGNvbnN0IGNhbkluc2VydElubGluZUNvbXBvbmVudCA9IHNsb3Quc2NoZW1hLmluY2x1ZGVzKENvbnRlbnRUeXBlLklubGluZUNvbXBvbmVudClcbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNhbkluc2VydElubGluZUNvbXBvbmVudClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50U2xvdHMoc2hhcmVkQ29tcG9uZW50LmdldCgnc2xvdHMnKSwgY29tcG9uZW50KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb21wb25lbnRTdGF0ZShzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoY29tcG9uZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmFuY2hvclNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ISA+IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0QW5jaG9yKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmFuY2hvck9mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmZvY3VzU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5mb2N1c09mZnNldCEgPiBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEZvY3VzKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ISArIGxlbmd0aClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmRlbGV0ZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzbG90LmluZGV4XG4gICAgICAgICAgICBzbG90LnJldGFpbihzbG90LmluZGV4KVxuICAgICAgICAgICAgc2xvdC5kZWxldGUoYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5hbmNob3JTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmFuY2hvck9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRBbmNob3Ioc2xvdCwgdGhpcy5zZWxlY3Rpb24uc3RhcnRPZmZzZXQhIC0gYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uZm9jdXNTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEZvY3VzKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBjb250ZW50Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3Qub25Db250ZW50Q2hhbmdlLnBpcGUoZmlsdGVyKCgpID0+IHtcbiAgICAgIHJldHVybiAhdGhpcy5zY2hlZHVsZXIuaWdub3JlQ2hhbmdlc1xuICAgIH0pKS5zdWJzY3JpYmUoYWN0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgbGV0IG9mZnNldCA9IDBcbiAgICAgICAgbGV0IGxlbmd0aCA9IDBcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHMgPSBhY3Rpb24uZm9ybWF0c1xuICAgICAgICAgICAgaWYgKGZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZvcm1hdHMpXG4gICAgICAgICAgICAgIGxldCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgICAgICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSB0aGlzLmZhY3RvcnkuZ2V0Rm9ybWF0dGVyKGtleSlcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgICAgbGVuZ3RoLS1cbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZm9ybWF0cywga2V5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9ybWF0KG9mZnNldCwgYWN0aW9uLm9mZnNldCwgZm9ybWF0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnQnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gZGVsdGEubGVuZ3RoID09PSAxICYmIGRlbHRhWzBdLmluc2VydCA9PT0gU2xvdC5lbXB0eVBsYWNlaG9sZGVyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBsZW5ndGggPSBhY3Rpb24uY29udGVudC5sZW5ndGhcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnQob2Zmc2V0LCBhY3Rpb24uY29udGVudCwgYWN0aW9uLmZvcm1hdHMgfHwge30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZW5ndGggPSAxXG4gICAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoYWN0aW9uLnJlZiBhcyBDb21wb25lbnRJbnN0YW5jZSlcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudCwgYWN0aW9uLmZvcm1hdHMgfHwge30pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0VtcHR5ICYmIG9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250ZW50LmRlbGV0ZShjb250ZW50Lmxlbmd0aCAtIDEsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gbGVuZ3RoXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb250ZW50LmRlbGV0ZShvZmZzZXQsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydCgwLCAnXFxuJywgZGVsdGFbMF0/LmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2F0dHJTZXQnKSB7XG4gICAgICAgICAgICBjb250ZW50LnNldEF0dHJpYnV0ZShhY3Rpb24ubmFtZSwgYWN0aW9uLnZhbHVlKVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdhdHRyUmVtb3ZlJykge1xuICAgICAgICAgICAgY29udGVudC5yZW1vdmVBdHRyaWJ1dGUoYWN0aW9uLm5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBzdWIuYWRkKHNsb3Qub25DaGlsZENvbXBvbmVudFJlbW92ZS5zdWJzY3JpYmUoY29tcG9uZW50cyA9PiB7XG4gICAgICBjb21wb25lbnRzLmZvckVhY2goYyA9PiB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoYylcbiAgICAgIH0pXG4gICAgfSkpXG4gICAgdGhpcy5jb250ZW50U3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgY29udGVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW5jU2xvdFN0YXRlKHJlbW90ZVNsb3Q6IFlNYXA8YW55Piwgc2xvdDogU2xvdCkge1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5rZXlzQ2hhbmdlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoZXYudGFyZ2V0IGFzIFlNYXA8YW55PikuZ2V0KCdzdGF0ZScpXG4gICAgICAgICAgICBzbG90LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkcmFmdCA9PT0gJ29iamVjdCcgJiYgZHJhZnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBzdGF0ZSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVTbG90Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3Qub25TdGF0ZUNoYW5nZS5waXBlKGZpbHRlcigoKSA9PiB7XG4gICAgICByZXR1cm4gIXRoaXMuc2NoZWR1bGVyLmlnbm9yZUNoYW5nZXNcbiAgICB9KSkuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgcmVtb3RlU2xvdC5zZXQoJ3N0YXRlJywgY2hhbmdlLm5ld1N0YXRlKVxuICAgICAgfSwgY2hhbmdlLnJlY29yZClcbiAgICB9KVxuICAgIHRoaXMuc2xvdFN0YXRlU3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgcmVtb3RlU2xvdC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW5jQ29tcG9uZW50U2xvdHMocmVtb3RlU2xvdHM6IFlBcnJheTxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc2xvdHMgPSBjb21wb25lbnQuc2xvdHNcbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICBzbG90cy5yZXRhaW4oaW5kZXgpXG4gICAgICAgIGV2LmRlbHRhLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoUmVmbGVjdC5oYXMoYWN0aW9uLCAncmV0YWluJykpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IGFjdGlvbi5yZXRhaW5cbiAgICAgICAgICAgIHNsb3RzLnJldGFpbihpbmRleClcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIChhY3Rpb24uaW5zZXJ0IGFzIEFycmF5PFlNYXA8YW55Pj4pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3QoaXRlbSlcbiAgICAgICAgICAgICAgc2xvdHMuaW5zZXJ0KHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3RDb250ZW50KGl0ZW0uZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3RTdGF0ZShpdGVtLCBzbG90KVxuICAgICAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmRlbGV0ZSkge1xuICAgICAgICAgICAgc2xvdHMucmV0YWluKGluZGV4KVxuICAgICAgICAgICAgc2xvdHMuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlU2xvdHMub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdHMub25DaGFuZ2UucGlwZShmaWx0ZXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICF0aGlzLnNjaGVkdWxlci5pZ25vcmVDaGFuZ2VzXG4gICAgfSkpLnN1YnNjcmliZShvcGVyYXRpb25zID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICBjb25zdCBhcHBseUFjdGlvbnMgPSBvcGVyYXRpb25zLmFwcGx5XG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyXG4gICAgICAgIGFwcGx5QWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAncmV0YWluJykge1xuICAgICAgICAgICAgaW5kZXggPSBhY3Rpb24ub2Zmc2V0XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2luc2VydFNsb3QnKSB7XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KGFjdGlvbi5yZWYpXG4gICAgICAgICAgICByZW1vdGVTbG90cy5pbnNlcnQoaW5kZXgsIFtzaGFyZWRTbG90XSlcbiAgICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgcmVtb3RlU2xvdHMuZGVsZXRlKGluZGV4LCBhY3Rpb24uY291bnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgc3ViLmFkZChzbG90cy5vbkNoaWxkU2xvdFJlbW92ZS5zdWJzY3JpYmUoc2xvdHMgPT4ge1xuICAgICAgc2xvdHMuZm9yRWFjaChzbG90ID0+IHtcbiAgICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeVNsb3Qoc2xvdClcbiAgICAgIH0pXG4gICAgfSkpXG5cbiAgICB0aGlzLnNsb3RzU3luY0NhY2hlcy5zZXQoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICByZW1vdGVTbG90cy51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW5jQ29tcG9uZW50U3RhdGUocmVtb3RlQ29tcG9uZW50OiBZTWFwPGFueT4sIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgZXYua2V5c0NoYW5nZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKGV2LnRhcmdldCBhcyBZTWFwPGFueT4pLmdldCgnc3RhdGUnKVxuICAgICAgICAgICAgY29tcG9uZW50LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkcmFmdCA9PT0gJ29iamVjdCcgJiYgZHJhZnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBzdGF0ZSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVDb21wb25lbnQub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gY29tcG9uZW50Lm9uU3RhdGVDaGFuZ2UucGlwZShmaWx0ZXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICF0aGlzLnNjaGVkdWxlci5pZ25vcmVDaGFuZ2VzXG4gICAgfSkpLnN1YnNjcmliZShjaGFuZ2UgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHJlbW90ZUNvbXBvbmVudC5zZXQoJ3N0YXRlJywgY2hhbmdlLm5ld1N0YXRlKVxuICAgICAgfSwgY2hhbmdlLnJlY29yZClcbiAgICB9KVxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZUNvbXBvbmVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBydW5Mb2NhbFVwZGF0ZShmbjogKCkgPT4gdm9pZCwgcmVjb3JkID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLnVwZGF0ZUZyb21SZW1vdGUgfHwgdGhpcy5jb250cm9sbGVyLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zLnB1c2goe1xuICAgICAgcmVjb3JkLFxuICAgICAgYWN0aW9uOiBmblxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgcnVuUmVtb3RlVXBkYXRlKHRyOiBUcmFuc2FjdGlvbiwgZm46ICgpID0+IHZvaWQpIHtcbiAgICBpZiAodHIub3JpZ2luID09PSB0aGlzLnlEb2MpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSB0cnVlXG4gICAgaWYgKHRyLm9yaWdpbiA9PT0gdGhpcy5tYW5hZ2VyKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlci5oaXN0b3J5QXBwbHlUcmFuc2FjdChmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY2hlZHVsZXIucmVtb3RlVXBkYXRlVHJhbnNhY3QoZm4pXG4gICAgfVxuICAgIHRoaXMudXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSk6IFlNYXA8YW55PiB7XG4gICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gbmV3IFlNYXAoKVxuICAgIHNoYXJlZENvbXBvbmVudC5zZXQoJ3N0YXRlJywgY29tcG9uZW50LnN0YXRlKVxuICAgIHNoYXJlZENvbXBvbmVudC5zZXQoJ25hbWUnLCBjb21wb25lbnQubmFtZSlcbiAgICBjb25zdCBzaGFyZWRTbG90cyA9IG5ldyBZQXJyYXkoKVxuICAgIHNoYXJlZENvbXBvbmVudC5zZXQoJ3Nsb3RzJywgc2hhcmVkU2xvdHMpXG4gICAgY29tcG9uZW50LnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90KVxuICAgICAgc2hhcmVkU2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgfSlcbiAgICB0aGlzLnN5bmNDb21wb25lbnRTbG90cyhzaGFyZWRTbG90cywgY29tcG9uZW50KVxuICAgIHRoaXMuc3luY0NvbXBvbmVudFN0YXRlKHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgIHJldHVybiBzaGFyZWRDb21wb25lbnRcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3Q6IFNsb3QpOiBZTWFwPGFueT4ge1xuICAgIGNvbnN0IHNoYXJlZFNsb3QgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ3NjaGVtYScsIHNsb3Quc2NoZW1hKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzdGF0ZScsIHNsb3Quc3RhdGUpXG4gICAgY29uc3Qgc2hhcmVkQ29udGVudCA9IG5ldyBZVGV4dCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ2NvbnRlbnQnLCBzaGFyZWRDb250ZW50KVxuICAgIGxldCBvZmZzZXQgPSAwXG4gICAgc2xvdC50b0RlbHRhKCkuZm9yRWFjaChpID0+IHtcbiAgICAgIGxldCBmb3JtYXRzOiBhbnkgPSB7fVxuICAgICAgaWYgKGkuZm9ybWF0cykge1xuICAgICAgICBpLmZvcm1hdHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBmb3JtYXRzW2l0ZW1bMF0ubmFtZV0gPSBpdGVtWzFdXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXRzID0gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2hhcmVkQ29udGVudC5pbnNlcnQob2Zmc2V0LCBpLmluc2VydCwgZm9ybWF0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoaS5pbnNlcnQpXG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0RW1iZWQob2Zmc2V0LCBzaGFyZWRDb21wb25lbnQsIGZvcm1hdHMpXG4gICAgICB9XG4gICAgICBvZmZzZXQgKz0gaS5pbnNlcnQubGVuZ3RoXG4gICAgfSlcbiAgICBzbG90LmdldEF0dHJpYnV0ZXMoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgc2hhcmVkQ29udGVudC5zZXRBdHRyaWJ1dGUoaXRlbVswXS5uYW1lLCBpdGVtWzFdKVxuICAgIH0pXG4gICAgdGhpcy5zeW5jU2xvdENvbnRlbnQoc2hhcmVkQ29udGVudCwgc2xvdClcbiAgICB0aGlzLnN5bmNTbG90U3RhdGUoc2hhcmVkU2xvdCwgc2xvdClcbiAgICByZXR1cm4gc2hhcmVkU2xvdFxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHlNYXA6IFlNYXA8YW55PiwgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50OiBib29sZWFuKTogQ29tcG9uZW50SW5zdGFuY2Uge1xuICAgIGNvbnN0IHNoYXJlZFNsb3RzID0geU1hcC5nZXQoJ3Nsb3RzJykgYXMgWUFycmF5PFlNYXA8YW55Pj5cbiAgICBjb25zdCBzbG90czogU2xvdFtdID0gW11cbiAgICBzaGFyZWRTbG90cy5mb3JFYWNoKHNoYXJlZFNsb3QgPT4ge1xuICAgICAgY29uc3Qgc2xvdCA9IHRoaXMuY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChzaGFyZWRTbG90KVxuICAgICAgc2xvdHMucHVzaChzbG90KVxuICAgIH0pXG4gICAgY29uc3QgbmFtZSA9IHlNYXAuZ2V0KCduYW1lJylcbiAgICBjb25zdCBzdGF0ZSA9IHlNYXAuZ2V0KCdzdGF0ZScpXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmZhY3RvcnkuY3JlYXRlQ29tcG9uZW50QnlEYXRhKG5hbWUsIHtcbiAgICAgIHN0YXRlLFxuICAgICAgc2xvdHNcbiAgICB9KVxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2Uuc2xvdHMudG9BcnJheSgpLmZvckVhY2goKHNsb3QsIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBzaGFyZWRTbG90ID0gc2hhcmVkU2xvdHMuZ2V0KGluZGV4KVxuICAgICAgICBpZiAoIXNoYXJlZFNsb3QpIHtcbiAgICAgICAgICBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICAgICAgc2hhcmVkU2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jU2xvdFN0YXRlKHNoYXJlZFNsb3QsIHNsb3QpXG4gICAgICAgIHRoaXMuc3luY1Nsb3RDb250ZW50KHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVVbmtub3duQ29tcG9uZW50KG5hbWUsIGNhbkluc2VydElubGluZUNvbXBvbmVudCkuY3JlYXRlSW5zdGFuY2UodGhpcy5zdGFydGVyKVxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVNsb3RCeVNoYXJlZFNsb3Qoc2hhcmVkU2xvdDogWU1hcDxhbnk+KTogU2xvdCB7XG4gICAgY29uc3QgY29udGVudCA9IHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JykgYXMgWVRleHRcbiAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG5cbiAgICBjb25zdCBzbG90ID0gdGhpcy5mYWN0b3J5LmNyZWF0ZVNsb3Qoe1xuICAgICAgc2NoZW1hOiBzaGFyZWRTbG90LmdldCgnc2NoZW1hJyksXG4gICAgICBzdGF0ZTogc2hhcmVkU2xvdC5nZXQoJ3N0YXRlJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGZvcm1hdHM6IHt9LFxuICAgICAgY29udGVudDogW11cbiAgICB9KVxuXG4gICAgY29uc3QgYXR0cnMgPSBjb250ZW50LmdldEF0dHJpYnV0ZXMoKVxuICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSB0aGlzLmZhY3RvcnkuZ2V0QXR0cmlidXRlKGtleSlcbiAgICAgIGlmIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgc2xvdC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBhdHRyc1trZXldKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgZGVsdGEpIHtcbiAgICAgIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBmb3JtYXRzID0gcmVtb3RlRm9ybWF0c1RvTG9jYWwodGhpcy5mYWN0b3J5LCBhY3Rpb24uYXR0cmlidXRlcylcbiAgICAgICAgICBzbG90Lmluc2VydChhY3Rpb24uaW5zZXJ0LCBmb3JtYXRzKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IGFjdGlvbi5pbnNlcnQgYXMgWU1hcDxhbnk+XG4gICAgICAgICAgY29uc3QgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50ID0gc2xvdC5zY2hlbWEuaW5jbHVkZXMoQ29udGVudFR5cGUuSW5saW5lQ29tcG9uZW50KVxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQpXG4gICAgICAgICAgc2xvdC5pbnNlcnQoY29tcG9uZW50LCByZW1vdGVGb3JtYXRzVG9Mb2NhbCh0aGlzLmZhY3RvcnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICB0aGlzLnN5bmNDb21wb25lbnRTbG90cyhzaGFyZWRDb21wb25lbnQuZ2V0KCdzbG90cycpLCBjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50U3RhdGUoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGNvbGxhYm9yYXRlRXJyb3JGbigndW5leHBlY3RlZCBkZWx0YSBhY3Rpb24uJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNsb3RcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhblN1YnNjcmlwdGlvbnNCeVNsb3Qoc2xvdDogU2xvdCkge1xuICAgIHRoaXMuY29udGVudE1hcC5kZWxldGUoc2xvdCk7XG4gICAgW3RoaXMuY29udGVudFN5bmNDYWNoZXMuZ2V0KHNsb3QpLCB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuZ2V0KHNsb3QpXS5mb3JFYWNoKGZuID0+IHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpXG4gICAgICB9XG4gICAgfSlcbiAgICBzbG90LnNsaWNlQ29udGVudCgpLmZvckVhY2goaSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoaSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFuU3Vic2NyaXB0aW9uc0J5Q29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBbdGhpcy5zbG90c1N5bmNDYWNoZXMuZ2V0KGNvbXBvbmVudCksIHRoaXMuY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzLmdldChjb21wb25lbnQpXS5mb3JFYWNoKGZuID0+IHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpXG4gICAgICB9XG4gICAgfSlcbiAgICBjb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90KVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3RlRm9ybWF0c1RvTG9jYWwoZmFjdG9yeTogRmFjdG9yeSwgYXR0cnM/OiBhbnksKSB7XG4gIGNvbnN0IGZvcm1hdHM6IEZvcm1hdHMgPSBbXVxuICBpZiAoYXR0cnMpIHtcbiAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZmFjdG9yeS5nZXRGb3JtYXR0ZXIoa2V5KVxuICAgICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgICBmb3JtYXRzLnB1c2goW2Zvcm1hdHRlciwgYXR0cnNba2V5XV0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICByZXR1cm4gZm9ybWF0c1xufVxuIl19
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@textbus/collaborate",
|
3
|
-
"version": "3.0.0-alpha.
|
3
|
+
"version": "3.0.0-alpha.11",
|
4
4
|
"description": "Textbus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.",
|
5
5
|
"main": "./bundles/public-api.js",
|
6
6
|
"module": "./bundles/public-api.js",
|
@@ -27,8 +27,8 @@
|
|
27
27
|
"dependencies": {
|
28
28
|
"@tanbo/di": "^1.1.3",
|
29
29
|
"@tanbo/stream": "^1.1.8",
|
30
|
-
"@textbus/browser": "^3.0.0-alpha.
|
31
|
-
"@textbus/core": "^3.0.0-alpha.
|
30
|
+
"@textbus/browser": "^3.0.0-alpha.11",
|
31
|
+
"@textbus/core": "^3.0.0-alpha.11",
|
32
32
|
"reflect-metadata": "^0.1.13",
|
33
33
|
"y-protocols": "^1.0.5",
|
34
34
|
"yjs": "^13.5.39"
|
@@ -44,5 +44,5 @@
|
|
44
44
|
"bugs": {
|
45
45
|
"url": "https://github.com/textbus/textbus.git/issues"
|
46
46
|
},
|
47
|
-
"gitHead": "
|
47
|
+
"gitHead": "721380aef59dac3de052b7e68ecd3687d0dcab88"
|
48
48
|
}
|