angular-three-soba 1.10.0 → 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.
- package/abstractions/index.d.ts +1 -0
- package/abstractions/lib/edges/edges.d.ts +18 -0
- package/cameras/index.d.ts +1 -0
- package/cameras/lib/camera/camera-content.d.ts +1 -1
- package/cameras/lib/cube-camera/cube-camera.d.ts +27 -0
- package/esm2020/abstractions/index.mjs +2 -1
- package/esm2020/abstractions/lib/edges/edges.mjs +95 -0
- package/esm2020/cameras/index.mjs +2 -1
- package/esm2020/cameras/lib/camera/camera-content.mjs +1 -1
- package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +130 -0
- package/esm2020/materials/index.mjs +3 -1
- package/esm2020/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +157 -0
- package/esm2020/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +240 -0
- package/esm2020/misc/lib/fbo/fbo.mjs +5 -4
- package/esm2020/shaders/index.mjs +5 -1
- package/esm2020/shaders/lib/caustics-material/caustics-material.mjs +128 -0
- package/esm2020/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +33 -0
- package/esm2020/shaders/lib/discard-material/discard-material.mjs +3 -0
- package/esm2020/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +268 -0
- package/esm2020/staging/index.mjs +2 -1
- package/esm2020/staging/lib/accumulative-shadows/progressive-light-map.mjs +2 -3
- package/esm2020/staging/lib/caustics/caustics.mjs +364 -0
- package/fesm2015/angular-three-soba-abstractions.mjs +91 -2
- package/fesm2015/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2015/angular-three-soba-cameras.mjs +127 -4
- package/fesm2015/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2015/angular-three-soba-materials.mjs +389 -2
- package/fesm2015/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2015/angular-three-soba-misc.mjs +4 -3
- package/fesm2015/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2015/angular-three-soba-shaders.mjs +454 -31
- package/fesm2015/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2015/angular-three-soba-staging.mjs +363 -9
- package/fesm2015/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2020/angular-three-soba-abstractions.mjs +91 -2
- package/fesm2020/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2020/angular-three-soba-cameras.mjs +127 -4
- package/fesm2020/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2020/angular-three-soba-materials.mjs +387 -2
- package/fesm2020/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2020/angular-three-soba-misc.mjs +4 -3
- package/fesm2020/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2020/angular-three-soba-shaders.mjs +460 -34
- package/fesm2020/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2020/angular-three-soba-staging.mjs +362 -9
- package/fesm2020/angular-three-soba-staging.mjs.map +1 -1
- package/materials/index.d.ts +2 -0
- package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +28 -0
- package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +47 -0
- package/misc/lib/fbo/fbo.d.ts +8 -6
- package/package.json +2 -2
- package/plugin/package.json +1 -1
- package/shaders/index.d.ts +4 -0
- package/shaders/lib/caustics-material/caustics-material.d.ts +4 -0
- package/shaders/lib/caustics-projection-material/caustics-projection-material.d.ts +4 -0
- package/shaders/lib/discard-material/discard-material.d.ts +3 -0
- package/shaders/lib/mesh-transmission-material/mesh-transmission-material.d.ts +25 -0
- package/staging/index.d.ts +1 -0
- package/staging/lib/caustics/caustics.d.ts +48 -0
- package/staging/lib/environment/environment-cube.d.ts +1 -1
- package/staging/lib/environment/environment-ground.d.ts +1 -1
- package/staging/lib/environment/utils.d.ts +1 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
export class MeshTransmissionMaterial extends THREE.MeshPhysicalMaterial {
|
|
3
|
+
constructor(samples = 6, transmissionSampler = false) {
|
|
4
|
+
super();
|
|
5
|
+
this.uniforms = {
|
|
6
|
+
chromaticAberration: { value: 0.05 },
|
|
7
|
+
// Transmission must always be 0, unless transmissionSampler is being used
|
|
8
|
+
transmission: { value: 0 },
|
|
9
|
+
// Instead a workaround is used, see below for reasons why
|
|
10
|
+
_transmission: { value: 1 },
|
|
11
|
+
transmissionMap: { value: null },
|
|
12
|
+
// Roughness is 1 in THREE.MeshPhysicalMaterial but it makes little sense in a transmission material
|
|
13
|
+
roughness: { value: 0 },
|
|
14
|
+
thickness: { value: 0 },
|
|
15
|
+
thicknessMap: { value: null },
|
|
16
|
+
attenuationDistance: { value: Infinity },
|
|
17
|
+
attenuationColor: { value: new THREE.Color('white') },
|
|
18
|
+
anisotropy: { value: 0.1 },
|
|
19
|
+
time: { value: 0 },
|
|
20
|
+
distortion: { value: 0.0 },
|
|
21
|
+
distortionScale: { value: 0.5 },
|
|
22
|
+
temporalDistortion: { value: 0.0 },
|
|
23
|
+
buffer: { value: null },
|
|
24
|
+
};
|
|
25
|
+
this.onBeforeCompile = (shader) => {
|
|
26
|
+
shader.uniforms = {
|
|
27
|
+
...shader.uniforms,
|
|
28
|
+
...this.uniforms,
|
|
29
|
+
};
|
|
30
|
+
// If the transmission sampler is active inject a flag
|
|
31
|
+
if (transmissionSampler)
|
|
32
|
+
shader.defines['USE_SAMPLER'] = '';
|
|
33
|
+
// Otherwise we do use use .transmission and must therefore force USE_TRANSMISSION
|
|
34
|
+
// because threejs won't inject it for us
|
|
35
|
+
else
|
|
36
|
+
shader.defines['USE_TRANSMISSION'] = '';
|
|
37
|
+
// Head
|
|
38
|
+
shader.fragmentShader =
|
|
39
|
+
/*glsl*/ `
|
|
40
|
+
uniform float chromaticAberration;
|
|
41
|
+
uniform float anisotropy;
|
|
42
|
+
uniform float time;
|
|
43
|
+
uniform float distortion;
|
|
44
|
+
uniform float distortionScale;
|
|
45
|
+
uniform float temporalDistortion;
|
|
46
|
+
uniform sampler2D buffer;
|
|
47
|
+
|
|
48
|
+
vec3 random3(vec3 c) {
|
|
49
|
+
float j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0)));
|
|
50
|
+
vec3 r;
|
|
51
|
+
r.z = fract(512.0*j);
|
|
52
|
+
j *= .125;
|
|
53
|
+
r.x = fract(512.0*j);
|
|
54
|
+
j *= .125;
|
|
55
|
+
r.y = fract(512.0*j);
|
|
56
|
+
return r-0.5;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
float seed = 0.0;
|
|
60
|
+
uint hash( uint x ) {
|
|
61
|
+
x += ( x << 10u );
|
|
62
|
+
x ^= ( x >> 6u );
|
|
63
|
+
x += ( x << 3u );
|
|
64
|
+
x ^= ( x >> 11u );
|
|
65
|
+
x += ( x << 15u );
|
|
66
|
+
return x;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Compound versions of the hashing algorithm I whipped together.
|
|
70
|
+
uint hash( uvec2 v ) { return hash( v.x ^ hash(v.y) ); }
|
|
71
|
+
uint hash( uvec3 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ); }
|
|
72
|
+
uint hash( uvec4 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ^ hash(v.w) ); }
|
|
73
|
+
|
|
74
|
+
// Construct a float with half-open range [0:1] using low 23 bits.
|
|
75
|
+
// All zeroes yields 0.0, all ones yields the next smallest representable value below 1.0.
|
|
76
|
+
float floatConstruct( uint m ) {
|
|
77
|
+
const uint ieeeMantissa = 0x007FFFFFu; // binary32 mantissa bitmask
|
|
78
|
+
const uint ieeeOne = 0x3F800000u; // 1.0 in IEEE binary32
|
|
79
|
+
m &= ieeeMantissa; // Keep only mantissa bits (fractional part)
|
|
80
|
+
m |= ieeeOne; // Add fractional part to 1.0
|
|
81
|
+
float f = uintBitsToFloat( m ); // Range [1:2]
|
|
82
|
+
return f - 1.0; // Range [0:1]
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Pseudo-random value in half-open range [0:1].
|
|
86
|
+
float random( float x ) { return floatConstruct(hash(floatBitsToUint(x))); }
|
|
87
|
+
float random( vec2 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
|
|
88
|
+
float random( vec3 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
|
|
89
|
+
float random( vec4 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
|
|
90
|
+
|
|
91
|
+
float rand() {
|
|
92
|
+
float result = random(vec3(gl_FragCoord.xy, seed));
|
|
93
|
+
seed += 1.0;
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const float F3 = 0.3333333;
|
|
98
|
+
const float G3 = 0.1666667;
|
|
99
|
+
|
|
100
|
+
float snoise(vec3 p) {
|
|
101
|
+
vec3 s = floor(p + dot(p, vec3(F3)));
|
|
102
|
+
vec3 x = p - s + dot(s, vec3(G3));
|
|
103
|
+
vec3 e = step(vec3(0.0), x - x.yzx);
|
|
104
|
+
vec3 i1 = e*(1.0 - e.zxy);
|
|
105
|
+
vec3 i2 = 1.0 - e.zxy*(1.0 - e);
|
|
106
|
+
vec3 x1 = x - i1 + G3;
|
|
107
|
+
vec3 x2 = x - i2 + 2.0*G3;
|
|
108
|
+
vec3 x3 = x - 1.0 + 3.0*G3;
|
|
109
|
+
vec4 w, d;
|
|
110
|
+
w.x = dot(x, x);
|
|
111
|
+
w.y = dot(x1, x1);
|
|
112
|
+
w.z = dot(x2, x2);
|
|
113
|
+
w.w = dot(x3, x3);
|
|
114
|
+
w = max(0.6 - w, 0.0);
|
|
115
|
+
d.x = dot(random3(s), x);
|
|
116
|
+
d.y = dot(random3(s + i1), x1);
|
|
117
|
+
d.z = dot(random3(s + i2), x2);
|
|
118
|
+
d.w = dot(random3(s + 1.0), x3);
|
|
119
|
+
w *= w;
|
|
120
|
+
w *= w;
|
|
121
|
+
d *= w;
|
|
122
|
+
return dot(d, vec4(52.0));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
float snoiseFractal(vec3 m) {
|
|
126
|
+
return 0.5333333* snoise(m)
|
|
127
|
+
+0.2666667* snoise(2.0*m)
|
|
128
|
+
+0.1333333* snoise(4.0*m)
|
|
129
|
+
+0.0666667* snoise(8.0*m);
|
|
130
|
+
}\n` + shader.fragmentShader;
|
|
131
|
+
// Remove transmission
|
|
132
|
+
shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_pars_fragment>',
|
|
133
|
+
/*glsl*/ `
|
|
134
|
+
#ifdef USE_TRANSMISSION
|
|
135
|
+
// Transmission code is based on glTF-Sampler-Viewer
|
|
136
|
+
// https://github.com/KhronosGroup/glTF-Sample-Viewer
|
|
137
|
+
uniform float _transmission;
|
|
138
|
+
uniform float thickness;
|
|
139
|
+
uniform float attenuationDistance;
|
|
140
|
+
uniform vec3 attenuationColor;
|
|
141
|
+
#ifdef USE_TRANSMISSIONMAP
|
|
142
|
+
uniform sampler2D transmissionMap;
|
|
143
|
+
#endif
|
|
144
|
+
#ifdef USE_THICKNESSMAP
|
|
145
|
+
uniform sampler2D thicknessMap;
|
|
146
|
+
#endif
|
|
147
|
+
uniform vec2 transmissionSamplerSize;
|
|
148
|
+
uniform sampler2D transmissionSamplerMap;
|
|
149
|
+
uniform mat4 modelMatrix;
|
|
150
|
+
uniform mat4 projectionMatrix;
|
|
151
|
+
varying vec3 vWorldPosition;
|
|
152
|
+
vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {
|
|
153
|
+
// Direction of refracted light.
|
|
154
|
+
vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );
|
|
155
|
+
// Compute rotation-independant scaling of the model matrix.
|
|
156
|
+
vec3 modelScale;
|
|
157
|
+
modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );
|
|
158
|
+
modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );
|
|
159
|
+
modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );
|
|
160
|
+
// The thickness is specified in local space.
|
|
161
|
+
return normalize( refractionVector ) * thickness * modelScale;
|
|
162
|
+
}
|
|
163
|
+
float applyIorToRoughness( const in float roughness, const in float ior ) {
|
|
164
|
+
// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and
|
|
165
|
+
// an IOR of 1.5 results in the default amount of microfacet refraction.
|
|
166
|
+
return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );
|
|
167
|
+
}
|
|
168
|
+
vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {
|
|
169
|
+
float framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );
|
|
170
|
+
#ifdef USE_SAMPLER
|
|
171
|
+
#ifdef texture2DLodEXT
|
|
172
|
+
return texture2DLodEXT(transmissionSamplerMap, fragCoord.xy, framebufferLod);
|
|
173
|
+
#else
|
|
174
|
+
return texture2D(transmissionSamplerMap, fragCoord.xy, framebufferLod);
|
|
175
|
+
#endif
|
|
176
|
+
#else
|
|
177
|
+
return texture2D(buffer, fragCoord.xy);
|
|
178
|
+
#endif
|
|
179
|
+
}
|
|
180
|
+
vec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {
|
|
181
|
+
if ( isinf( attenuationDistance ) ) {
|
|
182
|
+
// Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.
|
|
183
|
+
return radiance;
|
|
184
|
+
} else {
|
|
185
|
+
// Compute light attenuation using Beer's law.
|
|
186
|
+
vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;
|
|
187
|
+
vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law
|
|
188
|
+
return transmittance * radiance;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,
|
|
192
|
+
const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,
|
|
193
|
+
const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,
|
|
194
|
+
const in vec3 attenuationColor, const in float attenuationDistance ) {
|
|
195
|
+
vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );
|
|
196
|
+
vec3 refractedRayExit = position + transmissionRay;
|
|
197
|
+
// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
|
|
198
|
+
vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
|
|
199
|
+
vec2 refractionCoords = ndcPos.xy / ndcPos.w;
|
|
200
|
+
refractionCoords += 1.0;
|
|
201
|
+
refractionCoords /= 2.0;
|
|
202
|
+
// Sample framebuffer to get pixel the refracted ray hits.
|
|
203
|
+
vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );
|
|
204
|
+
vec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );
|
|
205
|
+
// Get the specular component.
|
|
206
|
+
vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );
|
|
207
|
+
return vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );
|
|
208
|
+
}
|
|
209
|
+
#endif\n`);
|
|
210
|
+
// Add refraction
|
|
211
|
+
shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_fragment>',
|
|
212
|
+
/*glsl*/ `
|
|
213
|
+
// Improve the refraction to use the world pos
|
|
214
|
+
material.transmission = _transmission;
|
|
215
|
+
material.transmissionAlpha = 1.0;
|
|
216
|
+
material.thickness = thickness;
|
|
217
|
+
material.attenuationDistance = attenuationDistance;
|
|
218
|
+
material.attenuationColor = attenuationColor;
|
|
219
|
+
#ifdef USE_TRANSMISSIONMAP
|
|
220
|
+
material.transmission *= texture2D( transmissionMap, vUv ).r;
|
|
221
|
+
#endif
|
|
222
|
+
#ifdef USE_THICKNESSMAP
|
|
223
|
+
material.thickness *= texture2D( thicknessMap, vUv ).g;
|
|
224
|
+
#endif
|
|
225
|
+
|
|
226
|
+
vec3 pos = vWorldPosition;
|
|
227
|
+
vec3 v = normalize( cameraPosition - pos );
|
|
228
|
+
vec3 n = inverseTransformDirection( normal, viewMatrix );
|
|
229
|
+
vec3 transmission = vec3(0.0);
|
|
230
|
+
float transmissionR, transmissionB, transmissionG;
|
|
231
|
+
float randomCoords = rand();
|
|
232
|
+
float thickness_smear = thickness * max(pow(roughnessFactor, 0.33), anisotropy);
|
|
233
|
+
vec3 distortionNormal = vec3(0.0);
|
|
234
|
+
vec3 temporalOffset = vec3(time, -time, -time) * temporalDistortion;
|
|
235
|
+
if (distortion > 0.0) {
|
|
236
|
+
distortionNormal = distortion * vec3(snoiseFractal(vec3((pos * distortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * distortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * distortionScale + temporalOffset)));
|
|
237
|
+
}
|
|
238
|
+
for (float i = 0.0; i < ${samples}.0; i ++) {
|
|
239
|
+
vec3 sampleNorm = normalize(n + roughnessFactor * roughnessFactor * 2.0 * normalize(vec3(rand() - 0.5, rand() - 0.5, rand() - 0.5)) * pow(rand(), 0.33) + distortionNormal);
|
|
240
|
+
transmissionR = getIBLVolumeRefraction(
|
|
241
|
+
sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
|
|
242
|
+
pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
|
|
243
|
+
material.attenuationColor, material.attenuationDistance
|
|
244
|
+
).r;
|
|
245
|
+
transmissionG = getIBLVolumeRefraction(
|
|
246
|
+
sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
|
|
247
|
+
pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + chromaticAberration * (i + randomCoords) / float(${samples})) , material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
|
|
248
|
+
material.attenuationColor, material.attenuationDistance
|
|
249
|
+
).g;
|
|
250
|
+
transmissionB = getIBLVolumeRefraction(
|
|
251
|
+
sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
|
|
252
|
+
pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * chromaticAberration * (i + randomCoords) / float(${samples})), material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
|
|
253
|
+
material.attenuationColor, material.attenuationDistance
|
|
254
|
+
).b;
|
|
255
|
+
transmission.r += transmissionR;
|
|
256
|
+
transmission.g += transmissionG;
|
|
257
|
+
transmission.b += transmissionB;
|
|
258
|
+
}
|
|
259
|
+
transmission /= ${samples}.0;
|
|
260
|
+
totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n`);
|
|
261
|
+
};
|
|
262
|
+
Object.keys(this.uniforms).forEach((name) => Object.defineProperty(this, name, {
|
|
263
|
+
get: () => this.uniforms[name].value,
|
|
264
|
+
set: (v) => (this.uniforms[name].value = v),
|
|
265
|
+
}));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzL3NyYy9saWIvbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwvbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFNL0IsTUFBTSxPQUFPLHdCQUF5QixTQUFRLEtBQUssQ0FBQyxvQkFBb0I7SUFtQnBFLFlBQVksT0FBTyxHQUFHLENBQUMsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBQ2hELEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNaLG1CQUFtQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUNwQywwRUFBMEU7WUFDMUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMxQiwwREFBMEQ7WUFDMUQsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMzQixlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ2hDLG9HQUFvRztZQUNwRyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZCLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDdkIsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUM3QixtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDeEMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3JELFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDMUIsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUNsQixVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQzFCLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDL0Isa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7U0FDMUIsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxNQUE2RCxFQUFFLEVBQUU7WUFDckYsTUFBTSxDQUFDLFFBQVEsR0FBRztnQkFDZCxHQUFHLE1BQU0sQ0FBQyxRQUFRO2dCQUNsQixHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ25CLENBQUM7WUFFRixzREFBc0Q7WUFDdEQsSUFBSSxtQkFBbUI7Z0JBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDNUQsa0ZBQWtGO1lBQ2xGLHlDQUF5Qzs7Z0JBQ3BDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFN0MsT0FBTztZQUNQLE1BQU0sQ0FBQyxjQUFjO2dCQUNqQixRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7VUEyRmYsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBRXZCLHNCQUFzQjtZQUN0QixNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUNqRCx1Q0FBdUM7WUFDdkMsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQTRFUixDQUNKLENBQUM7WUFFRixpQkFBaUI7WUFDakIsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FDakQsa0NBQWtDO1lBQ2xDLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBMEJTLE9BQU87Ozs7K0lBSXNHLE9BQU87Ozs7O3NJQUtoQixPQUFPLDBFQUEwRSxPQUFPOzs7OzsySUFLbkYsT0FBTyx5RUFBeUUsT0FBTzs7Ozs7OzswQkFPeE0sT0FBTzt1RkFDc0QsQ0FDMUUsQ0FBQztRQUNOLENBQUMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3hDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUM5QixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUUsSUFBSSxDQUFDLFFBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSztZQUN0RCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUUsSUFBSSxDQUFDLFFBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNoRSxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5ndEFueVJlY29yZCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5pbnRlcmZhY2UgVW5pZm9ybTxUPiB7XG4gICAgdmFsdWU6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNZXNoVHJhbnNtaXNzaW9uTWF0ZXJpYWwgZXh0ZW5kcyBUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbCB7XG4gICAgdW5pZm9ybXM6IHtcbiAgICAgICAgY2hyb21hdGljQWJlcnJhdGlvbjogVW5pZm9ybTxudW1iZXI+O1xuICAgICAgICB0cmFuc21pc3Npb246IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgdHJhbnNtaXNzaW9uTWFwOiBVbmlmb3JtPFRIUkVFLlRleHR1cmUgfCBudWxsPjtcbiAgICAgICAgX3RyYW5zbWlzc2lvbjogVW5pZm9ybTxudW1iZXI+O1xuICAgICAgICB0aGlja25lc3M6IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgcm91Z2huZXNzOiBVbmlmb3JtPG51bWJlcj47XG4gICAgICAgIHRoaWNrbmVzc01hcDogVW5pZm9ybTxUSFJFRS5UZXh0dXJlIHwgbnVsbD47XG4gICAgICAgIGF0dGVudWF0aW9uRGlzdGFuY2U6IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgYXR0ZW51YXRpb25Db2xvcjogVW5pZm9ybTxUSFJFRS5Db2xvcj47XG4gICAgICAgIGFuaXNvdHJvcHk6IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgdGltZTogVW5pZm9ybTxudW1iZXI+O1xuICAgICAgICBkaXN0b3J0aW9uOiBVbmlmb3JtPG51bWJlcj47XG4gICAgICAgIGRpc3RvcnRpb25TY2FsZTogVW5pZm9ybTxudW1iZXI+O1xuICAgICAgICB0ZW1wb3JhbERpc3RvcnRpb246IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgYnVmZmVyOiBVbmlmb3JtPFRIUkVFLlRleHR1cmUgfCBudWxsPjtcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3Ioc2FtcGxlcyA9IDYsIHRyYW5zbWlzc2lvblNhbXBsZXIgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7XG4gICAgICAgICAgICBjaHJvbWF0aWNBYmVycmF0aW9uOiB7IHZhbHVlOiAwLjA1IH0sXG4gICAgICAgICAgICAvLyBUcmFuc21pc3Npb24gbXVzdCBhbHdheXMgYmUgMCwgdW5sZXNzIHRyYW5zbWlzc2lvblNhbXBsZXIgaXMgYmVpbmcgdXNlZFxuICAgICAgICAgICAgdHJhbnNtaXNzaW9uOiB7IHZhbHVlOiAwIH0sXG4gICAgICAgICAgICAvLyBJbnN0ZWFkIGEgd29ya2Fyb3VuZCBpcyB1c2VkLCBzZWUgYmVsb3cgZm9yIHJlYXNvbnMgd2h5XG4gICAgICAgICAgICBfdHJhbnNtaXNzaW9uOiB7IHZhbHVlOiAxIH0sXG4gICAgICAgICAgICB0cmFuc21pc3Npb25NYXA6IHsgdmFsdWU6IG51bGwgfSxcbiAgICAgICAgICAgIC8vIFJvdWdobmVzcyBpcyAxIGluIFRIUkVFLk1lc2hQaHlzaWNhbE1hdGVyaWFsIGJ1dCBpdCBtYWtlcyBsaXR0bGUgc2Vuc2UgaW4gYSB0cmFuc21pc3Npb24gbWF0ZXJpYWxcbiAgICAgICAgICAgIHJvdWdobmVzczogeyB2YWx1ZTogMCB9LFxuICAgICAgICAgICAgdGhpY2tuZXNzOiB7IHZhbHVlOiAwIH0sXG4gICAgICAgICAgICB0aGlja25lc3NNYXA6IHsgdmFsdWU6IG51bGwgfSxcbiAgICAgICAgICAgIGF0dGVudWF0aW9uRGlzdGFuY2U6IHsgdmFsdWU6IEluZmluaXR5IH0sXG4gICAgICAgICAgICBhdHRlbnVhdGlvbkNvbG9yOiB7IHZhbHVlOiBuZXcgVEhSRUUuQ29sb3IoJ3doaXRlJykgfSxcbiAgICAgICAgICAgIGFuaXNvdHJvcHk6IHsgdmFsdWU6IDAuMSB9LFxuICAgICAgICAgICAgdGltZTogeyB2YWx1ZTogMCB9LFxuICAgICAgICAgICAgZGlzdG9ydGlvbjogeyB2YWx1ZTogMC4wIH0sXG4gICAgICAgICAgICBkaXN0b3J0aW9uU2NhbGU6IHsgdmFsdWU6IDAuNSB9LFxuICAgICAgICAgICAgdGVtcG9yYWxEaXN0b3J0aW9uOiB7IHZhbHVlOiAwLjAgfSxcbiAgICAgICAgICAgIGJ1ZmZlcjogeyB2YWx1ZTogbnVsbCB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMub25CZWZvcmVDb21waWxlID0gKHNoYWRlcjogVEhSRUUuU2hhZGVyICYgeyBkZWZpbmVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0pID0+IHtcbiAgICAgICAgICAgIHNoYWRlci51bmlmb3JtcyA9IHtcbiAgICAgICAgICAgICAgICAuLi5zaGFkZXIudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgLi4udGhpcy51bmlmb3JtcyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSB0cmFuc21pc3Npb24gc2FtcGxlciBpcyBhY3RpdmUgaW5qZWN0IGEgZmxhZ1xuICAgICAgICAgICAgaWYgKHRyYW5zbWlzc2lvblNhbXBsZXIpIHNoYWRlci5kZWZpbmVzWydVU0VfU0FNUExFUiddID0gJyc7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgZG8gdXNlIHVzZSAudHJhbnNtaXNzaW9uIGFuZCBtdXN0IHRoZXJlZm9yZSBmb3JjZSBVU0VfVFJBTlNNSVNTSU9OXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRocmVlanMgd29uJ3QgaW5qZWN0IGl0IGZvciB1c1xuICAgICAgICAgICAgZWxzZSBzaGFkZXIuZGVmaW5lc1snVVNFX1RSQU5TTUlTU0lPTiddID0gJyc7XG5cbiAgICAgICAgICAgIC8vIEhlYWRcbiAgICAgICAgICAgIHNoYWRlci5mcmFnbWVudFNoYWRlciA9XG4gICAgICAgICAgICAgICAgLypnbHNsKi8gYFxuICAgICAgdW5pZm9ybSBmbG9hdCBjaHJvbWF0aWNBYmVycmF0aW9uO1xuICAgICAgdW5pZm9ybSBmbG9hdCBhbmlzb3Ryb3B5O1xuICAgICAgdW5pZm9ybSBmbG9hdCB0aW1lO1xuICAgICAgdW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uO1xuICAgICAgdW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uU2NhbGU7XG4gICAgICB1bmlmb3JtIGZsb2F0IHRlbXBvcmFsRGlzdG9ydGlvbjtcbiAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIGJ1ZmZlcjtcblxuICAgICAgdmVjMyByYW5kb20zKHZlYzMgYykge1xuICAgICAgICBmbG9hdCBqID0gNDA5Ni4wKnNpbihkb3QoYyx2ZWMzKDE3LjAsIDU5LjQsIDE1LjApKSk7XG4gICAgICAgIHZlYzMgcjtcbiAgICAgICAgci56ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIGogKj0gLjEyNTtcbiAgICAgICAgci54ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIGogKj0gLjEyNTtcbiAgICAgICAgci55ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIHJldHVybiByLTAuNTtcbiAgICAgIH1cblxuICAgICAgZmxvYXQgc2VlZCA9IDAuMDtcbiAgICAgIHVpbnQgaGFzaCggdWludCB4ICkge1xuICAgICAgICB4ICs9ICggeCA8PCAxMHUgKTtcbiAgICAgICAgeCBePSAoIHggPj4gIDZ1ICk7XG4gICAgICAgIHggKz0gKCB4IDw8ICAzdSApO1xuICAgICAgICB4IF49ICggeCA+PiAxMXUgKTtcbiAgICAgICAgeCArPSAoIHggPDwgMTV1ICk7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wb3VuZCB2ZXJzaW9ucyBvZiB0aGUgaGFzaGluZyBhbGdvcml0aG0gSSB3aGlwcGVkIHRvZ2V0aGVyLlxuICAgICAgdWludCBoYXNoKCB1dmVjMiB2ICkgeyByZXR1cm4gaGFzaCggdi54IF4gaGFzaCh2LnkpICAgICAgICAgICAgICAgICAgICAgICAgICk7IH1cbiAgICAgIHVpbnQgaGFzaCggdXZlYzMgdiApIHsgcmV0dXJuIGhhc2goIHYueCBeIGhhc2godi55KSBeIGhhc2godi56KSAgICAgICAgICAgICApOyB9XG4gICAgICB1aW50IGhhc2goIHV2ZWM0IHYgKSB7IHJldHVybiBoYXNoKCB2LnggXiBoYXNoKHYueSkgXiBoYXNoKHYueikgXiBoYXNoKHYudykgKTsgfVxuXG4gICAgICAvLyBDb25zdHJ1Y3QgYSBmbG9hdCB3aXRoIGhhbGYtb3BlbiByYW5nZSBbMDoxXSB1c2luZyBsb3cgMjMgYml0cy5cbiAgICAgIC8vIEFsbCB6ZXJvZXMgeWllbGRzIDAuMCwgYWxsIG9uZXMgeWllbGRzIHRoZSBuZXh0IHNtYWxsZXN0IHJlcHJlc2VudGFibGUgdmFsdWUgYmVsb3cgMS4wLlxuICAgICAgZmxvYXQgZmxvYXRDb25zdHJ1Y3QoIHVpbnQgbSApIHtcbiAgICAgICAgY29uc3QgdWludCBpZWVlTWFudGlzc2EgPSAweDAwN0ZGRkZGdTsgLy8gYmluYXJ5MzIgbWFudGlzc2EgYml0bWFza1xuICAgICAgICBjb25zdCB1aW50IGllZWVPbmUgICAgICA9IDB4M0Y4MDAwMDB1OyAvLyAxLjAgaW4gSUVFRSBiaW5hcnkzMlxuICAgICAgICBtICY9IGllZWVNYW50aXNzYTsgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIG9ubHkgbWFudGlzc2EgYml0cyAoZnJhY3Rpb25hbCBwYXJ0KVxuICAgICAgICBtIHw9IGllZWVPbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgZnJhY3Rpb25hbCBwYXJ0IHRvIDEuMFxuICAgICAgICBmbG9hdCAgZiA9IHVpbnRCaXRzVG9GbG9hdCggbSApOyAgICAgICAvLyBSYW5nZSBbMToyXVxuICAgICAgICByZXR1cm4gZiAtIDEuMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYW5nZSBbMDoxXVxuICAgICAgfVxuXG4gICAgICAvLyBQc2V1ZG8tcmFuZG9tIHZhbHVlIGluIGhhbGYtb3BlbiByYW5nZSBbMDoxXS5cbiAgICAgIGZsb2F0IHJhbmRvbSggZmxvYXQgeCApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHgpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjMiAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjMyAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjNCAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cblxuICAgICAgZmxvYXQgcmFuZCgpIHtcbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gcmFuZG9tKHZlYzMoZ2xfRnJhZ0Nvb3JkLnh5LCBzZWVkKSk7XG4gICAgICAgIHNlZWQgKz0gMS4wO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmbG9hdCBGMyA9ICAwLjMzMzMzMzM7XG4gICAgICBjb25zdCBmbG9hdCBHMyA9ICAwLjE2NjY2Njc7XG5cbiAgICAgIGZsb2F0IHNub2lzZSh2ZWMzIHApIHtcbiAgICAgICAgdmVjMyBzID0gZmxvb3IocCArIGRvdChwLCB2ZWMzKEYzKSkpO1xuICAgICAgICB2ZWMzIHggPSBwIC0gcyArIGRvdChzLCB2ZWMzKEczKSk7XG4gICAgICAgIHZlYzMgZSA9IHN0ZXAodmVjMygwLjApLCB4IC0geC55engpO1xuICAgICAgICB2ZWMzIGkxID0gZSooMS4wIC0gZS56eHkpO1xuICAgICAgICB2ZWMzIGkyID0gMS4wIC0gZS56eHkqKDEuMCAtIGUpO1xuICAgICAgICB2ZWMzIHgxID0geCAtIGkxICsgRzM7XG4gICAgICAgIHZlYzMgeDIgPSB4IC0gaTIgKyAyLjAqRzM7XG4gICAgICAgIHZlYzMgeDMgPSB4IC0gMS4wICsgMy4wKkczO1xuICAgICAgICB2ZWM0IHcsIGQ7XG4gICAgICAgIHcueCA9IGRvdCh4LCB4KTtcbiAgICAgICAgdy55ID0gZG90KHgxLCB4MSk7XG4gICAgICAgIHcueiA9IGRvdCh4MiwgeDIpO1xuICAgICAgICB3LncgPSBkb3QoeDMsIHgzKTtcbiAgICAgICAgdyA9IG1heCgwLjYgLSB3LCAwLjApO1xuICAgICAgICBkLnggPSBkb3QocmFuZG9tMyhzKSwgeCk7XG4gICAgICAgIGQueSA9IGRvdChyYW5kb20zKHMgKyBpMSksIHgxKTtcbiAgICAgICAgZC56ID0gZG90KHJhbmRvbTMocyArIGkyKSwgeDIpO1xuICAgICAgICBkLncgPSBkb3QocmFuZG9tMyhzICsgMS4wKSwgeDMpO1xuICAgICAgICB3ICo9IHc7XG4gICAgICAgIHcgKj0gdztcbiAgICAgICAgZCAqPSB3O1xuICAgICAgICByZXR1cm4gZG90KGQsIHZlYzQoNTIuMCkpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBzbm9pc2VGcmFjdGFsKHZlYzMgbSkge1xuICAgICAgICByZXR1cm4gMC41MzMzMzMzKiBzbm9pc2UobSlcbiAgICAgICAgICAgICAgKzAuMjY2NjY2Nyogc25vaXNlKDIuMCptKVxuICAgICAgICAgICAgICArMC4xMzMzMzMzKiBzbm9pc2UoNC4wKm0pXG4gICAgICAgICAgICAgICswLjA2NjY2NjcqIHNub2lzZSg4LjAqbSk7XG4gICAgICB9XFxuYCArIHNoYWRlci5mcmFnbWVudFNoYWRlcjtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYW5zbWlzc2lvblxuICAgICAgICAgICAgc2hhZGVyLmZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgJyNpbmNsdWRlIDx0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudD4nLFxuICAgICAgICAgICAgICAgIC8qZ2xzbCovIGBcbiAgICAgICAgI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cbiAgICAgICAgICAvLyBUcmFuc21pc3Npb24gY29kZSBpcyBiYXNlZCBvbiBnbFRGLVNhbXBsZXItVmlld2VyXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGLVNhbXBsZS1WaWV3ZXJcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IF90cmFuc21pc3Npb247XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCB0aGlja25lc3M7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuICAgICAgICAgIHVuaWZvcm0gdmVjMyBhdHRlbnVhdGlvbkNvbG9yO1xuICAgICAgICAgICNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXG4gICAgICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7XG4gICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgI2lmZGVmIFVTRV9USElDS05FU1NNQVBcbiAgICAgICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHRoaWNrbmVzc01hcDtcbiAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICB1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7XG4gICAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNtaXNzaW9uU2FtcGxlck1hcDtcbiAgICAgICAgICB1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7XG4gICAgICAgICAgdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XG4gICAgICAgICAgdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBjb25zdCBpbiB2ZWMzIG4sIGNvbnN0IGluIHZlYzMgdiwgY29uc3QgaW4gZmxvYXQgdGhpY2tuZXNzLCBjb25zdCBpbiBmbG9hdCBpb3IsIGNvbnN0IGluIG1hdDQgbW9kZWxNYXRyaXggKSB7XG4gICAgICAgICAgICAvLyBEaXJlY3Rpb24gb2YgcmVmcmFjdGVkIGxpZ2h0LlxuICAgICAgICAgICAgdmVjMyByZWZyYWN0aW9uVmVjdG9yID0gcmVmcmFjdCggLSB2LCBub3JtYWxpemUoIG4gKSwgMS4wIC8gaW9yICk7XG4gICAgICAgICAgICAvLyBDb21wdXRlIHJvdGF0aW9uLWluZGVwZW5kYW50IHNjYWxpbmcgb2YgdGhlIG1vZGVsIG1hdHJpeC5cbiAgICAgICAgICAgIHZlYzMgbW9kZWxTY2FsZTtcbiAgICAgICAgICAgIG1vZGVsU2NhbGUueCA9IGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54eXogKSApO1xuICAgICAgICAgICAgbW9kZWxTY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7XG4gICAgICAgICAgICBtb2RlbFNjYWxlLnogPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAyIF0ueHl6ICkgKTtcbiAgICAgICAgICAgIC8vIFRoZSB0aGlja25lc3MgaXMgc3BlY2lmaWVkIGluIGxvY2FsIHNwYWNlLlxuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmxvYXQgYXBwbHlJb3JUb1JvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBpb3IgKSB7XG4gICAgICAgICAgICAvLyBTY2FsZSByb3VnaG5lc3Mgd2l0aCBJT1Igc28gdGhhdCBhbiBJT1Igb2YgMS4wIHJlc3VsdHMgaW4gbm8gbWljcm9mYWNldCByZWZyYWN0aW9uIGFuZFxuICAgICAgICAgICAgLy8gYW4gSU9SIG9mIDEuNSByZXN1bHRzIGluIHRoZSBkZWZhdWx0IGFtb3VudCBvZiBtaWNyb2ZhY2V0IHJlZnJhY3Rpb24uXG4gICAgICAgICAgICByZXR1cm4gcm91Z2huZXNzICogY2xhbXAoIGlvciAqIDIuMCAtIDIuMCwgMC4wLCAxLjAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmVjNCBnZXRUcmFuc21pc3Npb25TYW1wbGUoIGNvbnN0IGluIHZlYzIgZnJhZ0Nvb3JkLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHtcbiAgICAgICAgICAgIGZsb2F0IGZyYW1lYnVmZmVyTG9kID0gbG9nMiggdHJhbnNtaXNzaW9uU2FtcGxlclNpemUueCApICogYXBwbHlJb3JUb1JvdWdobmVzcyggcm91Z2huZXNzLCBpb3IgKTtcbiAgICAgICAgICAgICNpZmRlZiBVU0VfU0FNUExFUlxuICAgICAgICAgICAgICAjaWZkZWYgdGV4dHVyZTJETG9kRVhUXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHR1cmUyRExvZEVYVCh0cmFuc21pc3Npb25TYW1wbGVyTWFwLCBmcmFnQ29vcmQueHksIGZyYW1lYnVmZmVyTG9kKTtcbiAgICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dHVyZTJEKHRyYW5zbWlzc2lvblNhbXBsZXJNYXAsIGZyYWdDb29yZC54eSwgZnJhbWVidWZmZXJMb2QpO1xuICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNlbHNlXG4gICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlMkQoYnVmZmVyLCBmcmFnQ29vcmQueHkpO1xuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgfVxuICAgICAgICAgIHZlYzMgYXBwbHlWb2x1bWVBdHRlbnVhdGlvbiggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gZmxvYXQgdHJhbnNtaXNzaW9uRGlzdGFuY2UsIGNvbnN0IGluIHZlYzMgYXR0ZW51YXRpb25Db2xvciwgY29uc3QgaW4gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSApIHtcbiAgICAgICAgICAgIGlmICggaXNpbmYoIGF0dGVudWF0aW9uRGlzdGFuY2UgKSApIHtcbiAgICAgICAgICAgICAgLy8gQXR0ZW51YXRpb24gZGlzdGFuY2UgaXMgK+KIniwgaS5lLiB0aGUgdHJhbnNtaXR0ZWQgY29sb3IgaXMgbm90IGF0dGVudWF0ZWQgYXQgYWxsLlxuICAgICAgICAgICAgICByZXR1cm4gcmFkaWFuY2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDb21wdXRlIGxpZ2h0IGF0dGVudWF0aW9uIHVzaW5nIEJlZXIncyBsYXcuXG4gICAgICAgICAgICAgIHZlYzMgYXR0ZW51YXRpb25Db2VmZmljaWVudCA9IC1sb2coIGF0dGVudWF0aW9uQ29sb3IgKSAvIGF0dGVudWF0aW9uRGlzdGFuY2U7XG4gICAgICAgICAgICAgIHZlYzMgdHJhbnNtaXR0YW5jZSA9IGV4cCggLSBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ICogdHJhbnNtaXNzaW9uRGlzdGFuY2UgKTsgLy8gQmVlcidzIGxhd1xuICAgICAgICAgICAgICByZXR1cm4gdHJhbnNtaXR0YW5jZSAqIHJhZGlhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2ZWM0IGdldElCTFZvbHVtZVJlZnJhY3Rpb24oIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yLFxuICAgICAgICAgICAgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gdmVjMyBwb3NpdGlvbiwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCxcbiAgICAgICAgICAgIGNvbnN0IGluIG1hdDQgdmlld01hdHJpeCwgY29uc3QgaW4gbWF0NCBwcm9qTWF0cml4LCBjb25zdCBpbiBmbG9hdCBpb3IsIGNvbnN0IGluIGZsb2F0IHRoaWNrbmVzcyxcbiAgICAgICAgICAgIGNvbnN0IGluIHZlYzMgYXR0ZW51YXRpb25Db2xvciwgY29uc3QgaW4gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSApIHtcbiAgICAgICAgICAgIHZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggKTtcbiAgICAgICAgICAgIHZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5O1xuICAgICAgICAgICAgLy8gUHJvamVjdCByZWZyYWN0ZWQgdmVjdG9yIG9uIHRoZSBmcmFtZWJ1ZmZlciwgd2hpbGUgbWFwcGluZyB0byBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIHZlYzQgbmRjUG9zID0gcHJvak1hdHJpeCAqIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZyYWN0ZWRSYXlFeGl0LCAxLjAgKTtcbiAgICAgICAgICAgIHZlYzIgcmVmcmFjdGlvbkNvb3JkcyA9IG5kY1Bvcy54eSAvIG5kY1Bvcy53O1xuICAgICAgICAgICAgcmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7XG4gICAgICAgICAgICByZWZyYWN0aW9uQ29vcmRzIC89IDIuMDtcbiAgICAgICAgICAgIC8vIFNhbXBsZSBmcmFtZWJ1ZmZlciB0byBnZXQgcGl4ZWwgdGhlIHJlZnJhY3RlZCByYXkgaGl0cy5cbiAgICAgICAgICAgIHZlYzQgdHJhbnNtaXR0ZWRMaWdodCA9IGdldFRyYW5zbWlzc2lvblNhbXBsZSggcmVmcmFjdGlvbkNvb3Jkcywgcm91Z2huZXNzLCBpb3IgKTtcbiAgICAgICAgICAgIHZlYzMgYXR0ZW51YXRlZENvbG9yID0gYXBwbHlWb2x1bWVBdHRlbnVhdGlvbiggdHJhbnNtaXR0ZWRMaWdodC5yZ2IsIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKTtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgc3BlY3VsYXIgY29tcG9uZW50LlxuICAgICAgICAgICAgdmVjMyBGID0gRW52aXJvbm1lbnRCUkRGKCBuLCB2LCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzICk7XG4gICAgICAgICAgICByZXR1cm4gdmVjNCggKCAxLjAgLSBGICkgKiBhdHRlbnVhdGVkQ29sb3IgKiBkaWZmdXNlQ29sb3IsIHRyYW5zbWl0dGVkTGlnaHQuYSApO1xuICAgICAgICAgIH1cbiAgICAgICAgI2VuZGlmXFxuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWRkIHJlZnJhY3Rpb25cbiAgICAgICAgICAgIHNoYWRlci5mcmFnbWVudFNoYWRlciA9IHNoYWRlci5mcmFnbWVudFNoYWRlci5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICcjaW5jbHVkZSA8dHJhbnNtaXNzaW9uX2ZyYWdtZW50PicsXG4gICAgICAgICAgICAgICAgLypnbHNsKi8gYFxuICAgICAgICAvLyBJbXByb3ZlIHRoZSByZWZyYWN0aW9uIHRvIHVzZSB0aGUgd29ybGQgcG9zXG4gICAgICAgIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA9IF90cmFuc21pc3Npb247XG4gICAgICAgIG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhID0gMS4wO1xuICAgICAgICBtYXRlcmlhbC50aGlja25lc3MgPSB0aGlja25lc3M7XG4gICAgICAgIG1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuICAgICAgICBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yID0gYXR0ZW51YXRpb25Db2xvcjtcbiAgICAgICAgI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcbiAgICAgICAgICBtYXRlcmlhbC50cmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZVdiApLnI7XG4gICAgICAgICNlbmRpZlxuICAgICAgICAjaWZkZWYgVVNFX1RISUNLTkVTU01BUFxuICAgICAgICAgIG1hdGVyaWFsLnRoaWNrbmVzcyAqPSB0ZXh0dXJlMkQoIHRoaWNrbmVzc01hcCwgdlV2ICkuZztcbiAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgdmVjMyBwb3MgPSB2V29ybGRQb3NpdGlvbjtcbiAgICAgICAgdmVjMyB2ID0gbm9ybWFsaXplKCBjYW1lcmFQb3NpdGlvbiAtIHBvcyApO1xuICAgICAgICB2ZWMzIG4gPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcbiAgICAgICAgdmVjMyB0cmFuc21pc3Npb24gPSB2ZWMzKDAuMCk7XG4gICAgICAgIGZsb2F0IHRyYW5zbWlzc2lvblIsIHRyYW5zbWlzc2lvbkIsIHRyYW5zbWlzc2lvbkc7XG4gICAgICAgIGZsb2F0IHJhbmRvbUNvb3JkcyA9IHJhbmQoKTtcbiAgICAgICAgZmxvYXQgdGhpY2tuZXNzX3NtZWFyID0gdGhpY2tuZXNzICogbWF4KHBvdyhyb3VnaG5lc3NGYWN0b3IsIDAuMzMpLCBhbmlzb3Ryb3B5KTtcbiAgICAgICAgdmVjMyBkaXN0b3J0aW9uTm9ybWFsID0gdmVjMygwLjApO1xuICAgICAgICB2ZWMzIHRlbXBvcmFsT2Zmc2V0ID0gdmVjMyh0aW1lLCAtdGltZSwgLXRpbWUpICogdGVtcG9yYWxEaXN0b3J0aW9uO1xuICAgICAgICBpZiAoZGlzdG9ydGlvbiA+IDAuMCkge1xuICAgICAgICAgIGRpc3RvcnRpb25Ob3JtYWwgPSBkaXN0b3J0aW9uICogdmVjMyhzbm9pc2VGcmFjdGFsKHZlYzMoKHBvcyAqIGRpc3RvcnRpb25TY2FsZSArIHRlbXBvcmFsT2Zmc2V0KSkpLCBzbm9pc2VGcmFjdGFsKHZlYzMocG9zLnp4eSAqIGRpc3RvcnRpb25TY2FsZSAtIHRlbXBvcmFsT2Zmc2V0KSksIHNub2lzZUZyYWN0YWwodmVjMyhwb3MueXh6ICogZGlzdG9ydGlvblNjYWxlICsgdGVtcG9yYWxPZmZzZXQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChmbG9hdCBpID0gMC4wOyBpIDwgJHtzYW1wbGVzfS4wOyBpICsrKSB7XG4gICAgICAgICAgdmVjMyBzYW1wbGVOb3JtID0gbm9ybWFsaXplKG4gKyByb3VnaG5lc3NGYWN0b3IgKiByb3VnaG5lc3NGYWN0b3IgKiAyLjAgKiBub3JtYWxpemUodmVjMyhyYW5kKCkgLSAwLjUsIHJhbmQoKSAtIDAuNSwgcmFuZCgpIC0gMC41KSkgKiBwb3cocmFuZCgpLCAwLjMzKSArIGRpc3RvcnRpb25Ob3JtYWwpO1xuICAgICAgICAgIHRyYW5zbWlzc2lvblIgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuICAgICAgICAgICAgc2FtcGxlTm9ybSwgdiwgbWF0ZXJpYWwucm91Z2huZXNzLCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLFxuICAgICAgICAgICAgcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuaW9yLCBtYXRlcmlhbC50aGlja25lc3MgICsgdGhpY2tuZXNzX3NtZWFyICogKGkgKyByYW5kb21Db29yZHMpIC8gZmxvYXQoJHtzYW1wbGVzfSksXG4gICAgICAgICAgICBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLCBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlXG4gICAgICAgICAgKS5yO1xuICAgICAgICAgIHRyYW5zbWlzc2lvbkcgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuICAgICAgICAgICAgc2FtcGxlTm9ybSwgdiwgbWF0ZXJpYWwucm91Z2huZXNzLCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLFxuICAgICAgICAgICAgcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuaW9yICAqICgxLjAgKyBjaHJvbWF0aWNBYmVycmF0aW9uICogKGkgKyByYW5kb21Db29yZHMpIC8gZmxvYXQoJHtzYW1wbGVzfSkpICwgbWF0ZXJpYWwudGhpY2tuZXNzICsgdGhpY2tuZXNzX3NtZWFyICogKGkgKyByYW5kb21Db29yZHMpIC8gZmxvYXQoJHtzYW1wbGVzfSksXG4gICAgICAgICAgICBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLCBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlXG4gICAgICAgICAgKS5nO1xuICAgICAgICAgIHRyYW5zbWlzc2lvbkIgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuICAgICAgICAgICAgc2FtcGxlTm9ybSwgdiwgbWF0ZXJpYWwucm91Z2huZXNzLCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLFxuICAgICAgICAgICAgcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuaW9yICogKDEuMCArIDIuMCAqIGNocm9tYXRpY0FiZXJyYXRpb24gKiAoaSArIHJhbmRvbUNvb3JkcykgLyBmbG9hdCgke3NhbXBsZXN9KSksIG1hdGVyaWFsLnRoaWNrbmVzcyArIHRoaWNrbmVzc19zbWVhciAqIChpICsgcmFuZG9tQ29vcmRzKSAvIGZsb2F0KCR7c2FtcGxlc30pLFxuICAgICAgICAgICAgbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZVxuICAgICAgICAgICkuYjtcbiAgICAgICAgICB0cmFuc21pc3Npb24uciArPSB0cmFuc21pc3Npb25SO1xuICAgICAgICAgIHRyYW5zbWlzc2lvbi5nICs9IHRyYW5zbWlzc2lvbkc7XG4gICAgICAgICAgdHJhbnNtaXNzaW9uLmIgKz0gdHJhbnNtaXNzaW9uQjtcbiAgICAgICAgfVxuICAgICAgICB0cmFuc21pc3Npb24gLz0gJHtzYW1wbGVzfS4wO1xuICAgICAgICB0b3RhbERpZmZ1c2UgPSBtaXgoIHRvdGFsRGlmZnVzZSwgdHJhbnNtaXNzaW9uLnJnYiwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uICk7XFxuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnVuaWZvcm1zKS5mb3JFYWNoKChuYW1lKSA9PlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+ICh0aGlzLnVuaWZvcm1zIGFzIE5ndEFueVJlY29yZClbbmFtZV0udmFsdWUsXG4gICAgICAgICAgICAgICAgc2V0OiAodikgPT4gKCh0aGlzLnVuaWZvcm1zIGFzIE5ndEFueVJlY29yZClbbmFtZV0udmFsdWUgPSB2KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
|
|
@@ -2,6 +2,7 @@ export { NgtsAccumulativeShadows } from './lib/accumulative-shadows/accumulative
|
|
|
2
2
|
export { NgtsRandomizedLights } from './lib/accumulative-shadows/randomized-lights';
|
|
3
3
|
export * from './lib/bounds/bounds';
|
|
4
4
|
export * from './lib/camera-shake/camera-shake';
|
|
5
|
+
export * from './lib/caustics/caustics';
|
|
5
6
|
export * from './lib/center/center';
|
|
6
7
|
export * from './lib/cloud/cloud';
|
|
7
8
|
export * from './lib/contact-shadows/contact-shadows';
|
|
@@ -14,4 +15,4 @@ export * from './lib/spot-light/spot-light';
|
|
|
14
15
|
export * from './lib/spot-light/spot-light-shadow';
|
|
15
16
|
export * from './lib/stage/stage';
|
|
16
17
|
export * from './lib/stars/stars';
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBOZ3RzQWNjdW11bGF0aXZlU2hhZG93cyB9IGZyb20gJy4vbGliL2FjY3VtdWxhdGl2ZS1zaGFkb3dzL2FjY3VtdWxhdGl2ZS1zaGFkb3dzJztcbmV4cG9ydCB7IE5ndHNSYW5kb21pemVkTGlnaHRzIH0gZnJvbSAnLi9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvcmFuZG9taXplZC1saWdodHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYm91bmRzL2JvdW5kcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jYW1lcmEtc2hha2UvY2FtZXJhLXNoYWtlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NhdXN0aWNzL2NhdXN0aWNzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NlbnRlci9jZW50ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2xvdWQvY2xvdWQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udGFjdC1zaGFkb3dzL2NvbnRhY3Qtc2hhZG93cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9lbnZpcm9ubWVudC9hc3NldHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZW52aXJvbm1lbnQvZW52aXJvbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmxvYXQvZmxvYXQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2t5L3NreSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zcGFya2xlcy9zcGFya2xlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zcG90LWxpZ2h0L3Nwb3QtbGlnaHQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc3BvdC1saWdodC9zcG90LWxpZ2h0LXNoYWRvdyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zdGFnZS9zdGFnZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zdGFycy9zdGFycyc7XG4iXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DiscardMaterial } from 'angular-three-soba/shaders';
|
|
2
2
|
import * as THREE from 'three';
|
|
3
3
|
function isLight(object) {
|
|
4
4
|
return object.isLight;
|
|
@@ -6,7 +6,6 @@ function isLight(object) {
|
|
|
6
6
|
function isGeometry(object) {
|
|
7
7
|
return !!object.geometry;
|
|
8
8
|
}
|
|
9
|
-
const DiscardMaterial = shaderMaterial({}, 'void main() { gl_Position = vec4((uv - 0.5) * 2.0, 1.0, 1.0); }', 'void main() { discard; }');
|
|
10
9
|
export class ProgressiveLightMap {
|
|
11
10
|
constructor(renderer, scene, res = 1024) {
|
|
12
11
|
this.renderer = renderer;
|
|
@@ -106,4 +105,4 @@ export class ProgressiveLightMap {
|
|
|
106
105
|
this.scene.background = oldBg;
|
|
107
106
|
}
|
|
108
107
|
}
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3NpdmUtbGlnaHQtbWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvc3RhZ2luZy9zcmMvbGliL2FjY3VtdWxhdGl2ZS1zaGFkb3dzL3Byb2dyZXNzaXZlLWxpZ2h0LW1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsU0FBUyxPQUFPLENBQUMsTUFBVztJQUN4QixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE1BQVc7SUFDM0IsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUNsQyxFQUFFLEVBQ0YsaUVBQWlFLEVBQ2pFLDBCQUEwQixDQUM3QixDQUFDO0FBRUYsTUFBTSxPQUFPLG1CQUFtQjtJQWlCNUIsWUFBWSxRQUE2QixFQUFFLEtBQWtCLEVBQUUsTUFBYyxJQUFJO1FBQzdFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFH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R0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2hhZGVyTWF0ZXJpYWwgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvc2hhZGVycyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5cbmZ1bmN0aW9uIGlzTGlnaHQob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgVEhSRUUuTGlnaHQge1xuICAgIHJldHVybiBvYmplY3QuaXNMaWdodDtcbn1cblxuZnVuY3Rpb24gaXNHZW9tZXRyeShvYmplY3Q6IGFueSk6IG9iamVjdCBpcyBUSFJFRS5NZXNoIHtcbiAgICByZXR1cm4gISFvYmplY3QuZ2VvbWV0cnk7XG59XG5cbmNvbnN0IERpc2NhcmRNYXRlcmlhbCA9IHNoYWRlck1hdGVyaWFsKFxuICAgIHt9LFxuICAgICd2b2lkIG1haW4oKSB7IGdsX1Bvc2l0aW9uID0gdmVjNCgodXYgLSAwLjUpICogMi4wLCAxLjAsIDEuMCk7IH0nLFxuICAgICd2b2lkIG1haW4oKSB7IGRpc2NhcmQ7IH0nXG4pO1xuXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NpdmVMaWdodE1hcCB7XG4gICAgcmVuZGVyZXI6IFRIUkVFLldlYkdMUmVuZGVyZXI7XG4gICAgcmVzOiBudW1iZXI7XG4gICAgc2NlbmU6IFRIUkVFLlNjZW5lO1xuICAgIG9iamVjdDogVEhSRUUuTWVzaCB8IG51bGw7XG4gICAgYnVmZmVyMUFjdGl2ZTogYm9vbGVhbjtcbiAgICBwcm9ncmVzc2l2ZUxpZ2h0TWFwMTogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XG4gICAgcHJvZ3Jlc3NpdmVMaWdodE1hcDI6IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0O1xuICAgIGRpc2NhcmRNYXQ6IFRIUkVFLlNoYWRlck1hdGVyaWFsO1xuICAgIHRhcmdldE1hdDogVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbDtcbiAgICBwcmV2aW91c1NoYWRvd01hcDogeyB2YWx1ZTogVEhSRUUuVGV4dHVyZSB9O1xuICAgIGF2ZXJhZ2luZ1dpbmRvdzogeyB2YWx1ZTogbnVtYmVyIH07XG4gICAgY2xlYXJDb2xvcjogVEhSRUUuQ29sb3I7XG4gICAgY2xlYXJBbHBoYTogbnVtYmVyO1xuICAgIGxpZ2h0czogeyBvYmplY3Q6IFRIUkVFLkxpZ2h0OyBpbnRlbnNpdHk6IG51bWJlciB9W107XG4gICAgbWVzaGVzOiB7IG9iamVjdDogVEhSRUUuTWVzaDsgbWF0ZXJpYWw6IFRIUkVFLk1hdGVyaWFsIHwgVEhSRUUuTWF0ZXJpYWxbXSB9W107XG5cbiAgICBjb25zdHJ1Y3RvcihyZW5kZXJlcjogVEhSRUUuV2ViR0xSZW5kZXJlciwgc2NlbmU6IFRIUkVFLlNjZW5lLCByZXM6IG51bWJlciA9IDEwMjQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnJlcyA9IHJlcztcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgICB0aGlzLmJ1ZmZlcjFBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5saWdodHMgPSBbXTtcbiAgICAgICAgdGhpcy5tZXNoZXMgPSBbXTtcbiAgICAgICAgdGhpcy5vYmplY3QgPSBudWxsO1xuICAgICAgICB0aGlzLmNsZWFyQ29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoKTtcbiAgICAgICAgdGhpcy5jbGVhckFscGhhID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIFByb2dyZXNzaXZlIExpZ2h0TWFwIFRleHR1cmVcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gLyhBbmRyb2lkfGlQYWR8aVBob25lfGlQb2QpL2cudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/IFRIUkVFLkhhbGZGbG9hdFR5cGUgOiBUSFJFRS5GbG9hdFR5cGU7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NpdmVMaWdodE1hcDEgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQodGhpcy5yZXMsIHRoaXMucmVzLCB7XG4gICAgICAgICAgICB0eXBlOiBmb3JtYXQsXG4gICAgICAgICAgICBlbmNvZGluZzogcmVuZGVyZXIub3V0cHV0RW5jb2RpbmcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KHRoaXMucmVzLCB0aGlzLnJlcywge1xuICAgICAgICAgICAgdHlwZTogZm9ybWF0LFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHJlbmRlcmVyLm91dHB1dEVuY29kaW5nLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJbmplY3Qgc29tZSBzcGljeSBuZXcgbG9naWMgaW50byBhIHN0YW5kYXJkIHBob25nIG1hdGVyaWFsXG4gICAgICAgIHRoaXMuZGlzY2FyZE1hdCA9IG5ldyBEaXNjYXJkTWF0ZXJpYWwoKTtcbiAgICAgICAgdGhpcy50YXJnZXRNYXQgPSBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7IGZvZzogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTaGFkb3dNYXAgPSB7IHZhbHVlOiB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAxLnRleHR1cmUgfTtcbiAgICAgICAgdGhpcy5hdmVyYWdpbmdXaW5kb3cgPSB7IHZhbHVlOiAxMDAgfTtcbiAgICAgICAgdGhpcy50YXJnZXRNYXQub25CZWZvcmVDb21waWxlID0gKHNoYWRlcikgPT4ge1xuICAgICAgICAgICAgLy8gVmVydGV4IFNoYWRlcjogU2V0IFZlcnRleCBQb3NpdGlvbnMgdG8gdGhlIFVud3JhcHBlZCBVViBQb3NpdGlvbnNcbiAgICAgICAgICAgIHNoYWRlci52ZXJ0ZXhTaGFkZXIgPVxuICAgICAgICAgICAgICAgICd2YXJ5aW5nIHZlYzIgdlV2O1xcbicgK1xuICAgICAgICAgICAgICAgIHNoYWRlci52ZXJ0ZXhTaGFkZXIuc2xpY2UoMCwgLTEpICtcbiAgICAgICAgICAgICAgICAndlV2ID0gdXY7IGdsX1Bvc2l0aW9uID0gdmVjNCgodXYgLSAwLjUpICogMi4wLCAxLjAsIDEuMCk7IH0nO1xuXG4gICAgICAgICAgICAvLyBGcmFnbWVudCBTaGFkZXI6IFNldCBQaXhlbHMgdG8gYXZlcmFnZSBpbiB0aGUgUHJldmlvdXMgZnJhbWUncyBTaGFkb3dzXG4gICAgICAgICAgICBjb25zdCBib2R5U3RhcnQgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXIuaW5kZXhPZigndm9pZCBtYWluKCkgeycpO1xuICAgICAgICAgICAgc2hhZGVyLmZyYWdtZW50U2hhZGVyID1cbiAgICAgICAgICAgICAgICAndmFyeWluZyB2ZWMyIHZVdjtcXG4nICtcbiAgICAgICAgICAgICAgICBzaGFkZXIuZnJhZ21lbnRTaGFkZXIuc2xpY2UoMCwgYm9keVN0YXJ0KSArXG4gICAgICAgICAgICAgICAgJ3VuaWZvcm0gc2FtcGxlcjJEIHByZXZpb3VzU2hhZG93TWFwO1xcblx0dW5pZm9ybSBmbG9hdCBhdmVyYWdpbmdXaW5kb3c7XFxuJyArXG4gICAgICAgICAgICAgICAgc2hhZGVyLmZyYWdtZW50U2hhZGVyLnNsaWNlKGJvZHlTdGFydCAtIDEsIC0xKSArXG4gICAgICAgICAgICAgICAgYFxcbnZlYzMgdGV4ZWxPbGQgPSB0ZXh0dXJlMkQocHJldmlvdXNTaGFkb3dNYXAsIHZVdikucmdiO1xuICAgICAgICBnbF9GcmFnQ29sb3IucmdiID0gbWl4KHRleGVsT2xkLCBnbF9GcmFnQ29sb3IucmdiLCAxLjAvIGF2ZXJhZ2luZ1dpbmRvdyk7XG4gICAgICB9YDtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBQcmV2aW91cyBGcmFtZSdzIFRleHR1cmUgQnVmZmVyIGFuZCBBdmVyYWdpbmcgV2luZG93XG4gICAgICAgICAgICBzaGFkZXIudW5pZm9ybXNbJ3ByZXZpb3VzU2hhZG93TWFwJ10gPSB0aGlzLnByZXZpb3VzU2hhZG93TWFwO1xuICAgICAgICAgICAgc2hhZGVyLnVuaWZvcm1zWydhdmVyYWdpbmdXaW5kb3cnXSA9IHRoaXMuYXZlcmFnaW5nV2luZG93O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmdldENsZWFyQ29sb3IodGhpcy5jbGVhckNvbG9yKTtcbiAgICAgICAgdGhpcy5jbGVhckFscGhhID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcignYmxhY2snLCAxKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMik7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcih0aGlzLmNsZWFyQ29sb3IsIHRoaXMuY2xlYXJBbHBoYSk7XG5cbiAgICAgICAgdGhpcy5saWdodHMgPSBbXTtcbiAgICAgICAgdGhpcy5tZXNoZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zY2VuZS50cmF2ZXJzZSgob2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNHZW9tZXRyeShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNoZXMucHVzaCh7IG9iamVjdCwgbWF0ZXJpYWw6IG9iamVjdC5tYXRlcmlhbCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNMaWdodChvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saWdodHMucHVzaCh7IG9iamVjdCwgaW50ZW5zaXR5OiBvYmplY3QuaW50ZW5zaXR5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICB0aGlzLmxpZ2h0cy5mb3JFYWNoKChsaWdodCkgPT4gKGxpZ2h0Lm9iamVjdC5pbnRlbnNpdHkgPSAwKSk7XG4gICAgICAgIHRoaXMubWVzaGVzLmZvckVhY2goKG1lc2gpID0+IChtZXNoLm9iamVjdC5tYXRlcmlhbCA9IHRoaXMuZGlzY2FyZE1hdCkpO1xuICAgIH1cblxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5saWdodHMuZm9yRWFjaCgobGlnaHQpID0+IChsaWdodC5vYmplY3QuaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5KSk7XG4gICAgICAgIHRoaXMubWVzaGVzLmZvckVhY2goKG1lc2gpID0+IChtZXNoLm9iamVjdC5tYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWwpKTtcbiAgICB9XG5cbiAgICBjb25maWd1cmUob2JqZWN0OiBhbnkpIHtcbiAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgfVxuXG4gICAgdXBkYXRlKGNhbWVyYTogYW55LCBibGVuZFdpbmRvdyA9IDEwMCkge1xuICAgICAgICBpZiAoIXRoaXMub2JqZWN0KSByZXR1cm47XG4gICAgICAgIC8vIFNldCBlYWNoIG9iamVjdCdzIG1hdGVyaWFsIHRvIHRoZSBVViBVbndyYXBwZWQgU3VyZmFjZSBNYXBwaW5nIFZlcnNpb25cbiAgICAgICAgdGhpcy5hdmVyYWdpbmdXaW5kb3cudmFsdWUgPSBibGVuZFdpbmRvdztcbiAgICAgICAgdGhpcy5vYmplY3QubWF0ZXJpYWwgPSB0aGlzLnRhcmdldE1hdDtcbiAgICAgICAgLy8gUGluZy1wb25nIHR3byBzdXJmYWNlIGJ1ZmZlcnMgZm9yIHJlYWRpbmcvd3JpdGluZ1xuICAgICAgICBjb25zdCBhY3RpdmVNYXAgPSB0aGlzLmJ1ZmZlcjFBY3RpdmUgPyB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAxIDogdGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMjtcbiAgICAgICAgY29uc3QgaW5hY3RpdmVNYXAgPSB0aGlzLmJ1ZmZlcjFBY3RpdmUgPyB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAyIDogdGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMTtcbiAgICAgICAgLy8gUmVuZGVyIHRoZSBvYmplY3QncyBzdXJmYWNlIG1hcHNcbiAgICAgICAgY29uc3Qgb2xkQmcgPSB0aGlzLnNjZW5lLmJhY2tncm91bmQ7XG4gICAgICAgIHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KGFjdGl2ZU1hcCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTaGFkb3dNYXAudmFsdWUgPSBpbmFjdGl2ZU1hcC50ZXh0dXJlO1xuICAgICAgICB0aGlzLmJ1ZmZlcjFBY3RpdmUgPSAhdGhpcy5idWZmZXIxQWN0aXZlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCBjYW1lcmEpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFJlbmRlclRhcmdldChudWxsKTtcbiAgICAgICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gb2xkQmc7XG4gICAgfVxufVxuIl19
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3NpdmUtbGlnaHQtbWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvc3RhZ2luZy9zcmMvbGliL2FjY3VtdWxhdGl2ZS1zaGFkb3dzL3Byb2dyZXNzaXZlLWxpZ2h0LW1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsU0FBUyxPQUFPLENBQUMsTUFBVztJQUN4QixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE1BQVc7SUFDM0IsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxPQUFPLG1CQUFtQjtJQWlCNUIsWUFBWSxRQUE2QixFQUFFLEtBQWtCLEVBQUUsTUFBYyxJQUFJO1FBQzdFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVwQiwwQ0FBMEM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFNBQVMs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QUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlzY2FyZE1hdGVyaWFsIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3NoYWRlcnMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5mdW5jdGlvbiBpc0xpZ2h0KG9iamVjdDogYW55KTogb2JqZWN0IGlzIFRIUkVFLkxpZ2h0IHtcbiAgICByZXR1cm4gb2JqZWN0LmlzTGlnaHQ7XG59XG5cbmZ1bmN0aW9uIGlzR2VvbWV0cnkob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgVEhSRUUuTWVzaCB7XG4gICAgcmV0dXJuICEhb2JqZWN0Lmdlb21ldHJ5O1xufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NpdmVMaWdodE1hcCB7XG4gICAgcmVuZGVyZXI6IFRIUkVFLldlYkdMUmVuZGVyZXI7XG4gICAgcmVzOiBudW1iZXI7XG4gICAgc2NlbmU6IFRIUkVFLlNjZW5lO1xuICAgIG9iamVjdDogVEhSRUUuTWVzaCB8IG51bGw7XG4gICAgYnVmZmVyMUFjdGl2ZTogYm9vbGVhbjtcbiAgICBwcm9ncmVzc2l2ZUxpZ2h0TWFwMTogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XG4gICAgcHJvZ3Jlc3NpdmVMaWdodE1hcDI6IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0O1xuICAgIGRpc2NhcmRNYXQ6IFRIUkVFLlNoYWRlck1hdGVyaWFsO1xuICAgIHRhcmdldE1hdDogVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbDtcbiAgICBwcmV2aW91c1NoYWRvd01hcDogeyB2YWx1ZTogVEhSRUUuVGV4dHVyZSB9O1xuICAgIGF2ZXJhZ2luZ1dpbmRvdzogeyB2YWx1ZTogbnVtYmVyIH07XG4gICAgY2xlYXJDb2xvcjogVEhSRUUuQ29sb3I7XG4gICAgY2xlYXJBbHBoYTogbnVtYmVyO1xuICAgIGxpZ2h0czogeyBvYmplY3Q6IFRIUkVFLkxpZ2h0OyBpbnRlbnNpdHk6IG51bWJlciB9W107XG4gICAgbWVzaGVzOiB7IG9iamVjdDogVEhSRUUuTWVzaDsgbWF0ZXJpYWw6IFRIUkVFLk1hdGVyaWFsIHwgVEhSRUUuTWF0ZXJpYWxbXSB9W107XG5cbiAgICBjb25zdHJ1Y3RvcihyZW5kZXJlcjogVEhSRUUuV2ViR0xSZW5kZXJlciwgc2NlbmU6IFRIUkVFLlNjZW5lLCByZXM6IG51bWJlciA9IDEwMjQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnJlcyA9IHJlcztcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgICB0aGlzLmJ1ZmZlcjFBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5saWdodHMgPSBbXTtcbiAgICAgICAgdGhpcy5tZXNoZXMgPSBbXTtcbiAgICAgICAgdGhpcy5vYmplY3QgPSBudWxsO1xuICAgICAgICB0aGlzLmNsZWFyQ29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoKTtcbiAgICAgICAgdGhpcy5jbGVhckFscGhhID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIFByb2dyZXNzaXZlIExpZ2h0TWFwIFRleHR1cmVcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gLyhBbmRyb2lkfGlQYWR8aVBob25lfGlQb2QpL2cudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/IFRIUkVFLkhhbGZGbG9hdFR5cGUgOiBUSFJFRS5GbG9hdFR5cGU7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NpdmVMaWdodE1hcDEgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQodGhpcy5yZXMsIHRoaXMucmVzLCB7XG4gICAgICAgICAgICB0eXBlOiBmb3JtYXQsXG4gICAgICAgICAgICBlbmNvZGluZzogcmVuZGVyZXIub3V0cHV0RW5jb2RpbmcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KHRoaXMucmVzLCB0aGlzLnJlcywge1xuICAgICAgICAgICAgdHlwZTogZm9ybWF0LFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHJlbmRlcmVyLm91dHB1dEVuY29kaW5nLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJbmplY3Qgc29tZSBzcGljeSBuZXcgbG9naWMgaW50byBhIHN0YW5kYXJkIHBob25nIG1hdGVyaWFsXG4gICAgICAgIHRoaXMuZGlzY2FyZE1hdCA9IG5ldyBEaXNjYXJkTWF0ZXJpYWwoKTtcbiAgICAgICAgdGhpcy50YXJnZXRNYXQgPSBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7IGZvZzogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTaGFkb3dNYXAgPSB7IHZhbHVlOiB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAxLnRleHR1cmUgfTtcbiAgICAgICAgdGhpcy5hdmVyYWdpbmdXaW5kb3cgPSB7IHZhbHVlOiAxMDAgfTtcbiAgICAgICAgdGhpcy50YXJnZXRNYXQub25CZWZvcmVDb21waWxlID0gKHNoYWRlcikgPT4ge1xuICAgICAgICAgICAgLy8gVmVydGV4IFNoYWRlcjogU2V0IFZlcnRleCBQb3NpdGlvbnMgdG8gdGhlIFVud3JhcHBlZCBVViBQb3NpdGlvbnNcbiAgICAgICAgICAgIHNoYWRlci52ZXJ0ZXhTaGFkZXIgPVxuICAgICAgICAgICAgICAgICd2YXJ5aW5nIHZlYzIgdlV2O1xcbicgK1xuICAgICAgICAgICAgICAgIHNoYWRlci52ZXJ0ZXhTaGFkZXIuc2xpY2UoMCwgLTEpICtcbiAgICAgICAgICAgICAgICAndlV2ID0gdXY7IGdsX1Bvc2l0aW9uID0gdmVjNCgodXYgLSAwLjUpICogMi4wLCAxLjAsIDEuMCk7IH0nO1xuXG4gICAgICAgICAgICAvLyBGcmFnbWVudCBTaGFkZXI6IFNldCBQaXhlbHMgdG8gYXZlcmFnZSBpbiB0aGUgUHJldmlvdXMgZnJhbWUncyBTaGFkb3dzXG4gICAgICAgICAgICBjb25zdCBib2R5U3RhcnQgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXIuaW5kZXhPZigndm9pZCBtYWluKCkgeycpO1xuICAgICAgICAgICAgc2hhZGVyLmZyYWdtZW50U2hhZGVyID1cbiAgICAgICAgICAgICAgICAndmFyeWluZyB2ZWMyIHZVdjtcXG4nICtcbiAgICAgICAgICAgICAgICBzaGFkZXIuZnJhZ21lbnRTaGFkZXIuc2xpY2UoMCwgYm9keVN0YXJ0KSArXG4gICAgICAgICAgICAgICAgJ3VuaWZvcm0gc2FtcGxlcjJEIHByZXZpb3VzU2hhZG93TWFwO1xcblx0dW5pZm9ybSBmbG9hdCBhdmVyYWdpbmdXaW5kb3c7XFxuJyArXG4gICAgICAgICAgICAgICAgc2hhZGVyLmZyYWdtZW50U2hhZGVyLnNsaWNlKGJvZHlTdGFydCAtIDEsIC0xKSArXG4gICAgICAgICAgICAgICAgYFxcbnZlYzMgdGV4ZWxPbGQgPSB0ZXh0dXJlMkQocHJldmlvdXNTaGFkb3dNYXAsIHZVdikucmdiO1xuICAgICAgICBnbF9GcmFnQ29sb3IucmdiID0gbWl4KHRleGVsT2xkLCBnbF9GcmFnQ29sb3IucmdiLCAxLjAvIGF2ZXJhZ2luZ1dpbmRvdyk7XG4gICAgICB9YDtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBQcmV2aW91cyBGcmFtZSdzIFRleHR1cmUgQnVmZmVyIGFuZCBBdmVyYWdpbmcgV2luZG93XG4gICAgICAgICAgICBzaGFkZXIudW5pZm9ybXNbJ3ByZXZpb3VzU2hhZG93TWFwJ10gPSB0aGlzLnByZXZpb3VzU2hhZG93TWFwO1xuICAgICAgICAgICAgc2hhZGVyLnVuaWZvcm1zWydhdmVyYWdpbmdXaW5kb3cnXSA9IHRoaXMuYXZlcmFnaW5nV2luZG93O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmdldENsZWFyQ29sb3IodGhpcy5jbGVhckNvbG9yKTtcbiAgICAgICAgdGhpcy5jbGVhckFscGhhID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcignYmxhY2snLCAxKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMik7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcih0aGlzLmNsZWFyQ29sb3IsIHRoaXMuY2xlYXJBbHBoYSk7XG5cbiAgICAgICAgdGhpcy5saWdodHMgPSBbXTtcbiAgICAgICAgdGhpcy5tZXNoZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zY2VuZS50cmF2ZXJzZSgob2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNHZW9tZXRyeShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNoZXMucHVzaCh7IG9iamVjdCwgbWF0ZXJpYWw6IG9iamVjdC5tYXRlcmlhbCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNMaWdodChvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saWdodHMucHVzaCh7IG9iamVjdCwgaW50ZW5zaXR5OiBvYmplY3QuaW50ZW5zaXR5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICB0aGlzLmxpZ2h0cy5mb3JFYWNoKChsaWdodCkgPT4gKGxpZ2h0Lm9iamVjdC5pbnRlbnNpdHkgPSAwKSk7XG4gICAgICAgIHRoaXMubWVzaGVzLmZvckVhY2goKG1lc2gpID0+IChtZXNoLm9iamVjdC5tYXRlcmlhbCA9IHRoaXMuZGlzY2FyZE1hdCkpO1xuICAgIH1cblxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5saWdodHMuZm9yRWFjaCgobGlnaHQpID0+IChsaWdodC5vYmplY3QuaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5KSk7XG4gICAgICAgIHRoaXMubWVzaGVzLmZvckVhY2goKG1lc2gpID0+IChtZXNoLm9iamVjdC5tYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWwpKTtcbiAgICB9XG5cbiAgICBjb25maWd1cmUob2JqZWN0OiBhbnkpIHtcbiAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgfVxuXG4gICAgdXBkYXRlKGNhbWVyYTogYW55LCBibGVuZFdpbmRvdyA9IDEwMCkge1xuICAgICAgICBpZiAoIXRoaXMub2JqZWN0KSByZXR1cm47XG4gICAgICAgIC8vIFNldCBlYWNoIG9iamVjdCdzIG1hdGVyaWFsIHRvIHRoZSBVViBVbndyYXBwZWQgU3VyZmFjZSBNYXBwaW5nIFZlcnNpb25cbiAgICAgICAgdGhpcy5hdmVyYWdpbmdXaW5kb3cudmFsdWUgPSBibGVuZFdpbmRvdztcbiAgICAgICAgdGhpcy5vYmplY3QubWF0ZXJpYWwgPSB0aGlzLnRhcmdldE1hdDtcbiAgICAgICAgLy8gUGluZy1wb25nIHR3byBzdXJmYWNlIGJ1ZmZlcnMgZm9yIHJlYWRpbmcvd3JpdGluZ1xuICAgICAgICBjb25zdCBhY3RpdmVNYXAgPSB0aGlzLmJ1ZmZlcjFBY3RpdmUgPyB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAxIDogdGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMjtcbiAgICAgICAgY29uc3QgaW5hY3RpdmVNYXAgPSB0aGlzLmJ1ZmZlcjFBY3RpdmUgPyB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAyIDogdGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMTtcbiAgICAgICAgLy8gUmVuZGVyIHRoZSBvYmplY3QncyBzdXJmYWNlIG1hcHNcbiAgICAgICAgY29uc3Qgb2xkQmcgPSB0aGlzLnNjZW5lLmJhY2tncm91bmQ7XG4gICAgICAgIHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KGFjdGl2ZU1hcCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTaGFkb3dNYXAudmFsdWUgPSBpbmFjdGl2ZU1hcC50ZXh0dXJlO1xuICAgICAgICB0aGlzLmJ1ZmZlcjFBY3RpdmUgPSAhdGhpcy5idWZmZXIxQWN0aXZlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCBjYW1lcmEpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFJlbmRlclRhcmdldChudWxsKTtcbiAgICAgICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gb2xkQmc7XG4gICAgfVxufVxuIl19
|