angular-three-soba 1.9.3 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/abstractions/index.d.ts +1 -0
  2. package/abstractions/lib/edges/edges.d.ts +18 -0
  3. package/cameras/index.d.ts +1 -0
  4. package/cameras/lib/camera/camera-content.d.ts +1 -1
  5. package/cameras/lib/cube-camera/cube-camera.d.ts +27 -0
  6. package/esm2020/abstractions/index.mjs +2 -1
  7. package/esm2020/abstractions/lib/billboard/billboard.mjs +3 -3
  8. package/esm2020/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +3 -3
  9. package/esm2020/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +3 -3
  10. package/esm2020/abstractions/lib/edges/edges.mjs +95 -0
  11. package/esm2020/abstractions/lib/gizmo-helper/gizmo-helper.mjs +6 -6
  12. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +3 -3
  13. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +6 -6
  14. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +3 -3
  15. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +3 -3
  16. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +6 -6
  17. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +3 -3
  18. package/esm2020/abstractions/lib/line/line-input.mjs +3 -3
  19. package/esm2020/abstractions/lib/line/line.mjs +3 -3
  20. package/esm2020/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +3 -3
  21. package/esm2020/abstractions/lib/text/text.mjs +3 -3
  22. package/esm2020/abstractions/lib/text-3d/text-3d.mjs +3 -3
  23. package/esm2020/cameras/index.mjs +2 -1
  24. package/esm2020/cameras/lib/camera/camera-content.mjs +4 -4
  25. package/esm2020/cameras/lib/camera/camera.mjs +3 -3
  26. package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +130 -0
  27. package/esm2020/cameras/lib/orthographic-camera/orthographic-camera.mjs +3 -3
  28. package/esm2020/cameras/lib/perspective-camera/perspective-camera.mjs +3 -3
  29. package/esm2020/controls/lib/orbit-controls/orbit-controls.mjs +3 -3
  30. package/esm2020/loaders/lib/loader/loader.mjs +3 -3
  31. package/esm2020/materials/index.mjs +3 -1
  32. package/esm2020/materials/lib/mesh-distort-material/mesh-distort-material.mjs +3 -3
  33. package/esm2020/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +3 -3
  34. package/esm2020/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +157 -0
  35. package/esm2020/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +240 -0
  36. package/esm2020/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +3 -3
  37. package/esm2020/misc/lib/bake-shadows/bake-shadows.mjs +3 -3
  38. package/esm2020/misc/lib/fbo/fbo.mjs +5 -4
  39. package/esm2020/performance/lib/adaptive/adaptive-dpr.mjs +3 -3
  40. package/esm2020/performance/lib/adaptive/adaptive-events.mjs +3 -3
  41. package/esm2020/performance/lib/detailed/detailed.mjs +3 -3
  42. package/esm2020/performance/lib/stats/stats.mjs +3 -3
  43. package/esm2020/shaders/index.mjs +6 -1
  44. package/esm2020/shaders/lib/caustics-material/caustics-material.mjs +128 -0
  45. package/esm2020/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +33 -0
  46. package/esm2020/shaders/lib/discard-material/discard-material.mjs +3 -0
  47. package/esm2020/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +169 -0
  48. package/esm2020/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +268 -0
  49. package/esm2020/staging/index.mjs +2 -1
  50. package/esm2020/staging/lib/accumulative-shadows/accumulative-shadows.mjs +6 -6
  51. package/esm2020/staging/lib/accumulative-shadows/progressive-light-map.mjs +2 -3
  52. package/esm2020/staging/lib/accumulative-shadows/randomized-lights.mjs +6 -6
  53. package/esm2020/staging/lib/bounds/bounds.mjs +3 -3
  54. package/esm2020/staging/lib/camera-shake/camera-shake.mjs +3 -3
  55. package/esm2020/staging/lib/caustics/caustics.mjs +364 -0
  56. package/esm2020/staging/lib/center/center.mjs +3 -3
  57. package/esm2020/staging/lib/cloud/cloud.mjs +3 -3
  58. package/esm2020/staging/lib/contact-shadows/contact-shadows.mjs +3 -3
  59. package/esm2020/staging/lib/environment/environment-cube.mjs +3 -3
  60. package/esm2020/staging/lib/environment/environment-ground.mjs +3 -3
  61. package/esm2020/staging/lib/environment/environment-inputs.mjs +3 -3
  62. package/esm2020/staging/lib/environment/environment-map.mjs +3 -3
  63. package/esm2020/staging/lib/environment/environment-portal.mjs +3 -3
  64. package/esm2020/staging/lib/environment/environment.mjs +6 -6
  65. package/esm2020/staging/lib/float/float.mjs +3 -3
  66. package/esm2020/staging/lib/sky/sky.mjs +3 -3
  67. package/esm2020/staging/lib/sparkles/sparkles.mjs +3 -3
  68. package/esm2020/staging/lib/spot-light/shadow-mesh-input.mjs +3 -3
  69. package/esm2020/staging/lib/spot-light/spot-light-input.mjs +3 -3
  70. package/esm2020/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +3 -3
  71. package/esm2020/staging/lib/spot-light/spot-light-shadow-shader.mjs +3 -3
  72. package/esm2020/staging/lib/spot-light/spot-light-shadow.mjs +3 -3
  73. package/esm2020/staging/lib/spot-light/spot-light.mjs +3 -3
  74. package/esm2020/staging/lib/spot-light/volumetric-mesh.mjs +3 -3
  75. package/esm2020/staging/lib/stage/stage.mjs +6 -6
  76. package/esm2020/staging/lib/stars/stars.mjs +3 -3
  77. package/fesm2015/angular-three-soba-abstractions.mjs +145 -56
  78. package/fesm2015/angular-three-soba-abstractions.mjs.map +1 -1
  79. package/fesm2015/angular-three-soba-cameras.mjs +139 -16
  80. package/fesm2015/angular-three-soba-cameras.mjs.map +1 -1
  81. package/fesm2015/angular-three-soba-controls.mjs +3 -3
  82. package/fesm2015/angular-three-soba-loaders.mjs +3 -3
  83. package/fesm2015/angular-three-soba-materials.mjs +398 -11
  84. package/fesm2015/angular-three-soba-materials.mjs.map +1 -1
  85. package/fesm2015/angular-three-soba-misc.mjs +7 -6
  86. package/fesm2015/angular-three-soba-misc.mjs.map +1 -1
  87. package/fesm2015/angular-three-soba-performance.mjs +12 -12
  88. package/fesm2015/angular-three-soba-shaders.mjs +619 -31
  89. package/fesm2015/angular-three-soba-shaders.mjs.map +1 -1
  90. package/fesm2015/angular-three-soba-staging.mjs +450 -96
  91. package/fesm2015/angular-three-soba-staging.mjs.map +1 -1
  92. package/fesm2020/angular-three-soba-abstractions.mjs +145 -56
  93. package/fesm2020/angular-three-soba-abstractions.mjs.map +1 -1
  94. package/fesm2020/angular-three-soba-cameras.mjs +139 -16
  95. package/fesm2020/angular-three-soba-cameras.mjs.map +1 -1
  96. package/fesm2020/angular-three-soba-controls.mjs +3 -3
  97. package/fesm2020/angular-three-soba-loaders.mjs +3 -3
  98. package/fesm2020/angular-three-soba-materials.mjs +396 -11
  99. package/fesm2020/angular-three-soba-materials.mjs.map +1 -1
  100. package/fesm2020/angular-three-soba-misc.mjs +7 -6
  101. package/fesm2020/angular-three-soba-misc.mjs.map +1 -1
  102. package/fesm2020/angular-three-soba-performance.mjs +12 -12
  103. package/fesm2020/angular-three-soba-shaders.mjs +625 -34
  104. package/fesm2020/angular-three-soba-shaders.mjs.map +1 -1
  105. package/fesm2020/angular-three-soba-staging.mjs +449 -96
  106. package/fesm2020/angular-three-soba-staging.mjs.map +1 -1
  107. package/materials/index.d.ts +2 -0
  108. package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +28 -0
  109. package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +47 -0
  110. package/misc/lib/fbo/fbo.d.ts +8 -6
  111. package/package.json +4 -3
  112. package/plugin/package.json +1 -1
  113. package/shaders/index.d.ts +5 -0
  114. package/shaders/lib/caustics-material/caustics-material.d.ts +4 -0
  115. package/shaders/lib/caustics-projection-material/caustics-projection-material.d.ts +4 -0
  116. package/shaders/lib/discard-material/discard-material.d.ts +3 -0
  117. package/shaders/lib/mesh-refraction-material/mesh-refraction-material.d.ts +4 -0
  118. package/shaders/lib/mesh-transmission-material/mesh-transmission-material.d.ts +25 -0
  119. package/staging/index.d.ts +1 -0
  120. package/staging/lib/caustics/caustics.d.ts +48 -0
  121. package/staging/lib/environment/environment-cube.d.ts +1 -1
  122. package/staging/lib/environment/environment-ground.d.ts +1 -1
  123. package/staging/lib/environment/utils.d.ts +1 -1
