@mintplayer/ng-bootstrap 14.9.0 → 14.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_bootstrap.scss +1 -1
- package/esm2020/lib/components/index.mjs +2 -1
- package/esm2020/lib/components/navbar/navbar-brand/navbar-brand.component.mjs +3 -5
- package/esm2020/lib/components/navbar/navbar.module.mjs +1 -5
- package/esm2020/lib/components/select/component/select.component.mjs +85 -0
- package/esm2020/lib/components/select/index.mjs +5 -0
- package/esm2020/lib/components/select/select.module.mjs +31 -0
- package/esm2020/lib/components/select/types/index.mjs +2 -0
- package/esm2020/lib/components/select/types/select-size.mjs +2 -0
- package/esm2020/lib/components/select/value-accessors/index.mjs +2 -0
- package/esm2020/lib/components/select/value-accessors/select-value-accessor.mjs +171 -0
- package/fesm2015/mintplayer-ng-bootstrap.mjs +276 -8
- package/fesm2015/mintplayer-ng-bootstrap.mjs.map +1 -1
- package/fesm2020/mintplayer-ng-bootstrap.mjs +274 -8
- package/fesm2020/mintplayer-ng-bootstrap.mjs.map +1 -1
- package/lib/components/index.d.ts +1 -0
- package/lib/components/navbar/navbar.module.d.ts +2 -3
- package/lib/components/select/component/select.component.d.ts +26 -0
- package/lib/components/select/index.d.ts +4 -0
- package/lib/components/select/select.module.d.ts +9 -0
- package/lib/components/select/types/index.d.ts +1 -0
- package/lib/components/select/types/select-size.d.ts +1 -0
- package/lib/components/select/value-accessors/index.d.ts +1 -0
- package/lib/components/select/value-accessors/select-value-accessor.d.ts +44 -0
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { BsSelectComponent } from './component/select.component';
|
|
4
|
+
import { BsSelectValueAccessor, BsSelectOption } from './value-accessors/select-value-accessor';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class BsSelectModule {
|
|
7
|
+
}
|
|
8
|
+
BsSelectModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: BsSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
9
|
+
BsSelectModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.2", ngImport: i0, type: BsSelectModule, declarations: [BsSelectComponent,
|
|
10
|
+
BsSelectValueAccessor,
|
|
11
|
+
BsSelectOption], imports: [CommonModule], exports: [BsSelectComponent,
|
|
12
|
+
BsSelectValueAccessor,
|
|
13
|
+
BsSelectOption] });
|
|
14
|
+
BsSelectModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: BsSelectModule, imports: [CommonModule] });
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: BsSelectModule, decorators: [{
|
|
16
|
+
type: NgModule,
|
|
17
|
+
args: [{
|
|
18
|
+
declarations: [
|
|
19
|
+
BsSelectComponent,
|
|
20
|
+
BsSelectValueAccessor,
|
|
21
|
+
BsSelectOption
|
|
22
|
+
],
|
|
23
|
+
imports: [CommonModule],
|
|
24
|
+
exports: [
|
|
25
|
+
BsSelectComponent,
|
|
26
|
+
BsSelectValueAccessor,
|
|
27
|
+
BsSelectOption
|
|
28
|
+
],
|
|
29
|
+
}]
|
|
30
|
+
}] });
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvc3JjL2xpYi9jb21wb25lbnRzL3NlbGVjdC9zZWxlY3QubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUFlaEcsTUFBTSxPQUFPLGNBQWM7OzJHQUFkLGNBQWM7NEdBQWQsY0FBYyxpQkFYdkIsaUJBQWlCO1FBQ2pCLHFCQUFxQjtRQUNyQixjQUFjLGFBRU4sWUFBWSxhQUVwQixpQkFBaUI7UUFDakIscUJBQXFCO1FBQ3JCLGNBQWM7NEdBR0wsY0FBYyxZQVBmLFlBQVk7MkZBT1gsY0FBYztrQkFiMUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osaUJBQWlCO3dCQUNqQixxQkFBcUI7d0JBQ3JCLGNBQWM7cUJBQ2Y7b0JBQ0QsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUU7d0JBQ1AsaUJBQWlCO3dCQUNqQixxQkFBcUI7d0JBQ3JCLGNBQWM7cUJBQ2Y7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQvc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCc1NlbGVjdFZhbHVlQWNjZXNzb3IsIEJzU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi92YWx1ZS1hY2Nlc3NvcnMvc2VsZWN0LXZhbHVlLWFjY2Vzc29yJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgQnNTZWxlY3RDb21wb25lbnQsXG4gICAgQnNTZWxlY3RWYWx1ZUFjY2Vzc29yLFxuICAgIEJzU2VsZWN0T3B0aW9uXG4gIF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbXG4gICAgQnNTZWxlY3RDb21wb25lbnQsXG4gICAgQnNTZWxlY3RWYWx1ZUFjY2Vzc29yLFxuICAgIEJzU2VsZWN0T3B0aW9uXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEJzU2VsZWN0TW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './select-size';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3QvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NlbGVjdC1zaXplJzsiXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3QvdHlwZXMvc2VsZWN0LXNpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEJzU2VsZWN0U2l6ZSA9ICdzbScgfCAnbWQnIHwgJ2xnJzsiXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './select-value-accessor';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3QvdmFsdWUtYWNjZXNzb3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NlbGVjdC12YWx1ZS1hY2Nlc3Nvcic7Il19
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// import { AfterViewInit, Directive, forwardRef, HostListener, Input, OnDestroy } from '@angular/core';
|
|
2
|
+
// import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
// import { fromEvent, Subject, takeUntil } from 'rxjs';
|
|
4
|
+
// import { BsSelectComponent } from '../component/select.component';
|
|
5
|
+
import { Directive, ElementRef, forwardRef, Host, HostListener, Input, Optional, Renderer2 } from "@angular/core";
|
|
6
|
+
import { NG_VALUE_ACCESSOR } from "@angular/forms";
|
|
7
|
+
import { BsSelectComponent } from "../component/select.component";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../component/select.component";
|
|
10
|
+
export class BsSelectValueAccessor {
|
|
11
|
+
constructor(_renderer, _elementRef, selectBox) {
|
|
12
|
+
this._renderer = _renderer;
|
|
13
|
+
this._elementRef = _elementRef;
|
|
14
|
+
this.selectBox = selectBox;
|
|
15
|
+
this.onChange = (_) => { };
|
|
16
|
+
this.onTouched = () => { };
|
|
17
|
+
this.optionMap = new Map();
|
|
18
|
+
this.idCounter = 0;
|
|
19
|
+
this.compareWithFunction = Object.is;
|
|
20
|
+
}
|
|
21
|
+
registerOnTouched(fn) {
|
|
22
|
+
this.onTouched = fn;
|
|
23
|
+
}
|
|
24
|
+
registerOnChange(fn) {
|
|
25
|
+
this.onChange = (valueString) => {
|
|
26
|
+
// View -> Model
|
|
27
|
+
this.value = this.getOptionValue(valueString);
|
|
28
|
+
fn(this.value);
|
|
29
|
+
// fn(valueString);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
setDisabledState(isDisabled) {
|
|
33
|
+
this.setProperty('disabled', isDisabled);
|
|
34
|
+
}
|
|
35
|
+
setProperty(key, value) {
|
|
36
|
+
// if (this._elementRef) {
|
|
37
|
+
// this._renderer.setProperty(this._elementRef.nativeElement, key, value);
|
|
38
|
+
// }
|
|
39
|
+
if (this.selectBox.selectBox) {
|
|
40
|
+
this._renderer.setProperty(this.selectBox.selectBox.nativeElement, key, value);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
hostOnChange(ev) {
|
|
44
|
+
this.onChange(ev.target.value);
|
|
45
|
+
}
|
|
46
|
+
hostBlur(ev) {
|
|
47
|
+
this.onTouched();
|
|
48
|
+
}
|
|
49
|
+
set compareWith(value) {
|
|
50
|
+
if (typeof value !== 'function') {
|
|
51
|
+
throw new Error('compareWith must be a function');
|
|
52
|
+
}
|
|
53
|
+
this.compareWithFunction = value;
|
|
54
|
+
}
|
|
55
|
+
buildValueString(id, value) {
|
|
56
|
+
if (id == null) {
|
|
57
|
+
return `${value}`;
|
|
58
|
+
}
|
|
59
|
+
if (value && (typeof value === 'object')) {
|
|
60
|
+
value = 'Object';
|
|
61
|
+
}
|
|
62
|
+
return `${id}: ${value}`.slice(0, 50);
|
|
63
|
+
}
|
|
64
|
+
extractId(valueString) {
|
|
65
|
+
return valueString.split(':')[0];
|
|
66
|
+
}
|
|
67
|
+
writeValue(value) {
|
|
68
|
+
this.value = value;
|
|
69
|
+
// console.log(`WriteValue ${this.selectBox.identifier}`, value);
|
|
70
|
+
const id = this.getOptionId(value);
|
|
71
|
+
const valueString = this.buildValueString(id, value);
|
|
72
|
+
this.setProperty('value', valueString);
|
|
73
|
+
}
|
|
74
|
+
registerOption() {
|
|
75
|
+
return (this.idCounter++).toString();
|
|
76
|
+
}
|
|
77
|
+
getOptionId(value) {
|
|
78
|
+
for (const id of Array.from(this.optionMap.keys())) {
|
|
79
|
+
if (this.compareWithFunction(this.optionMap.get(id), value)) {
|
|
80
|
+
return id;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// This shouldn't happen
|
|
84
|
+
// debugger;
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
getOptionValue(valueString) {
|
|
88
|
+
const id = this.extractId(valueString);
|
|
89
|
+
return this.optionMap.has(id) ? this.optionMap.get(id) : valueString;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
BsSelectValueAccessor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: BsSelectValueAccessor, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.BsSelectComponent }], target: i0.ɵɵFactoryTarget.Directive });
|
|
93
|
+
BsSelectValueAccessor.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.2", type: BsSelectValueAccessor, selector: "bs-select", inputs: { compareWith: "compareWith" }, host: { listeners: { "change": "hostOnChange($event)", "blur": "hostBlur($event)" } }, providers: [{
|
|
94
|
+
provide: NG_VALUE_ACCESSOR,
|
|
95
|
+
useExisting: forwardRef(() => BsSelectValueAccessor),
|
|
96
|
+
multi: true,
|
|
97
|
+
}], ngImport: i0 });
|
|
98
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: BsSelectValueAccessor, decorators: [{
|
|
99
|
+
type: Directive,
|
|
100
|
+
args: [{
|
|
101
|
+
selector: 'bs-select',
|
|
102
|
+
providers: [{
|
|
103
|
+
provide: NG_VALUE_ACCESSOR,
|
|
104
|
+
useExisting: forwardRef(() => BsSelectValueAccessor),
|
|
105
|
+
multi: true,
|
|
106
|
+
}],
|
|
107
|
+
}]
|
|
108
|
+
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.BsSelectComponent }]; }, propDecorators: { hostOnChange: [{
|
|
109
|
+
type: HostListener,
|
|
110
|
+
args: ['change', ['$event']]
|
|
111
|
+
}], hostBlur: [{
|
|
112
|
+
type: HostListener,
|
|
113
|
+
args: ['blur', ['$event']]
|
|
114
|
+
}], compareWith: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}] } });
|
|
117
|
+
export class BsSelectOption {
|
|
118
|
+
constructor(element, renderer, select) {
|
|
119
|
+
this.element = element;
|
|
120
|
+
this.renderer = renderer;
|
|
121
|
+
this.select = select;
|
|
122
|
+
if (this.select) {
|
|
123
|
+
this.id = this.select.registerOption();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
set ngValue(value) {
|
|
127
|
+
if (this.select) {
|
|
128
|
+
this.select.optionMap.set(this.id, value);
|
|
129
|
+
this.setElementValue(this.select.buildValueString(this.id, value));
|
|
130
|
+
// console.log('ngValue', this.select.value);
|
|
131
|
+
this.select.writeValue(this.select.value);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
set value(value) {
|
|
135
|
+
this.setElementValue(value);
|
|
136
|
+
if (this.select) {
|
|
137
|
+
this.select.writeValue(this.select.value);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
setElementValue(value) {
|
|
141
|
+
// console.log('setElementValue', value);
|
|
142
|
+
// const nativeSelect = this.select['selectBox'].selectBox;
|
|
143
|
+
// if (nativeSelect) {
|
|
144
|
+
// this.renderer.setProperty(nativeSelect.nativeElement, 'value', value);
|
|
145
|
+
// }
|
|
146
|
+
this.renderer.setProperty(this.element.nativeElement, 'value', value);
|
|
147
|
+
}
|
|
148
|
+
ngOnDestroy() {
|
|
149
|
+
if (this.select) {
|
|
150
|
+
this.select.optionMap.delete(this.id);
|
|
151
|
+
this.select.writeValue(this.select.value);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
BsSelectOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: BsSelectOption, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: BsSelectValueAccessor, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
156
|
+
BsSelectOption.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.2", type: BsSelectOption, selector: "option", inputs: { ngValue: "ngValue", value: "value" }, ngImport: i0 });
|
|
157
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: BsSelectOption, decorators: [{
|
|
158
|
+
type: Directive,
|
|
159
|
+
args: [{ selector: 'option' }]
|
|
160
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: BsSelectValueAccessor, decorators: [{
|
|
161
|
+
type: Optional
|
|
162
|
+
}, {
|
|
163
|
+
type: Host
|
|
164
|
+
}] }]; }, propDecorators: { ngValue: [{
|
|
165
|
+
type: Input,
|
|
166
|
+
args: ['ngValue']
|
|
167
|
+
}], value: [{
|
|
168
|
+
type: Input,
|
|
169
|
+
args: ['value']
|
|
170
|
+
}] } });
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXZhbHVlLWFjY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9taW50cGxheWVyLW5nLWJvb3RzdHJhcC9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L3ZhbHVlLWFjY2Vzc29ycy9zZWxlY3QtdmFsdWUtYWNjZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0dBQXdHO0FBQ3hHLDRFQUE0RTtBQUM1RSx3REFBd0Q7QUFDeEQscUVBQXFFO0FBRXJFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdILE9BQU8sRUFBd0IsaUJBQWlCLEVBQThCLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7OztBQVVsRSxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLFlBQW9CLFNBQW9CLEVBQVUsV0FBdUIsRUFBVSxTQUE0QjtRQUEzRixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFtQjtRQUUvRyxhQUFRLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUMxQixjQUFTLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBa0NyQixjQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUNuQyxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRU4sd0JBQW1CLEdBQTBDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUF4Q21DLENBQUM7SUFLbkgsaUJBQWlCLENBQUMsRUFBYztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ0QsZ0JB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VSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0M7SUFDSCxDQUFDOzsyR0F2Q1UsY0FBYzsrRkFBZCxjQUFjOzJGQUFkLGNBQWM7a0JBRDFCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFOzswQkFFd0MsUUFBUTs7MEJBQUksSUFBSTs0Q0FRakUsT0FBTztzQkFBNUIsS0FBSzt1QkFBQyxTQUFTO2dCQVNJLEtBQUs7c0JBQXhCLEtBQUs7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4vLyBpbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG4vLyBpbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuLy8gaW1wb3J0IHsgQnNTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQvc2VsZWN0LmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgSG9zdCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCwgUmVuZGVyZXIyIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEJzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudC9zZWxlY3QuY29tcG9uZW50XCI7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2JzLXNlbGVjdCcsXG4gIHByb3ZpZGVyczogW3tcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBCc1NlbGVjdFZhbHVlQWNjZXNzb3IpLFxuICAgIG11bHRpOiB0cnVlLFxuICB9XSxcbn0pXG5leHBvcnQgY2xhc3MgQnNTZWxlY3RWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHNlbGVjdEJveDogQnNTZWxlY3RDb21wb25lbnQpIHt9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChwOiBhbnkpID0+IHt9KSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9ICh2YWx1ZVN0cmluZzogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBWaWV3IC0+IE1vZGVsXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXRPcHRpb25WYWx1ZSh2YWx1ZVN0cmluZyk7XG4gICAgICBmbih0aGlzLnZhbHVlKTtcbiAgICAgIC8vIGZuKHZhbHVlU3RyaW5nKTtcbiAgICB9O1xuICB9XG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0UHJvcGVydHkoJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gaWYgKHRoaXMuX2VsZW1lbnRSZWYpIHtcbiAgICAvLyAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwga2V5LCB2YWx1ZSk7XG4gICAgLy8gfVxuICAgIGlmICh0aGlzLnNlbGVjdEJveC5zZWxlY3RCb3gpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuc2VsZWN0Qm94LnNlbGVjdEJveC5uYXRpdmVFbGVtZW50LCBrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKSBob3N0T25DaGFuZ2UoZXY6IElucHV0RXZlbnQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlKCg8YW55PmV2LnRhcmdldCkudmFsdWUpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pIGhvc3RCbHVyKGV2OiBFdmVudCkge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICB2YWx1ZTogYW55O1xuICBvcHRpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBpZENvdW50ZXIgPSAwO1xuXG4gIHByaXZhdGUgY29tcGFyZVdpdGhGdW5jdGlvbjogKHZhbHVlMTogYW55LCB2YWx1ZTI6IGFueSkgPT4gYm9vbGVhbiA9IE9iamVjdC5pcztcbiAgQElucHV0KCkgc2V0IGNvbXBhcmVXaXRoKHZhbHVlOiAodmFsdWUxOiBhbnksIHZhbHVlMjogYW55KSA9PiBib29sZWFuKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wYXJlV2l0aCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdGhpcy5jb21wYXJlV2l0aEZ1bmN0aW9uID0gdmFsdWU7XG4gIH1cblxuICBidWlsZFZhbHVlU3RyaW5nKGlkOiBzdHJpbmcgfCBudWxsLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKGlkID09IG51bGwpIHtcbiAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykpIHtcbiAgICAgIHZhbHVlID0gJ09iamVjdCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2lkfTogJHt2YWx1ZX1gLnNsaWNlKDAsIDUwKTtcbiAgfVxuXG4gIGV4dHJhY3RJZCh2YWx1ZVN0cmluZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlU3RyaW5nLnNwbGl0KCc6JylbMF07XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgLy8gY29uc29sZS5sb2coYFdyaXRlVmFsdWUgJHt0aGlzLnNlbGVjdEJveC5pZGVudGlmaWVyfWAsIHZhbHVlKTtcblxuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRPcHRpb25JZCh2YWx1ZSk7XG4gICAgY29uc3QgdmFsdWVTdHJpbmcgPSB0aGlzLmJ1aWxkVmFsdWVTdHJpbmcoaWQsIHZhbHVlKTtcbiAgICB0aGlzLnNldFByb3BlcnR5KCd2YWx1ZScsIHZhbHVlU3RyaW5nKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5pZENvdW50ZXIrKykudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGdldE9wdGlvbklkKHZhbHVlOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy5vcHRpb25NYXAua2V5cygpKSkge1xuICAgICAgaWYgKHRoaXMuY29tcGFyZVdpdGhGdW5jdGlvbih0aGlzLm9wdGlvbk1hcC5nZXQoaWQpLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlblxuICAgIC8vIGRlYnVnZ2VyO1xuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0T3B0aW9uVmFsdWUodmFsdWVTdHJpbmc6IHN0cmluZykge1xuICAgIGNvbnN0IGlkID0gdGhpcy5leHRyYWN0SWQodmFsdWVTdHJpbmcpO1xuICAgIHJldHVybiB0aGlzLm9wdGlvbk1hcC5oYXMoaWQpID8gdGhpcy5vcHRpb25NYXAuZ2V0KGlkKSA6IHZhbHVlU3RyaW5nO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ29wdGlvbicgfSlcbmV4cG9ydCBjbGFzcyBCc1NlbGVjdE9wdGlvbiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBAT3B0aW9uYWwoKSBASG9zdCgpIHByaXZhdGUgc2VsZWN0OiBCc1NlbGVjdFZhbHVlQWNjZXNzb3IpIHtcbiAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgIHRoaXMuaWQgPSB0aGlzLnNlbGVjdC5yZWdpc3Rlck9wdGlvbigpO1xuICAgIH1cbiAgfVxuICBcbiAgaWQhOiBzdHJpbmc7XG5cbiAgQElucHV0KCduZ1ZhbHVlJykgc2V0IG5nVmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdCkge1xuICAgICAgdGhpcy5zZWxlY3Qub3B0aW9uTWFwLnNldCh0aGlzLmlkLCB2YWx1ZSk7XG4gICAgICB0aGlzLnNldEVsZW1lbnRWYWx1ZSh0aGlzLnNlbGVjdC5idWlsZFZhbHVlU3RyaW5nKHRoaXMuaWQsIHZhbHVlKSk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnbmdWYWx1ZScsIHRoaXMuc2VsZWN0LnZhbHVlKTtcbiAgICAgIHRoaXMuc2VsZWN0LndyaXRlVmFsdWUodGhpcy5zZWxlY3QudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgndmFsdWUnKSBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0RWxlbWVudFZhbHVlKHZhbHVlKTtcbiAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgIHRoaXMuc2VsZWN0LndyaXRlVmFsdWUodGhpcy5zZWxlY3QudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldEVsZW1lbnRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3NldEVsZW1lbnRWYWx1ZScsIHZhbHVlKTtcbiAgICAvLyBjb25zdCBuYXRpdmVTZWxlY3QgPSB0aGlzLnNlbGVjdFsnc2VsZWN0Qm94J10uc2VsZWN0Qm94O1xuICAgIC8vIGlmIChuYXRpdmVTZWxlY3QpIHtcbiAgICAvLyAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkobmF0aXZlU2VsZWN0Lm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgICAvLyB9XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0KSB7XG4gICAgICB0aGlzLnNlbGVjdC5vcHRpb25NYXAuZGVsZXRlKHRoaXMuaWQpO1xuICAgICAgdGhpcy5zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLnNlbGVjdC52YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEBEaXJlY3RpdmUoe1xuLy8gICBzZWxlY3RvcjogJ2JzLXNlbGVjdCcsXG4vLyAgIHByb3ZpZGVyczogW3tcbi8vICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbi8vICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBCc1NlbGVjdFZhbHVlQWNjZXNzb3IpLFxuLy8gICAgIG11bHRpOiB0cnVlLFxuLy8gICB9XSxcbi8vIH0pXG4vLyBleHBvcnQgY2xhc3MgQnNTZWxlY3RWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4vLyAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogQnNTZWxlY3RDb21wb25lbnQpIHt9XG5cbi8vICAgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0KCk7XG5cbi8vICAgb25WYWx1ZUNoYW5nZT86ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xuLy8gICBvblRvdWNoZWQ/OiAoKSA9PiB2b2lkO1xuXG4vLyAgIC8vI3JlZ2lvbiBMaWZlY3ljbGUgaG9va3Ncbi8vICAgbmdBZnRlclZpZXdJbml0KCkge1xuLy8gICAgIGZyb21FdmVudCh0aGlzLmhvc3Quc2VsZWN0Qm94Lm5hdGl2ZUVsZW1lbnQsICdjaGFuZ2UnKVxuLy8gICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4vLyAgICAgICAuc3Vic2NyaWJlKChldikgPT4ge1xuLy8gICAgICAgICBpZiAodGhpcy5vblZhbHVlQ2hhbmdlKSB7XG4vLyAgICAgICAgICAgY29uc3QgdmFsID0gKDxIVE1MU2VsZWN0RWxlbWVudD5ldi50YXJnZXQpLnZhbHVlO1xuLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZCcsIHZhbCk7XG4vLyAgICAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlKHZhbCk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgIH0pO1xuLy8gICB9XG5cbi8vICAgbmdPbkRlc3Ryb3koKSB7XG4vLyAgICAgdGhpcy5kZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4vLyAgIH1cbi8vICAgLy8jZW5kcmVnaW9uXG5cbi8vICAgQElucHV0KCduZ1ZhbHVlJykgc2V0IG5nVmFsdWUodmFsdWU6IGFueSkge1xuLy8gICAgIGlmICh0aGlzLmhvc3QpIHtcbi8vICAgICAgIHRoaXMuaG9zdC5vcHRcbi8vICAgICB9XG4vLyAgIH1cblxuLy8gICAvLyNyZWdpb24gT3B0aW9uSWQgbWFwcGluZ1xuLy8gICBwcml2YXRlIGNvbXBhcmVXaXRoRnVuY3Rpb246ICh2YWx1ZTE6IGFueSwgdmFsdWUyOiBhbnkpID0+IGJvb2xlYW4gPSBPYmplY3QuaXM7XG4vLyAgIHByaXZhdGUgb3B0aW9uTWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbi8vICAgQElucHV0KCkgcHVibGljIHNldCBjb21wYXJlV2l0aChmbjogKHZhbHVlMTogYW55LCB2YWx1ZTI6IGFueSkgPT4gYm9vbGVhbikge1xuLy8gICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbi8vICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcGFyZVdpdGggbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4vLyAgICAgfVxuLy8gICAgIHRoaXMuY29tcGFyZVdpdGhGdW5jdGlvbiA9IGZuO1xuLy8gICB9XG5cbi8vICAgcHJpdmF0ZSBnZXRPcHRpb25JZCh2YWx1ZTogYW55KSB7XG4vLyAgICAgZm9yIChjb25zdCBpZCBvZiBBcnJheS5mcm9tKHRoaXMub3B0aW9uTWFwLmtleXMoKSkpIHtcbi8vICAgICAgIGlmICh0aGlzLmNvbXBhcmVXaXRoKHRoaXMub3B0aW9uTWFwLmdldChpZCksIHZhbHVlKSkge1xuLy8gICAgICAgICByZXR1cm4gaWQ7XG4vLyAgICAgICB9XG4vLyAgICAgfVxuLy8gICAgIHJldHVybiBudWxsO1xuLy8gICB9XG5cbi8vICAgcHJpdmF0ZSBnZXRPcHRpb25WYWx1ZSh2YWx1ZVN0cmluZzogc3RyaW5nKSB7XG4vLyAgICAgY29uc3QgaWQgPSB0aGlzLmV4dHJhY3RJZCh2YWx1ZVN0cmluZyk7XG4vLyAgICAgcmV0dXJuIHRoaXMub3B0aW9uTWFwLmhhcyhpZCkgPyB0aGlzLm9wdGlvbk1hcC5nZXQoaWQpIDogdmFsdWVTdHJpbmc7XG4vLyAgIH1cblxuLy8gICBwcml2YXRlIGV4dHJhY3RJZCh2YWx1ZVN0cmluZzogc3RyaW5nKSB7XG4vLyAgICAgcmV0dXJuIHZhbHVlU3RyaW5nLnNwbGl0KCc6JylbMF07XG4vLyAgIH1cbi8vICAgLy8jZW5kcmVnaW9uXG5cbi8vICAgLy8jcmVnaW9uIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4vLyAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHZvaWQpIHtcbi8vICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UgPSAodmFsdWVTdHJpbmc6IHN0cmluZykgPT4ge1xuLy8gICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUodmFsdWVTdHJpbmcpO1xuLy8gICAgICAgZm4odGhpcy52YWx1ZSk7XG4vLyAgICAgfTtcbi8vICAgfVxuICBcbi8vICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpIHtcbi8vICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuLy8gICB9XG5cbi8vICAgdmFsdWU6IGFueTtcbi8vICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4vLyAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuLy8gICAgIGlmICh0aGlzLmhvc3Quc2VsZWN0Qm94KSB7XG4vLyAgICAgICAvLyB0aGlzLmhvc3Quc2VsZWN0Qm94Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRJbmRleCA9IHRoaXMuaG9zdC5zZWxlY3RCb3gubmF0aXZlRWxlbWVudC5vcHRpb25zLml0ZW0oKTtcbi8vICAgICB9XG4vLyAgIH1cblxuLy8gICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbi8vICAgICBpZiAodGhpcy5ob3N0LnNlbGVjdEJveCkge1xuLy8gICAgICAgdGhpcy5ob3N0LnNlbGVjdEJveC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbi8vICAgICB9XG4vLyAgIH1cbi8vICAgLy8jZW5kcmVnaW9uXG5cbi8vIH1cbiJdfQ==
|