@sd-angular/core 1.3.94 → 1.3.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,14 @@
1
- var _filterOptionChanges, _subscription;
1
+ var _subscription;
2
2
  import { __classPrivateFieldGet } from "tslib";
3
3
  import { Component, Input, ViewChild, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';
4
4
  import { SdPopupFilter } from '../popup-filter/popup-filter.component';
5
- import { BehaviorSubject, Subject, Subscription } from 'rxjs';
5
+ import { BehaviorSubject, Subscription } from 'rxjs';
6
+ import { startWith } from 'rxjs/operators';
6
7
  import { DeviceDetectorService } from 'ngx-device-detector';
7
8
  export class SdGridFilter {
8
9
  constructor(ref, deviceService) {
9
10
  this.ref = ref;
10
11
  this.deviceService = deviceService;
11
- _filterOptionChanges.set(this, new Subject());
12
12
  this.columns = [];
13
13
  this.filterDefs = [];
14
14
  this.filterRegisterChange = new BehaviorSubject(null);
@@ -40,7 +40,6 @@ export class SdGridFilter {
40
40
  }
41
41
  set _filter(filter) {
42
42
  this.filter = filter;
43
- __classPrivateFieldGet(this, _filterOptionChanges).next(this.filter);
44
43
  }
45
44
  set _filterRegister(value) {
46
45
  this.filterRegister = value;
@@ -62,19 +61,16 @@ export class SdGridFilter {
62
61
  // this.filterChange.next(true);
63
62
  // this.ref.markForCheck();
64
63
  // }));
65
- __classPrivateFieldGet(this, _subscription).add(this.filterRegisterChange.subscribe(() => {
66
- if (this.filterRegister) {
67
- __classPrivateFieldGet(this, _subscription).add(this.filterRegister.observer.subscribe(configuration => {
68
- this.inlineColumn = configuration.inlineColumn;
69
- this.columnFilter = configuration.columnFilter;
70
- this.inlineExternal = configuration.inlineExternal;
71
- this.externalFilter = configuration.externalFilter;
72
- this.inlineFilterDef = configuration.inlineFilterDef;
73
- this.filterDef = configuration.filterDef;
74
- }));
75
- this.ref.markForCheck();
76
- }
77
- ;
64
+ __classPrivateFieldGet(this, _subscription).add(this.filterRegisterChange.pipe(startWith(this.filterRegister)).subscribe(() => {
65
+ __classPrivateFieldGet(this, _subscription).add(this.filterRegister.observer.subscribe(configuration => {
66
+ this.inlineColumn = configuration.inlineColumn;
67
+ this.columnFilter = configuration.columnFilter;
68
+ this.inlineExternal = configuration.inlineExternal;
69
+ this.externalFilter = configuration.externalFilter;
70
+ this.inlineFilterDef = configuration.inlineFilterDef;
71
+ this.filterDef = configuration.filterDef;
72
+ }));
73
+ this.ref.markForCheck();
78
74
  }));
79
75
  }
80
76
  // #loadDefault = () => {
@@ -102,13 +98,13 @@ export class SdGridFilter {
102
98
  __classPrivateFieldGet(this, _subscription).unsubscribe();
103
99
  }
104
100
  }
105
- _filterOptionChanges = new WeakMap(), _subscription = new WeakMap();
101
+ _subscription = new WeakMap();
106
102
  SdGridFilter.decorators = [
107
103
  { type: Component, args: [{
108
104
  selector: 'sd-grid-filter',
109
- template: "<ng-container *ngIf=\"!filter?.disabled\">\r\n <ng-container *ngIf=\"filter?.enableCollapse;else noCollapse\">\r\n <sd-group class=\"p-12\" [isExpanded]=\"false\" title=\"T\u00ECm ki\u1EBFm\" expandable>\r\n <div sdGroupBody>\r\n <ng-container *ngTemplateOutlet=\"noCollapse\"></ng-container>\r\n </div>\r\n </sd-group>\r\n </ng-container>\r\n <ng-template #noCollapse>\r\n <div\r\n *ngIf=\"!isMobileOrTablet && ((columns?.length && !filter?.inlineColumn) || externalFilters?.length || filterDefs?.length)\"\r\n class=\"row mx-0 pb-10\">\r\n <ng-container *ngIf=\"filter?.sorts?.length\">\r\n <ng-container *ngFor=\"let field of filter?.sorts\">\r\n <ng-container *ngIf=\"columns?.length && !filter?.inlineColumn\">\r\n <ng-container *ngFor=\"let item of columns | sdFilterColumn:field\">\r\n <ng-container *ngTemplateOutlet=\"filterColumn; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"externalFilters?.length\">\r\n <ng-container *ngFor=\"let item of externalFilters | sdFilterExternal:field\">\r\n <ng-container *ngTemplateOutlet=\"filterExternal; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngFor=\"let item of filterDefs\">\r\n <div *ngIf=\"inlineFilterDef[item.sdMaterialFilterDef] && item.sdMaterialFilterDef === field\"\r\n class=\"col-lg-2 col-md-3 col-sm-6 px-8\">\r\n <ng-container *ngTemplateOutlet=\"item.templateRef;context:{filterDef:filterDef, isInline: true}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filter?.sorts?.length\">\r\n <ng-container *ngIf=\"columns?.length && !filter?.inlineColumn\">\r\n <ng-container *ngFor=\"let item of columns | sdFilterColumn\">\r\n <ng-container *ngTemplateOutlet=\"filterColumn; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"externalFilters?.length\">\r\n <ng-container *ngFor=\"let item of externalFilters | sdFilterExternal\">\r\n <ng-container *ngTemplateOutlet=\"filterExternal; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngFor=\"let item of filterDefs\">\r\n <div *ngIf=\"inlineFilterDef[item.sdMaterialFilterDef]\" class=\"col-lg-2 col-md-3 col-sm-6 px-8\">\r\n <ng-container *ngTemplateOutlet=\"item.templateRef;context:{filterDef:filterDef, isInline: true}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-template #filterColumn let-item=\"item\">\r\n <div *ngIf=\"inlineColumn[item.field]\" class=\"col-lg-2 col-md-3 col-sm-6 px-8\">\r\n <sd-input [label]=\"item.title\" *ngIf=\"item.type === 'string'\" type=\"text\" [(model)]=\"columnFilter[item.field]\"\r\n (keyupEnter)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-input>\r\n <sd-input-number [label]=\"item.title\" *ngIf=\"item.type === 'number'\" [(model)]=\"columnFilter[item.field]\"\r\n (keyupEnter)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-input-number>\r\n <sd-select [label]=\"item.title\" *ngIf=\"item.type === 'bool'\" [items]=\"[{value:'1',display:item.option?.displayOnTrue || 'True' },\r\n {value:'0',display:item.option?.displayOnFalse || 'False' }]\" valueField=\"value\" displayField=\"display\"\r\n [(model)]=\"columnFilter[item.field]\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-select>\r\n <sd-select *ngIf=\"item.type === 'values' && item?.option?.selection !== 'AUTOCOMPLETE'\"\r\n [items]=\"item.option?.items\" [valueField]=\"item.option?.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"columnFilter[item.field]\" (sdChange)=\"onFilter(item)\" [disabled]=\"item.filter?.disabled\"\r\n [multiple]=\"item?.option?.selection === 'MULTIPLE' || item?.item?.selection === 'MULTIPLEAUTOCOMPLETE'\"\r\n [filtered]=\"item?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\" appearance=\"outline\">\r\n </sd-select>\r\n <sd-autocomplete *ngIf=\"item.type === 'values' && item?.option?.selection === 'AUTOCOMPLETE'\"\r\n [items]=\"item.option?.items\" [valueField]=\"item.option?.valueField\" [displayField]=\"item.option?.displayField\"\r\n [(model)]=\"columnFilter[item.field]\" (sdChange)=\"onFilter(item)\" [disabled]=\"item.filter?.disabled\"\r\n appearance=\"outline\">\r\n </sd-autocomplete>\r\n <sd-date-time *ngIf=\"item.type === 'date' || item.type === 'datetime' || item.type === 'time'\"\r\n [label]=\"item.title\" [(model)]=\"columnFilter[item.field]\" [type]=\"item.type\" (sdChange)=\"onFilter(item)\"\r\n appearance=\"outline\">\r\n </sd-date-time>\r\n </div>\r\n </ng-template>\r\n <ng-template #filterExternal let-item=\"item\">\r\n <div *ngIf=\"inlineExternal[item.field]\" class=\"col-lg-2 col-md-3 col-sm-6 px-8\">\r\n <sd-input [label]=\"item.title\" *ngIf=\"item.type === 'string'\" type=\"text\" [(model)]=\"externalFilter[item.field]\"\r\n (keyupEnter)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-input>\r\n <sd-input-number [label]=\"item.title\" *ngIf=\"item.type === 'number'\" [(model)]=\"externalFilter[item.field]\"\r\n (keyupEnter)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-input-number>\r\n <sd-select [label]=\"item.title\" *ngIf=\"item.type === 'bool'\" [items]=\"[{value:'1',display:item.option?.displayOnTrue || 'True' },\r\n {value:'0',display:item.option?.displayOnFalse || 'False' }]\" valueField=\"value\" displayField=\"display\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-select>\r\n <ng-container *ngIf=\"item.type === 'values' && item.option\">\r\n <sd-select *ngIf=\"item.option?.selection === 'MULTIPLE'\" [label]=\"item.title\" [items]=\"item.option.items\"\r\n [valueField]=\"item.option.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" [selectAll]=\"item.option.selectAll\"\r\n appearance=\"outline\" multiple>\r\n </sd-select>\r\n <sd-autocomplete *ngIf=\"item.option?.selection === 'AUTOCOMPLETE'\" [label]=\"item.title\"\r\n [items]=\"item.option.items\" [valueField]=\"item.option.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-autocomplete>\r\n <sd-select *ngIf=\"item.option?.selection === 'MULTIPLEAUTOCOMPLETE'\" [label]=\"item.title\"\r\n [items]=\"item.option.items\" [valueField]=\"item.option.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" filtered=\"true\" appearance=\"outline\"\r\n multiple>\r\n </sd-select>\r\n <sd-select *ngIf=\"!item.option?.selection\" [label]=\"item.title\" [items]=\"item.option.items\"\r\n [valueField]=\"item.option.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-select>\r\n </ng-container>\r\n <sd-date-time [label]=\"item.title\" *ngIf=\"item.type ==='date' || item.type ==='datetime'\"\r\n [(model)]=\"externalFilter[item.field]\" [type]=\"item.type\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-date-time>\r\n <sd-date-range [label]=\"item.title\" *ngIf=\"item.type ==='daterange' && externalFilter[item.field]\"\r\n [(from)]=\"externalFilter[item.field].from\" [(to)]=\"externalFilter[item.field].to\" [min]=\"item.minDate\"\r\n [max]=\"item.maxDate\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-date-range>\r\n </div>\r\n </ng-template>\r\n <sd-popup-filter [filterRegister]=\"filterRegister\" [columns]=\"columns\"\r\n [externalFilters]=\"externalFilters\" [filterDefs]=\"filterDefs\">\r\n </sd-popup-filter>\r\n </ng-template>\r\n</ng-container>",
105
+ template: "<ng-container *ngIf=\"!filter?.disabled\">\r\n <ng-container *ngIf=\"filter?.enableCollapse;else noCollapse\">\r\n <sd-group class=\"p-12\" [isExpanded]=\"false\" title=\"T\u00ECm ki\u1EBFm\" expandable>\r\n <div sdGroupBody>\r\n <ng-container *ngTemplateOutlet=\"noCollapse\"></ng-container>\r\n </div>\r\n </sd-group>\r\n </ng-container>\r\n <ng-template #noCollapse>\r\n <div\r\n *ngIf=\"!isMobileOrTablet && ((columns?.length && !filter?.inlineColumn) || externalFilters?.length || filterDefs?.length)\"\r\n class=\"row mx-0\">\r\n <ng-container *ngIf=\"filter?.sorts?.length\">\r\n <ng-container *ngFor=\"let field of filter?.sorts\">\r\n <ng-container *ngIf=\"columns?.length && !filter?.inlineColumn\">\r\n <ng-container *ngFor=\"let item of columns | sdFilterColumn:field\">\r\n <ng-container *ngTemplateOutlet=\"filterColumn; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"externalFilters?.length\">\r\n <ng-container *ngFor=\"let item of externalFilters | sdFilterExternal:field\">\r\n <ng-container *ngTemplateOutlet=\"filterExternal; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngFor=\"let item of filterDefs\">\r\n <div *ngIf=\"inlineFilterDef[item.sdMaterialFilterDef] && item.sdMaterialFilterDef === field\"\r\n class=\"col-lg-2 col-md-3 col-sm-6 px-8\">\r\n <ng-container *ngTemplateOutlet=\"item.templateRef;context:{filterDef:filterDef, isInline: true}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filter?.sorts?.length\">\r\n <ng-container *ngIf=\"columns?.length && !filter?.inlineColumn\">\r\n <ng-container *ngFor=\"let item of columns | sdFilterColumn\">\r\n <ng-container *ngTemplateOutlet=\"filterColumn; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"externalFilters?.length\">\r\n <ng-container *ngFor=\"let item of externalFilters | sdFilterExternal\">\r\n <ng-container *ngTemplateOutlet=\"filterExternal; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngFor=\"let item of filterDefs\">\r\n <div *ngIf=\"inlineFilterDef[item.sdMaterialFilterDef]\" class=\"col-lg-2 col-md-3 col-sm-6 px-8\">\r\n <ng-container *ngTemplateOutlet=\"item.templateRef;context:{filterDef:filterDef, isInline: true}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-template #filterColumn let-item=\"item\">\r\n <div *ngIf=\"inlineColumn[item.field]\" class=\"col-lg-2 col-md-3 col-sm-6 px-8\">\r\n <sd-input [label]=\"item.title\" *ngIf=\"item.type === 'string'\" type=\"text\" [(model)]=\"columnFilter[item.field]\"\r\n (keyupEnter)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-input>\r\n <sd-input-number [label]=\"item.title\" *ngIf=\"item.type === 'number'\" [(model)]=\"columnFilter[item.field]\"\r\n (keyupEnter)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-input-number>\r\n <sd-select [label]=\"item.title\" *ngIf=\"item.type === 'bool'\" [items]=\"[{value:'1',display:item.option?.displayOnTrue || 'True' },\r\n {value:'0',display:item.option?.displayOnFalse || 'False' }]\" valueField=\"value\" displayField=\"display\"\r\n [(model)]=\"columnFilter[item.field]\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-select>\r\n <sd-select *ngIf=\"item.type === 'values' && item?.option?.selection !== 'AUTOCOMPLETE'\"\r\n [items]=\"item.option?.items\" [valueField]=\"item.option?.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"columnFilter[item.field]\" (sdChange)=\"onFilter(item)\" [disabled]=\"item.filter?.disabled\"\r\n [multiple]=\"item?.option?.selection === 'MULTIPLE' || item?.item?.selection === 'MULTIPLEAUTOCOMPLETE'\"\r\n [filtered]=\"item?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\" appearance=\"outline\">\r\n </sd-select>\r\n <sd-autocomplete *ngIf=\"item.type === 'values' && item?.option?.selection === 'AUTOCOMPLETE'\"\r\n [items]=\"item.option?.items\" [valueField]=\"item.option?.valueField\" [displayField]=\"item.option?.displayField\"\r\n [(model)]=\"columnFilter[item.field]\" (sdChange)=\"onFilter(item)\" [disabled]=\"item.filter?.disabled\"\r\n appearance=\"outline\">\r\n </sd-autocomplete>\r\n <sd-date-time *ngIf=\"item.type === 'date' || item.type === 'datetime' || item.type === 'time'\"\r\n [label]=\"item.title\" [(model)]=\"columnFilter[item.field]\" [type]=\"item.type\" (sdChange)=\"onFilter(item)\"\r\n appearance=\"outline\">\r\n </sd-date-time>\r\n </div>\r\n </ng-template>\r\n <ng-template #filterExternal let-item=\"item\">\r\n <div *ngIf=\"inlineExternal[item.field]\" class=\"col-lg-2 col-md-3 col-sm-6 px-8\">\r\n <sd-input [label]=\"item.title\" *ngIf=\"item.type === 'string'\" type=\"text\" [(model)]=\"externalFilter[item.field]\"\r\n (keyupEnter)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-input>\r\n <sd-input-number [label]=\"item.title\" *ngIf=\"item.type === 'number'\" [(model)]=\"externalFilter[item.field]\"\r\n (keyupEnter)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-input-number>\r\n <sd-select [label]=\"item.title\" *ngIf=\"item.type === 'bool'\" [items]=\"[{value:'1',display:item.option?.displayOnTrue || 'True' },\r\n {value:'0',display:item.option?.displayOnFalse || 'False' }]\" valueField=\"value\" displayField=\"display\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-select>\r\n <ng-container *ngIf=\"item.type === 'values' && item.option\">\r\n <sd-select *ngIf=\"item.option?.selection === 'MULTIPLE'\" [label]=\"item.title\" [items]=\"item.option.items\"\r\n [valueField]=\"item.option.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" [selectAll]=\"item.option.selectAll\"\r\n appearance=\"outline\" multiple>\r\n </sd-select>\r\n <sd-autocomplete *ngIf=\"item.option?.selection === 'AUTOCOMPLETE'\" [label]=\"item.title\"\r\n [items]=\"item.option.items\" [valueField]=\"item.option.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-autocomplete>\r\n <sd-select *ngIf=\"item.option?.selection === 'MULTIPLEAUTOCOMPLETE'\" [label]=\"item.title\"\r\n [items]=\"item.option.items\" [valueField]=\"item.option.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" filtered=\"true\" appearance=\"outline\"\r\n multiple>\r\n </sd-select>\r\n <sd-select *ngIf=\"!item.option?.selection\" [label]=\"item.title\" [items]=\"item.option.items\"\r\n [valueField]=\"item.option.valueField\" [displayField]=\"item.option.displayField\"\r\n [(model)]=\"externalFilter[item.field]\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-select>\r\n </ng-container>\r\n <sd-date-time [label]=\"item.title\" *ngIf=\"item.type ==='date' || item.type ==='datetime'\"\r\n [(model)]=\"externalFilter[item.field]\" [type]=\"item.type\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-date-time>\r\n <sd-date-range [label]=\"item.title\" *ngIf=\"item.type ==='daterange' && externalFilter[item.field]\"\r\n [(from)]=\"externalFilter[item.field].from\" [(to)]=\"externalFilter[item.field].to\" [min]=\"item.minDate\"\r\n [max]=\"item.maxDate\" (sdChange)=\"onFilter(item)\" appearance=\"outline\">\r\n </sd-date-range>\r\n </div>\r\n </ng-template>\r\n <sd-popup-filter [filterRegister]=\"filterRegister\" [columns]=\"columns\"\r\n [externalFilters]=\"externalFilters\" [filterDefs]=\"filterDefs\">\r\n </sd-popup-filter>\r\n </ng-template>\r\n</ng-container>",
110
106
  changeDetection: ChangeDetectionStrategy.OnPush,
111
- styles: [":host{display:block;padding-left:0;padding-right:0}:host ::ng-deep .mat-form-field-wrapper{padding-bottom:0}"]
107
+ styles: [":host{display:block;padding-bottom:10px;padding-left:0;padding-right:0}:host ::ng-deep .mat-form-field-wrapper{padding-bottom:0}"]
112
108
  },] }
113
109
  ];
114
110
  SdGridFilter.ctorParameters = () => [
@@ -122,4 +118,4 @@ SdGridFilter.propDecorators = {
122
118
  filterDefs: [{ type: Input }],
123
119
  _filterRegister: [{ type: Input, args: ['filterRegister',] }]
124
120
  };
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL25naGlhdHQxNV9vbmVtb3VudC9Eb2N1bWVudHMvbGliLWNvcmUtdWkvcHJvamVjdHMvc2QtY29yZS9ncmlkLW1hdGVyaWFsLyIsInNvdXJjZXMiOlsic3JjL2xpYi9jb21wb25lbnRzL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUF3QixTQUFTLEVBQTRCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3hKLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFTNUQsTUFBTSxPQUFPLFlBQVk7SUE0QnZCLFlBQ1UsR0FBc0IsRUFDdEIsYUFBb0M7UUFEcEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBM0I5QywrQkFBdUIsSUFBSSxPQUFPLEVBQThCLEVBQUM7UUFLeEQsWUFBTyxHQUEyQixFQUFFLENBQUM7UUFDckMsZUFBVSxHQUFtQyxFQUFFLENBQUM7UUFNekQseUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQStCLElBQUksQ0FBQyxDQUFDO1FBRS9FLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFDcEIsb0JBQWUsR0FBNEIsRUFBRSxDQUFDO1FBQzlDLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLGlCQUFZLEdBQTRCLEVBQUUsQ0FBQztRQUMzQyxvQkFBZSxHQUFtQyxFQUFFLENBQUM7UUFDckQsbUJBQWMsR0FBUSxFQUFFLENBQUM7UUFDekIsbUJBQWMsR0FBNEIs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TTtJQUNOLCtDQUErQztJQUMvQyw0REFBNEQ7SUFDNUQsMEZBQTBGO0lBQzFGLE1BQU07SUFDTixJQUFJO0lBRUosV0FBVztRQUNULDRDQUFtQixXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDOzs7O1lBL0ZGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQiwwbFJBQTJDO2dCQUUzQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQWY4RyxpQkFBaUI7WUFPdkgscUJBQXFCOzs7MEJBVTNCLFNBQVMsU0FBQyxhQUFhO3NCQUd2QixLQUFLLFNBQUMsUUFBUTtzQkFJZCxLQUFLO3lCQUNMLEtBQUs7OEJBRUwsS0FBSyxTQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNkR3JpZE1hdGVyaWFsRmlsdGVyT3B0aW9uLCBTZEdyaWRNYXRlcmlhbEV4dGVybmFsRmlsdGVyLCBTZEdyaWRNYXRlcmlhbEZpbHRlclJlZ2lzdGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBTZEdyaWRNYXRlcmlhbENvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVscy9ncmlkLWNvbHVtbi5tb2RlbCc7XHJcbmltcG9ydCB7IFNkUG9wdXBGaWx0ZXIgfSBmcm9tICcuLi9wb3B1cC1maWx0ZXIvcG9wdXAtZmlsdGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2RHcmlkRmlsdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtZmlsdGVyLWRlZi5kaXJlY3RpdmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZC1ncmlkLWZpbHRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWQtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncmlkLWZpbHRlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWRGaWx0ZXIgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoU2RQb3B1cEZpbHRlcikgcG9wdXBGaWx0ZXI6IFNkUG9wdXBGaWx0ZXI7XHJcbiAgZmlsdGVyOiBSZWFkb25seTxTZEdyaWRNYXRlcmlhbEZpbHRlck9wdGlvbj47XHJcbiAgI2ZpbHRlck9wdGlvbkNoYW5nZXMgPSBuZXcgU3ViamVjdDxTZEdyaWRNYXRlcmlhbEZpbHRlck9wdGlvbj4oKTtcclxuICBASW5wdXQoJ2ZpbHRlcicpIHNldCBfZmlsdGVyKGZpbHRlcjogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJPcHRpb24pIHtcclxuICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xyXG4gICAgdGhpcy4jZmlsdGVyT3B0aW9uQ2hhbmdlcy5uZXh0KHRoaXMuZmlsdGVyKTtcclxuICB9XHJcbiAgQElucHV0KCkgY29sdW1uczogU2RHcmlkTWF0ZXJpYWxDb2x1bW5bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGZpbHRlckRlZnM6IFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmVbXSA9IFtdO1xyXG4gIGZpbHRlclJlZ2lzdGVyOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlZ2lzdGVyO1xyXG4gIEBJbnB1dCgnZmlsdGVyUmVnaXN0ZXInKSBzZXQgX2ZpbHRlclJlZ2lzdGVyKHZhbHVlOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlZ2lzdGVyKSB7XHJcbiAgICB0aGlzLmZpbHRlclJlZ2lzdGVyID0gdmFsdWU7XHJcbiAgICB0aGlzLmZpbHRlclJlZ2lzdGVyQ2hhbmdlLm5leHQodGhpcy5maWx0ZXJSZWdpc3Rlcik7XHJcbiAgfTtcclxuICBmaWx0ZXJSZWdpc3RlckNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZWdpc3Rlcj4obnVsbCk7XHJcblxyXG4gIGZpbHRlckRlZjogYW55ID0ge307XHJcbiAgaW5saW5lRmlsdGVyRGVmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gIGNvbHVtbkZpbHRlcjogYW55ID0ge307XHJcbiAgaW5saW5lQ29sdW1uOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gIGV4dGVybmFsRmlsdGVyczogU2RHcmlkTWF0ZXJpYWxFeHRlcm5hbEZpbHRlcltdID0gW107XHJcbiAgZXh0ZXJuYWxGaWx0ZXI6IGFueSA9IHt9O1xyXG4gIGlubGluZUV4dGVybmFsOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gIGlzTW9iaWxlT3JUYWJsZXQ6IGJvb2xlYW47XHJcblxyXG4gICNzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBkZXZpY2VTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UpIHtcclxuICAgIHRoaXMuaXNNb2JpbGVPclRhYmxldCA9ICF0aGlzLmRldmljZVNlcnZpY2UuaXNEZXNrdG9wKCk7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy4jZmlsdGVyT3B0aW9uQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmZpbHRlcikpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAvLyAgIGlmICh0aGlzLmZpbHRlcj8uZGlzYWJsZWQpIHtcclxuICAgIC8vICAgICB0aGlzLmZpbHRlckNoYW5nZS5uZXh0KHRydWUpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLmV4dGVybmFsRmlsdGVycyA9IHRoaXMuZmlsdGVyPy5leHRlcm5hbEZpbHRlcnMgfHwgW107XHJcbiAgICAvLyAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdyaWRGaWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmZpbHRlcj8ua2V5KTtcclxuICAgIC8vICAgdGhpcy5pbmxpbmVDb2x1bW4gPSBjb25maWd1cmF0aW9uLmlubGluZUNvbHVtbjtcclxuICAgIC8vICAgdGhpcy5pbmxpbmVFeHRlcm5hbCA9IGNvbmZpZ3VyYXRpb24uaW5saW5lRXh0ZXJuYWw7XHJcbiAgICAvLyAgIHRoaXMuaW5saW5lRmlsdGVyRGVmID0gY29uZmlndXJhdGlvbi5pbmxpbmVGaWx0ZXJEZWY7XHJcbiAgICAvLyAgIHRoaXMuI2xvYWREZWZhdWx0KCk7XHJcbiAgICAvLyAgIHRoaXMuZmlsdGVyQ2hhbmdlLm5leHQodHJ1ZSk7XHJcbiAgICAvLyAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgLy8gfSkpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmZpbHRlclJlZ2lzdGVyQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlclJlZ2lzdGVyKSB7XHJcbiAgICAgICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmZpbHRlclJlZ2lzdGVyLm9ic2VydmVyLnN1YnNjcmliZShjb25maWd1cmF0aW9uID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5saW5lQ29sdW1uID0gY29uZmlndXJhdGlvbi5pbmxpbmVDb2x1bW47XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbkZpbHRlciA9IGNvbmZpZ3VyYXRpb24uY29sdW1uRmlsdGVyO1xyXG4gICAgICAgICAgdGhpcy5pbmxpbmVFeHRlcm5hbCA9IGNvbmZpZ3VyYXRpb24uaW5saW5lRXh0ZXJuYWw7XHJcbiAgICAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyID0gY29uZmlndXJhdGlvbi5leHRlcm5hbEZpbHRlcjtcclxuICAgICAgICAgIHRoaXMuaW5saW5lRmlsdGVyRGVmID0gY29uZmlndXJhdGlvbi5pbmxpbmVGaWx0ZXJEZWY7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlckRlZiA9IGNvbmZpZ3VyYXRpb24uZmlsdGVyRGVmO1xyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8vICNsb2FkRGVmYXVsdCA9ICgpID0+IHtcclxuICAvLyAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1ucykge1xyXG4gIC8vICAgICB0aGlzLmlubGluZUNvbHVtbltjb2x1bW4uZmllbGRdID0gdGhpcy5pbmxpbmVDb2x1bW5bY29sdW1uLmZpZWxkXSA/PyBjb2x1bW4/LmZpbHRlcj8uZGVmYXVsdFNob3dpbmc7XHJcbiAgLy8gICAgIHRoaXMuY29sdW1uRmlsdGVyW2NvbHVtbi5maWVsZF0gPSB0aGlzLmNvbHVtbkZpbHRlcltjb2x1bW4uZmllbGRdID8/IGNvbHVtbj8uZmlsdGVyPy5kZWZhdWx0O1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChjb25zdCBleHRlcm5hbEZpbHRlciBvZiB0aGlzLmV4dGVybmFsRmlsdGVycykge1xyXG4gIC8vICAgICB0aGlzLmlubGluZUV4dGVybmFsW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA9IHRoaXMuaW5saW5lRXh0ZXJuYWxbZXh0ZXJuYWxGaWx0ZXIuZmllbGRdID8/IGV4dGVybmFsRmlsdGVyPy5kZWZhdWx0U2hvd2luZztcclxuICAvLyAgICAgaWYgKGV4dGVybmFsRmlsdGVyLnR5cGUgPT09ICdkYXRlcmFuZ2UnKSB7XHJcbiAgLy8gICAgICAgdGhpcy5leHRlcm5hbEZpbHRlcltleHRlcm5hbEZpbHRlci5maWVsZF0gPSB7XHJcbiAgLy8gICAgICAgICBmcm9tOiB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXT8uZnJvbSA/PyBleHRlcm5hbEZpbHRlci5kZWZhdWx0Py5mcm9tID8/IHVuZGVmaW5lZCxcclxuICAvLyAgICAgICAgIHRvOiB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXT8udG8gPz8gZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdD8udG8gPz8gdW5kZWZpbmVkXHJcbiAgLy8gICAgICAgfTtcclxuICAvLyAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA9IHRoaXMuZXh0ZXJuYWxGaWx0ZXJbZXh0ZXJuYWxGaWx0ZXIuZmllbGRdID8/IGV4dGVybmFsRmlsdGVyLmRlZmF1bHQ7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGZvciAoY29uc3QgZmlsdGVyRGVmIG9mIHRoaXMuZmlsdGVyRGVmcykge1xyXG4gIC8vICAgICB0aGlzLmlubGluZUZpbHRlckRlZltmaWx0ZXJEZWYuc2RNYXRlcmlhbEZpbHRlckRlZl0gPVxyXG4gIC8vICAgICAgIHRoaXMuaW5saW5lRmlsdGVyRGVmW2ZpbHRlckRlZi5zZE1hdGVyaWFsRmlsdGVyRGVmXSA/PyBmaWx0ZXJEZWY/LmRlZmF1bHRTaG93aW5nO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG9uRmlsdGVyID0gKGl0ZW0/OiBTZEdyaWRNYXRlcmlhbENvbHVtbiB8IFNkR3JpZE1hdGVyaWFsRXh0ZXJuYWxGaWx0ZXIpID0+IHtcclxuICAgIHRoaXMuZmlsdGVyUmVnaXN0ZXIuc2V0KHtcclxuICAgICAgY29sdW1uRmlsdGVyOiB0aGlzLmNvbHVtbkZpbHRlcixcclxuICAgICAgZXh0ZXJuYWxGaWx0ZXI6IHRoaXMuZXh0ZXJuYWxGaWx0ZXIsXHJcbiAgICAgIGZpbHRlckRlZjogdGhpcy5maWx0ZXJEZWZcclxuICAgIH0pO1xyXG4gICAgLy8gdGhpcy5maWx0ZXJDaGFuZ2UubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIG9wZW4gPSAoKSA9PiB7XHJcbiAgICB0aGlzLnBvcHVwRmlsdGVyLm9wZW4oKTtcclxuICB9XHJcblxyXG4gIG9uUmVzZXQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmZpbHRlclJlZ2lzdGVyLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG4gIC8vIHNldEZpbHRlciA9IChhcmdzOiB7XHJcbiAgLy8gICBjb2x1bW5GaWx0ZXI/OiBhbnksXHJcbiAgLy8gICBleHRlcm5hbEZpbHRlcj86IGFueSxcclxuICAvLyAgIGZpbHRlckRlZj86IGFueVxyXG4gIC8vIH0pID0+IHtcclxuICAvLyAgIGNvbnN0IHsgY29sdW1uRmlsdGVyLCBleHRlcm5hbEZpbHRlciwgZmlsdGVyRGVmIH0gPSBhcmdzO1xyXG4gIC8vICAgaWYgKGNvbHVtbkZpbHRlcikge1xyXG4gIC8vICAgICB0aGlzLmNvbHVtbkZpbHRlciA9IGNvbHVtbkZpbHRlcjtcclxuICAvLyAgIH1cclxuICAvLyAgIGlmIChleHRlcm5hbEZpbHRlcikge1xyXG4gIC8vICAgICB0aGlzLmV4dGVybmFsRmlsdGVyID0gZXh0ZXJuYWxGaWx0ZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoZmlsdGVyRGVmKSB7XHJcbiAgLy8gICAgIHRoaXMuZmlsdGVyRGVmID0gZmlsdGVyRGVmO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChjb25zdCBleEZpbHRlciBvZiB0aGlzLmV4dGVybmFsRmlsdGVycykge1xyXG4gIC8vICAgICBpZiAoZXhGaWx0ZXIudHlwZSA9PT0gJ2RhdGVyYW5nZScpIHtcclxuICAvLyAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyW2V4RmlsdGVyLmZpZWxkXSA9IHtcclxuICAvLyAgICAgICAgIGZyb206IHRoaXMuZXh0ZXJuYWxGaWx0ZXJbZXhGaWx0ZXIuZmllbGRdPy5mcm9tID8/IHVuZGVmaW5lZCxcclxuICAvLyAgICAgICAgIHRvOiB0aGlzLmV4dGVybmFsRmlsdGVyW2V4RmlsdGVyLmZpZWxkXT8udG8gPz8gdW5kZWZpbmVkXHJcbiAgLy8gICAgICAgfTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgLy8gfVxyXG59XHJcbiJdfQ==
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL25naGlhdHQxNV9vbmVtb3VudC9Eb2N1bWVudHMvbGliLWNvcmUtdWkvcHJvamVjdHMvc2QtY29yZS9ncmlkLW1hdGVyaWFsLyIsInNvdXJjZXMiOlsic3JjL2xpYi9jb21wb25lbnRzL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUF3QixTQUFTLEVBQTRCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3hKLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFXLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFTNUQsTUFBTSxPQUFPLFlBQVk7SUEwQnZCLFlBQ1UsR0FBc0IsRUFDdEIsYUFBb0M7UUFEcEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBdEJyQyxZQUFPLEdBQTJCLEVBQUUsQ0FBQztRQUNyQyxlQUFVLEdBQW1DLEVBQUUsQ0FBQztRQU16RCx5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBK0IsSUFBSSxDQUFDLENBQUM7UUFFL0UsY0FBUyxHQUFRLEVBQUUsQ0FBQztRQUNwQixvQkFBZSxHQUE0QixFQUFFLENBQUM7UUFDOUMsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsaUJBQVksR0FBNEIsRUFBRSxDQUFDO1FBQzNDLG9CQUFlLEdBQW1DLEVBQUUsQ0FBQztRQUNyRCxtQkFBYyxHQUFRLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUE0QixF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QU07SUFDTixJQUFJO0lBRUosV0FBVztRQUNULDRDQUFtQixXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDOzs7O1lBM0ZGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixvbFJBQTJDO2dCQUUzQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQWY4RyxpQkFBaUI7WUFPdkgscUJBQXFCOzs7MEJBVTNCLFNBQVMsU0FBQyxhQUFhO3NCQUV2QixLQUFLLFNBQUMsUUFBUTtzQkFHZCxLQUFLO3lCQUNMLEtBQUs7OEJBRUwsS0FBSyxTQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNkR3JpZE1hdGVyaWFsRmlsdGVyT3B0aW9uLCBTZEdyaWRNYXRlcmlhbEV4dGVybmFsRmlsdGVyLCBTZEdyaWRNYXRlcmlhbEZpbHRlclJlZ2lzdGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBTZEdyaWRNYXRlcmlhbENvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVscy9ncmlkLWNvbHVtbi5tb2RlbCc7XHJcbmltcG9ydCB7IFNkUG9wdXBGaWx0ZXIgfSBmcm9tICcuLi9wb3B1cC1maWx0ZXIvcG9wdXAtZmlsdGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2RHcmlkRmlsdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtZmlsdGVyLWRlZi5kaXJlY3RpdmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZC1ncmlkLWZpbHRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWQtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncmlkLWZpbHRlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWRGaWx0ZXIgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoU2RQb3B1cEZpbHRlcikgcG9wdXBGaWx0ZXI6IFNkUG9wdXBGaWx0ZXI7XHJcbiAgZmlsdGVyOiBSZWFkb25seTxTZEdyaWRNYXRlcmlhbEZpbHRlck9wdGlvbj47XHJcbiAgQElucHV0KCdmaWx0ZXInKSBzZXQgX2ZpbHRlcihmaWx0ZXI6IFNkR3JpZE1hdGVyaWFsRmlsdGVyT3B0aW9uKSB7XHJcbiAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcclxuICB9XHJcbiAgQElucHV0KCkgY29sdW1uczogU2RHcmlkTWF0ZXJpYWxDb2x1bW5bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGZpbHRlckRlZnM6IFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmVbXSA9IFtdO1xyXG4gIGZpbHRlclJlZ2lzdGVyOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlZ2lzdGVyO1xyXG4gIEBJbnB1dCgnZmlsdGVyUmVnaXN0ZXInKSBzZXQgX2ZpbHRlclJlZ2lzdGVyKHZhbHVlOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlZ2lzdGVyKSB7XHJcbiAgICB0aGlzLmZpbHRlclJlZ2lzdGVyID0gdmFsdWU7XHJcbiAgICB0aGlzLmZpbHRlclJlZ2lzdGVyQ2hhbmdlLm5leHQodGhpcy5maWx0ZXJSZWdpc3Rlcik7XHJcbiAgfTtcclxuICBmaWx0ZXJSZWdpc3RlckNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZWdpc3Rlcj4obnVsbCk7XHJcblxyXG4gIGZpbHRlckRlZjogYW55ID0ge307XHJcbiAgaW5saW5lRmlsdGVyRGVmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gIGNvbHVtbkZpbHRlcjogYW55ID0ge307XHJcbiAgaW5saW5lQ29sdW1uOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gIGV4dGVybmFsRmlsdGVyczogU2RHcmlkTWF0ZXJpYWxFeHRlcm5hbEZpbHRlcltdID0gW107XHJcbiAgZXh0ZXJuYWxGaWx0ZXI6IGFueSA9IHt9O1xyXG4gIGlubGluZUV4dGVybmFsOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gIGlzTW9iaWxlT3JUYWJsZXQ6IGJvb2xlYW47XHJcblxyXG4gICNzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBkZXZpY2VTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UpIHtcclxuICAgIHRoaXMuaXNNb2JpbGVPclRhYmxldCA9ICF0aGlzLmRldmljZVNlcnZpY2UuaXNEZXNrdG9wKCk7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy4jZmlsdGVyT3B0aW9uQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmZpbHRlcikpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAvLyAgIGlmICh0aGlzLmZpbHRlcj8uZGlzYWJsZWQpIHtcclxuICAgIC8vICAgICB0aGlzLmZpbHRlckNoYW5nZS5uZXh0KHRydWUpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLmV4dGVybmFsRmlsdGVycyA9IHRoaXMuZmlsdGVyPy5leHRlcm5hbEZpbHRlcnMgfHwgW107XHJcbiAgICAvLyAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdyaWRGaWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmZpbHRlcj8ua2V5KTtcclxuICAgIC8vICAgdGhpcy5pbmxpbmVDb2x1bW4gPSBjb25maWd1cmF0aW9uLmlubGluZUNvbHVtbjtcclxuICAgIC8vICAgdGhpcy5pbmxpbmVFeHRlcm5hbCA9IGNvbmZpZ3VyYXRpb24uaW5saW5lRXh0ZXJuYWw7XHJcbiAgICAvLyAgIHRoaXMuaW5saW5lRmlsdGVyRGVmID0gY29uZmlndXJhdGlvbi5pbmxpbmVGaWx0ZXJEZWY7XHJcbiAgICAvLyAgIHRoaXMuI2xvYWREZWZhdWx0KCk7XHJcbiAgICAvLyAgIHRoaXMuZmlsdGVyQ2hhbmdlLm5leHQodHJ1ZSk7XHJcbiAgICAvLyAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgLy8gfSkpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmZpbHRlclJlZ2lzdGVyQ2hhbmdlLnBpcGUoc3RhcnRXaXRoKHRoaXMuZmlsdGVyUmVnaXN0ZXIpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuZmlsdGVyUmVnaXN0ZXIub2JzZXJ2ZXIuc3Vic2NyaWJlKGNvbmZpZ3VyYXRpb24gPT4ge1xyXG4gICAgICAgIHRoaXMuaW5saW5lQ29sdW1uID0gY29uZmlndXJhdGlvbi5pbmxpbmVDb2x1bW47XHJcbiAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXIgPSBjb25maWd1cmF0aW9uLmNvbHVtbkZpbHRlcjtcclxuICAgICAgICB0aGlzLmlubGluZUV4dGVybmFsID0gY29uZmlndXJhdGlvbi5pbmxpbmVFeHRlcm5hbDtcclxuICAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyID0gY29uZmlndXJhdGlvbi5leHRlcm5hbEZpbHRlcjtcclxuICAgICAgICB0aGlzLmlubGluZUZpbHRlckRlZiA9IGNvbmZpZ3VyYXRpb24uaW5saW5lRmlsdGVyRGVmO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRGVmID0gY29uZmlndXJhdGlvbi5maWx0ZXJEZWY7XHJcbiAgICAgIH0pKTtcclxuICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvLyAjbG9hZERlZmF1bHQgPSAoKSA9PiB7XHJcbiAgLy8gICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLmNvbHVtbnMpIHtcclxuICAvLyAgICAgdGhpcy5pbmxpbmVDb2x1bW5bY29sdW1uLmZpZWxkXSA9IHRoaXMuaW5saW5lQ29sdW1uW2NvbHVtbi5maWVsZF0gPz8gY29sdW1uPy5maWx0ZXI/LmRlZmF1bHRTaG93aW5nO1xyXG4gIC8vICAgICB0aGlzLmNvbHVtbkZpbHRlcltjb2x1bW4uZmllbGRdID0gdGhpcy5jb2x1bW5GaWx0ZXJbY29sdW1uLmZpZWxkXSA/PyBjb2x1bW4/LmZpbHRlcj8uZGVmYXVsdDtcclxuICAvLyAgIH1cclxuICAvLyAgIGZvciAoY29uc3QgZXh0ZXJuYWxGaWx0ZXIgb2YgdGhpcy5leHRlcm5hbEZpbHRlcnMpIHtcclxuICAvLyAgICAgdGhpcy5pbmxpbmVFeHRlcm5hbFtleHRlcm5hbEZpbHRlci5maWVsZF0gPSB0aGlzLmlubGluZUV4dGVybmFsW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA/PyBleHRlcm5hbEZpbHRlcj8uZGVmYXVsdFNob3dpbmc7XHJcbiAgLy8gICAgIGlmIChleHRlcm5hbEZpbHRlci50eXBlID09PSAnZGF0ZXJhbmdlJykge1xyXG4gIC8vICAgICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXJbZXh0ZXJuYWxGaWx0ZXIuZmllbGRdID0ge1xyXG4gIC8vICAgICAgICAgZnJvbTogdGhpcy5leHRlcm5hbEZpbHRlcltleHRlcm5hbEZpbHRlci5maWVsZF0/LmZyb20gPz8gZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdD8uZnJvbSA/PyB1bmRlZmluZWQsXHJcbiAgLy8gICAgICAgICB0bzogdGhpcy5leHRlcm5hbEZpbHRlcltleHRlcm5hbEZpbHRlci5maWVsZF0/LnRvID8/IGV4dGVybmFsRmlsdGVyLmRlZmF1bHQ/LnRvID8/IHVuZGVmaW5lZFxyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy5leHRlcm5hbEZpbHRlcltleHRlcm5hbEZpbHRlci5maWVsZF0gPSB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA/PyBleHRlcm5hbEZpbHRlci5kZWZhdWx0O1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGNvbnN0IGZpbHRlckRlZiBvZiB0aGlzLmZpbHRlckRlZnMpIHtcclxuICAvLyAgICAgdGhpcy5pbmxpbmVGaWx0ZXJEZWZbZmlsdGVyRGVmLnNkTWF0ZXJpYWxGaWx0ZXJEZWZdID1cclxuICAvLyAgICAgICB0aGlzLmlubGluZUZpbHRlckRlZltmaWx0ZXJEZWYuc2RNYXRlcmlhbEZpbHRlckRlZl0gPz8gZmlsdGVyRGVmPy5kZWZhdWx0U2hvd2luZztcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBvbkZpbHRlciA9IChpdGVtPzogU2RHcmlkTWF0ZXJpYWxDb2x1bW4gfCBTZEdyaWRNYXRlcmlhbEV4dGVybmFsRmlsdGVyKSA9PiB7XHJcbiAgICB0aGlzLmZpbHRlclJlZ2lzdGVyLnNldCh7XHJcbiAgICAgIGNvbHVtbkZpbHRlcjogdGhpcy5jb2x1bW5GaWx0ZXIsXHJcbiAgICAgIGV4dGVybmFsRmlsdGVyOiB0aGlzLmV4dGVybmFsRmlsdGVyLFxyXG4gICAgICBmaWx0ZXJEZWY6IHRoaXMuZmlsdGVyRGVmXHJcbiAgICB9KTtcclxuICAgIC8vIHRoaXMuZmlsdGVyQ2hhbmdlLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBvcGVuID0gKCkgPT4ge1xyXG4gICAgdGhpcy5wb3B1cEZpbHRlci5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICBvblJlc2V0ID0gKCkgPT4ge1xyXG4gICAgdGhpcy5maWx0ZXJSZWdpc3Rlci5yZW1vdmUoKTtcclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuICAvLyBzZXRGaWx0ZXIgPSAoYXJnczoge1xyXG4gIC8vICAgY29sdW1uRmlsdGVyPzogYW55LFxyXG4gIC8vICAgZXh0ZXJuYWxGaWx0ZXI/OiBhbnksXHJcbiAgLy8gICBmaWx0ZXJEZWY/OiBhbnlcclxuICAvLyB9KSA9PiB7XHJcbiAgLy8gICBjb25zdCB7IGNvbHVtbkZpbHRlciwgZXh0ZXJuYWxGaWx0ZXIsIGZpbHRlckRlZiB9ID0gYXJncztcclxuICAvLyAgIGlmIChjb2x1bW5GaWx0ZXIpIHtcclxuICAvLyAgICAgdGhpcy5jb2x1bW5GaWx0ZXIgPSBjb2x1bW5GaWx0ZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoZXh0ZXJuYWxGaWx0ZXIpIHtcclxuICAvLyAgICAgdGhpcy5leHRlcm5hbEZpbHRlciA9IGV4dGVybmFsRmlsdGVyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKGZpbHRlckRlZikge1xyXG4gIC8vICAgICB0aGlzLmZpbHRlckRlZiA9IGZpbHRlckRlZjtcclxuICAvLyAgIH1cclxuICAvLyAgIGZvciAoY29uc3QgZXhGaWx0ZXIgb2YgdGhpcy5leHRlcm5hbEZpbHRlcnMpIHtcclxuICAvLyAgICAgaWYgKGV4RmlsdGVyLnR5cGUgPT09ICdkYXRlcmFuZ2UnKSB7XHJcbiAgLy8gICAgICAgdGhpcy5leHRlcm5hbEZpbHRlcltleEZpbHRlci5maWVsZF0gPSB7XHJcbiAgLy8gICAgICAgICBmcm9tOiB0aGlzLmV4dGVybmFsRmlsdGVyW2V4RmlsdGVyLmZpZWxkXT8uZnJvbSA/PyB1bmRlZmluZWQsXHJcbiAgLy8gICAgICAgICB0bzogdGhpcy5leHRlcm5hbEZpbHRlcltleEZpbHRlci5maWVsZF0/LnRvID8/IHVuZGVmaW5lZFxyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIC8vIH1cclxufVxyXG4iXX0=