@@ -0,0 +1,240 @@
1
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, Input } from '@angular/core';
2
+ import { extend, getLocalState, injectBeforeRender, injectNgtRef, NgtArgs, NgtRxStore, } from 'angular-three';
3
+ import { injectNgtsFBO } from 'angular-three-soba/misc';
4
+ import { DiscardMaterial, MeshTransmissionMaterial } from 'angular-three-soba/shaders';
5
+ import { combineLatest, map } from 'rxjs';
6
+ import * as THREE from 'three';
7
+ import * as i0 from "@angular/core";
8
+ extend({ MeshTransmissionMaterial });
9
+ export class NgtsMeshTranmissionMaterial extends NgtRxStore {
10
+ /** transmissionSampler, you can use the threejs transmission sampler texture that is
11
+ * generated once for all transmissive materials. The upside is that it can be faster if you
12
+ * use multiple MeshPhysical and Transmission materials, the downside is that transmissive materials
13
+ * using this can't see other transparent or transmissive objects, default: false */
14
+ set transmissionSampler(transmissionSampler) {
15
+ this.set({ transmissionSampler });
16
+ }
17
+ /** Render the backside of the material (more cost, better results), default: false */
18
+ set backside(backside) {
19
+ this.set({ backside });
20
+ }
21
+ /** Backside thickness (when backside is true), default: 0 */
22
+ set backsideThickness(backsideThickness) {
23
+ this.set({ backsideThickness });
24
+ }
25
+ /** Resolution of the local buffer, default: undefined (fullscreen) */
26
+ set resolution(resolution) {
27
+ this.set({ resolution });
28
+ }
29
+ /** Resolution of the local buffer for backfaces, default: undefined (fullscreen) */
30
+ set backsideResolution(backsideResolution) {
31
+ this.set({ backsideResolution });
32
+ }
33
+ /** Refraction samples, default: 10 */
34
+ set samples(samples) {
35
+ this.set({ samples });
36
+ }
37
+ /** Buffer scene background (can be a texture, a cubetexture or a color), default: null */
38
+ set background(background) {
39
+ this.set({ background });
40
+ }
41
+ /* Transmission, default: 1 */
42
+ set transmission(transmission) {
43
+ this.set({ transmission });
44
+ }
45
+ /* Thickness (refraction), default: 0 */
46
+ set thickness(thickness) {
47
+ this.set({ thickness });
48
+ }
49
+ /* Roughness (blur), default: 0 */
50
+ set roughness(roughness) {
51
+ this.set({ roughness });
52
+ }
53
+ /* Chromatic aberration, default: 0.03 */
54
+ set chromaticAberration(chromaticAberration) {
55
+ this.set({ chromaticAberration });
56
+ }
57
+ /* Anisotropy, default: 0.1 */
58
+ set anisotropy(anisotropy) {
59
+ this.set({ anisotropy });
60
+ }
61
+ /* Distortion, default: 0 */
62
+ set distortion(distortion) {
63
+ this.set({ distortion });
64
+ }
65
+ /* Distortion scale, default: 0.5 */
66
+ set distortionScale(distortionScale) {
67
+ this.set({ distortionScale });
68
+ }
69
+ /* Temporal distortion (speed of movement), default: 0.0 */
70
+ set temporalDistortion(temporalDistortion) {
71
+ this.set({ temporalDistortion });
72
+ }
73
+ /** The scene rendered into a texture (use it to share a texture between materials), default: null */
74
+ set buffer(buffer) {
75
+ this.set({ buffer });
76
+ }
77
+ /** Internals */
78
+ set time(time) {
79
+ this.set({ time });
80
+ }
81
+ initialize() {
82
+ super.initialize();
83
+ this.set({
84
+ transmissionSampler: false,
85
+ backside: false,
86
+ side: THREE.FrontSide,
87
+ transmission: 1,
88
+ thickness: 0,
89
+ backsideThickness: 0,
90
+ samples: 10,
91
+ roughness: 0,
92
+ anisotropy: 0.1,
93
+ chromaticAberration: 0.03,
94
+ distortion: 0,
95
+ distortionScale: 0.5,
96
+ temporalDistortion: 0.0,
97
+ buffer: null,
98
+ });
99
+ }
100
+ constructor() {
101
+ super();
102
+ this.materialRef = injectNgtRef();
103
+ this.discardMaterial = new DiscardMaterial();
104
+ this.fboBackRef = injectNgtsFBO(() => combineLatest([this.select('backsideResolution'), this.select('resolution')]).pipe(map(([backsideResolution, resolution]) => backsideResolution || resolution)));
105
+ this.fboMainRef = injectNgtsFBO(() => this.select('resolution'));
106
+ let oldBg;
107
+ let oldTone;
108
+ let parent;
109
+ injectBeforeRender((state) => {
110
+ const { transmissionSampler, background, backside, backsideThickness, thickness, side } = this.get();
111
+ this.materialRef.nativeElement.time = state.clock.getElapsedTime();
112
+ // Render only if the buffer matches the built-in and no transmission sampler is set
113
+ if (this.materialRef.nativeElement.buffer === this.fboMainRef.nativeElement.texture &&
114
+ !transmissionSampler) {
115
+ parent = getLocalState(this.materialRef.nativeElement).parent;
116
+ if (parent) {
117
+ // Save defaults
118
+ oldTone = state.gl.toneMapping;
119
+ oldBg = state.scene.background;
120
+ // Switch off tonemapping lest it double tone maps
121
+ // Save the current background and set the HDR as the new BG
122
+ // Use discardmaterial, the parent will be invisible, but it's shadows will still be cast
123
+ state.gl.toneMapping = THREE.NoToneMapping;
124
+ if (background)
125
+ state.scene.background = background;
126
+ parent['material'] = this.discardMaterial;
127
+ if (backside) {
128
+ // Render into the backside buffer
129
+ state.gl.setRenderTarget(this.fboBackRef.nativeElement);
130
+ state.gl.render(state.scene, state.camera);
131
+ // And now prepare the material for the main render using the backside buffer
132
+ parent['material'] = this.materialRef.nativeElement;
133
+ parent['material'].buffer = this.fboBackRef.nativeElement.texture;
134
+ parent['material'].thickness = backsideThickness;
135
+ parent['material'].side = THREE.BackSide;
136
+ }
137
+ // Render into the main buffer
138
+ state.gl.setRenderTarget(this.fboMainRef.nativeElement);
139
+ state.gl.render(state.scene, state.camera);
140
+ parent['material'].thickness = thickness;
141
+ parent['material'].side = side;
142
+ parent['material'].buffer = this.fboMainRef.nativeElement.texture;
143
+ // Set old state back
144
+ state.scene.background = oldBg;
145
+ state.gl.setRenderTarget(null);
146
+ parent['material'] = this.materialRef.nativeElement;
147
+ state.gl.toneMapping = oldTone;
148
+ }
149
+ }
150
+ });
151
+ }
152
+ ngOnInit() {
153
+ console.log(this.materialRef);
154
+ }
155
+ }
156
+ NgtsMeshTranmissionMaterial.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsMeshTranmissionMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component });
157
+ NgtsMeshTranmissionMaterial.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: NgtsMeshTranmissionMaterial, isStandalone: true, selector: "ngts-mesh-transmission-material", inputs: { materialRef: "materialRef", transmissionSampler: "transmissionSampler", backside: "backside", backsideThickness: "backsideThickness", resolution: "resolution", backsideResolution: "backsideResolution", samples: "samples", background: "background", transmission: "transmission", thickness: "thickness", roughness: "roughness", chromaticAberration: "chromaticAberration", anisotropy: "anisotropy", distortion: "distortion", distortionScale: "distortionScale", temporalDistortion: "temporalDistortion", buffer: "buffer", time: "time" }, usesInheritance: true, ngImport: i0, template: `
158
+ <ngt-mesh-transmission-material
159
+ *args="[get('samples'), get('transmissionSampler')]"
160
+ ngtCompound
161
+ [ref]="materialRef"
162
+ [buffer]="get('buffer') || fboMainRef.nativeElement?.texture"
163
+ [_transmission]="get('transmission')"
164
+ [transmission]="get('transmissionSampler') ? get('transmission') : 0"
165
+ [thickness]="get('thickness')"
166
+ [side]="get('side')"
167
+ [anisotropy]="get('anisotropy')"
168
+ [roughness]="get('roughness')"
169
+ [chromaticAberration]="get('chromaticAberration')"
170
+ [distortion]="get('distortion')"
171
+ [distortionScale]="get('distortionScale')"
172
+ [temporalDistortion]="get('temporalDistortion')"
173
+ [time]="get('time')"
174
+ />
175
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "[args]", inputs: ["args"] }] });
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsMeshTranmissionMaterial, decorators: [{
177
+ type: Component,
178
+ args: [{
179
+ selector: 'ngts-mesh-transmission-material',
180
+ standalone: true,
181
+ template: `
182
+ <ngt-mesh-transmission-material
183
+ *args="[get('samples'), get('transmissionSampler')]"
184
+ ngtCompound
185
+ [ref]="materialRef"
186
+ [buffer]="get('buffer') || fboMainRef.nativeElement?.texture"
187
+ [_transmission]="get('transmission')"
188
+ [transmission]="get('transmissionSampler') ? get('transmission') : 0"
189
+ [thickness]="get('thickness')"
190
+ [side]="get('side')"
191
+ [anisotropy]="get('anisotropy')"
192
+ [roughness]="get('roughness')"
193
+ [chromaticAberration]="get('chromaticAberration')"
194
+ [distortion]="get('distortion')"
195
+ [distortionScale]="get('distortionScale')"
196
+ [temporalDistortion]="get('temporalDistortion')"
197
+ [time]="get('time')"
198
+ />
199
+ `,
200
+ imports: [NgtArgs],
201
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
202
+ }]
203
+ }], ctorParameters: function () { return []; }, propDecorators: { materialRef: [{
204
+ type: Input
205
+ }], transmissionSampler: [{
206
+ type: Input
207
+ }], backside: [{
208
+ type: Input
209
+ }], backsideThickness: [{
210
+ type: Input
211
+ }], resolution: [{
212
+ type: Input
213
+ }], backsideResolution: [{
214
+ type: Input
215
+ }], samples: [{
216
+ type: Input
217
+ }], background: [{
218
+ type: Input
219
+ }], transmission: [{
220
+ type: Input
221
+ }], thickness: [{
222
+ type: Input
223
+ }], roughness: [{
224
+ type: Input
225
+ }], chromaticAberration: [{
226
+ type: Input
227
+ }], anisotropy: [{
228
+ type: Input
229
+ }], distortion: [{
230
+ type: Input
231
+ }], distortionScale: [{
232
+ type: Input
233
+ }], temporalDistortion: [{
234
+ type: Input
235
+ }], buffer: [{
236
+ type: Input
237
+ }], time: [{
238
+ type: Input
239
+ }] } });
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9tYXRlcmlhbHMvc3JjL2xpYi9tZXNoLXRyYW5zbWlzc2lvbi1tYXRlcmlhbC9tZXNoLXRyYW5zbWlzc2lvbi1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQ0gsTUFBTSxFQUNOLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsWUFBWSxFQUVaLE9BQU8sRUFDUCxVQUFVLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQzs7QUFFL0IsTUFBTSxDQUFDLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO0FBMkJyQyxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsVUFBVTtJQU92RDs7O3lGQUdxRjtJQUNyRixJQUFhLG1CQUFtQixDQUFDLG1CQUE0QjtRQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxzRkFBc0Y7SUFDdEYsSUFBYSxRQUFRLENBQUMsUUFBaUI7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUNELDZEQUE2RDtJQUM3RCxJQUFhLGlCQUFpQixDQUFDLGlCQUF5QjtRQUNw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QUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO2lCQUNwQzswRUFFWSxXQUFXO3NCQUFuQixLQUFLO2dCQVVPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFJTyxRQUFRO3NCQUFwQixLQUFLO2dCQUlPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFJTyxVQUFVO3NCQUF0QixLQUFLO2dCQUlPLGtCQUFrQjtzQkFBOUIsS0FBSztnQkFJTyxPQUFPO3NCQUFuQixLQUFLO2dCQUlPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8sWUFBWTtzQkFBeEIsS0FBSztnQkFJTyxTQUFTO3NCQUFyQixLQUFLO2dCQUlPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBSU8sbUJBQW1CO3NCQUEvQixLQUFLO2dCQUlPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8sVUFBVTtzQkFBdEIsS0FBSztnQkFJTyxlQUFlO3NCQUEzQixLQUFLO2dCQUlPLGtCQUFrQjtzQkFBOUIsS0FBSztnQkFJTyxNQUFNO3NCQUFsQixLQUFLO2dCQUlPLElBQUk7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIGV4dGVuZCxcbiAgICBnZXRMb2NhbFN0YXRlLFxuICAgIGluamVjdEJlZm9yZVJlbmRlcixcbiAgICBpbmplY3ROZ3RSZWYsXG4gICAgTmd0QW55UmVjb3JkLFxuICAgIE5ndEFyZ3MsXG4gICAgTmd0UnhTdG9yZSxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RzRkJPIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL21pc2MnO1xuaW1wb3J0IHsgRGlzY2FyZE1hdGVyaWFsLCBNZXNoVHJhbnNtaXNzaW9uTWF0ZXJpYWwgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvc2hhZGVycyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcblxuZXh0ZW5kKHsgTWVzaFRyYW5zbWlzc2lvbk1hdGVyaWFsIH0pO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1tZXNoLXRyYW5zbWlzc2lvbi1tYXRlcmlhbFxuICAgICAgICAgICAgKmFyZ3M9XCJbZ2V0KCdzYW1wbGVzJyksIGdldCgndHJhbnNtaXNzaW9uU2FtcGxlcicpXVwiXG4gICAgICAgICAgICBuZ3RDb21wb3VuZFxuICAgICAgICAgICAgW3JlZl09XCJtYXRlcmlhbFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyXT1cImdldCgnYnVmZmVyJykgfHwgZmJvTWFpblJlZi5uYXRpdmVFbGVtZW50Py50ZXh0dXJlXCJcbiAgICAgICAgICAgIFtfdHJhbnNtaXNzaW9uXT1cImdldCgndHJhbnNtaXNzaW9uJylcIlxuICAgICAgICAgICAgW3RyYW5zbWlzc2lvbl09XCJnZXQoJ3RyYW5zbWlzc2lvblNhbXBsZXInKSA/IGdldCgndHJhbnNtaXNzaW9uJykgOiAwXCJcbiAgICAgICAgICAgIFt0aGlja25lc3NdPVwiZ2V0KCd0aGlja25lc3MnKVwiXG4gICAgICAgICAgICBbc2lkZV09XCJnZXQoJ3NpZGUnKVwiXG4gICAgICAgICAgICBbYW5pc290cm9weV09XCJnZXQoJ2FuaXNvdHJvcHknKVwiXG4gICAgICAgICAgICBbcm91Z2huZXNzXT1cImdldCgncm91Z2huZXNzJylcIlxuICAgICAgICAgICAgW2Nocm9tYXRpY0FiZXJyYXRpb25dPVwiZ2V0KCdjaHJvbWF0aWNBYmVycmF0aW9uJylcIlxuICAgICAgICAgICAgW2Rpc3RvcnRpb25dPVwiZ2V0KCdkaXN0b3J0aW9uJylcIlxuICAgICAgICAgICAgW2Rpc3RvcnRpb25TY2FsZV09XCJnZXQoJ2Rpc3RvcnRpb25TY2FsZScpXCJcbiAgICAgICAgICAgIFt0ZW1wb3JhbERpc3RvcnRpb25dPVwiZ2V0KCd0ZW1wb3JhbERpc3RvcnRpb24nKVwiXG4gICAgICAgICAgICBbdGltZV09XCJnZXQoJ3RpbWUnKVwiXG4gICAgICAgIC8+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbTmd0QXJnc10sXG4gICAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzTWVzaFRyYW5taXNzaW9uTWF0ZXJpYWwgZXh0ZW5kcyBOZ3RSeFN0b3JlIHtcbiAgICBASW5wdXQoKSBtYXRlcmlhbFJlZiA9IGluamVjdE5ndFJlZjxcbiAgICAgICAgTWVzaFRyYW5zbWlzc2lvbk1hdGVyaWFsICYge1xuICAgICAgICAgICAgdGltZTogbnVtYmVyO1xuICAgICAgICAgICAgYnVmZmVyPzogVEhSRUUuVGV4dHVyZTtcbiAgICAgICAgfVxuICAgID4oKTtcbiAgICAvKiogdHJhbnNtaXNzaW9uU2FtcGxlciwgeW91IGNhbiB1c2UgdGhlIHRocmVlanMgdHJhbnNtaXNzaW9uIHNhbXBsZXIgdGV4dHVyZSB0aGF0IGlzXG4gICAgICogIGdlbmVyYXRlZCBvbmNlIGZvciBhbGwgdHJhbnNtaXNzaXZlIG1hdGVyaWFscy4gVGhlIHVwc2lkZSBpcyB0aGF0IGl0IGNhbiBiZSBmYXN0ZXIgaWYgeW91XG4gICAgICogIHVzZSBtdWx0aXBsZSBNZXNoUGh5c2ljYWwgYW5kIFRyYW5zbWlzc2lvbiBtYXRlcmlhbHMsIHRoZSBkb3duc2lkZSBpcyB0aGF0IHRyYW5zbWlzc2l2ZSBtYXRlcmlhbHNcbiAgICAgKiAgdXNpbmcgdGhpcyBjYW4ndCBzZWUgb3RoZXIgdHJhbnNwYXJlbnQgb3IgdHJhbnNtaXNzaXZlIG9iamVjdHMsIGRlZmF1bHQ6IGZhbHNlICovXG4gICAgQElucHV0KCkgc2V0IHRyYW5zbWlzc2lvblNhbXBsZXIodHJhbnNtaXNzaW9uU2FtcGxlcjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IHRyYW5zbWlzc2lvblNhbXBsZXIgfSk7XG4gICAgfVxuICAgIC8qKiBSZW5kZXIgdGhlIGJhY2tzaWRlIG9mIHRoZSBtYXRlcmlhbCAobW9yZSBjb3N0LCBiZXR0ZXIgcmVzdWx0cyksIGRlZmF1bHQ6IGZhbHNlICovXG4gICAgQElucHV0KCkgc2V0IGJhY2tzaWRlKGJhY2tzaWRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYmFja3NpZGUgfSk7XG4gICAgfVxuICAgIC8qKiBCYWNrc2lkZSB0aGlja25lc3MgKHdoZW4gYmFja3NpZGUgaXMgdHJ1ZSksIGRlZmF1bHQ6IDAgKi9cbiAgICBASW5wdXQoKSBzZXQgYmFja3NpZGVUaGlja25lc3MoYmFja3NpZGVUaGlja25lc3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGJhY2tzaWRlVGhpY2tuZXNzIH0pO1xuICAgIH1cbiAgICAvKiogUmVzb2x1dGlvbiBvZiB0aGUgbG9jYWwgYnVmZmVyLCBkZWZhdWx0OiB1bmRlZmluZWQgKGZ1bGxzY3JlZW4pICovXG4gICAgQElucHV0KCkgc2V0IHJlc29sdXRpb24ocmVzb2x1dGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgcmVzb2x1dGlvbiB9KTtcbiAgICB9XG4gICAgLyoqIFJlc29sdXRpb24gb2YgdGhlIGxvY2FsIGJ1ZmZlciBmb3IgYmFja2ZhY2VzLCBkZWZhdWx0OiB1bmRlZmluZWQgKGZ1bGxzY3JlZW4pICovXG4gICAgQElucHV0KCkgc2V0IGJhY2tzaWRlUmVzb2x1dGlvbihiYWNrc2lkZVJlc29sdXRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGJhY2tzaWRlUmVzb2x1dGlvbiB9KTtcbiAgICB9XG4gICAgLyoqIFJlZnJhY3Rpb24gc2FtcGxlcywgZGVmYXVsdDogMTAgKi9cbiAgICBASW5wdXQoKSBzZXQgc2FtcGxlcyhzYW1wbGVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzYW1wbGVzIH0pO1xuICAgIH1cbiAgICAvKiogQnVmZmVyIHNjZW5lIGJhY2tncm91bmQgKGNhbiBiZSBhIHRleHR1cmUsIGEgY3ViZXRleHR1cmUgb3IgYSBjb2xvciksIGRlZmF1bHQ6IG51bGwgKi9cbiAgICBASW5wdXQoKSBzZXQgYmFja2dyb3VuZChiYWNrZ3JvdW5kOiBUSFJFRS5UZXh0dXJlIHwgVEhSRUUuQ29sb3IpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBiYWNrZ3JvdW5kIH0pO1xuICAgIH1cbiAgICAvKiBUcmFuc21pc3Npb24sIGRlZmF1bHQ6IDEgKi9cbiAgICBASW5wdXQoKSBzZXQgdHJhbnNtaXNzaW9uKHRyYW5zbWlzc2lvbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgdHJhbnNtaXNzaW9uIH0pO1xuICAgIH1cbiAgICAvKiBUaGlja25lc3MgKHJlZnJhY3Rpb24pLCBkZWZhdWx0OiAwICovXG4gICAgQElucHV0KCkgc2V0IHRoaWNrbmVzcyh0aGlja25lc3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHRoaWNrbmVzcyB9KTtcbiAgICB9XG4gICAgLyogUm91Z2huZXNzIChibHVyKSwgZGVmYXVsdDogMCAqL1xuICAgIEBJbnB1dCgpIHNldCByb3VnaG5lc3Mocm91Z2huZXNzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyByb3VnaG5lc3MgfSk7XG4gICAgfVxuICAgIC8qIENocm9tYXRpYyBhYmVycmF0aW9uLCBkZWZhdWx0OiAwLjAzICovXG4gICAgQElucHV0KCkgc2V0IGNocm9tYXRpY0FiZXJyYXRpb24oY2hyb21hdGljQWJlcnJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY2hyb21hdGljQWJlcnJhdGlvbiB9KTtcbiAgICB9XG4gICAgLyogQW5pc290cm9weSwgZGVmYXVsdDogMC4xICovXG4gICAgQElucHV0KCkgc2V0IGFuaXNvdHJvcHkoYW5pc290cm9weTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYW5pc290cm9weSB9KTtcbiAgICB9XG4gICAgLyogRGlzdG9ydGlvbiwgZGVmYXVsdDogMCAqL1xuICAgIEBJbnB1dCgpIHNldCBkaXN0b3J0aW9uKGRpc3RvcnRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGRpc3RvcnRpb24gfSk7XG4gICAgfVxuICAgIC8qIERpc3RvcnRpb24gc2NhbGUsIGRlZmF1bHQ6IDAuNSAqL1xuICAgIEBJbnB1dCgpIHNldCBkaXN0b3J0aW9uU2NhbGUoZGlzdG9ydGlvblNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkaXN0b3J0aW9uU2NhbGUgfSk7XG4gICAgfVxuICAgIC8qIFRlbXBvcmFsIGRpc3RvcnRpb24gKHNwZWVkIG9mIG1vdmVtZW50KSwgZGVmYXVsdDogMC4wICovXG4gICAgQElucHV0KCkgc2V0IHRlbXBvcmFsRGlzdG9ydGlvbih0ZW1wb3JhbERpc3RvcnRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHRlbXBvcmFsRGlzdG9ydGlvbiB9KTtcbiAgICB9XG4gICAgLyoqIFRoZSBzY2VuZSByZW5kZXJlZCBpbnRvIGEgdGV4dHVyZSAodXNlIGl0IHRvIHNoYXJlIGEgdGV4dHVyZSBiZXR3ZWVuIG1hdGVyaWFscyksIGRlZmF1bHQ6IG51bGwgICovXG4gICAgQElucHV0KCkgc2V0IGJ1ZmZlcihidWZmZXI6IFRIUkVFLlRleHR1cmUpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBidWZmZXIgfSk7XG4gICAgfVxuICAgIC8qKiBJbnRlcm5hbHMgKi9cbiAgICBASW5wdXQoKSBzZXQgdGltZSh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyB0aW1lIH0pO1xuICAgIH1cblxuICAgIHJlYWRvbmx5IGRpc2NhcmRNYXRlcmlhbCA9IG5ldyBEaXNjYXJkTWF0ZXJpYWwoKTtcbiAgICByZWFkb25seSBmYm9CYWNrUmVmID0gaW5qZWN0Tmd0c0ZCTygoKSA9PlxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnNlbGVjdCgnYmFja3NpZGVSZXNvbHV0aW9uJyksIHRoaXMuc2VsZWN0KCdyZXNvbHV0aW9uJyldKS5waXBlKFxuICAgICAgICAgICAgbWFwKChbYmFja3NpZGVSZXNvbHV0aW9uLCByZXNvbHV0aW9uXSkgPT4gYmFja3NpZGVSZXNvbHV0aW9uIHx8IHJlc29sdXRpb24pXG4gICAgICAgIClcbiAgICApO1xuICAgIHJlYWRvbmx5IGZib01haW5SZWYgPSBpbmplY3ROZ3RzRkJPKCgpID0+IHRoaXMuc2VsZWN0KCdyZXNvbHV0aW9uJykpO1xuXG4gICAgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB0aGlzLnNldCh7XG4gICAgICAgICAgICB0cmFuc21pc3Npb25TYW1wbGVyOiBmYWxzZSxcbiAgICAgICAgICAgIGJhY2tzaWRlOiBmYWxzZSxcbiAgICAgICAgICAgIHNpZGU6IFRIUkVFLkZyb250U2lkZSxcbiAgICAgICAgICAgIHRyYW5zbWlzc2lvbjogMSxcbiAgICAgICAgICAgIHRoaWNrbmVzczogMCxcbiAgICAgICAgICAgIGJhY2tzaWRlVGhpY2tuZXNzOiAwLFxuICAgICAgICAgICAgc2FtcGxlczogMTAsXG4gICAgICAgICAgICByb3VnaG5lc3M6IDAsXG4gICAgICAgICAgICBhbmlzb3Ryb3B5OiAwLjEsXG4gICAgICAgICAgICBjaHJvbWF0aWNBYmVycmF0aW9uOiAwLjAzLFxuICAgICAgICAgICAgZGlzdG9ydGlvbjogMCxcbiAgICAgICAgICAgIGRpc3RvcnRpb25TY2FsZTogMC41LFxuICAgICAgICAgICAgdGVtcG9yYWxEaXN0b3J0aW9uOiAwLjAsXG4gICAgICAgICAgICBidWZmZXI6IG51bGwsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBsZXQgb2xkQmc6IFRIUkVFLlNjZW5lWydiYWNrZ3JvdW5kJ107XG4gICAgICAgIGxldCBvbGRUb25lOiBUSFJFRS5XZWJHTFJlbmRlcmVyWyd0b25lTWFwcGluZyddO1xuICAgICAgICBsZXQgcGFyZW50OiBUSFJFRS5PYmplY3QzRDtcblxuICAgICAgICBpbmplY3RCZWZvcmVSZW5kZXIoKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRyYW5zbWlzc2lvblNhbXBsZXIsIGJhY2tncm91bmQsIGJhY2tzaWRlLCBiYWNrc2lkZVRoaWNrbmVzcywgdGhpY2tuZXNzLCBzaWRlIH0gPSB0aGlzLmdldCgpO1xuXG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsUmVmLm5hdGl2ZUVsZW1lbnQudGltZSA9IHN0YXRlLmNsb2NrLmdldEVsYXBzZWRUaW1lKCk7XG4gICAgICAgICAgICAvLyBSZW5kZXIgb25seSBpZiB0aGUgYnVmZmVyIG1hdGNoZXMgdGhlIGJ1aWx0LWluIGFuZCBubyB0cmFuc21pc3Npb24gc2FtcGxlciBpcyBzZXRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsUmVmLm5hdGl2ZUVsZW1lbnQuYnVmZmVyID09PSB0aGlzLmZib01haW5SZWYubmF0aXZlRWxlbWVudC50ZXh0dXJlICYmXG4gICAgICAgICAgICAgICAgIXRyYW5zbWlzc2lvblNhbXBsZXJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IGdldExvY2FsU3RhdGUodGhpcy5tYXRlcmlhbFJlZi5uYXRpdmVFbGVtZW50KS5wYXJlbnQgYXMgVEhSRUUuT2JqZWN0M0Q7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIGRlZmF1bHRzXG4gICAgICAgICAgICAgICAgICAgIG9sZFRvbmUgPSBzdGF0ZS5nbC50b25lTWFwcGluZztcbiAgICAgICAgICAgICAgICAgICAgb2xkQmcgPSBzdGF0ZS5zY2VuZS5iYWNrZ3JvdW5kO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFN3aXRjaCBvZmYgdG9uZW1hcHBpbmcgbGVzdCBpdCBkb3VibGUgdG9uZSBtYXBzXG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgYmFja2dyb3VuZCBhbmQgc2V0IHRoZSBIRFIgYXMgdGhlIG5ldyBCR1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZGlzY2FyZG1hdGVyaWFsLCB0aGUgcGFyZW50IHdpbGwgYmUgaW52aXNpYmxlLCBidXQgaXQncyBzaGFkb3dzIHdpbGwgc3RpbGwgYmUgY2FzdFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5nbC50b25lTWFwcGluZyA9IFRIUkVFLk5vVG9uZU1hcHBpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kKSBzdGF0ZS5zY2VuZS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcbiAgICAgICAgICAgICAgICAgICAgKHBhcmVudCBhcyBOZ3RBbnlSZWNvcmQpWydtYXRlcmlhbCddID0gdGhpcy5kaXNjYXJkTWF0ZXJpYWw7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tzaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW5kZXIgaW50byB0aGUgYmFja3NpZGUgYnVmZmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5nbC5zZXRSZW5kZXJUYXJnZXQodGhpcy5mYm9CYWNrUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZ2wucmVuZGVyKHN0YXRlLnNjZW5lLCBzdGF0ZS5jYW1lcmEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIG5vdyBwcmVwYXJlIHRoZSBtYXRlcmlhbCBmb3IgdGhlIG1haW4gcmVuZGVyIHVzaW5nIHRoZSBiYWNrc2lkZSBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwYXJlbnQgYXMgTmd0QW55UmVjb3JkKVsnbWF0ZXJpYWwnXSA9IHRoaXMubWF0ZXJpYWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIChwYXJlbnQgYXMgTmd0QW55UmVjb3JkKVsnbWF0ZXJpYWwnXS5idWZmZXIgPSB0aGlzLmZib0JhY2tSZWYubmF0aXZlRWxlbWVudC50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudCBhcyBOZ3RBbnlSZWNvcmQpWydtYXRlcmlhbCddLnRoaWNrbmVzcyA9IGJhY2tzaWRlVGhpY2tuZXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudCBhcyBOZ3RBbnlSZWNvcmQpWydtYXRlcmlhbCddLnNpZGUgPSBUSFJFRS5CYWNrU2lkZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciBpbnRvIHRoZSBtYWluIGJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5nbC5zZXRSZW5kZXJUYXJnZXQodGhpcy5mYm9NYWluUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5nbC5yZW5kZXIoc3RhdGUuc2NlbmUsIHN0YXRlLmNhbWVyYSk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHBhcmVudCBhcyBOZ3RBbnlSZWNvcmQpWydtYXRlcmlhbCddLnRoaWNrbmVzcyA9IHRoaWNrbmVzcztcbiAgICAgICAgICAgICAgICAgICAgKHBhcmVudCBhcyBOZ3RBbnlSZWNvcmQpWydtYXRlcmlhbCddLnNpZGUgPSBzaWRlO1xuICAgICAgICAgICAgICAgICAgICAocGFyZW50IGFzIE5ndEFueVJlY29yZClbJ21hdGVyaWFsJ10uYnVmZmVyID0gdGhpcy5mYm9NYWluUmVmLm5hdGl2ZUVsZW1lbnQudGV4dHVyZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgb2xkIHN0YXRlIGJhY2tcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuc2NlbmUuYmFja2dyb3VuZCA9IG9sZEJnO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5nbC5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIChwYXJlbnQgYXMgTmd0QW55UmVjb3JkKVsnbWF0ZXJpYWwnXSA9IHRoaXMubWF0ZXJpYWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuZ2wudG9uZU1hcHBpbmcgPSBvbGRUb25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMubWF0ZXJpYWxSZWYpO1xuICAgIH1cbn1cbiJdfQ==
@@ -26,8 +26,8 @@ export class NgtsMeshWobbleMaterial extends NgtRxStore {
26
26
  });
27
27
  }
28
28
  }
29
- NgtsMeshWobbleMaterial.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsMeshWobbleMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component });
30
- NgtsMeshWobbleMaterial.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.5", type: NgtsMeshWobbleMaterial, isStandalone: true, selector: "ngts-mesh-wobble-material", inputs: { materialRef: "materialRef", time: "time", factor: "factor", speed: "speed" }, usesInheritance: true, ngImport: i0, template: `
29
+ NgtsMeshWobbleMaterial.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsMeshWobbleMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component });
30
+ NgtsMeshWobbleMaterial.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: NgtsMeshWobbleMaterial, isStandalone: true, selector: "ngts-mesh-wobble-material", inputs: { materialRef: "materialRef", time: "time", factor: "factor", speed: "speed" }, usesInheritance: true, ngImport: i0, template: `
31
31
  <ngt-primitive
32
32
  *args="[material]"
33
33
  [ref]="materialRef"
@@ -37,7 +37,7 @@ NgtsMeshWobbleMaterial.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
37
37
  ngtCompound
38
38
  />
39
39
  `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "[args]", inputs: ["args"] }] });
40
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsMeshWobbleMaterial, decorators: [{
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsMeshWobbleMaterial, decorators: [{
41
41
  type: Component,
42
42
  args: [{
43
43
  selector: 'ngts-mesh-wobble-material',
@@ -16,9 +16,9 @@ export class NgtsBakeShadows extends NgtRxStore {
16
16
  });
17
17
  }
18
18
  }
19
- NgtsBakeShadows.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsBakeShadows, deps: null, target: i0.ɵɵFactoryTarget.Directive });
20
- NgtsBakeShadows.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.5", type: NgtsBakeShadows, isStandalone: true, selector: "ngts-bake-shadows", usesInheritance: true, ngImport: i0 });
21
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsBakeShadows, decorators: [{
19
+ NgtsBakeShadows.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsBakeShadows, deps: null, target: i0.ɵɵFactoryTarget.Directive });
20
+ NgtsBakeShadows.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.0", type: NgtsBakeShadows, isStandalone: true, selector: "ngts-bake-shadows", usesInheritance: true, ngImport: i0 });
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsBakeShadows, decorators: [{
22
22
  type: Directive,
23
23
  args: [{ selector: 'ngts-bake-shadows', standalone: true }]
24
24
  }] });
@@ -15,7 +15,7 @@ export function injectNgtsFBO(paramsFactory) {
15
15
  const _width = typeof width === 'number' ? width : size.width * viewport.dpr;
16
16
  const _height = typeof height === 'number' ? height : size.height * viewport.dpr;
17
17
  const _settings = (typeof width === 'number' ? settings : width) || {};
18
- const { samples, ...targetSettings } = _settings;
18
+ const { samples = 0, depth, ...targetSettings } = _settings;
19
19
  if (!targetRef.nativeElement) {
20
20
  const target = new THREE.WebGLRenderTarget(_width, _height, {
21
21
  minFilter: THREE.LinearFilter,
@@ -24,8 +24,9 @@ export function injectNgtsFBO(paramsFactory) {
24
24
  type: THREE.HalfFloatType,
25
25
  ...targetSettings,
26
26
  });
27
- if (samples)
28
- target.samples = samples;
27
+ if (depth)
28
+ target.depthTexture = new THREE.DepthTexture(_width, _height, THREE.FloatType);
29
+ target.samples = samples;
29
30
  targetRef.nativeElement = target;
30
31
  }
31
32
  targetRef.nativeElement.setSize(_width, _height);
@@ -35,4 +36,4 @@ export function injectNgtsFBO(paramsFactory) {
35
36
  });
36
37
  return targetRef;
37
38
  }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmJvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvbWlzYy9zcmMvbGliL2Ziby9mYm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFhL0IsTUFBTSxVQUFVLGFBQWEsQ0FDekIsYUFBNEc7SUFFNUcsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sU0FBUyxHQUFHLFlBQVksRUFBMkIsQ0FBQztJQUMxRCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtRQUM1QyxTQUFTLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0QsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUN4RSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ2pGLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLEtBQXFCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFeEYsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGNBQWMsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUVqRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRTtZQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFO2dCQUN4RCxTQUFTLEVBQUUsS0FBSyxDQUFDLFlBQVk7Z0JBQzdCLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDN0IsUUFBUSxFQUFFLEVBQUUsQ0FBQyxjQUFjO2dCQUMzQixJQUFJLEVBQUUsS0FBSyxDQUFDLGFBQWE7Z0JBQ3pCLEdBQUcsY0FBYzthQUNwQixDQUFDLENBQUM7WUFDSCxJQUFJLE9BQU87Z0JBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDdEMsU0FBUyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7U0FDcEM7UUFFRCxTQUFTLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsSUFBSSxPQUFPO1lBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZELGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0RGVzdHJveSwgaW5qZWN0Tmd0UmVmLCBOZ3RTdG9yZSwgc2FmZURldGVjdENoYW5nZXMgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgb2YsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5pbnRlcmZhY2UgRkJPU2V0dGluZ3M8VCBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZT4gZXh0ZW5kcyBUSFJFRS5XZWJHTFJlbmRlclRhcmdldE9wdGlvbnMge1xuICAgIG11bHRpc2FtcGxlPzogVDtcbiAgICBzYW1wbGVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNGQk9QYXJhbXM8VCBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZT4ge1xuICAgIHdpZHRoPzogbnVtYmVyIHwgRkJPU2V0dGluZ3M8VD47XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHNldHRpbmdzPzogRkJPU2V0dGluZ3M8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3ROZ3RzRkJPPFQgZXh0ZW5kcyBib29sZWFuID0gZmFsc2U+KFxuICAgIHBhcmFtc0ZhY3Rvcnk6IChkZWZhdWx0UGFyYW1zOiBQYXJ0aWFsPE5ndHNGQk9QYXJhbXM8VD4+KSA9PiBOZ3RzRkJPUGFyYW1zPFQ+IHwgT2JzZXJ2YWJsZTxOZ3RzRkJPUGFyYW1zPFQ+PlxuKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBpbmplY3QoTmd0U3RvcmUpO1xuICAgIGNvbnN0IHRhcmdldFJlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5XZWJHTFJlbmRlclRhcmdldD4oKTtcbiAgICBjb25zdCB7IGRlc3Ryb3kkLCBjZHIgfSA9IGluamVjdE5ndERlc3Ryb3koKCkgPT4ge1xuICAgICAgICB0YXJnZXRSZWYubmF0aXZlRWxlbWVudD8uZGlzcG9zZSgpO1xuICAgIH0pO1xuICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtc0ZhY3Rvcnkoe30pO1xuICAgIGNvbnN0IHBhcmFtcyQgPSBpc09ic2VydmFibGUocGFyYW1zKSA/IHBhcmFtcyA6IG9mKHBhcmFtcyk7XG5cbiAgICBwYXJhbXMkLnBpcGUodGFrZVVudGlsKGRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh7IHdpZHRoLCBoZWlnaHQsIHNldHRpbmdzIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBnbCwgc2l6ZSwgdmlld3BvcnQgfSA9IHN0b3JlLmdldCgpO1xuICAgICAgICBjb25zdCBfd2lkdGggPSB0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInID8gd2lkdGggOiBzaXplLndpZHRoICogdmlld3BvcnQuZHByO1xuICAgICAgICBjb25zdCBfaGVpZ2h0ID0gdHlwZW9mIGhlaWdodCA9PT0gJ251bWJlcicgPyBoZWlnaHQgOiBzaXplLmhlaWdodCAqIHZpZXdwb3J0LmRwcjtcbiAgICAgICAgY29uc3QgX3NldHRpbmdzID0gKHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgPyBzZXR0aW5ncyA6ICh3aWR0aCBhcyBGQk9TZXR0aW5ncykpIHx8IHt9O1xuXG4gICAgICAgIGNvbnN0IHsgc2FtcGxlcywgLi4udGFyZ2V0U2V0dGluZ3MgfSA9IF9zZXR0aW5ncztcblxuICAgICAgICBpZiAoIXRhcmdldFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQoX3dpZHRoLCBfaGVpZ2h0LCB7XG4gICAgICAgICAgICAgICAgbWluRmlsdGVyOiBUSFJFRS5MaW5lYXJGaWx0ZXIsXG4gICAgICAgICAgICAgICAgbWFnRmlsdGVyOiBUSFJFRS5MaW5lYXJGaWx0ZXIsXG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IGdsLm91dHB1dEVuY29kaW5nLFxuICAgICAgICAgICAgICAgIHR5cGU6IFRIUkVFLkhhbGZGbG9hdFR5cGUsXG4gICAgICAgICAgICAgICAgLi4udGFyZ2V0U2V0dGluZ3MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzYW1wbGVzKSB0YXJnZXQuc2FtcGxlcyA9IHNhbXBsZXM7XG4gICAgICAgICAgICB0YXJnZXRSZWYubmF0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldFJlZi5uYXRpdmVFbGVtZW50LnNldFNpemUoX3dpZHRoLCBfaGVpZ2h0KTtcbiAgICAgICAgaWYgKHNhbXBsZXMpIHRhcmdldFJlZi5uYXRpdmVFbGVtZW50LnNhbXBsZXMgPSBzYW1wbGVzO1xuICAgICAgICBzYWZlRGV0ZWN0Q2hhbmdlcyhjZHIpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhcmdldFJlZjtcbn1cbiJdfQ==
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmJvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvbWlzYy9zcmMvbGliL2Ziby9mYm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFlL0IsTUFBTSxVQUFVLGFBQWEsQ0FDekIsYUFBbUc7SUFFbkcsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sU0FBUyxHQUFHLFlBQVksRUFBMkIsQ0FBQztJQUMxRCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtRQUM1QyxTQUFTLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0QsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUN4RSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ2pGLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLEtBQXFCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFeEYsTUFBTSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBRTVELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUU7Z0JBQ3hELFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDN0IsU0FBUyxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUM3QixRQUFRLEVBQUUsRUFBRSxDQUFDLGNBQWM7Z0JBQzNCLElBQUksRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDekIsR0FBRyxjQUFjO2FBQ3BCLENBQUMsQ0FBQztZQUNILElBQUksS0FBSztnQkFBRSxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUxRixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN6QixTQUFTLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztTQUNwQztRQUVELFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxJQUFJLE9BQU87WUFBRSxTQUFTLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkQsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3REZXN0cm95LCBpbmplY3ROZ3RSZWYsIE5ndFN0b3JlLCBzYWZlRGV0ZWN0Q2hhbmdlcyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBvZiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5cbmludGVyZmFjZSBGQk9TZXR0aW5ncyBleHRlbmRzIFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0T3B0aW9ucyB7XG4gICAgLyoqIERlZmluZXMgdGhlIGNvdW50IG9mIE1TQUEgc2FtcGxlcy4gQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMIDIuIERlZmF1bHQ6IDAgKi9cbiAgICBzYW1wbGVzPzogbnVtYmVyO1xuICAgIC8qKiBJZiBzZXQsIHRoZSBzY2VuZSBkZXB0aCB3aWxsIGJlIHJlbmRlcmVkIGludG8gYnVmZmVyLmRlcHRoVGV4dHVyZS4gRGVmYXVsdDogZmFsc2UgKi9cbiAgICBkZXB0aD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0ZCT1BhcmFtcyB7XG4gICAgd2lkdGg/OiBudW1iZXIgfCBGQk9TZXR0aW5ncztcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgc2V0dGluZ3M/OiBGQk9TZXR0aW5ncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE5ndHNGQk8oXG4gICAgcGFyYW1zRmFjdG9yeTogKGRlZmF1bHRQYXJhbXM6IFBhcnRpYWw8Tmd0c0ZCT1BhcmFtcz4pID0+IE5ndHNGQk9QYXJhbXMgfCBPYnNlcnZhYmxlPE5ndHNGQk9QYXJhbXM+XG4pIHtcbiAgICBjb25zdCBzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG4gICAgY29uc3QgdGFyZ2V0UmVmID0gaW5qZWN0Tmd0UmVmPFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0PigpO1xuICAgIGNvbnN0IHsgZGVzdHJveSQsIGNkciB9ID0gaW5qZWN0Tmd0RGVzdHJveSgoKSA9PiB7XG4gICAgICAgIHRhcmdldFJlZi5uYXRpdmVFbGVtZW50Py5kaXNwb3NlKCk7XG4gICAgfSk7XG4gICAgY29uc3QgcGFyYW1zID0gcGFyYW1zRmFjdG9yeSh7fSk7XG4gICAgY29uc3QgcGFyYW1zJCA9IGlzT2JzZXJ2YWJsZShwYXJhbXMpID8gcGFyYW1zIDogb2YocGFyYW1zKTtcblxuICAgIHBhcmFtcyQucGlwZSh0YWtlVW50aWwoZGVzdHJveSQpKS5zdWJzY3JpYmUoKHsgd2lkdGgsIGhlaWdodCwgc2V0dGluZ3MgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGdsLCBzaXplLCB2aWV3cG9ydCB9ID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgIGNvbnN0IF93aWR0aCA9IHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgPyB3aWR0aCA6IHNpemUud2lkdGggKiB2aWV3cG9ydC5kcHI7XG4gICAgICAgIGNvbnN0IF9oZWlnaHQgPSB0eXBlb2YgaGVpZ2h0ID09PSAnbnVtYmVyJyA/IGhlaWdodCA6IHNpemUuaGVpZ2h0ICogdmlld3BvcnQuZHByO1xuICAgICAgICBjb25zdCBfc2V0dGluZ3MgPSAodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJyA/IHNldHRpbmdzIDogKHdpZHRoIGFzIEZCT1NldHRpbmdzKSkgfHwge307XG5cbiAgICAgICAgY29uc3QgeyBzYW1wbGVzID0gMCwgZGVwdGgsIC4uLnRhcmdldFNldHRpbmdzIH0gPSBfc2V0dGluZ3M7XG5cbiAgICAgICAgaWYgKCF0YXJnZXRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KF93aWR0aCwgX2hlaWdodCwge1xuICAgICAgICAgICAgICAgIG1pbkZpbHRlcjogVEhSRUUuTGluZWFyRmlsdGVyLFxuICAgICAgICAgICAgICAgIG1hZ0ZpbHRlcjogVEhSRUUuTGluZWFyRmlsdGVyLFxuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBnbC5vdXRwdXRFbmNvZGluZyxcbiAgICAgICAgICAgICAgICB0eXBlOiBUSFJFRS5IYWxmRmxvYXRUeXBlLFxuICAgICAgICAgICAgICAgIC4uLnRhcmdldFNldHRpbmdzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVwdGgpIHRhcmdldC5kZXB0aFRleHR1cmUgPSBuZXcgVEhSRUUuRGVwdGhUZXh0dXJlKF93aWR0aCwgX2hlaWdodCwgVEhSRUUuRmxvYXRUeXBlKTtcblxuICAgICAgICAgICAgdGFyZ2V0LnNhbXBsZXMgPSBzYW1wbGVzO1xuICAgICAgICAgICAgdGFyZ2V0UmVmLm5hdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRSZWYubmF0aXZlRWxlbWVudC5zZXRTaXplKF93aWR0aCwgX2hlaWdodCk7XG4gICAgICAgIGlmIChzYW1wbGVzKSB0YXJnZXRSZWYubmF0aXZlRWxlbWVudC5zYW1wbGVzID0gc2FtcGxlcztcbiAgICAgICAgc2FmZURldGVjdENoYW5nZXMoY2RyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0YXJnZXRSZWY7XG59XG4iXX0=
@@ -31,9 +31,9 @@ export class NgtsAdaptiveDpr extends NgtRxStore {
31
31
  });
32
32
  }
33
33
  }
34
- NgtsAdaptiveDpr.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsAdaptiveDpr, deps: null, target: i0.ɵɵFactoryTarget.Directive });
35
- NgtsAdaptiveDpr.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.5", type: NgtsAdaptiveDpr, isStandalone: true, selector: "ngts-adaptive-dpr", inputs: { pixelated: "pixelated" }, providers: [RxActionFactory], usesInheritance: true, ngImport: i0 });
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsAdaptiveDpr, decorators: [{
34
+ NgtsAdaptiveDpr.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsAdaptiveDpr, deps: null, target: i0.ɵɵFactoryTarget.Directive });
35
+ NgtsAdaptiveDpr.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.0", type: NgtsAdaptiveDpr, isStandalone: true, selector: "ngts-adaptive-dpr", inputs: { pixelated: "pixelated" }, providers: [RxActionFactory], usesInheritance: true, ngImport: i0 });
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsAdaptiveDpr, decorators: [{
37
37
  type: Directive,
38
38
  args: [{
39
39
  selector: 'ngts-adaptive-dpr',
@@ -23,9 +23,9 @@ export class NgtsAdaptiveEvents extends NgtRxStore {
23
23
  });
24
24
  }
25
25
  }
26
- NgtsAdaptiveEvents.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsAdaptiveEvents, deps: null, target: i0.ɵɵFactoryTarget.Directive });
27
- NgtsAdaptiveEvents.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.5", type: NgtsAdaptiveEvents, isStandalone: true, selector: "ngts-adaptive-events", providers: [RxActionFactory], usesInheritance: true, ngImport: i0 });
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsAdaptiveEvents, decorators: [{
26
+ NgtsAdaptiveEvents.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsAdaptiveEvents, deps: null, target: i0.ɵɵFactoryTarget.Directive });
27
+ NgtsAdaptiveEvents.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.0", type: NgtsAdaptiveEvents, isStandalone: true, selector: "ngts-adaptive-events", providers: [RxActionFactory], usesInheritance: true, ngImport: i0 });
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsAdaptiveEvents, decorators: [{
29
29
  type: Directive,
30
30
  args: [{
31
31
  selector: 'ngts-adaptive-events',
@@ -24,13 +24,13 @@ export class NgtsDetailed extends NgtRxStore {
24
24
  });
25
25
  }
26
26
  }
27
- NgtsDetailed.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsDetailed, deps: null, target: i0.ɵɵFactoryTarget.Component });
28
- NgtsDetailed.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.5", type: NgtsDetailed, isStandalone: true, selector: "ngts-detailed[distances]", inputs: { lodRef: "lodRef", distances: "distances" }, usesInheritance: true, ngImport: i0, template: `
27
+ NgtsDetailed.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsDetailed, deps: null, target: i0.ɵɵFactoryTarget.Component });
28
+ NgtsDetailed.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: NgtsDetailed, isStandalone: true, selector: "ngts-detailed[distances]", inputs: { lodRef: "lodRef", distances: "distances" }, usesInheritance: true, ngImport: i0, template: `
29
29
  <ngt-lOD [ref]="lodRef" ngtCompound (beforeRender)="$any($event).object.update($any($event).state.camera)">
30
30
  <ng-content />
31
31
  </ngt-lOD>
32
32
  `, isInline: true });
