@wolsok/thanos 3.0.1 → 16.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.
@@ -0,0 +1,257 @@
1
+ import { Inject, Injectable, NgZone } from '@angular/core';
2
+ import { default as html2canvas } from 'html2canvas';
3
+ import { animationFrameScheduler, from, interval, map, switchMap, takeWhile, tap, timeInterval, } from 'rxjs';
4
+ import { SimplexNoise } from './simplex-noise';
5
+ import { WS_THANOS_OPTIONS_TOKEN } from './ws-thanos-options.token';
6
+ import * as i0 from "@angular/core";
7
+ const PARTICLE_BYTE_LENGTH = 10;
8
+ const MIN_PARTICLE_ALPHA = ~~(255 * 0.01);
9
+ const HEIGHT_SCALE = 5;
10
+ const WIDTH_SCALE = 2;
11
+ const FLOW_FIELD_RES = 0.05;
12
+ class WsThanosService {
13
+ thanosOptions;
14
+ ngZone;
15
+ constructor(thanosOptions, ngZone) {
16
+ this.thanosOptions = thanosOptions;
17
+ this.ngZone = ngZone;
18
+ }
19
+ static getParticleIndicesForBase(base) {
20
+ return {
21
+ x: base,
22
+ y: base + 1,
23
+ dx: base + 2,
24
+ dy: base + 3,
25
+ ax: base + 4,
26
+ ay: base + 5,
27
+ r: base + 6,
28
+ g: base + 7,
29
+ b: base + 8,
30
+ a: base + 9,
31
+ };
32
+ }
33
+ static getColorIndicesForCoord(x, y, width) {
34
+ const red = y * (width * 4) + x * 4;
35
+ return { r: red, g: red + 1, b: red + 2, a: red + 3 };
36
+ }
37
+ static updateParticles({ seed, noise, particlesData, thanosOptions, animationState, }) {
38
+ const { deltaTSec, animationT, maxWidth, maxHeight } = animationState;
39
+ const { particleAcceleration } = thanosOptions;
40
+ const { particles, maxParticleX, minParticleY } = particlesData;
41
+ // the time is used to calculate the vaporization front.
42
+ const time = Math.sin(animationT * (Math.PI / 2)) * 1.1;
43
+ const startAccelerateX = maxParticleX - time * maxParticleX;
44
+ const startAccelerateY = time * (maxHeight - minParticleY) + minParticleY;
45
+ const lengthY = maxHeight - startAccelerateY;
46
+ const accelerateRadiusPow = startAccelerateX * startAccelerateX + lengthY * lengthY;
47
+ for (let i = 0; i < particles.length; i += PARTICLE_BYTE_LENGTH) {
48
+ const { x, y, dx, dy, ax, ay, a } = WsThanosService.getParticleIndicesForBase(i);
49
+ const particleX = particles[x];
50
+ const particleY = particles[y];
51
+ // only update particles that are inside view and visible
52
+ if (particleX > maxWidth ||
53
+ particleX < 0 ||
54
+ particleY > maxHeight ||
55
+ particleY < 0 ||
56
+ particles[a] < MIN_PARTICLE_ALPHA) {
57
+ continue;
58
+ }
59
+ if (!(Math.abs(particles[ax]) > 0 || Math.abs(particles[ay]) > 0)) {
60
+ let pYLength = maxHeight - particleY;
61
+ let pXLength = particleX;
62
+ // we calculate some random looking numbers and functions to have nice looking vaporizing front of particles
63
+ // todo consider to use noise;
64
+ pXLength += Math.tan((pXLength / 20.12) * time + seed) * 0.5;
65
+ pXLength += (particleX % deltaTSec) * 0.5;
66
+ pXLength += Math.sin((pXLength / 30 + 723.394) * time + seed * 12.5) * 11;
67
+ pYLength += Math.tan((pYLength / 0.45) * time + seed * 1.5) * 0.5;
68
+ pYLength += Math.cos((pYLength / 100 + 2323.234) * time + seed * 456.1) * 23;
69
+ const pLength = pXLength * pXLength + pYLength * pYLength;
70
+ if (pLength > accelerateRadiusPow) {
71
+ particles[ax] = Math.random();
72
+ particles[ay] = Math.random() * -1;
73
+ }
74
+ }
75
+ else {
76
+ // use noise to flow along velocity field
77
+ const flowFieldAcc = WsThanosService.getXYFromFlowField(noise, seed, particleX, particleY);
78
+ const accelerationX = flowFieldAcc[0];
79
+ const accelerationY = flowFieldAcc[1];
80
+ particles[ax] += accelerationX;
81
+ particles[ay] += accelerationY;
82
+ }
83
+ // * Math.pow(1 + animationT, 4)
84
+ particles[dx] += particles[ax] * particleAcceleration * deltaTSec;
85
+ particles[dy] += particles[ay] * particleAcceleration * deltaTSec;
86
+ particles[x] += particles[dx] * deltaTSec;
87
+ particles[y] += particles[dy] * deltaTSec;
88
+ // fade particle out ( very late);
89
+ particles[a] *= 1 - Math.pow(animationT, 15); // 255 - Math.sqrt(particles[dx] * particles[dx] + particles[dy] * particles[dy]) / 1.2;
90
+ }
91
+ }
92
+ static drawParticles(drawCtx, particles) {
93
+ const { width, height } = drawCtx.canvas;
94
+ drawCtx.clearRect(0, 0, width, height);
95
+ const image = drawCtx.getImageData(0, 0, width, height);
96
+ const imageData = image.data;
97
+ for (let i = 0; i < particles.length; i += PARTICLE_BYTE_LENGTH) {
98
+ const particleX = particles[i];
99
+ const particleY = particles[i + 1];
100
+ const pI = WsThanosService.getParticleIndicesForBase(i);
101
+ if (particleX > width ||
102
+ particleX < 0 ||
103
+ particleY > height ||
104
+ particleY < 0 ||
105
+ particles[pI.a] < MIN_PARTICLE_ALPHA) {
106
+ continue;
107
+ }
108
+ const { r, g, b, a } = WsThanosService.getColorIndicesForCoord(~~particles[pI.x], ~~particles[pI.y], width);
109
+ imageData[r] = ~~particles[pI.r];
110
+ imageData[g] = ~~particles[pI.g];
111
+ imageData[b] = ~~particles[pI.b];
112
+ imageData[a] = ~~particles[pI.a];
113
+ }
114
+ drawCtx.putImageData(image, 0, 0);
115
+ }
116
+ static prepareCanvasForVaporize(divCanvas, maxParticleCount) {
117
+ const { width, height } = divCanvas;
118
+ // scale result canvas to have more room to draw particles while vaporizing;
119
+ const resultHeight = height * HEIGHT_SCALE;
120
+ const resultWidth = width * WIDTH_SCALE;
121
+ const resultCanvas = document.createElement('canvas');
122
+ resultCanvas.height = resultHeight;
123
+ resultCanvas.width = resultWidth;
124
+ const imageData = divCanvas.getContext('2d')?.getImageData(0, 0, width, height);
125
+ if (imageData == null) {
126
+ throw new Error('Could not get image data from canvas');
127
+ }
128
+ const particlesData = WsThanosService.createParticlesForImageData(imageData, maxParticleCount, resultHeight);
129
+ return { resultCanvas, particlesData };
130
+ }
131
+ static createParticlesForImageData(imageData, maxParticleCount, resultHeight) {
132
+ const { width, height } = imageData;
133
+ let particleCandidates = 0;
134
+ let particleCount = 0;
135
+ const particleCandiatesList = [];
136
+ for (let y = 0; y < height; y++) {
137
+ for (let x = 0; x < width; x++) {
138
+ const { a } = WsThanosService.getColorIndicesForCoord(x, y, width);
139
+ if (imageData.data[a] >= MIN_PARTICLE_ALPHA) {
140
+ particleCandidates++;
141
+ particleCandiatesList.push({ x, y });
142
+ }
143
+ }
144
+ }
145
+ const maxNumParticles = Math.min(particleCandidates, maxParticleCount);
146
+ const particles = new Float32Array(Float32Array.BYTES_PER_ELEMENT * maxNumParticles * PARTICLE_BYTE_LENGTH);
147
+ let maxParticleX = 0;
148
+ let minParticleY = resultHeight;
149
+ while (particleCount < maxNumParticles) {
150
+ // select random index from candiates
151
+ const index = ~~(Math.random() * particleCandiatesList.length);
152
+ const { x, y } = particleCandiatesList[index];
153
+ // overwrite index with last element to prevent double selection of particles
154
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
155
+ particleCandiatesList[index] = particleCandiatesList.pop();
156
+ maxParticleX = Math.max(maxParticleX, x);
157
+ minParticleY = Math.min(minParticleY, y);
158
+ const { dx, dy, ax, ay, r, g, b, a, ...xy } = WsThanosService.getParticleIndicesForBase(particleCount * PARTICLE_BYTE_LENGTH);
159
+ particles[xy.x] = x;
160
+ particles[xy.y] = y + resultHeight - height;
161
+ particles[dx] = 0;
162
+ particles[dy] = 0;
163
+ particles[ax] = 0;
164
+ particles[ay] = 0;
165
+ const indicesImage = WsThanosService.getColorIndicesForCoord(x, y, width);
166
+ particles[r] = imageData.data[indicesImage.r];
167
+ particles[g] = imageData.data[indicesImage.g];
168
+ particles[b] = imageData.data[indicesImage.b];
169
+ particles[a] = imageData.data[indicesImage.a];
170
+ particleCount++;
171
+ }
172
+ return { particles, maxParticleX, minParticleY };
173
+ }
174
+ static getXYFromFlowField(noise, seed, x, y) {
175
+ const sampleX = noise.scaled3D(x, y, seed + 33.23, FLOW_FIELD_RES);
176
+ const sampleY = noise.scaled3D(x, seed / 13.23, y, FLOW_FIELD_RES) * -1;
177
+ return [sampleX, sampleY];
178
+ }
179
+ /**
180
+ * start the vaporize-effect.
181
+ *
182
+ * It's running outside the ngZone.
183
+ */
184
+ vaporize(elem) {
185
+ return this.ngZone.runOutsideAngular(() => this.vaporizeIntern(elem));
186
+ }
187
+ vaporizeIntern(elem) {
188
+ elem.style.opacity = elem.style.opacity || '1';
189
+ elem.style.transition = `opacity ${Math.floor(this.thanosOptions.animationLength * 0.8)}ms ease-out`;
190
+ const noise = new SimplexNoise({ frequency: 0.01, min: 0 });
191
+ const seed = new Date().getDate() * Math.random();
192
+ const html2CanvasPromise = html2canvas(elem, {
193
+ backgroundColor: null,
194
+ scale: 1,
195
+ allowTaint: true,
196
+ windowHeight: window.innerHeight,
197
+ windowWidth: window.innerWidth,
198
+ scrollY: -window.scrollY,
199
+ });
200
+ return from(html2CanvasPromise).pipe(map((canvasFromHtmlElem) => {
201
+ const canvasAndParticles = WsThanosService.prepareCanvasForVaporize(canvasFromHtmlElem, this.thanosOptions.maxParticleCount);
202
+ const { resultCanvas } = canvasAndParticles;
203
+ if (elem.parentElement) {
204
+ elem.parentElement.style.position = elem.parentElement.style.position || 'relative';
205
+ }
206
+ resultCanvas.style.position = 'absolute';
207
+ resultCanvas.style.left = 0 + 'px';
208
+ resultCanvas.style.top = '-' + elem.getBoundingClientRect().height * (HEIGHT_SCALE - 1) + 'px';
209
+ resultCanvas.style.zIndex = '2000';
210
+ resultCanvas.style.pointerEvents = 'none';
211
+ elem.insertAdjacentElement('beforebegin', resultCanvas);
212
+ // this should start the transition above defined
213
+ elem.style.opacity = '0';
214
+ return canvasAndParticles;
215
+ }), switchMap(({ resultCanvas, particlesData }) => {
216
+ let time = 0;
217
+ const { animationLength, maxParticleCount, particleAcceleration } = this.thanosOptions;
218
+ return interval(1000 / 60, animationFrameScheduler).pipe(timeInterval(), tap((deltaT) => (time += deltaT.interval)), map((deltaT) => ({
219
+ deltaTSec: deltaT.interval / 1000,
220
+ animationT: time / animationLength,
221
+ maxWidth: resultCanvas.width,
222
+ maxHeight: resultCanvas.height,
223
+ })), tap((animationState) => {
224
+ WsThanosService.updateParticles({
225
+ particlesData,
226
+ animationState,
227
+ thanosOptions: {
228
+ animationLength,
229
+ maxParticleCount,
230
+ particleAcceleration,
231
+ },
232
+ noise,
233
+ seed,
234
+ });
235
+ const context = resultCanvas.getContext('2d');
236
+ if (context) {
237
+ WsThanosService.drawParticles(context, particlesData.particles);
238
+ }
239
+ }), takeWhile((animationState) => animationState.animationT <= 1), tap({
240
+ complete: () => {
241
+ return resultCanvas.remove();
242
+ },
243
+ }));
244
+ }));
245
+ }
246
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: WsThanosService, deps: [{ token: WS_THANOS_OPTIONS_TOKEN }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
247
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: WsThanosService, providedIn: 'root' });
248
+ }
249
+ export { WsThanosService };
250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: WsThanosService, decorators: [{
251
+ type: Injectable,
252
+ args: [{ providedIn: 'root' }]
253
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
254
+ type: Inject,
255
+ args: [WS_THANOS_OPTIONS_TOKEN]
256
+ }] }, { type: i0.NgZone }]; } });
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGhhbm9zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3B1YmxpYy93cy10aGFub3Mvc3JjL2xpYi93cy10aGFub3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixJQUFJLEVBQ0osUUFBUSxFQUNSLEdBQUcsRUFFSCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsRUFDSCxZQUFZLEdBQ2IsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBR3BFLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBb0M1QixNQUNhLGVBQWU7SUFHaEI7SUFDQTtJQUhWLFlBRVUsYUFBOEIsRUFDOUIsTUFBYztRQURkLGtCQUFhLEdBQWIsYUFBYSxDQUFpQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ3JCLENBQUM7SUFFSSxNQUFNLENBQUMseUJBQXlCLENBQUMsSUFBWTtRQUNuRCxPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUk7WUFDUCxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUM7WUFDWCxFQUFFLEVBQUUsSUFBSSxH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O3dCQUNmLGdCQUFnQjt3QkFDaEIsb0JBQW9CO3FCQUNyQjtvQkFDRCxLQUFLO29CQUNMLElBQUk7aUJBQ0wsQ0FBQyxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLElBQUksT0FBTyxFQUFFO29CQUNYLGVBQWUsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDakU7WUFDSCxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEVBQzdELEdBQUcsQ0FBQztnQkFDRixRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUNiLE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMvQixDQUFDO2FBQ0YsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzt1R0E5U1UsZUFBZSxrQkFFaEIsdUJBQXVCOzJHQUZ0QixlQUFlLGNBREYsTUFBTTs7U0FDbkIsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBRzdCLE1BQU07MkJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZGVmYXVsdCBhcyBodG1sMmNhbnZhcyB9IGZyb20gJ2h0bWwyY2FudmFzJztcbmltcG9ydCB7XG4gIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLFxuICBmcm9tLFxuICBpbnRlcnZhbCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBzd2l0Y2hNYXAsXG4gIHRha2VXaGlsZSxcbiAgdGFwLFxuICB0aW1lSW50ZXJ2YWwsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2ltcGxleE5vaXNlIH0gZnJvbSAnLi9zaW1wbGV4LW5vaXNlJztcbmltcG9ydCB7IFdTX1RIQU5PU19PUFRJT05TX1RPS0VOIH0gZnJvbSAnLi93cy10aGFub3Mtb3B0aW9ucy50b2tlbic7XG5pbXBvcnQgdHlwZSB7IFdzVGhhbm9zT3B0aW9ucyB9IGZyb20gJy4vd3MtdGhhbm9zLm9wdGlvbnMnO1xuXG5jb25zdCBQQVJUSUNMRV9CWVRFX0xFTkdUSCA9IDEwO1xuY29uc3QgTUlOX1BBUlRJQ0xFX0FMUEhBID0gfn4oMjU1ICogMC4wMSk7XG5jb25zdCBIRUlHSFRfU0NBTEUgPSA1O1xuY29uc3QgV0lEVEhfU0NBTEUgPSAyO1xuY29uc3QgRkxPV19GSUVMRF9SRVMgPSAwLjA1O1xuXG5pbnRlcmZhY2UgUGFydGljbGVzRGF0YSB7XG4gIHBhcnRpY2xlczogRmxvYXQzMkFycmF5O1xuICBtYXhQYXJ0aWNsZVg6IG51bWJlcjtcbiAgbWluUGFydGljbGVZOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBBbmltYXRpb25TdGF0ZSB7XG4gIGRlbHRhVFNlYzogbnVtYmVyO1xuICBhbmltYXRpb25UOiBudW1iZXI7XG4gIG1heFdpZHRoOiBudW1iZXI7XG4gIG1heEhlaWdodDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVXBkYXRlUGFydGljbGVQYXJhbXMge1xuICBwYXJ0aWNsZXNEYXRhOiBQYXJ0aWNsZXNEYXRhO1xuICBhbmltYXRpb25TdGF0ZTogQW5pbWF0aW9uU3RhdGU7XG4gIHRoYW5vc09wdGlvbnM6IFdzVGhhbm9zT3B0aW9ucztcbiAgbm9pc2U6IFNpbXBsZXhOb2lzZTtcbiAgc2VlZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUGFydGljbGVJbmRpY2VzIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGR4OiBudW1iZXI7XG4gIGR5OiBudW1iZXI7XG4gIGF4OiBudW1iZXI7XG4gIGF5OiBudW1iZXI7XG4gIHI6IG51bWJlcjtcbiAgZzogbnVtYmVyO1xuICBiOiBudW1iZXI7XG4gIGE6IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBXc1RoYW5vc1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFdTX1RIQU5PU19PUFRJT05TX1RPS0VOKVxuICAgIHByaXZhdGUgdGhhbm9zT3B0aW9uczogV3NUaGFub3NPcHRpb25zLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFBhcnRpY2xlSW5kaWNlc0ZvckJhc2UoYmFzZTogbnVtYmVyKTogUGFydGljbGVJbmRpY2VzIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogYmFzZSxcbiAgICAgIHk6IGJhc2UgKyAxLFxuICAgICAgZHg6IGJhc2UgKyAyLFxuICAgICAgZHk6IGJhc2UgKyAzLFxuICAgICAgYXg6IGJhc2UgKyA0LFxuICAgICAgYXk6IGJhc2UgKyA1LFxuICAgICAgcjogYmFzZSArIDYsXG4gICAgICBnOiBiYXNlICsgNyxcbiAgICAgIGI6IGJhc2UgKyA4LFxuICAgICAgYTogYmFzZSArIDksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldENvbG9ySW5kaWNlc0ZvckNvb3JkKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgd2lkdGg6IG51bWJlclxuICApOiB7IGE6IG51bWJlcjsgcjogbnVtYmVyOyBiOiBudW1iZXI7IGc6IG51bWJlciB9IHtcbiAgICBjb25zdCByZWQgPSB5ICogKHdpZHRoICogNCkgKyB4ICogNDtcbiAgICByZXR1cm4geyByOiByZWQsIGc6IHJlZCArIDEsIGI6IHJlZCArIDIsIGE6IHJlZCArIDMgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZVBhcnRpY2xlcyh7XG4gICAgc2VlZCxcbiAgICBub2lzZSxcbiAgICBwYXJ0aWNsZXNEYXRhLFxuICAgIHRoYW5vc09wdGlvbnMsXG4gICAgYW5pbWF0aW9uU3RhdGUsXG4gIH06IFVwZGF0ZVBhcnRpY2xlUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBkZWx0YVRTZWMsIGFuaW1hdGlvblQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IGFuaW1hdGlvblN0YXRlO1xuICAgIGNvbnN0IHsgcGFydGljbGVBY2NlbGVyYXRpb24gfSA9IHRoYW5vc09wdGlvbnM7XG4gICAgY29uc3QgeyBwYXJ0aWNsZXMsIG1heFBhcnRpY2xlWCwgbWluUGFydGljbGVZIH0gPSBwYXJ0aWNsZXNEYXRhO1xuXG4gICAgLy8gdGhlIHRpbWUgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZhcG9yaXphdGlvbiBmcm9udC5cbiAgICBjb25zdCB0aW1lID0gTWF0aC5zaW4oYW5pbWF0aW9uVCAqIChNYXRoLlBJIC8gMikpICogMS4xO1xuXG4gICAgY29uc3Qgc3RhcnRBY2NlbGVyYXRlWCA9IG1heFBhcnRpY2xlWCAtIHRpbWUgKiBtYXhQYXJ0aWNsZVg7XG4gICAgY29uc3Qgc3RhcnRBY2NlbGVyYXRlWSA9IHRpbWUgKiAobWF4SGVpZ2h0IC0gbWluUGFydGljbGVZKSArIG1pblBhcnRpY2xlWTtcblxuICAgIGNvbnN0IGxlbmd0aFkgPSBtYXhIZWlnaHQgLSBzdGFydEFjY2VsZXJhdGVZO1xuICAgIGNvbnN0IGFjY2VsZXJhdGVSYWRpdXNQb3cgPSBzdGFydEFjY2VsZXJhdGVYICogc3RhcnRBY2NlbGVyYXRlWCArIGxlbmd0aFkgKiBsZW5ndGhZO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0aWNsZXMubGVuZ3RoOyBpICs9IFBBUlRJQ0xFX0JZVEVfTEVOR1RIKSB7XG4gICAgICBjb25zdCB7IHgsIHksIGR4LCBkeSwgYXgsIGF5LCBhIH0gPSBXc1RoYW5vc1NlcnZpY2UuZ2V0UGFydGljbGVJbmRpY2VzRm9yQmFzZShpKTtcbiAgICAgIGNvbnN0IHBhcnRpY2xlWCA9IHBhcnRpY2xlc1t4XTtcbiAgICAgIGNvbnN0IHBhcnRpY2xlWSA9IHBhcnRpY2xlc1t5XTtcblxuICAgICAgLy8gb25seSB1cGRhdGUgcGFydGljbGVzIHRoYXQgYXJlIGluc2lkZSB2aWV3IGFuZCB2aXNpYmxlXG4gICAgICBpZiAoXG4gICAgICAgIHBhcnRpY2xlWCA+IG1heFdpZHRoIHx8XG4gICAgICAgIHBhcnRpY2xlWCA8IDAgfHxcbiAgICAgICAgcGFydGljbGVZID4gbWF4SGVpZ2h0IHx8XG4gICAgICAgIHBhcnRpY2xlWSA8IDAgfHxcbiAgICAgICAgcGFydGljbGVzW2FdIDwgTUlOX1BBUlRJQ0xFX0FMUEhBXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghKE1hdGguYWJzKHBhcnRpY2xlc1theF0pID4gMCB8fCBNYXRoLmFicyhwYXJ0aWNsZXNbYXldKSA+IDApKSB7XG4gICAgICAgIGxldCBwWUxlbmd0aCA9IG1heEhlaWdodCAtIHBhcnRpY2xlWTtcbiAgICAgICAgbGV0IHBYTGVuZ3RoID0gcGFydGljbGVYO1xuXG4gICAgICAgIC8vIHdlIGNhbGN1bGF0ZSBzb21lIHJhbmRvbSBsb29raW5nIG51bWJlcnMgYW5kIGZ1bmN0aW9ucyB0byBoYXZlIG5pY2UgbG9va2luZyB2YXBvcml6aW5nIGZyb250IG9mIHBhcnRpY2xlc1xuICAgICAgICAvLyB0b2RvIGNvbnNpZGVyIHRvIHVzZSBub2lzZTtcbiAgICAgICAgcFhMZW5ndGggKz0gTWF0aC50YW4oKHBYTGVuZ3RoIC8gMjAuMTIpICogdGltZSArIHNlZWQpICogMC41O1xuICAgICAgICBwWExlbmd0aCArPSAocGFydGljbGVYICUgZGVsdGFUU2VjKSAqIDAuNTtcbiAgICAgICAgcFhMZW5ndGggKz0gTWF0aC5zaW4oKHBYTGVuZ3RoIC8gMzAgKyA3MjMuMzk0KSAqIHRpbWUgKyBzZWVkICogMTIuNSkgKiAxMTtcbiAgICAgICAgcFlMZW5ndGggKz0gTWF0aC50YW4oKHBZTGVuZ3RoIC8gMC40NSkgKiB0aW1lICsgc2VlZCAqIDEuNSkgKiAwLjU7XG4gICAgICAgIHBZTGVuZ3RoICs9IE1hdGguY29zKChwWUxlbmd0aCAvIDEwMCArIDIzMjMuMjM0KSAqIHRpbWUgKyBzZWVkICogNDU2LjEpICogMjM7XG5cbiAgICAgICAgY29uc3QgcExlbmd0aCA9IHBYTGVuZ3RoICogcFhMZW5ndGggKyBwWUxlbmd0aCAqIHBZTGVuZ3RoO1xuICAgICAgICBpZiAocExlbmd0aCA+IGFjY2VsZXJhdGVSYWRpdXNQb3cpIHtcbiAgICAgICAgICBwYXJ0aWNsZXNbYXhdID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgICBwYXJ0aWNsZXNbYXldID0gTWF0aC5yYW5kb20oKSAqIC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2Ugbm9pc2UgdG8gZmxvdyBhbG9uZyB2ZWxvY2l0eSBmaWVsZFxuICAgICAgICBjb25zdCBmbG93RmllbGRBY2MgPSBXc1RoYW5vc1NlcnZpY2UuZ2V0WFlGcm9tRmxvd0ZpZWxkKG5vaXNlLCBzZWVkLCBwYXJ0aWNsZVgsIHBhcnRpY2xlWSk7XG4gICAgICAgIGNvbnN0IGFjY2VsZXJhdGlvblggPSBmbG93RmllbGRBY2NbMF07XG4gICAgICAgIGNvbnN0IGFjY2VsZXJhdGlvblkgPSBmbG93RmllbGRBY2NbMV07XG4gICAgICAgIHBhcnRpY2xlc1theF0gKz0gYWNjZWxlcmF0aW9uWDtcbiAgICAgICAgcGFydGljbGVzW2F5XSArPSBhY2NlbGVyYXRpb25ZO1xuICAgICAgfVxuXG4gICAgICAvLyAqIE1hdGgucG93KDEgKyBhbmltYXRpb25ULCA0KVxuICAgICAgcGFydGljbGVzW2R4XSArPSBwYXJ0aWNsZXNbYXhdICogcGFydGljbGVBY2NlbGVyYXRpb24gKiBkZWx0YVRTZWM7XG4gICAgICBwYXJ0aWNsZXNbZHldICs9IHBhcnRpY2xlc1theV0gKiBwYXJ0aWNsZUFjY2VsZXJhdGlvbiAqIGRlbHRhVFNlYztcbiAgICAgIHBhcnRpY2xlc1t4XSArPSBwYXJ0aWNsZXNbZHhdICogZGVsdGFUU2VjO1xuICAgICAgcGFydGljbGVzW3ldICs9IHBhcnRpY2xlc1tkeV0gKiBkZWx0YVRTZWM7XG4gICAgICAvLyBmYWRlIHBhcnRpY2xlIG91dCAoIHZlcnkgbGF0ZSk7XG4gICAgICBwYXJ0aWNsZXNbYV0gKj0gMSAtIE1hdGgucG93KGFuaW1hdGlvblQsIDE1KTsgLy8gMjU1IC0gTWF0aC5zcXJ0KHBhcnRpY2xlc1tkeF0gKiBwYXJ0aWNsZXNbZHhdICsgcGFydGljbGVzW2R5XSAqIHBhcnRpY2xlc1tkeV0pIC8gMS4yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRyYXdQYXJ0aWNsZXMoZHJhd0N0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBwYXJ0aWNsZXM6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZHJhd0N0eC5jYW52YXM7XG4gICAgZHJhd0N0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgaW1hZ2UgPSBkcmF3Q3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZS5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydGljbGVzLmxlbmd0aDsgaSArPSBQQVJUSUNMRV9CWVRFX0xFTkdUSCkge1xuICAgICAgY29uc3QgcGFydGljbGVYID0gcGFydGljbGVzW2ldO1xuICAgICAgY29uc3QgcGFydGljbGVZID0gcGFydGljbGVzW2kgKyAxXTtcbiAgICAgIGNvbnN0IHBJID0gV3NUaGFub3NTZXJ2aWNlLmdldFBhcnRpY2xlSW5kaWNlc0ZvckJhc2UoaSk7XG4gICAgICBpZiAoXG4gICAgICAgIHBhcnRpY2xlWCA+IHdpZHRoIHx8XG4gICAgICAgIHBhcnRpY2xlWCA8IDAgfHxcbiAgICAgICAgcGFydGljbGVZID4gaGVpZ2h0IHx8XG4gICAgICAgIHBhcnRpY2xlWSA8IDAgfHxcbiAgICAgICAgcGFydGljbGVzW3BJLmFdIDwgTUlOX1BBUlRJQ0xFX0FMUEhBXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHIsIGcsIGIsIGEgfSA9IFdzVGhhbm9zU2VydmljZS5nZXRDb2xvckluZGljZXNGb3JDb29yZCh+fnBhcnRpY2xlc1twSS54XSwgfn5wYXJ0aWNsZXNbcEkueV0sIHdpZHRoKTtcbiAgICAgIGltYWdlRGF0YVtyXSA9IH5+cGFydGljbGVzW3BJLnJdO1xuICAgICAgaW1hZ2VEYXRhW2ddID0gfn5wYXJ0aWNsZXNbcEkuZ107XG4gICAgICBpbWFnZURhdGFbYl0gPSB+fnBhcnRpY2xlc1twSS5iXTtcbiAgICAgIGltYWdlRGF0YVthXSA9IH5+cGFydGljbGVzW3BJLmFdO1xuICAgIH1cbiAgICBkcmF3Q3R4LnB1dEltYWdlRGF0YShpbWFnZSwgMCwgMCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwcmVwYXJlQ2FudmFzRm9yVmFwb3JpemUoXG4gICAgZGl2Q2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXhQYXJ0aWNsZUNvdW50OiBudW1iZXJcbiAgKToge1xuICAgIHBhcnRpY2xlc0RhdGE6IFBhcnRpY2xlc0RhdGE7XG4gICAgcmVzdWx0Q2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgfSB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBkaXZDYW52YXM7XG5cbiAgICAvLyBzY2FsZSByZXN1bHQgY2FudmFzIHRvIGhhdmUgbW9yZSByb29tIHRvIGRyYXcgcGFydGljbGVzIHdoaWxlIHZhcG9yaXppbmc7XG4gICAgY29uc3QgcmVzdWx0SGVpZ2h0ID0gaGVpZ2h0ICogSEVJR0hUX1NDQUxFO1xuICAgIGNvbnN0IHJlc3VsdFdpZHRoID0gd2lkdGggKiBXSURUSF9TQ0FMRTtcbiAgICBjb25zdCByZXN1bHRDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgcmVzdWx0Q2FudmFzLmhlaWdodCA9IHJlc3VsdEhlaWdodDtcbiAgICByZXN1bHRDYW52YXMud2lkdGggPSByZXN1bHRXaWR0aDtcblxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGRpdkNhbnZhcy5nZXRDb250ZXh0KCcyZCcpPy5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgaWYgKGltYWdlRGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgaW1hZ2UgZGF0YSBmcm9tIGNhbnZhcycpO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0aWNsZXNEYXRhID0gV3NUaGFub3NTZXJ2aWNlLmNyZWF0ZVBhcnRpY2xlc0ZvckltYWdlRGF0YShpbWFnZURhdGEsIG1heFBhcnRpY2xlQ291bnQsIHJlc3VsdEhlaWdodCk7XG4gICAgcmV0dXJuIHsgcmVzdWx0Q2FudmFzLCBwYXJ0aWNsZXNEYXRhIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQYXJ0aWNsZXNGb3JJbWFnZURhdGEoXG4gICAgaW1hZ2VEYXRhOiBJbWFnZURhdGEsXG4gICAgbWF4UGFydGljbGVDb3VudDogbnVtYmVyLFxuICAgIHJlc3VsdEhlaWdodDogbnVtYmVyXG4gICk6IHsgbWluUGFydGljbGVZOiBudW1iZXI7IG1heFBhcnRpY2xlWDogbnVtYmVyOyBwYXJ0aWNsZXM6IEZsb2F0MzJBcnJheSB9IHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGltYWdlRGF0YTtcbiAgICBsZXQgcGFydGljbGVDYW5kaWRhdGVzID0gMDtcbiAgICBsZXQgcGFydGljbGVDb3VudCA9IDA7XG5cbiAgICBjb25zdCBwYXJ0aWNsZUNhbmRpYXRlc0xpc3Q6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVtdID0gW107XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIGNvbnN0IHsgYSB9ID0gV3NUaGFub3NTZXJ2aWNlLmdldENvbG9ySW5kaWNlc0ZvckNvb3JkKHgsIHksIHdpZHRoKTtcbiAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhW2FdID49IE1JTl9QQVJUSUNMRV9BTFBIQSkge1xuICAgICAgICAgIHBhcnRpY2xlQ2FuZGlkYXRlcysrO1xuICAgICAgICAgIHBhcnRpY2xlQ2FuZGlhdGVzTGlzdC5wdXNoKHsgeCwgeSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1heE51bVBhcnRpY2xlcyA9IE1hdGgubWluKHBhcnRpY2xlQ2FuZGlkYXRlcywgbWF4UGFydGljbGVDb3VudCk7XG4gICAgY29uc3QgcGFydGljbGVzID0gbmV3IEZsb2F0MzJBcnJheShGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBtYXhOdW1QYXJ0aWNsZXMgKiBQQVJUSUNMRV9CWVRFX0xFTkdUSCk7XG5cbiAgICBsZXQgbWF4UGFydGljbGVYID0gMDtcbiAgICBsZXQgbWluUGFydGljbGVZID0gcmVzdWx0SGVpZ2h0O1xuICAgIHdoaWxlIChwYXJ0aWNsZUNvdW50IDwgbWF4TnVtUGFydGljbGVzKSB7XG4gICAgICAvLyBzZWxlY3QgcmFuZG9tIGluZGV4IGZyb20gY2FuZGlhdGVzXG4gICAgICBjb25zdCBpbmRleCA9IH5+KE1hdGgucmFuZG9tKCkgKiBwYXJ0aWNsZUNhbmRpYXRlc0xpc3QubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gcGFydGljbGVDYW5kaWF0ZXNMaXN0W2luZGV4XTtcblxuICAgICAgLy8gb3ZlcndyaXRlIGluZGV4IHdpdGggbGFzdCBlbGVtZW50IHRvIHByZXZlbnQgZG91YmxlIHNlbGVjdGlvbiBvZiBwYXJ0aWNsZXNcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICBwYXJ0aWNsZUNhbmRpYXRlc0xpc3RbaW5kZXhdID0gcGFydGljbGVDYW5kaWF0ZXNMaXN0LnBvcCgpITtcblxuICAgICAgbWF4UGFydGljbGVYID0gTWF0aC5tYXgobWF4UGFydGljbGVYLCB4KTtcbiAgICAgIG1pblBhcnRpY2xlWSA9IE1hdGgubWluKG1pblBhcnRpY2xlWSwgeSk7XG4gICAgICBjb25zdCB7IGR4LCBkeSwgYXgsIGF5LCByLCBnLCBiLCBhLCAuLi54eSB9ID0gV3NUaGFub3NTZXJ2aWNlLmdldFBhcnRpY2xlSW5kaWNlc0ZvckJhc2UoXG4gICAgICAgIHBhcnRpY2xlQ291bnQgKiBQQVJUSUNMRV9CWVRFX0xFTkdUSFxuICAgICAgKTtcbiAgICAgIHBhcnRpY2xlc1t4eS54XSA9IHg7XG4gICAgICBwYXJ0aWNsZXNbeHkueV0gPSB5ICsgcmVzdWx0SGVpZ2h0IC0gaGVpZ2h0O1xuICAgICAgcGFydGljbGVzW2R4XSA9IDA7XG4gICAgICBwYXJ0aWNsZXNbZHldID0gMDtcbiAgICAgIHBhcnRpY2xlc1theF0gPSAwO1xuICAgICAgcGFydGljbGVzW2F5XSA9IDA7XG5cbiAgICAgIGNvbnN0IGluZGljZXNJbWFnZSA9IFdzVGhhbm9zU2VydmljZS5nZXRDb2xvckluZGljZXNGb3JDb29yZCh4LCB5LCB3aWR0aCk7XG5cbiAgICAgIHBhcnRpY2xlc1tyXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5yXTtcbiAgICAgIHBhcnRpY2xlc1tnXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5nXTtcbiAgICAgIHBhcnRpY2xlc1tiXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5iXTtcbiAgICAgIHBhcnRpY2xlc1thXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5hXTtcbiAgICAgIHBhcnRpY2xlQ291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIHsgcGFydGljbGVzLCBtYXhQYXJ0aWNsZVgsIG1pblBhcnRpY2xlWSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0WFlGcm9tRmxvd0ZpZWxkKG5vaXNlOiBTaW1wbGV4Tm9pc2UsIHNlZWQ6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBjb25zdCBzYW1wbGVYID0gbm9pc2Uuc2NhbGVkM0QoeCwgeSwgc2VlZCArIDMzLjIzLCBGTE9XX0ZJRUxEX1JFUyk7XG4gICAgY29uc3Qgc2FtcGxlWSA9IG5vaXNlLnNjYWxlZDNEKHgsIHNlZWQgLyAxMy4yMywgeSwgRkxPV19GSUVMRF9SRVMpICogLTE7XG4gICAgcmV0dXJuIFtzYW1wbGVYLCBzYW1wbGVZXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdGFydCB0aGUgdmFwb3JpemUtZWZmZWN0LlxuICAgKlxuICAgKiBJdCdzIHJ1bm5pbmcgb3V0c2lkZSB0aGUgbmdab25lLlxuICAgKi9cbiAgdmFwb3JpemUoZWxlbTogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPEFuaW1hdGlvblN0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMudmFwb3JpemVJbnRlcm4oZWxlbSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YXBvcml6ZUludGVybihlbGVtOiBIVE1MRWxlbWVudCk6IE9ic2VydmFibGU8QW5pbWF0aW9uU3RhdGU+IHtcbiAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSBlbGVtLnN0eWxlLm9wYWNpdHkgfHwgJzEnO1xuICAgIGVsZW0uc3R5bGUudHJhbnNpdGlvbiA9IGBvcGFjaXR5ICR7TWF0aC5mbG9vcih0aGlzLnRoYW5vc09wdGlvbnMuYW5pbWF0aW9uTGVuZ3RoICogMC44KX1tcyBlYXNlLW91dGA7XG4gICAgY29uc3Qgbm9pc2UgPSBuZXcgU2ltcGxleE5vaXNlKHsgZnJlcXVlbmN5OiAwLjAxLCBtaW46IDAgfSk7XG4gICAgY29uc3Qgc2VlZCA9IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpICogTWF0aC5yYW5kb20oKTtcbiAgICBjb25zdCBodG1sMkNhbnZhc1Byb21pc2U6IFByb21pc2U8SFRNTENhbnZhc0VsZW1lbnQ+ID0gaHRtbDJjYW52YXMoZWxlbSwge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxuICAgICAgc2NhbGU6IDEsXG4gICAgICBhbGxvd1RhaW50OiB0cnVlLFxuICAgICAgd2luZG93SGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICB3aW5kb3dXaWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBzY3JvbGxZOiAtd2luZG93LnNjcm9sbFksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJvbShodG1sMkNhbnZhc1Byb21pc2UpLnBpcGUoXG4gICAgICBtYXAoKGNhbnZhc0Zyb21IdG1sRWxlbSkgPT4ge1xuICAgICAgICBjb25zdCBjYW52YXNBbmRQYXJ0aWNsZXMgPSBXc1RoYW5vc1NlcnZpY2UucHJlcGFyZUNhbnZhc0ZvclZhcG9yaXplKFxuICAgICAgICAgIGNhbnZhc0Zyb21IdG1sRWxlbSxcbiAgICAgICAgICB0aGlzLnRoYW5vc09wdGlvbnMubWF4UGFydGljbGVDb3VudFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7IHJlc3VsdENhbnZhcyB9ID0gY2FudmFzQW5kUGFydGljbGVzO1xuICAgICAgICBpZiAoZWxlbS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbS5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gZWxlbS5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uIHx8ICdyZWxhdGl2ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLmxlZnQgPSAwICsgJ3B4JztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnRvcCA9ICctJyArIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICogKEhFSUdIVF9TQ0FMRSAtIDEpICsgJ3B4JztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnpJbmRleCA9ICcyMDAwJztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG5cbiAgICAgICAgZWxlbS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgcmVzdWx0Q2FudmFzKTtcbiAgICAgICAgLy8gdGhpcyBzaG91bGQgc3RhcnQgdGhlIHRyYW5zaXRpb24gYWJvdmUgZGVmaW5lZFxuICAgICAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHJldHVybiBjYW52YXNBbmRQYXJ0aWNsZXM7XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgoeyByZXN1bHRDYW52YXMsIHBhcnRpY2xlc0RhdGEgfSkgPT4ge1xuICAgICAgICBsZXQgdGltZSA9IDA7XG4gICAgICAgIGNvbnN0IHsgYW5pbWF0aW9uTGVuZ3RoLCBtYXhQYXJ0aWNsZUNvdW50LCBwYXJ0aWNsZUFjY2VsZXJhdGlvbiB9ID0gdGhpcy50aGFub3NPcHRpb25zO1xuICAgICAgICByZXR1cm4gaW50ZXJ2YWwoMTAwMCAvIDYwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlcikucGlwZShcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwoKSxcbiAgICAgICAgICB0YXAoKGRlbHRhVCkgPT4gKHRpbWUgKz0gZGVsdGFULmludGVydmFsKSksXG4gICAgICAgICAgbWFwKFxuICAgICAgICAgICAgKGRlbHRhVCkgPT5cbiAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICBkZWx0YVRTZWM6IGRlbHRhVC5pbnRlcnZhbCAvIDEwMDAsXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uVDogdGltZSAvIGFuaW1hdGlvbkxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogcmVzdWx0Q2FudmFzLndpZHRoLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogcmVzdWx0Q2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgICAgfSBhcyBBbmltYXRpb25TdGF0ZSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRhcCgoYW5pbWF0aW9uU3RhdGUpID0+IHtcbiAgICAgICAgICAgIFdzVGhhbm9zU2VydmljZS51cGRhdGVQYXJ0aWNsZXMoe1xuICAgICAgICAgICAgICBwYXJ0aWNsZXNEYXRhLFxuICAgICAgICAgICAgICBhbmltYXRpb25TdGF0ZSxcbiAgICAgICAgICAgICAgdGhhbm9zT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbkxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXhQYXJ0aWNsZUNvdW50LFxuICAgICAgICAgICAgICAgIHBhcnRpY2xlQWNjZWxlcmF0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub2lzZSxcbiAgICAgICAgICAgICAgc2VlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHJlc3VsdENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgV3NUaGFub3NTZXJ2aWNlLmRyYXdQYXJ0aWNsZXMoY29udGV4dCwgcGFydGljbGVzRGF0YS5wYXJ0aWNsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VXaGlsZSgoYW5pbWF0aW9uU3RhdGUpID0+IGFuaW1hdGlvblN0YXRlLmFuaW1hdGlvblQgPD0gMSksXG4gICAgICAgICAgdGFwKHtcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRDYW52YXMucmVtb3ZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
5
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29sc29rLXRoYW5vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcHVibGljL3dzLXRoYW5vcy9zcmMvd29sc29rLXRoYW5vcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
package/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export * from './lib/ws-thanos.service';
2
- export * from './lib/ws-thanos.directive';
3
- export * from './lib/ws-thanos-options.token';
4
- export * from './lib/ws-thanos.options';
5
- export * from './lib/create-ws-thanos-options';
6
- export * from './lib/simplex-noise';
1
+ export * from './lib/ws-thanos.service';
2
+ export * from './lib/ws-thanos.directive';
3
+ export * from './lib/ws-thanos-options.token';
4
+ export * from './lib/ws-thanos.options';
5
+ export * from './lib/create-ws-thanos-options';
6
+ export * from './lib/simplex-noise';
@@ -1,2 +1,2 @@
1
- import { WsThanosOptions } from './ws-thanos.options';
2
- export declare function createWsThanosOptions(options?: Partial<WsThanosOptions>): WsThanosOptions;
1
+ import { WsThanosOptions } from './ws-thanos.options';
2
+ export declare function createWsThanosOptions(options?: Partial<WsThanosOptions>): WsThanosOptions;
@@ -1,9 +1,9 @@
1
- export interface SimplexNoiseOptions {
2
- amplitude: number;
3
- frequency: number;
4
- max: number;
5
- min: number;
6
- octaves: number;
7
- persistence: number;
8
- random: () => number;
9
- }
1
+ export interface SimplexNoiseOptions {
2
+ amplitude: number;
3
+ frequency: number;
4
+ max: number;
5
+ min: number;
6
+ octaves: number;
7
+ persistence: number;
8
+ random: () => number;
9
+ }
@@ -1,18 +1,18 @@
1
- import type { SimplexNoiseOptions } from './simplex-noise-options';
2
- export declare class SimplexNoise {
3
- constructor(options?: Partial<SimplexNoiseOptions>);
4
- static G3: number;
5
- static GRAD3D: number[][];
6
- readonly amplitude: number;
7
- readonly frequency: number;
8
- readonly octaves: number;
9
- readonly perm: Uint8Array;
10
- readonly permMod12: Uint8Array;
11
- readonly persistence: number;
12
- readonly random: () => number;
13
- readonly scale: (value: number) => number;
14
- private memScale3D;
15
- dot(gs: number[], coords: number[]): number;
16
- raw3D(x: number, y: number, z: number): number;
17
- scaled3D(x: number, y: number, z: number, resolution: number): number;
18
- }
1
+ import type { SimplexNoiseOptions } from './simplex-noise-options';
2
+ export declare class SimplexNoise {
3
+ constructor(options?: Partial<SimplexNoiseOptions>);
4
+ static G3: number;
5
+ static GRAD3D: number[][];
6
+ readonly amplitude: number;
7
+ readonly frequency: number;
8
+ readonly octaves: number;
9
+ readonly perm: Uint8Array;
10
+ readonly permMod12: Uint8Array;
11
+ readonly persistence: number;
12
+ readonly random: () => number;
13
+ readonly scale: (value: number) => number;
14
+ private memScale3D;
15
+ dot(gs: number[], coords: number[]): number;
16
+ raw3D(x: number, y: number, z: number): number;
17
+ scaled3D(x: number, y: number, z: number, resolution: number): number;
18
+ }
@@ -1,4 +1,4 @@
1
- import { InjectionToken, Provider } from '@angular/core';
2
- import type { WsThanosOptions } from './ws-thanos.options';
3
- export declare const WS_THANOS_OPTIONS_TOKEN: InjectionToken<WsThanosOptions>;
4
- export declare function provideWsThanosOptions(options?: Partial<WsThanosOptions>): Provider;
1
+ import { InjectionToken, Provider } from '@angular/core';
2
+ import type { WsThanosOptions } from './ws-thanos.options';
3
+ export declare const WS_THANOS_OPTIONS_TOKEN: InjectionToken<WsThanosOptions>;
4
+ export declare function provideWsThanosOptions(options?: Partial<WsThanosOptions>): Provider;
@@ -1,18 +1,18 @@
1
- import { ElementRef, NgZone, OnDestroy } from '@angular/core';
2
- import { Observable } from 'rxjs';
3
- import type { WsThanosOptions } from './ws-thanos.options';
4
- import { WsThanosService } from './ws-thanos.service';
5
- import * as i0 from "@angular/core";
6
- export declare class WsThanosDirective implements OnDestroy {
7
- private readonly vaporizeDomElem;
8
- private readonly thanosService;
9
- private readonly thanosOptions;
10
- private readonly ngZone;
11
- private subscription?;
12
- private wsThanosComplete;
13
- constructor(vaporizeDomElem: ElementRef<HTMLElement>, thanosService: WsThanosService, thanosOptions: WsThanosOptions, ngZone: NgZone);
14
- vaporize(removeElem?: boolean): Observable<void>;
15
- ngOnDestroy(): void;
16
- static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosDirective, never>;
17
- static ɵdir: i0.ɵɵDirectiveDeclaration<WsThanosDirective, "[wsThanos], ws-thanos", ["thanos"], {}, { "wsThanosComplete": "wsThanosComplete"; }, never, never, true>;
18
- }
1
+ import { ElementRef, NgZone, OnDestroy } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import type { WsThanosOptions } from './ws-thanos.options';
4
+ import { WsThanosService } from './ws-thanos.service';
5
+ import * as i0 from "@angular/core";
6
+ export declare class WsThanosDirective implements OnDestroy {
7
+ private readonly vaporizeDomElem;
8
+ private readonly thanosService;
9
+ private readonly thanosOptions;
10
+ private readonly ngZone;
11
+ private subscription?;
12
+ private wsThanosComplete;
13
+ constructor(vaporizeDomElem: ElementRef<HTMLElement>, thanosService: WsThanosService, thanosOptions: WsThanosOptions, ngZone: NgZone);
14
+ vaporize(removeElem?: boolean): Observable<void>;
15
+ ngOnDestroy(): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosDirective, never>;
17
+ static ɵdir: i0.ɵɵDirectiveDeclaration<WsThanosDirective, "[wsThanos], ws-thanos", ["thanos"], {}, { "wsThanosComplete": "wsThanosComplete"; }, never, never, true, never>;
18
+ }
@@ -1,5 +1,5 @@
1
- export interface WsThanosOptions {
2
- animationLength: number;
3
- maxParticleCount: number;
4
- particleAcceleration: number;
5
- }
1
+ export interface WsThanosOptions {
2
+ animationLength: number;
3
+ maxParticleCount: number;
4
+ particleAcceleration: number;
5
+ }
@@ -1,32 +1,32 @@
1
- import { NgZone } from '@angular/core';
2
- import { Observable } from 'rxjs';
3
- import type { WsThanosOptions } from './ws-thanos.options';
4
- import * as i0 from "@angular/core";
5
- interface AnimationState {
6
- deltaTSec: number;
7
- animationT: number;
8
- maxWidth: number;
9
- maxHeight: number;
10
- }
11
- export declare class WsThanosService {
12
- private thanosOptions;
13
- private ngZone;
14
- constructor(thanosOptions: WsThanosOptions, ngZone: NgZone);
15
- private static getParticleIndicesForBase;
16
- private static getColorIndicesForCoord;
17
- private static updateParticles;
18
- private static drawParticles;
19
- private static prepareCanvasForVaporize;
20
- private static createParticlesForImageData;
21
- private static getXYFromFlowField;
22
- /**
23
- * start the vaporize-effect.
24
- *
25
- * It's running outside the ngZone.
26
- */
27
- vaporize(elem: HTMLElement): Observable<AnimationState>;
28
- private vaporizeIntern;
29
- static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosService, never>;
30
- static ɵprov: i0.ɵɵInjectableDeclaration<WsThanosService>;
31
- }
32
- export {};
1
+ import { NgZone } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import type { WsThanosOptions } from './ws-thanos.options';
4
+ import * as i0 from "@angular/core";
5
+ interface AnimationState {
6
+ deltaTSec: number;
7
+ animationT: number;
8
+ maxWidth: number;
9
+ maxHeight: number;
10
+ }
11
+ export declare class WsThanosService {
12
+ private thanosOptions;
13
+ private ngZone;
14
+ constructor(thanosOptions: WsThanosOptions, ngZone: NgZone);
15
+ private static getParticleIndicesForBase;
16
+ private static getColorIndicesForCoord;
17
+ private static updateParticles;
18
+ private static drawParticles;
19
+ private static prepareCanvasForVaporize;
20
+ private static createParticlesForImageData;
21
+ private static getXYFromFlowField;
22
+ /**
23
+ * start the vaporize-effect.
24
+ *
25
+ * It's running outside the ngZone.
26
+ */
27
+ vaporize(elem: HTMLElement): Observable<AnimationState>;
28
+ private vaporizeIntern;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosService, never>;
30
+ static ɵprov: i0.ɵɵInjectableDeclaration<WsThanosService>;
31
+ }
32
+ export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wolsok/thanos",
3
- "version": "3.0.1",
4
- "description": "wolsok's implementation of a cool thanos vaporizing effect for destroying dom elements",
3
+ "version": "16.0.0",
4
+ "description": "Wolf Soko's implementation of a cool Thanos snapping vaporizing effect for destroying dom elements",
5
5
  "bugs": {
6
6
  "url": "https://github.com/WolfSoko/wol-sok-mono/issues"
7
7
  },
