@trudb/tru-common-lib 0.0.177 → 0.0.181
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/esm2020/lib/components/confirm-dialog/tru-confirm-dialog-module.mjs +19 -0
- package/esm2020/lib/components/confirm-dialog/tru-confirm-dialog.mjs +36 -0
- package/esm2020/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.mjs +19 -0
- package/esm2020/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +109 -0
- package/esm2020/lib/components/desktop/menubar/tru-desktop-menubar-module.mjs +44 -0
- package/esm2020/lib/components/desktop/menubar/tru-desktop-menubar.mjs +29 -0
- package/esm2020/lib/components/desktop/services/tru-desktop-service.mjs +136 -0
- package/esm2020/lib/components/desktop/statusbar/tru-desktop-statusbar-module.mjs +19 -0
- package/esm2020/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +18 -0
- package/esm2020/lib/components/desktop/taskbar/tru-desktop-taskbar-module.mjs +21 -0
- package/esm2020/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +40 -0
- package/esm2020/lib/components/desktop/tru-desktop-module.mjs +72 -0
- package/esm2020/lib/components/desktop/tru-desktop.mjs +703 -0
- package/esm2020/lib/components/desktop/view/tru-desktop-view-module.mjs +19 -0
- package/esm2020/lib/components/desktop/view/tru-desktop-view.mjs +25 -0
- package/esm2020/lib/components/desktop/viewport/tru-desktop-viewport-module.mjs +20 -0
- package/esm2020/lib/components/desktop/viewport/tru-desktop-viewport.mjs +109 -0
- package/esm2020/lib/components/desktop/window/tru-desktop-window-module.mjs +58 -0
- package/esm2020/lib/components/desktop/window/tru-desktop-window.mjs +449 -0
- package/esm2020/lib/components/export-dialog/tru-export-dialog-module.mjs +20 -0
- package/esm2020/lib/components/export-dialog/tru-export-dialog.mjs +57 -0
- package/esm2020/lib/components/toolbar/button/tru-toolbar-button-module.mjs +32 -0
- package/esm2020/lib/components/toolbar/button/tru-toolbar-button.mjs +35 -0
- package/esm2020/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.mjs +40 -0
- package/esm2020/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +24 -0
- package/esm2020/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.mjs +32 -0
- package/esm2020/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +42 -0
- package/esm2020/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.mjs +19 -0
- package/esm2020/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +16 -0
- package/esm2020/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.mjs +19 -0
- package/esm2020/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +26 -0
- package/esm2020/lib/components/toolbar/menu/tru-toolbar-menu-module.mjs +32 -0
- package/esm2020/lib/components/toolbar/menu/tru-toolbar-menu.mjs +33 -0
- package/esm2020/lib/components/toolbar/separator/tru-toolbar-separator-module.mjs +19 -0
- package/esm2020/lib/components/toolbar/separator/tru-toolbar-separator.mjs +12 -0
- package/esm2020/lib/components/toolbar/text/tru-toolbar-text-module.mjs +32 -0
- package/esm2020/lib/components/toolbar/text/tru-toolbar-text.mjs +28 -0
- package/esm2020/lib/components/toolbar/tru-toolbar-module.mjs +66 -0
- package/esm2020/lib/components/toolbar/tru-toolbar.mjs +21 -0
- package/esm2020/lib/material.module.mjs +192 -0
- package/esm2020/lib/services/tru-app-environment.mjs +75 -0
- package/esm2020/lib/services/tru-breeze-context-factory.mjs +71 -0
- package/esm2020/lib/services/tru-data-context.mjs +207 -0
- package/esm2020/lib/services/tru-entity-accessor.mjs +188 -0
- package/esm2020/lib/services/tru-predicate-map.mjs +11 -0
- package/esm2020/lib/services/tru-search-group-event-handler.mjs +1 -1
- package/esm2020/lib/services/tru-text-manager.mjs +134 -0
- package/esm2020/lib/services/tru-ui-notification.mjs +90 -0
- package/esm2020/lib/services/tru-user.mjs +54 -0
- package/esm2020/lib/tru-common-module.mjs +1 -1
- package/esm2020/public-api.mjs +33 -2
- package/fesm2015/trudb-tru-common-lib.mjs +3203 -65
- package/fesm2015/trudb-tru-common-lib.mjs.map +1 -1
- package/fesm2020/trudb-tru-common-lib.mjs +3197 -65
- package/fesm2020/trudb-tru-common-lib.mjs.map +1 -1
- package/lib/components/confirm-dialog/tru-confirm-dialog-module.d.ts +9 -0
- package/lib/components/confirm-dialog/tru-confirm-dialog.d.ts +20 -0
- package/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.d.ts +9 -0
- package/lib/components/desktop/directives/resizable/tru-desktop-resizable.d.ts +32 -0
- package/lib/components/desktop/menubar/tru-desktop-menubar-module.d.ts +14 -0
- package/lib/components/desktop/menubar/tru-desktop-menubar.d.ts +12 -0
- package/lib/components/desktop/services/tru-desktop-service.d.ts +110 -0
- package/lib/components/desktop/statusbar/tru-desktop-statusbar-module.d.ts +9 -0
- package/lib/components/desktop/statusbar/tru-desktop-statusbar.d.ts +10 -0
- package/lib/components/desktop/taskbar/tru-desktop-taskbar-module.d.ts +11 -0
- package/lib/components/desktop/taskbar/tru-desktop-taskbar.d.ts +15 -0
- package/lib/components/desktop/tru-desktop-module.d.ts +20 -0
- package/lib/components/desktop/tru-desktop.d.ts +334 -0
- package/lib/components/desktop/view/tru-desktop-view-module.d.ts +9 -0
- package/lib/components/desktop/view/tru-desktop-view.d.ts +13 -0
- package/lib/components/desktop/viewport/tru-desktop-viewport-module.d.ts +10 -0
- package/lib/components/desktop/viewport/tru-desktop-viewport.d.ts +46 -0
- package/lib/components/desktop/window/tru-desktop-window-module.d.ts +17 -0
- package/lib/components/desktop/window/tru-desktop-window.d.ts +184 -0
- package/lib/components/export-dialog/tru-export-dialog-module.d.ts +10 -0
- package/lib/components/export-dialog/tru-export-dialog.d.ts +26 -0
- package/lib/components/toolbar/button/tru-toolbar-button-module.d.ts +11 -0
- package/lib/components/toolbar/button/tru-toolbar-button.d.ts +14 -0
- package/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.d.ts +13 -0
- package/lib/components/toolbar/context-filter/tru-toolbar-context-filter.d.ts +11 -0
- package/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.d.ts +11 -0
- package/lib/components/toolbar/dropdown/tru-toolbar-dropdown.d.ts +18 -0
- package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.d.ts +9 -0
- package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.d.ts +7 -0
- package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.d.ts +9 -0
- package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.d.ts +8 -0
- package/lib/components/toolbar/menu/tru-toolbar-menu-module.d.ts +11 -0
- package/lib/components/toolbar/menu/tru-toolbar-menu.d.ts +10 -0
- package/lib/components/toolbar/separator/tru-toolbar-separator-module.d.ts +9 -0
- package/lib/components/toolbar/separator/tru-toolbar-separator.d.ts +6 -0
- package/lib/components/toolbar/text/tru-toolbar-text-module.d.ts +11 -0
- package/lib/components/toolbar/text/tru-toolbar-text.d.ts +12 -0
- package/lib/components/toolbar/tru-toolbar-module.d.ts +15 -0
- package/lib/components/toolbar/tru-toolbar.d.ts +13 -0
- package/lib/material.module.d.ts +50 -0
- package/lib/services/tru-app-environment.d.ts +48 -0
- package/lib/services/tru-breeze-context-factory.d.ts +30 -0
- package/lib/services/tru-data-context.d.ts +32 -0
- package/lib/services/tru-entity-accessor.d.ts +41 -0
- package/lib/services/tru-predicate-map.d.ts +6 -0
- package/lib/services/tru-text-manager.d.ts +68 -0
- package/lib/services/tru-ui-notification.d.ts +35 -0
- package/lib/services/tru-user.d.ts +21 -0
- package/package.json +1 -1
- package/public-api.d.ts +29 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { EntityState } from "breeze-client";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./tru-breeze-context-factory";
|
|
5
|
+
import * as i2 from "./tru-app-environment";
|
|
6
|
+
import * as i3 from "./tru-entity-accessor";
|
|
7
|
+
import * as i4 from "./tru-ui-notification";
|
|
8
|
+
export class TruDataContext {
|
|
9
|
+
constructor(breezeContextFactory, appEnvironment, entityAccessor, uiNotification) {
|
|
10
|
+
this.breezeContextFactory = breezeContextFactory;
|
|
11
|
+
this.appEnvironment = appEnvironment;
|
|
12
|
+
this.entityAccessor = entityAccessor;
|
|
13
|
+
this.uiNotification = uiNotification;
|
|
14
|
+
this._pendingDeleteEntities = [];
|
|
15
|
+
this._pendingCascadeDeleteEntities = [];
|
|
16
|
+
this.getValidationErrors = (entities = null) => {
|
|
17
|
+
entities = entities || this.entityManager.getChanges();
|
|
18
|
+
var errorsPerEntity = entities.map((entity) => {
|
|
19
|
+
var errors = entity.entityAspect.getValidationErrors();
|
|
20
|
+
errors = errors.map((err) => {
|
|
21
|
+
return {
|
|
22
|
+
entity: entity,
|
|
23
|
+
errorMessage: err.errorMessage,
|
|
24
|
+
property: err.property
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
return errors;
|
|
28
|
+
});
|
|
29
|
+
return [].concat.apply([], errorsPerEntity);
|
|
30
|
+
};
|
|
31
|
+
this.formatValidationErrors = (entities = null) => {
|
|
32
|
+
var errors = this.getValidationErrors(entities);
|
|
33
|
+
return errors.map((e) => {
|
|
34
|
+
if (e.propertyName) {
|
|
35
|
+
return e.entity.entityType.defaultResourceName + '.' + e.propertyName + ': ' + e.errorMessage;
|
|
36
|
+
}
|
|
37
|
+
var mergeData = JSON.parse(e.entity.Merge_Data);
|
|
38
|
+
if (mergeData &&
|
|
39
|
+
mergeData.constructor === Object &&
|
|
40
|
+
Object.entries(mergeData).length > 0 &&
|
|
41
|
+
mergeData[e.property.name]) {
|
|
42
|
+
return mergeData[e.property.name].modifiedBy + ' changed ' + e.property.name + ' to ' + mergeData[e.property.name].value + '. Accept or Decline the change. ';
|
|
43
|
+
}
|
|
44
|
+
var propertyName = e.property.name ? e.property.name : '[Unknown Property]';
|
|
45
|
+
return e.entity.entityType.defaultResourceName + '.' + propertyName + ': has invalid data.';
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
this.findCachedCascadeDeleteDescendants = (entity) => {
|
|
49
|
+
let descendants = [];
|
|
50
|
+
let type = entity.entityType;
|
|
51
|
+
let typeName = type.defaultResourceName;
|
|
52
|
+
let entityChildrenNames = JSON.parse(JSON.stringify('Replace with: ModelNavigationProperties.value'))[typeName];
|
|
53
|
+
Object.entries(entityChildrenNames)
|
|
54
|
+
.forEach(([k, v]) => {
|
|
55
|
+
let property = entity[k];
|
|
56
|
+
property.forEach((child) => {
|
|
57
|
+
if (typeof v === 'object' && v.doesCascadeDelete && child.entityAspect.entityState !== EntityState.Added) {
|
|
58
|
+
throw new Error('Delete of selected item is not possible due to related child that is not setup for cascade delete. Delete children items first.');
|
|
59
|
+
}
|
|
60
|
+
descendants = descendants.concat(this.findCachedCascadeDeleteDescendants(child));
|
|
61
|
+
});
|
|
62
|
+
descendants = property.concat(descendants);
|
|
63
|
+
});
|
|
64
|
+
return descendants;
|
|
65
|
+
};
|
|
66
|
+
this.markCachedDescendantsForDelete = (entities) => {
|
|
67
|
+
var cascadeDeleteDescendantsPerEntity = entities.map((entity) => { return this.findCachedCascadeDeleteDescendants(entity); }, entities);
|
|
68
|
+
var cascadeDeleteDescendants = cascadeDeleteDescendantsPerEntity.reduce((memo, i) => { return memo.concat(i); });
|
|
69
|
+
cascadeDeleteDescendants.forEach((entity) => { this.entityManager.detachEntity(entity); });
|
|
70
|
+
this._pendingDeleteEntities = this._pendingDeleteEntities.concat(entities);
|
|
71
|
+
let combined = this._pendingCascadeDeleteEntities.concat(cascadeDeleteDescendants);
|
|
72
|
+
this._pendingCascadeDeleteEntities = combined.filter((n, i) => combined.indexOf(n) === i);
|
|
73
|
+
};
|
|
74
|
+
this.markForDelete = (entities) => {
|
|
75
|
+
if (entities.length > 0) {
|
|
76
|
+
this.markCachedDescendantsForDelete(entities);
|
|
77
|
+
entities.forEach((entity) => {
|
|
78
|
+
entity.entityAspect.setDeleted();
|
|
79
|
+
//entity._associatedDataCached = false;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
this.hasChanges = (entityTypes = []) => {
|
|
84
|
+
if (entityTypes.length)
|
|
85
|
+
return this._breezeContext.entityManager.getChanges(entityTypes);
|
|
86
|
+
return this._breezeContext.entityManager.getChanges();
|
|
87
|
+
};
|
|
88
|
+
this.entityAccess = () => {
|
|
89
|
+
return this.entityAccessor;
|
|
90
|
+
};
|
|
91
|
+
this.exportCahce = () => {
|
|
92
|
+
console.log(this._breezeContext.entityManager.exportEntities());
|
|
93
|
+
};
|
|
94
|
+
this.save = (entities = null, deleteOperation = false) => {
|
|
95
|
+
return new Promise((resolve, reject) => {
|
|
96
|
+
if (this.appEnvironment.isSaving) {
|
|
97
|
+
this.uiNotification.error(this.appEnvironment.msgSaveInProgress);
|
|
98
|
+
resolve();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
var validationErrorMessages = this.formatValidationErrors(entities);
|
|
102
|
+
if (validationErrorMessages.length > 0) {
|
|
103
|
+
this.uiNotification.error(this.appEnvironment.msgInvalidData, validationErrorMessages);
|
|
104
|
+
resolve();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!this.hasChanges().length) {
|
|
108
|
+
this.uiNotification.warning(this.appEnvironment.msgNoChangesToSave);
|
|
109
|
+
resolve();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.appEnvironment.isSaving = true;
|
|
113
|
+
this.entityManager.saveChanges().then(() => {
|
|
114
|
+
if (!deleteOperation) {
|
|
115
|
+
this.uiNotification.success(this.appEnvironment.msgSaveSuccessful);
|
|
116
|
+
this.appEnvironment.saveComplete({ successful: true });
|
|
117
|
+
}
|
|
118
|
+
resolve();
|
|
119
|
+
}).catch((e) => {
|
|
120
|
+
this.appEnvironment.saveComplete({ successful: false });
|
|
121
|
+
reject(e);
|
|
122
|
+
}).finally(() => {
|
|
123
|
+
this.appEnvironment.isSaving = false;
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
this.revert = () => {
|
|
128
|
+
this.uiNotification.confirm('Confirm Action', 'Revert ' + this.hasChanges().length + ' changed record(s)?').then((confirm) => {
|
|
129
|
+
if (confirm) {
|
|
130
|
+
this.entityManager.rejectChanges();
|
|
131
|
+
this.appEnvironment.revertComplete({ successful: true });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
this.revertWithoutPrompt = () => {
|
|
136
|
+
this.revert();
|
|
137
|
+
this.appEnvironment.revertComplete({ successful: true });
|
|
138
|
+
};
|
|
139
|
+
this.delete = (entities, confirmMsg, onSuccess = undefined) => {
|
|
140
|
+
var newEntities = [];
|
|
141
|
+
var existingEntities = [];
|
|
142
|
+
entities.forEach(function (e) {
|
|
143
|
+
if (e.entityAspect.entityState.isAdded())
|
|
144
|
+
newEntities.push(e);
|
|
145
|
+
else
|
|
146
|
+
existingEntities.push(e);
|
|
147
|
+
});
|
|
148
|
+
if (newEntities.length && existingEntities.length) {
|
|
149
|
+
this.uiNotification.warning(this.appEnvironment.msgCannotDeleteNewAndExistingRecords);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (existingEntities.length) {
|
|
153
|
+
if (this.hasChanges().length) {
|
|
154
|
+
this.uiNotification.warning(this.appEnvironment.msgDirtyPreventsDeleteExistingRecord);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
this.uiNotification.confirm('Confirm Action', confirmMsg).then((confirm) => {
|
|
159
|
+
if (confirm) {
|
|
160
|
+
if (newEntities.length) {
|
|
161
|
+
newEntities.forEach((entity) => {
|
|
162
|
+
entity.entityAspect.clearValidationErrors();
|
|
163
|
+
});
|
|
164
|
+
this.markForDelete(newEntities);
|
|
165
|
+
if (onSuccess)
|
|
166
|
+
onSuccess();
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
this.markForDelete(existingEntities);
|
|
171
|
+
}
|
|
172
|
+
catch (exception) {
|
|
173
|
+
this.uiNotification.error(exception.message);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
this.save(null, true).then(() => {
|
|
177
|
+
var entitiesDeleted = this._pendingDeleteEntities.concat(this._pendingCascadeDeleteEntities);
|
|
178
|
+
this.appEnvironment.deleteComplete({ successful: true, entities: entitiesDeleted });
|
|
179
|
+
if (entitiesDeleted.length) {
|
|
180
|
+
this._pendingCascadeDeleteEntities = [];
|
|
181
|
+
this._pendingDeleteEntities = [];
|
|
182
|
+
}
|
|
183
|
+
this.uiNotification.success(this.appEnvironment.msgDeleteSuccessful);
|
|
184
|
+
if (onSuccess)
|
|
185
|
+
onSuccess(true);
|
|
186
|
+
}).catch((error) => {
|
|
187
|
+
this.revert();
|
|
188
|
+
}).finally(() => { });
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
this._breezeContext = this.breezeContextFactory.createContext();
|
|
193
|
+
this.entityAccessor.context = this;
|
|
194
|
+
}
|
|
195
|
+
get breezeContext() {
|
|
196
|
+
return this._breezeContext;
|
|
197
|
+
}
|
|
198
|
+
get entityManager() {
|
|
199
|
+
return this._breezeContext.entityManager;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
TruDataContext.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TruDataContext, deps: [{ token: i1.TruBreezeContextFactory }, { token: i2.TruAppEnvironment }, { token: i3.TruEntityAccessor }, { token: i4.TruUiNotification }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
203
|
+
TruDataContext.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TruDataContext });
|
|
204
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TruDataContext, decorators: [{
|
|
205
|
+
type: Injectable
|
|
206
|
+
}], ctorParameters: function () { return [{ type: i1.TruBreezeContextFactory }, { type: i2.TruAppEnvironment }, { type: i3.TruEntityAccessor }, { type: i4.TruUiNotification }]; } });
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRhdGEtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvc2VydmljZXMvdHJ1LWRhdGEtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBVSxXQUFXLEVBQWMsTUFBTSxlQUFlLENBQUM7Ozs7OztBQU9oRSxNQUFNLE9BQU8sY0FBYztJQUt6QixZQUNVLG9CQUE2QyxFQUM3QyxjQUFpQyxFQUNqQyxjQUFpQyxFQUNqQyxjQUFpQztRQUhqQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXlCO1FBQzdDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBUG5DLDJCQUFzQixHQUFrQixFQUFFLENBQUM7UUFDM0Msa0NBQTZCLEdBQWtCLEVBQUUsQ0FBQztRQVlsRCx3QkFBbUIsR0FBRyxDQUFDLFdBQWlDLElBQUksRUFBRSxFQUFFO1lBQ3RFLFFBQVEsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2RCxJQUFJLGVBQWUsR0FBRyxRQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFPLEVBQUU7Z0JBQ2xELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdkQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQU8sRUFBRTtvQkFDcEMsT0FBTzt3QkFDTCxNQUFNLEVBQUUsTUFBTTt3QkFDZCxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVk7d0JBQzlCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtxQkFDdkIsQ0FBQTtnQkFD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Q29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEVudGl0eSwgRW50aXR5U3RhdGUsIEVudGl0eVR5cGUgfSBmcm9tIFwiYnJlZXplLWNsaWVudFwiO1xyXG5pbXBvcnQgeyBUcnVCcmVlemVDb250ZXh0RmFjdG9yeSwgVHJ1QnJlZXplQ29udGV4dCB9IGZyb20gJy4vdHJ1LWJyZWV6ZS1jb250ZXh0LWZhY3RvcnknO1xyXG5pbXBvcnQgeyBUcnVFbnRpdHlBY2Nlc3NvciB9IGZyb20gJy4vdHJ1LWVudGl0eS1hY2Nlc3Nvcic7XHJcbmltcG9ydCB7IFRydVVpTm90aWZpY2F0aW9uIH0gZnJvbSAnLi90cnUtdWktbm90aWZpY2F0aW9uJztcclxuaW1wb3J0IHsgVHJ1QXBwRW52aXJvbm1lbnQgfSBmcm9tICcuL3RydS1hcHAtZW52aXJvbm1lbnQnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVHJ1RGF0YUNvbnRleHQge1xyXG4gIHByaXZhdGUgX2JyZWV6ZUNvbnRleHQ6IFRydUJyZWV6ZUNvbnRleHQ7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0RlbGV0ZUVudGl0aWVzOiBBcnJheTxFbnRpdHk+ID0gW107XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0Nhc2NhZGVEZWxldGVFbnRpdGllczogQXJyYXk8RW50aXR5PiA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYnJlZXplQ29udGV4dEZhY3Rvcnk6IFRydUJyZWV6ZUNvbnRleHRGYWN0b3J5LFxyXG4gICAgcHJpdmF0ZSBhcHBFbnZpcm9ubWVudDogVHJ1QXBwRW52aXJvbm1lbnQsXHJcbiAgICBwcml2YXRlIGVudGl0eUFjY2Vzc29yOiBUcnVFbnRpdHlBY2Nlc3NvcixcclxuICAgIHByaXZhdGUgdWlOb3RpZmljYXRpb246IFRydVVpTm90aWZpY2F0aW9uXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9icmVlemVDb250ZXh0ID0gdGhpcy5icmVlemVDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KCk7XHJcbiAgICB0aGlzLmVudGl0eUFjY2Vzc29yLmNvbnRleHQgPSB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWYWxpZGF0aW9uRXJyb3JzID0gKGVudGl0aWVzOiBBcnJheTxFbnRpdHk+IHwgbnVsbCA9IG51bGwpID0+IHtcclxuICAgIGVudGl0aWVzID0gZW50aXRpZXMgfHwgdGhpcy5lbnRpdHlNYW5hZ2VyLmdldENoYW5nZXMoKTtcclxuICAgIHZhciBlcnJvcnNQZXJFbnRpdHkgPSBlbnRpdGllcyEubWFwKChlbnRpdHkpOiBhbnkgPT4ge1xyXG4gICAgICB2YXIgZXJyb3JzID0gZW50aXR5LmVudGl0eUFzcGVjdC5nZXRWYWxpZGF0aW9uRXJyb3JzKCk7XHJcbiAgICAgIGVycm9ycyA9IGVycm9ycy5tYXAoKGVycjogYW55KTogYW55ID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZW50aXR5OiBlbnRpdHksXHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5lcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICBwcm9wZXJ0eTogZXJyLnByb3BlcnR5XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgZXJyb3JzUGVyRW50aXR5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0VmFsaWRhdGlvbkVycm9ycyA9IChlbnRpdGllczogQXJyYXk8RW50aXR5PiB8IG51bGwgPSBudWxsKSA9PiB7XHJcbiAgICB2YXIgZXJyb3JzID0gdGhpcy5nZXRWYWxpZGF0aW9uRXJyb3JzKGVudGl0aWVzKTtcclxuICAgIHJldHVybiBlcnJvcnMubWFwKChlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGUucHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGUuZW50aXR5LmVudGl0eVR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSArICcuJyArIGUucHJvcGVydHlOYW1lICsgJzogJyArIGUuZXJyb3JNZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBtZXJnZURhdGEgPSBKU09OLnBhcnNlKGUuZW50aXR5Lk1lcmdlX0RhdGEpO1xyXG4gICAgICBpZiAobWVyZ2VEYXRhICYmXHJcbiAgICAgICAgbWVyZ2VEYXRhLmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiZcclxuICAgICAgICBPYmplY3QuZW50cmllcyhtZXJnZURhdGEpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICBtZXJnZURhdGFbZS5wcm9wZXJ0eS5uYW1lXSkge1xyXG4gICAgICAgIHJldHVybiBtZXJnZURhdGFbZS5wcm9wZXJ0eS5uYW1lXS5tb2RpZmllZEJ5ICsgJyBjaGFuZ2VkICcgKyBlLnByb3BlcnR5Lm5hbWUgKyAnIHRvICcgKyBtZXJnZURhdGFbZS5wcm9wZXJ0eS5uYW1lXS52YWx1ZSArICcuIEFjY2VwdCBvciBEZWNsaW5lIHRoZSBjaGFuZ2UuICdcclxuICAgICAgfVxyXG4gICAgICB2YXIgcHJvcGVydHlOYW1lID0gZS5wcm9wZXJ0eS5uYW1lID8gZS5wcm9wZXJ0eS5uYW1lIDogJ1tVbmtub3duIFByb3BlcnR5XSc7XHJcbiAgICAgIHJldHVybiBlLmVudGl0eS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWUgKyAnLicgKyBwcm9wZXJ0eU5hbWUgKyAnOiBoYXMgaW52YWxpZCBkYXRhLidcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5kQ2FjaGVkQ2FzY2FkZURlbGV0ZURlc2NlbmRhbnRzID0gKGVudGl0eTogRW50aXR5KTogQXJyYXk8RW50aXR5PiA9PiB7XHJcbiAgICBsZXQgZGVzY2VuZGFudHM6IEFycmF5PEVudGl0eT4gPSBbXTtcclxuICAgIHR5cGUga2V5T2ZFbnRpdHkgPSBrZXlvZiB0eXBlb2YgZW50aXR5O1xyXG4gICAgbGV0IHR5cGUgPSBlbnRpdHkuZW50aXR5VHlwZTtcclxuICAgIGxldCB0eXBlTmFtZSA9IHR5cGUuZGVmYXVsdFJlc291cmNlTmFtZTtcclxuICAgIGxldCBlbnRpdHlDaGlsZHJlbk5hbWVzOiBhbnkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KCdSZXBsYWNlIHdpdGg6IE1vZGVsTmF2aWdhdGlvblByb3BlcnRpZXMudmFsdWUnKSlbdHlwZU5hbWVdO1xyXG4gICAgT2JqZWN0LmVudHJpZXMoZW50aXR5Q2hpbGRyZW5OYW1lcylcclxuICAgICAgLmZvckVhY2goKFtrLCB2XTogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IHByb3BlcnR5ID0gZW50aXR5W2sgYXMga2V5T2ZFbnRpdHldIGFzIGFueTtcclxuICAgICAgICBwcm9wZXJ0eS5mb3JFYWNoKChjaGlsZDogRW50aXR5KSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYuZG9lc0Nhc2NhZGVEZWxldGUgJiYgY2hpbGQuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlICE9PSBFbnRpdHlTdGF0ZS5BZGRlZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlbGV0ZSBvZiBzZWxlY3RlZCBpdGVtIGlzIG5vdCBwb3NzaWJsZSBkdWUgdG8gcmVsYXRlZCBjaGlsZCB0aGF0IGlzIG5vdCBzZXR1cCBmb3IgY2FzY2FkZSBkZWxldGUuICBEZWxldGUgY2hpbGRyZW4gaXRlbXMgZmlyc3QuJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkZXNjZW5kYW50cyA9IGRlc2NlbmRhbnRzLmNvbmNhdCh0aGlzLmZpbmRDYWNoZWRDYXNjYWRlRGVsZXRlRGVzY2VuZGFudHMoY2hpbGQpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkZXNjZW5kYW50cyA9IHByb3BlcnR5LmNvbmNhdChkZXNjZW5kYW50cyk7XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXJrQ2FjaGVkRGVzY2VuZGFudHNGb3JEZWxldGUgPSAoZW50aXRpZXM6IEFycmF5PEVudGl0eT4pID0+IHtcclxuICAgIHZhciBjYXNjYWRlRGVsZXRlRGVzY2VuZGFudHNQZXJFbnRpdHkgPSBlbnRpdGllcy5tYXAoKGVudGl0eTogRW50aXR5KSA9PiB7IHJldHVybiB0aGlzLmZpbmRDYWNoZWRDYXNjYWRlRGVsZXRlRGVzY2VuZGFudHMoZW50aXR5KTsgfSwgZW50aXRpZXMpO1xyXG4gICAgdmFyIGNhc2NhZGVEZWxldGVEZXNjZW5kYW50cyA9IGNhc2NhZGVEZWxldGVEZXNjZW5kYW50c1BlckVudGl0eS5yZWR1Y2UoKG1lbW8sIGkpID0+IHsgcmV0dXJuIG1lbW8uY29uY2F0KGkpOyB9KTtcclxuICAgIGNhc2NhZGVEZWxldGVEZXNjZW5kYW50cy5mb3JFYWNoKChlbnRpdHk6IEVudGl0eSkgPT4geyB0aGlzLmVudGl0eU1hbmFnZXIuZGV0YWNoRW50aXR5KGVudGl0eSk7IH0pO1xyXG4gICAgdGhpcy5fcGVuZGluZ0RlbGV0ZUVudGl0aWVzID0gdGhpcy5fcGVuZGluZ0RlbGV0ZUVudGl0aWVzLmNvbmNhdChlbnRpdGllcyk7XHJcbiAgICBsZXQgY29tYmluZWQgPSB0aGlzLl9wZW5kaW5nQ2FzY2FkZURlbGV0ZUVudGl0aWVzLmNvbmNhdChjYXNjYWRlRGVsZXRlRGVzY2VuZGFudHMpO1xyXG4gICAgdGhpcy5fcGVuZGluZ0Nhc2NhZGVEZWxldGVFbnRpdGllcyA9IGNvbWJpbmVkLmZpbHRlcigobiwgaSkgPT4gY29tYmluZWQuaW5kZXhPZihuKSA9PT0gaSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcmtGb3JEZWxldGUgPSAoZW50aXRpZXM6IEFycmF5PEVudGl0eT4pID0+IHtcclxuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMubWFya0NhY2hlZERlc2NlbmRhbnRzRm9yRGVsZXRlKGVudGl0aWVzKTtcclxuICAgICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5OiBFbnRpdHkpID0+IHtcclxuICAgICAgICBlbnRpdHkuZW50aXR5QXNwZWN0LnNldERlbGV0ZWQoKTtcclxuICAgICAgICAvL2VudGl0eS5fYXNzb2NpYXRlZERhdGFDYWNoZWQgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYnJlZXplQ29udGV4dCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9icmVlemVDb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVudGl0eU1hbmFnZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYnJlZXplQ29udGV4dC5lbnRpdHlNYW5hZ2VyO1xyXG4gIH1cclxuXHJcbiAgaGFzQ2hhbmdlcyA9IChlbnRpdHlUeXBlczogQXJyYXk8RW50aXR5VHlwZT4gPSBbXSkgPT4ge1xyXG4gICAgaWYgKGVudGl0eVR5cGVzLmxlbmd0aClcclxuICAgICAgcmV0dXJuIHRoaXMuX2JyZWV6ZUNvbnRleHQuZW50aXR5TWFuYWdlci5nZXRDaGFuZ2VzKGVudGl0eVR5cGVzKTtcclxuICAgIHJldHVybiB0aGlzLl9icmVlemVDb250ZXh0LmVudGl0eU1hbmFnZXIuZ2V0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgZW50aXR5QWNjZXNzID0gKCk6IFRydUVudGl0eUFjY2Vzc29yID0+IHtcclxuICAgIHJldHVybiB0aGlzLmVudGl0eUFjY2Vzc29yO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0Q2FoY2UgPSAoKSA9PiB7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLl9icmVlemVDb250ZXh0LmVudGl0eU1hbmFnZXIuZXhwb3J0RW50aXRpZXMoKSk7XHJcbiAgfVxyXG5cclxuICBzYXZlID0gKFxyXG4gICAgZW50aXRpZXM6IEFycmF5PEVudGl0eT4gfCBudWxsID0gbnVsbCxcclxuICAgIGRlbGV0ZU9wZXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5hcHBFbnZpcm9ubWVudC5pc1NhdmluZykge1xyXG4gICAgICAgIHRoaXMudWlOb3RpZmljYXRpb24uZXJyb3IodGhpcy5hcHBFbnZpcm9ubWVudC5tc2dTYXZlSW5Qcm9ncmVzcyk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB2YXIgdmFsaWRhdGlvbkVycm9yTWVzc2FnZXMgPSB0aGlzLmZvcm1hdFZhbGlkYXRpb25FcnJvcnMoZW50aXRpZXMpO1xyXG4gICAgICBpZiAodmFsaWRhdGlvbkVycm9yTWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMudWlOb3RpZmljYXRpb24uZXJyb3IodGhpcy5hcHBFbnZpcm9ubWVudC5tc2dJbnZhbGlkRGF0YSwgdmFsaWRhdGlvbkVycm9yTWVzc2FnZXMpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzKCkubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi53YXJuaW5nKHRoaXMuYXBwRW52aXJvbm1lbnQubXNnTm9DaGFuZ2VzVG9TYXZlKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXBwRW52aXJvbm1lbnQuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLmVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXMoKS50aGVuKCgpID0+IHtcclxuICAgICAgICBpZiAoIWRlbGV0ZU9wZXJhdGlvbikge1xyXG4gICAgICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi5zdWNjZXNzKHRoaXMuYXBwRW52aXJvbm1lbnQubXNnU2F2ZVN1Y2Nlc3NmdWwpO1xyXG4gICAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5zYXZlQ29tcGxldGUoeyBzdWNjZXNzZnVsOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pLmNhdGNoKChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmFwcEVudmlyb25tZW50LnNhdmVDb21wbGV0ZSh7IHN1Y2Nlc3NmdWw6IGZhbHNlIH0pO1xyXG4gICAgICAgIHJlamVjdChlKTtcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV2ZXJ0ID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgdGhpcy51aU5vdGlmaWNhdGlvbi5jb25maXJtKCdDb25maXJtIEFjdGlvbicsICdSZXZlcnQgJyArIHRoaXMuaGFzQ2hhbmdlcygpLmxlbmd0aCArICcgY2hhbmdlZCByZWNvcmQocyk/JykudGhlbigoY29uZmlybTogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpZiAoY29uZmlybSkge1xyXG4gICAgICAgIHRoaXMuZW50aXR5TWFuYWdlci5yZWplY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5yZXZlcnRDb21wbGV0ZSh7IHN1Y2Nlc3NmdWw6IHRydWUgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV2ZXJ0V2l0aG91dFByb21wdCA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMucmV2ZXJ0KCk7XHJcbiAgICB0aGlzLmFwcEVudmlyb25tZW50LnJldmVydENvbXBsZXRlKHsgc3VjY2Vzc2Z1bDogdHJ1ZSB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZSA9IChcclxuICAgIGVudGl0aWVzOiBBcnJheTxFbnRpdHk+LFxyXG4gICAgY29uZmlybU1zZzogc3RyaW5nLFxyXG4gICAgb25TdWNjZXNzOiBGdW5jdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgdmFyIG5ld0VudGl0aWVzOiBBcnJheTxFbnRpdHk+ID0gW107XHJcbiAgICB2YXIgZXhpc3RpbmdFbnRpdGllczogQXJyYXk8RW50aXR5PiA9IFtdO1xyXG4gICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICBpZiAoZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNBZGRlZCgpKVxyXG4gICAgICAgIG5ld0VudGl0aWVzLnB1c2goZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBleGlzdGluZ0VudGl0aWVzLnB1c2goZSk7XHJcbiAgICB9KTtcclxuICAgIGlmIChuZXdFbnRpdGllcy5sZW5ndGggJiYgZXhpc3RpbmdFbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi53YXJuaW5nKHRoaXMuYXBwRW52aXJvbm1lbnQubXNnQ2Fubm90RGVsZXRlTmV3QW5kRXhpc3RpbmdSZWNvcmRzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGV4aXN0aW5nRW50aXRpZXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc0NoYW5nZXMoKS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLndhcm5pbmcodGhpcy5hcHBFbnZpcm9ubWVudC5tc2dEaXJ0eVByZXZlbnRzRGVsZXRlRXhpc3RpbmdSZWNvcmQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudWlOb3RpZmljYXRpb24uY29uZmlybSgnQ29uZmlybSBBY3Rpb24nLCBjb25maXJtTXNnKS50aGVuKChjb25maXJtOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGlmIChjb25maXJtKSB7XHJcbiAgICAgICAgaWYgKG5ld0VudGl0aWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbmV3RW50aXRpZXMuZm9yRWFjaCgoZW50aXR5OiBFbnRpdHkpID0+IHtcclxuICAgICAgICAgICAgZW50aXR5LmVudGl0eUFzcGVjdC5jbGVhclZhbGlkYXRpb25FcnJvcnMoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5tYXJrRm9yRGVsZXRlKG5ld0VudGl0aWVzKTtcclxuICAgICAgICAgIGlmIChvblN1Y2Nlc3MpIG9uU3VjY2VzcygpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5tYXJrRm9yRGVsZXRlKGV4aXN0aW5nRW50aXRpZXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbjogYW55KSB7XHJcbiAgICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLmVycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zYXZlKG51bGwsIHRydWUpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgdmFyIGVudGl0aWVzRGVsZXRlZCA9IHRoaXMuX3BlbmRpbmdEZWxldGVFbnRpdGllcy5jb25jYXQodGhpcy5fcGVuZGluZ0Nhc2NhZGVEZWxldGVFbnRpdGllcyk7XHJcbiAgICAgICAgICB0aGlzLmFwcEVudmlyb25tZW50LmRlbGV0ZUNvbXBsZXRlKHsgc3VjY2Vzc2Z1bDogdHJ1ZSwgZW50aXRpZXM6IGVudGl0aWVzRGVsZXRlZCB9KTtcclxuICAgICAgICAgIGlmIChlbnRpdGllc0RlbGV0ZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdDYXNjYWRlRGVsZXRlRW50aXRpZXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0RlbGV0ZUVudGl0aWVzID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLnN1Y2Nlc3ModGhpcy5hcHBFbnZpcm9ubWVudC5tc2dEZWxldGVTdWNjZXNzZnVsKTtcclxuICAgICAgICAgIGlmIChvblN1Y2Nlc3MpIG9uU3VjY2Vzcyh0cnVlKTtcclxuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMucmV2ZXJ0KCk7XHJcbiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7IH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { FetchStrategy } from "breeze-client";
|
|
3
|
+
import * as _ from "underscore";
|
|
4
|
+
import { defer, from, of } from 'rxjs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common/http";
|
|
7
|
+
import * as i2 from "./tru-ui-notification";
|
|
8
|
+
export class TruEntityAccessor {
|
|
9
|
+
constructor(http, uiNotification) {
|
|
10
|
+
this.http = http;
|
|
11
|
+
this.uiNotification = uiNotification;
|
|
12
|
+
this._maxRecordCount = 0;
|
|
13
|
+
this.getQueryServiceName = (entity) => {
|
|
14
|
+
return 'Query' + entity.name;
|
|
15
|
+
};
|
|
16
|
+
this.warnIfMaxRecords = (entities, entityName) => {
|
|
17
|
+
if (entities.length >= this.maxRecordCount)
|
|
18
|
+
this.uiNotification.warning('[' + entityName + '] has more records available than supported');
|
|
19
|
+
};
|
|
20
|
+
this.formatQueryChoices = (query, entities, pKeyName, hid = null) => {
|
|
21
|
+
if (query && query.orderByClause)
|
|
22
|
+
return _.map(entities, (entity) => { return { value: { $: entity[pKeyName] }, label: hid !== null ? hid : entity.HID }; });
|
|
23
|
+
else
|
|
24
|
+
return _.map(entities, (entity) => { return { value: { $: entity[pKeyName] }, label: hid !== null ? hid : entity.HID }; });
|
|
25
|
+
};
|
|
26
|
+
this.add = (entity, contextFilters = null) => {
|
|
27
|
+
let newEntity = this._entityManager.createEntity(entity.prototype.entityType);
|
|
28
|
+
return newEntity;
|
|
29
|
+
};
|
|
30
|
+
this.search = (entity, setupQuery = null, expands, global) => {
|
|
31
|
+
var query;
|
|
32
|
+
if (expands && expands.length) {
|
|
33
|
+
if (global)
|
|
34
|
+
query = this._breezeContext.createQuery(this.getQueryServiceName(entity)).expand(expands.join(', '));
|
|
35
|
+
else
|
|
36
|
+
query = this._breezeContext.createQuery(this.getQueryServiceName(entity)).expand(expands.join(', ')).top(this._maxRecordCount);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
if (global)
|
|
40
|
+
query = this._breezeContext.createQuery(this.getQueryServiceName(entity));
|
|
41
|
+
else
|
|
42
|
+
query = this._breezeContext.createQuery(this.getQueryServiceName(entity)).top(this._maxRecordCount);
|
|
43
|
+
}
|
|
44
|
+
if (setupQuery != null)
|
|
45
|
+
query = setupQuery(query);
|
|
46
|
+
return defer(() => from(this._entityManager.executeQuery(query).then((queryData) => {
|
|
47
|
+
if (!global)
|
|
48
|
+
this.warnIfMaxRecords(queryData.results, entity.name);
|
|
49
|
+
return queryData.results;
|
|
50
|
+
})));
|
|
51
|
+
};
|
|
52
|
+
this.searchCacheOnly = (entity, setupQuery = null, expands = null) => {
|
|
53
|
+
var query = this._breezeContext.createQuery(this.getQueryServiceName(entity));
|
|
54
|
+
if (setupQuery)
|
|
55
|
+
query = setupQuery(query);
|
|
56
|
+
return of(this._entityManager.executeQueryLocally(query));
|
|
57
|
+
};
|
|
58
|
+
this.searchCacheOnlySynchronously = (entity, setupQuery = null, expands = null) => {
|
|
59
|
+
var query = this._breezeContext.createQuery(this.getQueryServiceName(entity));
|
|
60
|
+
if (setupQuery)
|
|
61
|
+
query = setupQuery(query);
|
|
62
|
+
return this._entityManager.executeQueryLocally(query);
|
|
63
|
+
};
|
|
64
|
+
this.searchQueryChoices = (entity, setupQuery = null, hid = null, goToServer = false) => {
|
|
65
|
+
const pkeyName = entity.name + 'Ref';
|
|
66
|
+
let query = this._breezeContext.createQuery(this.getQueryServiceName(entity));
|
|
67
|
+
if (setupQuery)
|
|
68
|
+
query = setupQuery(query) ?? query;
|
|
69
|
+
if (goToServer) {
|
|
70
|
+
return defer(() => from(this._entityManager.executeQuery(query).then((queryData) => {
|
|
71
|
+
return this.formatQueryChoices(query, queryData.results, pkeyName, null);
|
|
72
|
+
})));
|
|
73
|
+
}
|
|
74
|
+
return of(this.formatQueryChoices(query, this._entityManager.executeQueryLocally(query), pkeyName, null));
|
|
75
|
+
};
|
|
76
|
+
this.getByRefCacheOnly = (entity, ref, includeDeleted = false) => {
|
|
77
|
+
if (!includeDeleted)
|
|
78
|
+
includeDeleted = false;
|
|
79
|
+
var queryOptions = this._entityManager.queryOptions.using({
|
|
80
|
+
includeDeleted: includeDeleted,
|
|
81
|
+
fetchStrategy: FetchStrategy.FromLocalCache
|
|
82
|
+
});
|
|
83
|
+
var query = this._breezeContext.createQuery(this.getQueryServiceName(entity)).where(entity.name + 'Ref', '==', ref).using(queryOptions);
|
|
84
|
+
var result = this._entityManager.executeQueryLocally(query)[0];
|
|
85
|
+
if (result)
|
|
86
|
+
return result;
|
|
87
|
+
return null;
|
|
88
|
+
};
|
|
89
|
+
this.export = (entity, gridSpec, setupQuery, entityRefs, options) => {
|
|
90
|
+
options = options || {};
|
|
91
|
+
var args = {
|
|
92
|
+
runAsync: false,
|
|
93
|
+
useNames: false,
|
|
94
|
+
useEmptyTags: false,
|
|
95
|
+
entityRefs: null,
|
|
96
|
+
entityTypeName: entity.name,
|
|
97
|
+
gridSpec: gridSpec
|
|
98
|
+
};
|
|
99
|
+
if (options.async)
|
|
100
|
+
args.runAsync = true;
|
|
101
|
+
if (options.useNames)
|
|
102
|
+
args.useNames = true;
|
|
103
|
+
if (options.useEmptyTags)
|
|
104
|
+
args.useEmptyTags = true;
|
|
105
|
+
var queryText;
|
|
106
|
+
if (options.useGrid) {
|
|
107
|
+
args.entityRefs = entityRefs;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
var query = this._breezeContext.createQuery('noname');
|
|
111
|
+
if (setupQuery)
|
|
112
|
+
query = setupQuery(query);
|
|
113
|
+
if (query === null) {
|
|
114
|
+
this.uiNotification.warning('No records selected by query');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
queryText = query._toUri(this._entityManager);
|
|
119
|
+
queryText = queryText.split('?')[1];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
var argsText = this.formatAsUrlParameters(args);
|
|
123
|
+
if (queryText)
|
|
124
|
+
argsText += '&' + queryText;
|
|
125
|
+
this.uiNotification.info(args.runAsync ? 'Queuing export...' : 'Exporting...');
|
|
126
|
+
this.downloadFromUrl('ExportEntities', argsText);
|
|
127
|
+
};
|
|
128
|
+
this.formatAsUrlParameters = (data) => {
|
|
129
|
+
var buffer = [];
|
|
130
|
+
for (var name in data) {
|
|
131
|
+
if (!data.hasOwnProperty(name)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
var value = data[name];
|
|
135
|
+
buffer.push(encodeURIComponent(name) +
|
|
136
|
+
'=' + encodeURIComponent(value == null ? '' : value));
|
|
137
|
+
}
|
|
138
|
+
var source = buffer.join('&')
|
|
139
|
+
.replace(/%20/g, '+');
|
|
140
|
+
return (source);
|
|
141
|
+
};
|
|
142
|
+
this.downloadFromUrl = (url, data) => {
|
|
143
|
+
if (data)
|
|
144
|
+
data = this.formatAsUrlParameters(data);
|
|
145
|
+
const body = { title: 'download request' };
|
|
146
|
+
const headers = { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' };
|
|
147
|
+
this.http.post(url, body, { headers }).subscribe((response) => {
|
|
148
|
+
this.saveDownloadedFile(response);
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
this.saveDownloadedFile = (response) => {
|
|
152
|
+
var headers = response.headers;
|
|
153
|
+
var contentDisposition = headers('content-disposition');
|
|
154
|
+
if (!contentDisposition)
|
|
155
|
+
return; // NOTE: cannot save without header info
|
|
156
|
+
var filename = this.extractFilenameFromContentDisposition(contentDisposition);
|
|
157
|
+
var blob = new Blob([response.data], { type: headers('content-type') });
|
|
158
|
+
var link = document.createElement('a');
|
|
159
|
+
link.href = URL.createObjectURL(blob);
|
|
160
|
+
link.setAttribute('download', filename);
|
|
161
|
+
link.click();
|
|
162
|
+
link.remove();
|
|
163
|
+
};
|
|
164
|
+
this.extractFilenameFromContentDisposition = (text) => {
|
|
165
|
+
var parts = _.map(text.split(';'), function (part) { return part.trim(); });
|
|
166
|
+
var prefix = 'filename=';
|
|
167
|
+
var filenamePart = _.find(parts, function (part) { return part.substring(0, prefix.length) === prefix; });
|
|
168
|
+
if (!filenamePart)
|
|
169
|
+
return 'file';
|
|
170
|
+
var filename = filenamePart.substring(prefix.length);
|
|
171
|
+
filename = filename.replace(/"/g, '');
|
|
172
|
+
return filename;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
set context(dataContext) {
|
|
176
|
+
this._breezeContext = dataContext.breezeContext;
|
|
177
|
+
this._entityManager = dataContext.entityManager;
|
|
178
|
+
}
|
|
179
|
+
set maxRecordCount(maxRecordCount) {
|
|
180
|
+
this.maxRecordCount = maxRecordCount;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
TruEntityAccessor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TruEntityAccessor, deps: [{ token: i1.HttpClient }, { token: i2.TruUiNotification }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
184
|
+
TruEntityAccessor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TruEntityAccessor });
|
|
185
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TruEntityAccessor, decorators: [{
|
|
186
|
+
type: Injectable
|
|
187
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.TruUiNotification }]; } });
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWVudGl0eS1hY2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvc2VydmljZXMvdHJ1LWVudGl0eS1hY2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBc0MsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBS2xGLE9BQU8sS0FBSyxDQUFDLE1BQU0sWUFBWSxDQUFDO0FBRWhDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQUduRCxNQUFNLE9BQU8saUJBQWlCO0lBSzVCLFlBQ1UsSUFBZ0IsRUFDaEIsY0FBaUM7UUFEakMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFKbkMsb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFNNUIsd0JBQW1CLEdBQUcsQ0FBQyxNQUE0QixFQUFFLEVBQUU7WUFDN0QsT0FBTyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMvQixDQUFDLENBQUE7UUFFTyxxQkFBZ0IsR0FBRyxDQUFDLFFBQWUsRUFBRSxVQUFrQixFQUFFLEVBQUU7WUFDakUsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjO2dCQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsVUFBVSxHQUFHLDZDQUE2QyxDQUFDLENBQUM7UUFDbEcsQ0FBQyxDQUFBO1FBRU8sdUJBQWtCLEdBQUcsQ0FBQyxLQUFrQixFQUFFLFFBQXVCLEVBQUUsUUFBZ0IsRUFBRSxNQUFxQixJQUFJLEVBQWMsRUFBRTtZQUNwSSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsYUFBYTtnQkFDOUIsT0FBTyxDQUFD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LGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEVudGl0eSwgRW50aXR5TWFuYWdlciwgRW50aXR5UXVlcnksIEZldGNoU3RyYXRlZ3kgfSBmcm9tIFwiYnJlZXplLWNsaWVudFwiO1xyXG5pbXBvcnQgeyBUcnVFbnRpdHlCYXNlIH0gZnJvbSAnLi4vYmFzZS1jbGFzc2VzL3RydS1lbnRpdHktYmFzZSdcclxuaW1wb3J0IHsgVHJ1VWlOb3RpZmljYXRpb24gfSBmcm9tIFwiLi90cnUtdWktbm90aWZpY2F0aW9uXCI7XHJcbmltcG9ydCB7IFRydURhdGFDb250ZXh0IH0gZnJvbSBcIi4vdHJ1LWRhdGEtY29udGV4dFwiO1xyXG5pbXBvcnQgeyBUcnVCcmVlemVDb250ZXh0IH0gZnJvbSBcIi4vdHJ1LWJyZWV6ZS1jb250ZXh0LWZhY3RvcnlcIjtcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwidW5kZXJzY29yZVwiO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IGRlZmVyLCBmcm9tLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVHJ1RW50aXR5QWNjZXNzb3Ige1xyXG4gIHByaXZhdGUgX2JyZWV6ZUNvbnRleHQhOiBUcnVCcmVlemVDb250ZXh0O1xyXG4gIHByaXZhdGUgX2VudGl0eU1hbmFnZXIhOiBFbnRpdHlNYW5hZ2VyO1xyXG4gIHByaXZhdGUgX21heFJlY29yZENvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgdWlOb3RpZmljYXRpb246IFRydVVpTm90aWZpY2F0aW9uKSB7IH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRRdWVyeVNlcnZpY2VOYW1lID0gKGVudGl0eTogdHlwZW9mIFRydUVudGl0eUJhc2UpID0+IHtcclxuICAgIHJldHVybiAnUXVlcnknICsgZW50aXR5Lm5hbWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdhcm5JZk1heFJlY29yZHMgPSAoZW50aXRpZXM6IGFueVtdLCBlbnRpdHlOYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPj0gdGhpcy5tYXhSZWNvcmRDb3VudClcclxuICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi53YXJuaW5nKCdbJyArIGVudGl0eU5hbWUgKyAnXSBoYXMgbW9yZSByZWNvcmRzIGF2YWlsYWJsZSB0aGFuIHN1cHBvcnRlZCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRRdWVyeUNob2ljZXMgPSAocXVlcnk6IEVudGl0eVF1ZXJ5LCBlbnRpdGllczogQXJyYXk8RW50aXR5PiwgcEtleU5hbWU6IHN0cmluZywgaGlkOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IEFycmF5PGFueT4gPT4ge1xyXG4gICAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5Lm9yZGVyQnlDbGF1c2UpXHJcbiAgICAgIHJldHVybiBfLm1hcChlbnRpdGllcywgKGVudGl0eTogYW55KSA9PiB7IHJldHVybiB7IHZhbHVlOiB7ICQ6IGVudGl0eVtwS2V5TmFtZV0gfSwgbGFiZWw6IGhpZCAhPT0gbnVsbCA/IGhpZCA6IGVudGl0eS5ISUQgfTsgfSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBfLm1hcChlbnRpdGllcywgKGVudGl0eTogYW55KSA9PiB7IHJldHVybiB7IHZhbHVlOiB7ICQ6IGVudGl0eVtwS2V5TmFtZV0gfSwgbGFiZWw6IGhpZCAhPT0gbnVsbCA/IGhpZCA6IGVudGl0eS5ISUQgfTsgfSk7XHJcbiAgfVxyXG5cclxuICBzZXQgY29udGV4dChkYXRhQ29udGV4dDogVHJ1RGF0YUNvbnRleHQpIHtcclxuICAgIHRoaXMuX2JyZWV6ZUNvbnRleHQgPSBkYXRhQ29udGV4dC5icmVlemVDb250ZXh0O1xyXG4gICAgdGhpcy5fZW50aXR5TWFuYWdlciA9IGRhdGFDb250ZXh0LmVudGl0eU1hbmFnZXI7XHJcbiAgfVxyXG5cclxuICBzZXQgbWF4UmVjb3JkQ291bnQobWF4UmVjb3JkQ291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5tYXhSZWNvcmRDb3VudCA9IG1heFJlY29yZENvdW50O1xyXG4gIH1cclxuXHJcbiAgYWRkID0gKGVudGl0eTogdHlwZW9mIFRydUVudGl0eUJhc2UsIGNvbnRleHRGaWx0ZXJzOiBhbnkgPSBudWxsKSA9PiB7XHJcbiAgICBsZXQgbmV3RW50aXR5ID0gdGhpcy5fZW50aXR5TWFuYWdlci5jcmVhdGVFbnRpdHkoZW50aXR5LnByb3RvdHlwZS5lbnRpdHlUeXBlKTtcclxuICAgIHJldHVybiBuZXdFbnRpdHk7XHJcbiAgfTtcclxuXHJcbiAgc2VhcmNoID0gKGVudGl0eTogdHlwZW9mIFRydUVudGl0eUJhc2UsXHJcbiAgICBzZXR1cFF1ZXJ5OiBhbnkgfCBudWxsID0gbnVsbCxcclxuICAgIGV4cGFuZHM6IFtdIHwgbnVsbCxcclxuICAgIGdsb2JhbDogYm9vbGVhbik6IE9ic2VydmFibGU8RW50aXR5W10+ID0+IHtcclxuXHJcbiAgICB2YXIgcXVlcnk6IGFueTtcclxuICAgIGlmIChleHBhbmRzICYmIGV4cGFuZHMubGVuZ3RoKSB7XHJcbiAgICAgIGlmIChnbG9iYWwpXHJcbiAgICAgICAgcXVlcnkgPSB0aGlzLl9icmVlemVDb250ZXh0LmNyZWF0ZVF1ZXJ5KHRoaXMuZ2V0UXVlcnlTZXJ2aWNlTmFtZShlbnRpdHkpKS5leHBhbmQoZXhwYW5kcy5qb2luKCcsICcpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHF1ZXJ5ID0gdGhpcy5fYnJlZXplQ29udGV4dC5jcmVhdGVRdWVyeSh0aGlzLmdldFF1ZXJ5U2VydmljZU5hbWUoZW50aXR5KSkuZXhwYW5kKGV4cGFuZHMuam9pbignLCAnKSkudG9wKHRoaXMuX21heFJlY29yZENvdW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChnbG9iYWwpXHJcbiAgICAgICAgcXVlcnkgPSB0aGlzLl9icmVlemVDb250ZXh0LmNyZWF0ZVF1ZXJ5KHRoaXMuZ2V0UXVlcnlTZXJ2aWNlTmFtZShlbnRpdHkpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHF1ZXJ5ID0gdGhpcy5fYnJlZXplQ29udGV4dC5jcmVhdGVRdWVyeSh0aGlzLmdldFF1ZXJ5U2VydmljZU5hbWUoZW50aXR5KSkudG9wKHRoaXMuX21heFJlY29yZENvdW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dXBRdWVyeSAhPSBudWxsKVxyXG4gICAgICBxdWVyeSA9IHNldHVwUXVlcnkocXVlcnkpO1xyXG5cclxuICAgIHJldHVybiBkZWZlcigoKSA9PiBmcm9tKHRoaXMuX2VudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5KHF1ZXJ5KS50aGVuKChxdWVyeURhdGE6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWdsb2JhbClcclxuICAgICAgICB0aGlzLndhcm5JZk1heFJlY29yZHMocXVlcnlEYXRhLnJlc3VsdHMsIGVudGl0eS5uYW1lKTtcclxuICAgICAgcmV0dXJuIHF1ZXJ5RGF0YS5yZXN1bHRzO1xyXG4gICAgfSkpKTtcclxuICB9O1xyXG5cclxuICBzZWFyY2hDYWNoZU9ubHkgPSAoXHJcbiAgICBlbnRpdHk6IHR5cGVvZiBUcnVFbnRpdHlCYXNlLFxyXG4gICAgc2V0dXBRdWVyeTogYW55IHwgbnVsbCA9IG51bGwsXHJcbiAgICBleHBhbmRzOiBbXSB8IG51bGwgPSBudWxsKTogT2JzZXJ2YWJsZTxFbnRpdHlbXT4gPT4ge1xyXG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fYnJlZXplQ29udGV4dC5jcmVhdGVRdWVyeSh0aGlzLmdldFF1ZXJ5U2VydmljZU5hbWUoZW50aXR5KSk7XHJcbiAgICBpZiAoc2V0dXBRdWVyeSlcclxuICAgICAgcXVlcnkgPSBzZXR1cFF1ZXJ5KHF1ZXJ5KTtcclxuICAgIHJldHVybiBvZih0aGlzLl9lbnRpdHlNYW5hZ2VyLmV4ZWN1dGVRdWVyeUxvY2FsbHkocXVlcnkpKTtcclxuICB9O1xyXG5cclxuICBzZWFyY2hDYWNoZU9ubHlTeW5jaHJvbm91c2x5ID0gKFxyXG4gICAgZW50aXR5OiB0eXBlb2YgVHJ1RW50aXR5QmFzZSxcclxuICAgIHNldHVwUXVlcnk6IGFueSB8IG51bGwgPSBudWxsLFxyXG4gICAgZXhwYW5kczogW10gfCBudWxsID0gbnVsbCk6IEFycmF5PGFueT4gPT4ge1xyXG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fYnJlZXplQ29udGV4dC5jcmVhdGVRdWVyeSh0aGlzLmdldFF1ZXJ5U2VydmljZU5hbWUoZW50aXR5KSk7XHJcbiAgICBpZiAoc2V0dXBRdWVyeSlcclxuICAgICAgcXVlcnkgPSBzZXR1cFF1ZXJ5KHF1ZXJ5KTtcclxuICAgIHJldHVybiB0aGlzLl9lbnRpdHlNYW5hZ2VyLmV4ZWN1dGVRdWVyeUxvY2FsbHkocXVlcnkpO1xyXG4gIH07XHJcblxyXG4gIHNlYXJjaFF1ZXJ5Q2hvaWNlcyA9IChcclxuICAgIGVudGl0eTogdHlwZW9mIFRydUVudGl0eUJhc2UsXHJcbiAgICBzZXR1cFF1ZXJ5OiBhbnkgfCBudWxsID0gbnVsbCxcclxuICAgIGhpZDogc3RyaW5nIHwgbnVsbCA9IG51bGwsXHJcbiAgICBnb1RvU2VydmVyOiBib29sZWFuID0gZmFsc2UpOiBPYnNlcnZhYmxlPHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IHsgJDogbnVtYmVyIH0gfVtdPiA9PiB7XHJcbiAgICB0eXBlIE9iamVjdEtleSA9IGtleW9mIHR5cGVvZiBlbnRpdHk7XHJcbiAgICBjb25zdCBwa2V5TmFtZSA9IGVudGl0eS5uYW1lICsgJ1JlZicgYXMgT2JqZWN0S2V5O1xyXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5fYnJlZXplQ29udGV4dC5jcmVhdGVRdWVyeSh0aGlzLmdldFF1ZXJ5U2VydmljZU5hbWUoZW50aXR5KSk7XHJcbiAgICBpZiAoc2V0dXBRdWVyeSlcclxuICAgICAgcXVlcnkgPSBzZXR1cFF1ZXJ5KHF1ZXJ5KSA/PyBxdWVyeTtcclxuICAgIGlmIChnb1RvU2VydmVyKSB7XHJcbiAgICAgIHJldHVybiBkZWZlcigoKSA9PiBmcm9tKHRoaXMuX2VudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5KHF1ZXJ5KS50aGVuKChxdWVyeURhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdFF1ZXJ5Q2hvaWNlcyhxdWVyeSwgcXVlcnlEYXRhLnJlc3VsdHMsIHBrZXlOYW1lLCBudWxsKTtcclxuICAgICAgfSkpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvZih0aGlzLmZvcm1hdFF1ZXJ5Q2hvaWNlcyhxdWVyeSwgdGhpcy5fZW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnlMb2NhbGx5KHF1ZXJ5KSwgcGtleU5hbWUsIG51bGwpKTtcclxuICB9O1xyXG5cclxuICBnZXRCeVJlZkNhY2hlT25seSA9IChcclxuICAgIGVudGl0eTogdHlwZW9mIFRydUVudGl0eUJhc2UsXHJcbiAgICByZWY6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICBpbmNsdWRlRGVsZXRlZDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XHJcblxyXG4gICAgaWYgKCFpbmNsdWRlRGVsZXRlZClcclxuICAgICAgaW5jbHVkZURlbGV0ZWQgPSBmYWxzZTtcclxuICAgIHZhciBxdWVyeU9wdGlvbnMgPSB0aGlzLl9lbnRpdHlNYW5hZ2VyLnF1ZXJ5T3B0aW9ucy51c2luZyh7XHJcbiAgICAgIGluY2x1ZGVEZWxldGVkOiBpbmNsdWRlRGVsZXRlZCxcclxuICAgICAgZmV0Y2hTdHJhdGVneTogRmV0Y2hTdHJhdGVneS5Gcm9tTG9jYWxDYWNoZVxyXG4gICAgfSk7XHJcbiAgICB2YXIgcXVlcnkgPSB0aGlzLl9icmVlemVDb250ZXh0LmNyZWF0ZVF1ZXJ5KHRoaXMuZ2V0UXVlcnlTZXJ2aWNlTmFtZShlbnRpdHkpKS53aGVyZShlbnRpdHkubmFtZSArICdSZWYnLCAnPT0nLCByZWYpLnVzaW5nKHF1ZXJ5T3B0aW9ucyk7XHJcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnlMb2NhbGx5KHF1ZXJ5KVswXTtcclxuICAgIGlmIChyZXN1bHQpXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9O1xyXG5cclxuICBleHBvcnQgPSAoXHJcbiAgICBlbnRpdHk6IHR5cGVvZiBUcnVFbnRpdHlCYXNlLFxyXG4gICAgZ3JpZFNwZWM6IHN0cmluZyxcclxuICAgIHNldHVwUXVlcnk6IGFueSB8IG51bGwsXHJcbiAgICBlbnRpdHlSZWZzOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgb3B0aW9uczogYW55KSA9PiB7XHJcblxyXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcbiAgICB2YXIgYXJncyA9IHtcclxuICAgICAgcnVuQXN5bmM6IGZhbHNlLFxyXG4gICAgICB1c2VOYW1lczogZmFsc2UsXHJcbiAgICAgIHVzZUVtcHR5VGFnczogZmFsc2UsXHJcbiAgICAgIGVudGl0eVJlZnM6IG51bGwgYXMgc3RyaW5nIHwgbnVsbCxcclxuICAgICAgZW50aXR5VHlwZU5hbWU6IGVudGl0eS5uYW1lLFxyXG4gICAgICBncmlkU3BlYzogZ3JpZFNwZWNcclxuICAgIH07XHJcbiAgICBpZiAob3B0aW9ucy5hc3luYylcclxuICAgICAgYXJncy5ydW5Bc3luYyA9IHRydWU7XHJcbiAgICBpZiAob3B0aW9ucy51c2VOYW1lcylcclxuICAgICAgYXJncy51c2VOYW1lcyA9IHRydWU7XHJcbiAgICBpZiAob3B0aW9ucy51c2VFbXB0eVRhZ3MpXHJcbiAgICAgIGFyZ3MudXNlRW1wdHlUYWdzID0gdHJ1ZTtcclxuICAgIHZhciBxdWVyeVRleHQ7XHJcbiAgICBpZiAob3B0aW9ucy51c2VHcmlkKSB7XHJcbiAgICAgIGFyZ3MuZW50aXR5UmVmcyA9IGVudGl0eVJlZnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgcXVlcnkgPSB0aGlzLl9icmVlemVDb250ZXh0LmNyZWF0ZVF1ZXJ5KCdub25hbWUnKTtcclxuICAgICAgaWYgKHNldHVwUXVlcnkpXHJcbiAgICAgICAgcXVlcnkgPSBzZXR1cFF1ZXJ5KHF1ZXJ5KTtcclxuICAgICAgaWYgKHF1ZXJ5ID09PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi53YXJuaW5nKCdObyByZWNvcmRzIHNlbGVjdGVkIGJ5IHF1ZXJ5Jyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHF1ZXJ5VGV4dCA9IHF1ZXJ5Ll90b1VyaSh0aGlzLl9lbnRpdHlNYW5hZ2VyKTtcclxuICAgICAgICBxdWVyeVRleHQgPSBxdWVyeVRleHQuc3BsaXQoJz8nKVsxXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBhcmdzVGV4dCA9IHRoaXMuZm9ybWF0QXNVcmxQYXJhbWV0ZXJzKGFyZ3MpO1xyXG4gICAgaWYgKHF1ZXJ5VGV4dClcclxuICAgICAgYXJnc1RleHQgKz0gJyYnICsgcXVlcnlUZXh0O1xyXG4gICAgdGhpcy51aU5vdGlmaWNhdGlvbi5pbmZvKGFyZ3MucnVuQXN5bmMgPyAnUXVldWluZyBleHBvcnQuLi4nIDogJ0V4cG9ydGluZy4uLicpO1xyXG4gICAgdGhpcy5kb3dubG9hZEZyb21VcmwoJ0V4cG9ydEVudGl0aWVzJywgYXJnc1RleHQpO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0QXNVcmxQYXJhbWV0ZXJzID0gKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgdmFyIGJ1ZmZlciA9IFtdO1xyXG4gICAgZm9yICh2YXIgbmFtZSBpbiBkYXRhKSB7XHJcbiAgICAgIGlmICghZGF0YS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciB2YWx1ZSA9IGRhdGFbbmFtZV07XHJcbiAgICAgIGJ1ZmZlci5wdXNoKFxyXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArXHJcbiAgICAgICAgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICB2YXIgc291cmNlID0gYnVmZmVyLmpvaW4oJyYnKVxyXG4gICAgICAucmVwbGFjZSgvJTIwL2csICcrJyk7XHJcbiAgICByZXR1cm4gKHNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvd25sb2FkRnJvbVVybCA9ICh1cmw6IHN0cmluZywgZGF0YTogYW55KSA9PiB7XHJcbiAgICBpZiAoZGF0YSlcclxuICAgICAgZGF0YSA9IHRoaXMuZm9ybWF0QXNVcmxQYXJhbWV0ZXJzKGRhdGEpO1xyXG4gICAgY29uc3QgYm9keSA9IHsgdGl0bGU6ICdkb3dubG9hZCByZXF1ZXN0JyB9O1xyXG4gICAgY29uc3QgaGVhZGVycyA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnIH07XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QoXHJcbiAgICAgIHVybCxcclxuICAgICAgYm9keSxcclxuICAgICAgeyBoZWFkZXJzIH1cclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2F2ZURvd25sb2FkZWRGaWxlKHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc2F2ZURvd25sb2FkZWRGaWxlID0gKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgIHZhciBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcclxuICAgIHZhciBjb250ZW50RGlzcG9zaXRpb24gPSBoZWFkZXJzKCdjb250ZW50LWRpc3Bvc2l0aW9uJyk7XHJcbiAgICBpZiAoIWNvbnRlbnREaXNwb3NpdGlvbilcclxuICAgICAgcmV0dXJuOyAvLyBOT1RFOiBjYW5ub3Qgc2F2ZSB3aXRob3V0IGhlYWRlciBpbmZvXHJcbiAgICB2YXIgZmlsZW5hbWUgPSB0aGlzLmV4dHJhY3RGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb24oY29udGVudERpc3Bvc2l0aW9uKTtcclxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3Jlc3BvbnNlLmRhdGFdLCB7IHR5cGU6IGhlYWRlcnMoJ2NvbnRlbnQtdHlwZScpIH0pO1xyXG4gICAgdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgbGluay5yZW1vdmUoKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGV4dHJhY3RGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb24gPSAodGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgICB2YXIgcGFydHMgPSBfLm1hcCh0ZXh0LnNwbGl0KCc7JyksIGZ1bmN0aW9uIChwYXJ0KSB7IHJldHVybiBwYXJ0LnRyaW0oKTsgfSk7XHJcbiAgICB2YXIgcHJlZml4ID0gJ2ZpbGVuYW1lPSc7XHJcbiAgICB2YXIgZmlsZW5hbWVQYXJ0ID0gXy5maW5kKHBhcnRzLCBmdW5jdGlvbiAocGFydCkgeyByZXR1cm4gcGFydC5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeCB9KTtcclxuICAgIGlmICghZmlsZW5hbWVQYXJ0KVxyXG4gICAgICByZXR1cm4gJ2ZpbGUnO1xyXG4gICAgdmFyIGZpbGVuYW1lID0gZmlsZW5hbWVQYXJ0LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTtcclxuICAgIGZpbGVuYW1lID0gZmlsZW5hbWUucmVwbGFjZSgvXCIvZywgJycpO1xyXG4gICAgcmV0dXJuIGZpbGVuYW1lO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class PredicateMap {
|
|
4
|
+
constructor() { }
|
|
5
|
+
}
|
|
6
|
+
PredicateMap.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: PredicateMap, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
7
|
+
PredicateMap.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: PredicateMap });
|
|
8
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: PredicateMap, decorators: [{
|
|
9
|
+
type: Injectable
|
|
10
|
+
}], ctorParameters: function () { return []; } });
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LXByZWRpY2F0ZS1tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnUtY29tbW9uLWxpYi9zcmMvbGliL3NlcnZpY2VzL3RydS1wcmVkaWNhdGUtbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDLE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLGdCQUFnQixDQUFDOzt5R0FETixZQUFZOzZHQUFaLFlBQVk7MkZBQVosWUFBWTtrQkFEeEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUHJlZGljYXRlTWFwIHtcclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG59XHJcbiJdfQ==
|
|
@@ -38,4 +38,4 @@ TruSearchGroupEventHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12
|
|
|
38
38
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TruSearchGroupEventHandler, decorators: [{
|
|
39
39
|
type: Injectable
|
|
40
40
|
}] });
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LXNlYXJjaC1ncm91cC1ldmVudC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1LWNvbW1vbi1saWIvc3JjL2xpYi9zZXJ2aWNlcy90cnUtc2VhcmNoLWdyb3VwLWV2ZW50LWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFHdkMsTUFBTSxPQUFPLDBCQUEwQjtJQUR2QztRQUVVLFlBQU8sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNyRCxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckQsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3hDLGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztLQWlDbkQ7SUEvQkMsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQWdCO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBZ0I7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7O3VIQXBDVSwwQkFBMEI7MkhBQTFCLDBCQUEwQjsyRkFBMUIsMEJBQTBCO2tCQUR0QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUcnVTZWFyY2hHcm91cEV2ZW50SGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBzZWFyY2gkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIHByaXZhdGUgZmlsdGVyJDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBwcml2YXRlIGNsZWFyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuICBwcml2YXRlIGRlZmF1bHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG5cclxuICBvblNlYXJjaCgpIHtcclxuICAgIHJldHVybiB0aGlzLnNlYXJjaCQ7XHJcbiAgfVxyXG5cclxuICBvbkZpbHRlcigpIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlciQ7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyVmFsdWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2xlYXIkO1xyXG4gIH1cclxuXHJcbiAgb25TZXREZWZhdWx0cygpIHtcclxuICAgIHJldHVybiB0aGlzLmRlZmF1bHQkO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoKGVudGl0eVF1ZXJ5OiBhbnkpIHtcclxuICAgIHRoaXMuc2VhcmNoJC5lbWl0KGVudGl0eVF1ZXJ5KTtcclxuICB9XHJcblxyXG4gIGZpbHRlcihlbnRpdHlRdWVyeTogYW55KSB7XHJcbiAgICB0aGlzLmZpbHRlciQuZW1pdChlbnRpdHlRdWVyeSk7XHJcbiAgfVxyXG5cclxuICBjbGVhclZhbHVlcygpIHtcclxuICAgIHRoaXMuY2xlYXIkLm5leHQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBzZXREZWZhdWx0cygpIHtcclxuICAgIHRoaXMuZGVmYXVsdCQubmV4dChudWxsKTtcclxuICB9XHJcbn1cclxuIl19
|