@updevs/components 1.0.0-alpha.96 → 1.0.0-alpha.97

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.
@@ -0,0 +1,254 @@
1
+ import { Injectable, signal, computed } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Service to manage the current search request state across table components.
6
+ * Uses Angular signals for reactive state management, eliminating the need for prop drilling.
7
+ * Should be provided at the table component level so each table instance has its own state.
8
+ */
9
+ export class CurrentSearchRequestService {
10
+ constructor() {
11
+ this._searchRequest = signal({});
12
+ this._isSearching = signal(false);
13
+ this._hasChanges = signal(false);
14
+ /**
15
+ * Read-only signal for the current search request
16
+ */
17
+ this.searchRequest = this._searchRequest.asReadonly();
18
+ /**
19
+ * Read-only signal for the searching state
20
+ */
21
+ this.isSearching = this._isSearching.asReadonly();
22
+ /**
23
+ * Read-only signal indicating if the search request has changed from default
24
+ */
25
+ this.hasChanges = this._hasChanges.asReadonly();
26
+ /**
27
+ * Subject to trigger search operations
28
+ */
29
+ this.searchRequestSubject = new Subject();
30
+ /**
31
+ * Count of active filters (non-hidden)
32
+ */
33
+ this.activeFilterCount = computed(() => this.searchRequest().filters?.filter(f => !f.isHidden).length || 0);
34
+ /**
35
+ * Whether there are any active filters
36
+ */
37
+ this.hasFilters = computed(() => (this.searchRequest().filters?.length || 0) > 0);
38
+ /**
39
+ * Count of visible (non-hidden) filters
40
+ */
41
+ this.visibleFilterCount = computed(() => this.searchRequest().filters?.filter(f => !f.isHidden).length || 0);
42
+ /**
43
+ * Whether there's a search description/text query
44
+ */
45
+ this.hasDescription = computed(() => !!this.searchRequest().description && this.searchRequest().description.length > 0);
46
+ /**
47
+ * Whether there are any sortings applied
48
+ */
49
+ this.hasSorting = computed(() => (this.searchRequest().sortings?.length || 0) > 0);
50
+ /**
51
+ * The current sorting (first one if multiple exist)
52
+ */
53
+ this.currentSorting = computed(() => this.hasSorting() ? this.searchRequest().sortings[0] : undefined);
54
+ /**
55
+ * Whether any search criteria is active (filters, description, or sorting)
56
+ */
57
+ this.hasAnySearchCriteria = computed(() => this.hasFilters() || this.hasDescription() || this.hasSorting());
58
+ /**
59
+ * Current page number (1-indexed for display)
60
+ */
61
+ this.currentPageNumber = computed(() => (this.searchRequest().pageIndex || 0) + 1);
62
+ /**
63
+ * Whether pagination is configured
64
+ */
65
+ this.hasPagination = computed(() => !!this.searchRequest().pageSize && this.searchRequest().pageSize > 0);
66
+ }
67
+ /**
68
+ * Updates the entire search request
69
+ * @param request The new search request
70
+ */
71
+ updateSearchRequest(request) {
72
+ const previousRequest = this._searchRequest();
73
+ this._searchRequest.set(request);
74
+ // Only mark as changed if the new request is actually different from previous
75
+ if (!this.areSearchRequestsEqual(previousRequest, request)) {
76
+ this._hasChanges.set(true);
77
+ }
78
+ }
79
+ /**
80
+ * Partially updates the search request
81
+ * @param partial Partial search request properties to update
82
+ */
83
+ patchSearchRequest(partial) {
84
+ const previousRequest = this._searchRequest();
85
+ const newRequest = { ...previousRequest, ...partial };
86
+ this._searchRequest.set(newRequest);
87
+ // Only mark as changed if the patch actually changed something
88
+ if (!this.areSearchRequestsEqual(previousRequest, newRequest)) {
89
+ this._hasChanges.set(true);
90
+ }
91
+ }
92
+ /**
93
+ * Sets the searching state
94
+ * @param isSearching Whether a search is in progress
95
+ */
96
+ setSearching(isSearching) {
97
+ this._isSearching.set(isSearching);
98
+ }
99
+ /**
100
+ * Resets the search request to default state
101
+ */
102
+ reset() {
103
+ this._searchRequest.set({});
104
+ this._isSearching.set(false);
105
+ this._hasChanges.set(false);
106
+ }
107
+ /**
108
+ * Triggers a search operation by emitting on the searchRequestSubject
109
+ */
110
+ triggerSearch() {
111
+ this.searchRequestSubject.next(this._searchRequest());
112
+ }
113
+ /**
114
+ * Manually sets the hasChanges flag
115
+ * Useful for changes that aren't part of the search request but should enable Save View
116
+ * (e.g., column visibility changes)
117
+ * @param hasChanges Whether there are changes
118
+ */
119
+ setHasChanges(hasChanges) {
120
+ this._hasChanges.set(hasChanges);
121
+ }
122
+ /**
123
+ * Adds a filter to the search request
124
+ * @param filter The filter to add
125
+ */
126
+ addFilter(filter) {
127
+ const currentFilters = this.searchRequest().filters || [];
128
+ this.patchSearchRequest({ filters: [...currentFilters, filter] });
129
+ }
130
+ /**
131
+ * Removes a filter by name
132
+ * @param filterName The name of the filter column to remove
133
+ */
134
+ removeFilter(filterName) {
135
+ const currentFilters = this.searchRequest().filters || [];
136
+ this.patchSearchRequest({ filters: currentFilters.filter(f => f.column !== filterName) });
137
+ }
138
+ /**
139
+ * Removes a filter by index
140
+ * @param index The index of the filter to remove
141
+ */
142
+ removeFilterByIndex(index) {
143
+ const currentFilters = this.searchRequest().filters || [];
144
+ this.patchSearchRequest({ filters: currentFilters.filter((_, i) => i !== index) });
145
+ }
146
+ /**
147
+ * Updates a specific filter by column name
148
+ * @param columnName The column name of the filter to update
149
+ * @param newData Partial filter properties to update
150
+ */
151
+ updateFilter(columnName, newData) {
152
+ const currentFilters = this.searchRequest().filters || [];
153
+ this.patchSearchRequest({ filters: currentFilters.map(f => f.column === columnName ? { ...f, ...newData } : f) });
154
+ }
155
+ /**
156
+ * Updates a filter by its index position
157
+ * @param index The index of the filter to update
158
+ * @param newData Partial filter properties to update
159
+ */
160
+ updateFilterByIndex(index, newData) {
161
+ const currentFilters = this.searchRequest().filters || [];
162
+ if (index >= 0 && index < currentFilters.length) {
163
+ this.patchSearchRequest({ filters: currentFilters.map((f, i) => i === index ? { ...f, ...newData } : f) });
164
+ }
165
+ }
166
+ /**
167
+ * Clears all filters
168
+ */
169
+ clearFilters() {
170
+ this.patchSearchRequest({ filters: [] });
171
+ }
172
+ /**
173
+ * Sets the sorting (replaces existing sortings)
174
+ * @param column The column name to sort by
175
+ * @param direction The sort direction
176
+ */
177
+ setSorting(column, direction) {
178
+ this.patchSearchRequest({ sortings: [{ column, direction }] });
179
+ }
180
+ /**
181
+ * Clears all sorting
182
+ */
183
+ clearSorting() {
184
+ this.patchSearchRequest({ sortings: [] });
185
+ }
186
+ /**
187
+ * Sets the search description/text query
188
+ * @param description The search text
189
+ */
190
+ setDescription(description) {
191
+ this.patchSearchRequest({ description });
192
+ }
193
+ /**
194
+ * Clears the search description
195
+ */
196
+ clearDescription() {
197
+ this.patchSearchRequest({ description: '' });
198
+ }
199
+ /**
200
+ * Clears ALL search criteria (filters, description, sorting)
201
+ * Note: Does not reset pagination - use reset() for that
202
+ */
203
+ clearAll() {
204
+ this.patchSearchRequest({ filters: [], description: '', sortings: [] });
205
+ }
206
+ /**
207
+ * Clears all search criteria except pagination
208
+ * Useful when you want to reset search but maintain current page
209
+ */
210
+ clearAllExceptPagination() {
211
+ this.clearAll();
212
+ }
213
+ /**
214
+ * Deep comparison of two search requests
215
+ * @param a First search request
216
+ * @param b Second search request
217
+ * @returns true if they are equal, false otherwise
218
+ */
219
+ areSearchRequestsEqual(a, b) {
220
+ if ((a.description || '') !== (b.description || '')) {
221
+ return false;
222
+ }
223
+ const aFilters = a.filters || [];
224
+ const bFilters = b.filters || [];
225
+ if (aFilters.length !== bFilters.length) {
226
+ return false;
227
+ }
228
+ for (let i = 0; i < aFilters.length; i++) {
229
+ if (JSON.stringify(aFilters[i]) !== JSON.stringify(bFilters[i])) {
230
+ return false;
231
+ }
232
+ }
233
+ const aSortings = a.sortings || [];
234
+ const bSortings = b.sortings || [];
235
+ if (aSortings.length !== bSortings.length) {
236
+ return false;
237
+ }
238
+ for (let i = 0; i < aSortings.length; i++) {
239
+ if (JSON.stringify(aSortings[i]) !== JSON.stringify(bSortings[i])) {
240
+ return false;
241
+ }
242
+ }
243
+ if (a.pageSize !== b.pageSize || a.pageIndex !== b.pageIndex) {
244
+ return false;
245
+ }
246
+ return true;
247
+ }
248
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CurrentSearchRequestService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
249
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CurrentSearchRequestService }); }
250
+ }
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CurrentSearchRequestService, decorators: [{
252
+ type: Injectable
253
+ }] });
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVudC1zZWFyY2gtcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RhYmxlL3NyYy9zZXJ2aWNlcy9jdXJyZW50LXNlYXJjaC1yZXF1ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRS9COzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sMkJBQTJCO0lBRHhDO1FBRXFCLG1CQUFjLEdBQUcsTUFBTSxDQUFxQixFQUFFLENBQUMsQ0FBQztRQUNoRCxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3Qzs7V0FFRztRQUNNLGtCQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUxRDs7V0FFRztRQUNNLGdCQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV0RDs7V0FFRztRQUNNLGVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXBEOztXQUVHO1FBQ00seUJBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQXNCLENBQUM7UUFFbEU7O1dBRUc7UUFDTSxzQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFaEg7O1dBRUc7UUFDTSxlQUFV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S0FBSyxDQUFDO1lBQ2pCLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0QsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7OEdBdlJRLDJCQUEyQjtrSEFBM0IsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUR2QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUZpbHRlciwgU2VhcmNoUmVxdWVzdE1vZGVsIH0gZnJvbSAnQHVwZGV2cy9zZGsvc3RvcmVzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIG1hbmFnZSB0aGUgY3VycmVudCBzZWFyY2ggcmVxdWVzdCBzdGF0ZSBhY3Jvc3MgdGFibGUgY29tcG9uZW50cy5cbiAqIFVzZXMgQW5ndWxhciBzaWduYWxzIGZvciByZWFjdGl2ZSBzdGF0ZSBtYW5hZ2VtZW50LCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgcHJvcCBkcmlsbGluZy5cbiAqIFNob3VsZCBiZSBwcm92aWRlZCBhdCB0aGUgdGFibGUgY29tcG9uZW50IGxldmVsIHNvIGVhY2ggdGFibGUgaW5zdGFuY2UgaGFzIGl0cyBvd24gc3RhdGUuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDdXJyZW50U2VhcmNoUmVxdWVzdFNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaFJlcXVlc3QgPSBzaWduYWw8U2VhcmNoUmVxdWVzdE1vZGVsPih7fSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaXNTZWFyY2hpbmcgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hhc0NoYW5nZXMgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogUmVhZC1vbmx5IHNpZ25hbCBmb3IgdGhlIGN1cnJlbnQgc2VhcmNoIHJlcXVlc3RcbiAgICAgKi9cbiAgICByZWFkb25seSBzZWFyY2hSZXF1ZXN0ID0gdGhpcy5fc2VhcmNoUmVxdWVzdC5hc1JlYWRvbmx5KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZWFkLW9ubHkgc2lnbmFsIGZvciB0aGUgc2VhcmNoaW5nIHN0YXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaXNTZWFyY2hpbmcgPSB0aGlzLl9pc1NlYXJjaGluZy5hc1JlYWRvbmx5KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZWFkLW9ubHkgc2lnbmFsIGluZGljYXRpbmcgaWYgdGhlIHNlYXJjaCByZXF1ZXN0IGhhcyBjaGFuZ2VkIGZyb20gZGVmYXVsdFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhhc0NoYW5nZXMgPSB0aGlzLl9oYXNDaGFuZ2VzLmFzUmVhZG9ubHkoKTtcblxuICAgIC8qKlxuICAgICAqIFN1YmplY3QgdG8gdHJpZ2dlciBzZWFyY2ggb3BlcmF0aW9uc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlYXJjaFJlcXVlc3RTdWJqZWN0ID0gbmV3IFN1YmplY3Q8U2VhcmNoUmVxdWVzdE1vZGVsPigpO1xuXG4gICAgLyoqXG4gICAgICogQ291bnQgb2YgYWN0aXZlIGZpbHRlcnMgKG5vbi1oaWRkZW4pXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWN0aXZlRmlsdGVyQ291bnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlYXJjaFJlcXVlc3QoKS5maWx0ZXJzPy5maWx0ZXIoZiA9PiAhZi5pc0hpZGRlbikubGVuZ3RoIHx8IDApO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgYW55IGFjdGl2ZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcmVhZG9ubHkgaGFzRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnNlYXJjaFJlcXVlc3QoKS5maWx0ZXJzPy5sZW5ndGggfHwgMCkgPiAwKTtcblxuICAgIC8qKlxuICAgICAqIENvdW50IG9mIHZpc2libGUgKG5vbi1oaWRkZW4pIGZpbHRlcnNcbiAgICAgKi9cbiAgICByZWFkb25seSB2aXNpYmxlRmlsdGVyQ291bnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlYXJjaFJlcXVlc3QoKS5maWx0ZXJzPy5maWx0ZXIoZiA9PiAhZi5pc0hpZGRlbikubGVuZ3RoIHx8IDApO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSdzIGEgc2VhcmNoIGRlc2NyaXB0aW9uL3RleHQgcXVlcnlcbiAgICAgKi9cbiAgICByZWFkb25seSBoYXNEZXNjcmlwdGlvbiA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5zZWFyY2hSZXF1ZXN0KCkuZGVzY3JpcHRpb24gJiYgdGhpcy5zZWFyY2hSZXF1ZXN0KCkuZGVzY3JpcHRpb24hLmxlbmd0aCA+IDApO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgYW55IHNvcnRpbmdzIGFwcGxpZWRcbiAgICAgKi9cbiAgICByZWFkb25seSBoYXNTb3J0aW5nID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuc2VhcmNoUmVxdWVzdCgpLnNvcnRpbmdzPy5sZW5ndGggfHwgMCkgPiAwKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNvcnRpbmcgKGZpcnN0IG9uZSBpZiBtdWx0aXBsZSBleGlzdClcbiAgICAgKi9cbiAgICByZWFkb25seSBjdXJyZW50U29ydGluZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGFzU29ydGluZygpID8gdGhpcy5zZWFyY2hSZXF1ZXN0KCkuc29ydGluZ3MhWzBdIDogdW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYW55IHNlYXJjaCBjcml0ZXJpYSBpcyBhY3RpdmUgKGZpbHRlcnMsIGRlc2NyaXB0aW9uLCBvciBzb3J0aW5nKVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhhc0FueVNlYXJjaENyaXRlcmlhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oYXNGaWx0ZXJzKCkgfHwgdGhpcy5oYXNEZXNjcmlwdGlvbigpIHx8IHRoaXMuaGFzU29ydGluZygpKTtcblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGFnZSBudW1iZXIgKDEtaW5kZXhlZCBmb3IgZGlzcGxheSlcbiAgICAgKi9cbiAgICByZWFkb25seSBjdXJyZW50UGFnZU51bWJlciA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnNlYXJjaFJlcXVlc3QoKS5wYWdlSW5kZXggfHwgMCkgKyAxKTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgcGFnaW5hdGlvbiBpcyBjb25maWd1cmVkXG4gICAgICovXG4gICAgcmVhZG9ubHkgaGFzUGFnaW5hdGlvbiA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5zZWFyY2hSZXF1ZXN0KCkucGFnZVNpemUgJiYgdGhpcy5zZWFyY2hSZXF1ZXN0KCkucGFnZVNpemUhID4gMCk7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBlbnRpcmUgc2VhcmNoIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgbmV3IHNlYXJjaCByZXF1ZXN0XG4gICAgICovXG4gICAgdXBkYXRlU2VhcmNoUmVxdWVzdChyZXF1ZXN0OiBTZWFyY2hSZXF1ZXN0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNSZXF1ZXN0ID0gdGhpcy5fc2VhcmNoUmVxdWVzdCgpO1xuICAgICAgICB0aGlzLl9zZWFyY2hSZXF1ZXN0LnNldChyZXF1ZXN0KTtcblxuICAgICAgICAvLyBPbmx5IG1hcmsgYXMgY2hhbmdlZCBpZiB0aGUgbmV3IHJlcXVlc3QgaXMgYWN0dWFsbHkgZGlmZmVyZW50IGZyb20gcHJldmlvdXNcbiAgICAgICAgaWYgKCF0aGlzLmFyZVNlYXJjaFJlcXVlc3RzRXF1YWwocHJldmlvdXNSZXF1ZXN0LCByZXF1ZXN0KSkge1xuICAgICAgICAgICAgdGhpcy5faGFzQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJ0aWFsbHkgdXBkYXRlcyB0aGUgc2VhcmNoIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcGFydGlhbCBQYXJ0aWFsIHNlYXJjaCByZXF1ZXN0IHByb3BlcnRpZXMgdG8gdXBkYXRlXG4gICAgICovXG4gICAgcGF0Y2hTZWFyY2hSZXF1ZXN0KHBhcnRpYWw6IFBhcnRpYWw8U2VhcmNoUmVxdWVzdE1vZGVsPik6IHZvaWQge1xuICAgICAgICBjb25zdCBwcmV2aW91c1JlcXVlc3QgPSB0aGlzLl9zZWFyY2hSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IG5ld1JlcXVlc3QgPSB7IC4uLnByZXZpb3VzUmVxdWVzdCwgLi4ucGFydGlhbCB9O1xuICAgICAgICB0aGlzLl9zZWFyY2hSZXF1ZXN0LnNldChuZXdSZXF1ZXN0KTtcblxuICAgICAgICAvLyBPbmx5IG1hcmsgYXMgY2hhbmdlZCBpZiB0aGUgcGF0Y2ggYWN0dWFsbHkgY2hhbmdlZCBzb21ldGhpbmdcbiAgICAgICAgaWYgKCF0aGlzLmFyZVNlYXJjaFJlcXVlc3RzRXF1YWwocHJldmlvdXNSZXF1ZXN0LCBuZXdSZXF1ZXN0KSkge1xuICAgICAgICAgICAgdGhpcy5faGFzQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWFyY2hpbmcgc3RhdGVcbiAgICAgKiBAcGFyYW0gaXNTZWFyY2hpbmcgV2hldGhlciBhIHNlYXJjaCBpcyBpbiBwcm9ncmVzc1xuICAgICAqL1xuICAgIHNldFNlYXJjaGluZyhpc1NlYXJjaGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc1NlYXJjaGluZy5zZXQoaXNTZWFyY2hpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgc2VhcmNoIHJlcXVlc3QgdG8gZGVmYXVsdCBzdGF0ZVxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWFyY2hSZXF1ZXN0LnNldCh7fSk7XG4gICAgICAgIHRoaXMuX2lzU2VhcmNoaW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuX2hhc0NoYW5nZXMuc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBhIHNlYXJjaCBvcGVyYXRpb24gYnkgZW1pdHRpbmcgb24gdGhlIHNlYXJjaFJlcXVlc3RTdWJqZWN0XG4gICAgICovXG4gICAgdHJpZ2dlclNlYXJjaCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2hSZXF1ZXN0U3ViamVjdC5uZXh0KHRoaXMuX3NlYXJjaFJlcXVlc3QoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgc2V0cyB0aGUgaGFzQ2hhbmdlcyBmbGFnXG4gICAgICogVXNlZnVsIGZvciBjaGFuZ2VzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIHNlYXJjaCByZXF1ZXN0IGJ1dCBzaG91bGQgZW5hYmxlIFNhdmUgVmlld1xuICAgICAqIChlLmcuLCBjb2x1bW4gdmlzaWJpbGl0eSBjaGFuZ2VzKVxuICAgICAqIEBwYXJhbSBoYXNDaGFuZ2VzIFdoZXRoZXIgdGhlcmUgYXJlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBzZXRIYXNDaGFuZ2VzKGhhc0NoYW5nZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFzQ2hhbmdlcy5zZXQoaGFzQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZpbHRlciB0byB0aGUgc2VhcmNoIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYWRkXG4gICAgICovXG4gICAgYWRkRmlsdGVyKGZpbHRlcjogQmFzZUZpbHRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuc2VhcmNoUmVxdWVzdCgpLmZpbHRlcnMgfHwgW107XG4gICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgZmlsdGVyczogWy4uLmN1cnJlbnRGaWx0ZXJzLCBmaWx0ZXJdIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBmaWx0ZXIgYnkgbmFtZVxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXIgY29sdW1uIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHJlbW92ZUZpbHRlcihmaWx0ZXJOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudEZpbHRlcnMgPSB0aGlzLnNlYXJjaFJlcXVlc3QoKS5maWx0ZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLnBhdGNoU2VhcmNoUmVxdWVzdCh7IGZpbHRlcnM6IGN1cnJlbnRGaWx0ZXJzLmZpbHRlcihmID0+IGYuY29sdW1uICE9PSBmaWx0ZXJOYW1lKSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgZmlsdGVyIGJ5IGluZGV4XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZmlsdGVyIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHJlbW92ZUZpbHRlckJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuc2VhcmNoUmVxdWVzdCgpLmZpbHRlcnMgfHwgW107XG4gICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgZmlsdGVyczogY3VycmVudEZpbHRlcnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHNwZWNpZmljIGZpbHRlciBieSBjb2x1bW4gbmFtZVxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lIFRoZSBjb2x1bW4gbmFtZSBvZiB0aGUgZmlsdGVyIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBuZXdEYXRhIFBhcnRpYWwgZmlsdGVyIHByb3BlcnRpZXMgdG8gdXBkYXRlXG4gICAgICovXG4gICAgdXBkYXRlRmlsdGVyKGNvbHVtbk5hbWU6IHN0cmluZywgbmV3RGF0YTogUGFydGlhbDxCYXNlRmlsdGVyPik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuc2VhcmNoUmVxdWVzdCgpLmZpbHRlcnMgfHwgW107XG4gICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgZmlsdGVyczogY3VycmVudEZpbHRlcnMubWFwKGYgPT4gZi5jb2x1bW4gPT09IGNvbHVtbk5hbWUgPyB7IC4uLmYsIC4uLm5ld0RhdGEgfSBhcyBhbnkgOiBmKSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGEgZmlsdGVyIGJ5IGl0cyBpbmRleCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpbHRlciB0byB1cGRhdGVcbiAgICAgKiBAcGFyYW0gbmV3RGF0YSBQYXJ0aWFsIGZpbHRlciBwcm9wZXJ0aWVzIHRvIHVwZGF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZUZpbHRlckJ5SW5kZXgoaW5kZXg6IG51bWJlciwgbmV3RGF0YTogUGFydGlhbDxCYXNlRmlsdGVyPik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuc2VhcmNoUmVxdWVzdCgpLmZpbHRlcnMgfHwgW107XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBjdXJyZW50RmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgZmlsdGVyczogY3VycmVudEZpbHRlcnMubWFwKChmLCBpKSA9PiBpID09PSBpbmRleCA/IHsgLi4uZiwgLi4ubmV3RGF0YSB9IGFzIGFueSA6IGYpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBmaWx0ZXJzXG4gICAgICovXG4gICAgY2xlYXJGaWx0ZXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoU2VhcmNoUmVxdWVzdCh7IGZpbHRlcnM6IFtdIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNvcnRpbmcgKHJlcGxhY2VzIGV4aXN0aW5nIHNvcnRpbmdzKVxuICAgICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBuYW1lIHRvIHNvcnQgYnlcbiAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBzb3J0IGRpcmVjdGlvblxuICAgICAqL1xuICAgIHNldFNvcnRpbmcoY29sdW1uOiBzdHJpbmcsIGRpcmVjdGlvbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgc29ydGluZ3M6IFt7IGNvbHVtbiwgZGlyZWN0aW9uIH1dIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgc29ydGluZ1xuICAgICAqL1xuICAgIGNsZWFyU29ydGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYXRjaFNlYXJjaFJlcXVlc3QoeyBzb3J0aW5nczogW10gfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2VhcmNoIGRlc2NyaXB0aW9uL3RleHQgcXVlcnlcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlYXJjaCB0ZXh0XG4gICAgICovXG4gICAgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoU2VhcmNoUmVxdWVzdCh7IGRlc2NyaXB0aW9uIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgc2VhcmNoIGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgY2xlYXJEZXNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYXRjaFNlYXJjaFJlcXVlc3QoeyBkZXNjcmlwdGlvbjogJycgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIEFMTCBzZWFyY2ggY3JpdGVyaWEgKGZpbHRlcnMsIGRlc2NyaXB0aW9uLCBzb3J0aW5nKVxuICAgICAqIE5vdGU6IERvZXMgbm90IHJlc2V0IHBhZ2luYXRpb24gLSB1c2UgcmVzZXQoKSBmb3IgdGhhdFxuICAgICAqL1xuICAgIGNsZWFyQWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoU2VhcmNoUmVxdWVzdCh7IGZpbHRlcnM6IFtdLCBkZXNjcmlwdGlvbjogJycsIHNvcnRpbmdzOiBbXSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHNlYXJjaCBjcml0ZXJpYSBleGNlcHQgcGFnaW5hdGlvblxuICAgICAqIFVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHJlc2V0IHNlYXJjaCBidXQgbWFpbnRhaW4gY3VycmVudCBwYWdlXG4gICAgICovXG4gICAgY2xlYXJBbGxFeGNlcHRQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVlcCBjb21wYXJpc29uIG9mIHR3byBzZWFyY2ggcmVxdWVzdHNcbiAgICAgKiBAcGFyYW0gYSBGaXJzdCBzZWFyY2ggcmVxdWVzdFxuICAgICAqIEBwYXJhbSBiIFNlY29uZCBzZWFyY2ggcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhleSBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXJlU2VhcmNoUmVxdWVzdHNFcXVhbChhOiBTZWFyY2hSZXF1ZXN0TW9kZWwsIGI6IFNlYXJjaFJlcXVlc3RNb2RlbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKGEuZGVzY3JpcHRpb24gfHwgJycpICE9PSAoYi5kZXNjcmlwdGlvbiB8fCAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFGaWx0ZXJzID0gYS5maWx0ZXJzIHx8IFtdO1xuICAgICAgICBjb25zdCBiRmlsdGVycyA9IGIuZmlsdGVycyB8fCBbXTtcblxuICAgICAgICBpZiAoYUZpbHRlcnMubGVuZ3RoICE9PSBiRmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhRmlsdGVyc1tpXSkgIT09IEpTT04uc3RyaW5naWZ5KGJGaWx0ZXJzW2ldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFTb3J0aW5ncyA9IGEuc29ydGluZ3MgfHwgW107XG4gICAgICAgIGNvbnN0IGJTb3J0aW5ncyA9IGIuc29ydGluZ3MgfHwgW107XG5cbiAgICAgICAgaWYgKGFTb3J0aW5ncy5sZW5ndGggIT09IGJTb3J0aW5ncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYVNvcnRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYVNvcnRpbmdzW2ldKSAhPT0gSlNPTi5zdHJpbmdpZnkoYlNvcnRpbmdzW2ldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhLnBhZ2VTaXplICE9PSBiLnBhZ2VTaXplIHx8IGEucGFnZUluZGV4ICE9PSBiLnBhZ2VJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIl19