@colijnit/homedecorator 255.1.2 → 255.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/core/model/homedecorator-settings-options.d.ts +1 -0
- package/app/core/service/homedecorator-connector-adapter.service.d.ts +1 -1
- package/app/core/service/utils.service.d.ts +1 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.scss +2 -4
- package/app/plugins/core3d/items/floor-plane-item.d.ts +8 -1
- package/app/plugins/core3d/items/metadata.d.ts +2 -0
- package/app/plugins/core3d/service/ar.service.d.ts +1 -0
- package/app/plugins/core3d/service/floor-pattern.service.d.ts +26 -0
- package/app/plugins/core3d/service/floor-tile-intersection.service.d.ts +25 -0
- package/app/plugins/core3d/service/outline.service.d.ts +1 -2
- package/app/plugins/core3d/service/post-processing.service.d.ts +6 -0
- package/app/plugins/core3d/service/scene.service.d.ts +4 -1
- package/app/plugins/core3d/service/ssr.service.d.ts +18 -0
- package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +40 -3
- package/app/plugins/render/service/new-render.service.d.ts +1 -0
- package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +10 -1
- package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +1 -0
- package/app/plugins/toolbar/toolbar.module.d.ts +2 -1
- package/app/shared/pdf-export/pdf-export.component.d.ts +20 -0
- package/app/shared/pdf-export/pdf-export.component.scss +19 -0
- package/app/shared/pdf-export/pdf-export.module.d.ts +11 -0
- package/assets/icons/pen-ruler.svg +1 -0
- package/assets/icons/xmark_regular.svg +1 -0
- package/bundles/colijnit-homedecorator.umd.js +1195 -174
- package/bundles/colijnit-homedecorator.umd.js.map +1 -1
- package/colijnit-homedecorator-255.1.2.tgz +0 -0
- package/esm2015/app/app.version.js +4 -4
- package/esm2015/app/core/model/homedecorator-settings-options.js +2 -1
- package/esm2015/app/core/model/light-preset.js +11 -7
- package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +4 -6
- package/esm2015/app/core/service/homedecorator-connector.service.js +3 -1
- package/esm2015/app/core/service/utils.service.js +16 -1
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.js +2 -2
- package/esm2015/app/plugins/core3d/items/floor-plane-item.js +25 -2
- package/esm2015/app/plugins/core3d/items/metadata.js +1 -1
- package/esm2015/app/plugins/core3d/service/ar.service.js +14 -1
- package/esm2015/app/plugins/core3d/service/floor-pattern.service.js +156 -0
- package/esm2015/app/plugins/core3d/service/floor-tile-intersection.service.js +122 -0
- package/esm2015/app/plugins/core3d/service/floor.service.js +5 -2
- package/esm2015/app/plugins/core3d/service/outline.service.js +9 -8
- package/esm2015/app/plugins/core3d/service/post-processing.service.js +77 -22
- package/esm2015/app/plugins/core3d/service/scene.service.js +30 -13
- package/esm2015/app/plugins/core3d/service/ssr.service.js +53 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.js +3 -3
- package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +335 -79
- package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +3 -2
- package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +3 -2
- package/esm2015/app/plugins/render/service/new-render.service.js +37 -13
- package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +135 -5
- package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +34 -8
- package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +9 -25
- package/esm2015/app/plugins/toolbar/toolbar.module.js +8 -4
- package/esm2015/app/shared/pdf-export/pdf-export.component.js +86 -0
- package/esm2015/app/shared/pdf-export/pdf-export.module.js +38 -0
- package/fesm2015/colijnit-homedecorator.js +1156 -181
- package/fesm2015/colijnit-homedecorator.js.map +1 -1
- package/package.json +2 -2
- package/assets/hdri/ground_MASK.jpg +0 -0
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import { Component, Inject, ViewChild } from '@angular/core';
|
|
11
11
|
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
12
12
|
import * as THREE from 'three';
|
|
13
|
-
import {
|
|
13
|
+
import { Box3, Color, GridHelper, Light, LinearSRGBColorSpace, Mesh, MeshBasicMaterial, MeshPhongMaterial, PCFSoftShadowMap, PerspectiveCamera, PlaneGeometry, PMREMGenerator, Scene, Vector3, WebGLRenderer } from 'three';
|
|
14
14
|
import { FloatType, LinearToneMapping } from 'three/src/constants';
|
|
15
15
|
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
|
|
16
16
|
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader';
|
|
@@ -19,16 +19,26 @@ import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter';
|
|
|
19
19
|
import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader';
|
|
20
20
|
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';
|
|
21
21
|
import { TDSLoader } from 'three/examples/jsm/loaders/TDSLoader';
|
|
22
|
+
import { MessageType } from '../../../core/enum/message-type.enum';
|
|
23
|
+
import { LightCreateService } from '../../threedselector/threedselector/service/light-creation.service';
|
|
24
|
+
import { FileUtils } from '../../../core/utils/file.utils';
|
|
25
|
+
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader';
|
|
26
|
+
import { BoxMeasurement } from '../../core3d/hud/bounding-measurement-box/box-measurement';
|
|
27
|
+
import { MeasurementUtils, positioningFactors, xDirection, yDirection, zDirection } from '../../core3d/hud/bounding-measurement-box/measurement-utils';
|
|
28
|
+
import { makeTextMesh } from '../../core3d/hud/utils';
|
|
22
29
|
import * as i0 from "@angular/core";
|
|
23
30
|
import * as i1 from "../../../core/service/homedecorator-settings.service";
|
|
24
31
|
import * as i2 from "@angular/material/dialog";
|
|
25
32
|
import * as i3 from "../../threedselector/threedselector/service/third-party-model.service";
|
|
26
33
|
import * as i4 from "../../../core/service/message-bus.service";
|
|
27
34
|
import * as i5 from "../../../core/service/homedecorator-connector-adapter.service";
|
|
28
|
-
import * as i6 from "
|
|
29
|
-
import * as i7 from "
|
|
35
|
+
import * as i6 from "../../core3d/service/light-presets.service";
|
|
36
|
+
import * as i7 from "../../../core/service/homedecorator-dictionary.service";
|
|
37
|
+
import * as i8 from "../../core3d/service/font.service";
|
|
38
|
+
import * as i9 from "@angular/material/radio";
|
|
39
|
+
import * as i10 from "@angular/common";
|
|
30
40
|
export class ModelPreviewComponent {
|
|
31
|
-
constructor(data, settingsService, _dialogRef, _thirdPartyModelService, _messageService, _dialog, _adapterService) {
|
|
41
|
+
constructor(data, settingsService, _dialogRef, _thirdPartyModelService, _messageService, _dialog, _adapterService, _lightPresetsService, _dictionaryService, _fontService) {
|
|
32
42
|
this.data = data;
|
|
33
43
|
this.settingsService = settingsService;
|
|
34
44
|
this._dialogRef = _dialogRef;
|
|
@@ -36,8 +46,21 @@ export class ModelPreviewComponent {
|
|
|
36
46
|
this._messageService = _messageService;
|
|
37
47
|
this._dialog = _dialog;
|
|
38
48
|
this._adapterService = _adapterService;
|
|
49
|
+
this._lightPresetsService = _lightPresetsService;
|
|
50
|
+
this._dictionaryService = _dictionaryService;
|
|
51
|
+
this._fontService = _fontService;
|
|
39
52
|
this.unitsOfMeasurement = 'cm';
|
|
40
53
|
this.mathPi = Math.PI;
|
|
54
|
+
this.showReferenceModel = true;
|
|
55
|
+
this.floorSizeHeight = 10;
|
|
56
|
+
this.floorSizeWidth = 10;
|
|
57
|
+
this.gridSize = 10;
|
|
58
|
+
this.gridDivision = 10;
|
|
59
|
+
this.distanceStep = 1;
|
|
60
|
+
this.stackable = false;
|
|
61
|
+
this.heightAdjustable = false;
|
|
62
|
+
this._measurements = [];
|
|
63
|
+
this.font = this._fontService.hudFont;
|
|
41
64
|
}
|
|
42
65
|
ngOnInit() {
|
|
43
66
|
this.initScene();
|
|
@@ -71,44 +94,50 @@ export class ModelPreviewComponent {
|
|
|
71
94
|
this.rendererPreview.domElement.setAttribute('id', 'threed');
|
|
72
95
|
this.rendererPreview.setSize(window.innerWidth / 2, window.innerHeight / 2, true);
|
|
73
96
|
// init camera
|
|
74
|
-
this.cameraPreview = new PerspectiveCamera(45, 1, 0.01,
|
|
97
|
+
this.cameraPreview = new PerspectiveCamera(45, 1, 0.01, 100000000);
|
|
75
98
|
this.cameraPreview.position.set(0, 2, 10);
|
|
76
99
|
this.cameraPreview.aspect = window.innerWidth / window.innerHeight;
|
|
77
100
|
this.cameraPreview.updateProjectionMatrix();
|
|
78
101
|
this.controls = new OrbitControls(this.cameraPreview, this.rendererPreview.domElement);
|
|
79
102
|
this.controls.update();
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
this.
|
|
87
|
-
|
|
88
|
-
|
|
103
|
+
this.loadFloorPlane();
|
|
104
|
+
this.loadReferenceModel();
|
|
105
|
+
this.loadLights();
|
|
106
|
+
const gridHelper = new GridHelper(this.gridSize, this.gridDivision);
|
|
107
|
+
gridHelper.name = 'GridHelper';
|
|
108
|
+
this.scenePreview.add(gridHelper);
|
|
109
|
+
this._animate();
|
|
110
|
+
}
|
|
111
|
+
loadFloorPlane() {
|
|
112
|
+
const planeGeometry = new PlaneGeometry(this.floorSizeWidth, this.floorSizeHeight);
|
|
113
|
+
const planeMaterial = new MeshBasicMaterial({ color: 0x899499, side: THREE.DoubleSide });
|
|
89
114
|
const plane = new Mesh(planeGeometry, planeMaterial);
|
|
90
115
|
plane.rotation.x = -Math.PI / 2;
|
|
91
116
|
plane.position.y = 0;
|
|
92
117
|
plane.name = 'floor_plane';
|
|
93
118
|
this.scenePreview.add(plane);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
this.
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
119
|
+
}
|
|
120
|
+
loadLights() {
|
|
121
|
+
const listOfLightPresets = this._lightPresetsService.loadedLightPresets;
|
|
122
|
+
const lightPreset = this._lightPresetsService.activeLightPreset;
|
|
123
|
+
for (const lightProperties of lightPreset.lights) {
|
|
124
|
+
this._createLightFromProperties(lightProperties);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
loadReferenceModel() {
|
|
128
|
+
let referenceModelPath = '';
|
|
129
|
+
const referenceModel = 'reference_pop.glb';
|
|
130
|
+
if (this.settingsService.settings.threeDAssetPath) {
|
|
131
|
+
referenceModelPath = this.settingsService.settings.threeDAssetPath + 'assets/';
|
|
132
|
+
}
|
|
133
|
+
const loader = new GLTFLoader();
|
|
134
|
+
loader.load(referenceModelPath + referenceModel, (gltf) => __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
gltf.scene.position.set(3, 0, 3);
|
|
136
|
+
gltf.scene.castShadow = true;
|
|
137
|
+
gltf.scene.receiveShadow = true;
|
|
138
|
+
gltf.scene.name = 'Reference_model';
|
|
139
|
+
this.scenePreview.add(gltf.scene);
|
|
140
|
+
}));
|
|
112
141
|
}
|
|
113
142
|
loadModel(input) {
|
|
114
143
|
this.modelName = this._setModelName(input.file.file.name);
|
|
@@ -125,6 +154,9 @@ export class ModelPreviewComponent {
|
|
|
125
154
|
else if (fileType === '3ds') {
|
|
126
155
|
this._tdsLoader(input);
|
|
127
156
|
}
|
|
157
|
+
else if (fileType === 'stl') {
|
|
158
|
+
this._stlLoader(input);
|
|
159
|
+
}
|
|
128
160
|
}
|
|
129
161
|
loadHDRI(path) {
|
|
130
162
|
return new Promise((resolve, reject) => {
|
|
@@ -144,11 +176,10 @@ export class ModelPreviewComponent {
|
|
|
144
176
|
// add timestamp
|
|
145
177
|
const timestamp = new Date().getTime();
|
|
146
178
|
const exportFileName = this._setModelName(this.glbExportName.nativeElement.value) + '_' + timestamp;
|
|
147
|
-
const elementsToRemove = ['Reference_model', 'floor_plane'];
|
|
179
|
+
const elementsToRemove = ['Reference_model', 'floor_plane', 'GridHelper', 'Ambient', 'Directional front-left', 'spot back (anti-sun)', 'boxHeight', 'boxWidth', 'boxDepth'];
|
|
148
180
|
const gltfExporter = new GLTFExporter();
|
|
149
181
|
let scene;
|
|
150
182
|
scene = this.scenePreview.clone();
|
|
151
|
-
scene.environment.dispose();
|
|
152
183
|
scene.children.forEach(c => {
|
|
153
184
|
if (c instanceof Light) {
|
|
154
185
|
scene.remove(c);
|
|
@@ -173,7 +204,8 @@ export class ModelPreviewComponent {
|
|
|
173
204
|
else {
|
|
174
205
|
this._downloadModel(`${exportFileName}.glb`, file);
|
|
175
206
|
}
|
|
176
|
-
}, () => {
|
|
207
|
+
}, (e) => {
|
|
208
|
+
console.log(e);
|
|
177
209
|
}, options);
|
|
178
210
|
}
|
|
179
211
|
scaleArticle() {
|
|
@@ -202,9 +234,33 @@ export class ModelPreviewComponent {
|
|
|
202
234
|
}
|
|
203
235
|
this._getBoundingBox(model);
|
|
204
236
|
}
|
|
237
|
+
moveModel(axis, amount) {
|
|
238
|
+
const model = this.scenePreview.getObjectByName(this.modelName);
|
|
239
|
+
if (axis === 'x') {
|
|
240
|
+
model.position.x += amount;
|
|
241
|
+
}
|
|
242
|
+
else if (axis === 'y') {
|
|
243
|
+
model.position.y += amount;
|
|
244
|
+
}
|
|
245
|
+
else if (axis === 'z') {
|
|
246
|
+
model.position.z += amount;
|
|
247
|
+
}
|
|
248
|
+
this._getBoundingBox(model);
|
|
249
|
+
}
|
|
205
250
|
setUnit(event) {
|
|
206
251
|
this.unitsOfMeasurement = event.value;
|
|
207
252
|
}
|
|
253
|
+
toggleShowReferenceModel() {
|
|
254
|
+
const model = this.scenePreview.getObjectByName('Reference_model');
|
|
255
|
+
model.visible = !this.showReferenceModel;
|
|
256
|
+
this.showReferenceModel = !this.showReferenceModel;
|
|
257
|
+
}
|
|
258
|
+
setStackable(event) {
|
|
259
|
+
this.stackable = event.value;
|
|
260
|
+
}
|
|
261
|
+
setHeightAdjustable(event) {
|
|
262
|
+
this.heightAdjustable = event.value;
|
|
263
|
+
}
|
|
208
264
|
_animate() {
|
|
209
265
|
setTimeout(() => {
|
|
210
266
|
this.rendererPreview.setAnimationLoop((timestamp, frame) => this._render(timestamp, frame));
|
|
@@ -226,21 +282,29 @@ export class ModelPreviewComponent {
|
|
|
226
282
|
}
|
|
227
283
|
_sendModelToCDN(fileName, blob) {
|
|
228
284
|
return __awaiter(this, void 0, void 0, function* () {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
285
|
+
const reader = new FileReader();
|
|
286
|
+
reader.readAsDataURL(blob);
|
|
287
|
+
reader.onloadend = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
288
|
+
const fileAsString = FileUtils.StripMimeStringFromDataUri(event.target.result);
|
|
289
|
+
this._adapterService.store3DModelCDN(fileName, fileAsString).then(filePath => {
|
|
290
|
+
if (filePath) {
|
|
291
|
+
this._blobToArrayBuffer(blob).then(file => {
|
|
292
|
+
const hash = fileName;
|
|
293
|
+
const modelUrl = filePath; // Set url from the CDN
|
|
294
|
+
const configurationData = {};
|
|
295
|
+
const priceData = {};
|
|
296
|
+
const metaData = this._thirdPartyModelService.setMetadata(hash, modelUrl, configurationData);
|
|
297
|
+
metaData.canElevate = this.heightAdjustable;
|
|
298
|
+
metaData.thirdPartyModel = true;
|
|
299
|
+
// We also can set the metadata here and pas it as the last argument for parseModelToGLB.
|
|
300
|
+
this._thirdPartyModelService.parseModelToGLB(file, hash, modelUrl, configurationData, priceData, metaData).then(result => {
|
|
301
|
+
this._dialog.closeAll();
|
|
302
|
+
this._messageService.emit(MessageType.HideProductCatalog);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
}
|
|
232
306
|
});
|
|
233
307
|
});
|
|
234
|
-
// const hash: string = fileName;
|
|
235
|
-
// const modelUrl: string = ''; // Set url from the CDN
|
|
236
|
-
// const configurationData: any = {};
|
|
237
|
-
// const priceData: any = {};
|
|
238
|
-
// // const metaData: Metadata = new Metadata();
|
|
239
|
-
// // We also can set the metadata here and pas it as the last argument for parseModelToGLB.
|
|
240
|
-
//
|
|
241
|
-
// await this._thirdPartyModelService.parseModelToGLB(file, hash, modelUrl, configurationData, priceData);
|
|
242
|
-
// this._dialog.closeAll();
|
|
243
|
-
// this._messageService.emit(MessageType.HideProductCatalog);
|
|
244
308
|
});
|
|
245
309
|
}
|
|
246
310
|
_setModelName(name) {
|
|
@@ -250,12 +314,7 @@ export class ModelPreviewComponent {
|
|
|
250
314
|
_glbLoader(input) {
|
|
251
315
|
const loader = new GLTFLoader();
|
|
252
316
|
loader.parse(input.file.fileContents, '', (object) => __awaiter(this, void 0, void 0, function* () {
|
|
253
|
-
object.scene
|
|
254
|
-
object.scene.position.set(0, 0, 0);
|
|
255
|
-
object.scene.scale.set(1, 1, 1);
|
|
256
|
-
this.scenePreview.add(object.scene);
|
|
257
|
-
this.loadedModel = object.scene;
|
|
258
|
-
this._getBoundingBox(object.scene);
|
|
317
|
+
this._prepModelForScene(object.scene);
|
|
259
318
|
}), error => {
|
|
260
319
|
console.log('Parsing error');
|
|
261
320
|
});
|
|
@@ -263,12 +322,7 @@ export class ModelPreviewComponent {
|
|
|
263
322
|
_fbxLoader(input) {
|
|
264
323
|
const fbxLoader = new FBXLoader();
|
|
265
324
|
const object = fbxLoader.parse(input.file.fileContents, '');
|
|
266
|
-
|
|
267
|
-
object.position.set(0, 0, 0);
|
|
268
|
-
object.scale.set(1, 1, 1);
|
|
269
|
-
this.scenePreview.add(object);
|
|
270
|
-
this.loadedModel = object;
|
|
271
|
-
this._getBoundingBox(object);
|
|
325
|
+
this._prepModelForScene(object);
|
|
272
326
|
}
|
|
273
327
|
_objLoader(input) {
|
|
274
328
|
const objLoader = new OBJLoader();
|
|
@@ -277,26 +331,105 @@ export class ModelPreviewComponent {
|
|
|
277
331
|
const decoder = new TextDecoder();
|
|
278
332
|
const str = decoder.decode(buf);
|
|
279
333
|
const object = objLoader.parse(str);
|
|
280
|
-
|
|
281
|
-
object.position.set(0, 0, 0);
|
|
282
|
-
object.scale.set(1, 1, 1);
|
|
283
|
-
this.scenePreview.add(object);
|
|
284
|
-
this.loadedModel = object;
|
|
285
|
-
this._getBoundingBox(object);
|
|
334
|
+
this._prepModelForScene(object);
|
|
286
335
|
}
|
|
287
336
|
_tdsLoader(input) {
|
|
288
337
|
const tdsLoader = new TDSLoader();
|
|
289
338
|
const object = tdsLoader.parse(input.file.fileContents, '');
|
|
339
|
+
object.traverse(element => {
|
|
340
|
+
console.log(element);
|
|
341
|
+
});
|
|
342
|
+
this._prepModelForScene(object);
|
|
343
|
+
}
|
|
344
|
+
_stlLoader(input) {
|
|
345
|
+
const stlLoader = new STLLoader();
|
|
346
|
+
const object = stlLoader.parse(input.file.fileContents);
|
|
347
|
+
this._addFromGeometry(object);
|
|
348
|
+
}
|
|
349
|
+
_addFromGeometry(geometry) {
|
|
350
|
+
const material = new MeshPhongMaterial({ transparent: true, opacity: geometry.alpha });
|
|
351
|
+
const model = new Mesh(geometry, material);
|
|
352
|
+
this._prepModelForScene(model);
|
|
353
|
+
}
|
|
354
|
+
_prepModelForScene(object) {
|
|
290
355
|
object.name = this.modelName;
|
|
291
356
|
object.position.set(0, 0, 0);
|
|
292
357
|
object.scale.set(1, 1, 1);
|
|
358
|
+
// Remove lights from the children
|
|
359
|
+
object.children.forEach(c => {
|
|
360
|
+
if (c instanceof Light) {
|
|
361
|
+
object.remove(c);
|
|
362
|
+
}
|
|
363
|
+
});
|
|
293
364
|
this.scenePreview.add(object);
|
|
294
365
|
this.loadedModel = object;
|
|
295
366
|
this._getBoundingBox(object);
|
|
296
367
|
}
|
|
297
368
|
_getBoundingBox(object) {
|
|
298
|
-
const boundingBox = new
|
|
369
|
+
const boundingBox = new Box3().setFromObject(object);
|
|
299
370
|
this.boundingBoxSize = boundingBox.getSize(new Vector3());
|
|
371
|
+
this._setMeasurements(this.boundingBoxSize);
|
|
372
|
+
this._showMeasurements();
|
|
373
|
+
}
|
|
374
|
+
_showMeasurements() {
|
|
375
|
+
const measurementsMeshes = this._measurements.map(value => value.textMesh);
|
|
376
|
+
measurementsMeshes.forEach(object => this.scenePreview.add(object));
|
|
377
|
+
}
|
|
378
|
+
_setMeasurements(boundingBox) {
|
|
379
|
+
const setHeight = this._createHeightMeasurement(boundingBox.y);
|
|
380
|
+
this._measurements.push(setHeight);
|
|
381
|
+
const setWidth = this._createWidthMeasurement(boundingBox.x);
|
|
382
|
+
this._measurements.push(setWidth);
|
|
383
|
+
const setDepth = this._createDepthMeasurement(boundingBox.z);
|
|
384
|
+
this._measurements.push(setDepth);
|
|
385
|
+
}
|
|
386
|
+
_createHeightMeasurement(heightInput) {
|
|
387
|
+
const height = new BoxMeasurement();
|
|
388
|
+
const heightString = MeasurementUtils.makeText(heightInput, this.unitsOfMeasurement, this.distanceStep);
|
|
389
|
+
const text = this._dictionaryService.get('LABEL_HEIGHT');
|
|
390
|
+
height.textMesh = makeTextMesh(heightString, this.font, 0xFF00FF, 0.08, false, false, text);
|
|
391
|
+
height.positions = this._calculateHeightPositions();
|
|
392
|
+
height.textMesh.name = 'boxHeight';
|
|
393
|
+
return height;
|
|
394
|
+
}
|
|
395
|
+
_createWidthMeasurement(widthInput) {
|
|
396
|
+
const width = new BoxMeasurement();
|
|
397
|
+
const widthString = MeasurementUtils.makeText(widthInput, this.unitsOfMeasurement, this.distanceStep);
|
|
398
|
+
const text = this._dictionaryService.get('LABEL_WIDTH');
|
|
399
|
+
width.textMesh = makeTextMesh(widthString, this.font, 0xFF00FF, 0.08, false, false, text);
|
|
400
|
+
width.positions = this._calculateWidthPositions();
|
|
401
|
+
width.textMesh.name = 'boxWidth';
|
|
402
|
+
return width;
|
|
403
|
+
}
|
|
404
|
+
_createDepthMeasurement(depthInput) {
|
|
405
|
+
const depth = new BoxMeasurement();
|
|
406
|
+
const depthString = MeasurementUtils.makeText(depthInput, this.unitsOfMeasurement, this.distanceStep);
|
|
407
|
+
const text = this._dictionaryService.get('LABEL_DEPTH');
|
|
408
|
+
depth.textMesh = makeTextMesh(depthString, this.font, 0xFF00FF, 0.08, false, false, text);
|
|
409
|
+
depth.positions = this._calculateDepthPositions();
|
|
410
|
+
depth.textMesh.name = 'boxDepth';
|
|
411
|
+
return depth;
|
|
412
|
+
}
|
|
413
|
+
_calculateHeightPositions() {
|
|
414
|
+
return positioningFactors.map(([j, k]) => {
|
|
415
|
+
return new THREE.Vector3()
|
|
416
|
+
.addScaledVector(xDirection, j / 2 * this.boundingBoxSize.x)
|
|
417
|
+
.addScaledVector(zDirection, k / 2 * this.boundingBoxSize.z);
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
_calculateWidthPositions() {
|
|
421
|
+
return positioningFactors.map(([j, k]) => {
|
|
422
|
+
return new THREE.Vector3()
|
|
423
|
+
.addScaledVector(yDirection, j / 2 * this.boundingBoxSize.y)
|
|
424
|
+
.addScaledVector(zDirection, k / 2 * this.boundingBoxSize.z);
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
_calculateDepthPositions() {
|
|
428
|
+
return positioningFactors.map(([j, k]) => {
|
|
429
|
+
return new THREE.Vector3()
|
|
430
|
+
.addScaledVector(yDirection, j / 2 * this.boundingBoxSize.y)
|
|
431
|
+
.addScaledVector(xDirection, k / 2 * this.boundingBoxSize.x);
|
|
432
|
+
});
|
|
300
433
|
}
|
|
301
434
|
_blobToArrayBuffer(blob) {
|
|
302
435
|
return new Promise((resolve, reject) => {
|
|
@@ -315,8 +448,47 @@ export class ModelPreviewComponent {
|
|
|
315
448
|
reader.readAsArrayBuffer(blob);
|
|
316
449
|
});
|
|
317
450
|
}
|
|
451
|
+
_createLightFromProperties(lightProperties) {
|
|
452
|
+
const lightType = lightProperties.type;
|
|
453
|
+
const getLights = new LightCreateService();
|
|
454
|
+
const light = getLights.createNewLight(lightType);
|
|
455
|
+
light.userData.wallOffset = lightProperties.wallOffset;
|
|
456
|
+
light.userData.rotationOffset = lightProperties.rotationOffset;
|
|
457
|
+
light.userData.topDownDirectional = lightProperties.topDownDirectional;
|
|
458
|
+
for (const property in lightProperties) {
|
|
459
|
+
if (!light.hasOwnProperty(property)) {
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
if (property === 'position') {
|
|
463
|
+
light.position.y = lightProperties.position.y;
|
|
464
|
+
}
|
|
465
|
+
else if (property === 'color') {
|
|
466
|
+
light.color = new Color(lightProperties.color);
|
|
467
|
+
}
|
|
468
|
+
else if (property === 'groundColor') {
|
|
469
|
+
light.groundColor = new Color(lightProperties.groundColor);
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
this._setObjectProperties(light, property, lightProperties[property]);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
this.scenePreview.add(light);
|
|
476
|
+
}
|
|
477
|
+
_setObjectProperties(object, property, value) {
|
|
478
|
+
if (property === 'shadow') {
|
|
479
|
+
for (const prop in value) {
|
|
480
|
+
if (!object[property].hasOwnProperty(prop)) {
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
483
|
+
object[property][prop] = value[prop];
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
object[property] = value;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
318
490
|
}
|
|
319
|
-
ModelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.HomedecoratorSettingsService }, { token: i2.MatDialogRef }, { token: i3.ThirdPartyModelService }, { token: i4.MessageBusService }, { token: i2.MatDialog }, { token: i5.HomedecoratorConnectorAdapterService }], target: i0.ɵɵFactoryTarget.Component });
|
|
491
|
+
ModelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.HomedecoratorSettingsService }, { token: i2.MatDialogRef }, { token: i3.ThirdPartyModelService }, { token: i4.MessageBusService }, { token: i2.MatDialog }, { token: i5.HomedecoratorConnectorAdapterService }, { token: i6.LightPresetsService }, { token: i7.HomedecoratorDictionaryService }, { token: i8.FontService }], target: i0.ɵɵFactoryTarget.Component });
|
|
320
492
|
ModelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ModelPreviewComponent, selector: "rp-model-preview", viewQueries: [{ propertyName: "glbExportName", first: true, predicate: ["fileName"], descendants: true }, { propertyName: "heightArticle", first: true, predicate: ["heightArticle"], descendants: true }], ngImport: i0, template: `
|
|
321
493
|
<div class="model-preview">
|
|
322
494
|
<div class="model-preview-container" id="canvasContainer">
|
|
@@ -336,6 +508,10 @@ ModelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
|
|
|
336
508
|
</div>
|
|
337
509
|
</div>
|
|
338
510
|
|
|
511
|
+
<div>
|
|
512
|
+
<button (click)="toggleShowReferenceModel()">Show Reference model</button>
|
|
513
|
+
</div>
|
|
514
|
+
|
|
339
515
|
<div class="rotation-button-container">
|
|
340
516
|
<p>Rotation</p>
|
|
341
517
|
<div class="rotation-x-buttons">
|
|
@@ -352,6 +528,23 @@ ModelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
|
|
|
352
528
|
</div>
|
|
353
529
|
</div>
|
|
354
530
|
|
|
531
|
+
|
|
532
|
+
<div class="rotation-button-container">
|
|
533
|
+
<p>Positie</p>
|
|
534
|
+
<div class="rotation-x-buttons">
|
|
535
|
+
<button (click)="moveModel('x', 0.01)">x-as + 0.01</button>
|
|
536
|
+
<button (click)="moveModel('x', -0.01)">x-as -0.01</button>
|
|
537
|
+
</div>
|
|
538
|
+
<div class="rotation-y-buttons">
|
|
539
|
+
<button (click)="moveModel('y', 0.01)">y-as + 0.01</button>
|
|
540
|
+
<button (click)="moveModel('y', -0.01)">y-as - 0.01</button>
|
|
541
|
+
</div>
|
|
542
|
+
<div class="rotation-z-buttons">
|
|
543
|
+
<button (click)="moveModel('z', 0.01)">z-as + 0.01</button>
|
|
544
|
+
<button (click)="moveModel('z', -mathPi / 2)">z-as -0.01</button>
|
|
545
|
+
</div>
|
|
546
|
+
</div>
|
|
547
|
+
|
|
355
548
|
<div class="model-preview-info" *ngIf="this.data">
|
|
356
549
|
<div class="model-preview-info-container">
|
|
357
550
|
<div class="model-preview-info-left">
|
|
@@ -361,14 +554,35 @@ ModelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
|
|
|
361
554
|
<input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
|
|
362
555
|
</div>
|
|
363
556
|
</div>
|
|
557
|
+
|
|
558
|
+
<div class="model-preview-info-container">
|
|
559
|
+
<div class="model-preview-info-left">
|
|
560
|
+
<label>Stackable</label>
|
|
561
|
+
</div>
|
|
562
|
+
<div class="model-preview-info-right">
|
|
563
|
+
<div class="mat-radio-wrapper">
|
|
564
|
+
<mat-radio-group aria-label="Select an unit" (change)="setStackable($event)">
|
|
565
|
+
<mat-radio-button [checked]="true" value="false">No</mat-radio-button>
|
|
566
|
+
<mat-radio-button value="true">Yes</mat-radio-button>
|
|
567
|
+
</mat-radio-group>
|
|
568
|
+
</div>
|
|
569
|
+
</div>
|
|
570
|
+
</div>
|
|
571
|
+
|
|
364
572
|
<div class="model-preview-info-container">
|
|
365
573
|
<div class="model-preview-info-left">
|
|
366
|
-
<label>
|
|
574
|
+
<label>Height adjustable</label>
|
|
367
575
|
</div>
|
|
368
576
|
<div class="model-preview-info-right">
|
|
369
|
-
<
|
|
577
|
+
<div class="mat-radio-wrapper">
|
|
578
|
+
<mat-radio-group aria-label="Select an unit" (change)="setHeightAdjustable($event)">
|
|
579
|
+
<mat-radio-button [checked]="true" value="false">No</mat-radio-button>
|
|
580
|
+
<mat-radio-button value="true">Yes</mat-radio-button>
|
|
581
|
+
</mat-radio-group>
|
|
582
|
+
</div>
|
|
370
583
|
</div>
|
|
371
584
|
</div>
|
|
585
|
+
|
|
372
586
|
<div class="model-preview-info-container">
|
|
373
587
|
<div class="model-preview-info-left">
|
|
374
588
|
<label>Extension</label>
|
|
@@ -377,13 +591,13 @@ ModelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
|
|
|
377
591
|
<label>{{ this.data.file.fileType }}</label>
|
|
378
592
|
</div>
|
|
379
593
|
</div>
|
|
380
|
-
<button class="exportButton" (click)="exportSceneAsGLB('upload')">
|
|
594
|
+
<button class="exportButton" (click)="exportSceneAsGLB('upload')">Upload to CDN and add to scene</button>
|
|
381
595
|
<p></p>
|
|
382
|
-
<button class="exportButton" (click)="exportSceneAsGLB('download')">Download</button>
|
|
596
|
+
<button class="exportButton" (click)="exportSceneAsGLB('download')">Download model</button>
|
|
383
597
|
</div>
|
|
384
598
|
</div>
|
|
385
599
|
</div>
|
|
386
|
-
`, isInline: true, styles: [".model-preview{display:flex;flex-direction:row}.model-preview .model-preview-actions{min-width:240px;box-sizing:border-box;padding:10px 20px;border-left:1px solid #5b6875}.model-preview .model-preview-actions .model-preview-info-container{margin-bottom:10px}.model-preview .model-preview-actions .model-preview-info-container .model-preview-info-left{font-weight:bolder}.model-preview .exportButton{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px;display:flex;align-items:center}.model-preview .exportButton:hover{background:#dda73f;color:#fff}input{border:1px solid #5b6875;box-sizing:border-box;padding:3px 10px;border-radius:3px}.mat-radio-wrapper{margin:10px 0}mat-radio-group mat-radio-button{display:block}.rotation-button-container div{display:flex;justify-content:space-between;margin-bottom:10px}.rotation-button-container div button{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px}.rotation-button-container div button:hover{background:#dda73f;color:#fff}\n"], components: [{ type:
|
|
600
|
+
`, isInline: true, styles: [".model-preview{display:flex;flex-direction:row}.model-preview .model-preview-actions{min-width:240px;box-sizing:border-box;padding:10px 20px;border-left:1px solid #5b6875}.model-preview .model-preview-actions .model-preview-info-container{margin-bottom:10px}.model-preview .model-preview-actions .model-preview-info-container .model-preview-info-left{font-weight:bolder}.model-preview .exportButton{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px;display:flex;align-items:center}.model-preview .exportButton:hover{background:#dda73f;color:#fff}input{border:1px solid #5b6875;box-sizing:border-box;padding:3px 10px;border-radius:3px}.mat-radio-wrapper{margin:10px 0}mat-radio-group mat-radio-button{display:block}.rotation-button-container div{display:flex;justify-content:space-between;margin-bottom:10px}.rotation-button-container div button{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px}.rotation-button-container div button:hover{background:#dda73f;color:#fff}\n"], components: [{ type: i9.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }], directives: [{ type: i9.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
387
601
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, decorators: [{
|
|
388
602
|
type: Component,
|
|
389
603
|
args: [{
|
|
@@ -407,6 +621,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
407
621
|
</div>
|
|
408
622
|
</div>
|
|
409
623
|
|
|
624
|
+
<div>
|
|
625
|
+
<button (click)="toggleShowReferenceModel()">Show Reference model</button>
|
|
626
|
+
</div>
|
|
627
|
+
|
|
410
628
|
<div class="rotation-button-container">
|
|
411
629
|
<p>Rotation</p>
|
|
412
630
|
<div class="rotation-x-buttons">
|
|
@@ -423,6 +641,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
423
641
|
</div>
|
|
424
642
|
</div>
|
|
425
643
|
|
|
644
|
+
|
|
645
|
+
<div class="rotation-button-container">
|
|
646
|
+
<p>Positie</p>
|
|
647
|
+
<div class="rotation-x-buttons">
|
|
648
|
+
<button (click)="moveModel('x', 0.01)">x-as + 0.01</button>
|
|
649
|
+
<button (click)="moveModel('x', -0.01)">x-as -0.01</button>
|
|
650
|
+
</div>
|
|
651
|
+
<div class="rotation-y-buttons">
|
|
652
|
+
<button (click)="moveModel('y', 0.01)">y-as + 0.01</button>
|
|
653
|
+
<button (click)="moveModel('y', -0.01)">y-as - 0.01</button>
|
|
654
|
+
</div>
|
|
655
|
+
<div class="rotation-z-buttons">
|
|
656
|
+
<button (click)="moveModel('z', 0.01)">z-as + 0.01</button>
|
|
657
|
+
<button (click)="moveModel('z', -mathPi / 2)">z-as -0.01</button>
|
|
658
|
+
</div>
|
|
659
|
+
</div>
|
|
660
|
+
|
|
426
661
|
<div class="model-preview-info" *ngIf="this.data">
|
|
427
662
|
<div class="model-preview-info-container">
|
|
428
663
|
<div class="model-preview-info-left">
|
|
@@ -432,14 +667,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
432
667
|
<input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
|
|
433
668
|
</div>
|
|
434
669
|
</div>
|
|
670
|
+
|
|
435
671
|
<div class="model-preview-info-container">
|
|
436
672
|
<div class="model-preview-info-left">
|
|
437
|
-
<label>
|
|
673
|
+
<label>Stackable</label>
|
|
438
674
|
</div>
|
|
439
675
|
<div class="model-preview-info-right">
|
|
440
|
-
<
|
|
676
|
+
<div class="mat-radio-wrapper">
|
|
677
|
+
<mat-radio-group aria-label="Select an unit" (change)="setStackable($event)">
|
|
678
|
+
<mat-radio-button [checked]="true" value="false">No</mat-radio-button>
|
|
679
|
+
<mat-radio-button value="true">Yes</mat-radio-button>
|
|
680
|
+
</mat-radio-group>
|
|
681
|
+
</div>
|
|
441
682
|
</div>
|
|
442
683
|
</div>
|
|
684
|
+
|
|
685
|
+
<div class="model-preview-info-container">
|
|
686
|
+
<div class="model-preview-info-left">
|
|
687
|
+
<label>Height adjustable</label>
|
|
688
|
+
</div>
|
|
689
|
+
<div class="model-preview-info-right">
|
|
690
|
+
<div class="mat-radio-wrapper">
|
|
691
|
+
<mat-radio-group aria-label="Select an unit" (change)="setHeightAdjustable($event)">
|
|
692
|
+
<mat-radio-button [checked]="true" value="false">No</mat-radio-button>
|
|
693
|
+
<mat-radio-button value="true">Yes</mat-radio-button>
|
|
694
|
+
</mat-radio-group>
|
|
695
|
+
</div>
|
|
696
|
+
</div>
|
|
697
|
+
</div>
|
|
698
|
+
|
|
443
699
|
<div class="model-preview-info-container">
|
|
444
700
|
<div class="model-preview-info-left">
|
|
445
701
|
<label>Extension</label>
|
|
@@ -448,9 +704,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
448
704
|
<label>{{ this.data.file.fileType }}</label>
|
|
449
705
|
</div>
|
|
450
706
|
</div>
|
|
451
|
-
<button class="exportButton" (click)="exportSceneAsGLB('upload')">
|
|
707
|
+
<button class="exportButton" (click)="exportSceneAsGLB('upload')">Upload to CDN and add to scene</button>
|
|
452
708
|
<p></p>
|
|
453
|
-
<button class="exportButton" (click)="exportSceneAsGLB('download')">Download</button>
|
|
709
|
+
<button class="exportButton" (click)="exportSceneAsGLB('download')">Download model</button>
|
|
454
710
|
</div>
|
|
455
711
|
</div>
|
|
456
712
|
</div>
|
|
@@ -460,11 +716,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
460
716
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
461
717
|
type: Inject,
|
|
462
718
|
args: [MAT_DIALOG_DATA]
|
|
463
|
-
}] }, { type: i1.HomedecoratorSettingsService }, { type: i2.MatDialogRef }, { type: i3.ThirdPartyModelService }, { type: i4.MessageBusService }, { type: i2.MatDialog }, { type: i5.HomedecoratorConnectorAdapterService }]; }, propDecorators: { glbExportName: [{
|
|
719
|
+
}] }, { type: i1.HomedecoratorSettingsService }, { type: i2.MatDialogRef }, { type: i3.ThirdPartyModelService }, { type: i4.MessageBusService }, { type: i2.MatDialog }, { type: i5.HomedecoratorConnectorAdapterService }, { type: i6.LightPresetsService }, { type: i7.HomedecoratorDictionaryService }, { type: i8.FontService }]; }, propDecorators: { glbExportName: [{
|
|
464
720
|
type: ViewChild,
|
|
465
721
|
args: ['fileName']
|
|
466
722
|
}], heightArticle: [{
|
|
467
723
|
type: ViewChild,
|
|
468
724
|
args: ['heightArticle']
|
|
469
725
|
}] } });
|
|
470
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL21vZGVsLXVwbG9hZGVyL21vZGVsLXByZXZpZXdlci9tb2RlbC1wcmV2aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLE1BQU0sRUFBcUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBQyxlQUFlLEVBQTBCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEYsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLGlCQUFpQixFQUVqQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixjQUFjLEVBQ2QsVUFBVSxFQUNWLEtBQUssRUFDTCxPQUFPLEVBQ1AsYUFBYSxFQUNkLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDakUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDL0QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBRy9ELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQ0FBc0Ms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bXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZywgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1xyXG4gIEFtYmllbnRMaWdodCxcclxuICBCb3hHZW9tZXRyeSxcclxuICBEaXJlY3Rpb25hbExpZ2h0LFxyXG4gIExpZ2h0LFxyXG4gIExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG4gIE1lc2gsXHJcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsXHJcbiAgT2JqZWN0M0QsXHJcbiAgUENGU29mdFNoYWRvd01hcCxcclxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcclxuICBQbGFuZUdlb21ldHJ5LFxyXG4gIFBNUkVNR2VuZXJhdG9yLFxyXG4gIFBvaW50TGlnaHQsXHJcbiAgU2NlbmUsXHJcbiAgVmVjdG9yMyxcclxuICBXZWJHTFJlbmRlcmVyXHJcbn0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0Zsb2F0VHlwZSwgTGluZWFyVG9uZU1hcHBpbmd9IGZyb20gJ3RocmVlL3NyYy9jb25zdGFudHMnO1xyXG5pbXBvcnQge0dMVEZMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0dMVEZMb2FkZXInO1xyXG5pbXBvcnQge1JHQkVMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL1JHQkVMb2FkZXInO1xyXG5pbXBvcnQge09yYml0Q29udHJvbHN9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9jb250cm9scy9PcmJpdENvbnRyb2xzJztcclxuaW1wb3J0IHtHTFRGRXhwb3J0ZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9leHBvcnRlcnMvR0xURkV4cG9ydGVyJztcclxuaW1wb3J0IHtGQlhMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0ZCWExvYWRlcic7XHJcbmltcG9ydCB7T0JKTG9hZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9PQkpMb2FkZXInO1xyXG5pbXBvcnQge1RoaXJkUGFydHlNb2RlbFNlcnZpY2V9IGZyb20gJy4uLy4uL3RocmVlZHNlbGVjdG9yL3RocmVlZHNlbGVjdG9yL3NlcnZpY2UvdGhpcmQtcGFydHktbW9kZWwuc2VydmljZSc7XHJcbmltcG9ydCB7TWVzc2FnZUJ1c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9tZXNzYWdlLWJ1cy5zZXJ2aWNlJztcclxuaW1wb3J0IHtURFNMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL1REU0xvYWRlcic7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1jb25uZWN0b3ItYWRhcHRlci5zZXJ2aWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3JwLW1vZGVsLXByZXZpZXcnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlld1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1jb250YWluZXJcIiBpZD1cImNhbnZhc0NvbnRhaW5lclwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctYWN0aW9uc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1oZWlnaHQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cD5DZW50aW1ldGVycyBvZiBpbmNoZXM8L3A+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXJhZGlvLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIHVuaXRcIiAoY2hhbmdlKT1cInNldFVuaXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFtjaGVja2VkXT1cInRydWVcIiB2YWx1ZT1cImNtXCI+SGVpZ2h0IGluIGNtPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiaW5jaGVzXCI+SGVpZ2h0IGluIGluY2hlczwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVpZ2h0QXJ0aWNsZVwiICNoZWlnaHRBcnRpY2xlPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzY2FsZUFydGljbGUoKVwiPnNjYWxlPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxwPlJvdGF0aW9uPC9wPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLXgtYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneCcsIG1hdGhQaSAvIDIpXCI+eC1hcyArIDkwIGdyYWRlbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneCcsIC1tYXRoUGkgLyAyKVwiPngtYXMgLSA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLXktYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneScsIG1hdGhQaSAvIDIpXCI+eS1hcyArIDkwIGdyYWRlbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneScsIC1tYXRoUGkgLyAyKVwiPnktYXMgLSA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLXotYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneicsIG1hdGhQaSAvIDIpXCI+ei1hcyArIDkwIGdyYWRlbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyb3RhdGVNb2RlbCgneicsIC1tYXRoUGkgLyAyKVwiPnotYXMgLSA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvXCIgKm5nSWY9XCJ0aGlzLmRhdGFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tbGVmdFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbD5OYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImZpbGVOYW1lXCIgI2ZpbGVOYW1lIHZhbHVlPVwie3sgdGhpcy5kYXRhLmZpbGUuZmlsZS5uYW1lIH19XCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWxlZnRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWw+U2l6ZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsPnt7IHRoaXMuZGF0YS5maWxlLmZpbGUuc2l6ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLWxlZnRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWw+RXh0ZW5zaW9uPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWw+e3sgdGhpcy5kYXRhLmZpbGUuZmlsZVR5cGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImV4cG9ydEJ1dHRvblwiIChjbGljayk9XCJleHBvcnRTY2VuZUFzR0xCKCd1cGxvYWQnKVwiPkFkZCB0byBzY2VuZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImV4cG9ydEJ1dHRvblwiIChjbGljayk9XCJleHBvcnRTY2VuZUFzR0xCKCdkb3dubG9hZCcpXCI+RG93bmxvYWQ8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlVXJsczogWycuL21vZGVsLXByZXZpZXcuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTW9kZWxQcmV2aWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHB1YmxpYyBzY2VuZVByZXZpZXc6IFRIUkVFLlNjZW5lO1xyXG4gIHB1YmxpYyBjYW1lcmFQcmV2aWV3OiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYTtcclxuICBwdWJsaWMgcmVuZGVyZXJQcmV2aWV3OiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xyXG4gIHB1YmxpYyBjb250cm9sczogT3JiaXRDb250cm9scztcclxuICBwdWJsaWMgYm91bmRpbmdCb3hTaXplOiBWZWN0b3IzO1xyXG4gIHB1YmxpYyBsb2FkZWRNb2RlbDogYW55O1xyXG4gIHB1YmxpYyB1bml0c09mTWVhc3VyZW1lbnQ6IHN0cmluZyA9ICdjbSc7XHJcbiAgcHVibGljIG1vZGVsTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyBtYXRoUGk6IG51bWJlciA9IE1hdGguUEk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVOYW1lJykgcHVibGljIGdsYkV4cG9ydE5hbWU6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnaGVpZ2h0QXJ0aWNsZScpIHB1YmxpYyBoZWlnaHRBcnRpY2xlOiBFbGVtZW50UmVmO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogeyBmaWxlOiBhbnkgfSxcclxuICAgIHB1YmxpYyBzZXR0aW5nc1NlcnZpY2U6IEhvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxNb2RlbFByZXZpZXdDb21wb25lbnQ+LFxyXG4gICAgcHJpdmF0ZSBfdGhpcmRQYXJ0eU1vZGVsU2VydmljZTogVGhpcmRQYXJ0eU1vZGVsU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBfYWRhcHRlclNlcnZpY2U6IEhvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZSxcclxuICApIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0U2NlbmUoKTtcclxuICAgIHRoaXMubG9hZE1vZGVsKHRoaXMuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdFNjZW5lKCk6IHZvaWQge1xyXG4gICAgLy8gaW5pdCBzY2VuZVxyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcgPSBuZXcgU2NlbmUoKTtcclxuICAgIC8vIGluaXQgcmVuZGVyZXJcclxuICAgIGNvbnN0IGNhbnZSZWZlcmVuY2U6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbnZhc0NvbnRhaW5lcicpO1xyXG4gICAgY29uc3QgY2FudmFzRWxlbWVudDogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNvbnN0IGNvbnRleHQ6IGFueSA9IGNhbnZhc0VsZW1lbnQuZ2V0Q29udGV4dCgnd2ViZ2wyJywge2FudGlhbGlhczogdHJ1ZX0pO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcgPSBuZXcgV2ViR0xSZW5kZXJlcih7XHJcbiAgICAgIGNhbnZhczogY2FudmFzRWxlbWVudCxcclxuICAgICAgY29udGV4dDogY29udGV4dCxcclxuICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgIGFudGlhbGlhczogdHJ1ZSxcclxuICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLFxyXG4gICAgICBsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnNldFBpeGVsUmF0aW8od2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcuc2V0Q2xlYXJDb2xvcigweGZhZmFmYSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5hdXRvQ2xlYXIgPSBmYWxzZTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1hcHBpbmc7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zaGFkb3dNYXAuZW5hYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zaGFkb3dNYXAudHlwZSA9IFBDRlNvZnRTaGFkb3dNYXA7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5vdXRwdXRDb2xvclNwYWNlID0gTGluZWFyU1JHQkNvbG9yU3BhY2U7XHJcbiAgICBjYW52UmVmZXJlbmNlLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyZXJQcmV2aWV3LmRvbUVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcuZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3RocmVlZCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcuc2V0U2l6ZSh3aW5kb3cuaW5uZXJXaWR0aCAvIDIsIHdpbmRvdy5pbm5lckhlaWdodCAvIDIsIHRydWUpO1xyXG5cclxuICAgIC8vIGluaXQgY2FtZXJhXHJcbiAgICB0aGlzLmNhbWVyYVByZXZpZXcgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoNDUsIDEsIDAuMDEsIDEwMDAwKTtcclxuICAgIHRoaXMuY2FtZXJhUHJldmlldy5wb3NpdGlvbi5zZXQoMCwgMiwgMTApO1xyXG4gICAgdGhpcy5jYW1lcmFQcmV2aWV3LmFzcGVjdCA9IHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgdGhpcy5jYW1lcmFQcmV2aWV3LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHModGhpcy5jYW1lcmFQcmV2aWV3LCB0aGlzLnJlbmRlcmVyUHJldmlldy5kb21FbGVtZW50KTtcclxuICAgIHRoaXMuY29udHJvbHMudXBkYXRlKCk7XHJcblxyXG4gICAgY29uc3QgYm94MWdlbyA9IG5ldyBCb3hHZW9tZXRyeSgxLCAxLCAxKTtcclxuICAgIGNvbnN0IGJveDEgPSBuZXcgTWVzaChib3gxZ2VvLCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOiAweDAwMDBmZn0pKTtcclxuICAgIGJveDEucG9zaXRpb24uc2V0KDMsIDAuNSwgMyk7XHJcbiAgICBib3gxLmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgYm94MS5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcclxuICAgIGJveDEubmFtZSA9ICdSZWZlcmVuY2VfbW9kZWwnO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcuYWRkKGJveDEpO1xyXG5cclxuICAgIGNvbnN0IHBsYW5lR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnkgPSBuZXcgUGxhbmVHZW9tZXRyeSgxMCwgMTApO1xyXG4gICAgY29uc3QgcGxhbmVNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOiAweEZBRjlGNiwgc2lkZTogVEhSRUUuRG91YmxlU2lkZX0pO1xyXG4gICAgY29uc3QgcGxhbmUgPSBuZXcgTWVzaChwbGFuZUdlb21ldHJ5LCBwbGFuZU1hdGVyaWFsKTtcclxuICAgIHBsYW5lLnJvdGF0aW9uLnggPSAtTWF0aC5QSSAvIDI7XHJcbiAgICBwbGFuZS5wb3NpdGlvbi55ID0gMDtcclxuICAgIHBsYW5lLm5hbWUgPSAnZmxvb3JfcGxhbmUnO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcuYWRkKHBsYW5lKTtcclxuXHJcbiAgICAvLyBBZGQgc29tZSBiYXNpYyBsaWdodHMgZm9yIHdoZW4gbW9kZWxzIGNvbnRhaW5zIE1lc2hMYW1iZXJ0TWF0ZXJpYWxcclxuICAgIGNvbnN0IGFtYmllbnRMaWdodCA9IG5ldyBBbWJpZW50TGlnaHQoMHg0MDQwNDApO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcuYWRkKGFtYmllbnRMaWdodCk7XHJcblxyXG4gICAgY29uc3QgZGlyZWN0aW9uYWxMaWdodCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCA4KTtcclxuICAgIGRpcmVjdGlvbmFsTGlnaHQucG9zaXRpb24uc2V0KDAsIDEwLCAwKTtcclxuICAgIGRpcmVjdGlvbmFsTGlnaHQuY2FzdFNoYWRvdyA9IHRydWU7XHJcbiAgICB0aGlzLnNjZW5lUHJldmlldy5hZGQoZGlyZWN0aW9uYWxMaWdodCk7XHJcblxyXG4gICAgY29uc3QgcG9pbnRMaWdodCA9IG5ldyBQb2ludExpZ2h0KDB4ZmZmZmZmLCAxLCAxMDApO1xyXG4gICAgcG9pbnRMaWdodC5wb3NpdGlvbi5zZXQoMCwgNSwgNSk7XHJcbiAgICB0aGlzLnNjZW5lUHJldmlldy5hZGQocG9pbnRMaWdodCk7XHJcblxyXG4gICAgLy8gYmFzaWMgaGRyaSBsaWdodGluZ1xyXG4gICAgY29uc3QgaGRyaVBhdGg6IHN0cmluZyA9ICcvYXNzZXRzL2hkcmkvc3RkX2Vudl92Ml9BLmhkcic7XHJcbiAgICB0aGlzLmxvYWRIRFJJKGhkcmlQYXRoKS50aGVuKCgpOiB2b2lkID0+IHtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ0hEUkkgbG9hZGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIEhEUkk6JywgZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9hbmltYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZE1vZGVsKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWxOYW1lID0gdGhpcy5fc2V0TW9kZWxOYW1lKGlucHV0LmZpbGUuZmlsZS5uYW1lKTtcclxuICAgIGNvbnN0IGZpbGVUeXBlID0gaW5wdXQuZmlsZS5maWxlVHlwZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGZpbGVUeXBlID09PSAnZ2xiJyB8fCBmaWxlVHlwZSA9PT0gJ2dsdGYnKSB7XHJcbiAgICAgIHRoaXMuX2dsYkxvYWRlcihpbnB1dCk7XHJcbiAgICB9IGVsc2UgaWYgKGZpbGVUeXBlID09PSAnZmJ4Jykge1xyXG4gICAgICB0aGlzLl9mYnhMb2FkZXIoaW5wdXQpO1xyXG4gICAgfSBlbHNlIGlmIChmaWxlVHlwZSA9PT0gJ29iaicpIHtcclxuICAgICAgdGhpcy5fb2JqTG9hZGVyKGlucHV0KTtcclxuICAgIH0gZWxzZSBpZiAoZmlsZVR5cGUgPT09ICczZHMnKSB7XHJcbiAgICAgIHRoaXMuX3Rkc0xvYWRlcihpbnB1dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZEhEUkkocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBuZXcgUkdCRUxvYWRlcigpLnNldERhdGFUeXBlKEZsb2F0VHlwZSkubG9hZChwYXRoLCAoaGRyVGV4dHVyZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBtcmVtR2VuZXJhdG9yOiBQTVJFTUdlbmVyYXRvciA9IG5ldyBQTVJFTUdlbmVyYXRvcih0aGlzLnJlbmRlcmVyUHJldmlldyk7XHJcbiAgICAgICAgcG1yZW1HZW5lcmF0b3IuY29tcGlsZUVxdWlyZWN0YW5ndWxhclNoYWRlcigpO1xyXG4gICAgICAgIGNvbnN0IGhkckN1YmVSZW5kZXJUYXJnZXQgPSBwbXJlbUdlbmVyYXRvci5mcm9tRXF1aXJlY3Rhbmd1bGFyKGhkclRleHR1cmUpO1xyXG4gICAgICAgIGhkclRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIHRoaXMuc2NlbmVQcmV2aWV3LmVudmlyb25tZW50ID0gaGRyQ3ViZVJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG4gICAgICAgIC8vIHRoaXMuc2NlbmVQcmV2aWV3LmJhY2tncm91bmQgPSBoZHJDdWJlUmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcbiAgICAgICAgcG1yZW1HZW5lcmF0b3IuZGlzcG9zZSgpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSwgdW5kZWZpbmVkLCByZWplY3QpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGV4cG9ydFNjZW5lQXNHTEIocmV0dXJuVHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBhZGQgdGltZXN0YW1wXHJcbiAgICBjb25zdCB0aW1lc3RhbXA6IG51bWJlciA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgZXhwb3J0RmlsZU5hbWU6IHN0cmluZyA9IHRoaXMuX3NldE1vZGVsTmFtZSh0aGlzLmdsYkV4cG9ydE5hbWUubmF0aXZlRWxlbWVudC52YWx1ZSkgKyAnXycgKyB0aW1lc3RhbXA7XHJcbiAgICBjb25zdCBlbGVtZW50c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFsnUmVmZXJlbmNlX21vZGVsJywgJ2Zsb29yX3BsYW5lJ107XHJcbiAgICBjb25zdCBnbHRmRXhwb3J0ZXI6IEdMVEZFeHBvcnRlciA9IG5ldyBHTFRGRXhwb3J0ZXIoKTtcclxuICAgIGxldCBzY2VuZTogU2NlbmU7XHJcbiAgICBzY2VuZSA9IHRoaXMuc2NlbmVQcmV2aWV3LmNsb25lKCk7XHJcbiAgICBzY2VuZS5lbnZpcm9ubWVudC5kaXNwb3NlKCk7XHJcbiAgICBzY2VuZS5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICBpZiAoYyBpbnN0YW5jZW9mIExpZ2h0KSB7XHJcbiAgICAgICAgc2NlbmUucmVtb3ZlKGMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGVsZW1lbnRzVG9SZW1vdmUuZm9yRWFjaChlbGVtZW50TmFtZSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0OiBPYmplY3QzRCA9IHNjZW5lLmdldE9iamVjdEJ5TmFtZShlbGVtZW50TmFtZSk7XHJcbiAgICAgIHNjZW5lLnJlbW92ZShzZWxlY3RlZE9iamVjdCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIHRyczogZmFsc2UsXHJcbiAgICAgIG9ubHlWaXNpYmxlOiB0cnVlLFxyXG4gICAgICB0cnVuY2F0ZURyYXdSYW5nZTogdHJ1ZSxcclxuICAgICAgYmluYXJ5OiB0cnVlLFxyXG4gICAgICBtYXhUZXh0dXJlU2l6ZTogSW5maW5pdHlcclxuICAgIH07XHJcbiAgICBnbHRmRXhwb3J0ZXIucGFyc2Uoc2NlbmUsIChyZXN1bHQ6IEFycmF5QnVmZmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGU6IEJsb2IgPSBuZXcgQmxvYihbcmVzdWx0XSwge3R5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfSk7XHJcbiAgICAgIGlmIChyZXR1cm5UeXBlID09PSAndXBsb2FkJykge1xyXG4gICAgICAgIHRoaXMuX3NlbmRNb2RlbFRvQ0ROKGAke2V4cG9ydEZpbGVOYW1lfS5nbGJgLCBmaWxlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9kb3dubG9hZE1vZGVsKGAke2V4cG9ydEZpbGVOYW1lfS5nbGJgLCBmaWxlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0sICgpID0+IHtcclxuICAgIH0sIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjYWxlQXJ0aWNsZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGhpcy5oZWlnaHRBcnRpY2xlLm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICBsZXQgaGVpZ2h0SW5NZXRlcjogbnVtYmVyO1xyXG4gICAgaWYgKHRoaXMudW5pdHNPZk1lYXN1cmVtZW50ID09PSAnY20nKSB7XHJcbiAgICAgIGhlaWdodEluTWV0ZXIgPSBpbnB1dEhlaWdodCAvIDEwMDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51bml0c09mTWVhc3VyZW1lbnQgPT09ICdpbmNoZXMnKSB7XHJcbiAgICAgIGhlaWdodEluTWV0ZXIgPSAoaW5wdXRIZWlnaHQgKiAyLjU0KSAvIDEwMDtcclxuICAgIH1cclxuICAgIC8vIHNjYWxlID0gdGhpcy5ib3VuZGluZyAvIGhlaWdodEluTWV0ZXIgYW5kIHVzZSBZIGFzIHVwLyBoZWlnaHRcclxuICAgIGNvbnN0IHNjYWxlOiBudW1iZXIgPSB0aGlzLmJvdW5kaW5nQm94U2l6ZS55IC8gaGVpZ2h0SW5NZXRlcjtcclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmdldE9iamVjdEJ5TmFtZSh0aGlzLm1vZGVsTmFtZSkuc2NhbGUuc2V0KFxyXG4gICAgICB0aGlzLnNjZW5lUHJldmlldy5jaGlsZHJlblswXS5zY2FsZS54IC8gc2NhbGUsXHJcbiAgICAgIHRoaXMuc2NlbmVQcmV2aWV3LmNoaWxkcmVuWzBdLnNjYWxlLnkgLyBzY2FsZSxcclxuICAgICAgdGhpcy5zY2VuZVByZXZpZXcuY2hpbGRyZW5bMF0uc2NhbGUueiAvIHNjYWxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3RhdGVNb2RlbChheGlzOiBzdHJpbmcsIGRlZ3JlZXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnNjZW5lUHJldmlldy5nZXRPYmplY3RCeU5hbWUodGhpcy5tb2RlbE5hbWUpO1xyXG4gICAgaWYgKGF4aXMgPT09ICd4Jykge1xyXG4gICAgICBtb2RlbC5yb3RhdGlvbi54ICs9IGRlZ3JlZXM7XHJcbiAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd5Jykge1xyXG4gICAgICBtb2RlbC5yb3RhdGlvbi55ICs9IGRlZ3JlZXM7XHJcbiAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd6Jykge1xyXG4gICAgICBtb2RlbC5yb3RhdGlvbi56ICs9IGRlZ3JlZXM7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChtb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VW5pdChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnVuaXRzT2ZNZWFzdXJlbWVudCA9IGV2ZW50LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYW5pbWF0ZSgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zZXRBbmltYXRpb25Mb29wKCh0aW1lc3RhbXAsIGZyYW1lKSA9PiB0aGlzLl9yZW5kZXIodGltZXN0YW1wLCBmcmFtZSkpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlbmRlcih0LCBmcmFtZSkge1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcucmVuZGVyKHRoaXMuc2NlbmVQcmV2aWV3LCB0aGlzLmNhbWVyYVByZXZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZG93bmxvYWRNb2RlbChmaWxlTmFtZTogc3RyaW5nLCBibG9iOiBCbG9iKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIGVsZW1lbnQuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBlbGVtZW50LmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgZWxlbWVudC5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRNb2RlbFRvQ0ROKGZpbGVOYW1lOiBzdHJpbmcsIGJsb2I6IEJsb2IpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICB0aGlzLl9ibG9iVG9BcnJheUJ1ZmZlcihibG9iKS50aGVuKGZpbGUgPT4ge1xyXG4gICAgICB0aGlzLl9hZGFwdGVyU2VydmljZS5zdG9yZTNETW9kZWxDRE4oZmlsZU5hbWUsIGZpbGUpLnRoZW4oZmlsZVBhdGggPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGZpbGVQYXRoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLy8gY29uc3QgaGFzaDogc3RyaW5nID0gZmlsZU5hbWU7XHJcbiAgICAvLyBjb25zdCBtb2RlbFVybDogc3RyaW5nID0gJyc7IC8vIFNldCB1cmwgZnJvbSB0aGUgQ0ROXHJcbiAgICAvLyBjb25zdCBjb25maWd1cmF0aW9uRGF0YTogYW55ID0ge307XHJcbiAgICAvLyBjb25zdCBwcmljZURhdGE6IGFueSA9IHt9O1xyXG4gICAgLy8gLy8gY29uc3QgbWV0YURhdGE6IE1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7XHJcbiAgICAvLyAvLyBXZSBhbHNvIGNhbiBzZXQgdGhlIG1ldGFkYXRhIGhlcmUgYW5kIHBhcyBpdCBhcyB0aGUgbGFzdCBhcmd1bWVudCBmb3IgcGFyc2VNb2RlbFRvR0xCLlxyXG4gICAgLy9cclxuICAgIC8vIGF3YWl0IHRoaXMuX3RoaXJkUGFydHlNb2RlbFNlcnZpY2UucGFyc2VNb2RlbFRvR0xCKGZpbGUsIGhhc2gsIG1vZGVsVXJsLCBjb25maWd1cmF0aW9uRGF0YSwgcHJpY2VEYXRhKTtcclxuICAgIC8vIHRoaXMuX2RpYWxvZy5jbG9zZUFsbCgpO1xyXG4gICAgLy8gdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2cpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0TW9kZWxOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByZW1vdmVFeHRlbnNpb246IHN0cmluZyA9IG5hbWUucmVwbGFjZSgnLmdsYicsICcnKTsgLy8gcmVtb3ZlIC5nbGIgYXMgZmlsZSBleHRlbnNpb25cclxuICAgIHJldHVybiByZW1vdmVFeHRlbnNpb24ucmVwbGFjZSgnLicsICctJyk7IC8vIHJlcGxhY2UgYWxsIGRvdHMgZm9yIHBlcmlvZHNcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dsYkxvYWRlcihpbnB1dDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBsb2FkZXI6IEdMVEZMb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xyXG4gICAgbG9hZGVyLnBhcnNlKGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzLCAnJyxcclxuICAgICAgYXN5bmMgb2JqZWN0ID0+IHtcclxuICAgICAgICBvYmplY3Quc2NlbmUubmFtZSA9IHRoaXMubW9kZWxOYW1lO1xyXG4gICAgICAgIG9iamVjdC5zY2VuZS5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgb2JqZWN0LnNjZW5lLnNjYWxlLnNldCgxLCAxLCAxKTtcclxuICAgICAgICB0aGlzLnNjZW5lUHJldmlldy5hZGQob2JqZWN0LnNjZW5lKTtcclxuICAgICAgICB0aGlzLmxvYWRlZE1vZGVsID0gb2JqZWN0LnNjZW5lO1xyXG4gICAgICAgIHRoaXMuX2dldEJvdW5kaW5nQm94KG9iamVjdC5zY2VuZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnUGFyc2luZyBlcnJvcicpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmJ4TG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZieExvYWRlcjogRkJYTG9hZGVyID0gbmV3IEZCWExvYWRlcigpO1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gZmJ4TG9hZGVyLnBhcnNlKGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzLCAnJyk7XHJcbiAgICBvYmplY3QubmFtZSA9IHRoaXMubW9kZWxOYW1lO1xyXG4gICAgb2JqZWN0LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIG9iamVjdC5zY2FsZS5zZXQoMSwgMSwgMSk7XHJcbiAgICB0aGlzLnNjZW5lUHJldmlldy5hZGQob2JqZWN0KTtcclxuICAgIHRoaXMubG9hZGVkTW9kZWwgPSBvYmplY3Q7XHJcbiAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb2JqTG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9iakxvYWRlcjogT0JKTG9hZGVyID0gbmV3IE9CSkxvYWRlcigpO1xyXG4gICAgLy8gZm9yIG9qYiBmaWxlczogY29udmVydCB0aGUgQXJyYXlCdWZmZXIgdG8gYSBzdHJpbmdcclxuICAgIGNvbnN0IGJ1ZiA9IGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzO1xyXG4gICAgY29uc3QgZGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICAgIGNvbnN0IHN0cjogc3RyaW5nID0gZGVjb2Rlci5kZWNvZGUoYnVmKTtcclxuICAgIGNvbnN0IG9iamVjdCA9IG9iakxvYWRlci5wYXJzZShzdHIpO1xyXG4gICAgb2JqZWN0Lm5hbWUgPSB0aGlzLm1vZGVsTmFtZTtcclxuICAgIG9iamVjdC5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICBvYmplY3Quc2NhbGUuc2V0KDEsIDEsIDEpO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcuYWRkKG9iamVjdCk7XHJcbiAgICB0aGlzLmxvYWRlZE1vZGVsID0gb2JqZWN0O1xyXG4gICAgdGhpcy5fZ2V0Qm91bmRpbmdCb3gob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Rkc0xvYWRlcihpbnB1dDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCB0ZHNMb2FkZXI6IFREU0xvYWRlciA9IG5ldyBURFNMb2FkZXIoKTtcclxuICAgIGNvbnN0IG9iamVjdCA9IHRkc0xvYWRlci5wYXJzZShpbnB1dC5maWxlLmZpbGVDb250ZW50cywgJycpO1xyXG4gICAgb2JqZWN0Lm5hbWUgPSB0aGlzLm1vZGVsTmFtZTtcclxuICAgIG9iamVjdC5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICBvYmplY3Quc2NhbGUuc2V0KDEsIDEsIDEpO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcuYWRkKG9iamVjdCk7XHJcbiAgICB0aGlzLmxvYWRlZE1vZGVsID0gb2JqZWN0O1xyXG4gICAgdGhpcy5fZ2V0Qm91bmRpbmdCb3gob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEJvdW5kaW5nQm94KG9iamVjdCkge1xyXG4gICAgY29uc3QgYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcclxuICAgIHRoaXMuYm91bmRpbmdCb3hTaXplID0gYm91bmRpbmdCb3guZ2V0U2l6ZShuZXcgVmVjdG9yMygpKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIF9ibG9iVG9BcnJheUJ1ZmZlcihibG9iOiBCbG9iKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBpZiAocmVhZGVyLnJlc3VsdCkge1xyXG4gICAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIEFycmF5QnVmZmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRXJyb3IgcmVhZGluZyBibG9iIGFzIEFycmF5QnVmZmVyJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgYmxvYiBhcyBBcnJheUJ1ZmZlcicpKTtcclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
|
|
726
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL21vZGVsLXVwbG9hZGVyL21vZGVsLXByZXZpZXdlci9tb2RlbC1wcmV2aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLE1BQU0sRUFBcUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBQyxlQUFlLEVBQTBCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEYsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUNMLElBQUksRUFDSixLQUFLLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixpQkFBaUIsRUFFakIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsY0FBYyxFQUNkLEtBQUssRUFDTCxPQUFPLEVBQ1AsYUFBYSxFQUNkLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDakUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDL0QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBRy9ELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQ0FBc0Ms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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0R1Q7NEZBR1UscUJBQXFCO2tCQWpIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRHVDtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQztpQkFDOUM7OzBCQTRCSSxNQUFNOzJCQUFDLGVBQWU7MldBMUJLLGFBQWE7c0JBQTFDLFNBQVM7dUJBQUMsVUFBVTtnQkFDYyxhQUFhO3NCQUEvQyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZywgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1xyXG4gIEJveDMsXHJcbiAgQ29sb3IsXHJcbiAgR3JpZEhlbHBlcixcclxuICBMaWdodCxcclxuICBMaW5lYXJTUkdCQ29sb3JTcGFjZSxcclxuICBNZXNoLFxyXG4gIE1lc2hCYXNpY01hdGVyaWFsLFxyXG4gIE1lc2hQaG9uZ01hdGVyaWFsLFxyXG4gIE9iamVjdDNELFxyXG4gIFBDRlNvZnRTaGFkb3dNYXAsXHJcbiAgUGVyc3BlY3RpdmVDYW1lcmEsXHJcbiAgUGxhbmVHZW9tZXRyeSxcclxuICBQTVJFTUdlbmVyYXRvcixcclxuICBTY2VuZSxcclxuICBWZWN0b3IzLFxyXG4gIFdlYkdMUmVuZGVyZXJcclxufSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7RmxvYXRUeXBlLCBMaW5lYXJUb25lTWFwcGluZ30gZnJvbSAndGhyZWUvc3JjL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7R0xURkxvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvR0xURkxvYWRlcic7XHJcbmltcG9ydCB7UkdCRUxvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvUkdCRUxvYWRlcic7XHJcbmltcG9ydCB7T3JiaXRDb250cm9sc30gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2NvbnRyb2xzL09yYml0Q29udHJvbHMnO1xyXG5pbXBvcnQge0dMVEZFeHBvcnRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9HTFRGRXhwb3J0ZXInO1xyXG5pbXBvcnQge0ZCWExvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvRkJYTG9hZGVyJztcclxuaW1wb3J0IHtPQkpMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XHJcbmltcG9ydCB7VGhpcmRQYXJ0eU1vZGVsU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS90aGlyZC1wYXJ0eS1tb2RlbC5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQnVzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL21lc3NhZ2UtYnVzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1REU0xvYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvVERTTG9hZGVyJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VUeXBlfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vbWVzc2FnZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge0xpZ2h0UHJlc2V0c1NlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2xpZ2h0LXByZXNldHMuc2VydmljZSc7XHJcbmltcG9ydCB7TGlnaHRQcm9wZXJ0aWVzfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVsL2xpZ2h0LXByb3BlcnRpZXMnO1xyXG5pbXBvcnQge0xpZ2h0RW51bX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL2xpZ2h0LmVudW0nO1xyXG5pbXBvcnQge0xpZ2h0Q3JlYXRlU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS9saWdodC1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtMaWdodFByZXNldH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9saWdodC1wcmVzZXQnO1xyXG5pbXBvcnQge0ZpbGVVdGlsc30gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9maWxlLnV0aWxzJztcclxuaW1wb3J0IHtTVExMb2FkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL1NUTExvYWRlcic7XHJcbmltcG9ydCB7Qm94TWVhc3VyZW1lbnR9IGZyb20gJy4uLy4uL2NvcmUzZC9odWQvYm91bmRpbmctbWVhc3VyZW1lbnQtYm94L2JveC1tZWFzdXJlbWVudCc7XHJcbmltcG9ydCB7XHJcbiAgTWVhc3VyZW1lbnRVdGlscyxcclxuICBwb3NpdGlvbmluZ0ZhY3RvcnMsXHJcbiAgeERpcmVjdGlvbixcclxuICB5RGlyZWN0aW9uLFxyXG4gIHpEaXJlY3Rpb25cclxufSBmcm9tICcuLi8uLi9jb3JlM2QvaHVkL2JvdW5kaW5nLW1lYXN1cmVtZW50LWJveC9tZWFzdXJlbWVudC11dGlscyc7XHJcbmltcG9ydCB7bWFrZVRleHRNZXNofSBmcm9tICcuLi8uLi9jb3JlM2QvaHVkL3V0aWxzJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yRGljdGlvbmFyeVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWRpY3Rpb25hcnkuc2VydmljZSc7XHJcbmltcG9ydCB7Rm9udFNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2ZvbnQuc2VydmljZSc7XHJcbmltcG9ydCB7Rm9udH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvRm9udExvYWRlcic7XHJcbmltcG9ydCB7TWV0YWRhdGF9IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9tZXRhZGF0YSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdycC1tb2RlbC1wcmV2aWV3JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctY29udGFpbmVyXCIgaWQ9XCJjYW52YXNDb250YWluZXJcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWFjdGlvbnNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtaGVpZ2h0LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHA+Q2VudGltZXRlcnMgb2YgaW5jaGVzPC9wPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1yYWRpby13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiB1bml0XCIgKGNoYW5nZSk9XCJzZXRVbml0KCRldmVudClcIj5cclxuICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbY2hlY2tlZF09XCJ0cnVlXCIgdmFsdWU9XCJjbVwiPkhlaWdodCBpbiBjbTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImluY2hlc1wiPkhlaWdodCBpbiBpbmNoZXM8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlaWdodEFydGljbGVcIiAjaGVpZ2h0QXJ0aWNsZT5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2NhbGVBcnRpY2xlKClcIj5zY2FsZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVTaG93UmVmZXJlbmNlTW9kZWwoKVwiPlNob3cgUmVmZXJlbmNlIG1vZGVsPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3RhdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cD5Sb3RhdGlvbjwvcD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3RhdGlvbi14LWJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicm90YXRlTW9kZWwoJ3gnLCBtYXRoUGkgLyAyKVwiPngtYXMgKyA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicm90YXRlTW9kZWwoJ3gnLCAtbWF0aFBpIC8gMilcIj54LWFzIC0gOTAgZ3JhZGVuPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3RhdGlvbi15LWJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicm90YXRlTW9kZWwoJ3knLCBtYXRoUGkgLyAyKVwiPnktYXMgKyA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicm90YXRlTW9kZWwoJ3knLCAtbWF0aFBpIC8gMilcIj55LWFzIC0gOTAgZ3JhZGVuPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3RhdGlvbi16LWJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicm90YXRlTW9kZWwoJ3onLCBtYXRoUGkgLyAyKVwiPnotYXMgKyA5MCBncmFkZW48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicm90YXRlTW9kZWwoJ3onLCAtbWF0aFBpIC8gMilcIj56LWFzIC0gOTAgZ3JhZGVuPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3RhdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cD5Qb3NpdGllPC9wPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdGF0aW9uLXgtYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJtb3ZlTW9kZWwoJ3gnLCAgMC4wMSlcIj54LWFzICsgMC4wMTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJtb3ZlTW9kZWwoJ3gnLCAtMC4wMSlcIj54LWFzIC0wLjAxPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3RhdGlvbi15LWJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW92ZU1vZGVsKCd5JywgMC4wMSlcIj55LWFzICsgMC4wMTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJtb3ZlTW9kZWwoJ3knLCAtMC4wMSlcIj55LWFzIC0gMC4wMTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm90YXRpb24tei1idXR0b25zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm1vdmVNb2RlbCgneicsICAwLjAxKVwiPnotYXMgKyAwLjAxPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm1vdmVNb2RlbCgneicsIC1tYXRoUGkgLyAyKVwiPnotYXMgLTAuMDE8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvXCIgKm5nSWY9XCJ0aGlzLmRhdGFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tbGVmdFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbD5OYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImZpbGVOYW1lXCIgI2ZpbGVOYW1lIHZhbHVlPVwie3sgdGhpcy5kYXRhLmZpbGUuZmlsZS5uYW1lIH19XCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsPlN0YWNrYWJsZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1yYWRpby13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGFyaWEtbGFiZWw9XCJTZWxlY3QgYW4gdW5pdFwiIChjaGFuZ2UpPVwic2V0U3RhY2thYmxlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW2NoZWNrZWRdPVwidHJ1ZVwiIHZhbHVlPVwiZmFsc2VcIj5ObzwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJ0cnVlXCI+WWVzPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsPkhlaWdodCBhZGp1c3RhYmxlPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlbC1wcmV2aWV3LWluZm8tcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXJhZGlvLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiB1bml0XCIgKGNoYW5nZSk9XCJzZXRIZWlnaHRBZGp1c3RhYmxlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW2NoZWNrZWRdPVwidHJ1ZVwiIHZhbHVlPVwiZmFsc2VcIj5ObzwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJ0cnVlXCI+WWVzPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVsLXByZXZpZXctaW5mby1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsPkV4dGVuc2lvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZWwtcHJldmlldy1pbmZvLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsPnt7IHRoaXMuZGF0YS5maWxlLmZpbGVUeXBlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJleHBvcnRCdXR0b25cIiAoY2xpY2spPVwiZXhwb3J0U2NlbmVBc0dMQigndXBsb2FkJylcIj5VcGxvYWQgdG8gQ0ROIGFuZCBhZGQgdG8gc2NlbmU8L2J1dHRvbj5cclxuICAgICAgICAgIDxwPjwvcD5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJleHBvcnRCdXR0b25cIiAoY2xpY2spPVwiZXhwb3J0U2NlbmVBc0dMQignZG93bmxvYWQnKVwiPkRvd25sb2FkIG1vZGVsPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZVVybHM6IFsnLi9tb2RlbC1wcmV2aWV3LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE1vZGVsUHJldmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmaWxlTmFtZScpIHB1YmxpYyBnbGJFeHBvcnROYW1lOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2hlaWdodEFydGljbGUnKSBwdWJsaWMgaGVpZ2h0QXJ0aWNsZTogRWxlbWVudFJlZjtcclxuXHJcbiAgcHVibGljIHNjZW5lUHJldmlldzogVEhSRUUuU2NlbmU7XHJcbiAgcHVibGljIGNhbWVyYVByZXZpZXc6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gIHB1YmxpYyByZW5kZXJlclByZXZpZXc6IFRIUkVFLldlYkdMUmVuZGVyZXI7XHJcbiAgcHVibGljIGNvbnRyb2xzOiBPcmJpdENvbnRyb2xzO1xyXG4gIHB1YmxpYyBib3VuZGluZ0JveFNpemU6IFZlY3RvcjM7XHJcbiAgcHVibGljIGxvYWRlZE1vZGVsOiBhbnk7XHJcbiAgcHVibGljIHVuaXRzT2ZNZWFzdXJlbWVudDogc3RyaW5nID0gJ2NtJztcclxuICBwdWJsaWMgbW9kZWxOYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIG1hdGhQaTogbnVtYmVyID0gTWF0aC5QSTtcclxuICBwdWJsaWMgc2hvd1JlZmVyZW5jZU1vZGVsOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgZmxvb3JTaXplSGVpZ2h0OiBudW1iZXIgPSAxMDtcclxuICBwdWJsaWMgZmxvb3JTaXplV2lkdGg6IG51bWJlciA9IDEwO1xyXG4gIHB1YmxpYyBncmlkU2l6ZTogbnVtYmVyID0gMTA7XHJcbiAgcHVibGljIGdyaWREaXZpc2lvbjogbnVtYmVyID0gMTA7XHJcbiAgcHVibGljIGRpc3RhbmNlU3RlcDogbnVtYmVyID0gMTtcclxuICBwdWJsaWMgZm9udDogRm9udDtcclxuXHJcbiAgcHVibGljIHN0YWNrYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBoZWlnaHRBZGp1c3RhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX21lYXN1cmVtZW50czogQm94TWVhc3VyZW1lbnRbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogeyBmaWxlOiBhbnkgfSxcclxuICAgIHB1YmxpYyBzZXR0aW5nc1NlcnZpY2U6IEhvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxNb2RlbFByZXZpZXdDb21wb25lbnQ+LFxyXG4gICAgcHJpdmF0ZSBfdGhpcmRQYXJ0eU1vZGVsU2VydmljZTogVGhpcmRQYXJ0eU1vZGVsU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBfYWRhcHRlclNlcnZpY2U6IEhvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xpZ2h0UHJlc2V0c1NlcnZpY2U6IExpZ2h0UHJlc2V0c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWN0aW9uYXJ5U2VydmljZTogSG9tZWRlY29yYXRvckRpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZm9udFNlcnZpY2U6IEZvbnRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmZvbnQgPSB0aGlzLl9mb250U2VydmljZS5odWRGb250O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRTY2VuZSgpO1xyXG4gICAgdGhpcy5sb2FkTW9kZWwodGhpcy5kYXRhKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0U2NlbmUoKTogdm9pZCB7XHJcbiAgICAvLyBpbml0IHNjZW5lXHJcbiAgICB0aGlzLnNjZW5lUHJldmlldyA9IG5ldyBTY2VuZSgpO1xyXG4gICAgLy8gaW5pdCByZW5kZXJlclxyXG4gICAgY29uc3QgY2FudlJlZmVyZW5jZTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzQ29udGFpbmVyJyk7XHJcbiAgICBjb25zdCBjYW52YXNFbGVtZW50OiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgY29uc3QgY29udGV4dDogYW55ID0gY2FudmFzRWxlbWVudC5nZXRDb250ZXh0KCd3ZWJnbDInLCB7YW50aWFsaWFzOiB0cnVlfSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldyA9IG5ldyBXZWJHTFJlbmRlcmVyKHtcclxuICAgICAgY2FudmFzOiBjYW52YXNFbGVtZW50LFxyXG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG4gICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgYW50aWFsaWFzOiB0cnVlLFxyXG4gICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsXHJcbiAgICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IHRydWVcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zZXRDbGVhckNvbG9yKDB4ZmFmYWZhKTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LmF1dG9DbGVhciA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZztcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnNoYWRvd01hcC5lbmFibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3LnNoYWRvd01hcC50eXBlID0gUENGU29mdFNoYWRvd01hcDtcclxuICAgIHRoaXMucmVuZGVyZXJQcmV2aWV3Lm91dHB1dENvbG9yU3BhY2UgPSBMaW5lYXJTUkdCQ29sb3JTcGFjZTtcclxuICAgIGNhbnZSZWZlcmVuY2UuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlclByZXZpZXcuZG9tRWxlbWVudCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5kb21FbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCAndGhyZWVkJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zZXRTaXplKHdpbmRvdy5pbm5lcldpZHRoIC8gMiwgd2luZG93LmlubmVySGVpZ2h0IC8gMiwgdHJ1ZSk7XHJcblxyXG4gICAgLy8gaW5pdCBjYW1lcmFcclxuICAgIHRoaXMuY2FtZXJhUHJldmlldyA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSg0NSwgMSwgMC4wMSwgMTAwMDAwMDAwKTtcclxuICAgIHRoaXMuY2FtZXJhUHJldmlldy5wb3NpdGlvbi5zZXQoMCwgMiwgMTApO1xyXG4gICAgdGhpcy5jYW1lcmFQcmV2aWV3LmFzcGVjdCA9IHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgdGhpcy5jYW1lcmFQcmV2aWV3LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHModGhpcy5jYW1lcmFQcmV2aWV3LCB0aGlzLnJlbmRlcmVyUHJldmlldy5kb21FbGVtZW50KTtcclxuICAgIHRoaXMuY29udHJvbHMudXBkYXRlKCk7XHJcblxyXG4gICAgdGhpcy5sb2FkRmxvb3JQbGFuZSgpO1xyXG4gICAgdGhpcy5sb2FkUmVmZXJlbmNlTW9kZWwoKTtcclxuICAgIHRoaXMubG9hZExpZ2h0cygpO1xyXG5cclxuICAgIGNvbnN0IGdyaWRIZWxwZXI6IEdyaWRIZWxwZXIgPSBuZXcgR3JpZEhlbHBlcih0aGlzLmdyaWRTaXplLCB0aGlzLmdyaWREaXZpc2lvbik7XHJcbiAgICBncmlkSGVscGVyLm5hbWUgPSAnR3JpZEhlbHBlcic7XHJcbiAgICB0aGlzLnNjZW5lUHJldmlldy5hZGQoZ3JpZEhlbHBlcik7XHJcblxyXG4gICAgdGhpcy5fYW5pbWF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWRGbG9vclBsYW5lKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGxhbmVHZW9tZXRyeTogUGxhbmVHZW9tZXRyeSA9IG5ldyBQbGFuZUdlb21ldHJ5KHRoaXMuZmxvb3JTaXplV2lkdGgsIHRoaXMuZmxvb3JTaXplSGVpZ2h0KTtcclxuICAgIGNvbnN0IHBsYW5lTWF0ZXJpYWw6IE1lc2hCYXNpY01hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtjb2xvcjogMHg4OTk0OTksIHNpZGU6IFRIUkVFLkRvdWJsZVNpZGV9KTtcclxuICAgIGNvbnN0IHBsYW5lID0gbmV3IE1lc2gocGxhbmVHZW9tZXRyeSwgcGxhbmVNYXRlcmlhbCk7XHJcbiAgICBwbGFuZS5yb3RhdGlvbi54ID0gLU1hdGguUEkgLyAyO1xyXG4gICAgcGxhbmUucG9zaXRpb24ueSA9IDA7XHJcbiAgICBwbGFuZS5uYW1lID0gJ2Zsb29yX3BsYW5lJztcclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChwbGFuZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZExpZ2h0cygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxpc3RPZkxpZ2h0UHJlc2V0czogTGlnaHRQcmVzZXRbXSA9IHRoaXMuX2xpZ2h0UHJlc2V0c1NlcnZpY2UubG9hZGVkTGlnaHRQcmVzZXRzO1xyXG4gICAgY29uc3QgbGlnaHRQcmVzZXQ6IExpZ2h0UHJlc2V0ID0gdGhpcy5fbGlnaHRQcmVzZXRzU2VydmljZS5hY3RpdmVMaWdodFByZXNldDtcclxuICAgIGZvciAoY29uc3QgbGlnaHRQcm9wZXJ0aWVzIG9mIGxpZ2h0UHJlc2V0LmxpZ2h0cykge1xyXG4gICAgICB0aGlzLl9jcmVhdGVMaWdodEZyb21Qcm9wZXJ0aWVzKGxpZ2h0UHJvcGVydGllcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZFJlZmVyZW5jZU1vZGVsKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlZmVyZW5jZU1vZGVsUGF0aDogc3RyaW5nID0gJyc7XHJcbiAgICBjb25zdCByZWZlcmVuY2VNb2RlbDogc3RyaW5nID0gJ3JlZmVyZW5jZV9wb3AuZ2xiJztcclxuICAgIGlmICh0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy50aHJlZURBc3NldFBhdGgpIHtcclxuICAgICAgcmVmZXJlbmNlTW9kZWxQYXRoID0gdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MudGhyZWVEQXNzZXRQYXRoICsgJ2Fzc2V0cy8nO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbG9hZGVyOiBHTFRGTG9hZGVyID0gbmV3IEdMVEZMb2FkZXIoKTtcclxuICAgIGxvYWRlci5sb2FkKHJlZmVyZW5jZU1vZGVsUGF0aCArIHJlZmVyZW5jZU1vZGVsLCBhc3luYyBnbHRmID0+IHtcclxuICAgICAgZ2x0Zi5zY2VuZS5wb3NpdGlvbi5zZXQoMywgMCwgMyk7XHJcbiAgICAgIGdsdGYuc2NlbmUuY2FzdFNoYWRvdyA9IHRydWU7XHJcbiAgICAgIGdsdGYuc2NlbmUucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcbiAgICAgIGdsdGYuc2NlbmUubmFtZSA9ICdSZWZlcmVuY2VfbW9kZWwnO1xyXG4gICAgICB0aGlzLnNjZW5lUHJldmlldy5hZGQoZ2x0Zi5zY2VuZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkTW9kZWwoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbE5hbWUgPSB0aGlzLl9zZXRNb2RlbE5hbWUoaW5wdXQuZmlsZS5maWxlLm5hbWUpO1xyXG4gICAgY29uc3QgZmlsZVR5cGUgPSBpbnB1dC5maWxlLmZpbGVUeXBlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoZmlsZVR5cGUgPT09ICdnbGInIHx8IGZpbGVUeXBlID09PSAnZ2x0ZicpIHtcclxuICAgICAgdGhpcy5fZ2xiTG9hZGVyKGlucHV0KTtcclxuICAgIH0gZWxzZSBpZiAoZmlsZVR5cGUgPT09ICdmYngnKSB7XHJcbiAgICAgIHRoaXMuX2ZieExvYWRlcihpbnB1dCk7XHJcbiAgICB9IGVsc2UgaWYgKGZpbGVUeXBlID09PSAnb2JqJykge1xyXG4gICAgICB0aGlzLl9vYmpMb2FkZXIoaW5wdXQpO1xyXG4gICAgfSBlbHNlIGlmIChmaWxlVHlwZSA9PT0gJzNkcycpIHtcclxuICAgICAgdGhpcy5fdGRzTG9hZGVyKGlucHV0KTtcclxuICAgIH0gZWxzZSBpZiAoZmlsZVR5cGUgPT09ICdzdGwnKSB7XHJcbiAgICAgIHRoaXMuX3N0bExvYWRlcihpbnB1dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZEhEUkkocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBuZXcgUkdCRUxvYWRlcigpLnNldERhdGFUeXBlKEZsb2F0VHlwZSkubG9hZChwYXRoLCAoaGRyVGV4dHVyZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBtcmVtR2VuZXJhdG9yOiBQTVJFTUdlbmVyYXRvciA9IG5ldyBQTVJFTUdlbmVyYXRvcih0aGlzLnJlbmRlcmVyUHJldmlldyk7XHJcbiAgICAgICAgcG1yZW1HZW5lcmF0b3IuY29tcGlsZUVxdWlyZWN0YW5ndWxhclNoYWRlcigpO1xyXG4gICAgICAgIGNvbnN0IGhkckN1YmVSZW5kZXJUYXJnZXQgPSBwbXJlbUdlbmVyYXRvci5mcm9tRXF1aXJlY3Rhbmd1bGFyKGhkclRleHR1cmUpO1xyXG4gICAgICAgIGhkclRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIHRoaXMuc2NlbmVQcmV2aWV3LmVudmlyb25tZW50ID0gaGRyQ3ViZVJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG4gICAgICAgIC8vIHRoaXMuc2NlbmVQcmV2aWV3LmJhY2tncm91bmQgPSBoZHJDdWJlUmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcbiAgICAgICAgcG1yZW1HZW5lcmF0b3IuZGlzcG9zZSgpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSwgdW5kZWZpbmVkLCByZWplY3QpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwb3J0U2NlbmVBc0dMQihyZXR1cm5UeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIGFkZCB0aW1lc3RhbXBcclxuICAgIGNvbnN0IHRpbWVzdGFtcDogbnVtYmVyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICBjb25zdCBleHBvcnRGaWxlTmFtZTogc3RyaW5nID0gdGhpcy5fc2V0TW9kZWxOYW1lKHRoaXMuZ2xiRXhwb3J0TmFtZS5uYXRpdmVFbGVtZW50LnZhbHVlKSArICdfJyArIHRpbWVzdGFtcDtcclxuICAgIGNvbnN0IGVsZW1lbnRzVG9SZW1vdmU6IHN0cmluZ1tdID0gWydSZWZlcmVuY2VfbW9kZWwnLCAnZmxvb3JfcGxhbmUnLCAnR3JpZEhlbHBlcicsICdBbWJpZW50JywgJ0RpcmVjdGlvbmFsIGZyb250LWxlZnQnLCAnc3BvdCBiYWNrIChhbnRpLXN1biknLCAnYm94SGVpZ2h0JywgJ2JveFdpZHRoJywgJ2JveERlcHRoJ107XHJcbiAgICBjb25zdCBnbHRmRXhwb3J0ZXI6IEdMVEZFeHBvcnRlciA9IG5ldyBHTFRGRXhwb3J0ZXIoKTtcclxuICAgIGxldCBzY2VuZTogU2NlbmU7XHJcbiAgICBzY2VuZSA9IHRoaXMuc2NlbmVQcmV2aWV3LmNsb25lKCk7XHJcbiAgICBzY2VuZS5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICBpZiAoYyBpbnN0YW5jZW9mIExpZ2h0KSB7XHJcbiAgICAgICAgc2NlbmUucmVtb3ZlKGMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGVsZW1lbnRzVG9SZW1vdmUuZm9yRWFjaChlbGVtZW50TmFtZSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0OiBPYmplY3QzRCA9IHNjZW5lLmdldE9iamVjdEJ5TmFtZShlbGVtZW50TmFtZSk7XHJcbiAgICAgIHNjZW5lLnJlbW92ZShzZWxlY3RlZE9iamVjdCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIHRyczogZmFsc2UsXHJcbiAgICAgIG9ubHlWaXNpYmxlOiB0cnVlLFxyXG4gICAgICB0cnVuY2F0ZURyYXdSYW5nZTogdHJ1ZSxcclxuICAgICAgYmluYXJ5OiB0cnVlLFxyXG4gICAgICBtYXhUZXh0dXJlU2l6ZTogSW5maW5pdHlcclxuICAgIH07XHJcbiAgICBnbHRmRXhwb3J0ZXIucGFyc2Uoc2NlbmUsIChyZXN1bHQ6IEFycmF5QnVmZmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGU6IEJsb2IgPSBuZXcgQmxvYihbcmVzdWx0XSwge3R5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfSk7XHJcbiAgICAgIGlmIChyZXR1cm5UeXBlID09PSAndXBsb2FkJykge1xyXG4gICAgICAgIHRoaXMuX3NlbmRNb2RlbFRvQ0ROKGAke2V4cG9ydEZpbGVOYW1lfS5nbGJgLCBmaWxlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9kb3dubG9hZE1vZGVsKGAke2V4cG9ydEZpbGVOYW1lfS5nbGJgLCBmaWxlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0sIChlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgfSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2NhbGVBcnRpY2xlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSB0aGlzLmhlaWdodEFydGljbGUubmF0aXZlRWxlbWVudC52YWx1ZTtcclxuICAgIGxldCBoZWlnaHRJbk1ldGVyOiBudW1iZXI7XHJcbiAgICBpZiAodGhpcy51bml0c09mTWVhc3VyZW1lbnQgPT09ICdjbScpIHtcclxuICAgICAgaGVpZ2h0SW5NZXRlciA9IGlucHV0SGVpZ2h0IC8gMTAwO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnVuaXRzT2ZNZWFzdXJlbWVudCA9PT0gJ2luY2hlcycpIHtcclxuICAgICAgaGVpZ2h0SW5NZXRlciA9IChpbnB1dEhlaWdodCAqIDIuNTQpIC8gMTAwO1xyXG4gICAgfVxyXG4gICAgLy8gc2NhbGUgPSB0aGlzLmJvdW5kaW5nIC8gaGVpZ2h0SW5NZXRlciBhbmQgdXNlIFkgYXMgdXAvIGhlaWdodFxyXG4gICAgY29uc3Qgc2NhbGU6IG51bWJlciA9IHRoaXMuYm91bmRpbmdCb3hTaXplLnkgLyBoZWlnaHRJbk1ldGVyO1xyXG4gICAgdGhpcy5zY2VuZVByZXZpZXcuZ2V0T2JqZWN0QnlOYW1lKHRoaXMubW9kZWxOYW1lKS5zY2FsZS5zZXQoXHJcbiAgICAgIHRoaXMuc2NlbmVQcmV2aWV3LmNoaWxkcmVuWzBdLnNjYWxlLnggLyBzY2FsZSxcclxuICAgICAgdGhpcy5zY2VuZVByZXZpZXcuY2hpbGRyZW5bMF0uc2NhbGUueSAvIHNjYWxlLFxyXG4gICAgICB0aGlzLnNjZW5lUHJldmlldy5jaGlsZHJlblswXS5zY2FsZS56IC8gc2NhbGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJvdGF0ZU1vZGVsKGF4aXM6IHN0cmluZywgZGVncmVlczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc2NlbmVQcmV2aWV3LmdldE9iamVjdEJ5TmFtZSh0aGlzLm1vZGVsTmFtZSk7XHJcbiAgICBpZiAoYXhpcyA9PT0gJ3gnKSB7XHJcbiAgICAgIG1vZGVsLnJvdGF0aW9uLnggKz0gZGVncmVlcztcclxuICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XHJcbiAgICAgIG1vZGVsLnJvdGF0aW9uLnkgKz0gZGVncmVlcztcclxuICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3onKSB7XHJcbiAgICAgIG1vZGVsLnJvdGF0aW9uLnogKz0gZGVncmVlcztcclxuICAgIH1cclxuICAgIHRoaXMuX2dldEJvdW5kaW5nQm94KG1vZGVsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3ZlTW9kZWwoYXhpczogc3RyaW5nLCBhbW91bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnNjZW5lUHJldmlldy5nZXRPYmplY3RCeU5hbWUodGhpcy5tb2RlbE5hbWUpO1xyXG4gICAgaWYgKGF4aXMgPT09ICd4Jykge1xyXG4gICAgICBtb2RlbC5wb3NpdGlvbi54ICs9IGFtb3VudDtcclxuICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XHJcbiAgICAgIG1vZGVsLnBvc2l0aW9uLnkgKz0gYW1vdW50O1xyXG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneicpIHtcclxuICAgICAgbW9kZWwucG9zaXRpb24ueiArPSBhbW91bnQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChtb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VW5pdChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnVuaXRzT2ZNZWFzdXJlbWVudCA9IGV2ZW50LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZVNob3dSZWZlcmVuY2VNb2RlbCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1vZGVsOiBPYmplY3QzRCA9IHRoaXMuc2NlbmVQcmV2aWV3LmdldE9iamVjdEJ5TmFtZSgnUmVmZXJlbmNlX21vZGVsJyk7XHJcbiAgICBtb2RlbC52aXNpYmxlID0gIXRoaXMuc2hvd1JlZmVyZW5jZU1vZGVsO1xyXG4gICAgdGhpcy5zaG93UmVmZXJlbmNlTW9kZWwgPSAhdGhpcy5zaG93UmVmZXJlbmNlTW9kZWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U3RhY2thYmxlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhY2thYmxlID0gZXZlbnQudmFsdWU7XHJcbiAgfVxyXG4gIFxyXG4gIHB1YmxpYyBzZXRIZWlnaHRBZGp1c3RhYmxlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaGVpZ2h0QWRqdXN0YWJsZSA9IGV2ZW50LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYW5pbWF0ZSgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyUHJldmlldy5zZXRBbmltYXRpb25Mb29wKCh0aW1lc3RhbXAsIGZyYW1lKSA9PiB0aGlzLl9yZW5kZXIodGltZXN0YW1wLCBmcmFtZSkpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlbmRlcih0LCBmcmFtZSkge1xyXG4gICAgdGhpcy5yZW5kZXJlclByZXZpZXcucmVuZGVyKHRoaXMuc2NlbmVQcmV2aWV3LCB0aGlzLmNhbWVyYVByZXZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZG93bmxvYWRNb2RlbChmaWxlTmFtZTogc3RyaW5nLCBibG9iOiBCbG9iKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIGVsZW1lbnQuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBlbGVtZW50LmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgZWxlbWVudC5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRNb2RlbFRvQ0ROKGZpbGVOYW1lOiBzdHJpbmcsIGJsb2I6IEJsb2IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHJlYWRlcjogRmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICAgIHJlYWRlci5vbmxvYWRlbmQgPSBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlQXNTdHJpbmc6IHN0cmluZyA9IEZpbGVVdGlscy5TdHJpcE1pbWVTdHJpbmdGcm9tRGF0YVVyaShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgdGhpcy5fYWRhcHRlclNlcnZpY2Uuc3RvcmUzRE1vZGVsQ0ROKGZpbGVOYW1lLCBmaWxlQXNTdHJpbmcpLnRoZW4oZmlsZVBhdGggPT4ge1xyXG4gICAgICAgIGlmIChmaWxlUGF0aCkge1xyXG4gICAgICAgICAgdGhpcy5fYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikudGhlbihmaWxlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaDogc3RyaW5nID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsVXJsOiBzdHJpbmcgPSBmaWxlUGF0aDsgLy8gU2V0IHVybCBmcm9tIHRoZSBDRE5cclxuICAgICAgICAgICAgY29uc3QgY29uZmlndXJhdGlvbkRhdGE6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBjb25zdCBwcmljZURhdGE6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhRGF0YTogTWV0YWRhdGEgPSB0aGlzLl90aGlyZFBhcnR5TW9kZWxTZXJ2aWNlLnNldE1ldGFkYXRhKGhhc2gsIG1vZGVsVXJsLCBjb25maWd1cmF0aW9uRGF0YSk7XHJcbiAgICAgICAgICAgIG1ldGFEYXRhLmNhbkVsZXZhdGUgPSB0aGlzLmhlaWdodEFkanVzdGFibGU7XHJcbiAgICAgICAgICAgIG1ldGFEYXRhLnRoaXJkUGFydHlNb2RlbCA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIFdlIGFsc28gY2FuIHNldCB0aGUgbWV0YWRhdGEgaGVyZSBhbmQgcGFzIGl0IGFzIHRoZSBsYXN0IGFyZ3VtZW50IGZvciBwYXJzZU1vZGVsVG9HTEIuXHJcbiAgICAgICAgICAgIHRoaXMuX3RoaXJkUGFydHlNb2RlbFNlcnZpY2UucGFyc2VNb2RlbFRvR0xCKGZpbGUsIGhhc2gsIG1vZGVsVXJsLCBjb25maWd1cmF0aW9uRGF0YSwgcHJpY2VEYXRhLCBtZXRhRGF0YSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2RpYWxvZy5jbG9zZUFsbCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE1vZGVsTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmVtb3ZlRXh0ZW5zaW9uOiBzdHJpbmcgPSBuYW1lLnJlcGxhY2UoJy5nbGInLCAnJyk7IC8vIHJlbW92ZSAuZ2xiIGFzIGZpbGUgZXh0ZW5zaW9uXHJcbiAgICByZXR1cm4gcmVtb3ZlRXh0ZW5zaW9uLnJlcGxhY2UoJy4nLCAnLScpOyAvLyByZXBsYWNlIGFsbCBkb3RzIGZvciBwZXJpb2RzXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nbGJMb2FkZXIoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgbG9hZGVyOiBHTFRGTG9hZGVyID0gbmV3IEdMVEZMb2FkZXIoKTtcclxuICAgIGxvYWRlci5wYXJzZShpbnB1dC5maWxlLmZpbGVDb250ZW50cywgJycsXHJcbiAgICAgIGFzeW5jIG9iamVjdCA9PiB7XHJcbiAgICAgICAgdGhpcy5fcHJlcE1vZGVsRm9yU2NlbmUob2JqZWN0LnNjZW5lKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdQYXJzaW5nIGVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9mYnhMb2FkZXIoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmJ4TG9hZGVyOiBGQlhMb2FkZXIgPSBuZXcgRkJYTG9hZGVyKCk7XHJcbiAgICBjb25zdCBvYmplY3QgPSBmYnhMb2FkZXIucGFyc2UoaW5wdXQuZmlsZS5maWxlQ29udGVudHMsICcnKTtcclxuICAgIHRoaXMuX3ByZXBNb2RlbEZvclNjZW5lKG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vYmpMb2FkZXIoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qgb2JqTG9hZGVyOiBPQkpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcbiAgICAvLyBmb3Igb2piIGZpbGVzOiBjb252ZXJ0IHRoZSBBcnJheUJ1ZmZlciB0byBhIHN0cmluZ1xyXG4gICAgY29uc3QgYnVmID0gaW5wdXQuZmlsZS5maWxlQ29udGVudHM7XHJcbiAgICBjb25zdCBkZWNvZGVyOiBUZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xyXG4gICAgY29uc3Qgc3RyOiBzdHJpbmcgPSBkZWNvZGVyLmRlY29kZShidWYpO1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gb2JqTG9hZGVyLnBhcnNlKHN0cik7XHJcbiAgICB0aGlzLl9wcmVwTW9kZWxGb3JTY2VuZShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdGRzTG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRkc0xvYWRlcjogVERTTG9hZGVyID0gbmV3IFREU0xvYWRlcigpO1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gdGRzTG9hZGVyLnBhcnNlKGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzLCAnJyk7XHJcbiAgICBvYmplY3QudHJhdmVyc2UoZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVsZW1lbnQpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9wcmVwTW9kZWxGb3JTY2VuZShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc3RsTG9hZGVyKGlucHV0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0bExvYWRlcjogU1RMTG9hZGVyID0gbmV3IFNUTExvYWRlcigpO1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gc3RsTG9hZGVyLnBhcnNlKGlucHV0LmZpbGUuZmlsZUNvbnRlbnRzKTtcclxuICAgIHRoaXMuX2FkZEZyb21HZW9tZXRyeShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkRnJvbUdlb21ldHJ5KGdlb21ldHJ5KSB7XHJcbiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBNZXNoUGhvbmdNYXRlcmlhbCh7dHJhbnNwYXJlbnQ6IHRydWUsIG9wYWNpdHk6IGdlb21ldHJ5LmFscGhhfSk7XHJcbiAgICBjb25zdCBtb2RlbCA9IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCk7XHJcbiAgICB0aGlzLl9wcmVwTW9kZWxGb3JTY2VuZShtb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwTW9kZWxGb3JTY2VuZShvYmplY3Q6IGFueSk6IHZvaWQge1xyXG4gICAgb2JqZWN0Lm5hbWUgPSB0aGlzLm1vZGVsTmFtZTtcclxuICAgIG9iamVjdC5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICBvYmplY3Quc2NhbGUuc2V0KDEsIDEsIDEpO1xyXG4gICAgLy8gUmVtb3ZlIGxpZ2h0cyBmcm9tIHRoZSBjaGlsZHJlblxyXG4gICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goYyA9PiB7XHJcbiAgICAgIGlmIChjIGluc3RhbmNlb2YgTGlnaHQpIHtcclxuICAgICAgICBvYmplY3QucmVtb3ZlKGMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChvYmplY3QpO1xyXG4gICAgdGhpcy5sb2FkZWRNb2RlbCA9IG9iamVjdDtcclxuICAgIHRoaXMuX2dldEJvdW5kaW5nQm94KG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRCb3VuZGluZ0JveChvYmplY3QpIHtcclxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IEJveDMoKS5zZXRGcm9tT2JqZWN0KG9iamVjdCk7XHJcbiAgICB0aGlzLmJvdW5kaW5nQm94U2l6ZSA9IGJvdW5kaW5nQm94LmdldFNpemUobmV3IFZlY3RvcjMoKSk7XHJcbiAgICB0aGlzLl9zZXRNZWFzdXJlbWVudHModGhpcy5ib3VuZGluZ0JveFNpemUpO1xyXG4gICAgdGhpcy5fc2hvd01lYXN1cmVtZW50cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2hvd01lYXN1cmVtZW50cygpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1lYXN1cmVtZW50c01lc2hlcyA9IHRoaXMuX21lYXN1cmVtZW50cy5tYXAodmFsdWUgPT4gdmFsdWUudGV4dE1lc2gpO1xyXG4gICAgbWVhc3VyZW1lbnRzTWVzaGVzLmZvckVhY2gob2JqZWN0ID0+IHRoaXMuc2NlbmVQcmV2aWV3LmFkZChvYmplY3QpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE1lYXN1cmVtZW50cyhib3VuZGluZ0JveDogVmVjdG9yMykge1xyXG4gICAgY29uc3Qgc2V0SGVpZ2h0OiBCb3hNZWFzdXJlbWVudCA9IHRoaXMuX2NyZWF0ZUhlaWdodE1lYXN1cmVtZW50KGJvdW5kaW5nQm94LnkpO1xyXG4gICAgdGhpcy5fbWVhc3VyZW1lbnRzLnB1c2goc2V0SGVpZ2h0KTtcclxuICAgIGNvbnN0IHNldFdpZHRoOiBCb3hNZWFzdXJlbWVudCA9IHRoaXMuX2NyZWF0ZVdpZHRoTWVhc3VyZW1lbnQoYm91bmRpbmdCb3gueCk7XHJcbiAgICB0aGlzLl9tZWFzdXJlbWVudHMucHVzaChzZXRXaWR0aCk7XHJcbiAgICBjb25zdCBzZXREZXB0aDogQm94TWVhc3VyZW1lbnQgPSB0aGlzLl9jcmVhdGVEZXB0aE1lYXN1cmVtZW50KGJvdW5kaW5nQm94LnopO1xyXG4gICAgdGhpcy5fbWVhc3VyZW1lbnRzLnB1c2goc2V0RGVwdGgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlSGVpZ2h0TWVhc3VyZW1lbnQoaGVpZ2h0SW5wdXQpOiBCb3hNZWFzdXJlbWVudCB7XHJcbiAgICBjb25zdCBoZWlnaHQ6IEJveE1lYXN1cmVtZW50ID0gbmV3IEJveE1lYXN1cmVtZW50KCk7XHJcbiAgICBjb25zdCBoZWlnaHRTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KGhlaWdodElucHV0LCB0aGlzLnVuaXRzT2ZNZWFzdXJlbWVudCwgdGhpcy5kaXN0YW5jZVN0ZXApO1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldCgnTEFCRUxfSEVJR0hUJyk7XHJcbiAgICBoZWlnaHQudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2goaGVpZ2h0U3RyaW5nLCB0aGlzLmZvbnQsIDB4RkYwMEZGLCAwLjA4LCBmYWxzZSwgZmFsc2UsIHRleHQpO1xyXG4gICAgaGVpZ2h0LnBvc2l0aW9ucyA9IHRoaXMuX2NhbGN1bGF0ZUhlaWdodFBvc2l0aW9ucygpO1xyXG4gICAgaGVpZ2h0LnRleHRNZXNoLm5hbWUgPSAnYm94SGVpZ2h0JztcclxuICAgIHJldHVybiBoZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVXaWR0aE1lYXN1cmVtZW50KHdpZHRoSW5wdXQpIHtcclxuICAgIGNvbnN0IHdpZHRoOiBCb3hNZWFzdXJlbWVudCA9IG5ldyBCb3hNZWFzdXJlbWVudCgpO1xyXG4gICAgY29uc3Qgd2lkdGhTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KHdpZHRoSW5wdXQsIHRoaXMudW5pdHNPZk1lYXN1cmVtZW50LCB0aGlzLmRpc3RhbmNlU3RlcCk7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KCdMQUJFTF9XSURUSCcpO1xyXG4gICAgd2lkdGgudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2god2lkdGhTdHJpbmcsIHRoaXMuZm9udCwgMHhGRjAwRkYsIDAuMDgsIGZhbHNlLCBmYWxzZSwgdGV4dCk7XHJcbiAgICB3aWR0aC5wb3NpdGlvbnMgPSB0aGlzLl9jYWxjdWxhdGVXaWR0aFBvc2l0aW9ucygpO1xyXG4gICAgd2lkdGgudGV4dE1lc2gubmFtZSA9ICdib3hXaWR0aCc7XHJcbiAgICByZXR1cm4gd2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVEZXB0aE1lYXN1cmVtZW50KGRlcHRoSW5wdXQpIHtcclxuICAgIGNvbnN0IGRlcHRoOiBCb3hNZWFzdXJlbWVudCA9IG5ldyBCb3hNZWFzdXJlbWVudCgpO1xyXG4gICAgY29uc3QgZGVwdGhTdHJpbmcgPSBNZWFzdXJlbWVudFV0aWxzLm1ha2VUZXh0KGRlcHRoSW5wdXQsIHRoaXMudW5pdHNPZk1lYXN1cmVtZW50LCB0aGlzLmRpc3RhbmNlU3RlcCk7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KCdMQUJFTF9ERVBUSCcpO1xyXG4gICAgZGVwdGgudGV4dE1lc2ggPSBtYWtlVGV4dE1lc2goZGVwdGhTdHJpbmcsIHRoaXMuZm9udCwgMHhGRjAwRkYsIDAuMDgsIGZhbHNlLCBmYWxzZSwgdGV4dCk7XHJcbiAgICBkZXB0aC5wb3NpdGlvbnMgPSB0aGlzLl9jYWxjdWxhdGVEZXB0aFBvc2l0aW9ucygpO1xyXG4gICAgZGVwdGgudGV4dE1lc2gubmFtZSA9ICdib3hEZXB0aCc7XHJcbiAgICByZXR1cm4gZGVwdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVIZWlnaHRQb3NpdGlvbnMoKTogVEhSRUUuVmVjdG9yM1tdIHtcclxuICAgIHJldHVybiBwb3NpdGlvbmluZ0ZhY3RvcnMubWFwKChbaiwga10pID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKClcclxuICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKHhEaXJlY3Rpb24sIGogLyAyICogdGhpcy5ib3VuZGluZ0JveFNpemUueClcclxuICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKHpEaXJlY3Rpb24sIGsgLyAyICogdGhpcy5ib3VuZGluZ0JveFNpemUueik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVdpZHRoUG9zaXRpb25zKCk6IFRIUkVFLlZlY3RvcjNbXSB7XHJcbiAgICByZXR1cm4gcG9zaXRpb25pbmdGYWN0b3JzLm1hcCgoW2osIGtdKSA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMygpXHJcbiAgICAgICAgLmFkZFNjYWxlZFZlY3Rvcih5RGlyZWN0aW9uLCBqIC8gMiAqIHRoaXMuYm91bmRpbmdCb3hTaXplLnkpXHJcbiAgICAgICAgLmFkZFNjYWxlZFZlY3Rvcih6RGlyZWN0aW9uLCBrIC8gMiAqIHRoaXMuYm91bmRpbmdCb3hTaXplLnopO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVEZXB0aFBvc2l0aW9ucygpOiBUSFJFRS5WZWN0b3IzW10ge1xyXG4gICAgcmV0dXJuIHBvc2l0aW9uaW5nRmFjdG9ycy5tYXAoKFtqLCBrXSkgPT4ge1xyXG4gICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMoKVxyXG4gICAgICAgIC5hZGRTY2FsZWRWZWN0b3IoeURpcmVjdGlvbiwgaiAvIDIgKiB0aGlzLmJvdW5kaW5nQm94U2l6ZS55KVxyXG4gICAgICAgIC5hZGRTY2FsZWRWZWN0b3IoeERpcmVjdGlvbiwgayAvIDIgKiB0aGlzLmJvdW5kaW5nQm94U2l6ZS54KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2Jsb2JUb0FycmF5QnVmZmVyKGJsb2I6IEJsb2IpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChyZWFkZXIucmVzdWx0KSB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdFcnJvciByZWFkaW5nIGJsb2IgYXMgQXJyYXlCdWZmZXInKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gcmVhZCBibG9iIGFzIEFycmF5QnVmZmVyJykpO1xyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUxpZ2h0RnJvbVByb3BlcnRpZXMobGlnaHRQcm9wZXJ0aWVzOiBMaWdodFByb3BlcnRpZXMpIHtcclxuICAgIGNvbnN0IGxpZ2h0VHlwZTogTGlnaHRFbnVtID0gbGlnaHRQcm9wZXJ0aWVzLnR5cGU7XHJcbiAgICBjb25zdCBnZXRMaWdodHM6IExpZ2h0Q3JlYXRlU2VydmljZSA9IG5ldyBMaWdodENyZWF0ZVNlcnZpY2UoKTtcclxuICAgIGNvbnN0IGxpZ2h0OiBMaWdodCA9IGdldExpZ2h0cy5jcmVhdGVOZXdMaWdodChsaWdodFR5cGUpO1xyXG4gICAgbGlnaHQudXNlckRhdGEud2FsbE9mZnNldCA9IGxpZ2h0UHJvcGVydGllcy53YWxsT2Zmc2V0O1xyXG4gICAgbGlnaHQudXNlckRhdGEucm90YXRpb25PZmZzZXQgPSBsaWdodFByb3BlcnRpZXMucm90YXRpb25PZmZzZXQ7XHJcbiAgICBsaWdodC51c2VyRGF0YS50b3BEb3duRGlyZWN0aW9uYWwgPSBsaWdodFByb3BlcnRpZXMudG9wRG93bkRpcmVjdGlvbmFsO1xyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsaWdodFByb3BlcnRpZXMpIHtcclxuICAgICAgaWYgKCFsaWdodC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvcGVydHkgPT09ICdwb3NpdGlvbicpIHtcclxuICAgICAgICBsaWdodC5wb3NpdGlvbi55ID0gbGlnaHRQcm9wZXJ0aWVzLnBvc2l0aW9uLnk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICdjb2xvcicpIHtcclxuICAgICAgICBsaWdodC5jb2xvciA9IG5ldyBDb2xvcihsaWdodFByb3BlcnRpZXMuY29sb3IpO1xyXG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09PSAnZ3JvdW5kQ29sb3InKSB7XHJcbiAgICAgICAgKGxpZ2h0IGFzIGFueSkuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IobGlnaHRQcm9wZXJ0aWVzLmdyb3VuZENvbG9yKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZXRPYmplY3RQcm9wZXJ0aWVzKGxpZ2h0LCBwcm9wZXJ0eSwgbGlnaHRQcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2NlbmVQcmV2aWV3LmFkZChsaWdodCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRPYmplY3RQcm9wZXJ0aWVzKG9iamVjdDogTGlnaHQgfCBMaWdodFByb3BlcnRpZXMsIHByb3BlcnR5OiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3NoYWRvdycpIHtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCFvYmplY3RbcHJvcGVydHldLmhhc093blByb3BlcnR5KHByb3ApKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JqZWN0W3Byb3BlcnR5XVtwcm9wXSA9IHZhbHVlW3Byb3BdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmplY3RbcHJvcGVydHldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
|