@igo2/geo 1.9.3 → 1.11.0

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.
Files changed (158) hide show
  1. package/bundles/igo2-geo.umd.js +3569 -1190
  2. package/bundles/igo2-geo.umd.js.map +1 -1
  3. package/esm2015/lib/catalog/catalog-browser/catalog-browser.component.js +2 -2
  4. package/esm2015/lib/catalog/catalog-library/add-catalog-dialog.component.js +72 -53
  5. package/esm2015/lib/catalog/catalog-library/catalog-library.component.js +7 -6
  6. package/esm2015/lib/catalog/shared/catalog.service.js +5 -2
  7. package/esm2015/lib/datasource/shared/capabilities.service.js +26 -12
  8. package/esm2015/lib/datasource/shared/datasources/arcgisrest-datasource.js +84 -14
  9. package/esm2015/lib/datasource/shared/datasources/datasource.interface.js +1 -1
  10. package/esm2015/lib/datasource/shared/datasources/imagearcgisrest-datasource.js +7 -10
  11. package/esm2015/lib/datasource/shared/datasources/mvt-datasource.js +2 -2
  12. package/esm2015/lib/datasource/shared/datasources/tilearcgisrest-datasource.js +7 -9
  13. package/esm2015/lib/datasource/shared/datasources/wfs-datasource.js +3 -1
  14. package/esm2015/lib/datasource/shared/datasources/wms-datasource.js +7 -1
  15. package/esm2015/lib/datasource/shared/datasources/wms-wfs.utils.js +5 -2
  16. package/esm2015/lib/directions/directions-buttons/directions-buttons.component.js +15 -8
  17. package/esm2015/lib/directions/directions-inputs/directions-inputs.component.js +12 -4
  18. package/esm2015/lib/directions/directions-sources/osrm-directions-source.js +3 -1
  19. package/esm2015/lib/directions/directions.component.js +66 -15
  20. package/esm2015/lib/directions/shared/directions.enum.js +6 -1
  21. package/esm2015/lib/directions/shared/directions.interface.js +1 -1
  22. package/esm2015/lib/directions/shared/directions.utils.js +4 -37
  23. package/esm2015/lib/draw/draw/draw.component.js +2 -1
  24. package/esm2015/lib/feature/shared/feature.utils.js +2 -1
  25. package/esm2015/lib/feature/shared/strategies/in-map-extent.js +17 -4
  26. package/esm2015/lib/filter/filter.module.js +7 -4
  27. package/esm2015/lib/filter/ogc-filter-button/ogc-filter-button.component.js +15 -1
  28. package/esm2015/lib/filter/ogc-filter-selection/ogc-filter-selection.component.js +31 -13
  29. package/esm2015/lib/filter/ogc-filter-time/ogc-filter-time.component.js +296 -161
  30. package/esm2015/lib/filter/shared/ogc-filter.interface.js +1 -1
  31. package/esm2015/lib/filter/shared/ogc-filter.js +8 -1
  32. package/esm2015/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.js +185 -95
  33. package/esm2015/lib/geometry/shared/controls/draw.js +7 -2
  34. package/esm2015/lib/geometry/shared/controls/modify.js +1 -1
  35. package/esm2015/lib/geometry/shared/controls/slice.js +1 -1
  36. package/esm2015/lib/import-export/import-export/import-export.component.js +226 -66
  37. package/esm2015/lib/import-export/shared/export.interface.js +1 -1
  38. package/esm2015/lib/layer/layer-legend/layer-legend.component.js +32 -26
  39. package/esm2015/lib/layer/layer.module.js +8 -5
  40. package/esm2015/lib/layer/shared/layer.service.js +20 -17
  41. package/esm2015/lib/layer/shared/layers/image-layer.js +9 -4
  42. package/esm2015/lib/layer/shared/layers/layer.interface.js +1 -1
  43. package/esm2015/lib/layer/shared/layers/layer.js +23 -5
  44. package/esm2015/lib/layer/shared/layers/tile-layer.js +23 -3
  45. package/esm2015/lib/layer/shared/layers/vector-layer.interface.js +1 -1
  46. package/esm2015/lib/layer/shared/layers/vector-layer.js +32 -14
  47. package/esm2015/lib/layer/shared/layers/vectortile-layer.interface.js +1 -1
  48. package/esm2015/lib/layer/shared/layers/vectortile-layer.js +13 -3
  49. package/esm2015/lib/layer/shared/style.service.js +21 -16
  50. package/esm2015/lib/layer/shared/vector-style.interface.js +1 -1
  51. package/esm2015/lib/layer/utils/index.js +2 -1
  52. package/esm2015/lib/layer/utils/layer.utils.js +11 -0
  53. package/esm2015/lib/layer/utils/layerSync-watcher.js +10 -6
  54. package/esm2015/lib/map/home-extent-button/home-extent-button.component.js +69 -0
  55. package/esm2015/lib/map/home-extent-button/index.js +2 -0
  56. package/esm2015/lib/map/index.js +3 -1
  57. package/esm2015/lib/map/info-section/index.js +2 -0
  58. package/esm2015/lib/map/info-section/info-section.component.js +36 -0
  59. package/esm2015/lib/map/map-browser/map-browser.component.js +1 -1
  60. package/esm2015/lib/map/map-center/map-center.component.js +1 -1
  61. package/esm2015/lib/map/map.module.js +11 -1
  62. package/esm2015/lib/map/shared/hover-feature.directive.js +229 -78
  63. package/esm2015/lib/map/shared/map.js +2 -2
  64. package/esm2015/lib/map/shared/mapOffline.directive.js +17 -6
  65. package/esm2015/lib/measure/measurer/measurer.component.js +8 -2
  66. package/esm2015/lib/query/shared/query.directive.js +6 -3
  67. package/esm2015/lib/query/shared/query.interfaces.js +1 -1
  68. package/esm2015/lib/query/shared/query.service.js +57 -14
  69. package/esm2015/lib/query/shared/query.utils.js +19 -1
  70. package/esm2015/lib/search/search-bar/search-bar.component.js +4 -2
  71. package/esm2015/lib/search/search-results/search-results-add-button.component.js +7 -7
  72. package/esm2015/lib/search/shared/search-pointer-summary.directive.js +16 -5
  73. package/esm2015/lib/search/shared/search.interfaces.js +1 -1
  74. package/esm2015/lib/search/shared/sources/icherche.js +3 -2
  75. package/esm2015/lib/search/shared/sources/source.js +2 -2
  76. package/esm2015/lib/search/shared/sources/storedqueries.js +3 -7
  77. package/esm2015/lib/workspace/confirmation-popup/confirmation-popup.component.js +56 -0
  78. package/esm2015/lib/workspace/confirmation-popup/confirmation-popup.module.js +38 -0
  79. package/esm2015/lib/workspace/confirmation-popup/index.js +3 -0
  80. package/esm2015/lib/workspace/index.js +2 -1
  81. package/esm2015/lib/workspace/shared/edition-workspace.js +271 -0
  82. package/esm2015/lib/workspace/shared/edition-workspace.service.js +619 -0
  83. package/esm2015/lib/workspace/shared/feature-workspace.js +18 -1
  84. package/esm2015/lib/workspace/shared/feature-workspace.service.js +27 -6
  85. package/esm2015/lib/workspace/shared/index.js +3 -1
  86. package/esm2015/lib/workspace/shared/wfs-workspace.js +18 -1
  87. package/esm2015/lib/workspace/shared/wfs-workspace.service.js +27 -5
  88. package/esm2015/lib/workspace/shared/wms-workspace.service.js +59 -15
  89. package/esm2015/lib/workspace/shared/workspace.utils.js +1 -1
  90. package/esm2015/lib/workspace/workspace-selector/workspace-selector.directive.js +40 -10
  91. package/esm2015/lib/workspace/workspace-updator/workspace-updator.directive.js +22 -8
  92. package/esm2015/lib/workspace/workspace.module.js +19 -7
  93. package/fesm2015/igo2-geo.js +2946 -794
  94. package/fesm2015/igo2-geo.js.map +1 -1
  95. package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +1 -1
  96. package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +2 -0
  97. package/lib/datasource/shared/datasources/datasource.interface.d.ts +45 -0
  98. package/lib/datasource/shared/datasources/wfs-datasource.d.ts +1 -0
  99. package/lib/datasource/shared/datasources/wms-wfs.utils.d.ts +1 -1
  100. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +2 -1
  101. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +1 -0
  102. package/lib/directions/directions.component.d.ts +7 -3
  103. package/lib/directions/shared/directions.enum.d.ts +4 -0
  104. package/lib/directions/shared/directions.interface.d.ts +3 -1
  105. package/lib/directions/shared/directions.utils.d.ts +0 -4
  106. package/lib/filter/filter.module.d.ts +1 -1
  107. package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +6 -0
  108. package/lib/filter/shared/ogc-filter.interface.d.ts +1 -0
  109. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +7 -2
  110. package/lib/geometry/shared/controls/draw.d.ts +8 -4
  111. package/lib/geometry/shared/controls/modify.d.ts +3 -4
  112. package/lib/geometry/shared/controls/slice.d.ts +3 -4
  113. package/lib/import-export/import-export/import-export.component.d.ts +2 -0
  114. package/lib/import-export/shared/export.interface.d.ts +2 -1
  115. package/lib/layer/layer-legend/layer-legend.component.d.ts +0 -1
  116. package/lib/layer/layer.module.d.ts +1 -1
  117. package/lib/layer/shared/layer.service.d.ts +1 -1
  118. package/lib/layer/shared/layers/layer.d.ts +7 -0
  119. package/lib/layer/shared/layers/layer.interface.d.ts +8 -0
  120. package/lib/layer/shared/layers/tile-layer.d.ts +10 -1
  121. package/lib/layer/shared/layers/vector-layer.d.ts +2 -1
  122. package/lib/layer/shared/layers/vector-layer.interface.d.ts +1 -0
  123. package/lib/layer/shared/layers/vectortile-layer.interface.d.ts +1 -0
  124. package/lib/layer/shared/style.service.d.ts +4 -1
  125. package/lib/layer/shared/vector-style.interface.d.ts +9 -5
  126. package/lib/layer/utils/index.d.ts +1 -0
  127. package/lib/layer/utils/layer.utils.d.ts +2 -0
  128. package/lib/map/home-extent-button/home-extent-button.component.d.ts +20 -0
  129. package/lib/map/home-extent-button/index.d.ts +1 -0
  130. package/lib/map/index.d.ts +2 -0
  131. package/lib/map/info-section/index.d.ts +1 -0
  132. package/lib/map/info-section/info-section.component.d.ts +7 -0
  133. package/lib/map/map.module.d.ts +19 -17
  134. package/lib/map/shared/hover-feature.directive.d.ts +14 -5
  135. package/lib/map/shared/mapOffline.directive.d.ts +1 -0
  136. package/lib/query/shared/query.interfaces.d.ts +3 -0
  137. package/lib/query/shared/query.service.d.ts +9 -1
  138. package/lib/query/shared/query.utils.d.ts +12 -0
  139. package/lib/search/shared/search-pointer-summary.directive.d.ts +6 -0
  140. package/lib/search/shared/search.interfaces.d.ts +1 -0
  141. package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +23 -0
  142. package/lib/workspace/confirmation-popup/confirmation-popup.module.d.ts +14 -0
  143. package/lib/workspace/confirmation-popup/index.d.ts +2 -0
  144. package/lib/workspace/index.d.ts +1 -0
  145. package/lib/workspace/shared/edition-workspace.d.ts +81 -0
  146. package/lib/workspace/shared/edition-workspace.service.d.ts +45 -0
  147. package/lib/workspace/shared/feature-workspace.d.ts +3 -0
  148. package/lib/workspace/shared/feature-workspace.service.d.ts +2 -0
  149. package/lib/workspace/shared/index.d.ts +2 -0
  150. package/lib/workspace/shared/wfs-workspace.d.ts +3 -0
  151. package/lib/workspace/shared/wfs-workspace.service.d.ts +2 -0
  152. package/lib/workspace/shared/wms-workspace.service.d.ts +2 -0
  153. package/lib/workspace/shared/workspace.utils.d.ts +3 -2
  154. package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +10 -3
  155. package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +3 -1
  156. package/lib/workspace/workspace.module.d.ts +8 -5
  157. package/package.json +4 -4
  158. package/style/geo.theming.scss +1 -0
