@smarterplan/ngx-smarterplan-core 1.2.1 → 1.2.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/esm2020/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +68 -0
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +2 -3
- package/esm2020/lib/matterport-extensions/security-camera/SecurityCamera.mjs +44 -54
- package/esm2020/lib/matterport-extensions/tv-player/TvPlayer.mjs +98 -0
- package/esm2020/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +64 -0
- package/esm2020/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +221 -0
- package/esm2020/lib/services/matterport.service.mjs +70 -9
- package/esm2020/lib/services/viewer.service.mjs +4 -2
- package/esm2020/lib/types.service.mjs +1 -1
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +439 -73
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +439 -73
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +26 -0
- package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts.map +1 -0
- package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts +1 -2
- package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts.map +1 -1
- package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts +7 -6
- package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts.map +1 -1
- package/lib/matterport-extensions/tv-player/TvPlayer.d.ts +26 -0
- package/lib/matterport-extensions/tv-player/TvPlayer.d.ts.map +1 -0
- package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +26 -0
- package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts.map +1 -0
- package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts +43 -0
- package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts.map +1 -0
- package/lib/services/matterport.service.d.ts +2 -0
- package/lib/services/matterport.service.d.ts.map +1 -1
- package/lib/services/viewer.service.d.ts.map +1 -1
- package/lib/types.service.d.ts +1 -0
- package/lib/types.service.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { SceneComponent } from './../scene-component/SceneComponent';
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
import Hls from 'hls.js';
|
|
4
|
+
export class HlsLoader extends SceneComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.video = null;
|
|
8
|
+
this.texture = null;
|
|
9
|
+
this.hls = null;
|
|
10
|
+
this.inputs = {
|
|
11
|
+
src: './../assets/video/121222-04.mp4',
|
|
12
|
+
enabled: true,
|
|
13
|
+
};
|
|
14
|
+
this.outputs = {
|
|
15
|
+
video: null,
|
|
16
|
+
aspect: 1,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
onInit(videoTexture) {
|
|
20
|
+
this.outputs.video = videoTexture;
|
|
21
|
+
this.outputs.aspect = 720 / 480;
|
|
22
|
+
if (this.inputs.enabled) {
|
|
23
|
+
this.setupStream();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
onInputsUpdated() {
|
|
27
|
+
this.setupStream();
|
|
28
|
+
}
|
|
29
|
+
onDestroy() {
|
|
30
|
+
this.releaseResources();
|
|
31
|
+
}
|
|
32
|
+
createVideoElement() {
|
|
33
|
+
const video = document.createElement('video');
|
|
34
|
+
video.crossOrigin = 'anonymous';
|
|
35
|
+
video.setAttribute('height', '480');
|
|
36
|
+
video.setAttribute('width', '720');
|
|
37
|
+
video.volume = 0.1;
|
|
38
|
+
return video;
|
|
39
|
+
}
|
|
40
|
+
setupStream() {
|
|
41
|
+
this.releaseResources();
|
|
42
|
+
if (this.inputs.enabled) {
|
|
43
|
+
this.video = this.createVideoElement();
|
|
44
|
+
this.hls = new Hls();
|
|
45
|
+
this.hls.loadSource(this.inputs.src);
|
|
46
|
+
this.hls.attachMedia(this.video);
|
|
47
|
+
this.hls.on(Hls.Events.MANIFEST_PARSED, () => {
|
|
48
|
+
this.outputs.video = this.video;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
releaseResources() {
|
|
53
|
+
if (this.hls) {
|
|
54
|
+
this.hls.destroy();
|
|
55
|
+
this.hls = null;
|
|
56
|
+
}
|
|
57
|
+
if (this.texture) {
|
|
58
|
+
this.texture.dispose();
|
|
59
|
+
this.texture = null;
|
|
60
|
+
this.outputs.video = null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export const hlsLoaderType = 'mp.hlsLoader';
|
|
65
|
+
export function makeHlsLoader() {
|
|
66
|
+
return new HlsLoader();
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGxzTG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvaHNsLWxvYWRlci9IbHNMb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBbUIsTUFBTSxxQ0FBcUMsQ0FBQztBQUV0RixhQUFhO0FBQ2IsT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDO0FBWXpCLE1BQU0sT0FBTyxTQUFVLFNBQVEsY0FBYztJQUE3Qzs7UUFDVSxVQUFLLEdBQTRCLElBQUksQ0FBQztRQUN0QyxZQUFPLEdBQXdCLElBQUksQ0FBQztRQUNwQyxRQUFHLEdBQWUsSUFBSSxDQUFDO1FBRXRCLFdBQU0sR0FBVztZQUN4QixHQUFHLEVBQUUsaUNBQWlDO1lBQ3RDLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQTtRQUVRLFlBQU8sR0FBRztZQUNqQixLQUFLLEVBQUUsSUFBSTtZQUNYLE1BQU0sRUFBRSxDQUFDO1NBQ0MsQ0FBQztJQXNEZixDQUFDO0lBcERVLE1BQU0sQ0FBQyxZQUEyQjtRQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFDLEdBQUcsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFUSxlQUFlO1FBRXRCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRVEsU0FBUztRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDaEMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1NBQ2pCO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUM1QyxNQUFNLFVBQVUsYUFBYTtJQUMzQixPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNjZW5lQ29tcG9uZW50LCBDb21wb25lbnRPdXRwdXQgfSBmcm9tICcuLy4uL3NjZW5lLWNvbXBvbmVudC9TY2VuZUNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZpZGVvVGV4dHVyZSB9IGZyb20gJ3RocmVlJztcclxuLy8gQHRzLWlnbm9yZVxyXG5pbXBvcnQgSGxzIGZyb20gJ2hscy5qcyc7XHJcblxyXG50eXBlIElucHV0cyA9IHtcclxuICBzcmM6IHN0cmluZztcclxuICBlbmFibGVkOiBib29sZWFuO1xyXG59O1xyXG5cclxudHlwZSBPdXRwdXRzID0ge1xyXG4gIHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbDtcclxuICBhc3BlY3Q6IG51bWJlcjtcclxufSAmIENvbXBvbmVudE91dHB1dDtcclxuXHJcbmV4cG9ydCBjbGFzcyBIbHNMb2FkZXIgZXh0ZW5kcyBTY2VuZUNvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgdGV4dHVyZTogVmlkZW9UZXh0dXJlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBobHM6IEhscyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBvdmVycmlkZSBpbnB1dHM6IElucHV0cyA9IHtcclxuICAgIHNyYzogJy4vLi4vYXNzZXRzL3ZpZGVvLzEyMTIyMi0wNC5tcDQnLFxyXG4gICAgZW5hYmxlZDogdHJ1ZSxcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG91dHB1dHMgPSB7XHJcbiAgICB2aWRlbzogbnVsbCxcclxuICAgIGFzcGVjdDogMSxcclxuICB9IGFzIE91dHB1dHM7XHJcblxyXG4gIG92ZXJyaWRlIG9uSW5pdCh2aWRlb1RleHR1cmU/OiBWaWRlb1RleHR1cmUpIHtcclxuICAgIHRoaXMub3V0cHV0cy52aWRlbyA9IHZpZGVvVGV4dHVyZTtcclxuICAgIHRoaXMub3V0cHV0cy5hc3BlY3QgPSA3MjAvNDgwO1xyXG4gICAgaWYgKHRoaXMuaW5wdXRzLmVuYWJsZWQpIHtcclxuICAgICAgdGhpcy5zZXR1cFN0cmVhbSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgb25JbnB1dHNVcGRhdGVkKCkge1xyXG5cclxuICAgIHRoaXMuc2V0dXBTdHJlYW0oKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG9uRGVzdHJveSgpIHtcclxuICAgIHRoaXMucmVsZWFzZVJlc291cmNlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVWaWRlb0VsZW1lbnQoKSB7XHJcbiAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XHJcbiAgICB2aWRlby5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xyXG4gICAgdmlkZW8uc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnNDgwJyk7XHJcbiAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzcyMCcpO1xyXG4gICAgdmlkZW8udm9sdW1lID0gMC4xO1xyXG4gICAgcmV0dXJuIHZpZGVvO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cFN0cmVhbSgpIHtcclxuICAgIHRoaXMucmVsZWFzZVJlc291cmNlcygpO1xyXG5cclxuICAgIGlmICh0aGlzLmlucHV0cy5lbmFibGVkKSB7XHJcbiAgICAgIHRoaXMudmlkZW8gPSB0aGlzLmNyZWF0ZVZpZGVvRWxlbWVudCgpO1xyXG4gICAgICB0aGlzLmhscyA9IG5ldyBIbHMoKTtcclxuICAgICAgdGhpcy5obHMubG9hZFNvdXJjZSh0aGlzLmlucHV0cy5zcmMpO1xyXG4gICAgICB0aGlzLmhscy5hdHRhY2hNZWRpYSh0aGlzLnZpZGVvKTtcclxuICAgICAgdGhpcy5obHMub24oSGxzLkV2ZW50cy5NQU5JRkVTVF9QQVJTRUQsICgpID0+IHtcclxuICAgICAgICB0aGlzLm91dHB1dHMudmlkZW8gPSB0aGlzLnZpZGVvO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVsZWFzZVJlc291cmNlcygpIHtcclxuICAgIGlmICh0aGlzLmhscykge1xyXG4gICAgICB0aGlzLmhscy5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMuaGxzID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy50ZXh0dXJlKSB7XHJcbiAgICAgIHRoaXMudGV4dHVyZS5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMudGV4dHVyZSA9IG51bGw7XHJcbiAgICAgIHRoaXMub3V0cHV0cy52aWRlbyA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaGxzTG9hZGVyVHlwZSA9ICdtcC5obHNMb2FkZXInO1xyXG5leHBvcnQgZnVuY3Rpb24gbWFrZUhsc0xvYWRlcigpIHtcclxuICByZXR1cm4gbmV3IEhsc0xvYWRlcigpO1xyXG59XHJcbiJdfQ==
|
|
@@ -14,12 +14,11 @@ export class CanvasRenderer extends SceneComponent {
|
|
|
14
14
|
repaint: true,
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
-
onInit(
|
|
17
|
+
onInit() {
|
|
18
18
|
// set up canvas 2d context
|
|
19
19
|
this.canvas = document.createElement('canvas');
|
|
20
20
|
this.renderContext2D = this.canvas.getContext('2d');
|
|
21
21
|
this.outputs.texture = new CanvasTexture(this.canvas);
|
|
22
|
-
// this.inputs.painter = ci; // FOR TV ONLY
|
|
23
22
|
this.resize(this.inputs.textureRes);
|
|
24
23
|
this.repaint();
|
|
25
24
|
}
|
|
@@ -59,4 +58,4 @@ export const canvasRendererType = 'mp.canvasRenderer';
|
|
|
59
58
|
export function makeCanvasRenderer() {
|
|
60
59
|
return new CanvasRenderer();
|
|
61
60
|
}
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FudmFzUmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy9uZXN0LXRoZXJtb3N0YXQvQ2FudmFzUmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBbUIsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBcUJ0QyxNQUFNLE9BQU8sY0FBZSxTQUFRLGNBQWM7SUFBbEQ7O1FBSVcsV0FBTSxHQUFXO1lBQ3hCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUscUJBQXFCO1NBQ3hELENBQUE7UUFFUSxZQUFPLEdBQUc7WUFDakIsT0FBTyxFQUFFLElBQUk7U0FDSCxDQUFDO1FBRUosV0FBTSxHQUFHO1lBQ2hCLE9BQU8sRUFBRSxJQUFJO1NBQ0osQ0FBQztJQW1EZCxDQUFDO0lBakRVLE1BQU07UUFFYiwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELDhCQUE4QixDQUFDLEVBQUU7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFUSxlQUFlLENBQUMsU0FBaUI7UUFDeEMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25ELFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtZQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckM7UUFFRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDN0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVRLE9BQU8sQ0FBQyxTQUFpQixFQUFFLFVBQW1CO1FBQ3JELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRVEsU0FBUztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxJQUFVO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztDQUVGO0FBT0QsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFDdEQsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNjZW5lQ29tcG9uZW50LCBDb21wb25lbnRPdXRwdXQgfSBmcm9tICcuLi9zY2VuZS1jb21wb25lbnQvU2NlbmVDb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgQ2FudmFzVGV4dHVyZSB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IFNpemUgfSBmcm9tICcuL1BsYW5lUmVuZGVyZXInO1xuaW1wb3J0IHsgQ2FudmFzSW1hZ2UgfSBmcm9tICcuL0NhbnZhc0ltYWdlJztcblxuZXhwb3J0IGludGVyZmFjZSBJUGFpbnRlcjJkIHtcbiAgcGFpbnQoY29udGV4dDJkOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHNpemU6IFNpemUpOiB2b2lkO1xufVxuXG50eXBlIElucHV0cyA9IHtcbiAgcGFpbnRlcjogSVBhaW50ZXIyZCB8IG51bGw7XG4gIHRleHR1cmVSZXM6IFNpemU7XG59XG5cbnR5cGUgT3V0cHV0cyA9IHtcbiAgdGV4dHVyZTogVGV4dHVyZSB8IG51bGw7XG59ICYgQ29tcG9uZW50T3V0cHV0O1xuXG50eXBlIEV2ZW50cyA9IHtcbiAgcmVwYWludDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBDYW52YXNSZW5kZXJlciBleHRlbmRzIFNjZW5lQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcml2YXRlIHJlbmRlckNvbnRleHQyRDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIG92ZXJyaWRlIGlucHV0czogSW5wdXRzID0ge1xuICAgIHBhaW50ZXI6IG51bGwsXG4gICAgdGV4dHVyZVJlczogeyB3OiAxMDI0LCBoOiAxMDI0IH0sIC8vIGRpbSBmb3IgdGhlcm1vc3RhdFxuICB9XG5cbiAgb3ZlcnJpZGUgb3V0cHV0cyA9IHtcbiAgICB0ZXh0dXJlOiBudWxsLFxuICB9IGFzIE91dHB1dHM7XG5cbiAgb3ZlcnJpZGUgZXZlbnRzID0ge1xuICAgIHJlcGFpbnQ6IHRydWUsXG4gIH0gYXMgRXZlbnRzO1xuXG4gIG92ZXJyaWRlIG9uSW5pdCgpIHtcblxuICAgIC8vIHNldCB1cCBjYW52YXMgMmQgY29udGV4dFxuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdGhpcy5yZW5kZXJDb250ZXh0MkQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHRoaXMub3V0cHV0cy50ZXh0dXJlID0gbmV3IENhbnZhc1RleHR1cmUodGhpcy5jYW52YXMpO1xuXG4gICAgdGhpcy5yZXNpemUodGhpcy5pbnB1dHMudGV4dHVyZVJlcyk7XG4gICAgdGhpcy5yZXBhaW50KCk7XG4gIH1cblxuICBzZXRDYW52YXNOZXN0VGhlcm1vc3RhdFBhaW50ZXIoc2Mpe1xuICAgIHRoaXMuaW5wdXRzLnBhaW50ZXIgPSBzYztcbiAgfVxuXG4gIG92ZXJyaWRlIG9uSW5wdXRzVXBkYXRlZChvbGRJbnB1dHM6IElucHV0cykge1xuICAgIGlmIChvbGRJbnB1dHMudGV4dHVyZVJlcy53ICE9PSB0aGlzLmlucHV0cy50ZXh0dXJlUmVzLncgfHxcbiAgICAgICAgb2xkSW5wdXRzLnRleHR1cmVSZXMuaCAhPT0gdGhpcy5pbnB1dHMudGV4dHVyZVJlcy5oKSB7XG4gICAgICB0aGlzLnJlc2l6ZSh0aGlzLmlucHV0cy50ZXh0dXJlUmVzKTtcbiAgICB9XG5cbiAgICBpZiAob2xkSW5wdXRzLnBhaW50ZXIgIT09IHRoaXMuaW5wdXRzLnBhaW50ZXIpIHtcbiAgICAgIHRoaXMucmVwYWludCgpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG9uRXZlbnQoZXZlbnRUeXBlOiBzdHJpbmcsIF9ldmVudERhdGE6IHVua25vd24pIHtcbiAgICBpZiAoZXZlbnRUeXBlID09PSAncmVwYWludCcpIHtcbiAgICAgIHRoaXMucmVwYWludCgpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG9uRGVzdHJveSgpIHtcbiAgICB0aGlzLm91dHB1dHMudGV4dHVyZS5kaXNwb3NlKCk7XG4gICAgdGhpcy5vdXRwdXRzLnRleHR1cmUgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNpemUoc2l6ZTogU2l6ZSkge1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gc2l6ZS53O1xuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHNpemUuaDtcbiAgfVxuXG4gIHB1YmxpYyByZXBhaW50KCkge1xuICAgIGlmICh0aGlzLmlucHV0cy5wYWludGVyKSB7XG4gICAgICB0aGlzLmlucHV0cy5wYWludGVyLnBhaW50KHRoaXMucmVuZGVyQ29udGV4dDJELCB0aGlzLmlucHV0cy50ZXh0dXJlUmVzKTtcbiAgICAgIHRoaXMub3V0cHV0cy50ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDYW52YXNSZW5kZXJlciBleHRlbmRzIFNjZW5lQ29tcG9uZW50e1xuICBpbnB1dHM6IElucHV0cztcbiAgb3V0cHV0czogT3V0cHV0cztcbn1cblxuZXhwb3J0IGNvbnN0IGNhbnZhc1JlbmRlcmVyVHlwZSA9ICdtcC5jYW52YXNSZW5kZXJlcic7XG5leHBvcnQgZnVuY3Rpb24gbWFrZUNhbnZhc1JlbmRlcmVyKCkge1xuICByZXR1cm4gbmV3IENhbnZhc1JlbmRlcmVyKCk7XG59XG4iXX0=
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
|
|
1
|
+
import { Color, Matrix4, Vector3 } from 'three';
|
|
3
2
|
import { SceneComponent } from '../scene-component/SceneComponent';
|
|
4
3
|
export class SecurityCamera extends SceneComponent {
|
|
5
4
|
constructor() {
|
|
6
5
|
super(...arguments);
|
|
7
|
-
this.rootScene = null;
|
|
8
6
|
this.root = null;
|
|
9
7
|
this.pivot = null;
|
|
10
8
|
this.box = null;
|
|
@@ -28,32 +26,20 @@ export class SecurityCamera extends SceneComponent {
|
|
|
28
26
|
};
|
|
29
27
|
this.outputs = {};
|
|
30
28
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
35
|
-
}
|
|
36
|
-
setRootScene(rootScene) {
|
|
37
|
-
this.rootScene = rootScene;
|
|
38
|
-
}
|
|
39
|
-
onInit(modelNode) {
|
|
40
|
-
if (!this.context) {
|
|
41
|
-
this.context = {
|
|
42
|
-
root: modelNode
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
this.root = new Object3D();
|
|
46
|
-
this.pivot = new Object3D();
|
|
29
|
+
onInit() {
|
|
30
|
+
const THREE = this.context.three;
|
|
31
|
+
this.root = new THREE.Object3D();
|
|
32
|
+
this.pivot = new THREE.Object3D();
|
|
47
33
|
this.root.add(this.pivot);
|
|
48
34
|
this.outputs.objectRoot = this.root;
|
|
49
35
|
this.root.position.set(this.inputs.localPosition.x, this.inputs.localPosition.y, this.inputs.localPosition.z);
|
|
50
|
-
const euler = new Euler(this.inputs.localRotation.x * Math.PI / 180, this.inputs.localRotation.y * Math.PI / 180, this.inputs.localRotation.z * Math.PI / 180, 'YXZ');
|
|
36
|
+
const euler = new THREE.Euler(this.inputs.localRotation.x * Math.PI / 180, this.inputs.localRotation.y * Math.PI / 180, this.inputs.localRotation.z * Math.PI / 180, 'YXZ');
|
|
51
37
|
this.pivot.quaternion.setFromEuler(euler);
|
|
52
38
|
const aspect = this.inputs.aspect;
|
|
53
39
|
const DEG2RAD = Math.PI / 180;
|
|
54
40
|
const RAD2DEG = 1 / DEG2RAD;
|
|
55
41
|
const verticalFOV = 2 * Math.atan(1 / aspect * Math.tan(0.5 * this.inputs.horizontalFOV * DEG2RAD)) * RAD2DEG;
|
|
56
|
-
this.projector = new PerspectiveCamera(verticalFOV, aspect, this.inputs.nearPlane, this.inputs.farPlane);
|
|
42
|
+
this.projector = new THREE.PerspectiveCamera(verticalFOV, aspect, this.inputs.nearPlane, this.inputs.farPlane);
|
|
57
43
|
// orientation of the projector is handled by the pivot
|
|
58
44
|
this.pivot.add(this.projector);
|
|
59
45
|
this.makeFrustumVisuals();
|
|
@@ -62,8 +48,7 @@ export class SecurityCamera extends SceneComponent {
|
|
|
62
48
|
this.makeHighlight();
|
|
63
49
|
// attach highighting to the mesh it represents
|
|
64
50
|
// TODO (scene query): this is very brittle but is the only way to attach something to a room of the model
|
|
65
|
-
|
|
66
|
-
this.rootScene.add(this.highlight);
|
|
51
|
+
this.outputs.objectRoot.parent.parent.add(this.highlight);
|
|
67
52
|
// create the animation mixer to rotate the camera
|
|
68
53
|
this.makeAnimation();
|
|
69
54
|
}
|
|
@@ -88,6 +73,7 @@ export class SecurityCamera extends SceneComponent {
|
|
|
88
73
|
}
|
|
89
74
|
}
|
|
90
75
|
makeFrustumVisuals() {
|
|
76
|
+
const THREE = this.context.three;
|
|
91
77
|
if (this.box) {
|
|
92
78
|
this.root.remove(this.box);
|
|
93
79
|
this.box.material.dispose();
|
|
@@ -106,11 +92,11 @@ export class SecurityCamera extends SceneComponent {
|
|
|
106
92
|
const r = thickness / 2;
|
|
107
93
|
const geoms = [];
|
|
108
94
|
for (let i = 0; i < count * 3 - 1; i += 6) {
|
|
109
|
-
const a = new Vector3(array[i], array[i + 1], array[i + 2]);
|
|
110
|
-
const b = new Vector3(array[i + 3], array[i + 4], array[i + 5]);
|
|
111
|
-
const vec = new Vector3().subVectors(b, a);
|
|
95
|
+
const a = new THREE.Vector3(array[i], array[i + 1], array[i + 2]);
|
|
96
|
+
const b = new THREE.Vector3(array[i + 3], array[i + 4], array[i + 5]);
|
|
97
|
+
const vec = new THREE.Vector3().subVectors(b, a);
|
|
112
98
|
const len = vec.length();
|
|
113
|
-
const geom = new CylinderBufferGeometry(r, r, len, 8);
|
|
99
|
+
const geom = new THREE.CylinderBufferGeometry(r, r, len, 8);
|
|
114
100
|
geom.translate(0, len / 2, 0);
|
|
115
101
|
geom.rotateX(Math.PI / 2);
|
|
116
102
|
geom.lookAt(vec);
|
|
@@ -118,10 +104,10 @@ export class SecurityCamera extends SceneComponent {
|
|
|
118
104
|
geoms.push(geom);
|
|
119
105
|
}
|
|
120
106
|
// API to be updated in bundle - JSSDK-1222
|
|
121
|
-
return
|
|
107
|
+
return THREE.mergeBufferGeometries(geoms);
|
|
122
108
|
}
|
|
123
109
|
const frustumLength = this.inputs.farPlane - this.inputs.nearPlane;
|
|
124
|
-
const boxGeometry = new BoxGeometry(2, 2, frustumLength);
|
|
110
|
+
const boxGeometry = new THREE.BoxGeometry(2, 2, frustumLength);
|
|
125
111
|
const halfHAngle = this.inputs.horizontalFOV * 0.5 * Math.PI / 180;
|
|
126
112
|
const nearHalfWidth = Math.tan(halfHAngle) * this.inputs.nearPlane;
|
|
127
113
|
const farHalfWidth = Math.tan(halfHAngle) * this.inputs.farPlane;
|
|
@@ -144,41 +130,41 @@ export class SecurityCamera extends SceneComponent {
|
|
|
144
130
|
}
|
|
145
131
|
positions.setZ(i, vertexZ - 0.5 * frustumLength - this.inputs.nearPlane);
|
|
146
132
|
}
|
|
147
|
-
var boxMaterial = new MeshBasicMaterial({
|
|
133
|
+
var boxMaterial = new THREE.MeshBasicMaterial({
|
|
148
134
|
color: this.inputs.color,
|
|
149
135
|
opacity: 0.05,
|
|
150
136
|
transparent: true,
|
|
151
|
-
side: BackSide,
|
|
152
|
-
blending: NormalBlending,
|
|
137
|
+
side: THREE.BackSide,
|
|
138
|
+
blending: THREE.NormalBlending,
|
|
153
139
|
depthWrite: false,
|
|
154
140
|
});
|
|
155
|
-
this.box = new Mesh(boxGeometry, boxMaterial);
|
|
156
|
-
const edgesGeometry = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.015);
|
|
157
|
-
this.edges = new Mesh(edgesGeometry, new MeshBasicMaterial({
|
|
141
|
+
this.box = new THREE.Mesh(boxGeometry, boxMaterial);
|
|
142
|
+
const edgesGeometry = edgesToCylinders(new THREE.EdgesGeometry(boxGeometry), 0.015);
|
|
143
|
+
this.edges = new THREE.Mesh(edgesGeometry, new THREE.MeshBasicMaterial({
|
|
158
144
|
color: 0xffffff,
|
|
159
145
|
opacity: 0.25,
|
|
160
146
|
transparent: true,
|
|
161
|
-
blending: AdditiveBlending,
|
|
147
|
+
blending: THREE.AdditiveBlending,
|
|
162
148
|
depthWrite: false,
|
|
163
149
|
}));
|
|
164
|
-
const edgesGeometry2 = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.06);
|
|
165
|
-
const edges2 = new Mesh(edgesGeometry2, new MeshBasicMaterial({
|
|
150
|
+
const edgesGeometry2 = edgesToCylinders(new THREE.EdgesGeometry(boxGeometry), 0.06);
|
|
151
|
+
const edges2 = new THREE.Mesh(edgesGeometry2, new THREE.MeshBasicMaterial({
|
|
166
152
|
color: this.inputs.color,
|
|
167
153
|
opacity: 0.05,
|
|
168
154
|
transparent: true,
|
|
169
|
-
blending: AdditiveBlending,
|
|
155
|
+
blending: THREE.AdditiveBlending,
|
|
170
156
|
depthWrite: false,
|
|
171
157
|
}));
|
|
172
158
|
this.pivot.add(edges2);
|
|
173
159
|
}
|
|
174
160
|
makeHighlight() {
|
|
161
|
+
const THREE = this.context.three;
|
|
175
162
|
// TODO (scene query): this is very brittle and hardcoded but is the only way to get room geometries until we have a better way to query the scene graph
|
|
176
|
-
|
|
177
|
-
const floorMesh = this.rootScene.getObjectByName('FloorMesh:0');
|
|
163
|
+
const floorMesh = this.outputs.objectRoot.parent.parent.getObjectByName('FloorMesh:0');
|
|
178
164
|
const roomMesh = floorMesh.children[0];
|
|
179
165
|
updateHighlightUniforms(this.projector, this.highlightUniforms);
|
|
180
166
|
this.highlightUniforms.color.value.setHex(this.inputs.color);
|
|
181
|
-
const shader = new ShaderMaterial({
|
|
167
|
+
const shader = new THREE.ShaderMaterial({
|
|
182
168
|
polygonOffset: true,
|
|
183
169
|
polygonOffsetUnits: -0.1,
|
|
184
170
|
transparent: true,
|
|
@@ -187,18 +173,23 @@ export class SecurityCamera extends SceneComponent {
|
|
|
187
173
|
fragmentShader: fragmentShader(),
|
|
188
174
|
});
|
|
189
175
|
// a mesh to represent the "highlight"
|
|
190
|
-
this.highlight = new Mesh(roomMesh.geometry, shader);
|
|
176
|
+
this.highlight = new THREE.Mesh(roomMesh.geometry, shader);
|
|
177
|
+
}
|
|
178
|
+
toggleViewFrustum() {
|
|
179
|
+
this.highlight.visible = !this.highlight.visible;
|
|
180
|
+
this.edges.visible = !this.edges.visible;
|
|
181
|
+
this.pivot.visible = !this.pivot.visible;
|
|
191
182
|
}
|
|
192
183
|
makeAnimation() {
|
|
184
|
+
const THREE = this.context.three;
|
|
193
185
|
// preapply the initial rotation of the root so that panAngle is relative to it.
|
|
194
186
|
// TODO: fix it!
|
|
195
|
-
const rootRotation = this.context.root.quaternion;
|
|
196
|
-
|
|
197
|
-
const
|
|
198
|
-
const
|
|
199
|
-
const frame1 = new Quaternion().setFromAxisAngle(yAxis, this.inputs.panAngle).premultiply(rootRotation);
|
|
187
|
+
const rootRotation = this.context.root.quaternion;
|
|
188
|
+
const yAxis = new THREE.Vector3(0, 1, 0);
|
|
189
|
+
const frame0 = new THREE.Quaternion().setFromAxisAngle(yAxis, 0).premultiply(rootRotation);
|
|
190
|
+
const frame1 = new THREE.Quaternion().setFromAxisAngle(yAxis, this.inputs.panAngle).premultiply(rootRotation);
|
|
200
191
|
// a track that has delays at the start and end for 5% of the animation
|
|
201
|
-
const track = new QuaternionKeyframeTrack('.quaternion', [
|
|
192
|
+
const track = new THREE.QuaternionKeyframeTrack('.quaternion', [
|
|
202
193
|
0, this.inputs.panPeriod * 0.05, this.inputs.panPeriod * 0.95, this.inputs.panPeriod
|
|
203
194
|
], [
|
|
204
195
|
frame0.x, frame0.y, frame0.z, frame0.w,
|
|
@@ -206,13 +197,12 @@ export class SecurityCamera extends SceneComponent {
|
|
|
206
197
|
frame1.x, frame1.y, frame1.z, frame1.w,
|
|
207
198
|
frame1.x, frame1.y, frame1.z, frame1.w,
|
|
208
199
|
]);
|
|
209
|
-
const clip = new AnimationClip('panning', this.inputs.panPeriod, [track]);
|
|
200
|
+
const clip = new THREE.AnimationClip('panning', this.inputs.panPeriod, [track]);
|
|
210
201
|
// There is no api to change the rotation of the root, so we will use a private property to access the Object3D.
|
|
211
202
|
// This will likely need to change in the future.
|
|
212
|
-
this.mixer = new AnimationMixer(this.context.root.obj3D);
|
|
213
|
-
// this.mixer = new AnimationMixer(this.root);
|
|
203
|
+
this.mixer = new THREE.AnimationMixer(this.context.root.obj3D);
|
|
214
204
|
const action = this.mixer.clipAction(clip);
|
|
215
|
-
action.loop = LoopPingPong;
|
|
205
|
+
action.loop = THREE.LoopPingPong;
|
|
216
206
|
action.play();
|
|
217
207
|
}
|
|
218
208
|
}
|
|
@@ -256,4 +246,4 @@ export const securityCameraType = 'mp.securityCamera';
|
|
|
256
246
|
export const makeSecurityCamera = function () {
|
|
257
247
|
return new SecurityCamera();
|
|
258
248
|
};
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHlDYW1lcmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy9zZWN1cml0eS1jYW1lcmEvU2VjdXJpdHlDYW1lcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsY0FBYyxFQUVkLGFBQWEsRUFDYixjQUFjLEVBQ2QsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLHNCQUFzQixFQUN0QixRQUFRLEVBQ1IsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsdUJBQXVCLEVBQ3ZCLGFBQWEsRUFDYixZQUFZLEVBQ2IsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEtBQUssbUJBQW1CLE1BQU0saURBQWlELENBQUE7QUFDdEYsT0FBTyxFQUFtQixjQUFjLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQXFCbkYsTUFBTSxPQUFPLGNBQWUsU0FBUSxjQUFjO0lBQWxEOztRQUNVLGNBQVMsR0FBb0IsSUFBSSxDQUFDO1FBQ2xDLFNBQUksR0FBb0IsSUFBSSxDQUFDO1FBQzdCLFVBQUssR0FBb0IsSUFBSSxDQUFDO1FBQzlCLFFBQUcsR0FBZ0IsSUFBSSxDQUFDO1FBQ3hCLFVBQUssR0FBZ0IsSUFBSSxDQUFDO1FBRTFCLGNBQVMsR0FBZ0IsSUFBSSxDQUFDO1FBQzlCLHNCQUFpQixHQUFzQjtZQUM3QyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFBQztZQUMzQixZQUFZLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBQztZQUNwQyxXQUFXLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxPQUFPLEVBQUUs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QUE4RTtJQUM5RSw0Q0FBNEM7SUFDNUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDcEQsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNsRSxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN4RyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFDdEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQzlCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9iamVjdDNELFxuICBNZXNoLFxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsXG4gIEJveEdlb21ldHJ5LFxuICBTaGFkZXJNYXRlcmlhbCxcbiAgTGluZUJhc2ljTWF0ZXJpYWwsXG4gIEVkZ2VzR2VvbWV0cnksXG4gIEFuaW1hdGlvbk1peGVyLFxuICBDb2xvcixcbiAgTWF0cml4NCxcbiAgVmVjdG9yMyxcbiAgRXVsZXIsXG4gIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksXG4gIEJhY2tTaWRlLFxuICBOb3JtYWxCbGVuZGluZyxcbiAgQWRkaXRpdmVCbGVuZGluZyxcbiAgUXVhdGVybmlvbixcbiAgUXVhdGVybmlvbktleWZyYW1lVHJhY2ssXG4gIEFuaW1hdGlvbkNsaXAsXG4gIExvb3BQaW5nUG9uZ1xufSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgKiBhcyBCdWZmZXJHZW9tZXRyeVV0aWxzIGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS91dGlscy9CdWZmZXJHZW9tZXRyeVV0aWxzLmpzJ1xuaW1wb3J0IHtDb21wb25lbnRDb250ZXh0LCBTY2VuZUNvbXBvbmVudH0gZnJvbSAnLi4vc2NlbmUtY29tcG9uZW50L1NjZW5lQ29tcG9uZW50JztcblxuaW50ZXJmYWNlIElucHV0cyB7XG4gIG5lYXJQbGFuZTogbnVtYmVyO1xuICBmYXJQbGFuZTogbnVtYmVyLFxuICBob3Jpem9udGFsRk9WOiBudW1iZXIsXG4gIGFzcGVjdDogbnVtYmVyLFxuICBsb2NhbFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXI7IH07XG4gIGxvY2FsUm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcjsgfTtcbiAgY29sb3I6IG51bWJlcjtcbiAgcGFuUGVyaW9kOiBudW1iZXI7XG4gIHBhbkFuZ2xlOiBudW1iZXI7XG59XG5cbnR5cGUgSGlnaGxpZ2h0VW5pZm9ybXMgPSB7XG4gIGNvbG9yOiB7IHZhbHVlOiBDb2xvciB9LFxuICBwcm9qUG9zaXRpb246IHsgdmFsdWU6IFZlY3RvcjMgfTtcbiAgbGlnaHRNYXRyaXg6IHsgdmFsdWU6IE1hdHJpeDQgfTtcbn1cblxuXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlDYW1lcmEgZXh0ZW5kcyBTY2VuZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcm9vdFNjZW5lOiBPYmplY3QzRCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJvb3Q6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGl2b3Q6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm94OiBNZXNoIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRnZXM6IE1lc2ggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcm9qZWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhO1xuICBwcml2YXRlIGhpZ2hsaWdodDogTWVzaCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhpZ2hsaWdodFVuaWZvcm1zOiBIaWdobGlnaHRVbmlmb3JtcyA9IHtcbiAgICBjb2xvcjoge3ZhbHVlOiBuZXcgQ29sb3IoKX0sXG4gICAgcHJvalBvc2l0aW9uOiB7dmFsdWU6IG5ldyBWZWN0b3IzKCl9LFxuICAgIGxpZ2h0TWF0cml4OiB7dmFsdWU6IG5ldyBNYXRyaXg0KCl9LFxuICB9XG4gIHByaXZhdGUgbWl4ZXI6IEFuaW1hdGlvbk1peGVyO1xuXG4gIG92ZXJyaWRlIGlucHV0czogSW5wdXRzID0ge1xuICAgIG5lYXJQbGFuZTogMC4xLFxuICAgIGZhclBsYW5lOiA0LFxuICAgIGhvcml6b250YWxGT1Y6IDgwLFxuICAgIGFzcGVjdDogMTYgLyA5LFxuICAgIGxvY2FsUG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICBsb2NhbFJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAgY29sb3I6IDB4ZmZmZmZmLFxuICAgIHBhblBlcmlvZDogMjAsXG4gICAgcGFuQW5nbGU6IDE4MCxcbiAgfTtcblxuICBvdmVycmlkZSBvdXRwdXRzOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IFNjZW5lQ29tcG9uZW50O1xuXG5cbiAgc2V0Q29tcG9uZW50KGNvbXBvbmVudDogU2NlbmVDb21wb25lbnQpIHtcbiAgICBjb21wb25lbnQub25UaWNrID0gdGhpcy5vblRpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLmNvbnRleHQgPSBjb21wb25lbnQuY29udGV4dDtcbiAgfVxuXG4gIHNldFJvb3RTY2VuZShyb290U2NlbmU6IE9iamVjdDNEKSB7XG4gICAgdGhpcy5yb290U2NlbmUgPSByb290U2NlbmU7XG4gIH1cblxuICBvdmVycmlkZSBvbkluaXQobW9kZWxOb2RlPzogYW55KSB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IHtcbiAgICAgICAgcm9vdDogbW9kZWxOb2RlXG4gICAgICB9IGFzIENvbXBvbmVudENvbnRleHQ7XG4gICAgfVxuXG4gICAgdGhpcy5yb290ID0gbmV3IE9iamVjdDNEKCk7XG4gICAgdGhpcy5waXZvdCA9IG5ldyBPYmplY3QzRCgpO1xuICAgIHRoaXMucm9vdC5hZGQodGhpcy5waXZvdCk7XG4gICAgdGhpcy5vdXRwdXRzLm9iamVjdFJvb3QgPSB0aGlzLnJvb3Q7XG5cbiAgICB0aGlzLnJvb3QucG9zaXRpb24uc2V0KHRoaXMuaW5wdXRzLmxvY2FsUG9zaXRpb24ueCwgdGhpcy5pbnB1dHMubG9jYWxQb3NpdGlvbi55LCB0aGlzLmlucHV0cy5sb2NhbFBvc2l0aW9uLnopO1xuXG4gICAgY29uc3QgZXVsZXIgPSBuZXcgRXVsZXIodGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi54ICogTWF0aC5QSSAvIDE4MCwgdGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi55ICogTWF0aC5QSSAvIDE4MCwgdGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi56ICogTWF0aC5QSSAvIDE4MCwgJ1lYWicpO1xuICAgIHRoaXMucGl2b3QucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoZXVsZXIpO1xuXG4gICAgY29uc3QgYXNwZWN0ID0gdGhpcy5pbnB1dHMuYXNwZWN0O1xuICAgIGNvbnN0IERFRzJSQUQgPSBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IFJBRDJERUcgPSAxIC8gREVHMlJBRDtcbiAgICBjb25zdCB2ZXJ0aWNhbEZPViA9IDIgKiBNYXRoLmF0YW4oMSAvIGFzcGVjdCAqIE1hdGgudGFuKDAuNSAqIHRoaXMuaW5wdXRzLmhvcml6b250YWxGT1YgKiBERUcyUkFEKSkgKiBSQUQyREVHO1xuICAgIHRoaXMucHJvamVjdG9yID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHZlcnRpY2FsRk9WLCBhc3BlY3QsIHRoaXMuaW5wdXRzLm5lYXJQbGFuZSwgdGhpcy5pbnB1dHMuZmFyUGxhbmUpO1xuICAgIC8vIG9yaWVudGF0aW9uIG9mIHRoZSBwcm9qZWN0b3IgaXMgaGFuZGxlZCBieSB0aGUgcGl2b3RcbiAgICB0aGlzLnBpdm90LmFkZCh0aGlzLnByb2plY3Rvcik7XG5cbiAgICB0aGlzLm1ha2VGcnVzdHVtVmlzdWFscygpO1xuXG4gICAgdGhpcy5waXZvdC5hZGQodGhpcy5ib3gpO1xuICAgIHRoaXMucGl2b3QuYWRkKHRoaXMuZWRnZXMpO1xuXG4gICAgdGhpcy5tYWtlSGlnaGxpZ2h0KCk7XG5cbiAgICAvLyBhdHRhY2ggaGlnaGlnaHRpbmcgdG8gdGhlIG1lc2ggaXQgcmVwcmVzZW50c1xuICAgIC8vIFRPRE8gKHNjZW5lIHF1ZXJ5KTogdGhpcyBpcyB2ZXJ5IGJyaXR0bGUgYnV0IGlzIHRoZSBvbmx5IHdheSB0byBhdHRhY2ggc29tZXRoaW5nIHRvIGEgcm9vbSBvZiB0aGUgbW9kZWxcbiAgICAvLyB0aGlzLm91dHB1dHMub2JqZWN0Um9vdC5wYXJlbnQucGFyZW50LmFkZCh0aGlzLmhpZ2hsaWdodCk7IC8vIGxlZ2FjeSBtYXR0ZXJwb3J0IGNvZGVcbiAgICB0aGlzLnJvb3RTY2VuZS5hZGQodGhpcy5oaWdobGlnaHQpO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBhbmltYXRpb24gbWl4ZXIgdG8gcm90YXRlIHRoZSBjYW1lcmFcbiAgICB0aGlzLm1ha2VBbmltYXRpb24oKTtcbiAgfVxuXG5cbiAgb3ZlcnJpZGUgb25UaWNrKGRlbHRhOiBudW1iZXIpIHtcbiAgICB1cGRhdGVIaWdobGlnaHRVbmlmb3Jtcyh0aGlzLnByb2plY3RvciwgdGhpcy5oaWdobGlnaHRVbmlmb3Jtcyk7XG4gICAgaWYgKHRoaXMubWl4ZXIpIHtcbiAgICAgIHRoaXMubWl4ZXIudXBkYXRlKGRlbHRhIC8gMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgb25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmhpZ2hsaWdodCAmJiB0aGlzLmhpZ2hsaWdodC5wYXJlbnQpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0LnBhcmVudC5yZW1vdmUodGhpcy5oaWdobGlnaHQpO1xuICAgICAgKHRoaXMuaGlnaGxpZ2h0Lm1hdGVyaWFsIGFzIFNoYWRlck1hdGVyaWFsKS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XG4gICAgICB0aGlzLmVkZ2VzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcbiAgICAgICh0aGlzLmVkZ2VzLm1hdGVyaWFsIGFzIExpbmVCYXNpY01hdGVyaWFsKS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJveCkge1xuICAgICAgdGhpcy5ib3guZ2VvbWV0cnkuZGlzcG9zZSgpO1xuICAgICAgKHRoaXMuYm94Lm1hdGVyaWFsIGFzIE1lc2hCYXNpY01hdGVyaWFsKS5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlRnJ1c3R1bVZpc3VhbHMoKSB7XG4gICAgaWYgKHRoaXMuYm94KSB7XG4gICAgICB0aGlzLnJvb3QucmVtb3ZlKHRoaXMuYm94KTtcbiAgICAgICh0aGlzLmJveC5tYXRlcmlhbCBhcyBNZXNoQmFzaWNNYXRlcmlhbCkuZGlzcG9zZSgpO1xuICAgICAgKHRoaXMuYm94Lmdlb21ldHJ5IGFzIEJveEdlb21ldHJ5KS5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmJveCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XG4gICAgICB0aGlzLnJvb3QucmVtb3ZlKHRoaXMuZWRnZXMpO1xuICAgICAgKHRoaXMuZWRnZXMubWF0ZXJpYWwgYXMgTGluZUJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICAgICh0aGlzLmVkZ2VzLmdlb21ldHJ5IGFzIEVkZ2VzR2VvbWV0cnkpLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuZWRnZXMgPSBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVkZ2VzVG9DeWxpbmRlcnMoZWRnZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRyeSwgdGhpY2tuZXNzOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IHtwb3NpdGlvbn0gPSBlZGdlc0dlb21ldHJ5LmF0dHJpYnV0ZXM7XG4gICAgICBjb25zdCB7YXJyYXksIGNvdW50fSA9IHBvc2l0aW9uO1xuICAgICAgY29uc3QgciA9IHRoaWNrbmVzcyAvIDI7XG4gICAgICBjb25zdCBnZW9tcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudCAqIDMgLSAxOyBpICs9IDYpIHtcbiAgICAgICAgY29uc3QgYSA9IG5ldyBWZWN0b3IzKGFycmF5W2ldLCBhcnJheVtpICsgMV0sIGFycmF5W2kgKyAyXSk7XG4gICAgICAgIGNvbnN0IGIgPSBuZXcgVmVjdG9yMyhhcnJheVtpICsgM10sIGFycmF5W2kgKyA0XSwgYXJyYXlbaSArIDVdKTtcblxuICAgICAgICBjb25zdCB2ZWMgPSBuZXcgVmVjdG9yMygpLnN1YlZlY3RvcnMoYiwgYSk7XG4gICAgICAgIGNvbnN0IGxlbiA9IHZlYy5sZW5ndGgoKTtcbiAgICAgICAgY29uc3QgZ2VvbSA9IG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KHIsIHIsIGxlbiwgOCk7XG4gICAgICAgIGdlb20udHJhbnNsYXRlKDAsIGxlbiAvIDIsIDApO1xuICAgICAgICBnZW9tLnJvdGF0ZVgoTWF0aC5QSSAvIDIpO1xuICAgICAgICBnZW9tLmxvb2tBdCh2ZWMpO1xuICAgICAgICBnZW9tLnRyYW5zbGF0ZShhLngsIGEueSwgYS56KTtcbiAgICAgICAgZ2VvbXMucHVzaChnZW9tKTtcbiAgICAgIH1cbiAgICAgIC8vIEFQSSB0byBiZSB1cGRhdGVkIGluIGJ1bmRsZSAtIEpTU0RLLTEyMjJcbiAgICAgIHJldHVybiBCdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlQnVmZmVyR2VvbWV0cmllcyhnZW9tcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZnJ1c3R1bUxlbmd0aCA9IHRoaXMuaW5wdXRzLmZhclBsYW5lIC0gdGhpcy5pbnB1dHMubmVhclBsYW5lO1xuICAgIGNvbnN0IGJveEdlb21ldHJ5OiBCb3hHZW9tZXRyeSA9IG5ldyBCb3hHZW9tZXRyeSgyLCAyLCBmcnVzdHVtTGVuZ3RoKTtcbiAgICBjb25zdCBoYWxmSEFuZ2xlID0gdGhpcy5pbnB1dHMuaG9yaXpvbnRhbEZPViAqIDAuNSAqIE1hdGguUEkgLyAxODA7XG4gICAgY29uc3QgbmVhckhhbGZXaWR0aCA9IE1hdGgudGFuKGhhbGZIQW5nbGUpICogdGhpcy5pbnB1dHMubmVhclBsYW5lO1xuICAgIGNvbnN0IGZhckhhbGZXaWR0aCA9IE1hdGgudGFuKGhhbGZIQW5nbGUpICogdGhpcy5pbnB1dHMuZmFyUGxhbmU7XG4gICAgY29uc3QgbmVhckhhbGZIZWlnaHQgPSBuZWFySGFsZldpZHRoIC8gdGhpcy5pbnB1dHMuYXNwZWN0O1xuICAgIGNvbnN0IGZhckhhbGZIZWlnaHQgPSBmYXJIYWxmV2lkdGggLyB0aGlzLmlucHV0cy5hc3BlY3Q7XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSBib3hHZW9tZXRyeS5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB2ZXJ0ZXhaID0gcG9zaXRpb25zLmdldFooaSk7XG4gICAgICBjb25zdCB2ZXJ0ZXhYID0gcG9zaXRpb25zLmdldFgoaSk7XG4gICAgICBjb25zdCB2ZXJ0ZXhZID0gcG9zaXRpb25zLmdldFkoaSk7XG4gICAgICBpZiAodmVydGV4WiA+IDApIHtcbiAgICAgICAgLy8gYmFjayBvZiB0aGUgY2FtZXJhXG4gICAgICAgIHBvc2l0aW9ucy5zZXRYKGksIHZlcnRleFggKiBuZWFySGFsZldpZHRoKVxuICAgICAgICBwb3NpdGlvbnMuc2V0WShpLCB2ZXJ0ZXhZICogbmVhckhhbGZIZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZnJvbnQgb2YgdGhlIGNhbWVyYVxuICAgICAgICBwb3NpdGlvbnMuc2V0WChpLCB2ZXJ0ZXhYICogZmFySGFsZldpZHRoKVxuICAgICAgICBwb3NpdGlvbnMuc2V0WShpLCB2ZXJ0ZXhZICogZmFySGFsZkhlaWdodCk7XG4gICAgICB9XG4gICAgICBwb3NpdGlvbnMuc2V0WihpLCB2ZXJ0ZXhaIC0gMC41ICogZnJ1c3R1bUxlbmd0aCAtIHRoaXMuaW5wdXRzLm5lYXJQbGFuZSk7XG4gICAgfVxuXG4gICAgdmFyIGJveE1hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogdGhpcy5pbnB1dHMuY29sb3IsXG4gICAgICBvcGFjaXR5OiAwLjA1LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBzaWRlOiBCYWNrU2lkZSxcbiAgICAgIGJsZW5kaW5nOiBOb3JtYWxCbGVuZGluZyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuYm94ID0gbmV3IE1lc2goYm94R2VvbWV0cnksIGJveE1hdGVyaWFsKTtcbiAgICBjb25zdCBlZGdlc0dlb21ldHJ5ID0gZWRnZXNUb0N5bGluZGVycyhuZXcgRWRnZXNHZW9tZXRyeShib3hHZW9tZXRyeSksIDAuMDE1KTtcbiAgICB0aGlzLmVkZ2VzID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcbiAgICAgIGNvbG9yOiAweGZmZmZmZixcbiAgICAgIG9wYWNpdHk6IDAuMjUsXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgIGJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZWRnZXNHZW9tZXRyeTIgPSBlZGdlc1RvQ3lsaW5kZXJzKG5ldyBFZGdlc0dlb21ldHJ5KGJveEdlb21ldHJ5KSwgMC4wNik7XG4gICAgY29uc3QgZWRnZXMyID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogdGhpcy5pbnB1dHMuY29sb3IsXG4gICAgICBvcGFjaXR5OiAwLjA1LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBibGVuZGluZzogQWRkaXRpdmVCbGVuZGluZyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgIH0pKTtcbiAgICB0aGlzLnBpdm90LmFkZChlZGdlczIpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlSGlnaGxpZ2h0KCkge1xuXG4gICAgLy8gVE9ETyAoc2NlbmUgcXVlcnkpOiB0aGlzIGlzIHZlcnkgYnJpdHRsZSBhbmQgaGFyZGNvZGVkIGJ1dCBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IHJvb20gZ2VvbWV0cmllcyB1bnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHdheSB0byBxdWVyeSB0aGUgc2NlbmUgZ3JhcGhcbiAgICAvLyBjb25zdCBmbG9vck1lc2ggPSB0aGlzLm91dHB1dHMub2JqZWN0Um9vdC5wYXJlbnQucGFyZW50LmdldE9iamVjdEJ5TmFtZSgnRmxvb3JNZXNoOjAnKTsgLy8gbGVnYWN5IG1hdHRlcnBvcnQgY29kZS4uXG4gICAgY29uc3QgZmxvb3JNZXNoID0gdGhpcy5yb290U2NlbmUuZ2V0T2JqZWN0QnlOYW1lKCdGbG9vck1lc2g6MCcpO1xuICAgIGNvbnN0IHJvb21NZXNoID0gZmxvb3JNZXNoLmNoaWxkcmVuWzBdIGFzIE1lc2g7XG5cbiAgICB1cGRhdGVIaWdobGlnaHRVbmlmb3Jtcyh0aGlzLnByb2plY3RvciwgdGhpcy5oaWdobGlnaHRVbmlmb3Jtcyk7XG4gICAgdGhpcy5oaWdobGlnaHRVbmlmb3Jtcy5jb2xvci52YWx1ZS5zZXRIZXgodGhpcy5pbnB1dHMuY29sb3IpO1xuXG4gICAgY29uc3Qgc2hhZGVyID0gbmV3IFNoYWRlck1hdGVyaWFsKHtcbiAgICAgIHBvbHlnb25PZmZzZXQ6IHRydWUsXG4gICAgICBwb2x5Z29uT2Zmc2V0VW5pdHM6IC0wLjEsXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgIHVuaWZvcm1zOiB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zLFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXhTaGFkZXIoKSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudFNoYWRlcigpLFxuICAgIH0pO1xuXG4gICAgLy8gYSBtZXNoIHRvIHJlcHJlc2VudCB0aGUgXCJoaWdobGlnaHRcIlxuICAgIHRoaXMuaGlnaGxpZ2h0ID0gbmV3IE1lc2gocm9vbU1lc2guZ2VvbWV0cnksIHNoYWRlcik7XG5cblxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlQW5pbWF0aW9uKCkge1xuXG4gICAgLy8gcHJlYXBwbHkgdGhlIGluaXRpYWwgcm90YXRpb24gb2YgdGhlIHJvb3Qgc28gdGhhdCBwYW5BbmdsZSBpcyByZWxhdGl2ZSB0byBpdC5cblxuICAgIC8vIFRPRE86IGZpeCBpdCFcbiAgICBjb25zdCByb290Um90YXRpb24gPSB0aGlzLmNvbnRleHQucm9vdC5xdWF0ZXJuaW9uOyAvLyBsZWdhY3kgbWF0dGVycG9ydCBjb2RlXG4gICAgLy8gY29uc3Qgcm9vdFJvdGF0aW9uID0gdGhpcy5yb290LnF1YXRlcm5pb247XG5cbiAgICBjb25zdCB5QXhpcyA9IG5ldyBWZWN0b3IzKDAsIDEsIDApO1xuICAgIGNvbnN0IGZyYW1lMCA9IG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbUF4aXNBbmdsZSh5QXhpcywgMCkucHJlbXVsdGlwbHkocm9vdFJvdGF0aW9uKTtcbiAgICBjb25zdCBmcmFtZTEgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21BeGlzQW5nbGUoeUF4aXMsIHRoaXMuaW5wdXRzLnBhbkFuZ2xlKS5wcmVtdWx0aXBseShyb290Um90YXRpb24pO1xuXG4gICAgLy8gYSB0cmFjayB0aGF0IGhhcyBkZWxheXMgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgZm9yIDUlIG9mIHRoZSBhbmltYXRpb25cbiAgICBjb25zdCB0cmFjayA9IG5ldyBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaygnLnF1YXRlcm5pb24nLCBbXG4gICAgICAwLCB0aGlzLmlucHV0cy5wYW5QZXJpb2QgKiAwLjA1LCB0aGlzLmlucHV0cy5wYW5QZXJpb2QgKiAwLjk1LCB0aGlzLmlucHV0cy5wYW5QZXJpb2RcbiAgICBdLCBbXG4gICAgICBmcmFtZTAueCwgZnJhbWUwLnksIGZyYW1lMC56LCBmcmFtZTAudyxcbiAgICAgIGZyYW1lMC54LCBmcmFtZTAueSwgZnJhbWUwLnosIGZyYW1lMC53LFxuICAgICAgZnJhbWUxLngsIGZyYW1lMS55LCBmcmFtZTEueiwgZnJhbWUxLncsXG4gICAgICBmcmFtZTEueCwgZnJhbWUxLnksIGZyYW1lMS56LCBmcmFtZTEudyxcbiAgICBdKTtcblxuICAgIGNvbnN0IGNsaXAgPSBuZXcgQW5pbWF0aW9uQ2xpcCgncGFubmluZycsIHRoaXMuaW5wdXRzLnBhblBlcmlvZCwgW3RyYWNrXSk7XG5cbiAgICAvLyBUaGVyZSBpcyBubyBhcGkgdG8gY2hhbmdlIHRoZSByb3RhdGlvbiBvZiB0aGUgcm9vdCwgc28gd2Ugd2lsbCB1c2UgYSBwcml2YXRlIHByb3BlcnR5IHRvIGFjY2VzcyB0aGUgT2JqZWN0M0QuXG4gICAgLy8gVGhpcyB3aWxsIGxpa2VseSBuZWVkIHRvIGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuICAgIHRoaXMubWl4ZXIgPSBuZXcgQW5pbWF0aW9uTWl4ZXIoKHRoaXMuY29udGV4dC5yb290IGFzIGFueSkub2JqM0QpOyAvLyBsZWdhY29kZSBjb2RlIG1hdHRlcnBvcnRcbiAgICAvLyB0aGlzLm1peGVyID0gbmV3IEFuaW1hdGlvbk1peGVyKHRoaXMucm9vdCk7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5taXhlci5jbGlwQWN0aW9uKGNsaXApO1xuICAgIGFjdGlvbi5sb29wID0gTG9vcFBpbmdQb25nO1xuICAgIGFjdGlvbi5wbGF5KCk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiB2ZXJ0ZXhTaGFkZXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICB1bmlmb3JtIG1hdDQgbGlnaHRNYXRyaXg7XG5cbiAgICB2YXJ5aW5nIHZlYzQgdkxpZ2h0Q29vcmRzO1xuXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgLy8gY3JlYXRlIGEgVVYgcmVnaW9uIFswLDFdIHggWzAsMV0gdG8gcmVwcmVzZW50IHdoYXQgdGhlIGxpZ2h0TWF0cml4IFwic2Vlc1wiXG4gICAgICB2TGlnaHRDb29yZHMgPSBsaWdodE1hdHJpeCAqICBtb2RlbE1hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZnJhZ21lbnRTaGFkZXIoKSB7XG4gIHJldHVybiBgXG4gICAgdW5pZm9ybSB2ZWMzIGNvbG9yO1xuXG4gICAgdmFyeWluZyB2ZWM0IHZMaWdodENvb3JkcztcblxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIHZlYzIgbGlnaHRVViA9IHZMaWdodENvb3Jkcy54eSAvIHZMaWdodENvb3Jkcy53O1xuICAgICAgZmxvYXQgaW5WaWV3ID0gZmxvYXQobWF4KGxpZ2h0VVYueCwgbGlnaHRVVi55KSA8PSAxLjAgJiYgbWluKGxpZ2h0VVYueCwgbGlnaHRVVi55KSA+PSAwLjAgJiYgdkxpZ2h0Q29vcmRzLnogPiAwLjApO1xuXG4gICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCBtaW4oaW5WaWV3LCAwLjIpKTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhpZ2hsaWdodFVuaWZvcm1zKHByb2plY3RvcjogUGVyc3BlY3RpdmVDYW1lcmEsIHVuaWZvcm1zOiBIaWdobGlnaHRVbmlmb3Jtcykge1xuICBwcm9qZWN0b3IuZ2V0V29ybGRQb3NpdGlvbih1bmlmb3Jtcy5wcm9qUG9zaXRpb24udmFsdWUpO1xuXG4gIC8vIHNpbWlsYXIgdG8gYSBzaGFkb3cgbWF0cml4LCBidXQgd2UncmUgdXNpbmcgaXQgYXMgYSBcInJlY3Rhbmd1bGFyXCIgc3BvdGxpZ2h0XG4gIC8vIFtsaWdodEJpYXNdICogW3Byb2plY3Rpb25dICogW3ZpZXdNYXRyaXhdXG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLm1ha2VTY2FsZSgwLjUsIDAuNSwgMC41KTtcbiAgdW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUuc2V0UG9zaXRpb24obmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSkpXG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLm11bHRpcGx5TWF0cmljZXModW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUsIHByb2plY3Rvci5wcm9qZWN0aW9uTWF0cml4KTtcbiAgdW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUubXVsdGlwbHlNYXRyaWNlcyh1bmlmb3Jtcy5saWdodE1hdHJpeC52YWx1ZSwgcHJvamVjdG9yLm1hdHJpeFdvcmxkSW52ZXJzZSk7XG59XG5cbmV4cG9ydCBjb25zdCBzZWN1cml0eUNhbWVyYVR5cGUgPSAnbXAuc2VjdXJpdHlDYW1lcmEnO1xuZXhwb3J0IGNvbnN0IG1ha2VTZWN1cml0eUNhbWVyYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBTZWN1cml0eUNhbWVyYSgpO1xufVxuIl19
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHlDYW1lcmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy9zZWN1cml0eS1jYW1lcmEvU2VjdXJpdHlDYW1lcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdXLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUN4QyxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBQyxjQUFjLEVBQWEsTUFBTSxtQ0FBbUMsQ0FBQztBQTJCN0UsTUFBTSxPQUFPLGNBQWUsU0FBUSxjQUFjO0lBQWxEOztRQUNVLFNBQUksR0FBb0IsSUFBSSxDQUFDO1FBQzdCLFVBQUssR0FBb0IsSUFBSSxDQUFDO1FBQzlCLFFBQUcsR0FBZ0IsSUFBSSxDQUFDO1FBQ3hCLFVBQUssR0FBZ0IsSUFBSSxDQUFDO1FBRTFCLGNBQVMsR0FBZ0IsSUFBSSxDQUFDO1FBQzlCLHNCQUFpQixHQUFzQjtZQUM3QyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFBQztZQUMzQixZQUFZLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBQztZQUNwQyxXQUFXLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBQztTQUNwQyxDQUFBO1FBR1EsV0FBTSxHQUFXO1lBQ3hCLFNBQVMsRUFBRSxHQUFHO1lBQ2QsUUFBUSxFQUFFLENBQUM7WUFDWCxhQUFhLEVBQUUsRUFBRTtZQUNqQixNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUM7WUFDZCxhQUFhLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQztZQUNqQyxhQUFhLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFB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RUQsU0FBUyx1QkFBdUIsQ0FBQyxTQUE0QixFQUFFLFFBQTJCO0lBQ3hGLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXhELDhFQUE4RTtJQUM5RSw0Q0FBNEM7SUFDNUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDcEQsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNsRSxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN4RyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFDdEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQzlCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9iamVjdDNELCBNZXNoLCBQZXJzcGVjdGl2ZUNhbWVyYSxcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsIEJveEdlb21ldHJ5LCBTaGFkZXJNYXRlcmlhbCwgTGluZUJhc2ljTWF0ZXJpYWwsIEVkZ2VzR2VvbWV0cnksXG4gIEFuaW1hdGlvbk1peGVyLCBDb2xvciwgTWF0cml4NCwgVmVjdG9yM1xufSBmcm9tICd0aHJlZSc7XG5pbXBvcnQge1NjZW5lQ29tcG9uZW50LCBJU2NlbmVOb2RlfSBmcm9tICcuLi9zY2VuZS1jb21wb25lbnQvU2NlbmVDb21wb25lbnQnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIFRIUkVFOiBhbnk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIElucHV0cyB7XG4gIG5lYXJQbGFuZTogbnVtYmVyO1xuICBmYXJQbGFuZTogbnVtYmVyLFxuICBob3Jpem9udGFsRk9WOiBudW1iZXIsXG4gIGFzcGVjdDogbnVtYmVyLFxuICBsb2NhbFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXI7IH07XG4gIGxvY2FsUm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcjsgfTtcbiAgY29sb3I6IG51bWJlcjtcbiAgcGFuUGVyaW9kOiBudW1iZXI7XG4gIHBhbkFuZ2xlOiBudW1iZXI7XG59XG5cbnR5cGUgSGlnaGxpZ2h0VW5pZm9ybXMgPSB7XG4gIGNvbG9yOiB7IHZhbHVlOiBDb2xvciB9LFxuICBwcm9qUG9zaXRpb246IHsgdmFsdWU6IFZlY3RvcjMgfTtcbiAgbGlnaHRNYXRyaXg6IHsgdmFsdWU6IE1hdHJpeDQgfTtcbn1cblxuXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlDYW1lcmEgZXh0ZW5kcyBTY2VuZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcm9vdDogT2JqZWN0M0QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwaXZvdDogT2JqZWN0M0QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBib3g6IE1lc2ggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlZGdlczogTWVzaCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByb2plY3RvcjogUGVyc3BlY3RpdmVDYW1lcmE7XG4gIHByaXZhdGUgaGlnaGxpZ2h0OiBNZXNoIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaGlnaGxpZ2h0VW5pZm9ybXM6IEhpZ2hsaWdodFVuaWZvcm1zID0ge1xuICAgIGNvbG9yOiB7dmFsdWU6IG5ldyBDb2xvcigpfSxcbiAgICBwcm9qUG9zaXRpb246IHt2YWx1ZTogbmV3IFZlY3RvcjMoKX0sXG4gICAgbGlnaHRNYXRyaXg6IHt2YWx1ZTogbmV3IE1hdHJpeDQoKX0sXG4gIH1cbiAgcHJpdmF0ZSBtaXhlcjogQW5pbWF0aW9uTWl4ZXI7XG5cbiAgb3ZlcnJpZGUgaW5wdXRzOiBJbnB1dHMgPSB7XG4gICAgbmVhclBsYW5lOiAwLjEsXG4gICAgZmFyUGxhbmU6IDQsXG4gICAgaG9yaXpvbnRhbEZPVjogODAsXG4gICAgYXNwZWN0OiAxNiAvIDksXG4gICAgbG9jYWxQb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgIGxvY2FsUm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgcGFuUGVyaW9kOiAyMCxcbiAgICBwYW5BbmdsZTogMTgwLFxuICB9O1xuXG4gIG92ZXJyaWRlIG91dHB1dHM6IGFueSA9IHt9O1xuXG5cbiAgb3ZlcnJpZGUgb25Jbml0KCkge1xuICAgIGNvbnN0IFRIUkVFID0gdGhpcy5jb250ZXh0LnRocmVlO1xuXG4gICAgdGhpcy5yb290ID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XG4gICAgdGhpcy5waXZvdCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xuICAgIHRoaXMucm9vdC5hZGQodGhpcy5waXZvdCk7XG4gICAgdGhpcy5vdXRwdXRzLm9iamVjdFJvb3QgPSB0aGlzLnJvb3Q7XG4gICAgdGhpcy5yb290LnBvc2l0aW9uLnNldCh0aGlzLmlucHV0cy5sb2NhbFBvc2l0aW9uLngsIHRoaXMuaW5wdXRzLmxvY2FsUG9zaXRpb24ueSwgdGhpcy5pbnB1dHMubG9jYWxQb3NpdGlvbi56KTtcblxuICAgIGNvbnN0IGV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueCAqIE1hdGguUEkgLyAxODAsIHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueSAqIE1hdGguUEkgLyAxODAsIHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueiAqIE1hdGguUEkgLyAxODAsICdZWFonKTtcbiAgICB0aGlzLnBpdm90LnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKGV1bGVyKTtcblxuICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMuaW5wdXRzLmFzcGVjdDtcbiAgICBjb25zdCBERUcyUkFEID0gTWF0aC5QSSAvIDE4MDtcbiAgICBjb25zdCBSQUQyREVHID0gMSAvIERFRzJSQUQ7XG4gICAgY29uc3QgdmVydGljYWxGT1YgPSAyICogTWF0aC5hdGFuKDEgLyBhc3BlY3QgKiBNYXRoLnRhbigwLjUgKiB0aGlzLmlucHV0cy5ob3Jpem9udGFsRk9WICogREVHMlJBRCkpICogUkFEMkRFRztcbiAgICB0aGlzLnByb2plY3RvciA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSh2ZXJ0aWNhbEZPViwgYXNwZWN0LCB0aGlzLmlucHV0cy5uZWFyUGxhbmUsIHRoaXMuaW5wdXRzLmZhclBsYW5lKTtcbiAgICAvLyBvcmllbnRhdGlvbiBvZiB0aGUgcHJvamVjdG9yIGlzIGhhbmRsZWQgYnkgdGhlIHBpdm90XG4gICAgdGhpcy5waXZvdC5hZGQodGhpcy5wcm9qZWN0b3IpO1xuXG4gICAgdGhpcy5tYWtlRnJ1c3R1bVZpc3VhbHMoKTtcblxuICAgIHRoaXMucGl2b3QuYWRkKHRoaXMuYm94KTtcbiAgICB0aGlzLnBpdm90LmFkZCh0aGlzLmVkZ2VzKTtcblxuICAgIHRoaXMubWFrZUhpZ2hsaWdodCgpO1xuXG4gICAgLy8gYXR0YWNoIGhpZ2hpZ2h0aW5nIHRvIHRoZSBtZXNoIGl0IHJlcHJlc2VudHNcbiAgICAvLyBUT0RPIChzY2VuZSBxdWVyeSk6IHRoaXMgaXMgdmVyeSBicml0dGxlIGJ1dCBpcyB0aGUgb25seSB3YXkgdG8gYXR0YWNoIHNvbWV0aGluZyB0byBhIHJvb20gb2YgdGhlIG1vZGVsXG4gICAgdGhpcy5vdXRwdXRzLm9iamVjdFJvb3QucGFyZW50LnBhcmVudC5hZGQodGhpcy5oaWdobGlnaHQpO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBhbmltYXRpb24gbWl4ZXIgdG8gcm90YXRlIHRoZSBjYW1lcmFcbiAgICB0aGlzLm1ha2VBbmltYXRpb24oKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG9uVGljayhkZWx0YTogbnVtYmVyKSB7XG4gICAgdXBkYXRlSGlnaGxpZ2h0VW5pZm9ybXModGhpcy5wcm9qZWN0b3IsIHRoaXMuaGlnaGxpZ2h0VW5pZm9ybXMpO1xuICAgIGlmICh0aGlzLm1peGVyKSB7XG4gICAgICB0aGlzLm1peGVyLnVwZGF0ZShkZWx0YSAvIDEwMDApO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG9uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5oaWdobGlnaHQgJiYgdGhpcy5oaWdobGlnaHQucGFyZW50KSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodC5wYXJlbnQucmVtb3ZlKHRoaXMuaGlnaGxpZ2h0KTtcbiAgICAgICh0aGlzLmhpZ2hsaWdodC5tYXRlcmlhbCBhcyBTaGFkZXJNYXRlcmlhbCkuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lZGdlcykge1xuICAgICAgdGhpcy5lZGdlcy5nZW9tZXRyeS5kaXNwb3NlKCk7XG4gICAgICAodGhpcy5lZGdlcy5tYXRlcmlhbCBhcyBMaW5lQmFzaWNNYXRlcmlhbCkuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ib3gpIHtcbiAgICAgIHRoaXMuYm94Lmdlb21ldHJ5LmRpc3Bvc2UoKTtcbiAgICAgICh0aGlzLmJveC5tYXRlcmlhbCBhcyBNZXNoQmFzaWNNYXRlcmlhbCkuZGlzcG9zZSgpO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlRnJ1c3R1bVZpc3VhbHMoKSB7XG4gICAgY29uc3QgVEhSRUUgPSB0aGlzLmNvbnRleHQudGhyZWU7XG4gICAgaWYgKHRoaXMuYm94KSB7XG4gICAgICB0aGlzLnJvb3QucmVtb3ZlKHRoaXMuYm94KTtcbiAgICAgICh0aGlzLmJveC5tYXRlcmlhbCBhcyBNZXNoQmFzaWNNYXRlcmlhbCkuZGlzcG9zZSgpO1xuICAgICAgKHRoaXMuYm94Lmdlb21ldHJ5IGFzIEJveEdlb21ldHJ5KS5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmJveCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XG4gICAgICB0aGlzLnJvb3QucmVtb3ZlKHRoaXMuZWRnZXMpO1xuICAgICAgKHRoaXMuZWRnZXMubWF0ZXJpYWwgYXMgTGluZUJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICAgICh0aGlzLmVkZ2VzLmdlb21ldHJ5IGFzIEVkZ2VzR2VvbWV0cnkpLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuZWRnZXMgPSBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVkZ2VzVG9DeWxpbmRlcnMoZWRnZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRyeSwgdGhpY2tuZXNzOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IHtwb3NpdGlvbn0gPSBlZGdlc0dlb21ldHJ5LmF0dHJpYnV0ZXM7XG4gICAgICBjb25zdCB7YXJyYXksIGNvdW50fSA9IHBvc2l0aW9uO1xuICAgICAgY29uc3QgciA9IHRoaWNrbmVzcyAvIDI7XG4gICAgICBjb25zdCBnZW9tcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudCAqIDMgLSAxOyBpICs9IDYpIHtcbiAgICAgICAgY29uc3QgYSA9IG5ldyBUSFJFRS5WZWN0b3IzKGFycmF5W2ldLCBhcnJheVtpICsgMV0sIGFycmF5W2kgKyAyXSk7XG4gICAgICAgIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yMyhhcnJheVtpICsgM10sIGFycmF5W2kgKyA0XSwgYXJyYXlbaSArIDVdKTtcblxuICAgICAgICBjb25zdCB2ZWMgPSBuZXcgVEhSRUUuVmVjdG9yMygpLnN1YlZlY3RvcnMoYiwgYSk7XG4gICAgICAgIGNvbnN0IGxlbiA9IHZlYy5sZW5ndGgoKTtcbiAgICAgICAgY29uc3QgZ2VvbSA9IG5ldyBUSFJFRS5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5KHIsIHIsIGxlbiwgOCk7XG4gICAgICAgIGdlb20udHJhbnNsYXRlKDAsIGxlbiAvIDIsIDApO1xuICAgICAgICBnZW9tLnJvdGF0ZVgoTWF0aC5QSSAvIDIpO1xuICAgICAgICBnZW9tLmxvb2tBdCh2ZWMpO1xuICAgICAgICBnZW9tLnRyYW5zbGF0ZShhLngsIGEueSwgYS56KTtcbiAgICAgICAgZ2VvbXMucHVzaChnZW9tKTtcbiAgICAgIH1cbiAgICAgIC8vIEFQSSB0byBiZSB1cGRhdGVkIGluIGJ1bmRsZSAtIEpTU0RLLTEyMjJcbiAgICAgIHJldHVybiAoVEhSRUUgYXMgYW55KS5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoZ2VvbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGZydXN0dW1MZW5ndGggPSB0aGlzLmlucHV0cy5mYXJQbGFuZSAtIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcbiAgICBjb25zdCBib3hHZW9tZXRyeTogQm94R2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkoMiwgMiwgZnJ1c3R1bUxlbmd0aCk7XG4gICAgY29uc3QgaGFsZkhBbmdsZSA9IHRoaXMuaW5wdXRzLmhvcml6b250YWxGT1YgKiAwLjUgKiBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IG5lYXJIYWxmV2lkdGggPSBNYXRoLnRhbihoYWxmSEFuZ2xlKSAqIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcbiAgICBjb25zdCBmYXJIYWxmV2lkdGggPSBNYXRoLnRhbihoYWxmSEFuZ2xlKSAqIHRoaXMuaW5wdXRzLmZhclBsYW5lO1xuICAgIGNvbnN0IG5lYXJIYWxmSGVpZ2h0ID0gbmVhckhhbGZXaWR0aCAvIHRoaXMuaW5wdXRzLmFzcGVjdDtcbiAgICBjb25zdCBmYXJIYWxmSGVpZ2h0ID0gZmFySGFsZldpZHRoIC8gdGhpcy5pbnB1dHMuYXNwZWN0O1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gYm94R2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMuY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgdmVydGV4WiA9IHBvc2l0aW9ucy5nZXRaKGkpO1xuICAgICAgY29uc3QgdmVydGV4WCA9IHBvc2l0aW9ucy5nZXRYKGkpO1xuICAgICAgY29uc3QgdmVydGV4WSA9IHBvc2l0aW9ucy5nZXRZKGkpO1xuICAgICAgaWYgKHZlcnRleFogPiAwKSB7XG4gICAgICAgIC8vIGJhY2sgb2YgdGhlIGNhbWVyYVxuICAgICAgICBwb3NpdGlvbnMuc2V0WChpLCB2ZXJ0ZXhYICogbmVhckhhbGZXaWR0aClcbiAgICAgICAgcG9zaXRpb25zLnNldFkoaSwgdmVydGV4WSAqIG5lYXJIYWxmSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZyb250IG9mIHRoZSBjYW1lcmFcbiAgICAgICAgcG9zaXRpb25zLnNldFgoaSwgdmVydGV4WCAqIGZhckhhbGZXaWR0aClcbiAgICAgICAgcG9zaXRpb25zLnNldFkoaSwgdmVydGV4WSAqIGZhckhhbGZIZWlnaHQpO1xuICAgICAgfVxuICAgICAgcG9zaXRpb25zLnNldFooaSwgdmVydGV4WiAtIDAuNSAqIGZydXN0dW1MZW5ndGggLSB0aGlzLmlucHV0cy5uZWFyUGxhbmUpO1xuICAgIH1cblxuICAgIHZhciBib3hNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICAgICAgY29sb3I6IHRoaXMuaW5wdXRzLmNvbG9yLFxuICAgICAgb3BhY2l0eTogMC4wNSxcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgc2lkZTogVEhSRUUuQmFja1NpZGUsXG4gICAgICBibGVuZGluZzogVEhSRUUuTm9ybWFsQmxlbmRpbmcsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmJveCA9IG5ldyBUSFJFRS5NZXNoKGJveEdlb21ldHJ5LCBib3hNYXRlcmlhbCk7XG4gICAgY29uc3QgZWRnZXNHZW9tZXRyeSA9IGVkZ2VzVG9DeWxpbmRlcnMobmV3IFRIUkVFLkVkZ2VzR2VvbWV0cnkoYm94R2VvbWV0cnkpLCAwLjAxNSk7XG4gICAgdGhpcy5lZGdlcyA9IG5ldyBUSFJFRS5NZXNoKGVkZ2VzR2VvbWV0cnksIG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgICBvcGFjaXR5OiAwLjI1LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBibGVuZGluZzogVEhSRUUuQWRkaXRpdmVCbGVuZGluZyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGVkZ2VzR2VvbWV0cnkyID0gZWRnZXNUb0N5bGluZGVycyhuZXcgVEhSRUUuRWRnZXNHZW9tZXRyeShib3hHZW9tZXRyeSksIDAuMDYpO1xuICAgIGNvbnN0IGVkZ2VzMiA9IG5ldyBUSFJFRS5NZXNoKGVkZ2VzR2VvbWV0cnkyLCBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICAgICAgY29sb3I6IHRoaXMuaW5wdXRzLmNvbG9yLFxuICAgICAgb3BhY2l0eTogMC4wNSxcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgYmxlbmRpbmc6IFRIUkVFLkFkZGl0aXZlQmxlbmRpbmcsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICB9KSk7XG4gICAgdGhpcy5waXZvdC5hZGQoZWRnZXMyKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZUhpZ2hsaWdodCgpIHtcbiAgICBjb25zdCBUSFJFRSA9IHRoaXMuY29udGV4dC50aHJlZTtcblxuICAgIC8vIFRPRE8gKHNjZW5lIHF1ZXJ5KTogdGhpcyBpcyB2ZXJ5IGJyaXR0bGUgYW5kIGhhcmRjb2RlZCBidXQgaXMgdGhlIG9ubHkgd2F5IHRvIGdldCByb29tIGdlb21ldHJpZXMgdW50aWwgd2UgaGF2ZSBhIGJldHRlciB3YXkgdG8gcXVlcnkgdGhlIHNjZW5lIGdyYXBoXG4gICAgY29uc3QgZmxvb3JNZXNoID0gdGhpcy5vdXRwdXRzLm9iamVjdFJvb3QucGFyZW50LnBhcmVudC5nZXRPYmplY3RCeU5hbWUoJ0Zsb29yTWVzaDowJyk7XG4gICAgY29uc3Qgcm9vbU1lc2ggPSBmbG9vck1lc2guY2hpbGRyZW5bMF0gYXMgTWVzaDtcblxuICAgIHVwZGF0ZUhpZ2hsaWdodFVuaWZvcm1zKHRoaXMucHJvamVjdG9yLCB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zKTtcbiAgICB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zLmNvbG9yLnZhbHVlLnNldEhleCh0aGlzLmlucHV0cy5jb2xvcik7XG5cbiAgICBjb25zdCBzaGFkZXIgPSBuZXcgVEhSRUUuU2hhZGVyTWF0ZXJpYWwoe1xuICAgICAgcG9seWdvbk9mZnNldDogdHJ1ZSxcbiAgICAgIHBvbHlnb25PZmZzZXRVbml0czogLTAuMSxcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgdW5pZm9ybXM6IHRoaXMuaGlnaGxpZ2h0VW5pZm9ybXMsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleFNoYWRlcigpLFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50U2hhZGVyKCksXG4gICAgfSk7XG5cbiAgICAvLyBhIG1lc2ggdG8gcmVwcmVzZW50IHRoZSBcImhpZ2hsaWdodFwiXG4gICAgdGhpcy5oaWdobGlnaHQgPSBuZXcgVEhSRUUuTWVzaChyb29tTWVzaC5nZW9tZXRyeSwgc2hhZGVyKTtcbiAgfVxuXG4gIHRvZ2dsZVZpZXdGcnVzdHVtKCk6IHZvaWQge1xuICAgIHRoaXMuaGlnaGxpZ2h0LnZpc2libGUgPSAhdGhpcy5oaWdobGlnaHQudmlzaWJsZTtcbiAgICB0aGlzLmVkZ2VzLnZpc2libGUgPSAhdGhpcy5lZGdlcy52aXNpYmxlO1xuICAgIHRoaXMucGl2b3QudmlzaWJsZSA9ICF0aGlzLnBpdm90LnZpc2libGVcbiAgfVxuXG4gIHByaXZhdGUgbWFrZUFuaW1hdGlvbigpIHtcbiAgICBjb25zdCBUSFJFRSA9IHRoaXMuY29udGV4dC50aHJlZTtcblxuICAgIC8vIHByZWFwcGx5IHRoZSBpbml0aWFsIHJvdGF0aW9uIG9mIHRoZSByb290IHNvIHRoYXQgcGFuQW5nbGUgaXMgcmVsYXRpdmUgdG8gaXQuXG5cbiAgICAvLyBUT0RPOiBmaXggaXQhXG4gICAgY29uc3Qgcm9vdFJvdGF0aW9uID0gdGhpcy5jb250ZXh0LnJvb3QucXVhdGVybmlvbjtcblxuICAgIGNvbnN0IHlBeGlzID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCk7XG4gICAgY29uc3QgZnJhbWUwID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tQXhpc0FuZ2xlKHlBeGlzLCAwKS5wcmVtdWx0aXBseShyb290Um90YXRpb24pO1xuICAgIGNvbnN0IGZyYW1lMSA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkuc2V0RnJvbUF4aXNBbmdsZSh5QXhpcywgdGhpcy5pbnB1dHMucGFuQW5nbGUpLnByZW11bHRpcGx5KHJvb3RSb3RhdGlvbik7XG5cbiAgICAvLyBhIHRyYWNrIHRoYXQgaGFzIGRlbGF5cyBhdCB0aGUgc3RhcnQgYW5kIGVuZCBmb3IgNSUgb2YgdGhlIGFuaW1hdGlvblxuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRIUkVFLlF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCcucXVhdGVybmlvbicsIFtcbiAgICAgIDAsIHRoaXMuaW5wdXRzLnBhblBlcmlvZCAqIDAuMDUsIHRoaXMuaW5wdXRzLnBhblBlcmlvZCAqIDAuOTUsIHRoaXMuaW5wdXRzLnBhblBlcmlvZFxuICAgIF0sIFtcbiAgICAgIGZyYW1lMC54LCBmcmFtZTAueSwgZnJhbWUwLnosIGZyYW1lMC53LFxuICAgICAgZnJhbWUwLngsIGZyYW1lMC55LCBmcmFtZTAueiwgZnJhbWUwLncsXG4gICAgICBmcmFtZTEueCwgZnJhbWUxLnksIGZyYW1lMS56LCBmcmFtZTEudyxcbiAgICAgIGZyYW1lMS54LCBmcmFtZTEueSwgZnJhbWUxLnosIGZyYW1lMS53LFxuICAgIF0pO1xuXG4gICAgY29uc3QgY2xpcCA9IG5ldyBUSFJFRS5BbmltYXRpb25DbGlwKCdwYW5uaW5nJywgdGhpcy5pbnB1dHMucGFuUGVyaW9kLCBbdHJhY2tdKTtcblxuICAgIC8vIFRoZXJlIGlzIG5vIGFwaSB0byBjaGFuZ2UgdGhlIHJvdGF0aW9uIG9mIHRoZSByb290LCBzbyB3ZSB3aWxsIHVzZSBhIHByaXZhdGUgcHJvcGVydHkgdG8gYWNjZXNzIHRoZSBPYmplY3QzRC5cbiAgICAvLyBUaGlzIHdpbGwgbGlrZWx5IG5lZWQgdG8gY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gICAgdGhpcy5taXhlciA9IG5ldyBUSFJFRS5BbmltYXRpb25NaXhlcigodGhpcy5jb250ZXh0LnJvb3QgYXMgYW55KS5vYmozRCk7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5taXhlci5jbGlwQWN0aW9uKGNsaXApO1xuICAgIGFjdGlvbi5sb29wID0gVEhSRUUuTG9vcFBpbmdQb25nO1xuICAgIGFjdGlvbi5wbGF5KCk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiB2ZXJ0ZXhTaGFkZXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICB1bmlmb3JtIG1hdDQgbGlnaHRNYXRyaXg7XG5cbiAgICB2YXJ5aW5nIHZlYzQgdkxpZ2h0Q29vcmRzO1xuXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgLy8gY3JlYXRlIGEgVVYgcmVnaW9uIFswLDFdIHggWzAsMV0gdG8gcmVwcmVzZW50IHdoYXQgdGhlIGxpZ2h0TWF0cml4IFwic2Vlc1wiXG4gICAgICB2TGlnaHRDb29yZHMgPSBsaWdodE1hdHJpeCAqICBtb2RlbE1hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZnJhZ21lbnRTaGFkZXIoKSB7XG4gIHJldHVybiBgXG4gICAgdW5pZm9ybSB2ZWMzIGNvbG9yO1xuXG4gICAgdmFyeWluZyB2ZWM0IHZMaWdodENvb3JkcztcblxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIHZlYzIgbGlnaHRVViA9IHZMaWdodENvb3Jkcy54eSAvIHZMaWdodENvb3Jkcy53O1xuICAgICAgZmxvYXQgaW5WaWV3ID0gZmxvYXQobWF4KGxpZ2h0VVYueCwgbGlnaHRVVi55KSA8PSAxLjAgJiYgbWluKGxpZ2h0VVYueCwgbGlnaHRVVi55KSA+PSAwLjAgJiYgdkxpZ2h0Q29vcmRzLnogPiAwLjApO1xuXG4gICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCBtaW4oaW5WaWV3LCAwLjIpKTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhpZ2hsaWdodFVuaWZvcm1zKHByb2plY3RvcjogUGVyc3BlY3RpdmVDYW1lcmEsIHVuaWZvcm1zOiBIaWdobGlnaHRVbmlmb3Jtcykge1xuICBwcm9qZWN0b3IuZ2V0V29ybGRQb3NpdGlvbih1bmlmb3Jtcy5wcm9qUG9zaXRpb24udmFsdWUpO1xuXG4gIC8vIHNpbWlsYXIgdG8gYSBzaGFkb3cgbWF0cml4LCBidXQgd2UncmUgdXNpbmcgaXQgYXMgYSBcInJlY3Rhbmd1bGFyXCIgc3BvdGxpZ2h0XG4gIC8vIFtsaWdodEJpYXNdICogW3Byb2plY3Rpb25dICogW3ZpZXdNYXRyaXhdXG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLm1ha2VTY2FsZSgwLjUsIDAuNSwgMC41KTtcbiAgdW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUuc2V0UG9zaXRpb24obmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSkpXG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLm11bHRpcGx5TWF0cmljZXModW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUsIHByb2plY3Rvci5wcm9qZWN0aW9uTWF0cml4KTtcbiAgdW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUubXVsdGlwbHlNYXRyaWNlcyh1bmlmb3Jtcy5saWdodE1hdHJpeC52YWx1ZSwgcHJvamVjdG9yLm1hdHJpeFdvcmxkSW52ZXJzZSk7XG59XG5cbmV4cG9ydCBjb25zdCBzZWN1cml0eUNhbWVyYVR5cGUgPSAnbXAuc2VjdXJpdHlDYW1lcmEnO1xuZXhwb3J0IGNvbnN0IG1ha2VTZWN1cml0eUNhbWVyYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBTZWN1cml0eUNhbWVyYSgpO1xufVxuIl19
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { SceneComponent } from '../scene-component/SceneComponent';
|
|
2
|
+
import { Texture, MeshBasicMaterial, LinearFilter, } from 'three';
|
|
3
|
+
const HoverEvent = 'hover';
|
|
4
|
+
const UnhoverEvent = 'unhover';
|
|
5
|
+
export class TvPlayer extends SceneComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.rootScene = null;
|
|
9
|
+
this.mesh = null;
|
|
10
|
+
this.inputs = {
|
|
11
|
+
loadingState: 'Idle',
|
|
12
|
+
texture: null,
|
|
13
|
+
updateInterval: 1000,
|
|
14
|
+
};
|
|
15
|
+
this.events = {
|
|
16
|
+
[HoverEvent]: true,
|
|
17
|
+
[UnhoverEvent]: true,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
onInit(modelNode) {
|
|
21
|
+
if (!this.context) {
|
|
22
|
+
this.context = {
|
|
23
|
+
root: modelNode
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const root = this.context.root;
|
|
27
|
+
const THREE = this.context.three;
|
|
28
|
+
}
|
|
29
|
+
onDestroy() {
|
|
30
|
+
super.onDestroy();
|
|
31
|
+
clearInterval(this.intervalVideoTexture);
|
|
32
|
+
}
|
|
33
|
+
onInputsUpdated() {
|
|
34
|
+
if (this.inputs.loadingState === 'Loaded') {
|
|
35
|
+
const lines = [];
|
|
36
|
+
//@ts-ignore
|
|
37
|
+
this.context.root.obj3D.traverse((obj) => {
|
|
38
|
+
// we dont want line segments, track them and remove them.
|
|
39
|
+
if (obj.type === 'LineSegments') {
|
|
40
|
+
lines.push(obj);
|
|
41
|
+
}
|
|
42
|
+
else if (obj.type === 'Mesh') {
|
|
43
|
+
this.mesh = obj;
|
|
44
|
+
let video, videoImage, videoImageContext, videoTexture;
|
|
45
|
+
// create the video element
|
|
46
|
+
video = document.createElement('video');
|
|
47
|
+
// video.src = "./../assets/video/video_samsic.mp4";
|
|
48
|
+
video.src = "./../assets/video/121222-04.mp4";
|
|
49
|
+
video.load(); // must call after setting/changing source
|
|
50
|
+
video.loop = true;
|
|
51
|
+
video.play();
|
|
52
|
+
videoImage = document.createElement('canvas');
|
|
53
|
+
// videoImage.width = 640;
|
|
54
|
+
videoImage.width = 1280;
|
|
55
|
+
// videoImage.height = 360;
|
|
56
|
+
videoImage.height = 720;
|
|
57
|
+
videoImageContext = videoImage.getContext('2d');
|
|
58
|
+
// background color if no video present
|
|
59
|
+
videoImageContext.fillStyle = '#000000';
|
|
60
|
+
videoImageContext.fillRect(0, 0, videoImage.width, videoImage.height);
|
|
61
|
+
videoTexture = new Texture(videoImage);
|
|
62
|
+
videoTexture.minFilter = LinearFilter;
|
|
63
|
+
videoTexture.magFilter = LinearFilter;
|
|
64
|
+
const movieMaterial = new MeshBasicMaterial({ map: videoTexture });
|
|
65
|
+
this.mesh.material = movieMaterial;
|
|
66
|
+
const render = () => {
|
|
67
|
+
if (video.readyState === video.HAVE_ENOUGH_DATA) {
|
|
68
|
+
videoImageContext.drawImage(video, 0, 0);
|
|
69
|
+
if (videoTexture)
|
|
70
|
+
videoTexture.needsUpdate = true;
|
|
71
|
+
}
|
|
72
|
+
const camera = (this.context.scene.children.find(u => u.constructor.name === 'CameraRig')).camera;
|
|
73
|
+
this.context.renderer.render(this.context.scene, camera);
|
|
74
|
+
};
|
|
75
|
+
this.intervalVideoTexture = setInterval(() => {
|
|
76
|
+
render();
|
|
77
|
+
}, 180);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// remove the line segments.
|
|
81
|
+
lines.forEach((line) => {
|
|
82
|
+
line.parent.remove(line);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
setComponent(component) {
|
|
87
|
+
this.component = component;
|
|
88
|
+
this.context = component.context;
|
|
89
|
+
}
|
|
90
|
+
setRootScene(rootScene) {
|
|
91
|
+
this.rootScene = rootScene;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export const TvPlayerType = 'mp.TvPlayer';
|
|
95
|
+
export const makeTvPlayer = function () {
|
|
96
|
+
return new TvPlayer();
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHZQbGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy90di1wbGF5ZXIvVHZQbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGNBQWMsRUFBbUIsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRixPQUFPLEVBR0wsT0FBTyxFQUNQLGlCQUFpQixFQUVqQixZQUFZLEdBQ2IsTUFBTSxPQUFPLENBQUM7QUFFZixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDM0IsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBUy9CLE1BQU0sT0FBTyxRQUFTLFNBQVEsY0FBYztJQUE1Qzs7UUFDVSxjQUFTLEdBQW9CLElBQUksQ0FBQztRQUNsQyxTQUFJLEdBQWdCLElBQUksQ0FBQztRQUl4QixXQUFNLEdBQVc7WUFDeEIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUk7WUFDYixjQUFjLEVBQUUsSUFBSTtTQUNyQixDQUFBO1FBR1EsV0FBTSxHQUFHO1lBQ2hCLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSTtZQUNsQixDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUk7U0FDckIsQ0FBQztJQXVGSixDQUFDO0lBcEZVLE1BQU0sQ0FBQyxTQUFlO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUc7Z0JBQ2IsSUFBSSxFQUFFLFNBQVM7YUFDSSxDQUFDO1NBQ3ZCO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVRLFNBQVM7UUFDaEIsS0FBSyxDQUFDLFNBQVMsRUFB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QW9CLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTt3QkFDM0MsTUFBTSxFQUFFLENBQUM7b0JBQ1gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUVUO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCw0QkFBNEI7WUFDNUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQWtCLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsU0FBeUI7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBbUI7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUMxQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDMUIsT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ3hCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U2NlbmVDb21wb25lbnQsIENvbXBvbmVudENvbnRleHR9IGZyb20gJy4uL3NjZW5lLWNvbXBvbmVudC9TY2VuZUNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBPYmplY3QzRCxcbiAgTWVzaCxcbiAgVGV4dHVyZSxcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsXG4gIExpbmVTZWdtZW50cyxcbiAgTGluZWFyRmlsdGVyLFxufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IEhvdmVyRXZlbnQgPSAnaG92ZXInO1xuY29uc3QgVW5ob3ZlckV2ZW50ID0gJ3VuaG92ZXInO1xuXG50eXBlIElucHV0cyA9IHtcbiAgbG9hZGluZ1N0YXRlOiBzdHJpbmc7XG4gIHRleHR1cmU6IFRleHR1cmUgfCBudWxsO1xuICB1cGRhdGVJbnRlcnZhbDogbnVtYmVyO1xufVxuXG5cbmV4cG9ydCBjbGFzcyBUdlBsYXllciBleHRlbmRzIFNjZW5lQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByb290U2NlbmU6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzaDogTWVzaCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbXBvbmVudDogU2NlbmVDb21wb25lbnQ7XG5cblxuICBvdmVycmlkZSBpbnB1dHM6IElucHV0cyA9IHtcbiAgICBsb2FkaW5nU3RhdGU6ICdJZGxlJyxcbiAgICB0ZXh0dXJlOiBudWxsLFxuICAgIHVwZGF0ZUludGVydmFsOiAxMDAwLFxuICB9XG5cblxuICBvdmVycmlkZSBldmVudHMgPSB7XG4gICAgW0hvdmVyRXZlbnRdOiB0cnVlLFxuICAgIFtVbmhvdmVyRXZlbnRdOiB0cnVlLFxuICB9O1xuICBwcml2YXRlIGludGVydmFsVmlkZW9UZXh0dXJlOiBOb2RlSlMuVGltZW91dDtcblxuICBvdmVycmlkZSBvbkluaXQobW9kZWxOb2RlPzogYW55KSB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IHtcbiAgICAgICAgcm9vdDogbW9kZWxOb2RlXG4gICAgICB9IGFzIENvbXBvbmVudENvbnRleHQ7XG4gICAgfVxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmNvbnRleHQucm9vdDtcbiAgICBjb25zdCBUSFJFRSA9IHRoaXMuY29udGV4dC50aHJlZTtcbiAgfVxuXG4gIG92ZXJyaWRlIG9uRGVzdHJveSgpIHtcbiAgICBzdXBlci5vbkRlc3Ryb3koKTtcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxWaWRlb1RleHR1cmUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgb25JbnB1dHNVcGRhdGVkKCkge1xuICAgIGlmICh0aGlzLmlucHV0cy5sb2FkaW5nU3RhdGUgPT09ICdMb2FkZWQnKSB7XG4gICAgICBjb25zdCBsaW5lczogTGluZVNlZ21lbnRzW10gPSBbXTtcblxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICB0aGlzLmNvbnRleHQucm9vdC5vYmozRC50cmF2ZXJzZSgob2JqOiBPYmplY3QzRCkgPT4ge1xuICAgICAgICAvLyB3ZSBkb250IHdhbnQgbGluZSBzZWdtZW50cywgdHJhY2sgdGhlbSBhbmQgcmVtb3ZlIHRoZW0uXG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gJ0xpbmVTZWdtZW50cycpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKG9iaiBhcyBMaW5lU2VnbWVudHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnTWVzaCcpIHtcbiAgICAgICAgICB0aGlzLm1lc2ggPSBvYmogYXMgTWVzaDtcblxuICAgICAgICAgIGxldCB2aWRlbywgdmlkZW9JbWFnZSwgdmlkZW9JbWFnZUNvbnRleHQsIHZpZGVvVGV4dHVyZTtcbiAgICAgICAgICAvLyBjcmVhdGUgdGhlIHZpZGVvIGVsZW1lbnRcbiAgICAgICAgICB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICAgICAgLy8gdmlkZW8uc3JjID0gXCIuLy4uL2Fzc2V0cy92aWRlby92aWRlb19zYW1zaWMubXA0XCI7XG4gICAgICAgICAgdmlkZW8uc3JjID0gXCIuLy4uL2Fzc2V0cy92aWRlby8xMjEyMjItMDQubXA0XCI7XG4gICAgICAgICAgdmlkZW8ubG9hZCgpOyAvLyBtdXN0IGNhbGwgYWZ0ZXIgc2V0dGluZy9jaGFuZ2luZyBzb3VyY2VcbiAgICAgICAgICB2aWRlby5sb29wID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5wbGF5KCk7XG5cbiAgICAgICAgICB2aWRlb0ltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgLy8gdmlkZW9JbWFnZS53aWR0aCA9IDY0MDtcbiAgICAgICAgICB2aWRlb0ltYWdlLndpZHRoID0gMTI4MDtcbiAgICAgICAgICAvLyB2aWRlb0ltYWdlLmhlaWdodCA9IDM2MDtcbiAgICAgICAgICB2aWRlb0ltYWdlLmhlaWdodCA9IDcyMDtcblxuICAgICAgICAgIHZpZGVvSW1hZ2VDb250ZXh0ID0gdmlkZW9JbWFnZS5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgIC8vIGJhY2tncm91bmQgY29sb3IgaWYgbm8gdmlkZW8gcHJlc2VudFxuICAgICAgICAgIHZpZGVvSW1hZ2VDb250ZXh0LmZpbGxTdHlsZSA9ICcjMDAwMDAwJztcbiAgICAgICAgICB2aWRlb0ltYWdlQ29udGV4dC5maWxsUmVjdCgwLCAwLCB2aWRlb0ltYWdlLndpZHRoLCB2aWRlb0ltYWdlLmhlaWdodCk7XG5cbiAgICAgICAgICB2aWRlb1RleHR1cmUgPSBuZXcgVGV4dHVyZSh2aWRlb0ltYWdlKVxuICAgICAgICAgIHZpZGVvVGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG4gICAgICAgICAgdmlkZW9UZXh0dXJlLm1hZ0ZpbHRlciA9IExpbmVhckZpbHRlcjtcbiAgICAgICAgICBjb25zdCBtb3ZpZU1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKHttYXA6IHZpZGVvVGV4dHVyZX0pXG4gICAgICAgICAgdGhpcy5tZXNoLm1hdGVyaWFsID0gbW92aWVNYXRlcmlhbDtcblxuICAgICAgICAgIGNvbnN0IHJlbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWRlby5yZWFkeVN0YXRlID09PSB2aWRlby5IQVZFX0VOT1VHSF9EQVRBKSB7XG4gICAgICAgICAgICAgIHZpZGVvSW1hZ2VDb250ZXh0LmRyYXdJbWFnZSh2aWRlbywgMCwgMCk7XG4gICAgICAgICAgICAgIGlmICh2aWRlb1RleHR1cmUpXG4gICAgICAgICAgICAgICAgdmlkZW9UZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYSA9ICh0aGlzLmNvbnRleHQuc2NlbmUuY2hpbGRyZW4uZmluZCh1ID0+IHUuY29uc3RydWN0b3IubmFtZSA9PT0gJ0NhbWVyYVJpZycpKS5jYW1lcmE7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVuZGVyZXIucmVuZGVyKHRoaXMuY29udGV4dC5zY2VuZSwgY2FtZXJhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbnRlcnZhbFZpZGVvVGV4dHVyZSA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHJlbmRlcigpO1xuICAgICAgICAgIH0sIDE4MCk7XG5cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHJlbW92ZSB0aGUgbGluZSBzZWdtZW50cy5cbiAgICAgIGxpbmVzLmZvckVhY2goKGxpbmU6IExpbmVTZWdtZW50cykgPT4ge1xuICAgICAgICBsaW5lLnBhcmVudC5yZW1vdmUobGluZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZXRDb21wb25lbnQoY29tcG9uZW50OiBTY2VuZUNvbXBvbmVudCkge1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHRoaXMuY29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0O1xuICB9XG5cbiAgc2V0Um9vdFNjZW5lKHJvb3RTY2VuZTogT2JqZWN0M0QpIHtcbiAgICB0aGlzLnJvb3RTY2VuZSA9IHJvb3RTY2VuZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVHZQbGF5ZXJUeXBlID0gJ21wLlR2UGxheWVyJztcbmV4cG9ydCBjb25zdCBtYWtlVHZQbGF5ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgVHZQbGF5ZXIoKTtcbn1cbiJdfQ==
|