33
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsDetailed, decorators: [{
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsDetailed, decorators: [{
34
34
  type: Component,
35
35
  args: [{
36
36
  selector: 'ngts-detailed[distances]',
@@ -59,9 +59,9 @@ export class NgtsStats extends NgtRxStore {
59
59
  });
60
60
  }
61
61
  }
62
- NgtsStats.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsStats, deps: null, target: i0.ɵɵFactoryTarget.Directive });
63
- NgtsStats.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.5", type: NgtsStats, isStandalone: true, selector: "ngts-stats", inputs: { showPanel: "showPanel", parent: "parent", classes: "classes", right: "right" }, usesInheritance: true, ngImport: i0 });
64
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgtsStats, decorators: [{
62
+ NgtsStats.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsStats, deps: null, target: i0.ɵɵFactoryTarget.Directive });
63
+ NgtsStats.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.0", type: NgtsStats, isStandalone: true, selector: "ngts-stats", inputs: { showPanel: "showPanel", parent: "parent", classes: "classes", right: "right" }, usesInheritance: true, ngImport: i0 });
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: NgtsStats, decorators: [{
65
65
  type: Directive,
66
66
  args: [{
67
67
  selector: 'ngts-stats',
@@ -1,8 +1,13 @@
1
1
  export * from './lib/blur-pass/blur-pass';
2
+ export * from './lib/caustics-material/caustics-material';
3
+ export * from './lib/caustics-projection-material/caustics-projection-material';
2
4
  export * from './lib/convolution-material/convolution-material';
5
+ export * from './lib/discard-material/discard-material';
3
6
  export * from './lib/mesh-distort-material/mesh-distort-material';
4
7
  export * from './lib/mesh-reflector-material/mesh-reflector-material';
8
+ export * from './lib/mesh-refraction-material/mesh-refraction-material';
9
+ export * from './lib/mesh-transmission-material/mesh-transmission-material';
5
10
  export * from './lib/mesh-wobble-material/mesh-wobble-material';
6
11
  export * from './lib/shader-material/shader-material';
7
12
  export * from './lib/spot-light-material/spot-light-material';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsaURBQWlELENBQUM7QUFDaEUsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMsaURBQWlELENBQUM7QUFDaEUsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLCtDQUErQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvYmx1ci1wYXNzL2JsdXItcGFzcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb252b2x1dGlvbi1tYXRlcmlhbC9jb252b2x1dGlvbi1tYXRlcmlhbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tZXNoLWRpc3RvcnQtbWF0ZXJpYWwvbWVzaC1kaXN0b3J0LW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lc2gtcmVmbGVjdG9yLW1hdGVyaWFsL21lc2gtcmVmbGVjdG9yLW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lc2gtd29iYmxlLW1hdGVyaWFsL21lc2gtd29iYmxlLW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NoYWRlci1tYXRlcmlhbC9zaGFkZXItbWF0ZXJpYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc3BvdC1saWdodC1tYXRlcmlhbC9zcG90LWxpZ2h0LW1hdGVyaWFsJztcbiJdfQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxpRUFBaUUsQ0FBQztBQUNoRixjQUFjLGlEQUFpRCxDQUFDO0FBQ2hFLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMseURBQXlELENBQUM7QUFDeEUsY0FBYyw2REFBNkQsQ0FBQztBQUM1RSxjQUFjLGlEQUFpRCxDQUFDO0FBQ2hFLGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYywrQ0FBK0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2JsdXItcGFzcy9ibHVyLXBhc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2F1c3RpY3MtbWF0ZXJpYWwvY2F1c3RpY3MtbWF0ZXJpYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2F1c3RpY3MtcHJvamVjdGlvbi1tYXRlcmlhbC9jYXVzdGljcy1wcm9qZWN0aW9uLW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnZvbHV0aW9uLW1hdGVyaWFsL2NvbnZvbHV0aW9uLW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Rpc2NhcmQtbWF0ZXJpYWwvZGlzY2FyZC1tYXRlcmlhbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tZXNoLWRpc3RvcnQtbWF0ZXJpYWwvbWVzaC1kaXN0b3J0LW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lc2gtcmVmbGVjdG9yLW1hdGVyaWFsL21lc2gtcmVmbGVjdG9yLW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lc2gtcmVmcmFjdGlvbi1tYXRlcmlhbC9tZXNoLXJlZnJhY3Rpb24tbWF0ZXJpYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwvbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbWVzaC13b2JibGUtbWF0ZXJpYWwvbWVzaC13b2JibGUtbWF0ZXJpYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2hhZGVyLW1hdGVyaWFsL3NoYWRlci1tYXRlcmlhbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zcG90LWxpZ2h0LW1hdGVyaWFsL3Nwb3QtbGlnaHQtbWF0ZXJpYWwnO1xuIl19
@@ -0,0 +1,128 @@
1
+ import * as THREE from 'three';
2
+ import { shaderMaterial } from '../shader-material/shader-material';
3
+ export const CausticsMaterial = shaderMaterial({
4
+ cameraMatrixWorld: new THREE.Matrix4(),
5
+ cameraProjectionMatrixInv: new THREE.Matrix4(),
6
+ normalTexture: null,
7
+ depthTexture: null,
8
+ lightDir: new THREE.Vector3(0, 1, 0),
9
+ lightPlaneNormal: new THREE.Vector3(0, 1, 0),
10
+ lightPlaneConstant: 0,
11
+ near: 0.1,
12
+ far: 100,
13
+ modelMatrix: new THREE.Matrix4(),
14
+ worldRadius: 1 / 40,
15
+ ior: 1.1,
16
+ bounces: 0,
17
+ resolution: 1024,
18
+ size: 10,
19
+ intensity: 0.5,
20
+ },
21
+ /* glsl */ `varying vec2 vUv;
22
+ void main() {
23
+ vUv = uv;
24
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
25
+ }`,
26
+ /* glsl */ `uniform mat4 cameraMatrixWorld;
27
+ uniform mat4 cameraProjectionMatrixInv;
28
+ uniform vec3 lightDir;
29
+ uniform vec3 lightPlaneNormal;
30
+ uniform float lightPlaneConstant;
31
+ uniform float near;
32
+ uniform float far;
33
+ uniform float time;
34
+ uniform float worldRadius;
35
+ uniform float resolution;
36
+ uniform float size;
37
+ uniform float intensity;
38
+ uniform float ior;
39
+ precision highp isampler2D;
40
+ precision highp usampler2D;
41
+ uniform sampler2D normalTexture;
42
+ uniform sampler2D depthTexture;
43
+ uniform float bounces;
44
+ varying vec2 vUv;
45
+ vec3 WorldPosFromDepth(float depth, vec2 coord) {
46
+ float z = depth * 2.0 - 1.0;
47
+ vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
48
+ vec4 viewSpacePosition = cameraProjectionMatrixInv * clipSpacePosition;
49
+ // Perspective division
50
+ viewSpacePosition /= viewSpacePosition.w;
51
+ vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
52
+ return worldSpacePosition.xyz;
53
+ }
54
+ float sdPlane( vec3 p, vec3 n, float h ) {
55
+ // n must be normalized
56
+ return dot(p,n) + h;
57
+ }
58
+ float planeIntersect( vec3 ro, vec3 rd, vec4 p ) {
59
+ return -(dot(ro,p.xyz)+p.w)/dot(rd,p.xyz);
60
+ }
61
+ vec3 totalInternalReflection(vec3 ro, vec3 rd, vec3 pos, vec3 normal, float ior, out vec3 rayOrigin, out vec3 rayDirection) {
62
+ rayOrigin = ro;
63
+ rayDirection = rd;
64
+ rayDirection = refract(rayDirection, normal, 1.0 / ior);
65
+ rayOrigin = pos + rayDirection * 0.1;
66
+ return rayDirection;
67
+ }
68
+ void main() {
69
+ // Each sample consists of random offset in the x and y direction
70
+ float caustic = 0.0;
71
+ float causticTexelSize = (1.0 / resolution) * size * 2.0;
72
+ float texelsNeeded = worldRadius / causticTexelSize;
73
+ float sampleRadius = texelsNeeded / resolution;
74
+ float sum = 0.0;
75
+ if (texture2D(depthTexture, vUv).x == 1.0) {
76
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
77
+ return;
78
+ }
79
+ vec2 offset1 = vec2(-0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);
80
+ vec2 offset2 = vec2(-0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);
81
+ vec2 offset3 = vec2(0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);
82
+ vec2 offset4 = vec2(0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);
83
+ vec2 uv1 = vUv + offset1 * sampleRadius;
84
+ vec2 uv2 = vUv + offset2 * sampleRadius;
85
+ vec2 uv3 = vUv + offset3 * sampleRadius;
86
+ vec2 uv4 = vUv + offset4 * sampleRadius;
87
+ vec3 normal1 = texture2D(normalTexture, uv1, -10.0).rgb * 2.0 - 1.0;
88
+ vec3 normal2 = texture2D(normalTexture, uv2, -10.0).rgb * 2.0 - 1.0;
89
+ vec3 normal3 = texture2D(normalTexture, uv3, -10.0).rgb * 2.0 - 1.0;
90
+ vec3 normal4 = texture2D(normalTexture, uv4, -10.0).rgb * 2.0 - 1.0;
91
+ float depth1 = texture2D(depthTexture, uv1, -10.0).x;
92
+ float depth2 = texture2D(depthTexture, uv2, -10.0).x;
93
+ float depth3 = texture2D(depthTexture, uv3, -10.0).x;
94
+ float depth4 = texture2D(depthTexture, uv4, -10.0).x;
95
+ // Sanity check the depths
96
+ if (depth1 == 1.0 || depth2 == 1.0 || depth3 == 1.0 || depth4 == 1.0) {
97
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
98
+ return;
99
+ }
100
+ vec3 pos1 = WorldPosFromDepth(depth1, uv1);
101
+ vec3 pos2 = WorldPosFromDepth(depth2, uv2);
102
+ vec3 pos3 = WorldPosFromDepth(depth3, uv3);
103
+ vec3 pos4 = WorldPosFromDepth(depth4, uv4);
104
+ vec3 originPos1 = WorldPosFromDepth(0.0, uv1);
105
+ vec3 originPos2 = WorldPosFromDepth(0.0, uv2);
106
+ vec3 originPos3 = WorldPosFromDepth(0.0, uv3);
107
+ vec3 originPos4 = WorldPosFromDepth(0.0, uv4);
108
+ vec3 endPos1, endPos2, endPos3, endPos4;
109
+ vec3 endDir1, endDir2, endDir3, endDir4;
110
+ totalInternalReflection(originPos1, lightDir, pos1, normal1, ior, endPos1, endDir1);
111
+ totalInternalReflection(originPos2, lightDir, pos2, normal2, ior, endPos2, endDir2);
112
+ totalInternalReflection(originPos3, lightDir, pos3, normal3, ior, endPos3, endDir3);
113
+ totalInternalReflection(originPos4, lightDir, pos4, normal4, ior, endPos4, endDir4);
114
+ float lightPosArea = length(cross(originPos2 - originPos1, originPos3 - originPos1)) + length(cross(originPos3 - originPos1, originPos4 - originPos1));
115
+ float t1 = planeIntersect(endPos1, endDir1, vec4(lightPlaneNormal, lightPlaneConstant));
116
+ float t2 = planeIntersect(endPos2, endDir2, vec4(lightPlaneNormal, lightPlaneConstant));
117
+ float t3 = planeIntersect(endPos3, endDir3, vec4(lightPlaneNormal, lightPlaneConstant));
118
+ float t4 = planeIntersect(endPos4, endDir4, vec4(lightPlaneNormal, lightPlaneConstant));
119
+ vec3 finalPos1 = endPos1 + endDir1 * t1;
120
+ vec3 finalPos2 = endPos2 + endDir2 * t2;
121
+ vec3 finalPos3 = endPos3 + endDir3 * t3;
122
+ vec3 finalPos4 = endPos4 + endDir4 * t4;
123
+ float finalArea = length(cross(finalPos2 - finalPos1, finalPos3 - finalPos1)) + length(cross(finalPos3 - finalPos1, finalPos4 - finalPos1));
124
+ caustic += intensity * (lightPosArea / finalArea);
125
+ // Calculate the area of the triangle in light spaces
126
+ gl_FragColor = vec4(vec3(max(caustic, 0.0)), 1.0);
127
+ }`);
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1c3RpY3MtbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzL3NyYy9saWIvY2F1c3RpY3MtbWF0ZXJpYWwvY2F1c3RpY3MtbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FDMUM7SUFDSSxpQkFBaUIsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7SUFDdEMseUJBQXlCLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO0lBQzlDLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsZ0JBQWdCLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLGtCQUFrQixFQUFFLENBQUM7SUFDckIsSUFBSSxFQUFFLEdBQUc7SUFDVCxHQUFHLEVBQUUsR0FBRztJQUNSLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7SUFDaEMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFO0lBQ25CLEdBQUcsRUFBRSxHQUFHO0lBQ1IsT0FBTyxFQUFFLENBQUM7SUFDVixVQUFVLEVBQUUsSUFBSTtJQUNoQixJQUFJLEVBQUUsRUFBRTtJQUNSLFNBQVMsRUFBRSxHQUFHO0NBQ2pCO0FBQ0QsVUFBVSxDQUFDOzs7O0VBSWI7QUFDRSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcUdiLENBQ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IHNoYWRlck1hdGVyaWFsIH0gZnJvbSAnLi4vc2hhZGVyLW1hdGVyaWFsL3NoYWRlci1tYXRlcmlhbCc7XG5cbmV4cG9ydCBjb25zdCBDYXVzdGljc01hdGVyaWFsID0gc2hhZGVyTWF0ZXJpYWwoXG4gICAge1xuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZDogbmV3IFRIUkVFLk1hdHJpeDQoKSxcbiAgICAgICAgY2FtZXJhUHJvamVjdGlvbk1hdHJpeEludjogbmV3IFRIUkVFLk1hdHJpeDQoKSxcbiAgICAgICAgbm9ybWFsVGV4dHVyZTogbnVsbCxcbiAgICAgICAgZGVwdGhUZXh0dXJlOiBudWxsLFxuICAgICAgICBsaWdodERpcjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCksXG4gICAgICAgIGxpZ2h0UGxhbmVOb3JtYWw6IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApLFxuICAgICAgICBsaWdodFBsYW5lQ29uc3RhbnQ6IDAsXG4gICAgICAgIG5lYXI6IDAuMSxcbiAgICAgICAgZmFyOiAxMDAsXG4gICAgICAgIG1vZGVsTWF0cml4OiBuZXcgVEhSRUUuTWF0cml4NCgpLFxuICAgICAgICB3b3JsZFJhZGl1czogMSAvIDQwLFxuICAgICAgICBpb3I6IDEuMSxcbiAgICAgICAgYm91bmNlczogMCxcbiAgICAgICAgcmVzb2x1dGlvbjogMTAyNCxcbiAgICAgICAgc2l6ZTogMTAsXG4gICAgICAgIGludGVuc2l0eTogMC41LFxuICAgIH0sXG4gICAgLyogZ2xzbCAqLyBgdmFyeWluZyB2ZWMyIHZVdjtcbnZvaWQgbWFpbigpIHtcbiAgICB2VXYgPSB1djtcbiAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xufWAsXG4gICAgLyogZ2xzbCAqLyBgdW5pZm9ybSBtYXQ0IGNhbWVyYU1hdHJpeFdvcmxkO1xudW5pZm9ybSBtYXQ0IGNhbWVyYVByb2plY3Rpb25NYXRyaXhJbnY7XG51bmlmb3JtIHZlYzMgbGlnaHREaXI7XG51bmlmb3JtIHZlYzMgbGlnaHRQbGFuZU5vcm1hbDtcbnVuaWZvcm0gZmxvYXQgbGlnaHRQbGFuZUNvbnN0YW50O1xudW5pZm9ybSBmbG9hdCBuZWFyO1xudW5pZm9ybSBmbG9hdCBmYXI7XG51bmlmb3JtIGZsb2F0IHRpbWU7XG51bmlmb3JtIGZsb2F0IHdvcmxkUmFkaXVzO1xudW5pZm9ybSBmbG9hdCByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCBzaXplO1xudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7XG51bmlmb3JtIGZsb2F0IGlvcjtcbnByZWNpc2lvbiBoaWdocCBpc2FtcGxlcjJEO1xucHJlY2lzaW9uIGhpZ2hwIHVzYW1wbGVyMkQ7XG51bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxUZXh0dXJlO1xudW5pZm9ybSBzYW1wbGVyMkQgZGVwdGhUZXh0dXJlO1xudW5pZm9ybSBmbG9hdCBib3VuY2VzO1xudmFyeWluZyB2ZWMyIHZVdjtcbnZlYzMgV29ybGRQb3NGcm9tRGVwdGgoZmxvYXQgZGVwdGgsIHZlYzIgY29vcmQpIHtcbiAgZmxvYXQgeiA9IGRlcHRoICogMi4wIC0gMS4wO1xuICB2ZWM0IGNsaXBTcGFjZVBvc2l0aW9uID0gdmVjNChjb29yZCAqIDIuMCAtIDEuMCwgeiwgMS4wKTtcbiAgdmVjNCB2aWV3U3BhY2VQb3NpdGlvbiA9IGNhbWVyYVByb2plY3Rpb25NYXRyaXhJbnYgKiBjbGlwU3BhY2VQb3NpdGlvbjtcbiAgLy8gUGVyc3BlY3RpdmUgZGl2aXNpb25cbiAgdmlld1NwYWNlUG9zaXRpb24gLz0gdmlld1NwYWNlUG9zaXRpb24udztcbiAgdmVjNCB3b3JsZFNwYWNlUG9zaXRpb24gPSBjYW1lcmFNYXRyaXhXb3JsZCAqIHZpZXdTcGFjZVBvc2l0aW9uO1xuICByZXR1cm4gd29ybGRTcGFjZVBvc2l0aW9uLnh5ejtcbn1cbmZsb2F0IHNkUGxhbmUoIHZlYzMgcCwgdmVjMyBuLCBmbG9hdCBoICkge1xuICAvLyBuIG11c3QgYmUgbm9ybWFsaXplZFxuICByZXR1cm4gZG90KHAsbikgKyBoO1xufVxuZmxvYXQgcGxhbmVJbnRlcnNlY3QoIHZlYzMgcm8sIHZlYzMgcmQsIHZlYzQgcCApIHtcbiAgcmV0dXJuIC0oZG90KHJvLHAueHl6KStwLncpL2RvdChyZCxwLnh5eik7XG59XG52ZWMzIHRvdGFsSW50ZXJuYWxSZWZsZWN0aW9uKHZlYzMgcm8sIHZlYzMgcmQsIHZlYzMgcG9zLCB2ZWMzIG5vcm1hbCwgZmxvYXQgaW9yLCBvdXQgdmVjMyByYXlPcmlnaW4sIG91dCB2ZWMzIHJheURpcmVjdGlvbikge1xuICByYXlPcmlnaW4gPSBybztcbiAgcmF5RGlyZWN0aW9uID0gcmQ7XG4gIHJheURpcmVjdGlvbiA9IHJlZnJhY3QocmF5RGlyZWN0aW9uLCBub3JtYWwsIDEuMCAvIGlvcik7XG4gIHJheU9yaWdpbiA9IHBvcyArIHJheURpcmVjdGlvbiAqIDAuMTtcbiAgcmV0dXJuIHJheURpcmVjdGlvbjtcbn1cbnZvaWQgbWFpbigpIHtcbiAgLy8gRWFjaCBzYW1wbGUgY29uc2lzdHMgb2YgcmFuZG9tIG9mZnNldCBpbiB0aGUgeCBhbmQgeSBkaXJlY3Rpb25cbiAgZmxvYXQgY2F1c3RpYyA9IDAuMDtcbiAgZmxvYXQgY2F1c3RpY1RleGVsU2l6ZSA9ICgxLjAgLyByZXNvbHV0aW9uKSAqIHNpemUgKiAyLjA7XG4gIGZsb2F0IHRleGVsc05lZWRlZCA9IHdvcmxkUmFkaXVzIC8gY2F1c3RpY1RleGVsU2l6ZTtcbiAgZmxvYXQgc2FtcGxlUmFkaXVzID0gdGV4ZWxzTmVlZGVkIC8gcmVzb2x1dGlvbjtcbiAgZmxvYXQgc3VtID0gMC4wO1xuICBpZiAodGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdlV2KS54ID09IDEuMCkge1xuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmVjMiBvZmZzZXQxID0gdmVjMigtMC41LCAtMC41KTsvL3ZlYzIocmFuZCgpIC0gMC41LCByYW5kKCkgLSAwLjUpO1xuICB2ZWMyIG9mZnNldDIgPSB2ZWMyKC0wLjUsIDAuNSk7Ly92ZWMyKHJhbmQoKSAtIDAuNSwgcmFuZCgpIC0gMC41KTtcbiAgdmVjMiBvZmZzZXQzID0gdmVjMigwLjUsIDAuNSk7Ly92ZWMyKHJhbmQoKSAtIDAuNSwgcmFuZCgpIC0gMC41KTtcbiAgdmVjMiBvZmZzZXQ0ID0gdmVjMigwLjUsIC0wLjUpOy8vdmVjMihyYW5kKCkgLSAwLjUsIHJhbmQoKSAtIDAuNSk7XG4gIHZlYzIgdXYxID0gdlV2ICsgb2Zmc2V0MSAqIHNhbXBsZVJhZGl1cztcbiAgdmVjMiB1djIgPSB2VXYgKyBvZmZzZXQyICogc2FtcGxlUmFkaXVzO1xuICB2ZWMyIHV2MyA9IHZVdiArIG9mZnNldDMgKiBzYW1wbGVSYWRpdXM7XG4gIHZlYzIgdXY0ID0gdlV2ICsgb2Zmc2V0NCAqIHNhbXBsZVJhZGl1cztcbiAgdmVjMyBub3JtYWwxID0gdGV4dHVyZTJEKG5vcm1hbFRleHR1cmUsIHV2MSwgLTEwLjApLnJnYiAqIDIuMCAtIDEuMDtcbiAgdmVjMyBub3JtYWwyID0gdGV4dHVyZTJEKG5vcm1hbFRleHR1cmUsIHV2MiwgLTEwLjApLnJnYiAqIDIuMCAtIDEuMDtcbiAgdmVjMyBub3JtYWwzID0gdGV4dHVyZTJEKG5vcm1hbFRleHR1cmUsIHV2MywgLTEwLjApLnJnYiAqIDIuMCAtIDEuMDtcbiAgdmVjMyBub3JtYWw0ID0gdGV4dHVyZTJEKG5vcm1hbFRleHR1cmUsIHV2NCwgLTEwLjApLnJnYiAqIDIuMCAtIDEuMDtcbiAgZmxvYXQgZGVwdGgxID0gdGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdXYxLCAtMTAuMCkueDtcbiAgZmxvYXQgZGVwdGgyID0gdGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdXYyLCAtMTAuMCkueDtcbiAgZmxvYXQgZGVwdGgzID0gdGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdXYzLCAtMTAuMCkueDtcbiAgZmxvYXQgZGVwdGg0ID0gdGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdXY0LCAtMTAuMCkueDtcbiAgLy8gU2FuaXR5IGNoZWNrIHRoZSBkZXB0aHNcbiAgaWYgKGRlcHRoMSA9PSAxLjAgfHwgZGVwdGgyID09IDEuMCB8fCBkZXB0aDMgPT0gMS4wIHx8IGRlcHRoNCA9PSAxLjApIHtcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZlYzMgcG9zMSA9IFdvcmxkUG9zRnJvbURlcHRoKGRlcHRoMSwgdXYxKTtcbiAgdmVjMyBwb3MyID0gV29ybGRQb3NGcm9tRGVwdGgoZGVwdGgyLCB1djIpO1xuICB2ZWMzIHBvczMgPSBXb3JsZFBvc0Zyb21EZXB0aChkZXB0aDMsIHV2Myk7XG4gIHZlYzMgcG9zNCA9IFdvcmxkUG9zRnJvbURlcHRoKGRlcHRoNCwgdXY0KTtcbiAgdmVjMyBvcmlnaW5Qb3MxID0gV29ybGRQb3NGcm9tRGVwdGgoMC4wLCB1djEpO1xuICB2ZWMzIG9yaWdpblBvczIgPSBXb3JsZFBvc0Zyb21EZXB0aCgwLjAsIHV2Mik7XG4gIHZlYzMgb3JpZ2luUG9zMyA9IFdvcmxkUG9zRnJvbURlcHRoKDAuMCwgdXYzKTtcbiAgdmVjMyBvcmlnaW5Qb3M0ID0gV29ybGRQb3NGcm9tRGVwdGgoMC4wLCB1djQpO1xuICB2ZWMzIGVuZFBvczEsIGVuZFBvczIsIGVuZFBvczMsIGVuZFBvczQ7XG4gIHZlYzMgZW5kRGlyMSwgZW5kRGlyMiwgZW5kRGlyMywgZW5kRGlyNDtcbiAgdG90YWxJbnRlcm5hbFJlZmxlY3Rpb24ob3JpZ2luUG9zMSwgbGlnaHREaXIsIHBvczEsIG5vcm1hbDEsIGlvciwgZW5kUG9zMSwgZW5kRGlyMSk7XG4gIHRvdGFsSW50ZXJuYWxSZWZsZWN0aW9uKG9yaWdpblBvczIsIGxpZ2h0RGlyLCBwb3MyLCBub3JtYWwyLCBpb3IsIGVuZFBvczIsIGVuZERpcjIpO1xuICB0b3RhbEludGVybmFsUmVmbGVjdGlvbihvcmlnaW5Qb3MzLCBsaWdodERpciwgcG9zMywgbm9ybWFsMywgaW9yLCBlbmRQb3MzLCBlbmREaXIzKTtcbiAgdG90YWxJbnRlcm5hbFJlZmxlY3Rpb24ob3JpZ2luUG9zNCwgbGlnaHREaXIsIHBvczQsIG5vcm1hbDQsIGlvciwgZW5kUG9zNCwgZW5kRGlyNCk7XG4gIGZsb2F0IGxpZ2h0UG9zQXJlYSA9IGxlbmd0aChjcm9zcyhvcmlnaW5Qb3MyIC0gb3JpZ2luUG9zMSwgb3JpZ2luUG9zMyAtIG9yaWdpblBvczEpKSArIGxlbmd0aChjcm9zcyhvcmlnaW5Qb3MzIC0gb3JpZ2luUG9zMSwgb3JpZ2luUG9zNCAtIG9yaWdpblBvczEpKTtcbiAgZmxvYXQgdDEgPSBwbGFuZUludGVyc2VjdChlbmRQb3MxLCBlbmREaXIxLCB2ZWM0KGxpZ2h0UGxhbmVOb3JtYWwsIGxpZ2h0UGxhbmVDb25zdGFudCkpO1xuICBmbG9hdCB0MiA9IHBsYW5lSW50ZXJzZWN0KGVuZFBvczIsIGVuZERpcjIsIHZlYzQobGlnaHRQbGFuZU5vcm1hbCwgbGlnaHRQbGFuZUNvbnN0YW50KSk7XG4gIGZsb2F0IHQzID0gcGxhbmVJbnRlcnNlY3QoZW5kUG9zMywgZW5kRGlyMywgdmVjNChsaWdodFBsYW5lTm9ybWFsLCBsaWdodFBsYW5lQ29uc3RhbnQpKTtcbiAgZmxvYXQgdDQgPSBwbGFuZUludGVyc2VjdChlbmRQb3M0LCBlbmREaXI0LCB2ZWM0KGxpZ2h0UGxhbmVOb3JtYWwsIGxpZ2h0UGxhbmVDb25zdGFudCkpO1xuICB2ZWMzIGZpbmFsUG9zMSA9IGVuZFBvczEgKyBlbmREaXIxICogdDE7XG4gIHZlYzMgZmluYWxQb3MyID0gZW5kUG9zMiArIGVuZERpcjIgKiB0MjtcbiAgdmVjMyBmaW5hbFBvczMgPSBlbmRQb3MzICsgZW5kRGlyMyAqIHQzO1xuICB2ZWMzIGZpbmFsUG9zNCA9IGVuZFBvczQgKyBlbmREaXI0ICogdDQ7XG4gIGZsb2F0IGZpbmFsQXJlYSA9IGxlbmd0aChjcm9zcyhmaW5hbFBvczIgLSBmaW5hbFBvczEsIGZpbmFsUG9zMyAtIGZpbmFsUG9zMSkpICsgbGVuZ3RoKGNyb3NzKGZpbmFsUG9zMyAtIGZpbmFsUG9zMSwgZmluYWxQb3M0IC0gZmluYWxQb3MxKSk7XG4gIGNhdXN0aWMgKz0gaW50ZW5zaXR5ICogKGxpZ2h0UG9zQXJlYSAvIGZpbmFsQXJlYSk7XG4gIC8vIENhbGN1bGF0ZSB0aGUgYXJlYSBvZiB0aGUgdHJpYW5nbGUgaW4gbGlnaHQgc3BhY2VzXG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQodmVjMyhtYXgoY2F1c3RpYywgMC4wKSksIDEuMCk7XG59YFxuKTtcbiJdfQ==