@@ -0,0 +1,271 @@
1
+ import { Workspace } from '@igo2/common';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { VectorLayer } from '../../layer';
4
+ import { ConfirmationPopupComponent } from '../confirmation-popup/confirmation-popup.component';
5
+ import { DrawControl } from '../../geometry';
6
+ import { createInteractionStyle, GeometryType } from '../../draw';
7
+ import { featureToOl } from '../../feature';
8
+ import OlGeoJSON from 'ol/format/GeoJSON';
9
+ import OlVectorSource from 'ol/source/Vector';
10
+ import * as OlStyle from 'ol/style';
11
+ import OlModify from 'ol/interaction/Modify';
12
+ import Collection from 'ol/Collection';
13
+ import { FeatureDataSource } from '../../datasource/shared';
14
+ export class EditionWorkspace extends Workspace {
15
+ constructor(options, editionWorkspaceService, dialog, configService) {
16
+ super(options);
17
+ this.options = options;
18
+ this.editionWorkspaceService = editionWorkspaceService;
19
+ this.dialog = dialog;
20
+ this.configService = configService;
21
+ this.inResolutionRange$ = new BehaviorSubject(true);
22
+ this.olDrawingLayerSource = new OlVectorSource();
23
+ this.geometryType = GeometryType; // Reference to the GeometryType enum
24
+ this.modifyStyle = new OlStyle.Style({
25
+ stroke: new OlStyle.Stroke({
26
+ color: 'rgba(255,255,255,1)',
27
+ width: 1
28
+ }),
29
+ fill: new OlStyle.Fill({
30
+ color: 'rgba(0,161,222,1)'
31
+ }),
32
+ image: new OlStyle.Circle({
33
+ radius: 7,
34
+ stroke: new OlStyle.Stroke({
35
+ color: 'rgba(255,255,255,1)',
36
+ width: 1
37
+ }),
38
+ fill: new OlStyle.Fill({
39
+ color: 'rgba(0,161,222,1)'
40
+ })
41
+ })
42
+ });
43
+ this.filterClauseFunc = (record) => {
44
+ return record.state.newFeature === true;
45
+ };
46
+ this.map.viewController.resolution$.subscribe((mapResolution) => {
47
+ if (mapResolution > this.layer.minResolution && mapResolution < this.layer.maxResolution) {
48
+ this.inResolutionRange$.next(true);
49
+ }
50
+ else {
51
+ this.inResolutionRange$.next(false);
52
+ }
53
+ });
54
+ this.drawControl = this.createDrawControl();
55
+ this.drawControl.setGeometryType(this.geometryType.Point);
56
+ this.map.removeLayer(this.olDrawingLayer);
57
+ this.olDrawingLayer = new VectorLayer({
58
+ id: 'igo-draw-layer',
59
+ title: 'edition',
60
+ zIndex: 300,
61
+ source: new FeatureDataSource(),
62
+ showInLayerList: false,
63
+ exportable: false,
64
+ browsable: false,
65
+ workspace: {
66
+ enabled: false
67
+ },
68
+ });
69
+ }
70
+ get layer() { return this.options.layer; }
71
+ get map() { return this.options.map; }
72
+ getInResolutionRange() {
73
+ return this.inResolutionRange$.value;
74
+ }
75
+ deleteFeature(feature, workspace) {
76
+ setTimeout(() => {
77
+ const dialogRef = this.dialog.open(ConfirmationPopupComponent, {
78
+ disableClose: false,
79
+ data: { type: 'delete' }
80
+ });
81
+ dialogRef.afterClosed().subscribe(result => {
82
+ if (result === false) {
83
+ const baseUrl = workspace.layer.dataSource.options.edition.baseUrl;
84
+ const deleteUrl = workspace.layer.dataSource.options.edition.deleteUrl;
85
+ let id;
86
+ let url;
87
+ if (baseUrl) {
88
+ url = this.configService.getConfig('edition.url') + baseUrl + '?' + deleteUrl;
89
+ }
90
+ else {
91
+ url = this.configService.getConfig('edition.url') + deleteUrl;
92
+ }
93
+ for (const column of workspace.meta.tableTemplate.columns) {
94
+ for (const property in feature.properties) {
95
+ let columnName = column.name;
96
+ if (columnName.includes('properties.')) {
97
+ columnName = columnName.split('.')[1];
98
+ }
99
+ if (columnName === property && column.primary === true) {
100
+ id = feature.properties[property];
101
+ }
102
+ }
103
+ }
104
+ if (url) {
105
+ url += id;
106
+ this.editionWorkspaceService.deleteFeature(workspace, url);
107
+ }
108
+ }
109
+ });
110
+ }, 250);
111
+ }
112
+ editFeature(feature, workspace) {
113
+ feature.edition = true;
114
+ let id;
115
+ let find = false;
116
+ const editionOpt = workspace.layer.dataSource.options.edition;
117
+ for (const column of workspace.meta.tableTemplate.columns) {
118
+ // Update domain list
119
+ if (column.type === 'list' || column.type === 'autocomplete') {
120
+ this.editionWorkspaceService.getDomainValues(column.relation.table).subscribe(result => {
121
+ column.domainValues = result;
122
+ });
123
+ }
124
+ if (find === false) {
125
+ for (const property in feature.properties) {
126
+ let columnName = column.name;
127
+ if (columnName.includes('properties.')) {
128
+ columnName = columnName.split('.')[1];
129
+ }
130
+ if (columnName === property && column.primary === true) {
131
+ id = feature.properties[property];
132
+ find = true;
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ }
138
+ if (id) {
139
+ feature.original_properties = JSON.parse(JSON.stringify(feature.properties));
140
+ feature.original_geometry = feature.geometry;
141
+ feature.idkey = id;
142
+ this.addFeatureToStore(feature, workspace);
143
+ }
144
+ else {
145
+ // Only for edition with it's own geometry
146
+ if (!feature.newFeature && editionOpt.geomType) {
147
+ feature.newFeature = true;
148
+ this.editionWorkspaceService.adding$.next(true);
149
+ workspace.entityStore.state.updateAll({ newFeature: false });
150
+ workspace.entityStore.stateView.filter(this.filterClauseFunc);
151
+ if (editionOpt.addWithDraw) {
152
+ const geometryType = editionOpt.geomType;
153
+ this.onGeometryTypeChange(geometryType, feature, workspace);
154
+ }
155
+ else {
156
+ workspace.entityStore.insert(feature);
157
+ workspace.entityStore.state.update(feature, { newFeature: true }, true);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ /**
163
+ * Create a Draw Control
164
+ * @param fillColor the fill color
165
+ * @param strokeColor the stroke color
166
+ * @param strokeWidth the stroke width
167
+ * @returns a Draw Control
168
+ */
169
+ createDrawControl(fillColor, strokeColor, strokeWidth) {
170
+ const drawControl = new DrawControl({
171
+ geometryType: undefined,
172
+ drawingLayerSource: this.olDrawingLayerSource,
173
+ drawingLayerStyle: new OlStyle.Style({}),
174
+ interactionStyle: createInteractionStyle(fillColor, strokeColor, strokeWidth),
175
+ });
176
+ return drawControl;
177
+ }
178
+ /**
179
+ * Called when the user selects a new geometry type
180
+ * @param geometryType the geometry type selected by the user
181
+ */
182
+ onGeometryTypeChange(geometryType, feature, workspace) {
183
+ this.drawControl.setGeometryType(geometryType);
184
+ this.toggleDrawControl(feature, workspace);
185
+ }
186
+ /**
187
+ * Activate the correct control
188
+ */
189
+ toggleDrawControl(feature, workspace) {
190
+ this.deactivateDrawControl();
191
+ this.activateDrawControl(feature, workspace);
192
+ }
193
+ /**
194
+ * Deactivate the active draw control
195
+ */
196
+ deactivateDrawControl() {
197
+ if (!this.drawControl) {
198
+ return;
199
+ }
200
+ if (this.drawEnd$$) {
201
+ this.drawEnd$$.unsubscribe();
202
+ }
203
+ this.drawControl.setOlMap(undefined);
204
+ }
205
+ /**
206
+ * Activate a given control
207
+ */
208
+ activateDrawControl(feature, workspace) {
209
+ this.drawEnd$$ = this.drawControl.end$.subscribe((olGeometry) => {
210
+ this.addFeatureToStore(feature, workspace, olGeometry);
211
+ });
212
+ this.drawControl.setOlMap(this.map.ol, true);
213
+ }
214
+ /**
215
+ * Add a feature to layer. The loading strategy of the layer
216
+ * will trigger and add the feature to the workspace store.
217
+ * @internal
218
+ */
219
+ addFeatureToStore(feature, workspace, olGeometry) {
220
+ const projection = this.map.ol.getView().getProjection();
221
+ let geometry = feature.geometry;
222
+ // If an olGeometry is passed, it means that it is a new feature
223
+ if (olGeometry) {
224
+ workspace.entityStore.insert(feature);
225
+ workspace.entityStore.state.update(feature, { newFeature: true }, true);
226
+ geometry = new OlGeoJSON().writeGeometryObject(olGeometry, {
227
+ featureProjection: projection,
228
+ dataProjection: 'EPSG:4326'
229
+ });
230
+ feature.geometry = geometry;
231
+ }
232
+ feature.projection = 'EPSG:4326';
233
+ const featureOl = featureToOl(feature, projection.getCode());
234
+ this.olDrawingLayer.dataSource.ol.clear();
235
+ this.olDrawingLayer.dataSource.ol.addFeature(featureOl);
236
+ this.map.addLayer(this.olDrawingLayer);
237
+ this.deactivateDrawControl();
238
+ this.createModifyInteraction(featureOl, feature, workspace);
239
+ }
240
+ /**
241
+ * Delete drawings layer and source from the map AND feature from the entity store.
242
+ * Layer refresh will automatically add the new feature into the store.
243
+ */
244
+ deleteDrawings() {
245
+ this.map.removeLayer(this.olDrawingLayer);
246
+ this.olDrawingLayerSource.clear();
247
+ this.map.ol.removeInteraction(this.modify);
248
+ }
249
+ /**
250
+ * Create a modify interaction to allow a geometry change one feature at the time (drag and drop)
251
+ */
252
+ createModifyInteraction(olFeature, feature, workspace) {
253
+ this.map.ol.removeInteraction(this.modify);
254
+ const olCollection = new Collection([olFeature], { unique: true });
255
+ this.modify = new OlModify({
256
+ features: olCollection
257
+ });
258
+ this.map.ol.addInteraction(this.modify);
259
+ olCollection.forEach(feature => {
260
+ feature.setStyle(this.modifyStyle);
261
+ });
262
+ this.modify.on('modifyend', (event) => {
263
+ var _a;
264
+ const olGeometry = (_a = event.features.getArray()[0]) === null || _a === void 0 ? void 0 : _a.getGeometry();
265
+ if (olGeometry) {
266
+ this.addFeatureToStore(feature, workspace, olGeometry);
267
+ }
268
+ });
269
+ }
270
+ }
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGlvbi13b3Jrc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi93b3Jrc3BhY2Uvc2hhcmVkL2VkaXRpb24td29ya3NwYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxTQUFTLEVBR1YsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFckQsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd0RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNoRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTVDLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU81RCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsU0FBUztJQTJDN0MsWUFDWSxPQUFnQyxFQUNsQyx1QkFBZ0QsRUFDaEQsTUFBaUIsRUFDakIsYUFBNEI7UUFDcEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSkwsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFDbEMsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLGtC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QUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUM7WUFDekIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7O1lBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQUEsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsMENBQUUsV0FBVyxFQUFFLENBQUM7WUFDL0QsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDeEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7XHJcbiAgV29ya3NwYWNlLFxyXG4gIFdvcmtzcGFjZU9wdGlvbnMsXHJcbiAgRW50aXR5UmVjb3JkXHJcbn0gZnJvbSAnQGlnbzIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgSW1hZ2VMYXllciwgVmVjdG9yTGF5ZXIgfSBmcm9tICcuLi8uLi9sYXllcic7XHJcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcCc7XHJcbmltcG9ydCB7IEVkaXRpb25Xb3Jrc3BhY2VTZXJ2aWNlIH0gZnJvbSAnLi9lZGl0aW9uLXdvcmtzcGFjZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9jb25maXJtYXRpb24tcG9wdXAvY29uZmlybWF0aW9uLXBvcHVwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyYXdDb250cm9sIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnknO1xyXG5pbXBvcnQgeyBjcmVhdGVJbnRlcmFjdGlvblN0eWxlLCBHZW9tZXRyeVR5cGUgfSBmcm9tICcuLi8uLi9kcmF3JztcclxuaW1wb3J0IHsgZmVhdHVyZVRvT2wgfSBmcm9tICcuLi8uLi9mZWF0dXJlJztcclxuXHJcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEdlb21ldHJ5VHlwZSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnlUeXBlJztcclxuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9sR2VvbWV0cnkgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcclxuaW1wb3J0IE9sR2VvSlNPTiBmcm9tICdvbC9mb3JtYXQvR2VvSlNPTic7XHJcbmltcG9ydCBPbFZlY3RvclNvdXJjZSBmcm9tICdvbC9zb3VyY2UvVmVjdG9yJztcclxuaW1wb3J0ICogYXMgT2xTdHlsZSBmcm9tICdvbC9zdHlsZSc7XHJcbmltcG9ydCBPbE1vZGlmeSBmcm9tICdvbC9pbnRlcmFjdGlvbi9Nb2RpZnknO1xyXG5pbXBvcnQgQ29sbGVjdGlvbiBmcm9tICdvbC9Db2xsZWN0aW9uJztcclxuaW1wb3J0IE9sRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcclxuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlL3NoYXJlZCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRpb25Xb3Jrc3BhY2VPcHRpb25zIGV4dGVuZHMgV29ya3NwYWNlT3B0aW9ucyB7XHJcbiAgbGF5ZXI6IEltYWdlTGF5ZXIgfCBWZWN0b3JMYXllcjtcclxuICBtYXA6IElnb01hcDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEVkaXRpb25Xb3Jrc3BhY2UgZXh0ZW5kcyBXb3Jrc3BhY2Uge1xyXG5cclxuICByZWFkb25seSBpblJlc29sdXRpb25SYW5nZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XHJcblxyXG4gIGdldCBsYXllcigpOiBJbWFnZUxheWVyIHwgVmVjdG9yTGF5ZXIgeyByZXR1cm4gdGhpcy5vcHRpb25zLmxheWVyOyB9XHJcblxyXG4gIGdldCBtYXAoKTogSWdvTWFwIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXA7IH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3Q29udHJvbDogRHJhd0NvbnRyb2w7XHJcbiAgcHJpdmF0ZSBkcmF3RW5kJCQ6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIG9sRHJhd2luZ0xheWVyU291cmNlID0gbmV3IE9sVmVjdG9yU291cmNlKCk7XHJcbiAgcHJpdmF0ZSBvbERyYXdpbmdMYXllcjogVmVjdG9yTGF5ZXI7XHJcbiAgcHVibGljIGdlb21ldHJ5VHlwZSA9IEdlb21ldHJ5VHlwZTsgLy8gUmVmZXJlbmNlIHRvIHRoZSBHZW9tZXRyeVR5cGUgZW51bVxyXG4gIHB1YmxpYyBtb2RpZnk7IC8vIFJlZmVyZW5jZSB0byB0aGUgb2wgaW50ZXJhY3Rpb25cclxuXHJcbiAgcHVibGljIG1vZGlmeVN0eWxlID0gbmV3IE9sU3R5bGUuU3R5bGUoe1xyXG4gICAgc3Ryb2tlOiBuZXcgT2xTdHlsZS5TdHJva2Uoe1xyXG4gICAgICBjb2xvcjogJ3JnYmEoMjU1LDI1NSwyNTUsMSknLFxyXG4gICAgICB3aWR0aDogMVxyXG4gICAgfSksXHJcbiAgICBmaWxsOiBuZXcgT2xTdHlsZS5GaWxsKHtcclxuICAgICAgY29sb3I6ICdyZ2JhKDAsMTYxLDIyMiwxKSdcclxuICAgIH0pLFxyXG4gICAgaW1hZ2U6IG5ldyBPbFN0eWxlLkNpcmNsZSh7XHJcbiAgICAgIHJhZGl1czogNyxcclxuICAgICAgc3Ryb2tlOiBuZXcgT2xTdHlsZS5TdHJva2Uoe1xyXG4gICAgICAgIGNvbG9yOiAncmdiYSgyNTUsMjU1LDI1NSwxKScsXHJcbiAgICAgICAgd2lkdGg6IDFcclxuICAgICAgfSksXHJcbiAgICAgIGZpbGw6IG5ldyBPbFN0eWxlLkZpbGwoe1xyXG4gICAgICAgIGNvbG9yOiAncmdiYSgwLDE2MSwyMjIsMSknXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIGZpbHRlckNsYXVzZUZ1bmMgPSAocmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4ge1xyXG4gICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5uZXdGZWF0dXJlID09PSB0cnVlO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBmaWxsQ29sb3I6IHN0cmluZztcclxuICBwdWJsaWMgc3Ryb2tlQ29sb3I6IHN0cmluZztcclxuICBwdWJsaWMgc3Ryb2tlV2lkdGg6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgb3B0aW9uczogRWRpdGlvbldvcmtzcGFjZU9wdGlvbnMsXHJcbiAgICBwcml2YXRlIGVkaXRpb25Xb3Jrc3BhY2VTZXJ2aWNlOiBFZGl0aW9uV29ya3NwYWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgdGhpcy5tYXAudmlld0NvbnRyb2xsZXIucmVzb2x1dGlvbiQuc3Vic2NyaWJlKChtYXBSZXNvbHV0aW9uKSA9PiB7XHJcbiAgICAgIGlmIChtYXBSZXNvbHV0aW9uID4gdGhpcy5sYXllci5taW5SZXNvbHV0aW9uICYmIG1hcFJlc29sdXRpb24gPCB0aGlzLmxheWVyLm1heFJlc29sdXRpb24pIHtcclxuICAgICAgICB0aGlzLmluUmVzb2x1dGlvblJhbmdlJC5uZXh0KHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaW5SZXNvbHV0aW9uUmFuZ2UkLm5leHQoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRyYXdDb250cm9sID0gdGhpcy5jcmVhdGVEcmF3Q29udHJvbCgpO1xyXG4gICAgdGhpcy5kcmF3Q29udHJvbC5zZXRHZW9tZXRyeVR5cGUodGhpcy5nZW9tZXRyeVR5cGUuUG9pbnQgYXMgYW55KTtcclxuXHJcbiAgICB0aGlzLm1hcC5yZW1vdmVMYXllcih0aGlzLm9sRHJhd2luZ0xheWVyKTtcclxuXHJcbiAgICB0aGlzLm9sRHJhd2luZ0xheWVyID0gbmV3IFZlY3RvckxheWVyKHtcclxuICAgICAgaWQ6ICdpZ28tZHJhdy1sYXllcicsXHJcbiAgICAgIHRpdGxlOiAnZWRpdGlvbicsXHJcbiAgICAgIHpJbmRleDogMzAwLFxyXG4gICAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxyXG4gICAgICBzaG93SW5MYXllckxpc3Q6IGZhbHNlLFxyXG4gICAgICBleHBvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgYnJvd3NhYmxlOiBmYWxzZSxcclxuICAgICAgd29ya3NwYWNlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJblJlc29sdXRpb25SYW5nZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmluUmVzb2x1dGlvblJhbmdlJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZUZlYXR1cmUoZmVhdHVyZSwgd29ya3NwYWNlKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25Qb3B1cENvbXBvbmVudCwge1xyXG4gICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgICAgZGF0YToge3R5cGU6ICdkZWxldGUnfVxyXG4gICAgfSk7XHJcblxyXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgY29uc3QgYmFzZVVybCA9IHdvcmtzcGFjZS5sYXllci5kYXRhU291cmNlLm9wdGlvbnMuZWRpdGlvbi5iYXNlVXJsO1xyXG4gICAgICAgICAgY29uc3QgZGVsZXRlVXJsID0gd29ya3NwYWNlLmxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uLmRlbGV0ZVVybDtcclxuICAgICAgICAgIGxldCBpZDtcclxuICAgICAgICAgIGxldCB1cmw7XHJcbiAgICAgICAgICBpZiAoYmFzZVVybCkge1xyXG4gICAgICAgICAgICB1cmwgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCdlZGl0aW9uLnVybCcpICsgYmFzZVVybCArICc/JyArIGRlbGV0ZVVybDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHVybCA9IHRoaXMuY29uZmlnU2VydmljZS5nZXRDb25maWcoJ2VkaXRpb24udXJsJykgKyBkZWxldGVVcmw7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2Ygd29ya3NwYWNlLm1ldGEudGFibGVUZW1wbGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZmVhdHVyZS5wcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbk5hbWUgPSBjb2x1bW4ubmFtZTtcclxuICAgICAgICAgICAgICBpZiAoY29sdW1uTmFtZS5pbmNsdWRlcygncHJvcGVydGllcy4nKSkge1xyXG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZSA9IGNvbHVtbk5hbWUuc3BsaXQoJy4nKVsxXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbk5hbWUgPT09IHByb3BlcnR5ICYmIGNvbHVtbi5wcmltYXJ5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZCA9IGZlYXR1cmUucHJvcGVydGllc1twcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgIHVybCArPSBpZDtcclxuICAgICAgICAgICAgdGhpcy5lZGl0aW9uV29ya3NwYWNlU2VydmljZS5kZWxldGVGZWF0dXJlKHdvcmtzcGFjZSwgdXJsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIGVkaXRGZWF0dXJlKGZlYXR1cmUsIHdvcmtzcGFjZTogRWRpdGlvbldvcmtzcGFjZSkge1xyXG4gICAgZmVhdHVyZS5lZGl0aW9uID0gdHJ1ZTtcclxuICAgIGxldCBpZDtcclxuICAgIGxldCBmaW5kID0gZmFsc2U7XHJcbiAgICBjb25zdCBlZGl0aW9uT3B0ID0gd29ya3NwYWNlLmxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uO1xyXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2Ygd29ya3NwYWNlLm1ldGEudGFibGVUZW1wbGF0ZS5jb2x1bW5zICkge1xyXG5cclxuICAgICAgLy8gVXBkYXRlIGRvbWFpbiBsaXN0XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2xpc3QnIHx8IGNvbHVtbi50eXBlID09PSAnYXV0b2NvbXBsZXRlJykge1xyXG4gICAgICAgIHRoaXMuZWRpdGlvbldvcmtzcGFjZVNlcnZpY2UuZ2V0RG9tYWluVmFsdWVzKGNvbHVtbi5yZWxhdGlvbi50YWJsZSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICBjb2x1bW4uZG9tYWluVmFsdWVzID0gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaW5kID09PSBmYWxzZSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZmVhdHVyZS5wcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICBsZXQgY29sdW1uTmFtZSA9IGNvbHVtbi5uYW1lO1xyXG4gICAgICAgICAgaWYgKGNvbHVtbk5hbWUuaW5jbHVkZXMoJ3Byb3BlcnRpZXMuJykpIHtcclxuICAgICAgICAgICAgY29sdW1uTmFtZSA9IGNvbHVtbk5hbWUuc3BsaXQoJy4nKVsxXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjb2x1bW5OYW1lID09PSBwcm9wZXJ0eSAmJiBjb2x1bW4ucHJpbWFyeSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZCA9IGZlYXR1cmUucHJvcGVydGllc1twcm9wZXJ0eV07XHJcbiAgICAgICAgICAgIGZpbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChpZCkge1xyXG4gICAgICBmZWF0dXJlLm9yaWdpbmFsX3Byb3BlcnRpZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZlYXR1cmUucHJvcGVydGllcykpO1xyXG4gICAgICBmZWF0dXJlLm9yaWdpbmFsX2dlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeTtcclxuICAgICAgZmVhdHVyZS5pZGtleSA9IGlkO1xyXG4gICAgICB0aGlzLmFkZEZlYXR1cmVUb1N0b3JlKGZlYXR1cmUsIHdvcmtzcGFjZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBPbmx5IGZvciBlZGl0aW9uIHdpdGggaXQncyBvd24gZ2VvbWV0cnlcclxuICAgICAgaWYgKCFmZWF0dXJlLm5ld0ZlYXR1cmUgJiYgZWRpdGlvbk9wdC5nZW9tVHlwZSkge1xyXG4gICAgICAgIGZlYXR1cmUubmV3RmVhdHVyZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lZGl0aW9uV29ya3NwYWNlU2VydmljZS5hZGRpbmckLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLnN0YXRlLnVwZGF0ZUFsbCh7IG5ld0ZlYXR1cmU6IGZhbHNlIH0pO1xyXG4gICAgICAgIHdvcmtzcGFjZS5lbnRpdHlTdG9yZS5zdGF0ZVZpZXcuZmlsdGVyKHRoaXMuZmlsdGVyQ2xhdXNlRnVuYyk7XHJcbiAgICAgICAgaWYgKGVkaXRpb25PcHQuYWRkV2l0aERyYXcpIHtcclxuICAgICAgICAgIGNvbnN0IGdlb21ldHJ5VHlwZSA9IGVkaXRpb25PcHQuZ2VvbVR5cGU7XHJcbiAgICAgICAgICB0aGlzLm9uR2VvbWV0cnlUeXBlQ2hhbmdlKGdlb21ldHJ5VHlwZSwgZmVhdHVyZSwgd29ya3NwYWNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLmluc2VydChmZWF0dXJlKTtcclxuICAgICAgICAgIHdvcmtzcGFjZS5lbnRpdHlTdG9yZS5zdGF0ZS51cGRhdGUoZmVhdHVyZSwgeyBuZXdGZWF0dXJlOiB0cnVlIH0sIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHJhdyBDb250cm9sXHJcbiAgICogQHBhcmFtIGZpbGxDb2xvciB0aGUgZmlsbCBjb2xvclxyXG4gICAqIEBwYXJhbSBzdHJva2VDb2xvciB0aGUgc3Ryb2tlIGNvbG9yXHJcbiAgICogQHBhcmFtIHN0cm9rZVdpZHRoIHRoZSBzdHJva2Ugd2lkdGhcclxuICAgKiBAcmV0dXJucyBhIERyYXcgQ29udHJvbFxyXG4gICAqL1xyXG4gIGNyZWF0ZURyYXdDb250cm9sKGZpbGxDb2xvcj86IHN0cmluZywgc3Ryb2tlQ29sb3I/OiBzdHJpbmcsIHN0cm9rZVdpZHRoPzogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBkcmF3Q29udHJvbCA9IG5ldyBEcmF3Q29udHJvbCh7XHJcbiAgICAgIGdlb21ldHJ5VHlwZTogdW5kZWZpbmVkLFxyXG4gICAgICBkcmF3aW5nTGF5ZXJTb3VyY2U6IHRoaXMub2xEcmF3aW5nTGF5ZXJTb3VyY2UsXHJcbiAgICAgIGRyYXdpbmdMYXllclN0eWxlOiBuZXcgT2xTdHlsZS5TdHlsZSh7fSksXHJcbiAgICAgIGludGVyYWN0aW9uU3R5bGU6IGNyZWF0ZUludGVyYWN0aW9uU3R5bGUoZmlsbENvbG9yLCBzdHJva2VDb2xvciwgc3Ryb2tlV2lkdGgpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGRyYXdDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyBnZW9tZXRyeSB0eXBlXHJcbiAgICogQHBhcmFtIGdlb21ldHJ5VHlwZSB0aGUgZ2VvbWV0cnkgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlclxyXG4gICAqL1xyXG4gIG9uR2VvbWV0cnlUeXBlQ2hhbmdlKGdlb21ldHJ5VHlwZTogdHlwZW9mIE9sR2VvbWV0cnlUeXBlLCBmZWF0dXJlLCB3b3Jrc3BhY2U6IEVkaXRpb25Xb3Jrc3BhY2UpIHtcclxuICAgICAgdGhpcy5kcmF3Q29udHJvbC5zZXRHZW9tZXRyeVR5cGUoZ2VvbWV0cnlUeXBlKTtcclxuICAgICAgdGhpcy50b2dnbGVEcmF3Q29udHJvbChmZWF0dXJlLCB3b3Jrc3BhY2UpO1xyXG4gICAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3RpdmF0ZSB0aGUgY29ycmVjdCBjb250cm9sXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0b2dnbGVEcmF3Q29udHJvbChmZWF0dXJlLCB3b3Jrc3BhY2U6IEVkaXRpb25Xb3Jrc3BhY2UpIHtcclxuICAgIHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XHJcbiAgICB0aGlzLmFjdGl2YXRlRHJhd0NvbnRyb2woZmVhdHVyZSwgd29ya3NwYWNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlYWN0aXZhdGUgdGhlIGFjdGl2ZSBkcmF3IGNvbnRyb2xcclxuICAgKi9cclxuICBwdWJsaWMgZGVhY3RpdmF0ZURyYXdDb250cm9sKCkge1xyXG4gICAgaWYgKCF0aGlzLmRyYXdDb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kcmF3RW5kJCQpIHtcclxuICAgICAgdGhpcy5kcmF3RW5kJCQudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRyYXdDb250cm9sLnNldE9sTWFwKHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3RpdmF0ZSBhIGdpdmVuIGNvbnRyb2xcclxuICAgKi9cclxuICBwcml2YXRlIGFjdGl2YXRlRHJhd0NvbnRyb2woZmVhdHVyZSwgd29ya3NwYWNlOiBFZGl0aW9uV29ya3NwYWNlKSB7XHJcbiAgICB0aGlzLmRyYXdFbmQkJCA9IHRoaXMuZHJhd0NvbnRyb2wuZW5kJC5zdWJzY3JpYmUoKG9sR2VvbWV0cnk6IE9sR2VvbWV0cnkpID0+IHtcclxuICAgICAgdGhpcy5hZGRGZWF0dXJlVG9TdG9yZShmZWF0dXJlLCB3b3Jrc3BhY2UsIG9sR2VvbWV0cnkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kcmF3Q29udHJvbC5zZXRPbE1hcCh0aGlzLm1hcC5vbCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgYSBmZWF0dXJlIHRvIGxheWVyLiBUaGUgbG9hZGluZyBzdHJhdGVneSBvZiB0aGUgbGF5ZXJcclxuICAgKiB3aWxsIHRyaWdnZXIgYW5kIGFkZCB0aGUgZmVhdHVyZSB0byB0aGUgd29ya3NwYWNlIHN0b3JlLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWRkRmVhdHVyZVRvU3RvcmUoZmVhdHVyZSwgd29ya3NwYWNlOiBFZGl0aW9uV29ya3NwYWNlLCBvbEdlb21ldHJ5PzogT2xHZW9tZXRyeSkge1xyXG4gICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCk7XHJcbiAgICBsZXQgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xyXG5cclxuICAgIC8vIElmIGFuIG9sR2VvbWV0cnkgaXMgcGFzc2VkLCBpdCBtZWFucyB0aGF0IGl0IGlzIGEgbmV3IGZlYXR1cmVcclxuICAgIGlmIChvbEdlb21ldHJ5KSB7XHJcbiAgICAgIHdvcmtzcGFjZS5lbnRpdHlTdG9yZS5pbnNlcnQoZmVhdHVyZSk7XHJcbiAgICAgIHdvcmtzcGFjZS5lbnRpdHlTdG9yZS5zdGF0ZS51cGRhdGUoZmVhdHVyZSwgeyBuZXdGZWF0dXJlOiB0cnVlIH0sIHRydWUpO1xyXG4gICAgICBnZW9tZXRyeSA9IG5ldyBPbEdlb0pTT04oKS53cml0ZUdlb21ldHJ5T2JqZWN0KG9sR2VvbWV0cnksIHtcclxuICAgICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvbixcclxuICAgICAgICBkYXRhUHJvamVjdGlvbjogJ0VQU0c6NDMyNidcclxuICAgICAgfSkgYXMgYW55O1xyXG5cclxuICAgICAgZmVhdHVyZS5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG4gICAgfVxyXG5cclxuICAgIGZlYXR1cmUucHJvamVjdGlvbiA9ICdFUFNHOjQzMjYnO1xyXG5cclxuICAgIGNvbnN0IGZlYXR1cmVPbCA9IGZlYXR1cmVUb09sKGZlYXR1cmUsIHByb2plY3Rpb24uZ2V0Q29kZSgpKTtcclxuXHJcbiAgICB0aGlzLm9sRHJhd2luZ0xheWVyLmRhdGFTb3VyY2Uub2wuY2xlYXIoKTtcclxuICAgIHRoaXMub2xEcmF3aW5nTGF5ZXIuZGF0YVNvdXJjZS5vbC5hZGRGZWF0dXJlKGZlYXR1cmVPbCk7XHJcbiAgICB0aGlzLm1hcC5hZGRMYXllcih0aGlzLm9sRHJhd2luZ0xheWVyKTtcclxuXHJcbiAgICB0aGlzLmRlYWN0aXZhdGVEcmF3Q29udHJvbCgpO1xyXG4gICAgdGhpcy5jcmVhdGVNb2RpZnlJbnRlcmFjdGlvbihmZWF0dXJlT2wsIGZlYXR1cmUsIHdvcmtzcGFjZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgZHJhd2luZ3MgbGF5ZXIgYW5kIHNvdXJjZSBmcm9tIHRoZSBtYXAgQU5EIGZlYXR1cmUgZnJvbSB0aGUgZW50aXR5IHN0b3JlLlxyXG4gICAqIExheWVyIHJlZnJlc2ggd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgbmV3IGZlYXR1cmUgaW50byB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgZGVsZXRlRHJhd2luZ3MoKSB7XHJcbiAgICB0aGlzLm1hcC5yZW1vdmVMYXllcih0aGlzLm9sRHJhd2luZ0xheWVyKTtcclxuICAgIHRoaXMub2xEcmF3aW5nTGF5ZXJTb3VyY2UuY2xlYXIoKTtcclxuICAgIHRoaXMubWFwLm9sLnJlbW92ZUludGVyYWN0aW9uKHRoaXMubW9kaWZ5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIG1vZGlmeSBpbnRlcmFjdGlvbiB0byBhbGxvdyBhIGdlb21ldHJ5IGNoYW5nZSBvbmUgZmVhdHVyZSBhdCB0aGUgdGltZSAoZHJhZyBhbmQgZHJvcClcclxuICAgKi9cclxuICBjcmVhdGVNb2RpZnlJbnRlcmFjdGlvbihvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PiwgZmVhdHVyZSwgd29ya3NwYWNlOiBFZGl0aW9uV29ya3NwYWNlKSB7XHJcbiAgICB0aGlzLm1hcC5vbC5yZW1vdmVJbnRlcmFjdGlvbih0aGlzLm1vZGlmeSk7XHJcbiAgICBjb25zdCBvbENvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihbb2xGZWF0dXJlXSwgeyB1bmlxdWU6IHRydWUgfSk7XHJcbiAgICB0aGlzLm1vZGlmeSA9IG5ldyBPbE1vZGlmeSh7XHJcbiAgICAgIGZlYXR1cmVzOiBvbENvbGxlY3Rpb25cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubWFwLm9sLmFkZEludGVyYWN0aW9uKHRoaXMubW9kaWZ5KTtcclxuICAgIG9sQ29sbGVjdGlvbi5mb3JFYWNoKGZlYXR1cmUgPT4ge1xyXG4gICAgICBmZWF0dXJlLnNldFN0eWxlKHRoaXMubW9kaWZ5U3R5bGUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5tb2RpZnkub24oJ21vZGlmeWVuZCcsIChldmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBvbEdlb21ldHJ5ID0gZXZlbnQuZmVhdHVyZXMuZ2V0QXJyYXkoKVswXT8uZ2V0R2VvbWV0cnkoKTtcclxuICAgICAgaWYgKG9sR2VvbWV0cnkpIHtcclxuICAgICAgICB0aGlzLmFkZEZlYXR1cmVUb1N0b3JlKGZlYXR1cmUsIHdvcmtzcGFjZSwgb2xHZW9tZXRyeSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=