@colijnit/homedecorator 258.1.1 → 258.1.2

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 (92) hide show
  1. package/app/core/enum/icon.enum.d.ts +1 -0
  2. package/app/core/enum/message-type.enum.d.ts +2 -1
  3. package/app/core/interface/message-with-payload.interface.d.ts +1 -0
  4. package/app/core/model/homedecorator-settings-options.d.ts +1 -1
  5. package/app/core/model/homedecorator-settings.d.ts +3 -0
  6. package/app/core/service/3dm-api.d.ts +2 -2
  7. package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
  8. package/app/core/service/homedecorator-connector-adapter.service.d.ts +9 -1
  9. package/app/core/service/homedecorator-connector.service.d.ts +15 -2
  10. package/app/core/service/utils.service.d.ts +1 -1
  11. package/app/core/utils/object.utils.d.ts +2 -0
  12. package/app/homedecorator.module.d.ts +2 -1
  13. package/app/plugins/core3d/service/wall-measurements.service.d.ts +2 -0
  14. package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +3 -0
  15. package/app/plugins/product-catalog/product-catalog/product-catalog.component.d.ts +2 -0
  16. package/app/plugins/product-configurator/product-configurator-selector-list-of-values.component.scss +28 -0
  17. package/app/plugins/product-configurator/product-configurator-selector-option-button.component.d.ts +19 -0
  18. package/app/plugins/product-configurator/product-configurator-selector-option-button.component.scss +38 -0
  19. package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.d.ts +20 -0
  20. package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.scss +0 -0
  21. package/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.d.ts +19 -0
  22. package/app/plugins/product-configurator/product-configurator-selector-option-tile.component.scss +56 -0
  23. package/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.d.ts +20 -0
  24. package/app/plugins/product-configurator/product-configurator-selector.component.d.ts +26 -0
  25. package/app/plugins/product-configurator/product-configurator-selector.component.scss +46 -0
  26. package/app/plugins/product-configurator/product-configurator.component.d.ts +38 -0
  27. package/app/plugins/product-configurator/product-configurator.component.scss +35 -0
  28. package/app/plugins/product-configurator/product-configurator.module.d.ts +18 -0
  29. package/app/plugins/product-configurator/template_variables.scss +13 -0
  30. package/app/plugins/render/model/blender-render-settings.d.ts +10 -0
  31. package/app/plugins/render/model/blender-scene-settings.d.ts +18 -0
  32. package/app/plugins/render/render-controls/render-controls.component.d.ts +19 -7
  33. package/app/plugins/render/service/new-render.service.d.ts +21 -4
  34. package/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.scss +1 -1
  35. package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +5 -0
  36. package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +4 -0
  37. package/app/plugins/threedselector/threedselector/threedselector.component.scss +17 -0
  38. package/app/plugins/threedselector/threedselector.module.d.ts +2 -1
  39. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
  40. package/assets/icons/circle_regular.svg +0 -0
  41. package/bundles/colijnit-homedecorator.umd.js +1986 -835
  42. package/bundles/colijnit-homedecorator.umd.js.map +1 -1
  43. package/esm2015/app/app.version.js +3 -3
  44. package/esm2015/app/core/enum/icon.enum.js +2 -1
  45. package/esm2015/app/core/enum/message-type.enum.js +2 -1
  46. package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
  47. package/esm2015/app/core/model/homedecorator-settings-options.js +2 -2
  48. package/esm2015/app/core/model/homedecorator-settings.js +3 -1
  49. package/esm2015/app/core/model/icon.js +2 -1
  50. package/esm2015/app/core/service/3dm-api.js +15 -22
  51. package/esm2015/app/core/service/homedecorator-app-event.service.js +3 -2
  52. package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +65 -7
  53. package/esm2015/app/core/service/homedecorator-connector.service.js +150 -6
  54. package/esm2015/app/core/service/homedecorator-settings.service.js +8 -1
  55. package/esm2015/app/core/service/utils.service.js +116 -93
  56. package/esm2015/app/core/utils/object.utils.js +13 -1
  57. package/esm2015/app/homedecorator.component.js +1 -2
  58. package/esm2015/app/homedecorator.module.js +8 -4
  59. package/esm2015/app/plugins/core3d/core3d/core3d.component.js +2 -2
  60. package/esm2015/app/plugins/core3d/service/wall-measurements.service.js +7 -1
  61. package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +98 -50
  62. package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +4 -4
  63. package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +21 -11
  64. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-button.component.js +67 -0
  65. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.js +57 -0
  66. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.js +75 -0
  67. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.js +90 -0
  68. package/esm2015/app/plugins/product-configurator/product-configurator-selector.component.js +253 -0
  69. package/esm2015/app/plugins/product-configurator/product-configurator.component.js +151 -0
  70. package/esm2015/app/plugins/product-configurator/product-configurator.module.js +115 -0
  71. package/esm2015/app/plugins/render/model/blender-render-settings.js +3 -0
  72. package/esm2015/app/plugins/render/model/blender-scene-settings.js +10 -0
  73. package/esm2015/app/plugins/render/model/render-parameters.js +3 -3
  74. package/esm2015/app/plugins/render/render-controls/render-controls.component.js +532 -446
  75. package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +6 -40
  76. package/esm2015/app/plugins/render/service/new-render.service.js +212 -44
  77. package/esm2015/app/plugins/render/service/render.service.js +6 -9
  78. package/esm2015/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.js +1 -1
  79. package/esm2015/app/plugins/room-planner/components/texture-picker/texture-picker.component.js +1 -1
  80. package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +12 -10
  81. package/esm2015/app/plugins/threedselector/element-buttons/element-buttons.component.js +2 -2
  82. package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +55 -1
  83. package/esm2015/app/plugins/threedselector/threedselector/service/load-furniture.service.js +3 -3
  84. package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +64 -15
  85. package/esm2015/app/plugins/threedselector/threedselector/utils/asset.utils.js +1 -1
  86. package/esm2015/app/plugins/threedselector/threedselector.module.js +8 -4
  87. package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +1 -1
  88. package/esm2015/app/shared/category-library/category-library.component.js +1 -1
  89. package/fesm2015/colijnit-homedecorator.js +2522 -1149
  90. package/fesm2015/colijnit-homedecorator.js.map +1 -1
  91. package/package.json +4 -4
  92. package/styles.scss +1 -1
@@ -7,15 +7,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { Injectable } from '@angular/core';
10
+ import { EventEmitter, Injectable } from '@angular/core';
11
11
  import axios from 'axios';
12
12
  import { BehaviorSubject } from 'rxjs';
13
- import { Light } from 'three';
13
+ import { Light, Vector3 } from 'three';
14
14
  import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter';
15
15
  import { RenderQueueItem } from '../model/render-queue-item';
16
16
  import { RenderStatus } from '../enum/render-status';
17
17
  import { MessageType } from '../../../core/enum/message-type.enum';
18
18
  import { SceneSettings } from '../../../core/service/3dm-api';
19
+ import { BlenderSceneSetting, BlenderSceneType } from '../model/blender-scene-settings';
19
20
  import * as i0 from "@angular/core";
20
21
  import * as i1 from "../../../core/service/message-bus.service";
21
22
  import * as i2 from "../../../core/service/homedecorator-settings.service";
@@ -31,8 +32,11 @@ import * as i11 from "../../room-planner/components/floorplanner/service/room.se
31
32
  import * as i12 from "../../core3d/service/floor.service";
32
33
  import * as i13 from "../../threedselector/threedselector/service/load-furniture.service";
33
34
  import * as i14 from "../../../core/service/utils.service";
