angular-three-postprocessing 2.0.0-beta.9 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +56 -4
  2. package/esm2022/lib/effect-composer.mjs +111 -171
  3. package/esm2022/lib/effect.mjs +43 -71
  4. package/esm2022/lib/effects/ascii.mjs +120 -0
  5. package/esm2022/lib/effects/bloom.mjs +39 -0
  6. package/esm2022/lib/effects/brightness-contrast.mjs +38 -0
  7. package/esm2022/lib/effects/chromatic-abberation.mjs +38 -0
  8. package/esm2022/lib/effects/color-average.mjs +33 -0
  9. package/esm2022/lib/effects/color-depth.mjs +38 -0
  10. package/esm2022/lib/effects/depth-of-field.mjs +56 -0
  11. package/esm2022/lib/effects/depth.mjs +38 -0
  12. package/esm2022/lib/effects/dot-screen.mjs +38 -0
  13. package/esm2022/lib/effects/fxaa.mjs +38 -0
  14. package/esm2022/lib/effects/glitch.mjs +63 -0
  15. package/esm2022/lib/effects/god-rays.mjs +41 -0
  16. package/esm2022/lib/effects/grid.mjs +42 -0
  17. package/esm2022/lib/effects/hue-saturation.mjs +38 -0
  18. package/esm2022/lib/effects/index.mjs +28 -18
  19. package/esm2022/lib/effects/lens-flare.mjs +195 -0
  20. package/esm2022/lib/effects/lut.mjs +50 -0
  21. package/esm2022/lib/effects/noise.mjs +39 -0
  22. package/esm2022/lib/effects/outline.mjs +143 -0
  23. package/esm2022/lib/effects/pixelation.mjs +30 -0
  24. package/esm2022/lib/effects/scanline.mjs +43 -0
  25. package/esm2022/lib/effects/sepia.mjs +38 -0
  26. package/esm2022/lib/effects/shock-wave.mjs +38 -0
  27. package/esm2022/lib/effects/smaa.mjs +38 -0
  28. package/esm2022/lib/effects/tilt-shift-2.mjs +121 -0
  29. package/esm2022/lib/effects/tilt-shift.mjs +39 -0
  30. package/esm2022/lib/effects/vignette.mjs +38 -0
  31. package/esm2022/lib/effects/water.mjs +64 -0
  32. package/fesm2022/angular-three-postprocessing.mjs +1280 -651
  33. package/fesm2022/angular-three-postprocessing.mjs.map +1 -1
  34. package/lib/effect-composer.d.ts +24 -76
  35. package/lib/effect.d.ts +52 -23
  36. package/lib/effects/ascii.d.ts +23 -0
  37. package/lib/effects/bloom.d.ts +10 -0
  38. package/lib/effects/brightness-contrast.d.ts +15 -0
  39. package/lib/effects/chromatic-abberation.d.ts +16 -0
  40. package/lib/effects/color-average.d.ts +11 -0
  41. package/lib/effects/color-depth.d.ts +14 -0
  42. package/lib/effects/depth-of-field.d.ts +22 -0
  43. package/lib/effects/depth.d.ts +14 -0
  44. package/lib/effects/dot-screen.d.ts +15 -0
  45. package/lib/effects/fxaa.d.ts +13 -0
  46. package/lib/effects/glitch.d.ts +29 -0
  47. package/lib/effects/god-rays.d.ts +30 -0
  48. package/lib/effects/grid.d.ts +18 -0
  49. package/lib/effects/hue-saturation.d.ts +15 -0
  50. package/lib/effects/index.d.ts +27 -17
  51. package/lib/effects/lens-flare.d.ts +96 -0
  52. package/lib/effects/lut.d.ts +19 -0
  53. package/lib/effects/noise.d.ts +14 -0
  54. package/lib/effects/outline.d.ts +74 -0
  55. package/lib/effects/pixelation.d.ts +16 -0
  56. package/lib/effects/scanline.d.ts +17 -0
  57. package/lib/effects/sepia.d.ts +14 -0
  58. package/lib/effects/shock-wave.d.ts +11 -0
  59. package/lib/effects/smaa.d.ts +15 -0
  60. package/lib/effects/tilt-shift-2.d.ts +35 -0
  61. package/lib/effects/tilt-shift.d.ts +22 -0
  62. package/lib/effects/vignette.d.ts +17 -0
  63. package/lib/effects/water.d.ts +20 -0
  64. package/package.json +12 -7
  65. package/esm2022/lib/effects/bloom/bloom.mjs +0 -33
  66. package/esm2022/lib/effects/brightness-contrast/brightness-contrast.mjs +0 -29
  67. package/esm2022/lib/effects/color-depth/color-depth.mjs +0 -29
  68. package/esm2022/lib/effects/depth/depth.mjs +0 -29
  69. package/esm2022/lib/effects/dot-screen/dot-screen.mjs +0 -29
  70. package/esm2022/lib/effects/hue-saturation/hue-saturation.mjs +0 -29
  71. package/esm2022/lib/effects/lut/lut.mjs +0 -70
  72. package/esm2022/lib/effects/noise/noise.mjs +0 -33
  73. package/esm2022/lib/effects/pixelation/pixelation.mjs +0 -33
  74. package/esm2022/lib/effects/scanline/scanline.mjs +0 -33
  75. package/esm2022/lib/effects/sepia/sepia.mjs +0 -29
  76. package/esm2022/lib/effects/shock-wave/shock-wave.mjs +0 -29
  77. package/esm2022/lib/effects/smaa/smaa.mjs +0 -29
  78. package/esm2022/lib/effects/ssao/ssao.mjs +0 -213
  79. package/esm2022/lib/effects/tilt-shift/tilt-shift.mjs +0 -33
  80. package/esm2022/lib/effects/tone-mapping/tone-mapping.mjs +0 -29
  81. package/esm2022/lib/effects/vignette/vignette.mjs +0 -29
  82. package/lib/effects/bloom/bloom.d.ts +0 -13
  83. package/lib/effects/brightness-contrast/brightness-contrast.d.ts +0 -15
  84. package/lib/effects/color-depth/color-depth.d.ts +0 -14
  85. package/lib/effects/depth/depth.d.ts +0 -14
  86. package/lib/effects/dot-screen/dot-screen.d.ts +0 -15
  87. package/lib/effects/hue-saturation/hue-saturation.d.ts +0 -15
  88. package/lib/effects/lut/lut.d.ts +0 -29
  89. package/lib/effects/noise/noise.d.ts +0 -15
  90. package/lib/effects/pixelation/pixelation.d.ts +0 -20
  91. package/lib/effects/scanline/scanline.d.ts +0 -15
  92. package/lib/effects/sepia/sepia.d.ts +0 -14
  93. package/lib/effects/shock-wave/shock-wave.d.ts +0 -17
  94. package/lib/effects/smaa/smaa.d.ts +0 -16
  95. package/lib/effects/ssao/ssao.d.ts +0 -42
  96. package/lib/effects/tilt-shift/tilt-shift.d.ts +0 -23
  97. package/lib/effects/tone-mapping/tone-mapping.d.ts +0 -22
  98. package/lib/effects/vignette/vignette.d.ts +0 -17
