@yuuvis/app-drive 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/esm2022/extensions/index.mjs +2 -0
- package/esm2022/extensions/lib/extensions.module.mjs +35 -0
- package/esm2022/extensions/lib/extensions.service.mjs +44 -0
- package/esm2022/extensions/lib/object-config.defaults.mjs +19 -0
- package/esm2022/extensions/yuuvis-app-drive-extensions.mjs +5 -0
- package/esm2022/index.mjs +5 -0
- package/esm2022/lib/actions/copy-link/copy-link.action.mjs +40 -0
- package/esm2022/lib/actions/index.mjs +7 -0
- package/esm2022/lib/actions/manage-versions/manage-versions.action.mjs +33 -0
- package/esm2022/lib/actions/manage-versions/manage-versions.component.mjs +105 -0
- package/esm2022/lib/actions/paste/paste.action.mjs +41 -0
- package/esm2022/lib/actions/rename/rename.action.mjs +31 -0
- package/esm2022/lib/actions/rename/rename.component.mjs +42 -0
- package/esm2022/lib/actions/rename/rename.validator.mjs +23 -0
- package/esm2022/lib/actions/updateContent/update.content.action.mjs +52 -0
- package/esm2022/lib/components/add-button/add-button-overlay/add-button-overlay.component.mjs +109 -0
- package/esm2022/lib/components/add-button/add-button.component.mjs +39 -0
- package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +74 -0
- package/esm2022/lib/components/folder-tree/folder-tree.component.mjs +89 -0
- package/esm2022/lib/components/index.mjs +10 -0
- package/esm2022/lib/components/object-name/object-name.component.mjs +60 -0
- package/esm2022/lib/components/overlay/create-folder/create-folder.component.mjs +48 -0
- package/esm2022/lib/components/paste-from-clipboard/paste-from-clipboard.component.mjs +28 -0
- package/esm2022/lib/components/ribbon/ribbon.component.mjs +102 -0
- package/esm2022/lib/components/search-filter/date-range-picker/date-range-picker.component.mjs +38 -0
- package/esm2022/lib/components/search-filter/search-filter.component.mjs +429 -0
- package/esm2022/lib/components/sort/sort.component.mjs +156 -0
- package/esm2022/lib/components/versions-list/tile/tile.component.mjs +60 -0
- package/esm2022/lib/components/versions-list/versions-list.component.mjs +94 -0
- package/esm2022/lib/container/drive/drive.component.mjs +116 -0
- package/esm2022/lib/drive.icons.mjs +16 -0
- package/esm2022/lib/drive.schema.mjs +49 -0
- package/esm2022/lib/lib.routes.mjs +17 -0
- package/esm2022/lib/pages/files/files.component.mjs +377 -0
- package/esm2022/lib/pages/object/object.component.mjs +200 -0
- package/esm2022/lib/services/drive/drive.interface.mjs +14 -0
- package/esm2022/lib/services/drive/drive.service.mjs +437 -0
- package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.mjs +158 -0
- package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.mjs +2 -0
- package/esm2022/lib/services/drive/versions/versions.mapping.mjs +42 -0
- package/esm2022/lib/services/index.mjs +5 -0
- package/esm2022/lib/services/providers/drive.providers.mjs +10 -0
- package/esm2022/lib/services/resolver/files.resolver.mjs +12 -0
- package/esm2022/lib/services/resolver/index.mjs +3 -0
- package/esm2022/lib/services/resolver/versions.route.resolver.mjs +10 -0
- package/esm2022/lib/services/stored-query/stored-query.data.mjs +25 -0
- package/esm2022/lib/services/stored-query/stored-query.interface.mjs +2 -0
- package/esm2022/lib/services/stored-query/stored-query.service.mjs +41 -0
- package/esm2022/lib/services/tokens/breadcrumb-max-depth.token.mjs +3 -0
- package/esm2022/lib/services/tokens/index.mjs +2 -0
- package/esm2022/yuuvis-app-drive.mjs +5 -0
- package/extensions/README.md +3 -0
- package/extensions/index.d.ts +1 -0
- package/extensions/lib/extensions.module.d.ts +6 -0
- package/extensions/lib/extensions.service.d.ts +7 -0
- package/extensions/lib/object-config.defaults.d.ts +2 -0
- package/fesm2022/yuuvis-app-drive-extensions.mjs +99 -0
- package/fesm2022/yuuvis-app-drive-extensions.mjs.map +1 -0
- package/fesm2022/yuuvis-app-drive.mjs +2945 -0
- package/fesm2022/yuuvis-app-drive.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/lib/actions/copy-link/copy-link.action.d.ts +18 -0
- package/lib/actions/index.d.ts +6 -0
- package/lib/actions/manage-versions/manage-versions.action.d.ts +17 -0
- package/lib/actions/manage-versions/manage-versions.component.d.ts +32 -0
- package/lib/actions/paste/paste.action.d.ts +17 -0
- package/lib/actions/rename/rename.action.d.ts +17 -0
- package/lib/actions/rename/rename.component.d.ts +12 -0
- package/lib/actions/rename/rename.validator.d.ts +5 -0
- package/lib/actions/updateContent/update.content.action.d.ts +18 -0
- package/lib/components/add-button/add-button-overlay/add-button-overlay.component.d.ts +26 -0
- package/lib/components/add-button/add-button.component.d.ts +12 -0
- package/lib/components/breadcrumb/breadcrumb.component.d.ts +25 -0
- package/lib/components/folder-tree/folder-tree.component.d.ts +13 -0
- package/lib/components/index.d.ts +8 -0
- package/lib/components/object-name/object-name.component.d.ts +21 -0
- package/lib/components/overlay/create-folder/create-folder.component.d.ts +12 -0
- package/lib/components/paste-from-clipboard/paste-from-clipboard.component.d.ts +13 -0
- package/lib/components/ribbon/ribbon.component.d.ts +24 -0
- package/lib/components/search-filter/date-range-picker/date-range-picker.component.d.ts +13 -0
- package/lib/components/search-filter/search-filter.component.d.ts +23 -0
- package/lib/components/sort/sort.component.d.ts +31 -0
- package/lib/components/versions-list/tile/tile.component.d.ts +14 -0
- package/lib/components/versions-list/versions-list.component.d.ts +17 -0
- package/lib/container/drive/drive.component.d.ts +36 -0
- package/lib/drive.icons.d.ts +15 -0
- package/lib/drive.schema.d.ts +23 -0
- package/lib/lib.routes.d.ts +2 -0
- package/lib/pages/files/files.component.d.ts +101 -0
- package/lib/pages/object/object.component.d.ts +35 -0
- package/lib/services/drive/drive.interface.d.ts +62 -0
- package/lib/services/drive/drive.service.d.ts +64 -0
- package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.d.ts +31 -0
- package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.d.ts +8 -0
- package/lib/services/drive/versions/versions.mapping.d.ts +2 -0
- package/lib/services/index.d.ts +4 -0
- package/lib/services/providers/drive.providers.d.ts +7 -0
- package/lib/services/resolver/files.resolver.d.ts +2 -0
- package/lib/services/resolver/index.d.ts +2 -0
- package/lib/services/resolver/versions.route.resolver.d.ts +2 -0
- package/lib/services/stored-query/stored-query.data.d.ts +5 -0
- package/lib/services/stored-query/stored-query.interface.d.ts +5 -0
- package/lib/services/stored-query/stored-query.service.d.ts +10 -0
- package/lib/services/tokens/breadcrumb-max-depth.token.d.ts +2 -0
- package/lib/services/tokens/index.d.ts +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, inject, input, output, signal } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
6
|
+
import { BaseObjectTypeField, ContentStreamField, LocaleDatePipe, Operator, OperatorLabel } from '@yuuvis/client-core';
|
|
7
|
+
import { ShellService } from '@yuuvis/client-shell-core';
|
|
8
|
+
import { YvcDragScrollModule } from '@yuuvis/components/drag-scroll';
|
|
9
|
+
import { YvcDropdownModule } from '@yuuvis/components/dropdown';
|
|
10
|
+
import { YvcOverlayService } from '@yuuvis/components/overlay';
|
|
11
|
+
import { DateRangePickerComponent } from './date-range-picker/date-range-picker.component';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@yuuvis/components/dropdown";
|
|
14
|
+
import * as i2 from "@yuuvis/client-core";
|
|
15
|
+
import * as i3 from "@angular/forms";
|
|
16
|
+
import * as i4 from "@yuuvis/components/drag-scroll";
|
|
17
|
+
export class SearchFilterComponent {
|
|
18
|
+
#shell;
|
|
19
|
+
#fb;
|
|
20
|
+
#overlay;
|
|
21
|
+
#CREATED_CUSTOM;
|
|
22
|
+
#flavors;
|
|
23
|
+
#customDateRange;
|
|
24
|
+
constructor() {
|
|
25
|
+
this.#shell = inject(ShellService);
|
|
26
|
+
this.#fb = inject(FormBuilder);
|
|
27
|
+
this.#overlay = inject(YvcOverlayService);
|
|
28
|
+
this.#CREATED_CUSTOM = 'custom';
|
|
29
|
+
this.translate = inject(TranslateService);
|
|
30
|
+
this.ANY_OPTION = 'any';
|
|
31
|
+
this.#flavors = this.#shell.getObjectFlavors();
|
|
32
|
+
this.typeOptions = signal([]);
|
|
33
|
+
this.dateOptions = signal([]);
|
|
34
|
+
this.sizeOptions = signal([]);
|
|
35
|
+
this.query = input(null);
|
|
36
|
+
this.queryChange = output();
|
|
37
|
+
this.filtersActive = signal(false);
|
|
38
|
+
this.filterForm = this.#fb.nonNullable.group({
|
|
39
|
+
type: [this.ANY_OPTION],
|
|
40
|
+
size: [this.ANY_OPTION],
|
|
41
|
+
created: [this.ANY_OPTION]
|
|
42
|
+
});
|
|
43
|
+
this.translate.onLangChange.pipe(takeUntilDestroyed()).subscribe((_) => this.#setupOptions());
|
|
44
|
+
this.#setupOptions();
|
|
45
|
+
this.filterForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((v) => this.#onFormValueChange(v));
|
|
46
|
+
// listen to created filter changes to catch custom date range
|
|
47
|
+
this.filterForm
|
|
48
|
+
.get('created')
|
|
49
|
+
?.valueChanges.pipe(takeUntilDestroyed())
|
|
50
|
+
.subscribe((v) => {
|
|
51
|
+
if (v === this.#CREATED_CUSTOM) {
|
|
52
|
+
// open date range picker
|
|
53
|
+
console.log(this.#customDateRange);
|
|
54
|
+
const o = this.#overlay.open(DateRangePickerComponent, {
|
|
55
|
+
range: this.#customDateRange
|
|
56
|
+
});
|
|
57
|
+
o.afterClosed$.subscribe((res) => {
|
|
58
|
+
this.#customDateRange = res.data;
|
|
59
|
+
if (!res.data) {
|
|
60
|
+
this.filterForm.get('created')?.patchValue(this.ANY_OPTION);
|
|
61
|
+
this.#setupDateOptions();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.#onFormValueChange(this.filterForm.value);
|
|
65
|
+
this.#setupDateOptions(this.#customDateRangeToString());
|
|
66
|
+
setTimeout(() => {
|
|
67
|
+
this.filterForm.patchValue({
|
|
68
|
+
created: this.#CREATED_CUSTOM
|
|
69
|
+
}, {
|
|
70
|
+
emitEvent: false
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
#customDateRangeToString() {
|
|
79
|
+
if (!this.#customDateRange)
|
|
80
|
+
return undefined;
|
|
81
|
+
const dp = new LocaleDatePipe(this.translate);
|
|
82
|
+
switch (this.#customDateRange.operator) {
|
|
83
|
+
case Operator.EQUAL: {
|
|
84
|
+
return dp.transform(this.#customDateRange.firstValue, 'shortDate');
|
|
85
|
+
}
|
|
86
|
+
case Operator.GREATER_OR_EQUAL: {
|
|
87
|
+
return `${OperatorLabel.GREATER_OR_EQUAL} ${dp.transform(this.#customDateRange.firstValue, 'shortDate')}`;
|
|
88
|
+
}
|
|
89
|
+
case Operator.LESS_OR_EQUAL: {
|
|
90
|
+
return `${OperatorLabel.LESS_OR_EQUAL} ${dp.transform(this.#customDateRange.firstValue, 'shortDate')}`;
|
|
91
|
+
}
|
|
92
|
+
case Operator.INTERVAL_INCLUDE_BOTH: {
|
|
93
|
+
return `${dp.transform(this.#customDateRange.firstValue, 'shortDate')} ${OperatorLabel.INTERVAL_INCLUDE_BOTH} ${dp.transform(this.#customDateRange.secondValue, 'shortDate')}`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
reset() {
|
|
99
|
+
const q = this.query();
|
|
100
|
+
if (q) {
|
|
101
|
+
this.queryChange.emit(q);
|
|
102
|
+
this.filterForm.reset();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
#onFormValueChange(v) {
|
|
106
|
+
// do not create a new query if custom date range is selected but not set
|
|
107
|
+
if (v.created === this.#CREATED_CUSTOM && !this.#customDateRange)
|
|
108
|
+
return;
|
|
109
|
+
if (v.created !== this.#CREATED_CUSTOM) {
|
|
110
|
+
this.#customDateRange = undefined;
|
|
111
|
+
this.#setupDateOptions();
|
|
112
|
+
}
|
|
113
|
+
const updatedQuery = this.#applyFilters(v);
|
|
114
|
+
this.queryChange.emit(updatedQuery);
|
|
115
|
+
this.filtersActive.set(!!updatedQuery.filters && updatedQuery.filters.length > 0);
|
|
116
|
+
}
|
|
117
|
+
#applyFilters(v) {
|
|
118
|
+
const updatedQuery = {
|
|
119
|
+
...(this.query() || {}),
|
|
120
|
+
filters: []
|
|
121
|
+
};
|
|
122
|
+
updatedQuery.filters = [];
|
|
123
|
+
// file size filter
|
|
124
|
+
const typeFilter = this.#toTypeFilter(v.type);
|
|
125
|
+
if (typeFilter)
|
|
126
|
+
updatedQuery.filters.push(typeFilter);
|
|
127
|
+
// file size filter
|
|
128
|
+
const sizeFilter = this.#toSizeFilter(v.size);
|
|
129
|
+
if (sizeFilter)
|
|
130
|
+
updatedQuery.filters.push(sizeFilter);
|
|
131
|
+
// creation date filter
|
|
132
|
+
const dateFilter = this.#toDateFilter(v.created);
|
|
133
|
+
if (dateFilter)
|
|
134
|
+
updatedQuery.filters.push(dateFilter);
|
|
135
|
+
return updatedQuery;
|
|
136
|
+
}
|
|
137
|
+
#setupOptions() {
|
|
138
|
+
this.#setupTypeOptions();
|
|
139
|
+
this.#setupDateOptions();
|
|
140
|
+
this.#setupSizeOptions();
|
|
141
|
+
}
|
|
142
|
+
#setupTypeOptions() {
|
|
143
|
+
this.typeOptions.set([
|
|
144
|
+
{
|
|
145
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.any'),
|
|
146
|
+
value: this.ANY_OPTION
|
|
147
|
+
},
|
|
148
|
+
...this.#flavors.map((f) => ({
|
|
149
|
+
label: this.translate.instant(f.id),
|
|
150
|
+
value: f.sot
|
|
151
|
+
}))
|
|
152
|
+
]);
|
|
153
|
+
}
|
|
154
|
+
#setupDateOptions(custom) {
|
|
155
|
+
this.dateOptions.set([
|
|
156
|
+
...[
|
|
157
|
+
{
|
|
158
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.date.any'),
|
|
159
|
+
value: this.ANY_OPTION
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.date.today'),
|
|
163
|
+
value: 'today'
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.date.yesterday'),
|
|
167
|
+
value: 'yesterday'
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.date.thisweek'),
|
|
171
|
+
value: 'thisweek'
|
|
172
|
+
},
|
|
173
|
+
// {
|
|
174
|
+
// label: this.translate.instant('yuv.app.drive.search.filter.option.date.lastweek'),
|
|
175
|
+
// value: 'lastweek'
|
|
176
|
+
// },
|
|
177
|
+
{
|
|
178
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.date.thismonth'),
|
|
179
|
+
value: 'thismonth'
|
|
180
|
+
},
|
|
181
|
+
// {
|
|
182
|
+
// label: this.translate.instant('yuv.app.drive.search.filter.option.date.lastmonth'),
|
|
183
|
+
// value: 'lastmonth'
|
|
184
|
+
// },
|
|
185
|
+
{
|
|
186
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.date.thisyear'),
|
|
187
|
+
value: 'thisyear'
|
|
188
|
+
},
|
|
189
|
+
// {
|
|
190
|
+
// label: this.translate.instant('yuv.app.drive.search.filter.option.date.lastyear'),
|
|
191
|
+
// value: 'lastyear'
|
|
192
|
+
// },
|
|
193
|
+
{
|
|
194
|
+
label: custom || this.translate.instant('yuv.app.drive.search.filter.option.date.custom'),
|
|
195
|
+
value: this.#CREATED_CUSTOM
|
|
196
|
+
}
|
|
197
|
+
]
|
|
198
|
+
]);
|
|
199
|
+
}
|
|
200
|
+
#setupSizeOptions() {
|
|
201
|
+
this.sizeOptions.set([
|
|
202
|
+
{
|
|
203
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.size.any'),
|
|
204
|
+
value: this.ANY_OPTION
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.size.small'),
|
|
208
|
+
value: 's'
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.size.medium'),
|
|
212
|
+
value: 'm'
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.size.large'),
|
|
216
|
+
value: 'l'
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
label: this.translate.instant('yuv.app.drive.search.filter.option.size.verylarge'),
|
|
220
|
+
value: 'xl'
|
|
221
|
+
}
|
|
222
|
+
]);
|
|
223
|
+
}
|
|
224
|
+
#toDateFilter(value) {
|
|
225
|
+
let dateFilter = undefined;
|
|
226
|
+
switch (value) {
|
|
227
|
+
case 'today': {
|
|
228
|
+
dateFilter = {
|
|
229
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
230
|
+
o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
231
|
+
v1: new Date().toISOString().split('T')[0] + 'T00:00:00.000',
|
|
232
|
+
v2: new Date().toISOString().split('T')[0] + 'T23:59:59.000'
|
|
233
|
+
};
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
case 'yesterday': {
|
|
237
|
+
const yesterday = new Date();
|
|
238
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
239
|
+
dateFilter = {
|
|
240
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
241
|
+
o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
242
|
+
v1: yesterday.toISOString().split('T')[0] + 'T00:00:00.000',
|
|
243
|
+
v2: yesterday.toISOString().split('T')[0] + 'T23:59:59.000'
|
|
244
|
+
};
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
case 'thisweek': {
|
|
248
|
+
const firstDay = new Date();
|
|
249
|
+
firstDay.setDate(firstDay.getDate() - firstDay.getDay());
|
|
250
|
+
dateFilter = {
|
|
251
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
252
|
+
o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
253
|
+
v1: firstDay.toISOString().split('T')[0] + 'T00:00:00.000',
|
|
254
|
+
v2: new Date().toISOString().split('T')[0] + 'T23:59:59.000'
|
|
255
|
+
};
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
// case 'lastweek': {
|
|
259
|
+
// const firstDay = new Date();
|
|
260
|
+
// firstDay.setDate(firstDay.getDate() - firstDay.getDay() - 7);
|
|
261
|
+
// const lastDay = new Date();
|
|
262
|
+
// lastDay.setDate(lastDay.getDate() - lastDay.getDay() - 1);
|
|
263
|
+
// dateFilter = {
|
|
264
|
+
// f: BaseObjectTypeField.CREATION_DATE,
|
|
265
|
+
// o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
266
|
+
// v1: firstDay.toISOString().split('T')[0] + 'T00:00:00.000',
|
|
267
|
+
// v2: lastDay.toISOString().split('T')[0] + 'T23:59:59.000'
|
|
268
|
+
// };
|
|
269
|
+
// break;
|
|
270
|
+
// }
|
|
271
|
+
case 'thismonth': {
|
|
272
|
+
const firstDay = new Date();
|
|
273
|
+
firstDay.setDate(1);
|
|
274
|
+
dateFilter = {
|
|
275
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
276
|
+
o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
277
|
+
v1: firstDay.toISOString().split('T')[0] + 'T00:00:00.000',
|
|
278
|
+
v2: new Date().toISOString().split('T')[0] + 'T23:59:59.000'
|
|
279
|
+
};
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
// case 'lastmonth': {
|
|
283
|
+
// const firstDay = new Date();
|
|
284
|
+
// firstDay.setDate(1);
|
|
285
|
+
// firstDay.setMonth(firstDay.getMonth() - 1);
|
|
286
|
+
// const lastDay = new Date();
|
|
287
|
+
// lastDay.setDate(0);
|
|
288
|
+
// dateFilter = {
|
|
289
|
+
// f: BaseObjectTypeField.CREATION_DATE,
|
|
290
|
+
// o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
291
|
+
// v1: firstDay.toISOString().split('T')[0] + 'T00:00:00.000',
|
|
292
|
+
// v2: lastDay.toISOString().split('T')[0] + 'T23:59:59.000'
|
|
293
|
+
// };
|
|
294
|
+
// break;
|
|
295
|
+
// }
|
|
296
|
+
case 'thisyear': {
|
|
297
|
+
const firstDay = new Date();
|
|
298
|
+
firstDay.setMonth(0);
|
|
299
|
+
firstDay.setDate(1);
|
|
300
|
+
dateFilter = {
|
|
301
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
302
|
+
o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
303
|
+
v1: firstDay.toISOString().split('T')[0] + 'T00:00:00.000',
|
|
304
|
+
v2: new Date().toISOString().split('T')[0] + 'T23:59:59.000'
|
|
305
|
+
};
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
// case 'lastyear': {
|
|
309
|
+
// const firstDay = new Date();
|
|
310
|
+
// firstDay.setFullYear(firstDay.getFullYear() - 1);
|
|
311
|
+
// firstDay.setMonth(0);
|
|
312
|
+
// firstDay.setDate(1);
|
|
313
|
+
// const lastDay = new Date();
|
|
314
|
+
// lastDay.setFullYear(lastDay.getFullYear() - 1);
|
|
315
|
+
// lastDay.setMonth(11);
|
|
316
|
+
// lastDay.setDate(31);
|
|
317
|
+
// dateFilter = {
|
|
318
|
+
// f: BaseObjectTypeField.CREATION_DATE,
|
|
319
|
+
// o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
320
|
+
// v1: firstDay.toISOString().split('T')[0] + 'T00:00:00.000',
|
|
321
|
+
// v2: lastDay.toISOString().split('T')[0] + 'T23:59:59.000'
|
|
322
|
+
// };
|
|
323
|
+
// break;
|
|
324
|
+
// }
|
|
325
|
+
case this.#CREATED_CUSTOM: {
|
|
326
|
+
if (this.#customDateRange)
|
|
327
|
+
dateFilter = this.#customRangeToFilter(this.#customDateRange);
|
|
328
|
+
else
|
|
329
|
+
this.filterForm.get('created')?.patchValue(this.ANY_OPTION);
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return dateFilter;
|
|
334
|
+
}
|
|
335
|
+
#customRangeToFilter(rv) {
|
|
336
|
+
const v1 = rv.firstValue.toISOString();
|
|
337
|
+
const v2 = rv.secondValue ? rv.secondValue.toISOString() : undefined;
|
|
338
|
+
let filter;
|
|
339
|
+
switch (rv.operator) {
|
|
340
|
+
case Operator.EQUAL: {
|
|
341
|
+
filter = {
|
|
342
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
343
|
+
o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
344
|
+
v1: v1.split('T')[0] + 'T00:00:00.000',
|
|
345
|
+
v2: v1.split('T')[0] + 'T23:59:59.000'
|
|
346
|
+
};
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
case Operator.GREATER_OR_EQUAL: {
|
|
350
|
+
filter = {
|
|
351
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
352
|
+
o: rv.operator,
|
|
353
|
+
v1: v1.split('T')[0] + 'T00:00:00.000'
|
|
354
|
+
};
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
case Operator.LESS_OR_EQUAL: {
|
|
358
|
+
filter = {
|
|
359
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
360
|
+
o: rv.operator,
|
|
361
|
+
v1: v1.split('T')[0] + 'T23:59:59.000'
|
|
362
|
+
};
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
case Operator.INTERVAL_INCLUDE_BOTH: {
|
|
366
|
+
filter = {
|
|
367
|
+
f: BaseObjectTypeField.CREATION_DATE,
|
|
368
|
+
o: rv.operator,
|
|
369
|
+
v1: v1.split('T')[0] + 'T00:00:00.000',
|
|
370
|
+
v2: v2.split('T')[0] + 'T23:59:59.000'
|
|
371
|
+
};
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return filter;
|
|
376
|
+
}
|
|
377
|
+
#toSizeFilter(value) {
|
|
378
|
+
let sizeFilter = undefined;
|
|
379
|
+
switch (value) {
|
|
380
|
+
case 's':
|
|
381
|
+
sizeFilter = {
|
|
382
|
+
f: ContentStreamField.LENGTH,
|
|
383
|
+
o: Operator.LESS_THAN,
|
|
384
|
+
v1: 1024 * 1024
|
|
385
|
+
};
|
|
386
|
+
break;
|
|
387
|
+
case 'm':
|
|
388
|
+
sizeFilter = {
|
|
389
|
+
f: ContentStreamField.LENGTH,
|
|
390
|
+
o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
391
|
+
v1: 1024 * 1024,
|
|
392
|
+
v2: 1024 * 1024 * 10
|
|
393
|
+
};
|
|
394
|
+
break;
|
|
395
|
+
case 'l':
|
|
396
|
+
sizeFilter = {
|
|
397
|
+
f: ContentStreamField.LENGTH,
|
|
398
|
+
o: Operator.INTERVAL_INCLUDE_BOTH,
|
|
399
|
+
v1: 1024 * 1024 * 10,
|
|
400
|
+
v2: 1024 * 1024 * 100
|
|
401
|
+
};
|
|
402
|
+
break;
|
|
403
|
+
case 'xl':
|
|
404
|
+
sizeFilter = {
|
|
405
|
+
f: ContentStreamField.LENGTH,
|
|
406
|
+
o: Operator.GREATER_THAN,
|
|
407
|
+
v1: 1024 * 1024 * 100
|
|
408
|
+
};
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
return sizeFilter;
|
|
412
|
+
}
|
|
413
|
+
#toTypeFilter(value) {
|
|
414
|
+
return value === this.ANY_OPTION
|
|
415
|
+
? undefined
|
|
416
|
+
: {
|
|
417
|
+
f: BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS,
|
|
418
|
+
o: Operator.IN,
|
|
419
|
+
v1: [value]
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
423
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SearchFilterComponent, isStandalone: true, selector: "ymd-search-filter", inputs: { query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { queryChange: "queryChange" }, ngImport: i0, template: "<form [formGroup]=\"filterForm\" yvcDragScroll>\n <yvc-dropdown formControlName=\"type\" [options]=\"typeOptions()\" [disableClearButton]=\"true\"></yvc-dropdown>\n <yvc-dropdown formControlName=\"size\" [options]=\"sizeOptions()\" [disableClearButton]=\"true\"></yvc-dropdown>\n <yvc-dropdown formControlName=\"created\" [options]=\"dateOptions()\" [disableClearButton]=\"true\"></yvc-dropdown>\n\n @if (filtersActive()) {\n <button class=\"secondary\" (click)=\"reset()\">{{ 'yuv.app.drive.search.filter.button.reset' | translate }}</button>\n }\n</form>\n", styles: [":host form{display:flex;gap:2px;overflow-x:auto;--scrollbar-outer-size: 0;margin-block:calc(var(--app-pane-padding) / 2)}:host form yvc-dropdown{--icon-size: 18px;font-size:var(--font-caption);color:var(--text-color-caption);border:0;outline-offset:-2px;cursor:pointer;flex:0 0 auto;padding:0}:host form button{padding:.15em .5em;line-height:1em;margin-inline-start:1em;border-radius:.25em;font-size:var(--font-caption)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: YvcDropdownModule }, { kind: "component", type: i1.Dropdown, selector: "yvc-dropdown", inputs: ["options", "filter", "disabled", "multiple", "disableClearButton"], outputs: ["onDropdownOptionsClose"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: YvcDragScrollModule }, { kind: "directive", type: i4.DragScrollDirective, selector: "[yvcDragScroll]" }] }); }
|
|
424
|
+
}
|
|
425
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchFilterComponent, decorators: [{
|
|
426
|
+
type: Component,
|
|
427
|
+
args: [{ selector: 'ymd-search-filter', standalone: true, imports: [CommonModule, YvcDropdownModule, TranslateModule, ReactiveFormsModule, YvcDragScrollModule], template: "<form [formGroup]=\"filterForm\" yvcDragScroll>\n <yvc-dropdown formControlName=\"type\" [options]=\"typeOptions()\" [disableClearButton]=\"true\"></yvc-dropdown>\n <yvc-dropdown formControlName=\"size\" [options]=\"sizeOptions()\" [disableClearButton]=\"true\"></yvc-dropdown>\n <yvc-dropdown formControlName=\"created\" [options]=\"dateOptions()\" [disableClearButton]=\"true\"></yvc-dropdown>\n\n @if (filtersActive()) {\n <button class=\"secondary\" (click)=\"reset()\">{{ 'yuv.app.drive.search.filter.button.reset' | translate }}</button>\n }\n</form>\n", styles: [":host form{display:flex;gap:2px;overflow-x:auto;--scrollbar-outer-size: 0;margin-block:calc(var(--app-pane-padding) / 2)}:host form yvc-dropdown{--icon-size: 18px;font-size:var(--font-caption);color:var(--text-color-caption);border:0;outline-offset:-2px;cursor:pointer;flex:0 0 auto;padding:0}:host form button{padding:.15em .5em;line-height:1em;margin-inline-start:1em;border-radius:.25em;font-size:var(--font-caption)}\n"] }]
|
|
428
|
+
}], ctorParameters: () => [] });
|
|
429
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwcHMvZHJpdmUvc3JjL2xpYi9jb21wb25lbnRzL3NlYXJjaC1maWx0ZXIvc2VhcmNoLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwcHMvZHJpdmUvc3JjL2xpYi9jb21wb25lbnRzL3NlYXJjaC1maWx0ZXIvc2VhcmNoLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQXlDLE1BQU0scUJBQXFCLENBQUM7QUFDOUosT0FBTyxFQUFnQixZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQWtCLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEYsT0FBTyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDOzs7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QUFDO0lBQ1IsQ0FBQzsrR0F2YVUscUJBQXFCO21HQUFyQixxQkFBcUIsMFBDbkJsQyx3akJBU0EsK2RETVksWUFBWSw4QkFBRSxpQkFBaUIsb05BQUUsZUFBZSwyRkFBRSxtQkFBbUIsNHJCQUFFLG1CQUFtQjs7NEZBSXpGLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQmFzZU9iamVjdFR5cGVGaWVsZCwgQ29udGVudFN0cmVhbUZpZWxkLCBMb2NhbGVEYXRlUGlwZSwgT3BlcmF0b3IsIE9wZXJhdG9yTGFiZWwsIFJhbmdlVmFsdWUsIFNlYXJjaEZpbHRlciwgU2VhcmNoUXVlcnkgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IE9iamVjdEZsYXZvciwgU2hlbGxTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtc2hlbGwtY29yZSc7XG5pbXBvcnQgeyBZdmNEcmFnU2Nyb2xsTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL2RyYWctc2Nyb2xsJztcbmltcG9ydCB7IERyb3Bkb3duT3B0aW9uLCBZdmNEcm9wZG93bk1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9kcm9wZG93bic7XG5pbXBvcnQgeyBPdmVybGF5Q2xvc2VFdmVudCwgWXZjT3ZlcmxheVNlcnZpY2UgfSBmcm9tICdAeXV1dmlzL2NvbXBvbmVudHMvb3ZlcmxheSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ltZC1zZWFyY2gtZmlsdGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgWXZjRHJvcGRvd25Nb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgWXZjRHJhZ1Njcm9sbE1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3NlYXJjaC1maWx0ZXIuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIFNlYXJjaEZpbHRlckNvbXBvbmVudCB7XG4gICNzaGVsbCA9IGluamVjdChTaGVsbFNlcnZpY2UpO1xuICAjZmIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpO1xuICAjb3ZlcmxheSA9IGluamVjdChZdmNPdmVybGF5U2VydmljZSk7XG5cbiAgI0NSRUFURURfQ1VTVE9NID0gJ2N1c3RvbSc7XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgQU5ZX09QVElPTiA9ICdhbnknO1xuICAjZmxhdm9ycyA9IHRoaXMuI3NoZWxsLmdldE9iamVjdEZsYXZvcnMoKTtcblxuICB0eXBlT3B0aW9ucyA9IHNpZ25hbDxEcm9wZG93bk9wdGlvbltdPihbXSk7XG4gIGRhdGVPcHRpb25zID0gc2lnbmFsPERyb3Bkb3duT3B0aW9uW10+KFtdKTtcbiAgc2l6ZU9wdGlvbnMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuXG4gIHF1ZXJ5ID0gaW5wdXQ8U2VhcmNoUXVlcnkgfCBudWxsPihudWxsKTtcbiAgcXVlcnlDaGFuZ2UgPSBvdXRwdXQ8U2VhcmNoUXVlcnk+KCk7XG4gIGZpbHRlcnNBY3RpdmUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGZpbHRlckZvcm0gPSB0aGlzLiNmYi5ub25OdWxsYWJsZS5ncm91cCh7XG4gICAgdHlwZTogW3RoaXMuQU5ZX09QVElPTl0sXG4gICAgc2l6ZTogW3RoaXMuQU5ZX09QVElPTl0sXG4gICAgY3JlYXRlZDogW3RoaXMuQU5ZX09QVElPTl1cbiAgfSk7XG5cbiAgI2N1c3RvbURhdGVSYW5nZT86IFJhbmdlVmFsdWU7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50cmFuc2xhdGUub25MYW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgoXykgPT4gdGhpcy4jc2V0dXBPcHRpb25zKCkpO1xuICAgIHRoaXMuI3NldHVwT3B0aW9ucygpO1xuXG4gICAgdGhpcy5maWx0ZXJGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKS5zdWJzY3JpYmUoKHYpID0+IHRoaXMuI29uRm9ybVZhbHVlQ2hhbmdlKHYpKTtcblxuICAgIC8vIGxpc3RlbiB0byBjcmVhdGVkIGZpbHRlciBjaGFuZ2VzIHRvIGNhdGNoIGN1c3RvbSBkYXRlIHJhbmdlXG4gICAgdGhpcy5maWx0ZXJGb3JtXG4gICAgICAuZ2V0KCdjcmVhdGVkJylcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLiNDUkVBVEVEX0NVU1RPTSkge1xuICAgICAgICAgIC8vIG9wZW4gZGF0ZSByYW5nZSBwaWNrZXJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLiNjdXN0b21EYXRlUmFuZ2UpO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLiNvdmVybGF5Lm9wZW4oRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50LCB7XG4gICAgICAgICAgICByYW5nZTogdGhpcy4jY3VzdG9tRGF0ZVJhbmdlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgby5hZnRlckNsb3NlZCQuc3Vic2NyaWJlKChyZXM6IE92ZXJsYXlDbG9zZUV2ZW50PFJhbmdlVmFsdWU+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNjdXN0b21EYXRlUmFuZ2UgPSByZXMuZGF0YTtcbiAgICAgICAgICAgIGlmICghcmVzLmRhdGEpIHtcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnY3JlYXRlZCcpPy5wYXRjaFZhbHVlKHRoaXMuQU5ZX09QVElPTik7XG4gICAgICAgICAgICAgIHRoaXMuI3NldHVwRGF0ZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuI29uRm9ybVZhbHVlQ2hhbmdlKHRoaXMuZmlsdGVyRm9ybS52YWx1ZSk7XG4gICAgICAgICAgICAgIHRoaXMuI3NldHVwRGF0ZU9wdGlvbnModGhpcy4jY3VzdG9tRGF0ZVJhbmdlVG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkOiB0aGlzLiNDUkVBVEVEX0NVU1RPTVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gICNjdXN0b21EYXRlUmFuZ2VUb1N0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy4jY3VzdG9tRGF0ZVJhbmdlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRwID0gbmV3IExvY2FsZURhdGVQaXBlKHRoaXMudHJhbnNsYXRlKTtcbiAgICBzd2l0Y2ggKHRoaXMuI2N1c3RvbURhdGVSYW5nZS5vcGVyYXRvcikge1xuICAgICAgY2FzZSBPcGVyYXRvci5FUVVBTDoge1xuICAgICAgICByZXR1cm4gZHAudHJhbnNmb3JtKHRoaXMuI2N1c3RvbURhdGVSYW5nZS5maXJzdFZhbHVlIGFzIERhdGUsICdzaG9ydERhdGUnKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgT3BlcmF0b3IuR1JFQVRFUl9PUl9FUVVBTDoge1xuICAgICAgICByZXR1cm4gYCR7T3BlcmF0b3JMYWJlbC5HUkVBVEVSX09SX0VRVUFMfSAke2RwLnRyYW5zZm9ybSh0aGlzLiNjdXN0b21EYXRlUmFuZ2UuZmlyc3RWYWx1ZSBhcyBEYXRlLCAnc2hvcnREYXRlJyl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgT3BlcmF0b3IuTEVTU19PUl9FUVVBTDoge1xuICAgICAgICByZXR1cm4gYCR7T3BlcmF0b3JMYWJlbC5MRVNTX09SX0VRVUFMfSAke2RwLnRyYW5zZm9ybSh0aGlzLiNjdXN0b21EYXRlUmFuZ2UuZmlyc3RWYWx1ZSBhcyBEYXRlLCAnc2hvcnREYXRlJyl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgT3BlcmF0b3IuSU5URVJWQUxfSU5DTFVERV9CT1RIOiB7XG4gICAgICAgIHJldHVybiBgJHtkcC50cmFuc2Zvcm0odGhpcy4jY3VzdG9tRGF0ZVJhbmdlLmZpcnN0VmFsdWUgYXMgRGF0ZSwgJ3Nob3J0RGF0ZScpfSAke09wZXJhdG9yTGFiZWwuSU5URVJWQUxfSU5DTFVERV9CT1RIfSAke2RwLnRyYW5zZm9ybSh0aGlzLiNjdXN0b21EYXRlUmFuZ2Uuc2Vjb25kVmFsdWUgYXMgRGF0ZSwgJ3Nob3J0RGF0ZScpfWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICBjb25zdCBxID0gdGhpcy5xdWVyeSgpO1xuICAgIGlmIChxKSB7XG4gICAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQocSk7XG4gICAgICB0aGlzLmZpbHRlckZvcm0ucmVzZXQoKTtcbiAgICB9XG4gIH1cblxuICAjb25Gb3JtVmFsdWVDaGFuZ2UodjogYW55KSB7XG4gICAgLy8gZG8gbm90IGNyZWF0ZSBhIG5ldyBxdWVyeSBpZiBjdXN0b20gZGF0ZSByYW5nZSBpcyBzZWxlY3RlZCBidXQgbm90IHNldFxuICAgIGlmICh2LmNyZWF0ZWQgPT09IHRoaXMuI0NSRUFURURfQ1VTVE9NICYmICF0aGlzLiNjdXN0b21EYXRlUmFuZ2UpIHJldHVybjtcblxuICAgIGlmKHYuY3JlYXRlZCAhPT0gdGhpcy4jQ1JFQVRFRF9DVVNUT00pIHtcbiAgICAgIHRoaXMuI2N1c3RvbURhdGVSYW5nZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuI3NldHVwRGF0ZU9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkUXVlcnk6IFNlYXJjaFF1ZXJ5ID0gdGhpcy4jYXBwbHlGaWx0ZXJzKHYpO1xuICAgIHRoaXMucXVlcnlDaGFuZ2UuZW1pdCh1cGRhdGVkUXVlcnkpO1xuICAgIHRoaXMuZmlsdGVyc0FjdGl2ZS5zZXQoISF1cGRhdGVkUXVlcnkuZmlsdGVycyAmJiB1cGRhdGVkUXVlcnkuZmlsdGVycy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gICNhcHBseUZpbHRlcnModjogYW55KTogU2VhcmNoUXVlcnkge1xuICAgIGNvbnN0IHVwZGF0ZWRRdWVyeTogU2VhcmNoUXVlcnkgPSB7XG4gICAgICAuLi4odGhpcy5xdWVyeSgpIHx8IHt9KSxcbiAgICAgIGZpbHRlcnM6IFtdXG4gICAgfTtcbiAgICB1cGRhdGVkUXVlcnkuZmlsdGVycyA9IFtdO1xuXG4gICAgLy8gZmlsZSBzaXplIGZpbHRlclxuICAgIGNvbnN0IHR5cGVGaWx0ZXIgPSB0aGlzLiN0b1R5cGVGaWx0ZXIodi50eXBlKTtcbiAgICBpZiAodHlwZUZpbHRlcikgdXBkYXRlZFF1ZXJ5LmZpbHRlcnMucHVzaCh0eXBlRmlsdGVyKTtcblxuICAgIC8vIGZpbGUgc2l6ZSBmaWx0ZXJcbiAgICBjb25zdCBzaXplRmlsdGVyID0gdGhpcy4jdG9TaXplRmlsdGVyKHYuc2l6ZSk7XG4gICAgaWYgKHNpemVGaWx0ZXIpIHVwZGF0ZWRRdWVyeS5maWx0ZXJzLnB1c2goc2l6ZUZpbHRlcik7XG5cbiAgICAvLyBjcmVhdGlvbiBkYXRlIGZpbHRlclxuICAgIGNvbnN0IGRhdGVGaWx0ZXIgPSB0aGlzLiN0b0RhdGVGaWx0ZXIodi5jcmVhdGVkKTtcbiAgICBpZiAoZGF0ZUZpbHRlcikgdXBkYXRlZFF1ZXJ5LmZpbHRlcnMucHVzaChkYXRlRmlsdGVyKTtcblxuICAgIHJldHVybiB1cGRhdGVkUXVlcnk7XG4gIH1cblxuICAjc2V0dXBPcHRpb25zKCkge1xuICAgIHRoaXMuI3NldHVwVHlwZU9wdGlvbnMoKTtcbiAgICB0aGlzLiNzZXR1cERhdGVPcHRpb25zKCk7XG4gICAgdGhpcy4jc2V0dXBTaXplT3B0aW9ucygpO1xuICB9XG5cbiAgI3NldHVwVHlwZU9wdGlvbnMoKSB7XG4gICAgdGhpcy50eXBlT3B0aW9ucy5zZXQoW1xuICAgICAge1xuICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LmFwcC5kcml2ZS5zZWFyY2guZmlsdGVyLm9wdGlvbi5hbnknKSxcbiAgICAgICAgdmFsdWU6IHRoaXMuQU5ZX09QVElPTlxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMuI2ZsYXZvcnMubWFwKChmOiBPYmplY3RGbGF2b3IpID0+ICh7XG4gICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGYuaWQpLFxuICAgICAgICB2YWx1ZTogZi5zb3RcbiAgICAgIH0pKVxuICAgIF0pO1xuICB9XG5cbiAgI3NldHVwRGF0ZU9wdGlvbnMoY3VzdG9tPzogc3RyaW5nKSB7XG4gICAgdGhpcy5kYXRlT3B0aW9ucy5zZXQoW1xuICAgICAgLi4uW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5hcHAuZHJpdmUuc2VhcmNoLmZpbHRlci5vcHRpb24uZGF0ZS5hbnknKSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5BTllfT1BUSU9OXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LmFwcC5kcml2ZS5zZWFyY2guZmlsdGVyLm9wdGlvbi5kYXRlLnRvZGF5JyksXG4gICAgICAgICAgdmFsdWU6ICd0b2RheSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLnNlYXJjaC5maWx0ZXIub3B0aW9uLmRhdGUueWVzdGVyZGF5JyksXG4gICAgICAgICAgdmFsdWU6ICd5ZXN0ZXJkYXknXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LmFwcC5kcml2ZS5zZWFyY2guZmlsdGVyLm9wdGlvbi5kYXRlLnRoaXN3ZWVrJyksXG4gICAgICAgICAgdmFsdWU6ICd0aGlzd2VlaydcbiAgICAgICAgfSxcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLnNlYXJjaC5maWx0ZXIub3B0aW9uLmRhdGUubGFzdHdlZWsnKSxcbiAgICAgICAgLy8gICB2YWx1ZTogJ2xhc3R3ZWVrJ1xuICAgICAgICAvLyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5hcHAuZHJpdmUuc2VhcmNoLmZpbHRlci5vcHRpb24uZGF0ZS50aGlzbW9udGgnKSxcbiAgICAgICAgICB2YWx1ZTogJ3RoaXNtb250aCdcbiAgICAgICAgfSxcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLnNlYXJjaC5maWx0ZXIub3B0aW9uLmRhdGUubGFzdG1vbnRoJyksXG4gICAgICAgIC8vICAgdmFsdWU6ICdsYXN0bW9udGgnXG4gICAgICAgIC8vIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LmFwcC5kcml2ZS5zZWFyY2guZmlsdGVyLm9wdGlvbi5kYXRlLnRoaXN5ZWFyJyksXG4gICAgICAgICAgdmFsdWU6ICd0aGlzeWVhcidcbiAgICAgICAgfSxcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLnNlYXJjaC5maWx0ZXIub3B0aW9uLmRhdGUubGFzdHllYXInKSxcbiAgICAgICAgLy8gICB2YWx1ZTogJ2xhc3R5ZWFyJ1xuICAgICAgICAvLyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IGN1c3RvbSB8fCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLnNlYXJjaC5maWx0ZXIub3B0aW9uLmRhdGUuY3VzdG9tJyksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuI0NSRUFURURfQ1VTVE9NXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICBdKTtcbiAgfVxuXG4gICNzZXR1cFNpemVPcHRpb25zKCkge1xuICAgIHRoaXMuc2l6ZU9wdGlvbnMuc2V0KFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5hcHAuZHJpdmUuc2VhcmNoLmZpbHRlci5vcHRpb24uc2l6ZS5hbnknKSxcbiAgICAgICAgdmFsdWU6IHRoaXMuQU5ZX09QVElPTlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5hcHAuZHJpdmUuc2VhcmNoLmZpbHRlci5vcHRpb24uc2l6ZS5zbWFsbCcpLFxuICAgICAgICB2YWx1ZTogJ3MnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LmFwcC5kcml2ZS5zZWFyY2guZmlsdGVyLm9wdGlvbi5zaXplLm1lZGl1bScpLFxuICAgICAgICB2YWx1ZTogJ20nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LmFwcC5kcml2ZS5zZWFyY2guZmlsdGVyLm9wdGlvbi5zaXplLmxhcmdlJyksXG4gICAgICAgIHZhbHVlOiAnbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLnNlYXJjaC5maWx0ZXIub3B0aW9uLnNpemUudmVyeWxhcmdlJyksXG4gICAgICAgIHZhbHVlOiAneGwnXG4gICAgICB9XG4gICAgXSk7XG4gIH1cblxuICAjdG9EYXRlRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiBTZWFyY2hGaWx0ZXIgfCB1bmRlZmluZWQge1xuICAgIGxldCBkYXRlRmlsdGVyOiBTZWFyY2hGaWx0ZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSAndG9kYXknOiB7XG4gICAgICAgIGRhdGVGaWx0ZXIgPSB7XG4gICAgICAgICAgZjogQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgICAgIG86IE9wZXJhdG9yLklOVEVSVkFMX0lOQ0xVREVfQk9USCxcbiAgICAgICAgICB2MTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0gKyAnVDAwOjAwOjAwLjAwMCcsXG4gICAgICAgICAgdjI6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdICsgJ1QyMzo1OTo1OS4wMDAnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAneWVzdGVyZGF5Jzoge1xuICAgICAgICBjb25zdCB5ZXN0ZXJkYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB5ZXN0ZXJkYXkuc2V0RGF0ZSh5ZXN0ZXJkYXkuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICAgIGRhdGVGaWx0ZXIgPSB7XG4gICAgICAgICAgZjogQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgICAgIG86IE9wZXJhdG9yLklOVEVSVkFMX0lOQ0xVREVfQk9USCxcbiAgICAgICAgICB2MTogeWVzdGVyZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICdUMDA6MDA6MDAuMDAwJyxcbiAgICAgICAgICB2MjogeWVzdGVyZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICdUMjM6NTk6NTkuMDAwJ1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RoaXN3ZWVrJzoge1xuICAgICAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGZpcnN0RGF5LnNldERhdGUoZmlyc3REYXkuZ2V0RGF0ZSgpIC0gZmlyc3REYXkuZ2V0RGF5KCkpO1xuICAgICAgICBkYXRlRmlsdGVyID0ge1xuICAgICAgICAgIGY6IEJhc2VPYmplY3RUeXBlRmllbGQuQ1JFQVRJT05fREFURSxcbiAgICAgICAgICBvOiBPcGVyYXRvci5JTlRFUlZBTF9JTkNMVURFX0JPVEgsXG4gICAgICAgICAgdjE6IGZpcnN0RGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICdUMDA6MDA6MDAuMDAwJyxcbiAgICAgICAgICB2MjogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0gKyAnVDIzOjU5OjU5LjAwMCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBjYXNlICdsYXN0d2Vlayc6IHtcbiAgICAgIC8vICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgLy8gICBmaXJzdERheS5zZXREYXRlKGZpcnN0RGF5LmdldERhdGUoKSAtIGZpcnN0RGF5LmdldERheSgpIC0gNyk7XG4gICAgICAvLyAgIGNvbnN0IGxhc3REYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgLy8gICBsYXN0RGF5LnNldERhdGUobGFzdERheS5nZXREYXRlKCkgLSBsYXN0RGF5LmdldERheSgpIC0gMSk7XG4gICAgICAvLyAgIGRhdGVGaWx0ZXIgPSB7XG4gICAgICAvLyAgICAgZjogQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgLy8gICAgIG86IE9wZXJhdG9yLklOVEVSVkFMX0lOQ0xVREVfQk9USCxcbiAgICAgIC8vICAgICB2MTogZmlyc3REYXkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdICsgJ1QwMDowMDowMC4wMDAnLFxuICAgICAgLy8gICAgIHYyOiBsYXN0RGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICdUMjM6NTk6NTkuMDAwJ1xuICAgICAgLy8gICB9O1xuICAgICAgLy8gICBicmVhaztcbiAgICAgIC8vIH1cbiAgICAgIGNhc2UgJ3RoaXNtb250aCc6IHtcbiAgICAgICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBmaXJzdERheS5zZXREYXRlKDEpO1xuICAgICAgICBkYXRlRmlsdGVyID0ge1xuICAgICAgICAgIGY6IEJhc2VPYmplY3RUeXBlRmllbGQuQ1JFQVRJT05fREFURSxcbiAgICAgICAgICBvOiBPcGVyYXRvci5JTlRFUlZBTF9JTkNMVURFX0JPVEgsXG4gICAgICAgICAgdjE6IGZpcnN0RGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICdUMDA6MDA6MDAuMDAwJyxcbiAgICAgICAgICB2MjogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0gKyAnVDIzOjU5OjU5LjAwMCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBjYXNlICdsYXN0bW9udGgnOiB7XG4gICAgICAvLyAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUoKTtcbiAgICAgIC8vICAgZmlyc3REYXkuc2V0RGF0ZSgxKTtcbiAgICAgIC8vICAgZmlyc3REYXkuc2V0TW9udGgoZmlyc3REYXkuZ2V0TW9udGgoKSAtIDEpO1xuICAgICAgLy8gICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUoKTtcbiAgICAgIC8vICAgbGFzdERheS5zZXREYXRlKDApO1xuICAgICAgLy8gICBkYXRlRmlsdGVyID0ge1xuICAgICAgLy8gICAgIGY6IEJhc2VPYmplY3RUeXBlRmllbGQuQ1JFQVRJT05fREFURSxcbiAgICAgIC8vICAgICBvOiBPcGVyYXRvci5JTlRFUlZBTF9JTkNMVURFX0JPVEgsXG4gICAgICAvLyAgICAgdjE6IGZpcnN0RGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICdUMDA6MDA6MDAuMDAwJyxcbiAgICAgIC8vICAgICB2MjogbGFzdERheS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0gKyAnVDIzOjU5OjU5LjAwMCdcbiAgICAgIC8vICAgfTtcbiAgICAgIC8vICAgYnJlYWs7XG4gICAgICAvLyB9XG4gICAgICBjYXNlICd0aGlzeWVhcic6IHtcbiAgICAgICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBmaXJzdERheS5zZXRNb250aCgwKTtcbiAgICAgICAgZmlyc3REYXkuc2V0RGF0ZSgxKTtcbiAgICAgICAgZGF0ZUZpbHRlciA9IHtcbiAgICAgICAgICBmOiBCYXNlT2JqZWN0VHlwZUZpZWxkLkNSRUFUSU9OX0RBVEUsXG4gICAgICAgICAgbzogT3BlcmF0b3IuSU5URVJWQUxfSU5DTFVERV9CT1RILFxuICAgICAgICAgIHYxOiBmaXJzdERheS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0gKyAnVDAwOjAwOjAwLjAwMCcsXG4gICAgICAgICAgdjI6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdICsgJ1QyMzo1OTo1OS4wMDAnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gY2FzZSAnbGFzdHllYXInOiB7XG4gICAgICAvLyAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUoKTtcbiAgICAgIC8vICAgZmlyc3REYXkuc2V0RnVsbFllYXIoZmlyc3REYXkuZ2V0RnVsbFllYXIoKSAtIDEpO1xuICAgICAgLy8gICBmaXJzdERheS5zZXRNb250aCgwKTtcbiAgICAgIC8vICAgZmlyc3REYXkuc2V0RGF0ZSgxKTtcbiAgICAgIC8vICAgY29uc3QgbGFzdERheSA9IG5ldyBEYXRlKCk7XG4gICAgICAvLyAgIGxhc3REYXkuc2V0RnVsbFllYXIobGFzdERheS5nZXRGdWxsWWVhcigpIC0gMSk7XG4gICAgICAvLyAgIGxhc3REYXkuc2V0TW9udGgoMTEpO1xuICAgICAgLy8gICBsYXN0RGF5LnNldERhdGUoMzEpO1xuICAgICAgLy8gICBkYXRlRmlsdGVyID0ge1xuICAgICAgLy8gICAgIGY6IEJhc2VPYmplY3RUeXBlRmllbGQuQ1JFQVRJT05fREFURSxcbiAgICAgIC8vICAgICBvOiBPcGVyYXRvci5JTlRFUlZBTF9JTkNMVURFX0JPVEgsXG4gICAgICAvLyAgICAgdjE6IGZpcnN0RGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICdUMDA6MDA6MDAuMDAwJyxcbiAgICAgIC8vICAgICB2MjogbGFzdERheS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0gKyAnVDIzOjU5OjU5LjAwMCdcbiAgICAgIC8vICAgfTtcbiAgICAgIC8vICAgYnJlYWs7XG4gICAgICAvLyB9XG4gICAgICBjYXNlIHRoaXMuI0NSRUFURURfQ1VTVE9NOiB7XG4gICAgICAgIGlmICh0aGlzLiNjdXN0b21EYXRlUmFuZ2UpIGRhdGVGaWx0ZXIgPSB0aGlzLiNjdXN0b21SYW5nZVRvRmlsdGVyKHRoaXMuI2N1c3RvbURhdGVSYW5nZSk7XG4gICAgICAgIGVsc2UgdGhpcy5maWx0ZXJGb3JtLmdldCgnY3JlYXRlZCcpPy5wYXRjaFZhbHVlKHRoaXMuQU5ZX09QVElPTik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0ZUZpbHRlcjtcbiAgfVxuXG4gICNjdXN0b21SYW5nZVRvRmlsdGVyKHJ2OiBSYW5nZVZhbHVlKTogU2VhcmNoRmlsdGVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2MSA9IChydi5maXJzdFZhbHVlIGFzIERhdGUpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgdjIgPSBydi5zZWNvbmRWYWx1ZSA/IChydi5zZWNvbmRWYWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgIGxldCBmaWx0ZXI7XG4gICAgc3dpdGNoIChydi5vcGVyYXRvcikge1xuICAgICAgY2FzZSBPcGVyYXRvci5FUVVBTDoge1xuICAgICAgICBmaWx0ZXIgPSB7XG4gICAgICAgICAgZjogQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgICAgIG86IE9wZXJhdG9yLklOVEVSVkFMX0lOQ0xVREVfQk9USCxcbiAgICAgICAgICB2MTogdjEuc3BsaXQoJ1QnKVswXSArICdUMDA6MDA6MDAuMDAwJyxcbiAgICAgICAgICB2MjogdjEuc3BsaXQoJ1QnKVswXSArICdUMjM6NTk6NTkuMDAwJ1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgT3BlcmF0b3IuR1JFQVRFUl9PUl9FUVVBTDoge1xuICAgICAgICBmaWx0ZXIgPSB7XG4gICAgICAgICAgZjogQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgICAgIG86IHJ2Lm9wZXJhdG9yLFxuICAgICAgICAgIHYxOiB2MS5zcGxpdCgnVCcpWzBdICsgJ1QwMDowMDowMC4wMDAnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBPcGVyYXRvci5MRVNTX09SX0VRVUFMOiB7XG4gICAgICAgIGZpbHRlciA9IHtcbiAgICAgICAgICBmOiBCYXNlT2JqZWN0VHlwZUZpZWxkLkNSRUFUSU9OX0RBVEUsXG4gICAgICAgICAgbzogcnYub3BlcmF0b3IsXG4gICAgICAgICAgdjE6IHYxLnNwbGl0KCdUJylbMF0gKyAnVDIzOjU5OjU5LjAwMCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE9wZXJhdG9yLklOVEVSVkFMX0lOQ0xVREVfQk9USDoge1xuICAgICAgICBmaWx0ZXIgPSB7XG4gICAgICAgICAgZjogQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgICAgIG86IHJ2Lm9wZXJhdG9yLFxuICAgICAgICAgIHYxOiB2MS5zcGxpdCgnVCcpWzBdICsgJ1QwMDowMDowMC4wMDAnLFxuICAgICAgICAgIHYyOiB2MiEuc3BsaXQoJ1QnKVswXSArICdUMjM6NTk6NTkuMDAwJ1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gICN0b1NpemVGaWx0ZXIodmFsdWU6IHN0cmluZyk6IFNlYXJjaEZpbHRlciB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHNpemVGaWx0ZXI6IFNlYXJjaEZpbHRlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlICdzJzpcbiAgICAgICAgc2l6ZUZpbHRlciA9IHtcbiAgICAgICAgICBmOiBDb250ZW50U3RyZWFtRmllbGQuTEVOR1RILFxuICAgICAgICAgIG86IE9wZXJhdG9yLkxFU1NfVEhBTixcbiAgICAgICAgICB2MTogMTAyNCAqIDEwMjRcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtJzpcbiAgICAgICAgc2l6ZUZpbHRlciA9IHtcbiAgICAgICAgICBmOiBDb250ZW50U3RyZWFtRmllbGQuTEVOR1RILFxuICAgICAgICAgIG86IE9wZXJhdG9yLklOVEVSVkFMX0lOQ0xVREVfQk9USCxcbiAgICAgICAgICB2MTogMTAyNCAqIDEwMjQsXG4gICAgICAgICAgdjI6IDEwMjQgKiAxMDI0ICogMTBcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsJzpcbiAgICAgICAgc2l6ZUZpbHRlciA9IHtcbiAgICAgICAgICBmOiBDb250ZW50U3RyZWFtRmllbGQuTEVOR1RILFxuICAgICAgICAgIG86IE9wZXJhdG9yLklOVEVSVkFMX0lOQ0xVREVfQk9USCxcbiAgICAgICAgICB2MTogMTAyNCAqIDEwMjQgKiAxMCxcbiAgICAgICAgICB2MjogMTAyNCAqIDEwMjQgKiAxMDBcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd4bCc6XG4gICAgICAgIHNpemVGaWx0ZXIgPSB7XG4gICAgICAgICAgZjogQ29udGVudFN0cmVhbUZpZWxkLkxFTkdUSCxcbiAgICAgICAgICBvOiBPcGVyYXRvci5HUkVBVEVSX1RIQU4sXG4gICAgICAgICAgdjE6IDEwMjQgKiAxMDI0ICogMTAwXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZUZpbHRlcjtcbiAgfVxuXG4gICN0b1R5cGVGaWx0ZXIodmFsdWU6IHN0cmluZyk6IFNlYXJjaEZpbHRlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0aGlzLkFOWV9PUFRJT05cbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHtcbiAgICAgICAgICBmOiBCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsXG4gICAgICAgICAgbzogT3BlcmF0b3IuSU4sXG4gICAgICAgICAgdjE6IFt2YWx1ZV1cbiAgICAgICAgfTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgeXZjRHJhZ1Njcm9sbD5cbiAgPHl2Yy1kcm9wZG93biBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCIgW29wdGlvbnNdPVwidHlwZU9wdGlvbnMoKVwiIFtkaXNhYmxlQ2xlYXJCdXR0b25dPVwidHJ1ZVwiPjwveXZjLWRyb3Bkb3duPlxuICA8eXZjLWRyb3Bkb3duIGZvcm1Db250cm9sTmFtZT1cInNpemVcIiBbb3B0aW9uc109XCJzaXplT3B0aW9ucygpXCIgW2Rpc2FibGVDbGVhckJ1dHRvbl09XCJ0cnVlXCI+PC95dmMtZHJvcGRvd24+XG4gIDx5dmMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiY3JlYXRlZFwiIFtvcHRpb25zXT1cImRhdGVPcHRpb25zKClcIiBbZGlzYWJsZUNsZWFyQnV0dG9uXT1cInRydWVcIj48L3l2Yy1kcm9wZG93bj5cblxuICBAaWYgKGZpbHRlcnNBY3RpdmUoKSkge1xuICAgIDxidXR0b24gY2xhc3M9XCJzZWNvbmRhcnlcIiAoY2xpY2spPVwicmVzZXQoKVwiPnt7ICd5dXYuYXBwLmRyaXZlLnNlYXJjaC5maWx0ZXIuYnV0dG9uLnJlc2V0JyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICB9XG48L2Zvcm0+XG4iXX0=
|