angular-three-soba 2.13.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abstractions/lib/catmull-rom-line.d.ts +247 -247
- package/abstractions/lib/edges.d.ts +276 -276
- package/abstractions/lib/grid.d.ts +45 -45
- package/abstractions/lib/line.d.ts +1 -1
- package/abstractions/lib/prism-geometry.d.ts +4 -4
- package/abstractions/lib/rounded-box.d.ts +1 -1
- package/abstractions/lib/text-3d.d.ts +51 -51
- package/abstractions/lib/text.d.ts +1 -1
- package/cameras/lib/cube-camera.d.ts +1 -1
- package/cameras/lib/orthographic-camera.d.ts +1 -1
- package/cameras/lib/perspective-camera.d.ts +1 -1
- package/controls/index.d.ts +0 -9
- package/fesm2022/angular-three-soba-abstractions.mjs +41 -52
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +12 -15
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +16 -30
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +59 -60
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +3 -3
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +27 -35
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +27 -29
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-performances.mjs +31 -34
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +91 -105
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-stats.mjs +3 -3
- package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
- package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +1 -1
- package/gizmos/lib/pivot-controls/pivot-controls.d.ts +1 -1
- package/materials/lib/mesh-portal-material.d.ts +1 -1
- package/materials/lib/mesh-refraction-material.d.ts +1 -1
- package/misc/lib/computed-attribute.d.ts +3 -3
- package/misc/lib/decal.d.ts +1 -1
- package/misc/lib/html/html.d.ts +2 -2
- package/package.json +8 -34
- package/performances/lib/instances/instances.d.ts +7 -7
- package/performances/lib/points/points.d.ts +16 -16
- package/performances/lib/segments/segments.d.ts +1 -1
- package/staging/lib/accumulative-shadows.d.ts +1 -1
- package/staging/lib/caustics.d.ts +1 -1
- package/staging/lib/center.d.ts +2 -2
- package/staging/lib/contact-shadows.d.ts +1 -1
- package/staging/lib/lightformer.d.ts +1 -1
- package/staging/lib/mask.d.ts +1 -1
- package/staging/lib/sky.d.ts +1 -1
- package/staging/lib/spot-light.d.ts +1 -1
- package/staging/lib/stage.d.ts +5 -5
- package/esm2022/abstractions/angular-three-soba-abstractions.mjs +0 -5
- package/esm2022/abstractions/index.mjs +0 -14
- package/esm2022/abstractions/lib/billboard.mjs +0 -69
- package/esm2022/abstractions/lib/catmull-rom-line.mjs +0 -76
- package/esm2022/abstractions/lib/cubic-bezier-line.mjs +0 -51
- package/esm2022/abstractions/lib/edges.mjs +0 -66
- package/esm2022/abstractions/lib/gradient-texture.mjs +0 -91
- package/esm2022/abstractions/lib/grid.mjs +0 -103
- package/esm2022/abstractions/lib/helper.mjs +0 -74
- package/esm2022/abstractions/lib/line.mjs +0 -123
- package/esm2022/abstractions/lib/prism-geometry.mjs +0 -46
- package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +0 -73
- package/esm2022/abstractions/lib/rounded-box.mjs +0 -131
- package/esm2022/abstractions/lib/text-3d.mjs +0 -100
- package/esm2022/abstractions/lib/text.mjs +0 -86
- package/esm2022/angular-three-soba.mjs +0 -5
- package/esm2022/cameras/angular-three-soba-cameras.mjs +0 -5
- package/esm2022/cameras/index.mjs +0 -5
- package/esm2022/cameras/lib/camera-content.mjs +0 -14
- package/esm2022/cameras/lib/cube-camera.mjs +0 -102
- package/esm2022/cameras/lib/orthographic-camera.mjs +0 -131
- package/esm2022/cameras/lib/perspective-camera.mjs +0 -105
- package/esm2022/controls/angular-three-soba-controls.mjs +0 -5
- package/esm2022/controls/index.mjs +0 -9
- package/esm2022/controls/lib/camera-controls.mjs +0 -126
- package/esm2022/controls/lib/orbit-controls.mjs +0 -120
- package/esm2022/controls/lib/scroll-controls.mjs +0 -261
- package/esm2022/gizmos/angular-three-soba-gizmos.mjs +0 -5
- package/esm2022/gizmos/index.mjs +0 -6
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +0 -191
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +0 -304
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +0 -348
- package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +0 -265
- package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +0 -264
- package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +0 -349
- package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +0 -266
- package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +0 -232
- package/esm2022/gizmos/lib/transform-controls.mjs +0 -177
- package/esm2022/index.mjs +0 -2
- package/esm2022/loaders/angular-three-soba-loaders.mjs +0 -5
- package/esm2022/loaders/index.mjs +0 -7
- package/esm2022/loaders/lib/fbx-loader.mjs +0 -13
- package/esm2022/loaders/lib/font-loader.mjs +0 -49
- package/esm2022/loaders/lib/gltf-loader.mjs +0 -51
- package/esm2022/loaders/lib/loader.mjs +0 -103
- package/esm2022/loaders/lib/progress.mjs +0 -51
- package/esm2022/loaders/lib/texture-loader.mjs +0 -32
- package/esm2022/materials/angular-three-soba-materials.mjs +0 -5
- package/esm2022/materials/index.mjs +0 -9
- package/esm2022/materials/lib/custom-shader-material.mjs +0 -67
- package/esm2022/materials/lib/mesh-distort-material.mjs +0 -43
- package/esm2022/materials/lib/mesh-portal-material.mjs +0 -294
- package/esm2022/materials/lib/mesh-reflector-material.mjs +0 -274
- package/esm2022/materials/lib/mesh-refraction-material.mjs +0 -140
- package/esm2022/materials/lib/mesh-transmission-material.mjs +0 -188
- package/esm2022/materials/lib/mesh-wobble-material.mjs +0 -43
- package/esm2022/materials/lib/point-material.mjs +0 -34
- package/esm2022/misc/angular-three-soba-misc.mjs +0 -5
- package/esm2022/misc/index.mjs +0 -15
- package/esm2022/misc/lib/animations.mjs +0 -71
- package/esm2022/misc/lib/bake-shadows.mjs +0 -24
- package/esm2022/misc/lib/computed-attribute.mjs +0 -51
- package/esm2022/misc/lib/constants.mjs +0 -5
- package/esm2022/misc/lib/decal.mjs +0 -142
- package/esm2022/misc/lib/deprecated.mjs +0 -15
- package/esm2022/misc/lib/depth-buffer.mjs +0 -35
- package/esm2022/misc/lib/fbo.mjs +0 -86
- package/esm2022/misc/lib/html/html-content.mjs +0 -322
- package/esm2022/misc/lib/html/html.mjs +0 -129
- package/esm2022/misc/lib/html/utils.mjs +0 -74
- package/esm2022/misc/lib/intersect.mjs +0 -49
- package/esm2022/misc/lib/preload.mjs +0 -58
- package/esm2022/misc/lib/sampler.mjs +0 -122
- package/esm2022/misc/lib/scale-factor.mjs +0 -29
- package/esm2022/performances/angular-three-soba-performances.mjs +0 -5
- package/esm2022/performances/index.mjs +0 -7
- package/esm2022/performances/lib/adaptive-dpr.mjs +0 -46
- package/esm2022/performances/lib/adaptive-events.mjs +0 -24
- package/esm2022/performances/lib/detailed.mjs +0 -53
- package/esm2022/performances/lib/instances/instances.mjs +0 -177
- package/esm2022/performances/lib/instances/position-mesh.mjs +0 -51
- package/esm2022/performances/lib/points/points.mjs +0 -272
- package/esm2022/performances/lib/points/position-point.mjs +0 -53
- package/esm2022/performances/lib/segments/segment-object.mjs +0 -9
- package/esm2022/performances/lib/segments/segments.mjs +0 -126
- package/esm2022/shaders/angular-three-soba-shaders.mjs +0 -5
- package/esm2022/shaders/index.mjs +0 -4
- package/esm2022/shaders/lib/grid-material.mjs +0 -81
- package/esm2022/shaders/lib/mesh-refraction-material.mjs +0 -163
- package/esm2022/shaders/lib/point-material.mjs +0 -24
- package/esm2022/staging/angular-three-soba-staging.mjs +0 -5
- package/esm2022/staging/index.mjs +0 -21
- package/esm2022/staging/lib/accumulative-shadows.mjs +0 -180
- package/esm2022/staging/lib/backdrop.mjs +0 -69
- package/esm2022/staging/lib/bb-anchor.mjs +0 -58
- package/esm2022/staging/lib/bounds.mjs +0 -282
- package/esm2022/staging/lib/camera-shake.mjs +0 -65
- package/esm2022/staging/lib/caustics.mjs +0 -184
- package/esm2022/staging/lib/center.mjs +0 -114
- package/esm2022/staging/lib/contact-shadows.mjs +0 -214
- package/esm2022/staging/lib/environment/environment.mjs +0 -344
- package/esm2022/staging/lib/environment/inject-environment.mjs +0 -184
- package/esm2022/staging/lib/float.mjs +0 -70
- package/esm2022/staging/lib/lightformer.mjs +0 -103
- package/esm2022/staging/lib/mask.mjs +0 -74
- package/esm2022/staging/lib/matcap-texture.mjs +0 -79
- package/esm2022/staging/lib/normal-texture.mjs +0 -79
- package/esm2022/staging/lib/randomized-lights.mjs +0 -100
- package/esm2022/staging/lib/render-texture.mjs +0 -202
- package/esm2022/staging/lib/sky.mjs +0 -86
- package/esm2022/staging/lib/spot-light.mjs +0 -445
- package/esm2022/staging/lib/stage.mjs +0 -232
- package/esm2022/stats/angular-three-soba-stats.mjs +0 -5
- package/esm2022/stats/index.mjs +0 -2
- package/esm2022/stats/lib/stats.mjs +0 -57
- package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +0 -5
- package/esm2022/vanilla-exports/index.mjs +0 -3
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, effect, input, } from '@angular/core';
|
|
2
|
-
import { is, NgtArgs, omit, pick } from 'angular-three';
|
|
3
|
-
import CustomShaderMaterial from 'three-custom-shader-material/vanilla';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class NgtsCustomShaderMaterial {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.baseMaterial = input.required();
|
|
8
|
-
this.attach = input('material');
|
|
9
|
-
this.options = input({});
|
|
10
|
-
this.parameters = omit(this.options, ['fragmentShader', 'vertexShader', 'uniforms', 'cacheKey']);
|
|
11
|
-
this.base = computed(() => {
|
|
12
|
-
const baseMaterial = this.baseMaterial();
|
|
13
|
-
return is.ref(baseMaterial) ? baseMaterial.nativeElement : baseMaterial;
|
|
14
|
-
});
|
|
15
|
-
this.fragmentShader = pick(this.options, 'fragmentShader');
|
|
16
|
-
this.vertexShader = pick(this.options, 'vertexShader');
|
|
17
|
-
this.uniforms = pick(this.options, 'uniforms');
|
|
18
|
-
this.cacheKey = pick(this.options, 'cacheKey');
|
|
19
|
-
this.material = computed(() => {
|
|
20
|
-
const [base, fragmentShader, vertexShader, uniforms, cacheKey] = [
|
|
21
|
-
this.base(),
|
|
22
|
-
this.fragmentShader(),
|
|
23
|
-
this.vertexShader(),
|
|
24
|
-
this.uniforms(),
|
|
25
|
-
this.cacheKey(),
|
|
26
|
-
];
|
|
27
|
-
// NOTE: this is specific to angular-three
|
|
28
|
-
if (is.instance(base)) {
|
|
29
|
-
delete base['__ngt__'];
|
|
30
|
-
delete base['__ngt_renderer__'];
|
|
31
|
-
}
|
|
32
|
-
return new CustomShaderMaterial({
|
|
33
|
-
baseMaterial: base,
|
|
34
|
-
fragmentShader,
|
|
35
|
-
vertexShader,
|
|
36
|
-
uniforms,
|
|
37
|
-
cacheKey,
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
effect((onCleanup) => {
|
|
41
|
-
const material = this.material();
|
|
42
|
-
onCleanup(() => material.dispose());
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsCustomShaderMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
46
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.11", type: NgtsCustomShaderMaterial, isStandalone: true, selector: "ngts-custom-shader-material", inputs: { baseMaterial: { classPropertyName: "baseMaterial", publicName: "baseMaterial", isSignal: true, isRequired: true, transformFunction: null }, attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
47
|
-
<ngt-primitive *args="[material()]" [attach]="attach()" [parameters]="parameters()">
|
|
48
|
-
<ng-content />
|
|
49
|
-
</ngt-primitive>
|
|
50
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
51
|
-
}
|
|
52
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsCustomShaderMaterial, decorators: [{
|
|
53
|
-
type: Component,
|
|
54
|
-
args: [{
|
|
55
|
-
selector: 'ngts-custom-shader-material',
|
|
56
|
-
standalone: true,
|
|
57
|
-
template: `
|
|
58
|
-
<ngt-primitive *args="[material()]" [attach]="attach()" [parameters]="parameters()">
|
|
59
|
-
<ng-content />
|
|
60
|
-
</ngt-primitive>
|
|
61
|
-
`,
|
|
62
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
63
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
64
|
-
imports: [NgtArgs],
|
|
65
|
-
}]
|
|
66
|
-
}], ctorParameters: () => [] });
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXNoYWRlci1tYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9tYXRlcmlhbHMvc3JjL2xpYi9jdXN0b20tc2hhZGVyLW1hdGVyaWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsRUFDdEIsTUFBTSxFQUVOLEtBQUssR0FDTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsRUFBRSxFQUFnQixPQUFPLEVBQWlCLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckYsT0FBTyxvQkFBb0IsTUFBTSxzQ0FBc0MsQ0FBQzs7QUFjeEUsTUFBTSxPQUFPLHdCQUF3QjtJQXdDcEM7UUF2Q0EsaUJBQVksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFxRCxDQUFDO1FBQ25GLFdBQU0sR0FBRyxLQUFLLENBQWdCLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLFlBQU8sR0FBRyxLQUFLLENBQUMsRUFBaUYsQ0FBQyxDQUFDO1FBQ25HLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVwRixTQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUM1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFFSyxtQkFBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDdEQsaUJBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxhQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUMsYUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRWxELGFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ2hFLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDZixJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ2YsQ0FBQztZQUVGLDBDQUEwQztZQUMxQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsT0FBUSxJQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxPQUFRLElBQXFCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBRUQsT0FBTyxJQUFJLG9CQUFvQixDQUFDO2dCQUMvQixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsY0FBYztnQkFDZCxZQUFZO2dCQUNaLFFBQVE7Z0JBQ1IsUUFBUTthQUNSLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBR0YsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7K0dBN0NXLHdCQUF3QjttR0FBeEIsd0JBQXdCLHdlQVQxQjs7OztFQUlULDREQUdTLE9BQU87OzRGQUVMLHdCQUF3QjtrQkFacEMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsNkJBQTZCO29CQUN2QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7O0VBSVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdGVmZmVjdCxcblx0RWxlbWVudFJlZixcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXMsIE5ndEFueVJlY29yZCwgTmd0QXJncywgTmd0QXR0YWNoYWJsZSwgb21pdCwgcGljayB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgQ3VzdG9tU2hhZGVyTWF0ZXJpYWwgZnJvbSAndGhyZWUtY3VzdG9tLXNoYWRlci1tYXRlcmlhbC92YW5pbGxhJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1jdXN0b20tc2hhZGVyLW1hdGVyaWFsJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZSAqYXJncz1cIlttYXRlcmlhbCgpXVwiIFthdHRhY2hdPVwiYXR0YWNoKClcIiBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzKClcIj5cblx0XHRcdDxuZy1jb250ZW50IC8+XG5cdFx0PC9uZ3QtcHJpbWl0aXZlPlxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNDdXN0b21TaGFkZXJNYXRlcmlhbCB7XG5cdGJhc2VNYXRlcmlhbCA9IGlucHV0LnJlcXVpcmVkPE1hdGVyaWFsIHwgdHlwZW9mIE1hdGVyaWFsIHwgRWxlbWVudFJlZjxNYXRlcmlhbD4+KCk7XG5cdGF0dGFjaCA9IGlucHV0PE5ndEF0dGFjaGFibGU+KCdtYXRlcmlhbCcpO1xuXHRvcHRpb25zID0gaW5wdXQoe30gYXMgT21pdDxDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEN1c3RvbVNoYWRlck1hdGVyaWFsPlswXSwgJ2Jhc2VNYXRlcmlhbCc+KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbJ2ZyYWdtZW50U2hhZGVyJywgJ3ZlcnRleFNoYWRlcicsICd1bmlmb3JtcycsICdjYWNoZUtleSddKTtcblxuXHRwcml2YXRlIGJhc2UgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgYmFzZU1hdGVyaWFsID0gdGhpcy5iYXNlTWF0ZXJpYWwoKTtcblx0XHRyZXR1cm4gaXMucmVmKGJhc2VNYXRlcmlhbCkgPyBiYXNlTWF0ZXJpYWwubmF0aXZlRWxlbWVudCA6IGJhc2VNYXRlcmlhbDtcblx0fSk7XG5cblx0cHJpdmF0ZSBmcmFnbWVudFNoYWRlciA9IHBpY2sodGhpcy5vcHRpb25zLCAnZnJhZ21lbnRTaGFkZXInKTtcblx0cHJpdmF0ZSB2ZXJ0ZXhTaGFkZXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3ZlcnRleFNoYWRlcicpO1xuXHRwcml2YXRlIHVuaWZvcm1zID0gcGljayh0aGlzLm9wdGlvbnMsICd1bmlmb3JtcycpO1xuXHRwcml2YXRlIGNhY2hlS2V5ID0gcGljayh0aGlzLm9wdGlvbnMsICdjYWNoZUtleScpO1xuXG5cdG1hdGVyaWFsID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtiYXNlLCBmcmFnbWVudFNoYWRlciwgdmVydGV4U2hhZGVyLCB1bmlmb3JtcywgY2FjaGVLZXldID0gW1xuXHRcdFx0dGhpcy5iYXNlKCksXG5cdFx0XHR0aGlzLmZyYWdtZW50U2hhZGVyKCksXG5cdFx0XHR0aGlzLnZlcnRleFNoYWRlcigpLFxuXHRcdFx0dGhpcy51bmlmb3JtcygpLFxuXHRcdFx0dGhpcy5jYWNoZUtleSgpLFxuXHRcdF07XG5cblx0XHQvLyBOT1RFOiB0aGlzIGlzIHNwZWNpZmljIHRvIGFuZ3VsYXItdGhyZWVcblx0XHRpZiAoaXMuaW5zdGFuY2UoYmFzZSkpIHtcblx0XHRcdGRlbGV0ZSAoYmFzZSBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHRkZWxldGUgKGJhc2UgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQ3VzdG9tU2hhZGVyTWF0ZXJpYWwoe1xuXHRcdFx0YmFzZU1hdGVyaWFsOiBiYXNlLFxuXHRcdFx0ZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHR2ZXJ0ZXhTaGFkZXIsXG5cdFx0XHR1bmlmb3Jtcyxcblx0XHRcdGNhY2hlS2V5LFxuXHRcdH0pO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsKCk7XG5cdFx0XHRvbkNsZWFudXAoKCkgPT4gbWF0ZXJpYWwuZGlzcG9zZSgpKTtcblx0XHR9KTtcblx0fVxufVxuIl19
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, inject, input } from '@angular/core';
|
|
2
|
-
import { injectBeforeRender, NgtArgs, omit, pick } from 'angular-three';
|
|
3
|
-
import { MeshDistortMaterial } from 'angular-three-soba/vanilla-exports';
|
|
4
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
const defaultOptions = {
|
|
7
|
-
speed: 1,
|
|
8
|
-
};
|
|
9
|
-
export class NgtsMeshDistortMaterial {
|
|
10
|
-
constructor() {
|
|
11
|
-
this.attach = input('material');
|
|
12
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
13
|
-
this.parameters = omit(this.options, ['speed']);
|
|
14
|
-
this.material = new MeshDistortMaterial();
|
|
15
|
-
this.speed = pick(this.options, 'speed');
|
|
16
|
-
inject(DestroyRef).onDestroy(() => this.material.dispose());
|
|
17
|
-
injectBeforeRender(({ clock }) => {
|
|
18
|
-
this.material.time = clock.getElapsedTime() * this.speed();
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsMeshDistortMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
22
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.11", type: NgtsMeshDistortMaterial, isStandalone: true, selector: "ngts-mesh-distort-material", inputs: { attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
23
|
-
<ngt-primitive *args="[material]" [attach]="attach()" [parameters]="parameters()">
|
|
24
|
-
<ng-content />
|
|
25
|
-
</ngt-primitive>
|
|
26
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
27
|
-
}
|
|
28
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsMeshDistortMaterial, decorators: [{
|
|
29
|
-
type: Component,
|
|
30
|
-
args: [{
|
|
31
|
-
selector: 'ngts-mesh-distort-material',
|
|
32
|
-
standalone: true,
|
|
33
|
-
template: `
|
|
34
|
-
<ngt-primitive *args="[material]" [attach]="attach()" [parameters]="parameters()">
|
|
35
|
-
<ng-content />
|
|
36
|
-
</ngt-primitive>
|
|
37
|
-
`,
|
|
38
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
39
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
40
|
-
imports: [NgtArgs],
|
|
41
|
-
}]
|
|
42
|
-
}], ctorParameters: () => [] });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1kaXN0b3J0LW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21hdGVyaWFscy9zcmMvbGliL21lc2gtZGlzdG9ydC1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQTBDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLG1CQUFtQixFQUFpQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFTdkQsTUFBTSxjQUFjLEdBQW1DO0lBQ3RELEtBQUssRUFBRSxDQUFDO0NBQ1IsQ0FBQztBQWNGLE1BQU0sT0FBTyx1QkFBdUI7SUFTbkM7UUFSQSxXQUFNLEdBQUcsS0FBSyxDQUFnQixVQUFVLENBQUMsQ0FBQztRQUMxQyxZQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFM0MsYUFBUSxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUU3QixVQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFHM0MsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFNUQsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7K0dBZlcsdUJBQXVCO21HQUF2Qix1QkFBdUIsMlZBVHpCOzs7O0VBSVQsNERBR1MsT0FBTzs7NEZBRUwsdUJBQXVCO2tCQVpuQyxTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSw0QkFBNEI7b0JBQ3RDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7RUFJVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQztpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBEZXN0cm95UmVmLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmplY3RCZWZvcmVSZW5kZXIsIE5ndEFyZ3MsIE5ndEF0dGFjaGFibGUsIE5ndE1lc2hQaHlzaWNhbE1hdGVyaWFsLCBvbWl0LCBwaWNrIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBNZXNoRGlzdG9ydE1hdGVyaWFsLCBNZXNoRGlzdG9ydE1hdGVyaWFsUGFyYW1ldGVycyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS92YW5pbGxhLWV4cG9ydHMnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNNZXNoRGlzdG9ydE1hdGVyaWFsT3B0aW9uc1xuXHRleHRlbmRzIFBhcnRpYWw8TWVzaERpc3RvcnRNYXRlcmlhbFBhcmFtZXRlcnM+LFxuXHRcdFBhcnRpYWw8Tmd0TWVzaFBoeXNpY2FsTWF0ZXJpYWw+IHtcblx0c3BlZWQ6IG51bWJlcjtcblx0ZmFjdG9yPzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0c01lc2hEaXN0b3J0TWF0ZXJpYWxPcHRpb25zID0ge1xuXHRzcGVlZDogMSxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtbWVzaC1kaXN0b3J0LW1hdGVyaWFsJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZSAqYXJncz1cIlttYXRlcmlhbF1cIiBbYXR0YWNoXT1cImF0dGFjaCgpXCIgW3BhcmFtZXRlcnNdPVwicGFyYW1ldGVycygpXCI+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LXByaW1pdGl2ZT5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzTWVzaERpc3RvcnRNYXRlcmlhbCB7XG5cdGF0dGFjaCA9IGlucHV0PE5ndEF0dGFjaGFibGU+KCdtYXRlcmlhbCcpO1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgWydzcGVlZCddKTtcblxuXHRtYXRlcmlhbCA9IG5ldyBNZXNoRGlzdG9ydE1hdGVyaWFsKCk7XG5cblx0cHJpdmF0ZSBzcGVlZCA9IHBpY2sodGhpcy5vcHRpb25zLCAnc3BlZWQnKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpKTtcblxuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBjbG9jayB9KSA9PiB7XG5cdFx0XHR0aGlzLm1hdGVyaWFsLnRpbWUgPSBjbG9jay5nZXRFbGFwc2VkVGltZSgpICogdGhpcy5zcGVlZCgpO1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, computed, contentChild, CUSTOM_ELEMENTS_SCHEMA, Directive, effect, inject, Injector, input, signal, TemplateRef, viewChild, } from '@angular/core';
|
|
3
|
-
import { extend, getLocalState, injectBeforeRender, injectStore, omit, pick, } from 'angular-three';
|
|
4
|
-
import { getVersion, injectFBO, injectIntersect } from 'angular-three-soba/misc';
|
|
5
|
-
import { NgtsRenderTexture, NgtsRenderTextureContent } from 'angular-three-soba/staging';
|
|
6
|
-
import { MeshPortalMaterial, meshPortalMaterialApplySDF, } from 'angular-three-soba/vanilla-exports';
|
|
7
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
8
|
-
import { Mesh, ShaderMaterial } from 'three';
|
|
9
|
-
import { FullScreenQuad } from 'three-stdlib';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
/**
|
|
12
|
-
* This directive is used inside of the render texture, hence has access to the render texture store (a portal store)
|
|
13
|
-
*/
|
|
14
|
-
export class ManagePortalScene {
|
|
15
|
-
constructor() {
|
|
16
|
-
this.events = input();
|
|
17
|
-
this.rootScene = input.required();
|
|
18
|
-
this.material = input.required();
|
|
19
|
-
this.priority = input.required();
|
|
20
|
-
this.worldUnits = input.required();
|
|
21
|
-
const injector = inject(Injector);
|
|
22
|
-
const renderTextureStore = injectStore();
|
|
23
|
-
const portalScene = renderTextureStore.select('scene');
|
|
24
|
-
const portalSetEvents = renderTextureStore.select('setEvents');
|
|
25
|
-
const buffer1 = injectFBO();
|
|
26
|
-
const buffer2 = injectFBO();
|
|
27
|
-
const fullScreenQuad = computed(() => {
|
|
28
|
-
// This fullscreen-quad is used to blend the two textures
|
|
29
|
-
const blend = { value: 0 };
|
|
30
|
-
const quad = new FullScreenQuad(new ShaderMaterial({
|
|
31
|
-
uniforms: {
|
|
32
|
-
a: { value: buffer1().texture },
|
|
33
|
-
b: { value: buffer2().texture },
|
|
34
|
-
blend,
|
|
35
|
-
},
|
|
36
|
-
vertexShader: /*glsl*/ `
|
|
37
|
-
varying vec2 vUv;
|
|
38
|
-
void main() {
|
|
39
|
-
vUv = uv;
|
|
40
|
-
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
41
|
-
}`,
|
|
42
|
-
fragmentShader: /*glsl*/ `
|
|
43
|
-
uniform sampler2D a;
|
|
44
|
-
uniform sampler2D b;
|
|
45
|
-
uniform float blend;
|
|
46
|
-
varying vec2 vUv;
|
|
47
|
-
#include <packing>
|
|
48
|
-
void main() {
|
|
49
|
-
vec4 ta = texture2D(a, vUv);
|
|
50
|
-
vec4 tb = texture2D(b, vUv);
|
|
51
|
-
gl_FragColor = mix(tb, ta, blend);
|
|
52
|
-
#include <tonemapping_fragment>
|
|
53
|
-
#include <${getVersion() >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>
|
|
54
|
-
}`,
|
|
55
|
-
}));
|
|
56
|
-
return [quad, blend];
|
|
57
|
-
});
|
|
58
|
-
effect(() => {
|
|
59
|
-
portalScene().matrixAutoUpdate = false;
|
|
60
|
-
});
|
|
61
|
-
effect(() => {
|
|
62
|
-
const [events, setEvents] = [this.events(), portalSetEvents()];
|
|
63
|
-
if (!events)
|
|
64
|
-
return;
|
|
65
|
-
setEvents({ enabled: events });
|
|
66
|
-
});
|
|
67
|
-
effect((onCleanup) => {
|
|
68
|
-
const priority = this.priority();
|
|
69
|
-
// we start the before render in effect because we need the priority input to be resolved
|
|
70
|
-
const sub = injectBeforeRender(({ gl, camera }) => {
|
|
71
|
-
const material = this.material();
|
|
72
|
-
const localState = getLocalState(material);
|
|
73
|
-
if (!localState)
|
|
74
|
-
return;
|
|
75
|
-
const parent = localState.parent();
|
|
76
|
-
if (!parent)
|
|
77
|
-
return;
|
|
78
|
-
const materialBlend = 'blend' in material && typeof material.blend === 'number' ? material.blend : 0;
|
|
79
|
-
const [worldUnits, rootScene, scene, [quad, blend]] = [
|
|
80
|
-
this.worldUnits(),
|
|
81
|
-
this.rootScene(),
|
|
82
|
-
portalScene(),
|
|
83
|
-
fullScreenQuad(),
|
|
84
|
-
];
|
|
85
|
-
// Move portal contents along with the parent if worldUnits is true
|
|
86
|
-
if (!worldUnits) {
|
|
87
|
-
// If the portal renders exclusively the original scene needs to be updated
|
|
88
|
-
if (priority && materialBlend === 1)
|
|
89
|
-
parent.updateWorldMatrix(true, false);
|
|
90
|
-
scene.matrixWorld.copy(parent.matrixWorld);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
scene.matrixWorld.identity();
|
|
94
|
-
}
|
|
95
|
-
// This bit is only necessary if the portal is blended, now it has a render-priority
|
|
96
|
-
// and will take over the render loop
|
|
97
|
-
if (priority) {
|
|
98
|
-
if (materialBlend > 0 && materialBlend < 1) {
|
|
99
|
-
// If blend is ongoing (> 0 and < 1) then we need to render both the root scene
|
|
100
|
-
// and the portal scene, both will then be mixed in the quad from above
|
|
101
|
-
blend.value = materialBlend;
|
|
102
|
-
gl.setRenderTarget(buffer1());
|
|
103
|
-
gl.render(scene, camera);
|
|
104
|
-
gl.setRenderTarget(buffer2());
|
|
105
|
-
gl.render(rootScene, camera);
|
|
106
|
-
gl.setRenderTarget(null);
|
|
107
|
-
quad.render(gl);
|
|
108
|
-
}
|
|
109
|
-
else if (materialBlend === 1) {
|
|
110
|
-
// However if blend is 1 we only need to render the portal scene
|
|
111
|
-
gl.render(scene, camera);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}, { injector, priority });
|
|
115
|
-
onCleanup(() => sub());
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: ManagePortalScene, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
119
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.11", type: ManagePortalScene, isStandalone: true, selector: "ngts-manage-portal-scene", inputs: { events: { classPropertyName: "events", publicName: "events", isSignal: true, isRequired: false, transformFunction: null }, rootScene: { classPropertyName: "rootScene", publicName: "rootScene", isSignal: true, isRequired: true, transformFunction: null }, material: { classPropertyName: "material", publicName: "material", isSignal: true, isRequired: true, transformFunction: null }, priority: { classPropertyName: "priority", publicName: "priority", isSignal: true, isRequired: true, transformFunction: null }, worldUnits: { classPropertyName: "worldUnits", publicName: "worldUnits", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
|
|
120
|
-
}
|
|
121
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: ManagePortalScene, decorators: [{
|
|
122
|
-
type: Directive,
|
|
123
|
-
args: [{ selector: 'ngts-manage-portal-scene', standalone: true }]
|
|
124
|
-
}], ctorParameters: () => [] });
|
|
125
|
-
const defaultOptions = {
|
|
126
|
-
blend: 0,
|
|
127
|
-
blur: 0,
|
|
128
|
-
resolution: 512,
|
|
129
|
-
worldUnits: false,
|
|
130
|
-
eventPriority: 0,
|
|
131
|
-
renderPriority: 0,
|
|
132
|
-
events: false,
|
|
133
|
-
};
|
|
134
|
-
export class NgtsMeshPortalMaterial {
|
|
135
|
-
constructor() {
|
|
136
|
-
this.attach = input('material');
|
|
137
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
138
|
-
this.parameters = omit(this.options, ['blur', 'resolution', 'worldUnits', 'eventPriority', 'renderPriority', 'events']);
|
|
139
|
-
this.blur = pick(this.options, 'blur');
|
|
140
|
-
this.eventPriority = pick(this.options, 'eventPriority');
|
|
141
|
-
this.renderPriority = pick(this.options, 'renderPriority');
|
|
142
|
-
this.events = pick(this.options, 'events');
|
|
143
|
-
this.worldUnits = pick(this.options, 'worldUnits');
|
|
144
|
-
this.materialRef = viewChild.required('material');
|
|
145
|
-
this.content = contentChild.required(TemplateRef);
|
|
146
|
-
this.store = injectStore();
|
|
147
|
-
this.size = this.store.select('size');
|
|
148
|
-
this.viewport = this.store.select('viewport');
|
|
149
|
-
this.gl = this.store.select('gl');
|
|
150
|
-
this.setEvents = this.store.select('setEvents');
|
|
151
|
-
this.rootScene = this.store.select('scene');
|
|
152
|
-
this.materialResolution = computed(() => [
|
|
153
|
-
this.size().width * this.viewport().dpr,
|
|
154
|
-
this.size().height * this.viewport().dpr,
|
|
155
|
-
]);
|
|
156
|
-
this.resolution = pick(this.options, 'resolution');
|
|
157
|
-
this.parent = signal(null);
|
|
158
|
-
this.visible = injectIntersect(this.parent, { source: signal(true) });
|
|
159
|
-
this.renderTextureFrames = computed(() => (this.visible() ? Infinity : 0));
|
|
160
|
-
this.renderTextureCompute = computed(() => {
|
|
161
|
-
const [parent, material] = [this.parent(), this.materialRef().nativeElement];
|
|
162
|
-
const computeFn = (event, state) => {
|
|
163
|
-
if (!parent)
|
|
164
|
-
return false;
|
|
165
|
-
state.snapshot.pointer.set((event.offsetX / state.snapshot.size.width) * 2 - 1, -(event.offsetY / state.snapshot.size.height) * 2 + 1);
|
|
166
|
-
state.snapshot.raycaster.setFromCamera(state.snapshot.pointer, state.snapshot.camera);
|
|
167
|
-
if ('blend' in material && material.blend === 0) {
|
|
168
|
-
// We run a quick check against the parent, if it isn't hit there's no need to raycast at all
|
|
169
|
-
const [intersection] = state.snapshot.raycaster.intersectObject(parent);
|
|
170
|
-
if (!intersection) {
|
|
171
|
-
// Cancel out the raycast camera if the parent mesh isn't hit
|
|
172
|
-
Object.assign(state.snapshot.raycaster, { camera: undefined });
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
return;
|
|
177
|
-
};
|
|
178
|
-
return computeFn;
|
|
179
|
-
});
|
|
180
|
-
this.priority = signal(0);
|
|
181
|
-
extend({ MeshPortalMaterial });
|
|
182
|
-
effect(() => {
|
|
183
|
-
const material = this.materialRef().nativeElement;
|
|
184
|
-
const localState = getLocalState(material);
|
|
185
|
-
if (!localState)
|
|
186
|
-
return;
|
|
187
|
-
const materialParent = localState.parent();
|
|
188
|
-
if (!materialParent || !(materialParent instanceof Mesh))
|
|
189
|
-
return;
|
|
190
|
-
// Since the ref above is not tied to a mesh directly (we're inside a material),
|
|
191
|
-
// it has to be tied to the parent mesh here
|
|
192
|
-
this.parent.set(materialParent);
|
|
193
|
-
}, { allowSignalWrites: true });
|
|
194
|
-
effect(() => {
|
|
195
|
-
const events = this.events();
|
|
196
|
-
if (!events)
|
|
197
|
-
return;
|
|
198
|
-
const setEvents = this.setEvents();
|
|
199
|
-
setEvents({ enabled: !events });
|
|
200
|
-
});
|
|
201
|
-
effect(() => {
|
|
202
|
-
const [material, parent] = [this.materialRef().nativeElement, this.parent()];
|
|
203
|
-
if (!parent)
|
|
204
|
-
return;
|
|
205
|
-
const [resolution, blur, gl] = [this.resolution(), this.blur(), this.gl()];
|
|
206
|
-
// apply the SDF mask once
|
|
207
|
-
if (blur && material.sdf == null) {
|
|
208
|
-
meshPortalMaterialApplySDF(parent, resolution, gl);
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
injectBeforeRender(() => {
|
|
212
|
-
const material = this.materialRef().nativeElement;
|
|
213
|
-
const priority = 'blend' in material && typeof material.blend === 'number' && material.blend > 0
|
|
214
|
-
? Math.max(1, this.renderPriority())
|
|
215
|
-
: 0;
|
|
216
|
-
// If blend is > 0 then the portal is being entered, the render-priority must change
|
|
217
|
-
if (this.priority() !== priority) {
|
|
218
|
-
this.priority.set(priority);
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsMeshPortalMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
223
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.11", type: NgtsMeshPortalMaterial, isStandalone: true, selector: "ngts-mesh-portal-material", inputs: { attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "content", first: true, predicate: TemplateRef, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "materialRef", first: true, predicate: ["material"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
224
|
-
<ngt-mesh-portal-material
|
|
225
|
-
#material
|
|
226
|
-
[attach]="attach()"
|
|
227
|
-
[blur]="blur()"
|
|
228
|
-
[blend]="0"
|
|
229
|
-
[resolution]="materialResolution()"
|
|
230
|
-
[parameters]="parameters()"
|
|
231
|
-
>
|
|
232
|
-
<ngts-render-texture
|
|
233
|
-
[options]="{
|
|
234
|
-
frames: renderTextureFrames(),
|
|
235
|
-
eventPriority: eventPriority(),
|
|
236
|
-
renderPriority: renderPriority(),
|
|
237
|
-
compute: renderTextureCompute(),
|
|
238
|
-
}"
|
|
239
|
-
>
|
|
240
|
-
<ng-template renderTextureContent let-injector="injector">
|
|
241
|
-
<ng-container *ngTemplateOutlet="content(); injector: injector" />
|
|
242
|
-
<ngts-manage-portal-scene
|
|
243
|
-
[events]="events()"
|
|
244
|
-
[rootScene]="rootScene()"
|
|
245
|
-
[priority]="priority()"
|
|
246
|
-
[material]="material"
|
|
247
|
-
[worldUnits]="worldUnits()"
|
|
248
|
-
/>
|
|
249
|
-
</ng-template>
|
|
250
|
-
</ngts-render-texture>
|
|
251
|
-
</ngt-mesh-portal-material>
|
|
252
|
-
`, isInline: true, dependencies: [{ kind: "component", type: NgtsRenderTexture, selector: "ngts-render-texture", inputs: ["attach", "options"] }, { kind: "directive", type: NgtsRenderTextureContent, selector: "ng-template[renderTextureContent]" }, { kind: "directive", type: ManagePortalScene, selector: "ngts-manage-portal-scene", inputs: ["events", "rootScene", "material", "priority", "worldUnits"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
253
|
-
}
|
|
254
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsMeshPortalMaterial, decorators: [{
|
|
255
|
-
type: Component,
|
|
256
|
-
args: [{
|
|
257
|
-
selector: 'ngts-mesh-portal-material',
|
|
258
|
-
standalone: true,
|
|
259
|
-
template: `
|
|
260
|
-
<ngt-mesh-portal-material
|
|
261
|
-
#material
|
|
262
|
-
[attach]="attach()"
|
|
263
|
-
[blur]="blur()"
|
|
264
|
-
[blend]="0"
|
|
265
|
-
[resolution]="materialResolution()"
|
|
266
|
-
[parameters]="parameters()"
|
|
267
|
-
>
|
|
268
|
-
<ngts-render-texture
|
|
269
|
-
[options]="{
|
|
270
|
-
frames: renderTextureFrames(),
|
|
271
|
-
eventPriority: eventPriority(),
|
|
272
|
-
renderPriority: renderPriority(),
|
|
273
|
-
compute: renderTextureCompute(),
|
|
274
|
-
}"
|
|
275
|
-
>
|
|
276
|
-
<ng-template renderTextureContent let-injector="injector">
|
|
277
|
-
<ng-container *ngTemplateOutlet="content(); injector: injector" />
|
|
278
|
-
<ngts-manage-portal-scene
|
|
279
|
-
[events]="events()"
|
|
280
|
-
[rootScene]="rootScene()"
|
|
281
|
-
[priority]="priority()"
|
|
282
|
-
[material]="material"
|
|
283
|
-
[worldUnits]="worldUnits()"
|
|
284
|
-
/>
|
|
285
|
-
</ng-template>
|
|
286
|
-
</ngts-render-texture>
|
|
287
|
-
</ngt-mesh-portal-material>
|
|
288
|
-
`,
|
|
289
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
290
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
291
|
-
imports: [NgtsRenderTexture, NgtsRenderTextureContent, ManagePortalScene, NgTemplateOutlet],
|
|
292
|
-
}]
|
|
293
|
-
}], ctorParameters: () => [] });
|
|
294
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1wb3J0YWwtbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvbWF0ZXJpYWxzL3NyYy9saWIvbWVzaC1wb3J0YWwtbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixzQkFBc0IsRUFDdEIsU0FBUyxFQUNULE1BQU0sRUFFTixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ04sTUFBTSxFQUNOLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsV0FBVyxFQUlYLElBQUksRUFDSixJQUFJLEdBQ0osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekYsT0FBTyxFQUNOLGtCQUFrQixFQUNsQiwwQkFBMEIsR0FFMUIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBUyxjQUFjLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFFOUM7O0dBRUc7QUFFSCxNQUFNLE9BQU8saUJBQWlCO0lBTzdCO1FBTkEsV0FBTSxHQUFHLEtBQUssRUFBVyxDQUFDO1FBQzFCLGNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFTLENBQUM7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LENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFTixvRkFBb0Y7WUFDcEYsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7K0dBaEhXLHNCQUFzQjttR0FBdEIsc0JBQXNCLCtYQVlGLFdBQVcseUxBOUNqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE2QlQsNERBR1MsaUJBQWlCLCtGQUFFLHdCQUF3Qiw4RUFuTHpDLGlCQUFpQiw0SUFtTDZDLGdCQUFnQjs7NEZBRTlFLHNCQUFzQjtrQkFyQ2xDLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE2QlQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQztpQkFDM0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdGNvbXB1dGVkLFxuXHRjb250ZW50Q2hpbGQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdERpcmVjdGl2ZSxcblx0ZWZmZWN0LFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdEluamVjdG9yLFxuXHRpbnB1dCxcblx0c2lnbmFsLFxuXHRUZW1wbGF0ZVJlZixcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG5cdGV4dGVuZCxcblx0Z2V0TG9jYWxTdGF0ZSxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3RTdG9yZSxcblx0Tmd0QXR0YWNoYWJsZSxcblx0Tmd0Q29tcHV0ZUZ1bmN0aW9uLFxuXHROZ3RTaGFkZXJNYXRlcmlhbCxcblx0b21pdCxcblx0cGljayxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uLCBpbmplY3RGQk8sIGluamVjdEludGVyc2VjdCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS9taXNjJztcbmltcG9ydCB7IE5ndHNSZW5kZXJUZXh0dXJlLCBOZ3RzUmVuZGVyVGV4dHVyZUNvbnRlbnQgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvc3RhZ2luZyc7XG5pbXBvcnQge1xuXHRNZXNoUG9ydGFsTWF0ZXJpYWwsXG5cdG1lc2hQb3J0YWxNYXRlcmlhbEFwcGx5U0RGLFxuXHROZ3RNZXNoUG9ydGFsTWF0ZXJpYWwsXG59IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS92YW5pbGxhLWV4cG9ydHMnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgTWVzaCwgU2NlbmUsIFNoYWRlck1hdGVyaWFsIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgRnVsbFNjcmVlblF1YWQgfSBmcm9tICd0aHJlZS1zdGRsaWInO1xuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIGlzIHVzZWQgaW5zaWRlIG9mIHRoZSByZW5kZXIgdGV4dHVyZSwgaGVuY2UgaGFzIGFjY2VzcyB0byB0aGUgcmVuZGVyIHRleHR1cmUgc3RvcmUgKGEgcG9ydGFsIHN0b3JlKVxuICovXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICduZ3RzLW1hbmFnZS1wb3J0YWwtc2NlbmUnLCBzdGFuZGFsb25lOiB0cnVlIH0pXG5leHBvcnQgY2xhc3MgTWFuYWdlUG9ydGFsU2NlbmUge1xuXHRldmVudHMgPSBpbnB1dDxib29sZWFuPigpO1xuXHRyb290U2NlbmUgPSBpbnB1dC5yZXF1aXJlZDxTY2VuZT4oKTtcblx0bWF0ZXJpYWwgPSBpbnB1dC5yZXF1aXJlZDxOZ3RNZXNoUG9ydGFsTWF0ZXJpYWw+KCk7XG5cdHByaW9yaXR5ID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuXHR3b3JsZFVuaXRzID0gaW5wdXQucmVxdWlyZWQ8Ym9vbGVhbj4oKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRjb25zdCBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cdFx0Y29uc3QgcmVuZGVyVGV4dHVyZVN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0XHRjb25zdCBwb3J0YWxTY2VuZSA9IHJlbmRlclRleHR1cmVTdG9yZS5zZWxlY3QoJ3NjZW5lJyk7XG5cdFx0Y29uc3QgcG9ydGFsU2V0RXZlbnRzID0gcmVuZGVyVGV4dHVyZVN0b3JlLnNlbGVjdCgnc2V0RXZlbnRzJyk7XG5cblx0XHRjb25zdCBidWZmZXIxID0gaW5qZWN0RkJPKCk7XG5cdFx0Y29uc3QgYnVmZmVyMiA9IGluamVjdEZCTygpO1xuXG5cdFx0Y29uc3QgZnVsbFNjcmVlblF1YWQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0XHQvLyBUaGlzIGZ1bGxzY3JlZW4tcXVhZCBpcyB1c2VkIHRvIGJsZW5kIHRoZSB0d28gdGV4dHVyZXNcblx0XHRcdGNvbnN0IGJsZW5kID0geyB2YWx1ZTogMCB9O1xuXHRcdFx0Y29uc3QgcXVhZCA9IG5ldyBGdWxsU2NyZWVuUXVhZChcblx0XHRcdFx0bmV3IFNoYWRlck1hdGVyaWFsKHtcblx0XHRcdFx0XHR1bmlmb3Jtczoge1xuXHRcdFx0XHRcdFx0YTogeyB2YWx1ZTogYnVmZmVyMSgpLnRleHR1cmUgfSxcblx0XHRcdFx0XHRcdGI6IHsgdmFsdWU6IGJ1ZmZlcjIoKS50ZXh0dXJlIH0sXG5cdFx0XHRcdFx0XHRibGVuZCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogLypnbHNsKi8gYFxuXHRcdCAgICAgIHZhcnlpbmcgdmVjMiB2VXY7XG5cdFx0ICAgICAgdm9pZCBtYWluKCkge1xuXHRcdCAgICAgICAgdlV2ID0gdXY7XG5cdFx0ICAgICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG5cdFx0ICAgICAgfWAsXG5cdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IC8qZ2xzbCovIGBcblx0XHQgICAgICB1bmlmb3JtIHNhbXBsZXIyRCBhO1xuXHRcdCAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIGI7XG5cdFx0ICAgICAgdW5pZm9ybSBmbG9hdCBibGVuZDtcblx0XHQgICAgICB2YXJ5aW5nIHZlYzIgdlV2O1xuXHRcdCAgICAgICNpbmNsdWRlIDxwYWNraW5nPlxuXHRcdCAgICAgIHZvaWQgbWFpbigpIHtcblx0XHQgICAgICAgIHZlYzQgdGEgPSB0ZXh0dXJlMkQoYSwgdlV2KTtcblx0XHQgICAgICAgIHZlYzQgdGIgPSB0ZXh0dXJlMkQoYiwgdlV2KTtcblx0XHQgICAgICAgIGdsX0ZyYWdDb2xvciA9IG1peCh0YiwgdGEsIGJsZW5kKTtcblx0XHQgICAgICAgICNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0XHQgICAgICAgICNpbmNsdWRlIDwke2dldFZlcnNpb24oKSA+PSAxNTQgPyAnY29sb3JzcGFjZV9mcmFnbWVudCcgOiAnZW5jb2RpbmdzX2ZyYWdtZW50J30+XG5cdFx0ICAgICAgfWAsXG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblx0XHRcdHJldHVybiBbcXVhZCwgYmxlbmRdIGFzIGNvbnN0O1xuXHRcdH0pO1xuXG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdHBvcnRhbFNjZW5lKCkubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHRcdH0pO1xuXG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IFtldmVudHMsIHNldEV2ZW50c10gPSBbdGhpcy5ldmVudHMoKSwgcG9ydGFsU2V0RXZlbnRzKCldO1xuXHRcdFx0aWYgKCFldmVudHMpIHJldHVybjtcblx0XHRcdHNldEV2ZW50cyh7IGVuYWJsZWQ6IGV2ZW50cyB9KTtcblx0XHR9KTtcblxuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBwcmlvcml0eSA9IHRoaXMucHJpb3JpdHkoKTtcblxuXHRcdFx0Ly8gd2Ugc3RhcnQgdGhlIGJlZm9yZSByZW5kZXIgaW4gZWZmZWN0IGJlY2F1c2Ugd2UgbmVlZCB0aGUgcHJpb3JpdHkgaW5wdXQgdG8gYmUgcmVzb2x2ZWRcblx0XHRcdGNvbnN0IHN1YiA9IGluamVjdEJlZm9yZVJlbmRlcihcblx0XHRcdFx0KHsgZ2wsIGNhbWVyYSB9KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsKCk7XG5cblx0XHRcdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShtYXRlcmlhbCk7XG5cdFx0XHRcdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBwYXJlbnQgPSBsb2NhbFN0YXRlLnBhcmVudCgpO1xuXHRcdFx0XHRcdGlmICghcGFyZW50KSByZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbEJsZW5kID0gJ2JsZW5kJyBpbiBtYXRlcmlhbCAmJiB0eXBlb2YgbWF0ZXJpYWwuYmxlbmQgPT09ICdudW1iZXInID8gbWF0ZXJpYWwuYmxlbmQgOiAwO1xuXHRcdFx0XHRcdGNvbnN0IFt3b3JsZFVuaXRzLCByb290U2NlbmUsIHNjZW5lLCBbcXVhZCwgYmxlbmRdXSA9IFtcblx0XHRcdFx0XHRcdHRoaXMud29ybGRVbml0cygpLFxuXHRcdFx0XHRcdFx0dGhpcy5yb290U2NlbmUoKSxcblx0XHRcdFx0XHRcdHBvcnRhbFNjZW5lKCksXG5cdFx0XHRcdFx0XHRmdWxsU2NyZWVuUXVhZCgpLFxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0Ly8gTW92ZSBwb3J0YWwgY29udGVudHMgYWxvbmcgd2l0aCB0aGUgcGFyZW50IGlmIHdvcmxkVW5pdHMgaXMgdHJ1ZVxuXHRcdFx0XHRcdGlmICghd29ybGRVbml0cykge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHBvcnRhbCByZW5kZXJzIGV4Y2x1c2l2ZWx5IHRoZSBvcmlnaW5hbCBzY2VuZSBuZWVkcyB0byBiZSB1cGRhdGVkXG5cdFx0XHRcdFx0XHRpZiAocHJpb3JpdHkgJiYgbWF0ZXJpYWxCbGVuZCA9PT0gMSkgcGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHNjZW5lLm1hdHJpeFdvcmxkLmNvcHkocGFyZW50Lm1hdHJpeFdvcmxkKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2NlbmUubWF0cml4V29ybGQuaWRlbnRpdHkoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBUaGlzIGJpdCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB0aGUgcG9ydGFsIGlzIGJsZW5kZWQsIG5vdyBpdCBoYXMgYSByZW5kZXItcHJpb3JpdHlcblx0XHRcdFx0XHQvLyBhbmQgd2lsbCB0YWtlIG92ZXIgdGhlIHJlbmRlciBsb29wXG5cdFx0XHRcdFx0aWYgKHByaW9yaXR5KSB7XG5cdFx0XHRcdFx0XHRpZiAobWF0ZXJpYWxCbGVuZCA+IDAgJiYgbWF0ZXJpYWxCbGVuZCA8IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgYmxlbmQgaXMgb25nb2luZyAoPiAwIGFuZCA8IDEpIHRoZW4gd2UgbmVlZCB0byByZW5kZXIgYm90aCB0aGUgcm9vdCBzY2VuZVxuXHRcdFx0XHRcdFx0XHQvLyBhbmQgdGhlIHBvcnRhbCBzY2VuZSwgYm90aCB3aWxsIHRoZW4gYmUgbWl4ZWQgaW4gdGhlIHF1YWQgZnJvbSBhYm92ZVxuXHRcdFx0XHRcdFx0XHRibGVuZC52YWx1ZSA9IG1hdGVyaWFsQmxlbmQ7XG5cdFx0XHRcdFx0XHRcdGdsLnNldFJlbmRlclRhcmdldChidWZmZXIxKCkpO1xuXHRcdFx0XHRcdFx0XHRnbC5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7XG5cdFx0XHRcdFx0XHRcdGdsLnNldFJlbmRlclRhcmdldChidWZmZXIyKCkpO1xuXHRcdFx0XHRcdFx0XHRnbC5yZW5kZXIocm9vdFNjZW5lLCBjYW1lcmEpO1xuXHRcdFx0XHRcdFx0XHRnbC5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XG5cdFx0XHRcdFx0XHRcdHF1YWQucmVuZGVyKGdsKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobWF0ZXJpYWxCbGVuZCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHQvLyBIb3dldmVyIGlmIGJsZW5kIGlzIDEgd2Ugb25seSBuZWVkIHRvIHJlbmRlciB0aGUgcG9ydGFsIHNjZW5lXG5cdFx0XHRcdFx0XHRcdGdsLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHsgaW5qZWN0b3IsIHByaW9yaXR5IH0sXG5cdFx0XHQpO1xuXHRcdFx0b25DbGVhbnVwKCgpID0+IHN1YigpKTtcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNNZXNoUG9ydGFsTWF0ZXJpYWxPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxOZ3RTaGFkZXJNYXRlcmlhbD4ge1xuXHQvKiogTWl4IHRoZSBwb3J0YWxzIG93biBzY2VuZSB3aXRoIHRoZSB3b3JsZCBzY2VuZSwgMCA9IHdvcmxkIHNjZW5lIHJlbmRlcixcblx0ICogIDAuNSA9IGJvdGggc2NlbmVzIHJlbmRlciwgMSA9IHBvcnRhbCBzY2VuZSByZW5kZXJzLCBkZWZhdWx0cyB0byAwLiAgICovXG5cdGJsZW5kOiBudW1iZXI7XG5cdC8qKiBFZGdlIGZhZGUgYmx1ciwgMCA9IG5vIGJsdXIgKGRlZmF1bHQpICovXG5cdGJsdXI6IG51bWJlcjtcblx0LyoqIFNERiByZXNvbHV0aW9uLCB0aGUgc21hbGxlciB0aGUgZmFzdGVyIGlzIHRoZSBzdGFydC11cCB0aW1lIChkZWZhdWx0OiA1MTIpICovXG5cdHJlc29sdXRpb246IG51bWJlcjtcblx0LyoqIEJ5IGRlZmF1bHQgcG9ydGFscyB1c2UgcmVsYXRpdmUgY29vcmRpbmF0ZXMsIGNvbnRlbnRzIGFyZSBhZmZlY3RzIGJ5IHRoZSBsb2NhbCBtYXRyaXggdHJhbnNmb3JtICovXG5cdHdvcmxkVW5pdHM6IGJvb2xlYW47XG5cdC8qKiBPcHRpb25hbCBldmVudCBwcmlvcml0eSwgZGVmYXVsdHMgdG8gMCAqL1xuXHRldmVudFByaW9yaXR5OiBudW1iZXI7XG5cdC8qKiBPcHRpb25hbCByZW5kZXIgcHJpb3JpdHksIGRlZmF1bHRzIHRvIDAgKi9cblx0cmVuZGVyUHJpb3JpdHk6IG51bWJlcjtcblx0LyoqIE9wdGlvbmFsbHkgZGlhYmxlIGV2ZW50cyBpbnNpZGUgdGhlIHBvcnRhbCwgZGVmYXVsdHMgdG8gZmFsc2UgKi9cblx0ZXZlbnRzOiBib29sZWFuO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0c01lc2hQb3J0YWxNYXRlcmlhbE9wdGlvbnMgPSB7XG5cdGJsZW5kOiAwLFxuXHRibHVyOiAwLFxuXHRyZXNvbHV0aW9uOiA1MTIsXG5cdHdvcmxkVW5pdHM6IGZhbHNlLFxuXHRldmVudFByaW9yaXR5OiAwLFxuXHRyZW5kZXJQcmlvcml0eTogMCxcblx0ZXZlbnRzOiBmYWxzZSxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtbWVzaC1wb3J0YWwtbWF0ZXJpYWwnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtbWVzaC1wb3J0YWwtbWF0ZXJpYWxcblx0XHRcdCNtYXRlcmlhbFxuXHRcdFx0W2F0dGFjaF09XCJhdHRhY2goKVwiXG5cdFx0XHRbYmx1cl09XCJibHVyKClcIlxuXHRcdFx0W2JsZW5kXT1cIjBcIlxuXHRcdFx0W3Jlc29sdXRpb25dPVwibWF0ZXJpYWxSZXNvbHV0aW9uKClcIlxuXHRcdFx0W3BhcmFtZXRlcnNdPVwicGFyYW1ldGVycygpXCJcblx0XHQ+XG5cdFx0XHQ8bmd0cy1yZW5kZXItdGV4dHVyZVxuXHRcdFx0XHRbb3B0aW9uc109XCJ7XG5cdFx0XHRcdFx0ZnJhbWVzOiByZW5kZXJUZXh0dXJlRnJhbWVzKCksXG5cdFx0XHRcdFx0ZXZlbnRQcmlvcml0eTogZXZlbnRQcmlvcml0eSgpLFxuXHRcdFx0XHRcdHJlbmRlclByaW9yaXR5OiByZW5kZXJQcmlvcml0eSgpLFxuXHRcdFx0XHRcdGNvbXB1dGU6IHJlbmRlclRleHR1cmVDb21wdXRlKCksXG5cdFx0XHRcdH1cIlxuXHRcdFx0PlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgcmVuZGVyVGV4dHVyZUNvbnRlbnQgbGV0LWluamVjdG9yPVwiaW5qZWN0b3JcIj5cblx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudCgpOyBpbmplY3RvcjogaW5qZWN0b3JcIiAvPlxuXHRcdFx0XHRcdDxuZ3RzLW1hbmFnZS1wb3J0YWwtc2NlbmVcblx0XHRcdFx0XHRcdFtldmVudHNdPVwiZXZlbnRzKClcIlxuXHRcdFx0XHRcdFx0W3Jvb3RTY2VuZV09XCJyb290U2NlbmUoKVwiXG5cdFx0XHRcdFx0XHRbcHJpb3JpdHldPVwicHJpb3JpdHkoKVwiXG5cdFx0XHRcdFx0XHRbbWF0ZXJpYWxdPVwibWF0ZXJpYWxcIlxuXHRcdFx0XHRcdFx0W3dvcmxkVW5pdHNdPVwid29ybGRVbml0cygpXCJcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9uZ3RzLXJlbmRlci10ZXh0dXJlPlxuXHRcdDwvbmd0LW1lc2gtcG9ydGFsLW1hdGVyaWFsPlxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRpbXBvcnRzOiBbTmd0c1JlbmRlclRleHR1cmUsIE5ndHNSZW5kZXJUZXh0dXJlQ29udGVudCwgTWFuYWdlUG9ydGFsU2NlbmUsIE5nVGVtcGxhdGVPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzTWVzaFBvcnRhbE1hdGVyaWFsIHtcblx0YXR0YWNoID0gaW5wdXQ8Tmd0QXR0YWNoYWJsZT4oJ21hdGVyaWFsJyk7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbJ2JsdXInLCAncmVzb2x1dGlvbicsICd3b3JsZFVuaXRzJywgJ2V2ZW50UHJpb3JpdHknLCAncmVuZGVyUHJpb3JpdHknLCAnZXZlbnRzJ10pO1xuXG5cdGJsdXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2JsdXInKTtcblx0ZXZlbnRQcmlvcml0eSA9IHBpY2sodGhpcy5vcHRpb25zLCAnZXZlbnRQcmlvcml0eScpO1xuXHRyZW5kZXJQcmlvcml0eSA9IHBpY2sodGhpcy5vcHRpb25zLCAncmVuZGVyUHJpb3JpdHknKTtcblx0ZXZlbnRzID0gcGljayh0aGlzLm9wdGlvbnMsICdldmVudHMnKTtcblx0d29ybGRVbml0cyA9IHBpY2sodGhpcy5vcHRpb25zLCAnd29ybGRVbml0cycpO1xuXG5cdG1hdGVyaWFsUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SW5zdGFuY2VUeXBlPHR5cGVvZiBNZXNoUG9ydGFsTWF0ZXJpYWw+Pj4oJ21hdGVyaWFsJyk7XG5cdGNvbnRlbnQgPSBjb250ZW50Q2hpbGQucmVxdWlyZWQoVGVtcGxhdGVSZWYpO1xuXG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIHNpemUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnc2l6ZScpO1xuXHRwcml2YXRlIHZpZXdwb3J0ID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3ZpZXdwb3J0Jyk7XG5cdHByaXZhdGUgZ2wgPSB0aGlzLnN0b3JlLnNlbGVjdCgnZ2wnKTtcblx0cHJpdmF0ZSBzZXRFdmVudHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnc2V0RXZlbnRzJyk7XG5cdHJvb3RTY2VuZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuXG5cdG1hdGVyaWFsUmVzb2x1dGlvbiA9IGNvbXB1dGVkKCgpID0+IFtcblx0XHR0aGlzLnNpemUoKS53aWR0aCAqIHRoaXMudmlld3BvcnQoKS5kcHIsXG5cdFx0dGhpcy5zaXplKCkuaGVpZ2h0ICogdGhpcy52aWV3cG9ydCgpLmRwcixcblx0XSk7XG5cdHByaXZhdGUgcmVzb2x1dGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAncmVzb2x1dGlvbicpO1xuXG5cdHByaXZhdGUgcGFyZW50ID0gc2lnbmFsPE1lc2ggfCBudWxsPihudWxsKTtcblx0cHJpdmF0ZSB2aXNpYmxlID0gaW5qZWN0SW50ZXJzZWN0KHRoaXMucGFyZW50LCB7IHNvdXJjZTogc2lnbmFsKHRydWUpIH0pO1xuXG5cdHJlbmRlclRleHR1cmVGcmFtZXMgPSBjb21wdXRlZCgoKSA9PiAodGhpcy52aXNpYmxlKCkgPyBJbmZpbml0eSA6IDApKTtcblx0cmVuZGVyVGV4dHVyZUNvbXB1dGUgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgW3BhcmVudCwgbWF0ZXJpYWxdID0gW3RoaXMucGFyZW50KCksIHRoaXMubWF0ZXJpYWxSZWYoKS5uYXRpdmVFbGVtZW50XTtcblxuXHRcdGNvbnN0IGNvbXB1dGVGbjogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Tmd0Q29tcHV0ZUZ1bmN0aW9uPikgPT4gZmFsc2UgfCB1bmRlZmluZWQgPSAoZXZlbnQsIHN0YXRlKSA9PiB7XG5cdFx0XHRpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0c3RhdGUuc25hcHNob3QucG9pbnRlci5zZXQoXG5cdFx0XHRcdChldmVudC5vZmZzZXRYIC8gc3RhdGUuc25hcHNob3Quc2l6ZS53aWR0aCkgKiAyIC0gMSxcblx0XHRcdFx0LShldmVudC5vZmZzZXRZIC8gc3RhdGUuc25hcHNob3Quc2l6ZS5oZWlnaHQpICogMiArIDEsXG5cdFx0XHQpO1xuXHRcdFx0c3RhdGUuc25hcHNob3QucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoc3RhdGUuc25hcHNob3QucG9pbnRlciwgc3RhdGUuc25hcHNob3QuY2FtZXJhKTtcblxuXHRcdFx0aWYgKCdibGVuZCcgaW4gbWF0ZXJpYWwgJiYgbWF0ZXJpYWwuYmxlbmQgPT09IDApIHtcblx0XHRcdFx0Ly8gV2UgcnVuIGEgcXVpY2sgY2hlY2sgYWdhaW5zdCB0aGUgcGFyZW50LCBpZiBpdCBpc24ndCBoaXQgdGhlcmUncyBubyBuZWVkIHRvIHJheWNhc3QgYXQgYWxsXG5cdFx0XHRcdGNvbnN0IFtpbnRlcnNlY3Rpb25dID0gc3RhdGUuc25hcHNob3QucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdChwYXJlbnQpO1xuXHRcdFx0XHRpZiAoIWludGVyc2VjdGlvbikge1xuXHRcdFx0XHRcdC8vIENhbmNlbCBvdXQgdGhlIHJheWNhc3QgY2FtZXJhIGlmIHRoZSBwYXJlbnQgbWVzaCBpc24ndCBoaXRcblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKHN0YXRlLnNuYXBzaG90LnJheWNhc3RlciwgeyBjYW1lcmE6IHVuZGVmaW5lZCB9KTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gY29tcHV0ZUZuO1xuXHR9KTtcblxuXHRwcmlvcml0eSA9IHNpZ25hbCgwKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRleHRlbmQoeyBNZXNoUG9ydGFsTWF0ZXJpYWwgfSk7XG5cblx0XHRlZmZlY3QoXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbFJlZigpLm5hdGl2ZUVsZW1lbnQ7XG5cblx0XHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobWF0ZXJpYWwpO1xuXHRcdFx0XHRpZiAoIWxvY2FsU3RhdGUpIHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBtYXRlcmlhbFBhcmVudCA9IGxvY2FsU3RhdGUucGFyZW50KCk7XG5cdFx0XHRcdGlmICghbWF0ZXJpYWxQYXJlbnQgfHwgIShtYXRlcmlhbFBhcmVudCBpbnN0YW5jZW9mIE1lc2gpKSByZXR1cm47XG5cblx0XHRcdFx0Ly8gU2luY2UgdGhlIHJlZiBhYm92ZSBpcyBub3QgdGllZCB0byBhIG1lc2ggZGlyZWN0bHkgKHdlJ3JlIGluc2lkZSBhIG1hdGVyaWFsKSxcblx0XHRcdFx0Ly8gaXQgaGFzIHRvIGJlIHRpZWQgdG8gdGhlIHBhcmVudCBtZXNoIGhlcmVcblx0XHRcdFx0dGhpcy5wYXJlbnQuc2V0KG1hdGVyaWFsUGFyZW50KTtcblx0XHRcdH0sXG5cdFx0XHR7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG5cdFx0KTtcblxuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cygpO1xuXHRcdFx0aWYgKCFldmVudHMpIHJldHVybjtcblxuXHRcdFx0Y29uc3Qgc2V0RXZlbnRzID0gdGhpcy5zZXRFdmVudHMoKTtcblx0XHRcdHNldEV2ZW50cyh7IGVuYWJsZWQ6ICFldmVudHMgfSk7XG5cdFx0fSk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW21hdGVyaWFsLCBwYXJlbnRdID0gW3RoaXMubWF0ZXJpYWxSZWYoKS5uYXRpdmVFbGVtZW50LCB0aGlzLnBhcmVudCgpXTtcblx0XHRcdGlmICghcGFyZW50KSByZXR1cm47XG5cblx0XHRcdGNvbnN0IFtyZXNvbHV0aW9uLCBibHVyLCBnbF0gPSBbdGhpcy5yZXNvbHV0aW9uKCksIHRoaXMuYmx1cigpLCB0aGlzLmdsKCldO1xuXG5cdFx0XHQvLyBhcHBseSB0aGUgU0RGIG1hc2sgb25jZVxuXHRcdFx0aWYgKGJsdXIgJiYgbWF0ZXJpYWwuc2RmID09IG51bGwpIHtcblx0XHRcdFx0bWVzaFBvcnRhbE1hdGVyaWFsQXBwbHlTREYocGFyZW50LCByZXNvbHV0aW9uLCBnbCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpbmplY3RCZWZvcmVSZW5kZXIoKCkgPT4ge1xuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsUmVmKCkubmF0aXZlRWxlbWVudDtcblx0XHRcdGNvbnN0IHByaW9yaXR5ID1cblx0XHRcdFx0J2JsZW5kJyBpbiBtYXRlcmlhbCAmJiB0eXBlb2YgbWF0ZXJpYWwuYmxlbmQgPT09ICdudW1iZXInICYmIG1hdGVyaWFsLmJsZW5kID4gMFxuXHRcdFx0XHRcdD8gTWF0aC5tYXgoMSwgdGhpcy5yZW5kZXJQcmlvcml0eSgpKVxuXHRcdFx0XHRcdDogMDtcblxuXHRcdFx0Ly8gSWYgYmxlbmQgaXMgPiAwIHRoZW4gdGhlIHBvcnRhbCBpcyBiZWluZyBlbnRlcmVkLCB0aGUgcmVuZGVyLXByaW9yaXR5IG11c3QgY2hhbmdlXG5cdFx0XHRpZiAodGhpcy5wcmlvcml0eSgpICE9PSBwcmlvcml0eSkge1xuXHRcdFx0XHR0aGlzLnByaW9yaXR5LnNldChwcmlvcml0eSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
|