@@ -0,0 +1,195 @@
1
+ // Created by Anderson Mancini 2023
2
+ // React Three Fiber Ultimate LensFlare
3
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, afterNextRender, computed, inject, input, } from '@angular/core';
4
+ import { NgtArgs, injectBeforeRender, injectStore } from 'angular-three';
5
+ import { easing } from 'maath';
6
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
7
+ import { mergeInputs } from 'ngxtension/inject-inputs';
8
+ import { BlendFunction, Effect } from 'postprocessing';
9
+ import { Color, Mesh, Uniform, Vector2, Vector3 } from 'three';
10
+ import { NgtpEffectComposer } from '../effect-composer';
11
+ import * as i0 from "@angular/core";
12
+ const LensFlareShader = {
13
+ fragmentShader: /* language=glsl glsl */ `
14
+
15
+ uniform float iTime;
16
+ uniform vec2 lensPosition;
17
+ uniform vec2 iResolution;
18
+ uniform vec3 colorGain;
19
+ uniform float starPoints;
20
+ uniform float glareSize;
21
+ uniform float flareSize;
22
+ uniform float flareSpeed;
23
+ uniform float flareShape;
24
+ uniform float haloScale;
25
+ uniform float opacity;
26
+ uniform bool animated;
27
+ uniform bool anamorphic;
28
+ uniform bool enabled;
29
+ uniform bool secondaryGhosts;
30
+ uniform bool starBurst;
31
+ uniform float ghostScale;
32
+ uniform bool aditionalStreaks;
33
+ uniform sampler2D lensDirtTexture;
34
+ vec2 vxtC;
35
+
36
+ float rndf(float n){return fract(sin(n) * 43758.5453123);}float niz(float p){float fl = floor(p);float fc = fract(p);return mix(rndf(fl),rndf(fl + 1.0), fc);}
37
+ vec3 hsv2rgb(vec3 c){vec4 k = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);vec3 p = abs(fract(c.xxx + k.xyz) * 6.0 - k.www);return c.z * mix(k.xxx, clamp(p - k.xxx, 0.0, 1.0), c.y);}
38
+ float satU(float x){return clamp(x, 0.,1.);}vec2 rtU(vec2 naz, float rtn){return vec2(cos(rtn) * naz.x + sin(rtn) * naz.y,cos(rtn) * naz.y - sin(rtn) * naz.x);}
39
+ vec3 drwF(vec2 p, float intensity, float rnd, float speed, int id){float flhos = (1. / 32.) * float(id) * 0.1;float lingrad = distance(vec2(0.), p);float expg = 1. / exp(lingrad * (fract(rnd) * 0.66 + 0.33));vec3 qzTg = hsv2rgb(vec3( fract( (expg * 8.) + speed * flareSpeed + flhos), pow(1.-abs(expg*2.-1.), 0.45), 20.0 * expg * intensity));float internalStarPoints;if(anamorphic){internalStarPoints = 1.0;} else{internalStarPoints = starPoints;}float ams = length(p * flareShape * sin(internalStarPoints * atan(p.x, p.y)));float kJhg = pow(1.-satU(ams), ( anamorphic ? 100. : 12.));kJhg += satU(expg-0.9) * 3.;kJhg = pow(kJhg * expg, 8. + (1.-intensity) * 5.);if(flareSpeed > 0.0){return vec3(kJhg) * qzTg;} else{return vec3(kJhg) * flareSize * 15.;}}
40
+ float ams2(vec3 a, vec3 b) { return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z);}vec3 satU(vec3 x){return clamp(x, vec3(0.0), vec3(1.0));}
41
+ float glR(vec2 naz, vec2 pos, float zsi){vec2 mni;if(animated){mni = rtU(naz-pos, iTime * 0.1);} else{mni = naz-pos;}float ang = atan(mni.y, mni.x) * (anamorphic ? 1.0 : starPoints);float ams2 = length(mni);ams2 = pow(ams2, .9);float f0 = 1.0/(length(naz-pos)*(1.0/zsi*16.0)+.2);return f0+f0*(sin((ang))*.2 +.3);}
42
+ float sdHex(vec2 p){p = abs(p);vec2 q = vec2(p.x*2.0*0.5773503, p.y + p.x*0.5773503);return dot(step(q.xy,q.yx), 1.0-q.yx);}float fpow(float x, float k){return x > k ? pow((x-k)/(1.0-k),2.0) : 0.0;}
43
+ vec3 rHx(vec2 naz, vec2 p, float s, vec3 col){naz -= p;if (abs(naz.x) < 0.2*s && abs(naz.y) < 0.2*s){return mix(vec3(0),mix(vec3(0),col,0.1 + fpow(length(naz/s),0.1)*10.0),smoothstep(0.0,0.1,sdHex(naz*20.0/s)));}return vec3(0);}
44
+ vec3 mLs(vec2 naz, vec2 pos){vec2 mni = naz-pos;vec2 zxMp = naz*(length(naz));float ang = atan(mni.x,mni.y);float f0 = .3/(length(naz-pos)*16.0+1.0);f0 = f0*(sin(niz(sin(ang*3.9-(animated ? iTime : 0.0) * 0.3) * starPoints))*.2 );float f1 = max(0.01-pow(length(naz+1.2*pos),1.9),.0)*7.0;float f2 = max(.9/(10.0+32.0*pow(length(zxMp+0.99*pos),2.0)),.0)*0.35;float f22 = max(.9/(11.0+32.0*pow(length(zxMp+0.85*pos),2.0)),.0)*0.23;float f23 = max(.9/(12.0+32.0*pow(length(zxMp+0.95*pos),2.0)),.0)*0.6;vec2 ztX = mix(naz,zxMp, 0.1);float f4 = max(0.01-pow(length(ztX+0.4*pos),2.9),.0)*4.02;float f42 = max(0.0-pow(length(ztX+0.45*pos),2.9),.0)*4.1;float f43 = max(0.01-pow(length(ztX+0.5*pos),2.9),.0)*4.6;ztX = mix(naz,zxMp,-.4);float f5 = max(0.01-pow(length(ztX+0.1*pos),5.5),.0)*2.0;float f52 = max(0.01-pow(length(ztX+0.2*pos),5.5),.0)*2.0;float f53 = max(0.01-pow(length(ztX+0.1*pos),5.5),.0)*2.0;ztX = mix(naz,zxMp, 2.1);float f6 = max(0.01-pow(length(ztX-0.3*pos),1.61),.0)*3.159;float f62 = max(0.01-pow(length(ztX-0.325*pos),1.614),.0)*3.14;float f63 = max(0.01-pow(length(ztX-0.389*pos),1.623),.0)*3.12;vec3 c = vec3(glR(naz,pos, glareSize));vec2 prot;if(animated){prot = rtU(naz - pos, (iTime * 0.1));} else if(anamorphic){prot = rtU(naz - pos, 1.570796);} else {prot = naz - pos;}c += drwF(prot, (anamorphic ? flareSize * 10. : flareSize), 0.1, iTime, 1);c.r+=f1+f2+f4+f5+f6; c.g+=f1+f22+f42+f52+f62; c.b+=f1+f23+f43+f53+f63;c = c*1.3 * vec3(length(zxMp)+.09);c+=vec3(f0);return c;}
45
+ vec3 cc(vec3 clr, float fct,float fct2){float w = clr.x+clr.y+clr.z;return mix(clr,vec3(w)*fct,w*fct2);}float rnd(vec2 p){float f = fract(sin(dot(p, vec2(12.1234, 72.8392) )*45123.2));return f;}float rnd(float w){float f = fract(sin(w)*1000.);return f;}
46
+ float rShp(vec2 p, int N){float f;float a=atan(p.x,p.y)+.2;float b=6.28319/float(N);f=smoothstep(.5,.51, cos(floor(.5+a/b)*b-a)*length(p.xy)* 2.0 -ghostScale);return f;}
47
+ vec3 drC(vec2 p, float zsi, float dCy, vec3 clr, vec3 clr2, float ams2, vec2 esom){float l = length(p + esom*(ams2*2.))+zsi/2.;float l2 = length(p + esom*(ams2*4.))+zsi/3.;float c = max(0.01-pow(length(p + esom*ams2), zsi*ghostScale), 0.0)*10.;float c1 = max(0.001-pow(l-0.3, 1./40.)+sin(l*20.), 0.0)*3.;float c2 = max(0.09/pow(length(p-esom*ams2/.5)*1., .95), 0.0)/20.;float s = max(0.02-pow(rShp(p*5. + esom*ams2*5. + dCy, 6) , 1.), 0.0)*1.5;clr = cos(vec3(0.44, .24, .2)*8. + ams2*4.)*0.5+.5;vec3 f = c*clr;f += c1*clr;f += c2*clr;f += s*clr;return f-0.01;}
48
+ vec4 geLC(float x){return vec4(vec3(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(vec3(0., 0., 0.),vec3(0., 0., 0.), smoothstep(0.0, 0.063, x)),vec3(0., 0., 0.), smoothstep(0.063, 0.125, x)),vec3(0.0, 0., 0.), smoothstep(0.125, 0.188, x)),vec3(0.188, 0.131, 0.116), smoothstep(0.188, 0.227, x)),vec3(0.31, 0.204, 0.537), smoothstep(0.227, 0.251, x)),vec3(0.192, 0.106, 0.286), smoothstep(0.251, 0.314, x)),vec3(0.102, 0.008, 0.341), smoothstep(0.314, 0.392, x)),vec3(0.086, 0.0, 0.141), smoothstep(0.392, 0.502, x)),vec3(1.0, 0.31, 0.0), smoothstep(0.502, 0.604, x)),vec3(.1, 0.1, 0.1), smoothstep(0.604, 0.643, x)),vec3(1.0, 0.929, 0.0), smoothstep(0.643, 0.761, x)),vec3(1.0, 0.086, 0.424), smoothstep(0.761, 0.847, x)),vec3(1.0, 0.49, 0.0), smoothstep(0.847, 0.89, x)),vec3(0.945, 0.275, 0.475), smoothstep(0.89, 0.941, x)),vec3(0.251, 0.275, 0.796), smoothstep(0.941, 1.0, x))),1.0);}
49
+ float diTN(vec2 p){vec2 f = fract(p);f = (f * f) * (3.0 - (2.0 * f));float n = dot(floor(p), vec2(1.0, 157.0));vec4 a = fract(sin(vec4(n + 0.0, n + 1.0, n + 157.0, n + 158.0)) * 43758.5453123);return mix(mix(a.x, a.y, f.x), mix(a.z, a.w, f.x), f.y);}
50
+ float fbm(vec2 p){const mat2 m = mat2(0.80, -0.60, 0.60, 0.80);float f = 0.0;f += 0.5000*diTN(p); p = m*p*2.02;f += 0.2500*diTN(p); p = m*p*2.03;f += 0.1250*diTN(p); p = m*p*2.01;f += 0.0625*diTN(p);return f/0.9375;}
51
+ vec4 geLS(vec2 p){vec2 pp = (p - vec2(0.5)) * 2.0;float a = atan(pp.y, pp.x);vec4 cp = vec4(sin(a * 1.0), length(pp), sin(a * 13.0), sin(a * 53.0));float d = sin(clamp(pow(length(vec2(0.5) - p) * 0.5 + haloScale /2., 5.0), 0.0, 1.0) * 3.14159);vec3 c = vec3(d) * vec3(fbm(cp.xy * 16.0) * fbm(cp.zw * 9.0) * max(max(max(max(0.5, sin(a * 1.0)), sin(a * 3.0) * 0.8), sin(a * 7.0) * 0.8), sin(a * 9.0) * 10.6));c *= vec3(mix(2.0, (sin(length(pp.xy) * 256.0) * 0.5) + 0.5, sin((clamp((length(pp.xy) - 0.875) / 0.1, 0.0, 1.0) + 0.0) * 2.0 * 3.14159) * 1.5) + 0.5) * 0.3275;return vec4(vec3(c * 1.0), d);}
52
+ vec4 geLD(vec2 p){p.xy += vec2(fbm(p.yx * 3.0), fbm(p.yx * 2.0)) * 0.0825;vec3 o = vec3(mix(0.125, 0.25, max(max(smoothstep(0.1, 0.0, length(p - vec2(0.25))),smoothstep(0.4, 0.0, length(p - vec2(0.75)))),smoothstep(0.8, 0.0, length(p - vec2(0.875, 0.125))))));o += vec3(max(fbm(p * 1.0) - 0.5, 0.0)) * 0.5;o += vec3(max(fbm(p * 2.0) - 0.5, 0.0)) * 0.5;o += vec3(max(fbm(p * 4.0) - 0.5, 0.0)) * 0.25;o += vec3(max(fbm(p * 8.0) - 0.75, 0.0)) * 1.0;o += vec3(max(fbm(p * 16.0) - 0.75, 0.0)) * 0.75;o += vec3(max(fbm(p * 64.0) - 0.75, 0.0)) * 0.5;return vec4(clamp(o, vec3(0.15), vec3(1.0)), 1.0);}
53
+ vec4 txL(sampler2D tex, vec2 xtC){if(((xtC.x < 0.) || (xtC.y < 0.)) || ((xtC.x > 1.) || (xtC.y > 1.))){return vec4(0.0);}else{return texture(tex, xtC); }}
54
+ vec4 txD(sampler2D tex, vec2 xtC, vec2 dir, vec3 ditn) {return vec4(txL(tex, (xtC + (dir * ditn.r))).r,txL(tex, (xtC + (dir * ditn.g))).g,txL(tex, (xtC + (dir * ditn.b))).b,1.0);}
55
+ vec4 strB(){vec2 aspXtc = vec2(1.0) - (((vxtC - vec2(0.5)) * vec2(1.0)) + vec2(0.5)); vec2 xtC = vec2(1.0) - vxtC; vec2 ghvc = (vec2(0.5) - xtC) * 0.3 - lensPosition; vec2 ghNm = normalize(ghvc * vec2(1.0)) * vec2(1.0);vec2 haloVec = normalize(ghvc) * 0.6;vec2 hlNm = ghNm * 0.6;vec2 texelSize = vec2(1.0) / vec2(iResolution.xy);vec3 ditn = vec3(-(texelSize.x * 1.5), 0.2, texelSize.x * 1.5);vec4 c = vec4(0.0);for (int i = 0; i < 8; i++) {vec2 offset = xtC + (ghvc * float(i));c += txD(lensDirtTexture, offset, ghNm, ditn) * pow(max(0.0, 1.0 - (length(vec2(0.5) - offset) / length(vec2(0.5)))), 10.0);}vec2 uyTrz = xtC + hlNm; return (c * geLC((length(vec2(0.5) - aspXtc) / length(vec2(haloScale))))) +(txD(lensDirtTexture, uyTrz, ghNm, ditn) * pow(max(0.0, 1.0 - (length(vec2(0.5) - uyTrz) / length(vec2(0.5)))), 10.0));}
56
+ void mainImage(vec4 v,vec2 r,out vec4 i){vec2 g=r-.5;g.y*=iResolution.y/iResolution.x;vec2 l=lensPosition*.5;l.y*=iResolution.y/iResolution.x;vec3 f=mLs(g,l)*20.*colorGain/256.;if(aditionalStreaks){vec3 o=vec3(.9,.2,.1),p=vec3(.3,.1,.9);for(float n=0.;n<10.;n++)f+=drC(g,pow(rnd(n*2e3)*2.8,.1)+1.41,0.,o+n,p+n,rnd(n*20.)*3.+.2-.5,lensPosition);}if(secondaryGhosts){vec3 n=vec3(0);n+=rHx(g,-lensPosition*.25,ghostScale*1.4,vec3(.25,.35,0));n+=rHx(g,lensPosition*.25,ghostScale*.5,vec3(1,.5,.5));n+=rHx(g,lensPosition*.1,ghostScale*1.6,vec3(1));n+=rHx(g,lensPosition*1.8,ghostScale*2.,vec3(0,.5,.75));n+=rHx(g,lensPosition*1.25,ghostScale*.8,vec3(1,1,.5));n+=rHx(g,-lensPosition*1.25,ghostScale*5.,vec3(.5,.5,.25));n+=fpow(1.-abs(distance(lensPosition*.8,g)-.7),.985)*colorGain/2100.;f+=n;}if(starBurst){vxtC=g+.5;vec4 n=geLD(g);float o=1.-clamp(0.5,0.,.5)*2.;n+=mix(n,pow(n*2.,vec4(2))*.5,o);float s=(g.x+g.y)*(1./6.);vec2 d=mat2(cos(s),-sin(s),sin(s),cos(s))*vxtC;n+=geLS(d)*2.;f+=clamp(n.xyz*strB().xyz,.01,1.);}i=enabled?vec4(mix(f,vec3(0),opacity)+v.xyz,v.w):vec4(v);}
57
+ `,
58
+ };
59
+ export class LensFlareEffect extends Effect {
60
+ constructor({ blendFunction = BlendFunction.NORMAL, enabled = true, glareSize = 0.2, lensPosition = [0.01, 0.01], iResolution = [0, 0], starPoints = 6, flareSize = 0.01, flareSpeed = 0.01, flareShape = 0.01, animated = true, anamorphic = false, colorGain = new Color(20, 20, 20), lensDirtTexture = null, haloScale = 0.5, secondaryGhosts = true, aditionalStreaks = true, ghostScale = 0.0, opacity = 1.0, starBurst = false, } = {}) {
61
+ super('LensFlareEffect', LensFlareShader.fragmentShader, {
62
+ blendFunction,
63
+ uniforms: new Map([
64
+ ['enabled', new Uniform(enabled)],
65
+ ['glareSize', new Uniform(glareSize)],
66
+ ['lensPosition', new Uniform(lensPosition)],
67
+ ['iTime', new Uniform(0)],
68
+ ['iResolution', new Uniform(iResolution)],
69
+ ['starPoints', new Uniform(starPoints)],
70
+ ['flareSize', new Uniform(flareSize)],
71
+ ['flareSpeed', new Uniform(flareSpeed)],
72
+ ['flareShape', new Uniform(flareShape)],
73
+ ['animated', new Uniform(animated)],
74
+ ['anamorphic', new Uniform(anamorphic)],
75
+ ['colorGain', new Uniform(colorGain)],
76
+ ['lensDirtTexture', new Uniform(lensDirtTexture)],
77
+ ['haloScale', new Uniform(haloScale)],
78
+ ['secondaryGhosts', new Uniform(secondaryGhosts)],
79
+ ['aditionalStreaks', new Uniform(aditionalStreaks)],
80
+ ['ghostScale', new Uniform(ghostScale)],
81
+ ['starBurst', new Uniform(starBurst)],
82
+ ['opacity', new Uniform(opacity)],
83
+ ]),
84
+ });
85
+ }
86
+ update(_renderer, _inputBuffer, deltaTime) {
87
+ const iTime = this.uniforms.get('iTime');
88
+ if (iTime) {
89
+ iTime.value += deltaTime;
90
+ }
91
+ }
92
+ }
93
+ const defaultOptions = {
94
+ position: new Vector3(-25, 6, -60),
95
+ followMouse: false,
96
+ smoothTime: 0.7,
97
+ };
98
+ export class NgtpLensFlare {
99
+ constructor() {
100
+ this.autoEffect = injectAutoEffect();
101
+ this.store = injectStore();
102
+ this.viewport = this.store.select('viewport');
103
+ this.raycaster = this.store.select('raycaster');
104
+ this.pointer = this.store.select('pointer');
105
+ this.effectComposer = inject(NgtpEffectComposer);
106
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
107
+ this.projectedPosition = new Vector3();
108
+ this.mouse2d = new Vector2();
109
+ this.effect = computed(() => {
110
+ const { position: _, followMouse: __, smoothTime: ___, ...options } = this.options();
111
+ return new LensFlareEffect(options);
112
+ });
113
+ afterNextRender(() => {
114
+ this.autoEffect(() => {
115
+ const [effect, viewport] = [this.effect(), this.viewport()];
116
+ const iResolution = effect.uniforms.get('iResolution');
117
+ if (iResolution) {
118
+ iResolution.value.x = viewport.width;
119
+ iResolution.value.y = viewport.height;
120
+ }
121
+ });
122
+ });
123
+ injectBeforeRender(({ delta }) => {
124
+ const [effect] = [this.effect()];
125
+ if (!effect)
126
+ return;
127
+ const [{ followMouse, position, smoothTime }, pointer, camera, scene, raycaster] = [
128
+ this.options(),
129
+ this.pointer(),
130
+ this.effectComposer.camera(),
131
+ this.effectComposer.scene(),
132
+ this.raycaster(),
133
+ ];
134
+ const uLensPosition = effect.uniforms.get('lensPosition');
135
+ const uOpacity = effect.uniforms.get('opacity');
136
+ if (!uLensPosition || !uOpacity)
137
+ return;
138
+ let target = 1;
139
+ if (followMouse) {
140
+ uLensPosition.value.x = pointer.x;
141
+ uLensPosition.value.y = pointer.y;
142
+ target = 0;
143
+ }
144
+ else {
145
+ this.projectedPosition.copy(position).project(camera);
146
+ if (this.projectedPosition.z > 1)
147
+ return;
148
+ uLensPosition.value.x = this.projectedPosition.x;
149
+ uLensPosition.value.y = this.projectedPosition.y;
150
+ this.mouse2d.set(this.projectedPosition.x, this.projectedPosition.y);
151
+ raycaster.setFromCamera(this.mouse2d, camera);
152
+ const intersects = raycaster.intersectObjects(scene.children, true);
153
+ const { object } = intersects[0] ?? {};
154
+ if (object) {
155
+ if (object.userData?.['lensflare'] === 'no-occlusion') {
156
+ target = 0;
157
+ }
158
+ else if (object instanceof Mesh) {
159
+ if (object.material.uniforms?._transmission?.value > 0.2) {
160
+ //Check for MeshTransmissionMaterial
161
+ target = 0.2;
162
+ }
163
+ else if (object.material._transmission && object.material._transmission > 0.2) {
164
+ //Check for MeshPhysicalMaterial with transmission setting
165
+ target = 0.2;
166
+ }
167
+ else if (object.material.transparent) {
168
+ // Check for OtherMaterials with transparent parameter
169
+ target = object.material.opacity;
170
+ }
171
+ }
172
+ }
173
+ }
174
+ easing.damp(uOpacity, 'value', target, smoothTime, delta);
175
+ });
176
+ }
177
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpLensFlare, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
178
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtpLensFlare, isStandalone: true, selector: "ngtp-lens-flare", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
179
+ <ngt-primitive *args="[effect()]" [parameters]="{ dispose: null }" />
180
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
181
+ }
182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpLensFlare, decorators: [{
183
+ type: Component,
184
+ args: [{
185
+ selector: 'ngtp-lens-flare',
186
+ standalone: true,
187
+ template: `
188
+ <ngt-primitive *args="[effect()]" [parameters]="{ dispose: null }" />
189
+ `,
190
+ imports: [NgtArgs],
191
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
192
+ changeDetection: ChangeDetectionStrategy.OnPush,
193
+ }]
194
+ }], ctorParameters: () => [] });
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVucy1mbGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2xpYi9lZmZlY3RzL2xlbnMtZmxhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUNBQW1DO0FBQ25DLHVDQUF1QztBQUV2QyxPQUFPLEVBQ04sc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVcsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQW9DLE1BQU0sT0FBTyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQUV4RCxNQUFNLGVBQWUsR0FBRztJQUN2QixjQUFjLEVBQUUsd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNEN6QztDQUNBLENBQUM7QUFFRixNQUFNLE9BQU8sZUFBZ0IsU0FBUSxNQUFNO0lBQzFDLFlBQVksRUFDWCxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFDcEMsT0FBTyxHQUFHLElBQUksRUFDZCxTQUFTLEdBQUcsR0FBRyxFQUNmLFlBQVksR0FBRyxD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Q0FBQztvQkFDWixDQUFDO3lCQUFNLElBQUksTUFBTSxZQUFZLElBQUksRUFBRSxDQUFDO3dCQUNuQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7NEJBQzFELG9DQUFvQzs0QkFDcEMsTUFBTSxHQUFHLEdBQUcsQ0FBQzt3QkFDZCxDQUFDOzZCQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUM7NEJBQ2pGLDBEQUEwRDs0QkFDMUQsTUFBTSxHQUFHLEdBQUcsQ0FBQzt3QkFDZCxDQUFDOzZCQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDeEMsc0RBQXNEOzRCQUN0RCxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7d0JBQ2xDLENBQUM7b0JBQ0YsQ0FBQztnQkFDRixDQUFDO1lBQ0YsQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0FwRlcsYUFBYTtrR0FBYixhQUFhLHFOQVBmOztFQUVULDREQUNTLE9BQU87OzJGQUlMLGFBQWE7a0JBVnpCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDL0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDcmVhdGVkIGJ5IEFuZGVyc29uIE1hbmNpbmkgMjAyM1xuLy8gUmVhY3QgVGhyZWUgRmliZXIgVWx0aW1hdGUgTGVuc0ZsYXJlXG5cbmltcG9ydCB7XG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Y29tcHV0ZWQsXG5cdGluamVjdCxcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3RTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgZWFzaW5nIH0gZnJvbSAnbWFhdGgnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgQmxlbmRGdW5jdGlvbiwgRWZmZWN0IH0gZnJvbSAncG9zdHByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgQ29sb3IsIE1lc2gsIFRleHR1cmUsIFVuaWZvcm0sIFZlY3RvcjIsIFZlY3RvcjMsIFdlYkdMUmVuZGVyVGFyZ2V0LCBXZWJHTFJlbmRlcmVyIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0cEVmZmVjdENvbXBvc2VyIH0gZnJvbSAnLi4vZWZmZWN0LWNvbXBvc2VyJztcblxuY29uc3QgTGVuc0ZsYXJlU2hhZGVyID0ge1xuXHRmcmFnbWVudFNoYWRlcjogLyogbGFuZ3VhZ2U9Z2xzbCBnbHNsICovIGBcblxuICB1bmlmb3JtIGZsb2F0IGlUaW1lO1xuICB1bmlmb3JtIHZlYzIgbGVuc1Bvc2l0aW9uO1xuICB1bmlmb3JtIHZlYzIgaVJlc29sdXRpb247XG4gIHVuaWZvcm0gdmVjMyBjb2xvckdhaW47XG4gIHVuaWZvcm0gZmxvYXQgc3RhclBvaW50cztcbiAgdW5pZm9ybSBmbG9hdCBnbGFyZVNpemU7XG4gIHVuaWZvcm0gZmxvYXQgZmxhcmVTaXplO1xuICB1bmlmb3JtIGZsb2F0IGZsYXJlU3BlZWQ7XG4gIHVuaWZvcm0gZmxvYXQgZmxhcmVTaGFwZTtcbiAgdW5pZm9ybSBmbG9hdCBoYWxvU2NhbGU7XG4gIHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiAgdW5pZm9ybSBib29sIGFuaW1hdGVkO1xuICB1bmlmb3JtIGJvb2wgYW5hbW9ycGhpYztcbiAgdW5pZm9ybSBib29sIGVuYWJsZWQ7XG4gIHVuaWZvcm0gYm9vbCBzZWNvbmRhcnlHaG9zdHM7XG4gIHVuaWZvcm0gYm9vbCBzdGFyQnVyc3Q7XG4gIHVuaWZvcm0gZmxvYXQgZ2hvc3RTY2FsZTtcbiAgdW5pZm9ybSBib29sIGFkaXRpb25hbFN0cmVha3M7XG4gIHVuaWZvcm0gc2FtcGxlcjJEIGxlbnNEaXJ0VGV4dHVyZTtcbiAgdmVjMiB2eHRDO1xuXG4gIGZsb2F0IHJuZGYoZmxvYXQgbil7cmV0dXJuIGZyYWN0KHNpbihuKSAqIDQzNzU4LjU0NTMxMjMpO31mbG9hdCBuaXooZmxvYXQgcCl7ZmxvYXQgZmwgPSBmbG9vcihwKTtmbG9hdCBmYyA9IGZyYWN0KHApO3JldHVybiBtaXgocm5kZihmbCkscm5kZihmbCArIDEuMCksIGZjKTt9XG4gIHZlYzMgaHN2MnJnYih2ZWMzIGMpe3ZlYzQgayA9IHZlYzQoMS4wLCAyLjAgLyAzLjAsIDEuMCAvIDMuMCwgMy4wKTt2ZWMzIHAgPSBhYnMoZnJhY3QoYy54eHggKyBrLnh5eikgKiA2LjAgLSBrLnd3dyk7cmV0dXJuIGMueiAqIG1peChrLnh4eCwgY2xhbXAocCAtIGsueHh4LCAwLjAsIDEuMCksIGMueSk7fVxuICBmbG9hdCBzYXRVKGZsb2F0IHgpe3JldHVybiBjbGFtcCh4LCAwLiwxLik7fXZlYzIgcnRVKHZlYzIgbmF6LCBmbG9hdCBydG4pe3JldHVybiB2ZWMyKGNvcyhydG4pICogbmF6LnggKyBzaW4ocnRuKSAqIG5hei55LGNvcyhydG4pICogbmF6LnkgLSBzaW4ocnRuKSAqIG5hei54KTt9XG4gIHZlYzMgZHJ3Rih2ZWMyIHAsIGZsb2F0IGludGVuc2l0eSwgZmxvYXQgcm5kLCBmbG9hdCBzcGVlZCwgaW50IGlkKXtmbG9hdCBmbGhvcyA9ICgxLiAvIDMyLikgKiBmbG9hdChpZCkgKiAwLjE7ZmxvYXQgbGluZ3JhZCA9IGRpc3RhbmNlKHZlYzIoMC4pLCBwKTtmbG9hdCBleHBnID0gMS4gLyBleHAobGluZ3JhZCAqIChmcmFjdChybmQpICogMC42NiArIDAuMzMpKTt2ZWMzIHF6VGcgPSBoc3YycmdiKHZlYzMoIGZyYWN0KCAoZXhwZyAqIDguKSArIHNwZWVkICogZmxhcmVTcGVlZCArIGZsaG9zKSwgcG93KDEuLWFicyhleHBnKjIuLTEuKSwgMC40NSksIDIwLjAgKiBleHBnICogaW50ZW5zaXR5KSk7ZmxvYXQgaW50ZXJuYWxTdGFyUG9pbnRzO2lmKGFuYW1vcnBoaWMpe2ludGVybmFsU3RhclBvaW50cyA9IDEuMDt9IGVsc2V7aW50ZXJuYWxTdGFyUG9pbnRzID0gc3RhclBvaW50czt9ZmxvYXQgYW1zID0gbGVuZ3RoKHAgKiBmbGFyZVNoYXBlICogc2luKGludGVybmFsU3RhclBvaW50cyAqIGF0YW4ocC54LCBwLnkpKSk7ZmxvYXQga0poZyA9IHBvdygxLi1zYXRVKGFtcyksICggYW5hbW9ycGhpYyA/IDEwMC4gOiAxMi4pKTtrSmhnICs9IHNhdFUoZXhwZy0wLjkpICogMy47a0poZyA9IHBvdyhrSmhnICogZXhwZywgOC4gKyAoMS4taW50ZW5zaXR5KSAqIDUuKTtpZihmbGFyZVNwZWVkID4gMC4wKXtyZXR1cm4gdmVjMyhrSmhnKSAqIHF6VGc7fSBlbHNle3JldHVybiB2ZWMzKGtKaGcpICogZmxhcmVTaXplICogMTUuO319XG4gIGZsb2F0IGFtczIodmVjMyBhLCB2ZWMzIGIpIHsgcmV0dXJuIGFicyhhLnggLSBiLngpICsgYWJzKGEueSAtIGIueSkgKyBhYnMoYS56IC0gYi56KTt9dmVjMyBzYXRVKHZlYzMgeCl7cmV0dXJuIGNsYW1wKHgsIHZlYzMoMC4wKSwgdmVjMygxLjApKTt9XG4gIGZsb2F0IGdsUih2ZWMyIG5heiwgdmVjMiBwb3MsIGZsb2F0IHpzaSl7dmVjMiBtbmk7aWYoYW5pbWF0ZWQpe21uaSA9IHJ0VShuYXotcG9zLCBpVGltZSAqIDAuMSk7fSBlbHNle21uaSA9IG5hei1wb3M7fWZsb2F0IGFuZyA9IGF0YW4obW5pLnksIG1uaS54KSAqIChhbmFtb3JwaGljID8gMS4wIDogc3RhclBvaW50cyk7ZmxvYXQgYW1zMiA9IGxlbmd0aChtbmkpO2FtczIgPSBwb3coYW1zMiwgLjkpO2Zsb2F0IGYwID0gMS4wLyhsZW5ndGgobmF6LXBvcykqKDEuMC96c2kqMTYuMCkrLjIpO3JldHVybiBmMCtmMCooc2luKChhbmcpKSouMiArLjMpO31cbiAgZmxvYXQgc2RIZXgodmVjMiBwKXtwID0gYWJzKHApO3ZlYzIgcSA9IHZlYzIocC54KjIuMCowLjU3NzM1MDMsIHAueSArIHAueCowLjU3NzM1MDMpO3JldHVybiBkb3Qoc3RlcChxLnh5LHEueXgpLCAxLjAtcS55eCk7fWZsb2F0IGZwb3coZmxvYXQgeCwgZmxvYXQgayl7cmV0dXJuIHggPiBrID8gcG93KCh4LWspLygxLjAtayksMi4wKSA6IDAuMDt9XG4gIHZlYzMgckh4KHZlYzIgbmF6LCB2ZWMyIHAsIGZsb2F0IHMsIHZlYzMgY29sKXtuYXogLT0gcDtpZiAoYWJzKG5hei54KSA8IDAuMipzICYmIGFicyhuYXoueSkgPCAwLjIqcyl7cmV0dXJuIG1peCh2ZWMzKDApLG1peCh2ZWMzKDApLGNvbCwwLjEgKyBmcG93KGxlbmd0aChuYXovcyksMC4xKSoxMC4wKSxzbW9vdGhzdGVwKDAuMCwwLjEsc2RIZXgobmF6KjIwLjAvcykpKTt9cmV0dXJuIHZlYzMoMCk7fVxuICB2ZWMzIG1Mcyh2ZWMyIG5heiwgdmVjMiBwb3Mpe3ZlYzIgbW5pID0gbmF6LXBvczt2ZWMyIHp4TXAgPSBuYXoqKGxlbmd0aChuYXopKTtmbG9hdCBhbmcgPSBhdGFuKG1uaS54LG1uaS55KTtmbG9hdCBmMCA9IC4zLyhsZW5ndGgobmF6LXBvcykqMTYuMCsxLjApO2YwID0gZjAqKHNpbihuaXooc2luKGFuZyozLjktKGFuaW1hdGVkID8gaVRpbWUgOiAwLjApICogMC4zKSAqIHN0YXJQb2ludHMpKSouMiApO2Zsb2F0IGYxID0gbWF4KDAuMDEtcG93KGxlbmd0aChuYXorMS4yKnBvcyksMS45KSwuMCkqNy4wO2Zsb2F0IGYyID0gbWF4KC45LygxMC4wKzMyLjAqcG93KGxlbmd0aCh6eE1wKzAuOTkqcG9zKSwyLjApKSwuMCkqMC4zNTtmbG9hdCBmMjIgPSBtYXgoLjkvKDExLjArMzIuMCpwb3cobGVuZ3RoKHp4TXArMC44NSpwb3MpLDIuMCkpLC4wKSowLjIzO2Zsb2F0IGYyMyA9IG1heCguOS8oMTIuMCszMi4wKnBvdyhsZW5ndGgoenhNcCswLjk1KnBvcyksMi4wKSksLjApKjAuNjt2ZWMyIHp0WCA9IG1peChuYXosenhNcCwgMC4xKTtmbG9hdCBmNCA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYKzAuNCpwb3MpLDIuOSksLjApKjQuMDI7ZmxvYXQgZjQyID0gbWF4KDAuMC1wb3cobGVuZ3RoKHp0WCswLjQ1KnBvcyksMi45KSwuMCkqNC4xO2Zsb2F0IGY0MyA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYKzAuNSpwb3MpLDIuOSksLjApKjQuNjt6dFggPSBtaXgobmF6LHp4TXAsLS40KTtmbG9hdCBmNSA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYKzAuMSpwb3MpLDUuNSksLjApKjIuMDtmbG9hdCBmNTIgPSBtYXgoMC4wMS1wb3cobGVuZ3RoKHp0WCswLjIqcG9zKSw1LjUpLC4wKSoyLjA7ZmxvYXQgZjUzID0gbWF4KDAuMDEtcG93KGxlbmd0aCh6dFgrMC4xKnBvcyksNS41KSwuMCkqMi4wO3p0WCA9IG1peChuYXosenhNcCwgMi4xKTtmbG9hdCBmNiA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYLTAuMypwb3MpLDEuNjEpLC4wKSozLjE1OTtmbG9hdCBmNjIgPSBtYXgoMC4wMS1wb3cobGVuZ3RoKHp0WC0wLjMyNSpwb3MpLDEuNjE0KSwuMCkqMy4xNDtmbG9hdCBmNjMgPSBtYXgoMC4wMS1wb3cobGVuZ3RoKHp0WC0wLjM4OSpwb3MpLDEuNjIzKSwuMCkqMy4xMjt2ZWMzIGMgPSB2ZWMzKGdsUihuYXoscG9zLCBnbGFyZVNpemUpKTt2ZWMyIHByb3Q7aWYoYW5pbWF0ZWQpe3Byb3QgPSBydFUobmF6IC0gcG9zLCAoaVRpbWUgKiAwLjEpKTt9IGVsc2UgaWYoYW5hbW9ycGhpYyl7cHJvdCA9IHJ0VShuYXogLSBwb3MsIDEuNTcwNzk2KTt9IGVsc2Uge3Byb3QgPSBuYXogLSBwb3M7fWMgKz0gZHJ3Rihwcm90LCAoYW5hbW9ycGhpYyA/IGZsYXJlU2l6ZSAqIDEwLiA6IGZsYXJlU2l6ZSksIDAuMSwgaVRpbWUsIDEpO2Mucis9ZjErZjIrZjQrZjUrZjY7IGMuZys9ZjErZjIyK2Y0MitmNTIrZjYyOyBjLmIrPWYxK2YyMytmNDMrZjUzK2Y2MztjID0gYyoxLjMgKiB2ZWMzKGxlbmd0aCh6eE1wKSsuMDkpO2MrPXZlYzMoZjApO3JldHVybiBjO31cbiAgdmVjMyBjYyh2ZWMzIGNsciwgZmxvYXQgZmN0LGZsb2F0IGZjdDIpe2Zsb2F0IHcgPSBjbHIueCtjbHIueStjbHIuejtyZXR1cm4gbWl4KGNscix2ZWMzKHcpKmZjdCx3KmZjdDIpO31mbG9hdCBybmQodmVjMiBwKXtmbG9hdCBmID0gZnJhY3Qoc2luKGRvdChwLCB2ZWMyKDEyLjEyMzQsIDcyLjgzOTIpICkqNDUxMjMuMikpO3JldHVybiBmO31mbG9hdCBybmQoZmxvYXQgdyl7ZmxvYXQgZiA9IGZyYWN0KHNpbih3KSoxMDAwLik7cmV0dXJuIGY7fVxuICBmbG9hdCByU2hwKHZlYzIgcCwgaW50IE4pe2Zsb2F0IGY7ZmxvYXQgYT1hdGFuKHAueCxwLnkpKy4yO2Zsb2F0IGI9Ni4yODMxOS9mbG9hdChOKTtmPXNtb290aHN0ZXAoLjUsLjUxLCBjb3MoZmxvb3IoLjUrYS9iKSpiLWEpKmxlbmd0aChwLnh5KSogMi4wICAtZ2hvc3RTY2FsZSk7cmV0dXJuIGY7fVxuICB2ZWMzIGRyQyh2ZWMyIHAsIGZsb2F0IHpzaSwgZmxvYXQgZEN5LCB2ZWMzIGNsciwgdmVjMyBjbHIyLCBmbG9hdCBhbXMyLCB2ZWMyIGVzb20pe2Zsb2F0IGwgPSBsZW5ndGgocCArIGVzb20qKGFtczIqMi4pKSt6c2kvMi47ZmxvYXQgbDIgPSBsZW5ndGgocCArIGVzb20qKGFtczIqNC4pKSt6c2kvMy47ZmxvYXQgYyA9IG1heCgwLjAxLXBvdyhsZW5ndGgocCArIGVzb20qYW1zMiksIHpzaSpnaG9zdFNjYWxlKSwgMC4wKSoxMC47ZmxvYXQgYzEgPSBtYXgoMC4wMDEtcG93KGwtMC4zLCAxLi80MC4pK3NpbihsKjIwLiksIDAuMCkqMy47ZmxvYXQgYzIgPSAgbWF4KDAuMDkvcG93KGxlbmd0aChwLWVzb20qYW1zMi8uNSkqMS4sIC45NSksIDAuMCkvMjAuO2Zsb2F0IHMgPSBtYXgoMC4wMi1wb3coclNocChwKjUuICsgZXNvbSphbXMyKjUuICsgZEN5LCA2KSAsIDEuKSwgMC4wKSoxLjU7Y2xyID0gY29zKHZlYzMoMC40NCwgLjI0LCAuMikqOC4gKyBhbXMyKjQuKSowLjUrLjU7dmVjMyBmID0gYypjbHI7ZiArPSBjMSpjbHI7ZiArPSBjMipjbHI7ZiArPSAgcypjbHI7cmV0dXJuIGYtMC4wMTt9XG4gIHZlYzQgZ2VMQyhmbG9hdCB4KXtyZXR1cm4gdmVjNCh2ZWMzKG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KHZlYzMoMC4sIDAuLCAwLiksdmVjMygwLiwgMC4sIDAuKSwgc21vb3Roc3RlcCgwLjAsIDAuMDYzLCB4KSksdmVjMygwLiwgMC4sIDAuKSwgc21vb3Roc3RlcCgwLjA2MywgMC4xMjUsIHgpKSx2ZWMzKDAuMCwgMC4sIDAuKSwgc21vb3Roc3RlcCgwLjEyNSwgMC4xODgsIHgpKSx2ZWMzKDAuMTg4LCAwLjEzMSwgMC4xMTYpLCBzbW9vdGhzdGVwKDAuMTg4LCAwLjIyNywgeCkpLHZlYzMoMC4zMSwgMC4yMDQsIDAuNTM3KSwgc21vb3Roc3RlcCgwLjIyNywgMC4yNTEsIHgpKSx2ZWMzKDAuMTkyLCAwLjEwNiwgMC4yODYpLCBzbW9vdGhzdGVwKDAuMjUxLCAwLjMxNCwgeCkpLHZlYzMoMC4xMDIsIDAuMDA4LCAwLjM0MSksIHNtb290aHN0ZXAoMC4zMTQsIDAuMzkyLCB4KSksdmVjMygwLjA4NiwgMC4wLCAwLjE0MSksIHNtb290aHN0ZXAoMC4zOTIsIDAuNTAyLCB4KSksdmVjMygxLjAsIDAuMzEsIDAuMCksIHNtb290aHN0ZXAoMC41MDIsIDAuNjA0LCB4KSksdmVjMyguMSwgMC4xLCAwLjEpLCBzbW9vdGhzdGVwKDAuNjA0LCAwLjY0MywgeCkpLHZlYzMoMS4wLCAwLjkyOSwgMC4wKSwgc21vb3Roc3RlcCgwLjY0MywgMC43NjEsIHgpKSx2ZWMzKDEuMCwgMC4wODYsIDAuNDI0KSwgc21vb3Roc3RlcCgwLjc2MSwgMC44NDcsIHgpKSx2ZWMzKDEuMCwgMC40OSwgMC4wKSwgc21vb3Roc3RlcCgwLjg0NywgMC44OSwgeCkpLHZlYzMoMC45NDUsIDAuMjc1LCAwLjQ3NSksIHNtb290aHN0ZXAoMC44OSwgMC45NDEsIHgpKSx2ZWMzKDAuMjUxLCAwLjI3NSwgMC43OTYpLCBzbW9vdGhzdGVwKDAuOTQxLCAxLjAsIHgpKSksMS4wKTt9XG4gIGZsb2F0IGRpVE4odmVjMiBwKXt2ZWMyIGYgPSBmcmFjdChwKTtmID0gKGYgKiBmKSAqICgzLjAgLSAoMi4wICogZikpO2Zsb2F0IG4gPSBkb3QoZmxvb3IocCksIHZlYzIoMS4wLCAxNTcuMCkpO3ZlYzQgYSA9IGZyYWN0KHNpbih2ZWM0KG4gKyAwLjAsIG4gKyAxLjAsIG4gKyAxNTcuMCwgbiArIDE1OC4wKSkgKiA0Mzc1OC41NDUzMTIzKTtyZXR1cm4gbWl4KG1peChhLngsIGEueSwgZi54KSwgbWl4KGEueiwgYS53LCBmLngpLCBmLnkpO31cbiAgZmxvYXQgZmJtKHZlYzIgcCl7Y29uc3QgbWF0MiBtID0gbWF0MigwLjgwLCAtMC42MCwgMC42MCwgMC44MCk7ZmxvYXQgZiA9IDAuMDtmICs9IDAuNTAwMCpkaVROKHApOyBwID0gbSpwKjIuMDI7ZiArPSAwLjI1MDAqZGlUTihwKTsgcCA9IG0qcCoyLjAzO2YgKz0gMC4xMjUwKmRpVE4ocCk7IHAgPSBtKnAqMi4wMTtmICs9IDAuMDYyNSpkaVROKHApO3JldHVybiBmLzAuOTM3NTt9XG4gIHZlYzQgZ2VMUyh2ZWMyIHApe3ZlYzIgcHAgPSAocCAtIHZlYzIoMC41KSkgKiAyLjA7ZmxvYXQgYSA9IGF0YW4ocHAueSwgcHAueCk7dmVjNCBjcCA9IHZlYzQoc2luKGEgKiAxLjApLCBsZW5ndGgocHApLCBzaW4oYSAqIDEzLjApLCBzaW4oYSAqIDUzLjApKTtmbG9hdCBkID0gc2luKGNsYW1wKHBvdyhsZW5ndGgodmVjMigwLjUpIC0gcCkgKiAwLjUgKyBoYWxvU2NhbGUgLzIuLCA1LjApLCAwLjAsIDEuMCkgKiAzLjE0MTU5KTt2ZWMzIGMgPSB2ZWMzKGQpICogdmVjMyhmYm0oY3AueHkgKiAxNi4wKSAqIGZibShjcC56dyAqIDkuMCkgKiBtYXgobWF4KG1heChtYXgoMC41LCBzaW4oYSAqIDEuMCkpLCBzaW4oYSAqIDMuMCkgKiAwLjgpLCBzaW4oYSAqIDcuMCkgKiAwLjgpLCBzaW4oYSAqIDkuMCkgKiAxMC42KSk7YyAqPSB2ZWMzKG1peCgyLjAsIChzaW4obGVuZ3RoKHBwLnh5KSAqIDI1Ni4wKSAqIDAuNSkgKyAwLjUsIHNpbigoY2xhbXAoKGxlbmd0aChwcC54eSkgLSAwLjg3NSkgLyAwLjEsIDAuMCwgMS4wKSArIDAuMCkgKiAyLjAgKiAzLjE0MTU5KSAqIDEuNSkgKyAwLjUpICogMC4zMjc1O3JldHVybiB2ZWM0KHZlYzMoYyAqIDEuMCksIGQpO31cbiAgdmVjNCBnZUxEKHZlYzIgcCl7cC54eSArPSB2ZWMyKGZibShwLnl4ICogMy4wKSwgZmJtKHAueXggKiAyLjApKSAqIDAuMDgyNTt2ZWMzIG8gPSB2ZWMzKG1peCgwLjEyNSwgMC4yNSwgbWF4KG1heChzbW9vdGhzdGVwKDAuMSwgMC4wLCBsZW5ndGgocCAtIHZlYzIoMC4yNSkpKSxzbW9vdGhzdGVwKDAuNCwgMC4wLCBsZW5ndGgocCAtIHZlYzIoMC43NSkpKSksc21vb3Roc3RlcCgwLjgsIDAuMCwgbGVuZ3RoKHAgLSB2ZWMyKDAuODc1LCAwLjEyNSkpKSkpKTtvICs9IHZlYzMobWF4KGZibShwICogMS4wKSAtIDAuNSwgMC4wKSkgKiAwLjU7byArPSB2ZWMzKG1heChmYm0ocCAqIDIuMCkgLSAwLjUsIDAuMCkpICogMC41O28gKz0gdmVjMyhtYXgoZmJtKHAgKiA0LjApIC0gMC41LCAwLjApKSAqIDAuMjU7byArPSB2ZWMzKG1heChmYm0ocCAqIDguMCkgLSAwLjc1LCAwLjApKSAqIDEuMDtvICs9IHZlYzMobWF4KGZibShwICogMTYuMCkgLSAwLjc1LCAwLjApKSAqIDAuNzU7byArPSB2ZWMzKG1heChmYm0ocCAqIDY0LjApIC0gMC43NSwgMC4wKSkgKiAwLjU7cmV0dXJuIHZlYzQoY2xhbXAobywgdmVjMygwLjE1KSwgdmVjMygxLjApKSwgMS4wKTt9XG4gIHZlYzQgdHhMKHNhbXBsZXIyRCB0ZXgsIHZlYzIgeHRDKXtpZigoKHh0Qy54IDwgMC4pIHx8ICh4dEMueSA8IDAuKSkgfHwgKCh4dEMueCA+IDEuKSB8fCAoeHRDLnkgPiAxLikpKXtyZXR1cm4gdmVjNCgwLjApO31lbHNle3JldHVybiB0ZXh0dXJlKHRleCwgeHRDKTsgfX1cbiAgdmVjNCB0eEQoc2FtcGxlcjJEIHRleCwgdmVjMiB4dEMsIHZlYzIgZGlyLCB2ZWMzIGRpdG4pIHtyZXR1cm4gdmVjNCh0eEwodGV4LCAoeHRDICsgKGRpciAqIGRpdG4ucikpKS5yLHR4TCh0ZXgsICh4dEMgKyAoZGlyICogZGl0bi5nKSkpLmcsdHhMKHRleCwgKHh0QyArIChkaXIgKiBkaXRuLmIpKSkuYiwxLjApO31cbiAgdmVjNCBzdHJCKCl7dmVjMiBhc3BYdGMgPSB2ZWMyKDEuMCkgLSAoKCh2eHRDIC0gdmVjMigwLjUpKSAqIHZlYzIoMS4wKSkgKyB2ZWMyKDAuNSkpOyB2ZWMyIHh0QyA9IHZlYzIoMS4wKSAtIHZ4dEM7IHZlYzIgZ2h2YyA9ICh2ZWMyKDAuNSkgLSB4dEMpICogMC4zIC0gbGVuc1Bvc2l0aW9uOyB2ZWMyIGdoTm0gPSBub3JtYWxpemUoZ2h2YyAqIHZlYzIoMS4wKSkgKiB2ZWMyKDEuMCk7dmVjMiBoYWxvVmVjID0gbm9ybWFsaXplKGdodmMpICogMC42O3ZlYzIgaGxObSA9IGdoTm0gKiAwLjY7dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKDEuMCkgLyB2ZWMyKGlSZXNvbHV0aW9uLnh5KTt2ZWMzIGRpdG4gPSB2ZWMzKC0odGV4ZWxTaXplLnggKiAxLjUpLCAwLjIsIHRleGVsU2l6ZS54ICogMS41KTt2ZWM0IGMgPSB2ZWM0KDAuMCk7Zm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHt2ZWMyIG9mZnNldCA9IHh0QyArIChnaHZjICogZmxvYXQoaSkpO2MgKz0gdHhEKGxlbnNEaXJ0VGV4dHVyZSwgb2Zmc2V0LCBnaE5tLCBkaXRuKSAqIHBvdyhtYXgoMC4wLCAxLjAgLSAobGVuZ3RoKHZlYzIoMC41KSAtIG9mZnNldCkgLyBsZW5ndGgodmVjMigwLjUpKSkpLCAxMC4wKTt9dmVjMiB1eVRyeiA9IHh0QyArIGhsTm07IHJldHVybiAoYyAqIGdlTEMoKGxlbmd0aCh2ZWMyKDAuNSkgLSBhc3BYdGMpIC8gbGVuZ3RoKHZlYzIoaGFsb1NjYWxlKSkpKSkgKyh0eEQobGVuc0RpcnRUZXh0dXJlLCB1eVRyeiwgZ2hObSwgZGl0bikgKiBwb3cobWF4KDAuMCwgMS4wIC0gKGxlbmd0aCh2ZWMyKDAuNSkgLSB1eVRyeikgLyBsZW5ndGgodmVjMigwLjUpKSkpLCAxMC4wKSk7fVxuICB2b2lkIG1haW5JbWFnZSh2ZWM0IHYsdmVjMiByLG91dCB2ZWM0IGkpe3ZlYzIgZz1yLS41O2cueSo9aVJlc29sdXRpb24ueS9pUmVzb2x1dGlvbi54O3ZlYzIgbD1sZW5zUG9zaXRpb24qLjU7bC55Kj1pUmVzb2x1dGlvbi55L2lSZXNvbHV0aW9uLng7dmVjMyBmPW1McyhnLGwpKjIwLipjb2xvckdhaW4vMjU2LjtpZihhZGl0aW9uYWxTdHJlYWtzKXt2ZWMzIG89dmVjMyguOSwuMiwuMSkscD12ZWMzKC4zLC4xLC45KTtmb3IoZmxvYXQgbj0wLjtuPDEwLjtuKyspZis9ZHJDKGcscG93KHJuZChuKjJlMykqMi44LC4xKSsxLjQxLDAuLG8rbixwK24scm5kKG4qMjAuKSozLisuMi0uNSxsZW5zUG9zaXRpb24pO31pZihzZWNvbmRhcnlHaG9zdHMpe3ZlYzMgbj12ZWMzKDApO24rPXJIeChnLC1sZW5zUG9zaXRpb24qLjI1LGdob3N0U2NhbGUqMS40LHZlYzMoLjI1LC4zNSwwKSk7bis9ckh4KGcsbGVuc1Bvc2l0aW9uKi4yNSxnaG9zdFNjYWxlKi41LHZlYzMoMSwuNSwuNSkpO24rPXJIeChnLGxlbnNQb3NpdGlvbiouMSxnaG9zdFNjYWxlKjEuNix2ZWMzKDEpKTtuKz1ySHgoZyxsZW5zUG9zaXRpb24qMS44LGdob3N0U2NhbGUqMi4sdmVjMygwLC41LC43NSkpO24rPXJIeChnLGxlbnNQb3NpdGlvbioxLjI1LGdob3N0U2NhbGUqLjgsdmVjMygxLDEsLjUpKTtuKz1ySHgoZywtbGVuc1Bvc2l0aW9uKjEuMjUsZ2hvc3RTY2FsZSo1Lix2ZWMzKC41LC41LC4yNSkpO24rPWZwb3coMS4tYWJzKGRpc3RhbmNlKGxlbnNQb3NpdGlvbiouOCxnKS0uNyksLjk4NSkqY29sb3JHYWluLzIxMDAuO2YrPW47fWlmKHN0YXJCdXJzdCl7dnh0Qz1nKy41O3ZlYzQgbj1nZUxEKGcpO2Zsb2F0IG89MS4tY2xhbXAoMC41LDAuLC41KSoyLjtuKz1taXgobixwb3cobioyLix2ZWM0KDIpKSouNSxvKTtmbG9hdCBzPShnLngrZy55KSooMS4vNi4pO3ZlYzIgZD1tYXQyKGNvcyhzKSwtc2luKHMpLHNpbihzKSxjb3MocykpKnZ4dEM7bis9Z2VMUyhkKSoyLjtmKz1jbGFtcChuLnh5eipzdHJCKCkueHl6LC4wMSwxLik7fWk9ZW5hYmxlZD92ZWM0KG1peChmLHZlYzMoMCksb3BhY2l0eSkrdi54eXosdi53KTp2ZWM0KHYpO31cbmAsXG59O1xuXG5leHBvcnQgY2xhc3MgTGVuc0ZsYXJlRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcblx0Y29uc3RydWN0b3Ioe1xuXHRcdGJsZW5kRnVuY3Rpb24gPSBCbGVuZEZ1bmN0aW9uLk5PUk1BTCxcblx0XHRlbmFibGVkID0gdHJ1ZSxcblx0XHRnbGFyZVNpemUgPSAwLjIsXG5cdFx0bGVuc1Bvc2l0aW9uID0gWzAuMDEsIDAuMDFdLFxuXHRcdGlSZXNvbHV0aW9uID0gWzAsIDBdLFxuXHRcdHN0YXJQb2ludHMgPSA2LFxuXHRcdGZsYXJlU2l6ZSA9IDAuMDEsXG5cdFx0ZmxhcmVTcGVlZCA9IDAuMDEsXG5cdFx0ZmxhcmVTaGFwZSA9IDAuMDEsXG5cdFx0YW5pbWF0ZWQgPSB0cnVlLFxuXHRcdGFuYW1vcnBoaWMgPSBmYWxzZSxcblx0XHRjb2xvckdhaW4gPSBuZXcgQ29sb3IoMjAsIDIwLCAyMCksXG5cdFx0bGVuc0RpcnRUZXh0dXJlID0gbnVsbCBhcyBUZXh0dXJlIHwgbnVsbCxcblx0XHRoYWxvU2NhbGUgPSAwLjUsXG5cdFx0c2Vjb25kYXJ5R2hvc3RzID0gdHJ1ZSxcblx0XHRhZGl0aW9uYWxTdHJlYWtzID0gdHJ1ZSxcblx0XHRnaG9zdFNjYWxlID0gMC4wLFxuXHRcdG9wYWNpdHkgPSAxLjAsXG5cdFx0c3RhckJ1cnN0ID0gZmFsc2UsXG5cdH0gPSB7fSkge1xuXHRcdHN1cGVyKCdMZW5zRmxhcmVFZmZlY3QnLCBMZW5zRmxhcmVTaGFkZXIuZnJhZ21lbnRTaGFkZXIsIHtcblx0XHRcdGJsZW5kRnVuY3Rpb24sXG5cdFx0XHR1bmlmb3JtczogbmV3IE1hcDxzdHJpbmcsIFVuaWZvcm0+KFtcblx0XHRcdFx0WydlbmFibGVkJywgbmV3IFVuaWZvcm0oZW5hYmxlZCldLFxuXHRcdFx0XHRbJ2dsYXJlU2l6ZScsIG5ldyBVbmlmb3JtKGdsYXJlU2l6ZSldLFxuXHRcdFx0XHRbJ2xlbnNQb3NpdGlvbicsIG5ldyBVbmlmb3JtKGxlbnNQb3NpdGlvbildLFxuXHRcdFx0XHRbJ2lUaW1lJywgbmV3IFVuaWZvcm0oMCldLFxuXHRcdFx0XHRbJ2lSZXNvbHV0aW9uJywgbmV3IFVuaWZvcm0oaVJlc29sdXRpb24pXSxcblx0XHRcdFx0WydzdGFyUG9pbnRzJywgbmV3IFVuaWZvcm0oc3RhclBvaW50cyldLFxuXHRcdFx0XHRbJ2ZsYXJlU2l6ZScsIG5ldyBVbmlmb3JtKGZsYXJlU2l6ZSldLFxuXHRcdFx0XHRbJ2ZsYXJlU3BlZWQnLCBuZXcgVW5pZm9ybShmbGFyZVNwZWVkKV0sXG5cdFx0XHRcdFsnZmxhcmVTaGFwZScsIG5ldyBVbmlmb3JtKGZsYXJlU2hhcGUpXSxcblx0XHRcdFx0WydhbmltYXRlZCcsIG5ldyBVbmlmb3JtKGFuaW1hdGVkKV0sXG5cdFx0XHRcdFsnYW5hbW9ycGhpYycsIG5ldyBVbmlmb3JtKGFuYW1vcnBoaWMpXSxcblx0XHRcdFx0Wydjb2xvckdhaW4nLCBuZXcgVW5pZm9ybShjb2xvckdhaW4pXSxcblx0XHRcdFx0WydsZW5zRGlydFRleHR1cmUnLCBuZXcgVW5pZm9ybShsZW5zRGlydFRleHR1cmUpXSxcblx0XHRcdFx0WydoYWxvU2NhbGUnLCBuZXcgVW5pZm9ybShoYWxvU2NhbGUpXSxcblx0XHRcdFx0WydzZWNvbmRhcnlHaG9zdHMnLCBuZXcgVW5pZm9ybShzZWNvbmRhcnlHaG9zdHMpXSxcblx0XHRcdFx0WydhZGl0aW9uYWxTdHJlYWtzJywgbmV3IFVuaWZvcm0oYWRpdGlvbmFsU3RyZWFrcyldLFxuXHRcdFx0XHRbJ2dob3N0U2NhbGUnLCBuZXcgVW5pZm9ybShnaG9zdFNjYWxlKV0sXG5cdFx0XHRcdFsnc3RhckJ1cnN0JywgbmV3IFVuaWZvcm0oc3RhckJ1cnN0KV0sXG5cdFx0XHRcdFsnb3BhY2l0eScsIG5ldyBVbmlmb3JtKG9wYWNpdHkpXSxcblx0XHRcdF0pLFxuXHRcdH0pO1xuXHR9XG5cblx0b3ZlcnJpZGUgdXBkYXRlKF9yZW5kZXJlcjogV2ViR0xSZW5kZXJlciwgX2lucHV0QnVmZmVyOiBXZWJHTFJlbmRlclRhcmdldCwgZGVsdGFUaW1lOiBudW1iZXIpIHtcblx0XHRjb25zdCBpVGltZSA9IHRoaXMudW5pZm9ybXMuZ2V0KCdpVGltZScpO1xuXHRcdGlmIChpVGltZSkge1xuXHRcdFx0aVRpbWUudmFsdWUgKz0gZGVsdGFUaW1lO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgdHlwZSBMZW5zRmxhcmVPcHRpb25zID0gQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBMZW5zRmxhcmVFZmZlY3Q+WzBdICYge1xuXHRwb3NpdGlvbjogVmVjdG9yMztcblx0Zm9sbG93TW91c2U6IGJvb2xlYW47XG5cdHNtb290aFRpbWU6IG51bWJlcjtcbn07XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBMZW5zRmxhcmVPcHRpb25zID0ge1xuXHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoLTI1LCA2LCAtNjApLFxuXHRmb2xsb3dNb3VzZTogZmFsc2UsXG5cdHNtb290aFRpbWU6IDAuNyxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHAtbGVucy1mbGFyZScsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wcmltaXRpdmUgKmFyZ3M9XCJbZWZmZWN0KCldXCIgW3BhcmFtZXRlcnNdPVwieyBkaXNwb3NlOiBudWxsIH1cIiAvPlxuXHRgLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBMZW5zRmxhcmUge1xuXHRwcml2YXRlIGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIHZpZXdwb3J0ID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3ZpZXdwb3J0Jyk7XG5cdHByaXZhdGUgcmF5Y2FzdGVyID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3JheWNhc3RlcicpO1xuXHRwcml2YXRlIHBvaW50ZXIgPSB0aGlzLnN0b3JlLnNlbGVjdCgncG9pbnRlcicpO1xuXG5cdGVmZmVjdENvbXBvc2VyID0gaW5qZWN0KE5ndHBFZmZlY3RDb21wb3Nlcik7XG5cblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRPcHRpb25zLCB7IHRyYW5zZm9ybTogbWVyZ2VJbnB1dHMoZGVmYXVsdE9wdGlvbnMpIH0pO1xuXG5cdHByaXZhdGUgcHJvamVjdGVkUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRwcml2YXRlIG1vdXNlMmQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdGVmZmVjdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB7IHBvc2l0aW9uOiBfLCBmb2xsb3dNb3VzZTogX18sIHNtb290aFRpbWU6IF9fXywgLi4ub3B0aW9ucyB9ID0gdGhpcy5vcHRpb25zKCk7XG5cdFx0cmV0dXJuIG5ldyBMZW5zRmxhcmVFZmZlY3Qob3B0aW9ucyk7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHR0aGlzLmF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBbZWZmZWN0LCB2aWV3cG9ydF0gPSBbdGhpcy5lZmZlY3QoKSwgdGhpcy52aWV3cG9ydCgpXTtcblx0XHRcdFx0Y29uc3QgaVJlc29sdXRpb24gPSBlZmZlY3QudW5pZm9ybXMuZ2V0KCdpUmVzb2x1dGlvbicpO1xuXHRcdFx0XHRpZiAoaVJlc29sdXRpb24pIHtcblx0XHRcdFx0XHRpUmVzb2x1dGlvbi52YWx1ZS54ID0gdmlld3BvcnQud2lkdGg7XG5cdFx0XHRcdFx0aVJlc29sdXRpb24udmFsdWUueSA9IHZpZXdwb3J0LmhlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRpbmplY3RCZWZvcmVSZW5kZXIoKHsgZGVsdGEgfSkgPT4ge1xuXHRcdFx0Y29uc3QgW2VmZmVjdF0gPSBbdGhpcy5lZmZlY3QoKV07XG5cdFx0XHRpZiAoIWVmZmVjdCkgcmV0dXJuO1xuXG5cdFx0XHRjb25zdCBbeyBmb2xsb3dNb3VzZSwgcG9zaXRpb24sIHNtb290aFRpbWUgfSwgcG9pbnRlciwgY2FtZXJhLCBzY2VuZSwgcmF5Y2FzdGVyXSA9IFtcblx0XHRcdFx0dGhpcy5vcHRpb25zKCksXG5cdFx0XHRcdHRoaXMucG9pbnRlcigpLFxuXHRcdFx0XHR0aGlzLmVmZmVjdENvbXBvc2VyLmNhbWVyYSgpLFxuXHRcdFx0XHR0aGlzLmVmZmVjdENvbXBvc2VyLnNjZW5lKCksXG5cdFx0XHRcdHRoaXMucmF5Y2FzdGVyKCksXG5cdFx0XHRdO1xuXG5cdFx0XHRjb25zdCB1TGVuc1Bvc2l0aW9uID0gZWZmZWN0LnVuaWZvcm1zLmdldCgnbGVuc1Bvc2l0aW9uJyk7XG5cdFx0XHRjb25zdCB1T3BhY2l0eSA9IGVmZmVjdC51bmlmb3Jtcy5nZXQoJ29wYWNpdHknKTtcblx0XHRcdGlmICghdUxlbnNQb3NpdGlvbiB8fCAhdU9wYWNpdHkpIHJldHVybjtcblxuXHRcdFx0bGV0IHRhcmdldCA9IDE7XG5cblx0XHRcdGlmIChmb2xsb3dNb3VzZSkge1xuXHRcdFx0XHR1TGVuc1Bvc2l0aW9uLnZhbHVlLnggPSBwb2ludGVyLng7XG5cdFx0XHRcdHVMZW5zUG9zaXRpb24udmFsdWUueSA9IHBvaW50ZXIueTtcblx0XHRcdFx0dGFyZ2V0ID0gMDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMucHJvamVjdGVkUG9zaXRpb24uY29weShwb3NpdGlvbikucHJvamVjdChjYW1lcmEpO1xuXHRcdFx0XHRpZiAodGhpcy5wcm9qZWN0ZWRQb3NpdGlvbi56ID4gMSkgcmV0dXJuO1xuXG5cdFx0XHRcdHVMZW5zUG9zaXRpb24udmFsdWUueCA9IHRoaXMucHJvamVjdGVkUG9zaXRpb24ueDtcblx0XHRcdFx0dUxlbnNQb3NpdGlvbi52YWx1ZS55ID0gdGhpcy5wcm9qZWN0ZWRQb3NpdGlvbi55O1xuXG5cdFx0XHRcdHRoaXMubW91c2UyZC5zZXQodGhpcy5wcm9qZWN0ZWRQb3NpdGlvbi54LCB0aGlzLnByb2plY3RlZFBvc2l0aW9uLnkpO1xuXHRcdFx0XHRyYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlMmQsIGNhbWVyYSk7XG5cdFx0XHRcdGNvbnN0IGludGVyc2VjdHMgPSByYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhzY2VuZS5jaGlsZHJlbiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IHsgb2JqZWN0IH0gPSBpbnRlcnNlY3RzWzBdID8/IHt9O1xuXHRcdFx0XHRpZiAob2JqZWN0KSB7XG5cdFx0XHRcdFx0aWYgKG9iamVjdC51c2VyRGF0YT8uWydsZW5zZmxhcmUnXSA9PT0gJ25vLW9jY2x1c2lvbicpIHtcblx0XHRcdFx0XHRcdHRhcmdldCA9IDA7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXNoKSB7XG5cdFx0XHRcdFx0XHRpZiAob2JqZWN0Lm1hdGVyaWFsLnVuaWZvcm1zPy5fdHJhbnNtaXNzaW9uPy52YWx1ZSA+IDAuMikge1xuXHRcdFx0XHRcdFx0XHQvL0NoZWNrIGZvciBNZXNoVHJhbnNtaXNzaW9uTWF0ZXJpYWxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gMC4yO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvYmplY3QubWF0ZXJpYWwuX3RyYW5zbWlzc2lvbiAmJiBvYmplY3QubWF0ZXJpYWwuX3RyYW5zbWlzc2lvbiA+IDAuMikge1xuXHRcdFx0XHRcdFx0XHQvL0NoZWNrIGZvciBNZXNoUGh5c2ljYWxNYXRlcmlhbCB3aXRoIHRyYW5zbWlzc2lvbiBzZXR0aW5nXG5cdFx0XHRcdFx0XHRcdHRhcmdldCA9IDAuMjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob2JqZWN0Lm1hdGVyaWFsLnRyYW5zcGFyZW50KSB7XG5cdFx0XHRcdFx0XHRcdC8vIENoZWNrIGZvciBPdGhlck1hdGVyaWFscyB3aXRoIHRyYW5zcGFyZW50IHBhcmFtZXRlclxuXHRcdFx0XHRcdFx0XHR0YXJnZXQgPSBvYmplY3QubWF0ZXJpYWwub3BhY2l0eTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZWFzaW5nLmRhbXAodU9wYWNpdHksICd2YWx1ZScsIHRhcmdldCwgc21vb3RoVGltZSwgZGVsdGEpO1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,50 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, afterNextRender, computed, input, } from '@angular/core';
2
+ import { NgtArgs, injectStore, pick } from 'angular-three';
3
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
4
+ import { LUT3DEffect } from 'postprocessing';
5
+ import * as i0 from "@angular/core";
6
+ export class NgtpLUT {
7
+ constructor() {
8
+ this.autoEffect = injectAutoEffect();
9
+ this.store = injectStore();
10
+ this.invalidate = this.store.select('invalidate');
11
+ this.options = input({});
12
+ this.lut = pick(this.options, 'lut');
13
+ this.effect = computed(() => {
14
+ const [lut, { lut: _, ...options }] = [this.lut(), this.options()];
15
+ return new LUT3DEffect(lut, options);
16
+ });
17
+ afterNextRender(() => {
18
+ this.autoEffect(() => {
19
+ const [effect, { lut, tetrahedralInterpolation }, invalidate] = [
20
+ this.effect(),
21
+ this.options(),
22
+ this.invalidate(),
23
+ ];
24
+ if (tetrahedralInterpolation)
25
+ effect.tetrahedralInterpolation = tetrahedralInterpolation;
26
+ if (lut)
27
+ effect.lut = lut;
28
+ invalidate();
29
+ });
30
+ });
31
+ }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpLUT, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtpLUT, isStandalone: true, selector: "ngtp-lut", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
34
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
35
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpLUT, decorators: [{
38
+ type: Component,
39
+ args: [{
40
+ selector: 'ngtp-lut',
41
+ template: `
42
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
43
+ `,
44
+ imports: [NgtArgs],
45
+ standalone: true,
46
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
47
+ changeDetection: ChangeDetectionStrategy.OnPush,
48
+ }]
49
+ }], ctorParameters: () => [] });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wb3N0cHJvY2Vzc2luZy9zcmMvbGliL2VmZmVjdHMvbHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLEtBQUssR0FDTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFtQjVELE1BQU0sT0FBTyxPQUFPO0lBYW5CO1FBWlEsZUFBVSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDaEMsVUFBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVyRCxZQUFPLEdBQUcsS0FBSyxDQUFDLEVBQWdCLENBQUMsQ0FBQztRQUMxQixRQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEMsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBR0YsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDcEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxFQUFFLFVBQVUsQ0FBQyxHQUFHO29CQUMvRCxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNiLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFVBQVUsRUFBRTtpQkFDakIsQ0FBQztnQkFFRixJQUFJLHdCQUF3QjtvQkFBRSxNQUFNLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7Z0JBQ3pGLElBQUksR0FBRztvQkFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0EzQlcsT0FBTztrR0FBUCxPQUFPLDhNQVJUOztFQUVULDREQUNTLE9BQU87OzJGQUtMLE9BQU87a0JBVm5CLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgaW5qZWN0U3RvcmUsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IEJsZW5kRnVuY3Rpb24sIExVVDNERWZmZWN0IH0gZnJvbSAncG9zdHByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGludGVyZmFjZSBMVVRPcHRpb25zIHtcblx0bHV0OiBUZXh0dXJlO1xuXHRibGVuZEZ1bmN0aW9uPzogQmxlbmRGdW5jdGlvbjtcblx0dGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uPzogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1sdXQnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtcHJpbWl0aXZlICphcmdzPVwiW2VmZmVjdCgpXVwiIFtkaXNwb3NlXT1cIm51bGxcIiAvPlxuXHRgLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBMVVQge1xuXHRwcml2YXRlIGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXG5cdG9wdGlvbnMgPSBpbnB1dCh7fSBhcyBMVVRPcHRpb25zKTtcblx0cHJpdmF0ZSBsdXQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2x1dCcpO1xuXG5cdGVmZmVjdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBbbHV0LCB7IGx1dDogXywgLi4ub3B0aW9ucyB9XSA9IFt0aGlzLmx1dCgpLCB0aGlzLm9wdGlvbnMoKV07XG5cdFx0cmV0dXJuIG5ldyBMVVQzREVmZmVjdChsdXQsIG9wdGlvbnMpO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgW2VmZmVjdCwgeyBsdXQsIHRldHJhaGVkcmFsSW50ZXJwb2xhdGlvbiB9LCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdFx0XHR0aGlzLmVmZmVjdCgpLFxuXHRcdFx0XHRcdHRoaXMub3B0aW9ucygpLFxuXHRcdFx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpLFxuXHRcdFx0XHRdO1xuXG5cdFx0XHRcdGlmICh0ZXRyYWhlZHJhbEludGVycG9sYXRpb24pIGVmZmVjdC50ZXRyYWhlZHJhbEludGVycG9sYXRpb24gPSB0ZXRyYWhlZHJhbEludGVycG9sYXRpb247XG5cdFx0XHRcdGlmIChsdXQpIGVmZmVjdC5sdXQgPSBsdXQ7XG5cdFx0XHRcdGludmFsaWRhdGUoKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,39 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, inject, input } from '@angular/core';
2
+ import { NgtArgs, extend } from 'angular-three';
3
+ import { BlendFunction, NoiseEffect } from 'postprocessing';
4
+ import { NgtpEffect, NgtpEffectBlendMode, NgtpEffectHostDirective, provideDefaultEffectOptions } from '../effect';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../effect";
7
+ extend({ NoiseEffect });
8
+ export class NgtpNoise {
9
+ constructor() {
10
+ this.effect = inject(NgtpEffect, { host: true });
11
+ this.options = input({});
12
+ }
13
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpNoise, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtpNoise, isStandalone: true, selector: "ngtp-noise", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.COLOR_DODGE })], hostDirectives: [{ directive: i1.NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
15
+ <ngt-noise-effect *args="[options()]" [camera]="effect.camera()">
16
+ <ngtp-effect-blend-mode />
17
+ <ng-content />
18
+ </ngt-noise-effect>
19
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpNoise, decorators: [{
22
+ type: Component,
23
+ args: [{
24
+ selector: 'ngtp-noise',
25
+ template: `
26
+ <ngt-noise-effect *args="[options()]" [camera]="effect.camera()">
27
+ <ngtp-effect-blend-mode />
28
+ <ng-content />
29
+ </ngt-noise-effect>
30
+ `,
31
+ standalone: true,
32
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
33
+ changeDetection: ChangeDetectionStrategy.OnPush,
34
+ imports: [NgtArgs, NgtpEffectBlendMode],
35
+ hostDirectives: [NgtpEffectHostDirective],
36
+ providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.COLOR_DODGE })],
37
+ }]
38
+ }] });
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9pc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9saWIvZWZmZWN0cy9ub2lzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sV0FBVyxDQUFDOzs7QUFFbEgsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztBQW1CeEIsTUFBTSxPQUFPLFNBQVM7SUFmdEI7UUFnQkMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QyxZQUFPLEdBQUcsS0FBSyxDQUFDLEVBQStDLENBQUMsQ0FBQztLQUNqRTs4R0FIWSxTQUFTO2tHQUFULFNBQVMsbU1BRlYsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyw0SUFYNUU7Ozs7O0VBS1QsNERBSVMsT0FBTyxnRkFBRSxtQkFBbUI7OzJGQUkxQixTQUFTO2tCQWZyQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxZQUFZO29CQUN0QixRQUFRLEVBQUU7Ozs7O0VBS1Q7b0JBQ0QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDO29CQUN2QyxjQUFjLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDekMsU0FBUyxFQUFFLENBQUMsMkJBQTJCLENBQUMsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7aUJBQ3RGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgZXh0ZW5kIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBCbGVuZEZ1bmN0aW9uLCBOb2lzZUVmZmVjdCB9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nJztcbmltcG9ydCB7IE5ndHBFZmZlY3QsIE5ndHBFZmZlY3RCbGVuZE1vZGUsIE5ndHBFZmZlY3RIb3N0RGlyZWN0aXZlLCBwcm92aWRlRGVmYXVsdEVmZmVjdE9wdGlvbnMgfSBmcm9tICcuLi9lZmZlY3QnO1xuXG5leHRlbmQoeyBOb2lzZUVmZmVjdCB9KTtcblxuZXhwb3J0IHR5cGUgTm9pc2VFZmZlY3RPcHRpb25zID0gUGFydGlhbDxOb25OdWxsYWJsZTxDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIE5vaXNlRWZmZWN0PlswXT4+O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RwLW5vaXNlJyxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LW5vaXNlLWVmZmVjdCAqYXJncz1cIltvcHRpb25zKCldXCIgW2NhbWVyYV09XCJlZmZlY3QuY2FtZXJhKClcIj5cblx0XHRcdDxuZ3RwLWVmZmVjdC1ibGVuZC1tb2RlIC8+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LW5vaXNlLWVmZmVjdD5cblx0YCxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndEFyZ3MsIE5ndHBFZmZlY3RCbGVuZE1vZGVdLFxuXHRob3N0RGlyZWN0aXZlczogW05ndHBFZmZlY3RIb3N0RGlyZWN0aXZlXSxcblx0cHJvdmlkZXJzOiBbcHJvdmlkZURlZmF1bHRFZmZlY3RPcHRpb25zKHsgYmxlbmRGdW5jdGlvbjogQmxlbmRGdW5jdGlvbi5DT0xPUl9ET0RHRSB9KV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBOb2lzZSB7XG5cdGVmZmVjdCA9IGluamVjdChOZ3RwRWZmZWN0LCB7IGhvc3Q6IHRydWUgfSk7XG5cdG9wdGlvbnMgPSBpbnB1dCh7fSBhcyBPbWl0PE5vaXNlRWZmZWN0T3B0aW9ucywgJ2JsZW5kRnVuY3Rpb24nPik7XG59XG4iXX0=
@@ -0,0 +1,143 @@
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, inject, input, untracked, } from '@angular/core';
2
+ import { injectStore, NgtArgs, NgtSelection, omit, pick, resolveRef } from 'angular-three';
3
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
4
+ import { mergeInputs } from 'ngxtension/inject-inputs';
5
+ import { OutlineEffect } from 'postprocessing';
6
+ import { NgtpEffectComposer } from '../effect-composer';
7
+ import * as i0 from "@angular/core";
8
+ const defaultOptions = {
9
+ selectionLayer: 10,
10
+ };
11
+ export class NgtpOutline {
12
+ constructor() {
13
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
14
+ this.ngtSelection = inject(NgtSelection, { optional: true });
15
+ this.effectComposer = inject(NgtpEffectComposer);
16
+ this.store = injectStore();
17
+ this.invalidate = this.store.select('invalidate');
18
+ this.selection = pick(this.options, 'selection');
19
+ this.selectionLayer = pick(this.options, 'selectionLayer');
20
+ this.blendFunction = pick(this.options, 'blendFunction');
21
+ this.patternTexture = pick(this.options, 'patternTexture');
22
+ this.edgeStrength = pick(this.options, 'edgeStrength');
23
+ this.pulseSpeed = pick(this.options, 'pulseSpeed');
24
+ this.visibleEdgeColor = pick(this.options, 'visibleEdgeColor');
25
+ this.hiddenEdgeColor = pick(this.options, 'hiddenEdgeColor');
26
+ this.width = pick(this.options, 'width');
27
+ this.height = pick(this.options, 'height');
28
+ this.kernelSize = pick(this.options, 'kernelSize');
29
+ this.blur = pick(this.options, 'blur');
30
+ this.xRay = pick(this.options, 'xRay');
31
+ this.restOptions = omit(this.options, [
32
+ 'blendFunction',
33
+ 'patternTexture',
34
+ 'edgeStrength',
35
+ 'pulseSpeed',
36
+ 'visibleEdgeColor',
37
+ 'hiddenEdgeColor',
38
+ 'width',
39
+ 'height',
40
+ 'kernelSize',
41
+ 'blur',
42
+ 'xRay',
43
+ ]);
44
+ this.effect = computed(() => {
45
+ const [scene, camera, blendFunction, patternTexture, edgeStrength, pulseSpeed, visibleEdgeColor, hiddenEdgeColor, width, height, kernelSize, blur, xRay, restOptions,] = [
46
+ this.effectComposer.scene(),
47
+ this.effectComposer.camera(),
48
+ this.blendFunction(),
49
+ this.patternTexture(),
50
+ this.edgeStrength(),
51
+ this.pulseSpeed(),
52
+ this.visibleEdgeColor(),
53
+ this.hiddenEdgeColor(),
54
+ this.width(),
55
+ this.height(),
56
+ this.kernelSize(),
57
+ this.blur(),
58
+ this.xRay(),
59
+ untracked(this.restOptions),
60
+ ];
61
+ return new OutlineEffect(scene, camera, {
62
+ blendFunction,
63
+ patternTexture,
64
+ edgeStrength,
65
+ pulseSpeed,
66
+ visibleEdgeColor,
67
+ hiddenEdgeColor,
68
+ width,
69
+ height,
70
+ kernelSize,
71
+ blur,
72
+ xRay,
73
+ ...restOptions,
74
+ });
75
+ });
76
+ const autoEffect = injectAutoEffect();
77
+ afterNextRender(() => {
78
+ autoEffect(() => {
79
+ const effect = this.effect();
80
+ return () => effect.dispose();
81
+ });
82
+ autoEffect(() => {
83
+ const [effect, invalidate, selectionLayer] = [this.effect(), this.invalidate(), this.selectionLayer()];
84
+ effect.selectionLayer = selectionLayer;
85
+ invalidate();
86
+ });
87
+ autoEffect(() => {
88
+ // NOTE: we run this effect if declarative NgtSelection is not enabled
89
+ if (!this.ngtSelection) {
90
+ // NOTE: if NgtSelection is not used and selection is not provided, we throw
91
+ if (this.selection() === undefined) {
92
+ throw new Error('[NGT PostProcessing]: ngtp-outline requires selection input or use NgtSelection');
93
+ }
94
+ return this.handleSelectionChangeEffect(this.selection, this.effect, this.invalidate);
95
+ }
96
+ // NOTE: we run this effect if declarative NgtSelection is enabled
97
+ const selectionEnabled = this.ngtSelection.enabled();
98
+ if (!selectionEnabled)
99
+ return;
100
+ return this.handleSelectionChangeEffect(this.ngtSelection.selected, this.effect, this.invalidate);
101
+ });
102
+ });
103
+ }
104
+ handleSelectionChangeEffect(selected, _effect, _invalidate) {
105
+ const selection = selected();
106
+ if (!selection || selection.length === 0)
107
+ return;
108
+ const [effect, invalidate] = [_effect(), _invalidate()];
109
+ const objects = [];
110
+ for (const el of selection) {
111
+ const obj = resolveRef(el);
112
+ if (!obj)
113
+ continue;
114
+ objects.push(obj);
115
+ }
116
+ if (objects.length === 0)
117
+ return;
118
+ effect.selection.set(objects);
119
+ invalidate();
120
+ return () => {
121
+ effect.selection.clear();
122
+ invalidate();
123
+ };
124
+ }
125
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpOutline, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
126
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtpOutline, isStandalone: true, selector: "ngtp-outline", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
127
+ <ngt-primitive *args="[effect()]" />
128
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpOutline, decorators: [{
131
+ type: Component,
132
+ args: [{
133
+ selector: 'ngtp-outline',
134
+ standalone: true,
135
+ template: `
136
+ <ngt-primitive *args="[effect()]" />
137
+ `,
138
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
139
+ changeDetection: ChangeDetectionStrategy.OnPush,
140
+ imports: [NgtArgs],
141
+ }]
142
+ }], ctorParameters: () => [] });
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0bGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2xpYi9lZmZlY3RzL291dGxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsRUFFdEIsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBT3hELE1BQU0sY0FBYyxHQUF1QjtJQUMxQyxjQUFjLEVBQUUsRUFBRTtDQUNsQixDQUFDO0FBWUYsTUFBTSxPQUFPLFdBQVc7SUFxRnZCO1FBcEZBLFlBQU8sR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEUsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsbUJBQWMsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM1QyxVQUFLLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTdDLGNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM1QyxtQkFBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFdEQsa0JBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNwRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDdEQsaUJBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUMscUJBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUMxRCxvQkFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDeEQsVUFBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLFdBQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUMsU0FBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLFNBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsQyxnQkFBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3hDLGVBQWU7WUFDZixnQkFBZ0I7WUFDaEIsY0FBYztZQUNkLFlBQVk7WUFDWixrQkFBa0I7WUFDbEIsaUJBQWlCO1lBQ2pCLE9BQU87WUFDUCxRQUFRO1lBQ1IsWUFBWTtZQUNaLE1BQU07WUFDTixNQUFNO1NBQ04sQ0FBQyxDQUFDO1FBRUgsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsTUFBTSxDQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sYUFBYSxFQUNiLGNBQWMsRUFDZCxZQUFZLEVBQ1osVUFBVSxFQUNWLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsSUFBSSxFQUNKLElBQUksRUFDSixXQUFXLEVBQ1gsR0FBRztnQkFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDWixJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNiLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDWCxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUMzQixDQUFDO1lBRUYsT0FBTyxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO2dCQUN2QyxhQUFhO2dCQUNiLGNBQWM7Z0JBQ2QsWUFBWTtnQkFDWixVQUFVO2dCQUNWLGdCQUFnQjtnQkFDaEIsZUFBZTtnQkFDZixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sVUFBVTtnQkFDVixJQUFJO2dCQUNKLElBQUk7Z0JBQ0osR0FBRyxXQUFXO2FBQ2QsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFHRixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXRDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1lBRUgsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO2dCQUN2QyxVQUFVLEVBQUUsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1lBRUgsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixzRUFBc0U7Z0JBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3hCLDRFQUE0RTtvQkFDNUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUZBQWlGLENBQUMsQ0FBQztvQkFDcEcsQ0FBQztvQkFFRCxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RixDQUFDO2dCQUVELGtFQUFrRTtnQkFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyRCxJQUFJLENBQUMsZ0JBQWdCO29CQUFFLE9BQU87Z0JBQzlCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25HLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sMkJBQTJCLENBQ2xDLFFBQWtFLEVBQ2xFLE9BQTRCLEVBQzVCLFdBQTZCO1FBRTdCLE1BQU0sU0FBUyxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVqRCxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUV4RCxNQUFNLE9BQU8sR0FBZSxFQUFFLENBQUM7UUFDL0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsU0FBUztZQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFakMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsVUFBVSxFQUFFLENBQUM7UUFFYixPQUFPLEdBQUcsRUFBRTtZQUNYLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUM7SUFDSCxDQUFDOzhHQWpKVyxXQUFXO2tHQUFYLFdBQVcsa05BUGI7O0VBRVQsNERBR1MsT0FBTzs7MkZBRUwsV0FBVztrQkFWdkIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQztpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRhZnRlck5leHRSZW5kZXIsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdGNvbXB1dGVkLFxuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0U3RvcmUsIE5ndEFyZ3MsIE5ndFNlbGVjdGlvbiwgb21pdCwgcGljaywgcmVzb2x2ZVJlZiB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgT3V0bGluZUVmZmVjdCB9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0cEVmZmVjdENvbXBvc2VyIH0gZnJvbSAnLi4vZWZmZWN0LWNvbXBvc2VyJztcblxuZXhwb3J0IHR5cGUgTmd0cE91dGxpbmVPcHRpb25zID0gQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBPdXRsaW5lRWZmZWN0PlsyXSAmIHtcblx0c2VsZWN0aW9uPzogQXJyYXk8T2JqZWN0M0QgfCBFbGVtZW50UmVmPE9iamVjdDNEPj47XG5cdHNlbGVjdGlvbkxheWVyOiBudW1iZXI7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0cE91dGxpbmVPcHRpb25zID0ge1xuXHRzZWxlY3Rpb25MYXllcjogMTAsXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RwLW91dGxpbmUnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtcHJpbWl0aXZlICphcmdzPVwiW2VmZmVjdCgpXVwiIC8+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0cE91dGxpbmUge1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cblx0cHJpdmF0ZSBuZ3RTZWxlY3Rpb24gPSBpbmplY3QoTmd0U2VsZWN0aW9uLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXHRwcml2YXRlIGVmZmVjdENvbXBvc2VyID0gaW5qZWN0KE5ndHBFZmZlY3RDb21wb3Nlcik7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXG5cdHByaXZhdGUgc2VsZWN0aW9uID0gcGljayh0aGlzLm9wdGlvbnMsICdzZWxlY3Rpb24nKTtcblx0cHJpdmF0ZSBzZWxlY3Rpb25MYXllciA9IHBpY2sodGhpcy5vcHRpb25zLCAnc2VsZWN0aW9uTGF5ZXInKTtcblxuXHRwcml2YXRlIGJsZW5kRnVuY3Rpb24gPSBwaWNrKHRoaXMub3B0aW9ucywgJ2JsZW5kRnVuY3Rpb24nKTtcblx0cHJpdmF0ZSBwYXR0ZXJuVGV4dHVyZSA9IHBpY2sodGhpcy5vcHRpb25zLCAncGF0dGVyblRleHR1cmUnKTtcblx0cHJpdmF0ZSBlZGdlU3RyZW5ndGggPSBwaWNrKHRoaXMub3B0aW9ucywgJ2VkZ2VTdHJlbmd0aCcpO1xuXHRwcml2YXRlIHB1bHNlU3BlZWQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3B1bHNlU3BlZWQnKTtcblx0cHJpdmF0ZSB2aXNpYmxlRWRnZUNvbG9yID0gcGljayh0aGlzLm9wdGlvbnMsICd2aXNpYmxlRWRnZUNvbG9yJyk7XG5cdHByaXZhdGUgaGlkZGVuRWRnZUNvbG9yID0gcGljayh0aGlzLm9wdGlvbnMsICdoaWRkZW5FZGdlQ29sb3InKTtcblx0cHJpdmF0ZSB3aWR0aCA9IHBpY2sodGhpcy5vcHRpb25zLCAnd2lkdGgnKTtcblx0cHJpdmF0ZSBoZWlnaHQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2hlaWdodCcpO1xuXHRwcml2YXRlIGtlcm5lbFNpemUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2tlcm5lbFNpemUnKTtcblx0cHJpdmF0ZSBibHVyID0gcGljayh0aGlzLm9wdGlvbnMsICdibHVyJyk7XG5cdHByaXZhdGUgeFJheSA9IHBpY2sodGhpcy5vcHRpb25zLCAneFJheScpO1xuXHRwcml2YXRlIHJlc3RPcHRpb25zID0gb21pdCh0aGlzLm9wdGlvbnMsIFtcblx0XHQnYmxlbmRGdW5jdGlvbicsXG5cdFx0J3BhdHRlcm5UZXh0dXJlJyxcblx0XHQnZWRnZVN0cmVuZ3RoJyxcblx0XHQncHVsc2VTcGVlZCcsXG5cdFx0J3Zpc2libGVFZGdlQ29sb3InLFxuXHRcdCdoaWRkZW5FZGdlQ29sb3InLFxuXHRcdCd3aWR0aCcsXG5cdFx0J2hlaWdodCcsXG5cdFx0J2tlcm5lbFNpemUnLFxuXHRcdCdibHVyJyxcblx0XHQneFJheScsXG5cdF0pO1xuXG5cdGVmZmVjdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBbXG5cdFx0XHRzY2VuZSxcblx0XHRcdGNhbWVyYSxcblx0XHRcdGJsZW5kRnVuY3Rpb24sXG5cdFx0XHRwYXR0ZXJuVGV4dHVyZSxcblx0XHRcdGVkZ2VTdHJlbmd0aCxcblx0XHRcdHB1bHNlU3BlZWQsXG5cdFx0XHR2aXNpYmxlRWRnZUNvbG9yLFxuXHRcdFx0aGlkZGVuRWRnZUNvbG9yLFxuXHRcdFx0d2lkdGgsXG5cdFx0XHRoZWlnaHQsXG5cdFx0XHRrZXJuZWxTaXplLFxuXHRcdFx0Ymx1cixcblx0XHRcdHhSYXksXG5cdFx0XHRyZXN0T3B0aW9ucyxcblx0XHRdID0gW1xuXHRcdFx0dGhpcy5lZmZlY3RDb21wb3Nlci5zY2VuZSgpLFxuXHRcdFx0dGhpcy5lZmZlY3RDb21wb3Nlci5jYW1lcmEoKSxcblx0XHRcdHRoaXMuYmxlbmRGdW5jdGlvbigpLFxuXHRcdFx0dGhpcy5wYXR0ZXJuVGV4dHVyZSgpLFxuXHRcdFx0dGhpcy5lZGdlU3RyZW5ndGgoKSxcblx0XHRcdHRoaXMucHVsc2VTcGVlZCgpLFxuXHRcdFx0dGhpcy52aXNpYmxlRWRnZUNvbG9yKCksXG5cdFx0XHR0aGlzLmhpZGRlbkVkZ2VDb2xvcigpLFxuXHRcdFx0dGhpcy53aWR0aCgpLFxuXHRcdFx0dGhpcy5oZWlnaHQoKSxcblx0XHRcdHRoaXMua2VybmVsU2l6ZSgpLFxuXHRcdFx0dGhpcy5ibHVyKCksXG5cdFx0XHR0aGlzLnhSYXkoKSxcblx0XHRcdHVudHJhY2tlZCh0aGlzLnJlc3RPcHRpb25zKSxcblx0XHRdO1xuXG5cdFx0cmV0dXJuIG5ldyBPdXRsaW5lRWZmZWN0KHNjZW5lLCBjYW1lcmEsIHtcblx0XHRcdGJsZW5kRnVuY3Rpb24sXG5cdFx0XHRwYXR0ZXJuVGV4dHVyZSxcblx0XHRcdGVkZ2VTdHJlbmd0aCxcblx0XHRcdHB1bHNlU3BlZWQsXG5cdFx0XHR2aXNpYmxlRWRnZUNvbG9yLFxuXHRcdFx0aGlkZGVuRWRnZUNvbG9yLFxuXHRcdFx0d2lkdGgsXG5cdFx0XHRoZWlnaHQsXG5cdFx0XHRrZXJuZWxTaXplLFxuXHRcdFx0Ymx1cixcblx0XHRcdHhSYXksXG5cdFx0XHQuLi5yZXN0T3B0aW9ucyxcblx0XHR9KTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgZWZmZWN0ID0gdGhpcy5lZmZlY3QoKTtcblx0XHRcdFx0cmV0dXJuICgpID0+IGVmZmVjdC5kaXNwb3NlKCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0YXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IFtlZmZlY3QsIGludmFsaWRhdGUsIHNlbGVjdGlvbkxheWVyXSA9IFt0aGlzLmVmZmVjdCgpLCB0aGlzLmludmFsaWRhdGUoKSwgdGhpcy5zZWxlY3Rpb25MYXllcigpXTtcblx0XHRcdFx0ZWZmZWN0LnNlbGVjdGlvbkxheWVyID0gc2VsZWN0aW9uTGF5ZXI7XG5cdFx0XHRcdGludmFsaWRhdGUoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Ly8gTk9URTogd2UgcnVuIHRoaXMgZWZmZWN0IGlmIGRlY2xhcmF0aXZlIE5ndFNlbGVjdGlvbiBpcyBub3QgZW5hYmxlZFxuXHRcdFx0XHRpZiAoIXRoaXMubmd0U2VsZWN0aW9uKSB7XG5cdFx0XHRcdFx0Ly8gTk9URTogaWYgTmd0U2VsZWN0aW9uIGlzIG5vdCB1c2VkIGFuZCBzZWxlY3Rpb24gaXMgbm90IHByb3ZpZGVkLCB3ZSB0aHJvd1xuXHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGlvbigpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignW05HVCBQb3N0UHJvY2Vzc2luZ106IG5ndHAtb3V0bGluZSByZXF1aXJlcyBzZWxlY3Rpb24gaW5wdXQgb3IgdXNlIE5ndFNlbGVjdGlvbicpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZVNlbGVjdGlvbkNoYW5nZUVmZmVjdCh0aGlzLnNlbGVjdGlvbiwgdGhpcy5lZmZlY3QsIHRoaXMuaW52YWxpZGF0ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBOT1RFOiB3ZSBydW4gdGhpcyBlZmZlY3QgaWYgZGVjbGFyYXRpdmUgTmd0U2VsZWN0aW9uIGlzIGVuYWJsZWRcblx0XHRcdFx0Y29uc3Qgc2VsZWN0aW9uRW5hYmxlZCA9IHRoaXMubmd0U2VsZWN0aW9uLmVuYWJsZWQoKTtcblx0XHRcdFx0aWYgKCFzZWxlY3Rpb25FbmFibGVkKSByZXR1cm47XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZVNlbGVjdGlvbkNoYW5nZUVmZmVjdCh0aGlzLm5ndFNlbGVjdGlvbi5zZWxlY3RlZCwgdGhpcy5lZmZlY3QsIHRoaXMuaW52YWxpZGF0ZSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlRWZmZWN0KFxuXHRcdHNlbGVjdGVkOiAoKSA9PiBBcnJheTxPYmplY3QzRCB8IEVsZW1lbnRSZWY8T2JqZWN0M0Q+PiB8IHVuZGVmaW5lZCxcblx0XHRfZWZmZWN0OiAoKSA9PiBPdXRsaW5lRWZmZWN0LFxuXHRcdF9pbnZhbGlkYXRlOiAoKSA9PiAoKSA9PiB2b2lkLFxuXHQpIHtcblx0XHRjb25zdCBzZWxlY3Rpb24gPSBzZWxlY3RlZCgpO1xuXHRcdGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5sZW5ndGggPT09IDApIHJldHVybjtcblxuXHRcdGNvbnN0IFtlZmZlY3QsIGludmFsaWRhdGVdID0gW19lZmZlY3QoKSwgX2ludmFsaWRhdGUoKV07XG5cblx0XHRjb25zdCBvYmplY3RzOiBPYmplY3QzRFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBlbCBvZiBzZWxlY3Rpb24pIHtcblx0XHRcdGNvbnN0IG9iaiA9IHJlc29sdmVSZWYoZWwpO1xuXHRcdFx0aWYgKCFvYmopIGNvbnRpbnVlO1xuXHRcdFx0b2JqZWN0cy5wdXNoKG9iaik7XG5cdFx0fVxuXG5cdFx0aWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cblx0XHRlZmZlY3Quc2VsZWN0aW9uLnNldChvYmplY3RzKTtcblx0XHRpbnZhbGlkYXRlKCk7XG5cblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0ZWZmZWN0LnNlbGVjdGlvbi5jbGVhcigpO1xuXHRcdFx0aW52YWxpZGF0ZSgpO1xuXHRcdH07XG5cdH1cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
2
+ import { NgtArgs, pick } from 'angular-three';
3
+ import { mergeInputs } from 'ngxtension/inject-inputs';
4
+ import { PixelationEffect } from 'postprocessing';
5
+ import * as i0 from "@angular/core";
6
+ export class NgtpPixelation {
7
+ constructor() {
8
+ this.options = input({ granularity: 5 }, { transform: mergeInputs({ granularity: 5 }) });
9
+ this.granularity = pick(this.options, 'granularity');
10
+ this.effect = computed(() => new PixelationEffect(this.granularity()));
11
+ }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpPixelation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtpPixelation, isStandalone: true, selector: "ngtp-pixelation", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
14
+ <ngt-primitive *args="[effect()]" />
15
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtpPixelation, decorators: [{
18
+ type: Component,
19
+ args: [{
20
+ selector: 'ngtp-pixelation',
21
+ template: `
22
+ <ngt-primitive *args="[effect()]" />
23
+ `,
24
+ standalone: true,
25
+ changeDetection: ChangeDetectionStrategy.OnPush,
26
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
27
+ imports: [NgtArgs],
28
+ }]
29
+ }] });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl4ZWxhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2xpYi9lZmZlY3RzL3BpeGVsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFlbEQsTUFBTSxPQUFPLGNBQWM7SUFWM0I7UUFXQyxZQUFPLEdBQUcsS0FBSyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBdUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakcsZ0JBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV4RCxXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsRTs4R0FMWSxjQUFjO2tHQUFkLGNBQWMscU5BUmhCOztFQUVULDREQUlTLE9BQU87OzJGQUVMLGNBQWM7a0JBVjFCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsUUFBUSxFQUFFOztFQUVUO29CQUNELFVBQVUsRUFBRSxJQUFJO29CQUNoQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQztpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IFBpeGVsYXRpb25FZmZlY3QgfSBmcm9tICdwb3N0cHJvY2Vzc2luZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxhdGlvbk9wdGlvbnMge1xuXHRncmFudWxhcml0eTogbnVtYmVyO1xufVxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1waXhlbGF0aW9uJyxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZSAqYXJncz1cIltlZmZlY3QoKV1cIiAvPlxuXHRgLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBQaXhlbGF0aW9uIHtcblx0b3B0aW9ucyA9IGlucHV0KHsgZ3JhbnVsYXJpdHk6IDUgfSBhcyBQaXhlbGF0aW9uT3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKHsgZ3JhbnVsYXJpdHk6IDUgfSkgfSk7XG5cdHByaXZhdGUgZ3JhbnVsYXJpdHkgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2dyYW51bGFyaXR5Jyk7XG5cblx0ZWZmZWN0ID0gY29tcHV0ZWQoKCkgPT4gbmV3IFBpeGVsYXRpb25FZmZlY3QodGhpcy5ncmFudWxhcml0eSgpKSk7XG59XG4iXX0=