35
+ import * as i15 from "../../../core/service/presets.service";
36
+ import * as i16 from "../../../core/service/3dm-api";
37
+ import * as i17 from "../../../core/service/homedecorator-app-event.service";
34
38
  export class NewRenderService {
35
- constructor(messageService, _settingsService, _buildFurnitureService, _cameraService, _sceneService, _ione, _ioneConnectorAdapter, _threedSelectorService, _toastService, _messageBusService, _googleTagManager, _roomService, _floorService, _loadFurnitureService, _utilsService) {
39
+ constructor(messageService, _settingsService, _buildFurnitureService, _cameraService, _sceneService, _ione, _ioneConnectorAdapter, _threedSelectorService, _toastService, _messageBusService, _googleTagManager, _roomService, _floorService, _loadFurnitureService, _utilsService, _presetService, _apiServiceModule, _appEventService) {
36
40
  this.messageService = messageService;
37
41
  this._settingsService = _settingsService;
38
42
  this._buildFurnitureService = _buildFurnitureService;
@@ -48,7 +52,11 @@ export class NewRenderService {
48
52
  this._floorService = _floorService;
49
53
  this._loadFurnitureService = _loadFurnitureService;
50
54
  this._utilsService = _utilsService;
55
+ this._presetService = _presetService;
56
+ this._apiServiceModule = _apiServiceModule;
57
+ this._appEventService = _appEventService;
51
58
  this.renderImageChanged = new BehaviorSubject('');
59
+ this.blenderRenderStarted = new EventEmitter();
52
60
  this.renderUpdateImageChanged = new BehaviorSubject(undefined);
53
61
  this.renderRoomImageChanged = new BehaviorSubject('');
54
62
  this.currentQueueRenderItem = new RenderQueueItem();
@@ -62,11 +70,21 @@ export class NewRenderService {
62
70
  procesRenderFile(file) {
63
71
  this.renderImageChanged.next(file);
64
72
  }
65
- forceRenderImage() {
66
- this._getNewRenderImage(true);
73
+ forceRenderImage(optionalRenderParameters) {
74
+ if (this._settingsService.settings.blendFilesRender) {
75
+ this._createRenderFromJson(true);
76
+ }
77
+ else {
78
+ this._getNewRenderImage(true, optionalRenderParameters);
79
+ }
67
80
  }
68
- renderImage() {
69
- this._getNewRenderImage();
81
+ renderImage(optionalRenderParameters) {
82
+ if (this._settingsService.settings.blendFilesRender) {
83
+ this._createRenderFromJson();
84
+ }
85
+ else {
86
+ this._getNewRenderImage(false, optionalRenderParameters);
87
+ }
70
88
  }
71
89
  renderRoom(size) {
72
90
  return __awaiter(this, void 0, void 0, function* () {
@@ -80,6 +98,10 @@ export class NewRenderService {
80
98
  }
81
99
  });
82
100
  }
101
+ getNewGlbFromServer() {
102
+ const data = this._getDataForRender();
103
+ this._handleAjaxGlb(data);
104
+ }
83
105
  _exportToGlb() {
84
106
  return __awaiter(this, void 0, void 0, function* () {
85
107
  // The ground plane looks odd in renders.
@@ -121,32 +143,89 @@ export class NewRenderService {
121
143
  }
122
144
  });
123
145
  }
124
- _getNewRenderImage(force = false) {
146
+ _getNewRenderImage(force = false, optionalRenderParameters) {
125
147
  return __awaiter(this, void 0, void 0, function* () {
126
- if (this._settingsService.settings.blendFilesRender) {
127
- // const data = this._getDataForRender(force);
128
- // this._handleAjaxBlenderRender(data);
129
- // this.messageService.emit(MessageType.ShowLoadingIndicator, {title: 'Rendering...'});
130
- const renderInput = {
131
- 'height': 800,
132
- 'width': 1200,
133
- 'sceneAssetId': this._settingsService.settings.productRenderSceneAssetId
134
- };
135
- yield this._utilsService.prepRoomForRender(true, renderInput);
148
+ const data = this._getDataForRender(force, optionalRenderParameters);
149
+ if (this._settingsService.settings.options.useRenderWebsocket) {
150
+ this._handleWebSocketRender(data);
136
151
  }
137
152
  else {
138
- const data = this._getDataForRender(force);
139
- if (this._settingsService.settings.options.useRenderWebsocket) {
140
- this._handleWebSocketRender(data);
141
- }
142
- else {
143
- this._handleAjaxRender(data);
144
- }
153
+ this._handleAjaxRender(data);
154
+ }
155
+ });
156
+ }
157
+ _createRenderFromJson(force = false) {
158
+ return __awaiter(this, void 0, void 0, function* () {
159
+ if (this._settingsService.settings.blendFilesRender) {
160
+ const data = this._getDataForJsonRender(force);
161
+ yield this._apiServiceModule.getRenderFromJson(data);
145
162
  }
146
163
  });
147
164
  }
165
+ _getDataForJsonRender(force) {
166
+ let multisceneRender = false;
167
+ const selections = this._ione.selections.map(s => Object.assign({}, s));
168
+ selections.forEach(s => {
169
+ s.imageData = undefined;
170
+ s.imageDataLastAnswer = undefined;
171
+ });
172
+ let configurable = false;
173
+ if (this._ione.decoNodes && this._ione.decoNodes.length !== 0) {
174
+ configurable = true;
175
+ }
176
+ const camera = this._apiServiceModule.getCameraProperties(this._cameraService.camera);
177
+ let position;
178
+ let rotation;
179
+ if (this._buildFurnitureService.currentCustomFloorGroup !== undefined) {
180
+ position = new Vector3(this._buildFurnitureService.currentCustomFloorGroup.position.x, 0, this._buildFurnitureService.currentCustomFloorGroup.position.z);
181
+ rotation = new Vector3(this._buildFurnitureService.currentCustomFloorGroup.rotation.x, this._buildFurnitureService.currentCustomFloorGroup.rotation.y, this._buildFurnitureService.currentCustomFloorGroup.rotation.z);
182
+ }
183
+ else {
184
+ position = new Vector3(0, 0, 0);
185
+ rotation = new Vector3(0, 0, 0);
186
+ }
187
+ const furniture = {
188
+ model_url: this._loadFurnitureService.article.assetUrl,
189
+ item_schema: this._loadFurnitureService.article.distSchema || 'UP_DBA',
190
+ item_assetPath: this._loadFurnitureService.article.contentDeliveryUrl,
191
+ item_identifier: this._loadFurnitureService.article.id,
192
+ configurable: configurable,
193
+ selections: selections,
194
+ decos: this._ione.decoNodes,
195
+ objectPosition: position,
196
+ objectRotation: rotation
197
+ };
198
+ if (this._settingsService.settings.productRenderSceneAssetId.toLowerCase().indexOf('multiscene') !== -1) {
199
+ multisceneRender = true;
200
+ }
201
+ return {
202
+ action: 'prepareRenderRequest',
203
+ multisceneCompositing: multisceneRender,
204
+ furniture: [furniture],
205
+ camera: camera,
206
+ force: force
207
+ };
208
+ }
209
+ // private async _handleAjaxBlenderRender(data: any): Promise<void> {
210
+ // const result = await axios({
211
+ // headers: {
212
+ // 'Content-Type': 'application/json'
213
+ // },
214
+ // method: 'POST',
215
+ // data: JSON.stringify(data),
216
+ // url: `${this._settingsService.settings.newRenderParameters.host}:${this._settingsService.settings.newRenderParameters.port}/getBlenderRenderFromData`,
217
+ // responseType: 'json'
218
+ // });
219
+ // if (result.status === 200) {
220
+ // // const image = `data:${result.data.fileType};base64,${result.data.image}`;
221
+ // // this._showPreviewImage(result.data.image);
222
+ // // console.log(image);
223
+ // this.renderImageChanged.next(result.data.image);
224
+ // }
225
+ // }
148
226
  _handleAjaxRender(data) {
149
227
  return __awaiter(this, void 0, void 0, function* () {
228
+ this.blenderRenderStarted.emit();
150
229
  const result = yield axios({
151
230
  headers: {
152
231
  'Content-Type': 'application/json'
@@ -164,6 +243,25 @@ export class NewRenderService {
164
243
  }
165
244
  });
166
245
  }
246
+ _handleAjaxGlb(data) {
247
+ return __awaiter(this, void 0, void 0, function* () {
248
+ const result = yield axios({
249
+ headers: {
250
+ 'Content-Type': 'application/json'
251
+ },
252
+ method: 'POST',
253
+ data: JSON.stringify(data),
254
+ url: `${this._settingsService.settings.renderParameters.host}/getGlbFromData`,
255
+ responseType: 'json'
256
+ });
257
+ if (result.status === 200) {
258
+ // const image = `data:${result.data.fileType};base64,${result.data.image}`;
259
+ // this._showPreviewImage(result.data.image);
260
+ // console.log(image);
261
+ this._appEventService.glbCreated.next(result.data.url);
262
+ }
263
+ });
264
+ }
167
265
  _handleWebSocketRender(data) {
168
266
  const webSocketConnection = this._settingsService.settings.renderParameters.websocket;
169
267
  const webSocket = new WebSocket(webSocketConnection);
@@ -221,17 +319,31 @@ export class NewRenderService {
221
319
  }
222
320
  img.src = src;
223
321
  }
224
- _getDataForRender(force = false) {
322
+ _getDataForRender(force = false, optionalRenderParameters) {
323
+ const objectRotation = new Vector3(0, 0, 0);
324
+ if (optionalRenderParameters && optionalRenderParameters.objectRotation) {
325
+ objectRotation.x = optionalRenderParameters.objectRotation.x;
326
+ objectRotation.y = optionalRenderParameters.objectRotation.y;
327
+ objectRotation.z = optionalRenderParameters.objectRotation.z;
328
+ }
329
+ const blenderVector = new Vector3(objectRotation.x, -objectRotation.z, objectRotation.y);
330
+ let autoFrameMargin = 15;
331
+ if (optionalRenderParameters && optionalRenderParameters.margin) {
332
+ autoFrameMargin = optionalRenderParameters.margin;
333
+ }
225
334
  this._cameraService.camera.updateMatrixWorld(true);
226
- // TODO change the hardcoded values https://colijn-it.atlassian.net/browse/IONE-39347
335
+ const dirtyCam = [1, 0, 0, 0, 0, 0.9778094194368627, -0.20949639438554873, 0, 0, 0.20949639438554873, 0.9778094194368627,
336
+ 0, 0, 1.025180918990023, 2.8709751177021667, 1];
337
+ const sceneSettings = this._getSceneRenderSettings(this._settingsService.settings.productRenderSceneAssetId);
227
338
  const options = {
228
- width: this._settingsService.settings.renderParameters.imageWidth,
229
- height: this._settingsService.settings.renderParameters.imageHeight,
230
- sceneSettings: this._getSceneRenderSettings(),
339
+ width: this._getRenderWidth(),
340
+ height: this._getRenderHeight(),
341
+ sceneSettings: sceneSettings,
342
+ transparency: this._useTransparency(sceneSettings),
231
343
  // max_samples: this._settingsService.settings.renderParameters.iterations,
232
344
  cameraOptions: {
233
345
  fov: this._cameraService.camera.fov,
234
- matrix: Array.from(this._cameraService.camera.matrixWorld.elements)
346
+ matrix: dirtyCam, // this.standAloneCameraFixedMatrix, //Array.from(this._cameraService.camera.matrixWorld.elements)
235
347
  },
236
348
  environmentOptions: {
237
349
  hdri: this._settingsService.settings.renderParameters.hdri,
@@ -248,7 +360,9 @@ export class NewRenderService {
248
360
  y: this._buildFurnitureService.currentCustomFloorGroup.rotation.y,
249
361
  z: this._buildFurnitureService.currentCustomFloorGroup.rotation.z
250
362
  }
251
- }
363
+ },
364
+ autoFrameMargin: autoFrameMargin,
365
+ objectRenderTransform: blenderVector
252
366
  };
253
367
  const selections = this._ione.selections.map(s => Object.assign({}, s));
254
368
  selections.forEach(s => {
@@ -265,19 +379,53 @@ export class NewRenderService {
265
379
  };
266
380
  return data;
267
381
  }
268
- _getSceneRenderSettings() {
382
+ _getSceneRenderSettings(assetId) {
383
+ // Get the asset information from the BlenderRenderSettings
384
+ let renderScenes = [];
385
+ if (this._settingsService.settings.blenderSceneSettings && this._settingsService.settings.blenderSceneSettings.scenes) {
386
+ renderScenes = this._settingsService.settings.blenderSceneSettings.scenes.filter(scene => scene.sceneType === BlenderSceneType.Product
387
+ && scene.name === assetId);
388
+ }
389
+ let renderScene;
390
+ // this should be a length of 1, so if it's > 0, we can safely take the first one
391
+ if (renderScenes.length > 0) {
392
+ renderScene = renderScenes[0];
393
+ }
394
+ else {
395
+ // fallback scene
396
+ const fallback = new BlenderSceneSetting();
397
+ fallback.name = 'cycles_scene_studio';
398
+ fallback.multiSceneRender = false;
399
+ fallback.primarySceneName = 'cycles_scene_studio';
400
+ fallback.hdriIntensity = 1;
401
+ fallback.hdriRotation = 0;
402
+ fallback.lightingExposure = 1;
403
+ fallback.sceneType = BlenderSceneType.Product;
404
+ renderScene = fallback;
405
+ }
406
+ let scenes = [];
407
+ // Primary scene
269
408
  const compositeScene = new SceneSettings();
270
- compositeScene.sceneAssetId = 'scene_studio_reflective_eevee';
409
+ compositeScene.sceneAssetId = renderScene.primarySceneName;
271
410
  compositeScene.activeCameraId = 1;
272
411
  compositeScene.default = true;
412
+ compositeScene.hdriRotation = this._apiServiceModule.degreesToVector3(renderScene.hdriRotation);
413
+ compositeScene.hdriIntensity = renderScene.hdriIntensity;
273
414
  compositeScene.id = 600;
274
- //
275
- // const additionalScene: SceneSettings = new SceneSettings();
276
- // additionalScene.sceneAssetId = 'Scene_Ground';
277
- // additionalScene.activeCameraId = 1;
278
- // additionalScene.default = false;
279
- // additionalScene.id = 601;
280
- return [compositeScene /*, additionalScene*/];
415
+ if (renderScene.multiSceneRender) {
416
+ const additionalScene = new SceneSettings();
417
+ additionalScene.sceneAssetId = renderScene.secondarySceneName;
418
+ additionalScene.activeCameraId = 1;
419
+ additionalScene.default = false;
420
+ additionalScene.hdriRotation = this._apiServiceModule.degreesToVector3(renderScene.hdriRotation);
421
+ additionalScene.hdriIntensity = renderScene.hdriIntensity;
422
+ additionalScene.id = 601;
423
+ scenes = [compositeScene, additionalScene];
424
+ }
425
+ else {
426
+ scenes = [compositeScene];
427
+ }
428
+ return scenes;
281
429
  }
282
430
  _getDataForRoomRender(size) {
283
431
  this._cameraService.camera.updateMatrixWorld(true);
@@ -311,10 +459,30 @@ export class NewRenderService {
311
459
  }
312
460
  return window.btoa(binary);
313
461
  }
462
+ _getRenderWidth() {
463
+ if (this._settingsService.settings.renderParameters.imageWidth === 0 || this._settingsService.settings.renderParameters.imageWidth === null) {
464
+ return this.clientWidth;
465
+ }
466
+ else {
467
+ return this._settingsService.settings.renderParameters.imageWidth;
468
+ }
469
+ }
470
+ _getRenderHeight() {
471
+ if (this._settingsService.settings.renderParameters.imageHeight === 0 || this._settingsService.settings.renderParameters.imageHeight === null) {
472
+ return this.clientHeight;
473
+ }
474
+ else {
475
+ return this._settingsService.settings.renderParameters.imageHeight;
476
+ }
477
+ }
478
+ _useTransparency(sceneSettings) {
479
+ // ONLY when we are using multiscene compositing, we need to use transparency
480
+ return sceneSettings.length > 1;
481
+ }
314
482
  }
315
- NewRenderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NewRenderService, deps: [{ token: i1.MessageBusService }, { token: i2.HomedecoratorSettingsService }, { token: i3.BuildFurnitureService }, { token: i4.CameraService }, { token: i5.SceneService }, { token: i6.HomedecoratorConnectorService }, { token: i7.HomedecoratorConnectorAdapterService }, { token: i8.ThreedselectorService }, { token: i9.ToastService }, { token: i1.MessageBusService }, { token: i10.GoogleTagManagerService }, { token: i11.RoomService }, { token: i12.FloorService }, { token: i13.LoadFurnitureService }, { token: i14.UtilsService }], target: i0.ɵɵFactoryTarget.Injectable });
483
+ NewRenderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NewRenderService, deps: [{ token: i1.MessageBusService }, { token: i2.HomedecoratorSettingsService }, { token: i3.BuildFurnitureService }, { token: i4.CameraService }, { token: i5.SceneService }, { token: i6.HomedecoratorConnectorService }, { token: i7.HomedecoratorConnectorAdapterService }, { token: i8.ThreedselectorService }, { token: i9.ToastService }, { token: i1.MessageBusService }, { token: i10.GoogleTagManagerService }, { token: i11.RoomService }, { token: i12.FloorService }, { token: i13.LoadFurnitureService }, { token: i14.UtilsService }, { token: i15.PresetsService }, { token: i16.ApiServiceModule }, { token: i17.HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Injectable });
316
484
  NewRenderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NewRenderService });
317
485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NewRenderService, decorators: [{
318
486
  type: Injectable
319
- }], ctorParameters: function () { return [{ type: i1.MessageBusService }, { type: i2.HomedecoratorSettingsService }, { type: i3.BuildFurnitureService }, { type: i4.CameraService }, { type: i5.SceneService }, { type: i6.HomedecoratorConnectorService }, { type: i7.HomedecoratorConnectorAdapterService }, { type: i8.ThreedselectorService }, { type: i9.ToastService }, { type: i1.MessageBusService }, { type: i10.GoogleTagManagerService }, { type: i11.RoomService }, { type: i12.FloorService }, { type: i13.LoadFurnitureService }, { type: i14.UtilsService }]; } });
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXJlbmRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvcGx1Z2lucy9yZW5kZXIvc2VydmljZS9uZXctcmVuZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLGVBQWUsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUVuRCxPQUFPLEVBQUMsS0FBSyxFQUFXLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFjM0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHNUQsTUFBTSxPQUFPLGdCQUFnQjtJQVkzQixZQUNTLGNBQWlDLEVBQ2hDLGdCQUE4QyxFQUM5QyxzQkFBNkMsRUFDN0MsY0FBNkIsRUFDN0IsYUFBMkIsRUFDM0IsS0FBb0MsRUFDcEMscUJBQTJELEVBQzNELHNCQUE2QyxFQUM3QyxhQUEyQixFQUMzQixrQkFBcUMsRUFDckMsaUJBQTBDLEVBQzFDLFlBQXlCLEVBQ3pCLGFBQTJCLEVBQzNCLHFCQUEyQyxFQUMzQyxhQUEyQjtRQWQ1QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE4QjtRQUM5QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBQzdDLG1CQUFjLEdBQWQsY0FBYyxD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UUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUk7Z0JBQzFELGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWE7YUFDN0U7U0FDRixDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUc7WUFDWCxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTO1lBQ2xELE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGVBQWU7WUFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUM3QyxPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsTUFBbUI7UUFDOUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6QztRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDOzs4R0F4U1UsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlL3NyYy9zY2VuZXMvU2NlbmUnO1xyXG5pbXBvcnQge0xpZ2h0LCBPYmplY3QzRH0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0dMVEZFeHBvcnRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9HTFRGRXhwb3J0ZXInO1xyXG5pbXBvcnQge1JlbmRlclF1ZXVlSXRlbX0gZnJvbSAnLi4vbW9kZWwvcmVuZGVyLXF1ZXVlLWl0ZW0nO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLXNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0J1aWxkRnVybml0dXJlU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS9idWlsZC1mdXJuaXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1RocmVlZHNlbGVjdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS90aHJlZWRzZWxlY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtUb2FzdFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS90b2FzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQnVzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL21lc3NhZ2UtYnVzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0dvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2dvb2dsZS10YWctbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtSb29tU2VydmljZX0gZnJvbSAnLi4vLi4vcm9vbS1wbGFubmVyL2NvbXBvbmVudHMvZmxvb3JwbGFubmVyL3NlcnZpY2Uvcm9vbS5zZXJ2aWNlJztcclxuaW1wb3J0IHtGbG9vclNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2Zsb29yLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvYWRGdXJuaXR1cmVTZXJ2aWNlfSBmcm9tICcuLi8uLi90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci9zZXJ2aWNlL2xvYWQtZnVybml0dXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1JlbmRlclN0YXR1c30gZnJvbSAnLi4vZW51bS9yZW5kZXItc3RhdHVzJztcclxuaW1wb3J0IHtVdGlsc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtTY2VuZVNldHRpbmdzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvM2RtLWFwaSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOZXdSZW5kZXJTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgcHVibGljIHJlbmRlckltYWdlQ2hhbmdlZDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcclxuICBwdWJsaWMgcmVuZGVyVXBkYXRlSW1hZ2VDaGFuZ2VkOiBCZWhhdmlvclN1YmplY3Q8eyBpbWFnZTogc3RyaW5nLCBwcm9ncmVzczogbnVtYmVyLCBmaW5pc2hlZDogYm9vbGVhbiB9PiA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcclxuICBwdWJsaWMgcmVuZGVyUm9vbUltYWdlQ2hhbmdlZDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcclxuXHJcbiAgcHVibGljIHN0YW5kQWxvbmVDYW1lcmFNYXRyaXg6IG51bWJlcltdO1xyXG4gIHB1YmxpYyBjdXJyZW50UXVldWVSZW5kZXJJdGVtOiBSZW5kZXJRdWV1ZUl0ZW0gPSBuZXcgUmVuZGVyUXVldWVJdGVtKCk7XHJcbiAgcHVibGljIHJlbmRlcmVkUm9vbUltYWdlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VCdXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2V0dGluZ3NTZXJ2aWNlOiBIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYnVpbGRGdXJuaXR1cmVTZXJ2aWNlOiBCdWlsZEZ1cm5pdHVyZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jYW1lcmFTZXJ2aWNlOiBDYW1lcmFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2NlbmVTZXJ2aWNlOiBTY2VuZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pb25lOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2lvbmVDb25uZWN0b3JBZGFwdGVyOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90aHJlZWRTZWxlY3RvclNlcnZpY2U6IFRocmVlZHNlbGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX3RvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUJ1c1NlcnZpY2U6IE1lc3NhZ2VCdXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZ29vZ2xlVGFnTWFuYWdlcjogR29vZ2xlVGFnTWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb29tU2VydmljZTogUm9vbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mbG9vclNlcnZpY2U6IEZsb29yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xvYWRGdXJuaXR1cmVTZXJ2aWNlOiBMb2FkRnVybml0dXJlU2VydmljZSxcclxuICAgIHByaXZhdGUgX3V0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkJsZW5kZXJSZW5kZXJGaWxlUmVhZHksIChmaWxlKSA9PiB0aGlzLnByb2Nlc1JlbmRlckZpbGUoZmlsZSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHByb2Nlc1JlbmRlckZpbGUoZmlsZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbmRlckltYWdlQ2hhbmdlZC5uZXh0KGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcmNlUmVuZGVySW1hZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9nZXROZXdSZW5kZXJJbWFnZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXJJbWFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2dldE5ld1JlbmRlckltYWdlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVuZGVyUm9vbShzaXplOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNjZW5lRGF0YTogYW55ID0gYXdhaXQgdGhpcy5fZXhwb3J0VG9HbGIoKTtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9yUm9vbVJlbmRlcihzaXplKTtcclxuICAgIGRhdGEuZmlsZXMgPSB7XHJcbiAgICAgIGdsYkRhdGE6IHRoaXMuX2FycmF5QnVmZmVyVG9CYXNlNjQoc2NlbmVEYXRhKVxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy51c2VSZW5kZXJXZWJzb2NrZXQpIHtcclxuICAgICAgdGhpcy5faGFuZGxlV2ViU29ja2V0Um9vbVJlbmRlcihkYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2V4cG9ydFRvR2xiKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAvLyBUaGUgZ3JvdW5kIHBsYW5lIGxvb2tzIG9kZCBpbiByZW5kZXJzLlxyXG4gICAgLy8gVGhlIGh1ZC1yaW5nIGFuZCBodWQtY2lyY2xlIGFyZSB0aGUgd2Fsa3Rocm91Z2ggbW9kZSBtYXJrZXIsXHJcbiAgICAvLyB3aGljaCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgcmVuZGVyZWQuXHJcbiAgICBjb25zdCBlbGVtZW50c1RvUmVtb3ZlID0gWydncm91bmQtcGxhbmUnLCAnaHVkLXJpbmcnLCAnaHVkLWNpcmNsZSddO1xyXG5cclxuICAgIGxldCBzY2VuZTogU2NlbmU7XHJcbiAgICB0cnkge1xyXG4gICAgICBzY2VuZSA9IHRoaXMuX3NjZW5lU2VydmljZS5zY2VuZS5jbG9uZSgpO1xyXG5cclxuICAgICAgc2NlbmUuY2hpbGRyZW4uZm9yRWFjaChjID0+IHtcclxuICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIExpZ2h0KSB7XHJcbiAgICAgICAgICBzY2VuZS5yZW1vdmUoYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGVsZW1lbnRzVG9SZW1vdmUuZm9yRWFjaChlbGVtZW50TmFtZSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPYmplY3Q6IE9iamVjdDNEID0gc2NlbmUuZ2V0T2JqZWN0QnlOYW1lKGVsZW1lbnROYW1lKTtcclxuICAgICAgICBzY2VuZS5yZW1vdmUoc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICB0cnM6IGZhbHNlLFxyXG4gICAgICAgIG9ubHlWaXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHRydW5jYXRlRHJhd1JhbmdlOiB0cnVlLFxyXG4gICAgICAgIGJpbmFyeTogdHJ1ZSxcclxuICAgICAgICBmb3JjZUluZGljZXM6IGZhbHNlLFxyXG4gICAgICAgIGZvcmNlUG93ZXJPZlR3b1RleHR1cmVzOiBmYWxzZSxcclxuICAgICAgICAvLyBtYXhUZXh0dXJlU2l6ZTogNTAwLFxyXG4gICAgICAgIGVtYmVkSW1hZ2VzOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgZXhwb3J0ZXI6IEdMVEZFeHBvcnRlciA9IG5ldyBHTFRGRXhwb3J0ZXIoKTtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICAgIGV4cG9ydGVyLnBhcnNlKHNjZW5lLCBhc3luYyAoZXhwb3J0ZWRTY2VuZTogQXJyYXlCdWZmZXIpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUoZXhwb3J0ZWRTY2VuZSk7XHJcbiAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgIH0sIG9wdGlvbnMpO1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhyb3cgKGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TmV3UmVuZGVySW1hZ2UoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5ibGVuZEZpbGVzUmVuZGVyKSB7XHJcbiAgICAgIC8vIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9yUmVuZGVyKGZvcmNlKTtcclxuICAgICAgLy8gdGhpcy5faGFuZGxlQWpheEJsZW5kZXJSZW5kZXIoZGF0YSk7XHJcbiAgICAgIC8vIHRoaXMubWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TaG93TG9hZGluZ0luZGljYXRvciwge3RpdGxlOiAnUmVuZGVyaW5nLi4uJ30pO1xyXG4gICAgICBjb25zdCByZW5kZXJJbnB1dCA9IHtcclxuICAgICAgICAnaGVpZ2h0JzogODAwLFxyXG4gICAgICAgICd3aWR0aCc6IDEyMDAsXHJcbiAgICAgICAgJ3NjZW5lQXNzZXRJZCc6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5wcm9kdWN0UmVuZGVyU2NlbmVBc3NldElkXHJcbiAgICAgIH07XHJcbiAgICAgIGF3YWl0IHRoaXMuX3V0aWxzU2VydmljZS5wcmVwUm9vbUZvclJlbmRlcih0cnVlLCByZW5kZXJJbnB1dCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5fZ2V0RGF0YUZvclJlbmRlcihmb3JjZSk7XHJcbiAgICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy51c2VSZW5kZXJXZWJzb2NrZXQpIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRSZW5kZXIoZGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlQWpheFJlbmRlcihkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlQWpheFJlbmRlcihkYXRhOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF4aW9zKHtcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcclxuICAgICAgfSxcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB1cmw6IGAke3RoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhvc3R9L2dldEJsZW5kZXJSZW5kZXJGcm9tRGF0YWAsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nXHJcbiAgICB9KTtcclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgLy8gY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5kYXRhLmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuZGF0YS5pbWFnZX1gO1xyXG4gICAgICAvLyB0aGlzLl9zaG93UHJldmlld0ltYWdlKHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coaW1hZ2UpO1xyXG4gICAgICB0aGlzLnJlbmRlckltYWdlQ2hhbmdlZC5uZXh0KHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZVdlYlNvY2tldFJlbmRlcihkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdlYlNvY2tldENvbm5lY3Rpb246IHN0cmluZyA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLndlYnNvY2tldDtcclxuICAgIGNvbnN0IHdlYlNvY2tldCA9IG5ldyBXZWJTb2NrZXQod2ViU29ja2V0Q29ubmVjdGlvbik7XHJcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICB3ZWJTb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICB9O1xyXG4gICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5maWxlVHlwZX07YmFzZTY0LCR7cmVzdWx0LmltYWdlfWA7XHJcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSByZXN1bHQucmVuZGVyZWQ7XHJcbiAgICAgICAgY29uc3QgZmluaXNoZWQgPSByZXN1bHQuZmluaXNoZWQ7XHJcbiAgICAgICAgLy8gdGhpcy5fc2hvd1ByZXZpZXdJbWFnZShpbWFnZSk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0LnJlbmRlcmVkKTtcclxuICAgICAgICB0aGlzLnJlbmRlclVwZGF0ZUltYWdlQ2hhbmdlZC5uZXh0KHtpbWFnZTogaW1hZ2UsIHByb2dyZXNzOiBwcm9ncmVzcywgZmluaXNoZWQ6IGZpbmlzaGVkfSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5maW5pc2hlZCkge1xyXG4gICAgICAgICAgd2ViU29ja2V0LmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlV2ViU29ja2V0Um9vbVJlbmRlcihkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdlYlNvY2tldENvbm5lY3Rpb246IHN0cmluZyA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLndlYnNvY2tldDtcclxuICAgIGNvbnN0IHdlYlNvY2tldCA9IG5ldyBXZWJTb2NrZXQod2ViU29ja2V0Q29ubmVjdGlvbik7XHJcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICB3ZWJTb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICB9O1xyXG4gICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5maWxlVHlwZX07YmFzZTY0LCR7cmVzdWx0LmltYWdlfWA7XHJcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSByZXN1bHQucmVuZGVyZWQ7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UXVldWVSZW5kZXJJdGVtLnJlbmRlclByb2dyZXNzID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJSb29tSW1hZ2VDaGFuZ2VkLm5leHQoaW1hZ2UpO1xyXG4gICAgICAgIGlmIChyZXN1bHQuZmluaXNoZWQpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyZWRSb29tSW1hZ2VzLnB1c2goaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50UXVldWVSZW5kZXJJdGVtLnJlbmRlclN0YXR1cyA9IFJlbmRlclN0YXR1cy5Jc1N1Y2Nlc3M7XHJcbiAgICAgICAgICB3ZWJTb2NrZXQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zaG93UHJldmlld0ltYWdlKHNyYzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgaW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXdfaW1nJyk7XHJcbiAgICBpZiAoIWltZykge1xyXG4gICAgICBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgaW1nLmlkID0gJ3ByZXZpZXdfaW1nJztcclxuICAgICAgZG9jdW1lbnQuYm9keS5wcmVwZW5kKGltZyk7XHJcbiAgICAgIGltZy5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgIGltZy5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgIGltZy5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAvLyBpbWcuc3R5bGUud2lkdGggPSAnODAwcHgnO1xyXG4gICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gJzYwMHB4JztcclxuICAgICAgaW1nLnN0eWxlLnpJbmRleCA9ICcxMCc7XHJcbiAgICB9XHJcbiAgICAoaW1nIGFzIGFueSkuc3JjID0gc3JjO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0RGF0YUZvclJlbmRlcihmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gICAgLy8gVE9ETyBjaGFuZ2UgdGhlIGhhcmRjb2RlZCB2YWx1ZXMgaHR0cHM6Ly9jb2xpam4taXQuYXRsYXNzaWFuLm5ldC9icm93c2UvSU9ORS0zOTM0N1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgd2lkdGg6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmltYWdlV2lkdGgsXHJcbiAgICAgIGhlaWdodDogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaW1hZ2VIZWlnaHQsXHJcbiAgICAgIHNjZW5lU2V0dGluZ3M6IHRoaXMuX2dldFNjZW5lUmVuZGVyU2V0dGluZ3MoKSxcclxuICAgICAgLy8gbWF4X3NhbXBsZXM6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLml0ZXJhdGlvbnMsXHJcbiAgICAgIGNhbWVyYU9wdGlvbnM6IHtcclxuICAgICAgICBmb3Y6IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLmZvdixcclxuICAgICAgICBtYXRyaXg6IEFycmF5LmZyb20odGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEubWF0cml4V29ybGQuZWxlbWVudHMpXHJcbiAgICAgIH0sXHJcbiAgICAgIGVudmlyb25tZW50T3B0aW9uczoge1xyXG4gICAgICAgIGhkcmk6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhkcmksXHJcbiAgICAgICAgaGRyaUludGVuc2l0eTogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaGRyaUludGVuc2l0eVxyXG4gICAgICB9LFxyXG4gICAgICBvYmplY3RPcHRpb25zOiB7XHJcbiAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgIHg6IHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgeTogMCxcclxuICAgICAgICAgIHo6IHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5wb3NpdGlvbi56XHJcbiAgICAgICAgfSxcclxuICAgICAgICByb3RhdGlvbjoge1xyXG4gICAgICAgICAgeDogdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnJvdGF0aW9uLngsXHJcbiAgICAgICAgICB5OiB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEN1c3RvbUZsb29yR3JvdXAucm90YXRpb24ueSxcclxuICAgICAgICAgIHo6IHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi56XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMuX2lvbmUuc2VsZWN0aW9ucy5tYXAocyA9PiBPYmplY3QuYXNzaWduKHt9LCBzKSk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAgIHMuaW1hZ2VEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICBzLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIHNlbGVjdGlvbnM6IHNlbGVjdGlvbnMsXHJcbiAgICAgIGRlY29zOiB0aGlzLl9pb25lLmRlY29Ob2RlcyxcclxuICAgICAgYXNzZXRVcmw6IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFydGljbGUuYXNzZXRVcmwsXHJcbiAgICAgIGNkblVybDogdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwsXHJcbiAgICAgIHNjaGVtYTogdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYXJ0aWNsZS5kaXN0U2NoZW1hIHx8ICdVUF9EQkEnLFxyXG4gICAgICBvcHRpb25zOiBvcHRpb25zXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRTY2VuZVJlbmRlclNldHRpbmdzKCk6IFNjZW5lU2V0dGluZ3NbXSB7XHJcbiAgICBjb25zdCBjb21wb3NpdGVTY2VuZTogU2NlbmVTZXR0aW5ncyA9IG5ldyBTY2VuZVNldHRpbmdzKCk7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5zY2VuZUFzc2V0SWQgPSAnc2NlbmVfc3R1ZGlvX3JlZmxlY3RpdmVfZWV2ZWUnO1xyXG4gICAgY29tcG9zaXRlU2NlbmUuYWN0aXZlQ2FtZXJhSWQgPSAxO1xyXG4gICAgY29tcG9zaXRlU2NlbmUuZGVmYXVsdCA9IHRydWU7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5pZCA9IDYwMDtcclxuICAgIC8vXHJcbiAgICAvLyBjb25zdCBhZGRpdGlvbmFsU2NlbmU6IFNjZW5lU2V0dGluZ3MgPSBuZXcgU2NlbmVTZXR0aW5ncygpO1xyXG4gICAgLy8gYWRkaXRpb25hbFNjZW5lLnNjZW5lQXNzZXRJZCA9ICdTY2VuZV9Hcm91bmQnO1xyXG4gICAgLy8gYWRkaXRpb25hbFNjZW5lLmFjdGl2ZUNhbWVyYUlkID0gMTtcclxuICAgIC8vIGFkZGl0aW9uYWxTY2VuZS5kZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAvLyBhZGRpdGlvbmFsU2NlbmUuaWQgPSA2MDE7XHJcblxyXG4gICAgcmV0dXJuIFtjb21wb3NpdGVTY2VuZS8qLCBhZGRpdGlvbmFsU2NlbmUqL107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXREYXRhRm9yUm9vbVJlbmRlcihzaXplOiBhbnkpOiBhbnkge1xyXG4gICAgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICB3aWR0aDogc2l6ZS53aWR0aCxcclxuICAgICAgaGVpZ2h0OiBzaXplLmhlaWdodCxcclxuICAgICAgbWF4X3NhbXBsZXM6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLml0ZXJhdGlvbnMsXHJcbiAgICAgIGNhbWVyYU9wdGlvbnM6IHtcclxuICAgICAgICBmb3Y6IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLmZvdixcclxuICAgICAgICBtYXRyaXg6IEFycmF5LmZyb20odGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmVsZW1lbnRzKVxyXG4gICAgICB9LFxyXG4gICAgICBlbnZpcm9ubWVudE9wdGlvbnM6IHtcclxuICAgICAgICBoZHJpOiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucmVuZGVyUGFyYW1ldGVycy5oZHJpLFxyXG4gICAgICAgIGhkcmlJbnRlbnNpdHk6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhkcmlJbnRlbnNpdHlcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIGFzc2V0VXJsOiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoLFxyXG4gICAgICBjZG5Vcmw6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy50aHJlZURBc3NldFBhdGgsXHJcbiAgICAgIHNjaGVtYTogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnNjaGVtYSxcclxuICAgICAgb3B0aW9uczogb3B0aW9uc1xyXG4gICAgfTtcclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXI6IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBiaW5hcnkgPSAnJztcclxuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcclxuICAgIH1cclxuICAgIHJldHVybiB3aW5kb3cuYnRvYShiaW5hcnkpO1xyXG4gIH1cclxufVxyXG4iXX0=
487
+ }], ctorParameters: function () { return [{ type: i1.MessageBusService }, { type: i2.HomedecoratorSettingsService }, { type: i3.BuildFurnitureService }, { type: i4.CameraService }, { type: i5.SceneService }, { type: i6.HomedecoratorConnectorService }, { type: i7.HomedecoratorConnectorAdapterService }, { type: i8.ThreedselectorService }, { type: i9.ToastService }, { type: i1.MessageBusService }, { type: i10.GoogleTagManagerService }, { type: i11.RoomService }, { type: i12.FloorService }, { type: i13.LoadFurnitureService }, { type: i14.UtilsService }, { type: i15.PresetsService }, { type: i16.ApiServiceModule }, { type: i17.HomedecoratorAppEventService }]; } });
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXJlbmRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvcGx1Z2lucy9yZW5kZXIvc2VydmljZS9uZXctcmVuZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxlQUFlLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFDLEtBQUssRUFBWSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDL0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQWMzRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBbUIsYUFBYSxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFHOUUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGdCQUFnQixFQUFDLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHdEYsTUFBTSxPQUFPLGdCQUFnQjtJQXFCM0IsWUFDUyxjQUFpQyxFQUNoQyxnQkFBOEMsRUFDOUMsc0JBQTZDLEVBQzdDLGNBQTZCLEVBQzdCLGFBQTJCLEVBQzNCLEtBQW9DLEVBQ3BDLHFCQUEyRCxFQUMzRCxzQkFBNkMsRUFDN0MsYUFBMkIsRUFDM0Isa0JBQXFDLEVBQ3JDLGlCQUEwQyxFQUMxQyxZQUF5QixFQUN6QixhQUEyQixFQUMzQixxQkFBMkMsRUFDM0MsYUFBMkIsRUFDM0IsY0FBOEIsRUFDOUIsaUJBQW1DLEVBQ25DLGdC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SSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRTtZQUM3SSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUI7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7U0FDcEU7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsYUFBOEI7UUFDckQsNkVBQTZFO1FBQzdFLE9BQU8sYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7OEdBdmVVLGdCQUFnQjtrSEFBaEIsZ0JBQWdCOzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlL3NyYy9zY2VuZXMvU2NlbmUnO1xyXG5pbXBvcnQge0xpZ2h0LCBPYmplY3QzRCwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0dMVEZFeHBvcnRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9HTFRGRXhwb3J0ZXInO1xyXG5pbXBvcnQge1JlbmRlclF1ZXVlSXRlbX0gZnJvbSAnLi4vbW9kZWwvcmVuZGVyLXF1ZXVlLWl0ZW0nO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLXNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0J1aWxkRnVybml0dXJlU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS9idWlsZC1mdXJuaXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1RocmVlZHNlbGVjdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS90aHJlZWRzZWxlY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtUb2FzdFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS90b2FzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQnVzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL21lc3NhZ2UtYnVzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0dvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2dvb2dsZS10YWctbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtSb29tU2VydmljZX0gZnJvbSAnLi4vLi4vcm9vbS1wbGFubmVyL2NvbXBvbmVudHMvZmxvb3JwbGFubmVyL3NlcnZpY2Uvcm9vbS5zZXJ2aWNlJztcclxuaW1wb3J0IHtGbG9vclNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2Zsb29yLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvYWRGdXJuaXR1cmVTZXJ2aWNlfSBmcm9tICcuLi8uLi90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci9zZXJ2aWNlL2xvYWQtZnVybml0dXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1JlbmRlclN0YXR1c30gZnJvbSAnLi4vZW51bS9yZW5kZXItc3RhdHVzJztcclxuaW1wb3J0IHtVdGlsc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtBcGlTZXJ2aWNlTW9kdWxlLCBTY2VuZVNldHRpbmdzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvM2RtLWFwaSc7XHJcbmltcG9ydCB7UHJlc2V0c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9wcmVzZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWFwcC1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtCbGVuZGVyU2NlbmVTZXR0aW5nLCBCbGVuZGVyU2NlbmVUeXBlfSBmcm9tICcuLi9tb2RlbC9ibGVuZGVyLXNjZW5lLXNldHRpbmdzJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5ld1JlbmRlclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBwdWJsaWMgcmVuZGVySW1hZ2VDaGFuZ2VkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xyXG4gIHB1YmxpYyBibGVuZGVyUmVuZGVyU3RhcnRlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBwdWJsaWMgcmVuZGVyVXBkYXRlSW1hZ2VDaGFuZ2VkOiBCZWhhdmlvclN1YmplY3Q8e1xyXG4gICAgaW1hZ2U6IHN0cmluZyxcclxuICAgIHByb2dyZXNzOiBudW1iZXIsXHJcbiAgICBmaW5pc2hlZDogYm9vbGVhblxyXG4gIH0+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xyXG4gIHB1YmxpYyByZW5kZXJSb29tSW1hZ2VDaGFuZ2VkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xyXG5cclxuICBwdWJsaWMgc3RhbmRBbG9uZUNhbWVyYU1hdHJpeDogbnVtYmVyW107XHJcbiAgcHVibGljIHN0YW5kQWxvbmVDYW1lcmFGaXhlZE1hdHJpeDogbnVtYmVyW107XHJcbiAgcHVibGljIGN1cnJlbnRRdWV1ZVJlbmRlckl0ZW06IFJlbmRlclF1ZXVlSXRlbSA9IG5ldyBSZW5kZXJRdWV1ZUl0ZW0oKTtcclxuICBwdWJsaWMgcmVuZGVyZWRSb29tSW1hZ2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgY2xpZW50V2lkdGg6IG51bWJlcjtcclxuICBwdWJsaWMgY2xpZW50SGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2J1aWxkRnVybml0dXJlU2VydmljZTogQnVpbGRGdXJuaXR1cmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhU2VydmljZTogQ2FtZXJhU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaW9uZTogSG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pb25lQ29ubmVjdG9yQWRhcHRlcjogSG9tZWRlY29yYXRvckNvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdGhyZWVkU2VsZWN0b3JTZXJ2aWNlOiBUaHJlZWRzZWxlY3RvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VCdXNTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2dvb2dsZVRhZ01hbmFnZXI6IEdvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcm9vbVNlcnZpY2U6IFJvb21TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZmxvb3JTZXJ2aWNlOiBGbG9vclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9sb2FkRnVybml0dXJlU2VydmljZTogTG9hZEZ1cm5pdHVyZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF91dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3ByZXNldFNlcnZpY2U6IFByZXNldHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYXBpU2VydmljZU1vZHVsZTogQXBpU2VydmljZU1vZHVsZSxcclxuICAgIHByaXZhdGUgX2FwcEV2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuQmxlbmRlclJlbmRlckZpbGVSZWFkeSwgKGZpbGUpID0+IHRoaXMucHJvY2VzUmVuZGVyRmlsZShmaWxlKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuX3N1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcHJvY2VzUmVuZGVyRmlsZShmaWxlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVySW1hZ2VDaGFuZ2VkLm5leHQoZmlsZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9yY2VSZW5kZXJJbWFnZShvcHRpb25hbFJlbmRlclBhcmFtZXRlcnM/OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYmxlbmRGaWxlc1JlbmRlcikge1xyXG4gICAgICB0aGlzLl9jcmVhdGVSZW5kZXJGcm9tSnNvbih0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2dldE5ld1JlbmRlckltYWdlKHRydWUsIG9wdGlvbmFsUmVuZGVyUGFyYW1ldGVycyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVySW1hZ2Uob3B0aW9uYWxSZW5kZXJQYXJhbWV0ZXJzPzogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmJsZW5kRmlsZXNSZW5kZXIpIHtcclxuICAgICAgdGhpcy5fY3JlYXRlUmVuZGVyRnJvbUpzb24oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2dldE5ld1JlbmRlckltYWdlKGZhbHNlLCBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHJlbmRlclJvb20oc2l6ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzY2VuZURhdGE6IGFueSA9IGF3YWl0IHRoaXMuX2V4cG9ydFRvR2xiKCk7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZ2V0RGF0YUZvclJvb21SZW5kZXIoc2l6ZSk7XHJcbiAgICBkYXRhLmZpbGVzID0ge1xyXG4gICAgICBnbGJEYXRhOiB0aGlzLl9hcnJheUJ1ZmZlclRvQmFzZTY0KHNjZW5lRGF0YSlcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlUmVuZGVyV2Vic29ja2V0KSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldFJvb21SZW5kZXIoZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmV3R2xiRnJvbVNlcnZlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9yUmVuZGVyKCk7XHJcbiAgICB0aGlzLl9oYW5kbGVBamF4R2xiKGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZXhwb3J0VG9HbGIoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vIFRoZSBncm91bmQgcGxhbmUgbG9va3Mgb2RkIGluIHJlbmRlcnMuXHJcbiAgICAvLyBUaGUgaHVkLXJpbmcgYW5kIGh1ZC1jaXJjbGUgYXJlIHRoZSB3YWxrdGhyb3VnaCBtb2RlIG1hcmtlcixcclxuICAgIC8vIHdoaWNoIGlzIG5vdCBzdXBwb3NlZCB0byBiZSByZW5kZXJlZC5cclxuICAgIGNvbnN0IGVsZW1lbnRzVG9SZW1vdmUgPSBbJ2dyb3VuZC1wbGFuZScsICdodWQtcmluZycsICdodWQtY2lyY2xlJ107XHJcblxyXG4gICAgbGV0IHNjZW5lOiBTY2VuZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHNjZW5lID0gdGhpcy5fc2NlbmVTZXJ2aWNlLnNjZW5lLmNsb25lKCk7XHJcblxyXG4gICAgICBzY2VuZS5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgIGlmIChjIGluc3RhbmNlb2YgTGlnaHQpIHtcclxuICAgICAgICAgIHNjZW5lLnJlbW92ZShjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZWxlbWVudHNUb1JlbW92ZS5mb3JFYWNoKGVsZW1lbnROYW1lID0+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZE9iamVjdDogT2JqZWN0M0QgPSBzY2VuZS5nZXRPYmplY3RCeU5hbWUoZWxlbWVudE5hbWUpO1xyXG4gICAgICAgIHNjZW5lLnJlbW92ZShzZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgIHRyczogZmFsc2UsXHJcbiAgICAgICAgb25seVZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdHJ1bmNhdGVEcmF3UmFuZ2U6IHRydWUsXHJcbiAgICAgICAgYmluYXJ5OiB0cnVlLFxyXG4gICAgICAgIGZvcmNlSW5kaWNlczogZmFsc2UsXHJcbiAgICAgICAgZm9yY2VQb3dlck9mVHdvVGV4dHVyZXM6IGZhbHNlLFxyXG4gICAgICAgIC8vIG1heFRleHR1cmVTaXplOiA1MDAsXHJcbiAgICAgICAgZW1iZWRJbWFnZXM6IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBleHBvcnRlcjogR0xURkV4cG9ydGVyID0gbmV3IEdMVEZFeHBvcnRlcigpO1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgICAgZXhwb3J0ZXIucGFyc2Uoc2NlbmUsIGFzeW5jIChleHBvcnRlZFNjZW5lOiBBcnJheUJ1ZmZlcikgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShleHBvcnRlZFNjZW5lKTtcclxuICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgfSwgb3B0aW9ucyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB0aHJvdyAoZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9nZXROZXdSZW5kZXJJbWFnZShmb3JjZTogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9yUmVuZGVyKGZvcmNlLCBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMpO1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnVzZVJlbmRlcldlYnNvY2tldCkge1xyXG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRSZW5kZXIoZGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9oYW5kbGVBamF4UmVuZGVyKGRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlUmVuZGVyRnJvbUpzb24oZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5ibGVuZEZpbGVzUmVuZGVyKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9ySnNvblJlbmRlcihmb3JjZSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2FwaVNlcnZpY2VNb2R1bGUuZ2V0UmVuZGVyRnJvbUpzb24oZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0RGF0YUZvckpzb25SZW5kZXIoZm9yY2U6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgbGV0IG11bHRpc2NlbmVSZW5kZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLl9pb25lLnNlbGVjdGlvbnMubWFwKHMgPT4gT2JqZWN0LmFzc2lnbih7fSwgcykpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICBzLmltYWdlRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgcy5pbWFnZURhdGFMYXN0QW5zd2VyID0gdW5kZWZpbmVkO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IGNvbmZpZ3VyYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2lvbmUuZGVjb05vZGVzICYmIHRoaXMuX2lvbmUuZGVjb05vZGVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBjb25maWd1cmFibGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhbWVyYTogYW55ID0gdGhpcy5fYXBpU2VydmljZU1vZHVsZS5nZXRDYW1lcmFQcm9wZXJ0aWVzKHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhKTtcclxuXHJcbiAgICBsZXQgcG9zaXRpb246IFZlY3RvcjM7XHJcbiAgICBsZXQgcm90YXRpb246IFZlY3RvcjM7XHJcblxyXG4gICAgaWYgKHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoXHJcbiAgICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uLngsXHJcbiAgICAgICAgMCxcclxuICAgICAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEN1c3RvbUZsb29yR3JvdXAucG9zaXRpb24ueik7XHJcblxyXG4gICAgICByb3RhdGlvbiA9IG5ldyBWZWN0b3IzKFxyXG4gICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi54LFxyXG4gICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi55LFxyXG4gICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi56KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAgIHJvdGF0aW9uID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZnVybml0dXJlOiBhbnkgPSB7XHJcbiAgICAgIG1vZGVsX3VybDogdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYXJ0aWNsZS5hc3NldFVybCxcclxuICAgICAgaXRlbV9zY2hlbWE6IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFydGljbGUuZGlzdFNjaGVtYSB8fCAnVVBfREJBJyxcclxuICAgICAgaXRlbV9hc3NldFBhdGg6IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFydGljbGUuY29udGVudERlbGl2ZXJ5VXJsLFxyXG4gICAgICBpdGVtX2lkZW50aWZpZXI6IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFydGljbGUuaWQsXHJcbiAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlndXJhYmxlLFxyXG4gICAgICBzZWxlY3Rpb25zOiBzZWxlY3Rpb25zLFxyXG4gICAgICBkZWNvczogdGhpcy5faW9uZS5kZWNvTm9kZXMsXHJcbiAgICAgIG9iamVjdFBvc2l0aW9uOiBwb3NpdGlvbixcclxuICAgICAgb2JqZWN0Um90YXRpb246IHJvdGF0aW9uXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucHJvZHVjdFJlbmRlclNjZW5lQXNzZXRJZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ211bHRpc2NlbmUnKSAhPT0gLTEpIHtcclxuICAgICAgbXVsdGlzY2VuZVJlbmRlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWN0aW9uOiAncHJlcGFyZVJlbmRlclJlcXVlc3QnLFxyXG4gICAgICBtdWx0aXNjZW5lQ29tcG9zaXRpbmc6IG11bHRpc2NlbmVSZW5kZXIsXHJcbiAgICAgIGZ1cm5pdHVyZTogW2Z1cm5pdHVyZV0sXHJcbiAgICAgIGNhbWVyYTogY2FtZXJhLFxyXG4gICAgICBmb3JjZTogZm9yY2VcclxuICAgIH07XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gcHJpdmF0ZSBhc3luYyBfaGFuZGxlQWpheEJsZW5kZXJSZW5kZXIoZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgLy8gICBjb25zdCByZXN1bHQgPSBhd2FpdCBheGlvcyh7XHJcbiAgLy8gICAgIGhlYWRlcnM6IHtcclxuICAvLyAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gIC8vICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcclxuICAvLyAgICAgdXJsOiBgJHt0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MubmV3UmVuZGVyUGFyYW1ldGVycy5ob3N0fToke3RoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5uZXdSZW5kZXJQYXJhbWV0ZXJzLnBvcnR9L2dldEJsZW5kZXJSZW5kZXJGcm9tRGF0YWAsXHJcbiAgLy8gICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nXHJcbiAgLy8gICB9KTtcclxuICAvLyAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHtcclxuICAvLyAgICAgLy8gY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5kYXRhLmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuZGF0YS5pbWFnZX1gO1xyXG4gIC8vICAgICAvLyB0aGlzLl9zaG93UHJldmlld0ltYWdlKHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAvLyAgICAgLy8gY29uc29sZS5sb2coaW1hZ2UpO1xyXG4gIC8vICAgICB0aGlzLnJlbmRlckltYWdlQ2hhbmdlZC5uZXh0KHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUFqYXhSZW5kZXIoZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmJsZW5kZXJSZW5kZXJTdGFydGVkLmVtaXQoKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF4aW9zKHtcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcclxuICAgICAgfSxcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB1cmw6IGAke3RoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhvc3R9L2dldEJsZW5kZXJSZW5kZXJGcm9tRGF0YWAsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nXHJcbiAgICB9KTtcclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgLy8gY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5kYXRhLmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuZGF0YS5pbWFnZX1gO1xyXG4gICAgICAvLyB0aGlzLl9zaG93UHJldmlld0ltYWdlKHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coaW1hZ2UpO1xyXG4gICAgICB0aGlzLnJlbmRlckltYWdlQ2hhbmdlZC5uZXh0KHJlc3VsdC5kYXRhLmltYWdlKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVBamF4R2xiKGRhdGE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXhpb3Moe1xyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgICB9LFxyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXHJcbiAgICAgIHVybDogYCR7dGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaG9zdH0vZ2V0R2xiRnJvbURhdGFgLFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJ1xyXG4gICAgfSk7XHJcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgIC8vIGNvbnN0IGltYWdlID0gYGRhdGE6JHtyZXN1bHQuZGF0YS5maWxlVHlwZX07YmFzZTY0LCR7cmVzdWx0LmRhdGEuaW1hZ2V9YDtcclxuICAgICAgLy8gdGhpcy5fc2hvd1ByZXZpZXdJbWFnZShyZXN1bHQuZGF0YS5pbWFnZSk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGltYWdlKTtcclxuICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmdsYkNyZWF0ZWQubmV4dChyZXN1bHQuZGF0YS51cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlV2ViU29ja2V0UmVuZGVyKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qgd2ViU29ja2V0Q29ubmVjdGlvbjogc3RyaW5nID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMud2Vic29ja2V0O1xyXG4gICAgY29uc3Qgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldCh3ZWJTb2NrZXRDb25uZWN0aW9uKTtcclxuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XHJcbiAgICAgIHdlYlNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH07XHJcbiAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICBjb25zdCBpbWFnZSA9IGBkYXRhOiR7cmVzdWx0LmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuaW1hZ2V9YDtcclxuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHJlc3VsdC5yZW5kZXJlZDtcclxuICAgICAgICBjb25zdCBmaW5pc2hlZCA9IHJlc3VsdC5maW5pc2hlZDtcclxuICAgICAgICAvLyB0aGlzLl9zaG93UHJldmlld0ltYWdlKGltYWdlKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHQucmVuZGVyZWQpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyVXBkYXRlSW1hZ2VDaGFuZ2VkLm5leHQoe2ltYWdlOiBpbWFnZSwgcHJvZ3Jlc3M6IHByb2dyZXNzLCBmaW5pc2hlZDogZmluaXNoZWR9KTtcclxuICAgICAgICBpZiAocmVzdWx0LmZpbmlzaGVkKSB7XHJcbiAgICAgICAgICB3ZWJTb2NrZXQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVXZWJTb2NrZXRSb29tUmVuZGVyKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qgd2ViU29ja2V0Q29ubmVjdGlvbjogc3RyaW5nID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMud2Vic29ja2V0O1xyXG4gICAgY29uc3Qgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldCh3ZWJTb2NrZXRDb25uZWN0aW9uKTtcclxuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XHJcbiAgICAgIHdlYlNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH07XHJcbiAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICBjb25zdCBpbWFnZSA9IGBkYXRhOiR7cmVzdWx0LmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuaW1hZ2V9YDtcclxuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHJlc3VsdC5yZW5kZXJlZDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRRdWV1ZVJlbmRlckl0ZW0ucmVuZGVyUHJvZ3Jlc3MgPSBwcm9ncmVzcztcclxuICAgICAgICB0aGlzLnJlbmRlclJvb21JbWFnZUNoYW5nZWQubmV4dChpbWFnZSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5maW5pc2hlZCkge1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlZFJvb21JbWFnZXMucHVzaChpbWFnZSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRRdWV1ZVJlbmRlckl0ZW0ucmVuZGVyU3RhdHVzID0gUmVuZGVyU3RhdHVzLklzU3VjY2VzcztcclxuICAgICAgICAgIHdlYlNvY2tldC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Nob3dQcmV2aWV3SW1hZ2Uoc3JjOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlld19pbWcnKTtcclxuICAgIGlmICghaW1nKSB7XHJcbiAgICAgIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG4gICAgICBpbWcuaWQgPSAncHJldmlld19pbWcnO1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnByZXBlbmQoaW1nKTtcclxuICAgICAgaW1nLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgaW1nLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgaW1nLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgIC8vIGltZy5zdHlsZS53aWR0aCA9ICc4MDBweCc7XHJcbiAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnNjAwcHgnO1xyXG4gICAgICBpbWcuc3R5bGUuekluZGV4ID0gJzEwJztcclxuICAgIH1cclxuICAgIChpbWcgYXMgYW55KS5zcmMgPSBzcmM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXREYXRhRm9yUmVuZGVyKGZvcmNlOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbmFsUmVuZGVyUGFyYW1ldGVycz86IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBvYmplY3RSb3RhdGlvbjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xyXG4gICAgaWYgKG9wdGlvbmFsUmVuZGVyUGFyYW1ldGVycyAmJiBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMub2JqZWN0Um90YXRpb24pIHtcclxuICAgICAgb2JqZWN0Um90YXRpb24ueCA9IG9wdGlvbmFsUmVuZGVyUGFyYW1ldGVycy5vYmplY3RSb3RhdGlvbi54O1xyXG4gICAgICBvYmplY3RSb3RhdGlvbi55ID0gb3B0aW9uYWxSZW5kZXJQYXJhbWV0ZXJzLm9iamVjdFJvdGF0aW9uLnk7XHJcbiAgICAgIG9iamVjdFJvdGF0aW9uLnogPSBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMub2JqZWN0Um90YXRpb24uejtcclxuICAgIH1cclxuICAgIGNvbnN0IGJsZW5kZXJWZWN0b3I6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMyhvYmplY3RSb3RhdGlvbi54LCAtb2JqZWN0Um90YXRpb24ueiwgb2JqZWN0Um90YXRpb24ueSk7XHJcbiAgICBsZXQgYXV0b0ZyYW1lTWFyZ2luOiBudW1iZXIgPSAxNTtcclxuICAgIGlmIChvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMgJiYgb3B0aW9uYWxSZW5kZXJQYXJhbWV0ZXJzLm1hcmdpbikge1xyXG4gICAgICBhdXRvRnJhbWVNYXJnaW4gPSBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMubWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gICAgY29uc3QgZGlydHlDYW06IG51bWJlcltdID0gWzEsIDAsIDAsIDAsIDAsIDAuOTc3ODA5NDE5NDM2ODYyNywgLTAuMjA5NDk2Mzk0Mzg1NTQ4NzMsIDAsIDAsIDAuMjA5NDk2Mzk0Mzg1NTQ4NzMsIDAuOTc3ODA5NDE5NDM2ODYyNyxcclxuICAgICAgMCwgMCwgMS4wMjUxODA5MTg5OTAwMjMsIDIuODcwOTc1MTE3NzAyMTY2NywgMV07XHJcbiAgICBjb25zdCBzY2VuZVNldHRpbmdzOiBTY2VuZVNldHRpbmdzW10gPSB0aGlzLl9nZXRTY2VuZVJlbmRlclNldHRpbmdzKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5wcm9kdWN0UmVuZGVyU2NlbmVBc3NldElkKTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIHdpZHRoOiB0aGlzLl9nZXRSZW5kZXJXaWR0aCgpLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuX2dldFJlbmRlckhlaWdodCgpLFxyXG4gICAgICBzY2VuZVNldHRpbmdzOiBzY2VuZVNldHRpbmdzLFxyXG4gICAgICB0cmFuc3BhcmVuY3k6IHRoaXMuX3VzZVRyYW5zcGFyZW5jeShzY2VuZVNldHRpbmdzKSxcclxuICAgICAgLy8gbWF4X3NhbXBsZXM6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLml0ZXJhdGlvbnMsXHJcbiAgICAgIGNhbWVyYU9wdGlvbnM6IHtcclxuICAgICAgICBmb3Y6IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLmZvdixcclxuICAgICAgICBtYXRyaXg6IGRpcnR5Q2FtLCAvLyB0aGlzLnN0YW5kQWxvbmVDYW1lcmFGaXhlZE1hdHJpeCwgIC8vQXJyYXkuZnJvbSh0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYS5tYXRyaXhXb3JsZC5lbGVtZW50cylcclxuICAgICAgfSxcclxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zOiB7XHJcbiAgICAgICAgaGRyaTogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaGRyaSxcclxuICAgICAgICBoZHJpSW50ZW5zaXR5OiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucmVuZGVyUGFyYW1ldGVycy5oZHJpSW50ZW5zaXR5XHJcbiAgICAgIH0sXHJcbiAgICAgIG9iamVjdE9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgeDogdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uLngsXHJcbiAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgejogdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uLnpcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJvdGF0aW9uOiB7XHJcbiAgICAgICAgICB4OiB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEN1c3RvbUZsb29yR3JvdXAucm90YXRpb24ueCxcclxuICAgICAgICAgIHk6IHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi55LFxyXG4gICAgICAgICAgejogdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnJvdGF0aW9uLnpcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGF1dG9GcmFtZU1hcmdpbjogYXV0b0ZyYW1lTWFyZ2luLFxyXG4gICAgICBvYmplY3RSZW5kZXJUcmFuc2Zvcm06IGJsZW5kZXJWZWN0b3JcclxuICAgIH07XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy5faW9uZS5zZWxlY3Rpb25zLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMpKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHMuaW1hZ2VEYXRhTGFzdEFuc3dlciA9IHVuZGVmaW5lZDtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgc2VsZWN0aW9uczogc2VsZWN0aW9ucyxcclxuICAgICAgZGVjb3M6IHRoaXMuX2lvbmUuZGVjb05vZGVzLFxyXG4gICAgICBhc3NldFVybDogdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYXJ0aWNsZS5hc3NldFVybCxcclxuICAgICAgY2RuVXJsOiB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5hcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybCxcclxuICAgICAgc2NoZW1hOiB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5hcnRpY2xlLmRpc3RTY2hlbWEgfHwgJ1VQX0RCQScsXHJcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNcclxuICAgIH07XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFNjZW5lUmVuZGVyU2V0dGluZ3MoYXNzZXRJZDogc3RyaW5nKTogU2NlbmVTZXR0aW5nc1tdIHtcclxuICAgIC8vIEdldCB0aGUgYXNzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQmxlbmRlclJlbmRlclNldHRpbmdzXHJcbiAgICBsZXQgcmVuZGVyU2NlbmVzOiBCbGVuZGVyU2NlbmVTZXR0aW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYmxlbmRlclNjZW5lU2V0dGluZ3MgJiYgdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmJsZW5kZXJTY2VuZVNldHRpbmdzLnNjZW5lcykge1xyXG4gICAgICByZW5kZXJTY2VuZXMgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYmxlbmRlclNjZW5lU2V0dGluZ3Muc2NlbmVzLmZpbHRlcihcclxuICAgICAgICBzY2VuZSA9PiBzY2VuZS5zY2VuZVR5cGUgPT09IEJsZW5kZXJTY2VuZVR5cGUuUHJvZHVjdFxyXG4gICAgICAgICAgJiYgc2NlbmUubmFtZSA9PT0gYXNzZXRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlbmRlclNjZW5lOiBCbGVuZGVyU2NlbmVTZXR0aW5nO1xyXG4gICAgLy8gdGhpcyBzaG91bGQgYmUgYSBsZW5ndGggb2YgMSwgc28gaWYgaXQncyA+IDAsIHdlIGNhbiBzYWZlbHkgdGFrZSB0aGUgZmlyc3Qgb25lXHJcbiAgICBpZiAocmVuZGVyU2NlbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmVuZGVyU2NlbmUgPSByZW5kZXJTY2VuZXNbMF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBmYWxsYmFjayBzY2VuZVxyXG4gICAgICBjb25zdCBmYWxsYmFjazogQmxlbmRlclNjZW5lU2V0dGluZyA9IG5ldyBCbGVuZGVyU2NlbmVTZXR0aW5nKCk7XHJcbiAgICAgIGZhbGxiYWNrLm5hbWUgPSAnY3ljbGVzX3NjZW5lX3N0dWRpbyc7XHJcbiAgICAgIGZhbGxiYWNrLm11bHRpU2NlbmVSZW5kZXIgPSBmYWxzZTtcclxuICAgICAgZmFsbGJhY2sucHJpbWFyeVNjZW5lTmFtZSA9ICdjeWNsZXNfc2NlbmVfc3R1ZGlvJztcclxuICAgICAgZmFsbGJhY2suaGRyaUludGVuc2l0eSA9IDE7XHJcbiAgICAgIGZhbGxiYWNrLmhkcmlSb3RhdGlvbiA9IDA7XHJcbiAgICAgIGZhbGxiYWNrLmxpZ2h0aW5nRXhwb3N1cmUgPSAxO1xyXG4gICAgICBmYWxsYmFjay5zY2VuZVR5cGUgPSBCbGVuZGVyU2NlbmVUeXBlLlByb2R1Y3Q7XHJcbiAgICAgIHJlbmRlclNjZW5lID0gZmFsbGJhY2s7XHJcbiAgICB9XHJcbiAgICBsZXQgc2NlbmVzOiBTY2VuZVNldHRpbmdzW10gPSBbXTtcclxuICAgIC8vIFByaW1hcnkgc2NlbmVcclxuICAgIGNvbnN0IGNvbXBvc2l0ZVNjZW5lOiBTY2VuZVNldHRpbmdzID0gbmV3IFNjZW5lU2V0dGluZ3MoKTtcclxuICAgIGNvbXBvc2l0ZVNjZW5lLnNjZW5lQXNzZXRJZCA9IHJlbmRlclNjZW5lLnByaW1hcnlTY2VuZU5hbWU7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5hY3RpdmVDYW1lcmFJZCA9IDE7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5kZWZhdWx0ID0gdHJ1ZTtcclxuICAgIGNvbXBvc2l0ZVNjZW5lLmhkcmlSb3RhdGlvbiA9IHRoaXMuX2FwaVNlcnZpY2VNb2R1bGUuZGVncmVlc1RvVmVjdG9yMyhyZW5kZXJTY2VuZS5oZHJpUm90YXRpb24pO1xyXG4gICAgY29tcG9zaXRlU2NlbmUuaGRyaUludGVuc2l0eSA9IHJlbmRlclNjZW5lLmhkcmlJbnRlbnNpdHk7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5pZCA9IDYwMDtcclxuXHJcbiAgICBpZiAocmVuZGVyU2NlbmUubXVsdGlTY2VuZVJlbmRlcikge1xyXG4gICAgICBjb25zdCBhZGRpdGlvbmFsU2NlbmU6IFNjZW5lU2V0dGluZ3MgPSBuZXcgU2NlbmVTZXR0aW5ncygpO1xyXG4gICAgICBhZGRpdGlvbmFsU2NlbmUuc2NlbmVBc3NldElkID0gcmVuZGVyU2NlbmUuc2Vjb25kYXJ5U2NlbmVOYW1lO1xyXG4gICAgICBhZGRpdGlvbmFsU2NlbmUuYWN0aXZlQ2FtZXJhSWQgPSAxO1xyXG4gICAgICBhZGRpdGlvbmFsU2NlbmUuZGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgICBhZGRpdGlvbmFsU2NlbmUuaGRyaVJvdGF0aW9uID0gdGhpcy5fYXBpU2VydmljZU1vZHVsZS5kZWdyZWVzVG9WZWN0b3IzKHJlbmRlclNjZW5lLmhkcmlSb3RhdGlvbik7XHJcbiAgICAgIGFkZGl0aW9uYWxTY2VuZS5oZHJpSW50ZW5zaXR5ID0gcmVuZGVyU2NlbmUuaGRyaUludGVuc2l0eTtcclxuICAgICAgYWRkaXRpb25hbFNjZW5lLmlkID0gNjAxO1xyXG4gICAgICBzY2VuZXMgPSBbY29tcG9zaXRlU2NlbmUsIGFkZGl0aW9uYWxTY2VuZV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzY2VuZXMgPSBbY29tcG9zaXRlU2NlbmVdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNjZW5lcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldERhdGFGb3JSb29tUmVuZGVyKHNpemU6IGFueSk6IGFueSB7XHJcbiAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIHdpZHRoOiBzaXplLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0LFxyXG4gICAgICBtYXhfc2FtcGxlczogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaXRlcmF0aW9ucyxcclxuICAgICAgY2FtZXJhT3B0aW9uczoge1xyXG4gICAgICAgIGZvdjogdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEuZm92LFxyXG4gICAgICAgIG1hdHJpeDogQXJyYXkuZnJvbSh0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZWxlbWVudHMpXHJcbiAgICAgIH0sXHJcbiAgICAgIGVudmlyb25tZW50T3B0aW9uczoge1xyXG4gICAgICAgIGhkcmk6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhkcmksXHJcbiAgICAgICAgaGRyaUludGVuc2l0eTogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaGRyaUludGVuc2l0eVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgYXNzZXRVcmw6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGgsXHJcbiAgICAgIGNkblVybDogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnRocmVlREFzc2V0UGF0aCxcclxuICAgICAgc2NoZW1hOiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2NoZW1hLFxyXG4gICAgICBvcHRpb25zOiBvcHRpb25zXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hcnJheUJ1ZmZlclRvQmFzZTY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJpbmFyeSA9ICcnO1xyXG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgY29uc3QgbGVuID0gYnl0ZXMuYnl0ZUxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHdpbmRvdy5idG9hKGJpbmFyeSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyV2lkdGgoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucmVuZGVyUGFyYW1ldGVycy5pbWFnZVdpZHRoID09PSAwIHx8IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmltYWdlV2lkdGggPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2xpZW50V2lkdGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaW1hZ2VXaWR0aDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFJlbmRlckhlaWdodCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmltYWdlSGVpZ2h0ID09PSAwIHx8IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmltYWdlSGVpZ2h0ID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNsaWVudEhlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucmVuZGVyUGFyYW1ldGVycy5pbWFnZUhlaWdodDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZVRyYW5zcGFyZW5jeShzY2VuZVNldHRpbmdzOiBTY2VuZVNldHRpbmdzW10pOiBib29sZWFuIHtcclxuICAgIC8vIE9OTFkgd2hlbiB3ZSBhcmUgdXNpbmcgbXVsdGlzY2VuZSBjb21wb3NpdGluZywgd2UgbmVlZCB0byB1c2UgdHJhbnNwYXJlbmN5XHJcbiAgICByZXR1cm4gc2NlbmVTZXR0aW5ncy5sZW5ndGggPiAxO1xyXG4gIH1cclxufVxyXG4iXX0=