@@ -9,6 +9,7 @@
9
9
  "repository": "https://github.com/WolfSoko/wol-sok-mono/tree/main/libs/public/ws-thanos",
10
10
  "license": "MIT",
11
11
  "keywords": [
12
+ "wolf soko",
12
13
  "wolsok",
13
14
  "angular",
14
15
  "angular-lib",
@@ -19,33 +20,31 @@
19
20
  "vaporize",
20
21
  "vaporizing",
21
22
  "Avengers",
22
- "Marvel"
23
+ "Marvel",
24
+ "npm"
23
25
  ],
24
26
  "peerDependencies": {
25
- "@angular/common": "^14.2.9",
26
- "@angular/core": "^14.2.9",
27
+ "@angular/common": "^16.0.0",
28
+ "@angular/core": "^16.0.0",
27
29
  "html2canvas": "^1.4.1",
28
- "@angular/platform-browser": "14.2.9",
29
- "rxjs": "7.5.7",
30
- "zone.js": "0.11.8",
31
- "@angular/platform-browser-dynamic": "14.2.9"
30
+ "@angular/platform-browser": "16.0.0",
31
+ "rxjs": "7.8.1",
32
+ "zone.js": "0.13.0",
33
+ "@angular/platform-browser-dynamic": "16.0.0"
32
34
  },
33
35
  "dependencies": {
34
- "tslib": "2.4.1"
36
+ "tslib": "2.5.0"
35
37
  },
36
- "module": "esm2020/wolsok-thanos.mjs",
37
- "es2020": "esm2020/wolsok-thanos.mjs",
38
- "esm2020": "esm2020/wolsok-thanos.mjs",
38
+ "module": "esm2022/wolsok-thanos.mjs",
39
39
  "typings": "index.d.ts",
40
40
  "exports": {
41
41
  "./package.json": {
42
42
  "default": "./package.json"
43
43
  },
44
44
  ".": {
45
- "types": "./index.d.ts",
46
- "es2020": "./esm2020/wolsok-thanos.mjs",
47
- "esm2020": "./esm2020/wolsok-thanos.mjs",
48
- "default": "./esm2020/wolsok-thanos.mjs"
45
+ "esm2022": "./esm2022/wolsok-thanos.mjs",
46
+ "esm": "./esm2022/wolsok-thanos.mjs",
47
+ "default": "./esm2022/wolsok-thanos.mjs"
49
48
  }
50
49
  },
51
50
  "sideEffects": false
@@ -1,9 +0,0 @@
1
- export function createWsThanosOptions(options) {
2
- return {
3
- animationLength: 5000,
4
- maxParticleCount: 400000,
5
- particleAcceleration: 30,
6
- ...options,
7
- };
8
- }
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXdzLXRoYW5vcy1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wdWJsaWMvd3MtdGhhbm9zL3NyYy9saWIvY3JlYXRlLXdzLXRoYW5vcy1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsT0FBa0M7SUFFbEMsT0FBTztRQUNMLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGdCQUFnQixFQUFFLE1BQU07UUFDeEIsb0JBQW9CLEVBQUUsRUFBRTtRQUN4QixHQUFHLE9BQU87S0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdzVGhhbm9zT3B0aW9ucyB9IGZyb20gJy4vd3MtdGhhbm9zLm9wdGlvbnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV3NUaGFub3NPcHRpb25zKFxuICBvcHRpb25zPzogUGFydGlhbDxXc1RoYW5vc09wdGlvbnM+XG4pOiBXc1RoYW5vc09wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbkxlbmd0aDogNTAwMCxcbiAgICBtYXhQYXJ0aWNsZUNvdW50OiA0MDAwMDAsXG4gICAgcGFydGljbGVBY2NlbGVyYXRpb246IDMwLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG59XG4iXX0=