@wolsok/thanos 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # public-ws-thanos
2
+
3
+ An angular directive that vaporizes your DOM Elements like Thanos. This library is generated with [Nx](https://nx.dev).
4
+
5
+ #### Live Demo:
6
+
7
+ Click the technology cards on https://angularexamples.wolsok.de
8
+
9
+ ## Usage
10
+
11
+ #### Dependencies:
12
+
13
+ To install run
14
+
15
+ ```
16
+ npm install @wolsok/thanos --save
17
+ ```
18
+
19
+ This lib uses html2canvas. So please run
20
+
21
+ ```
22
+ npm install html2canvas --save.
23
+ ```
24
+
25
+ #### Prepare your angular app:
26
+
27
+ Add to your root app module.
28
+
29
+ ```
30
+ @NgModule({
31
+ ...
32
+ imports: [...
33
+ WsThanosModule.forRoot(options)
34
+ ]
35
+ })
36
+ export class AppModule {...}
37
+ ```
38
+
39
+ And add PublicWsThanosModule to your shared module exports to make the directive available.
40
+
41
+ ```
42
+ @NgModule({
43
+ ...
44
+ exports: [...
45
+ WsThanosModule
46
+ ]
47
+ })
48
+ export class SharedModule {...}
49
+ ]
50
+ ```
51
+
52
+ #### `WsThanosOptions` to configure public-ws-thanos:
53
+
54
+ | field | type | default | description |
55
+ | -------------------- | :----: | ------: | ---------------------------------: |
56
+ | animationLength | number | 5000 | the animation length in ms |
57
+ | maxParticleCount | number | 400000 | max amount of particles |
58
+ | particleAcceleration | number | 30 | speed of the particle acceleration |
59
+
60
+ ### `WsThanosDirective` usage
61
+
62
+ Use the directive `wsThanos` on your element and reference it using `@ViewChild(WsThanosDirective)` in your component or
63
+ directly in html via template ref:
64
+
65
+ ```
66
+ <div wsThanos
67
+ #thanos="thanos"
68
+ (wsThanosComplete)=onComplete()>
69
+ This div will be vaporized on click
70
+ </div>
71
+ <button (click)="thanos.vaporize(removeElement)">
72
+ ```
73
+
74
+ ### `WsThanosService` usage
75
+
76
+ Inject the 'WsThanosService' into your class. Call 'vaporize()' and subscribe to it.
77
+
78
+ ## Collaboration
79
+
80
+ Send issues or PRs to https://github.com/wolsok/wol-sok-mono
81
+
82
+ Run `nx test ws-thanos` to execute the unit tests.
83
+
84
+ ## Migration
85
+
86
+ * Remove old version `npm uninstall sc-thanos`
87
+ * Install `npm install @wolsok/thanos --save`
88
+ * The earlier name of this component was `scThanos`. Just switch to `wsThanos`
89
+
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Public API Surface of ws-thanos
3
+ */
4
+ export * from './lib/ws-thanos.service';
5
+ export * from './lib/ws-thanos.directive';
6
+ export * from './lib/ws-thanos.module';
7
+ export * from './lib/ws-thanos.options';
8
+ export * from './lib/ws-thanos-options.token';
9
+ export * from './lib/create-ws-thanos-options';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3B1YmxpYy93cy10aGFub3Mvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIHdzLXRoYW5vc1xuICovXG5leHBvcnQgKiBmcm9tICcuL2xpYi93cy10aGFub3Muc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi93cy10aGFub3MuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dzLXRoYW5vcy5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvd3MtdGhhbm9zLm9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvd3MtdGhhbm9zLW9wdGlvbnMudG9rZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY3JlYXRlLXdzLXRoYW5vcy1vcHRpb25zJztcbiJdfQ==
@@ -0,0 +1,9 @@
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=
@@ -0,0 +1,199 @@
1
+ function createOptionsWithDefaults(options) {
2
+ if (options != null) {
3
+ if (options['amplitude'] && typeof options.amplitude !== 'number') {
4
+ throw new Error('options.amplitude must be a number');
5
+ }
6
+ if (options['frequency'] && typeof options.frequency !== 'number') {
7
+ throw new Error('options.frequency must be a number');
8
+ }
9
+ if (options['octaves'] &&
10
+ (typeof options.octaves !== 'number' ||
11
+ !isFinite(options.octaves) ||
12
+ Math.floor(options.octaves) !== options.octaves)) {
13
+ throw new Error('options.octaves must be an integer');
14
+ }
15
+ if (options['persistence'] && typeof options.persistence !== 'number') {
16
+ throw new Error('options.persistence must be a number');
17
+ }
18
+ if (options['random'] && typeof options.random !== 'function') {
19
+ throw new Error('options.random must be a function');
20
+ }
21
+ if (options['min'] && typeof options.min !== 'number') {
22
+ throw new Error('options.min must be a number');
23
+ }
24
+ if (options['max'] && typeof options.max !== 'number') {
25
+ throw new Error('options.max must be a number');
26
+ }
27
+ }
28
+ const optionsResult = {
29
+ amplitude: 1.0,
30
+ frequency: 1.0,
31
+ max: 1.0,
32
+ min: -1.0,
33
+ octaves: 1,
34
+ persistence: 0.5,
35
+ random: Math.random,
36
+ ...options,
37
+ };
38
+ if (optionsResult.min > optionsResult.max) {
39
+ throw new Error('min must be smaller max');
40
+ }
41
+ return optionsResult;
42
+ }
43
+ export class SimplexNoise {
44
+ constructor(options) {
45
+ this.memScale3D = {};
46
+ const { min, max, random, amplitude, frequency, octaves, persistence } = createOptionsWithDefaults(options);
47
+ this.random = random;
48
+ this.amplitude = amplitude;
49
+ this.frequency = frequency;
50
+ this.octaves = octaves;
51
+ this.persistence = persistence;
52
+ this.scale =
53
+ min === -1 && max === 1
54
+ ? (value) => value
55
+ : (value) => min + ((value + 1) / 2) * (max - min);
56
+ const p = new Uint8Array(256);
57
+ for (let i = 0; i < 256; i++) {
58
+ p[i] = i;
59
+ }
60
+ let n;
61
+ let q;
62
+ for (let i = 255; i > 0; i--) {
63
+ n = Math.floor((i + 1) * this.random());
64
+ q = p[i];
65
+ p[i] = p[n];
66
+ p[n] = q;
67
+ }
68
+ this.perm = new Uint8Array(512);
69
+ this.permMod12 = new Uint8Array(512);
70
+ for (let i = 0; i < 512; i++) {
71
+ this.perm[i] = p[i & 255];
72
+ this.permMod12[i] = this.perm[i] % 12;
73
+ }
74
+ }
75
+ dot(gs, coords) {
76
+ return gs
77
+ .slice(0, Math.min(gs.length, coords.length))
78
+ .reduce((total, g, i) => total + g * coords[i], 0);
79
+ }
80
+ raw3D(x, y, z) {
81
+ // Skew the input space to determine which simplex cell we're in
82
+ const s = (x + y + z) / 3.0; // Very nice and simple skew factor for 3D
83
+ const i = Math.floor(x + s);
84
+ const j = Math.floor(y + s);
85
+ const k = Math.floor(z + s);
86
+ const t = (i + j + k) * SimplexNoise.G3;
87
+ const X0 = i - t; // Unskew the cell origin back to (x,y,z) space
88
+ const Y0 = j - t;
89
+ const Z0 = k - t;
90
+ const x0 = x - X0; // The x,y,z distances from the cell origin
91
+ const y0 = y - Y0;
92
+ const z0 = z - Z0;
93
+ // Determine which simplex we are in
94
+ let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords
95
+ let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords
96
+ if (x0 >= y0) {
97
+ if (y0 >= z0) {
98
+ i1 = i2 = j2 = 1;
99
+ j1 = k1 = k2 = 0;
100
+ }
101
+ else if (x0 >= z0) {
102
+ i1 = i2 = k2 = 1;
103
+ j1 = k1 = j2 = 0;
104
+ }
105
+ else {
106
+ k1 = i2 = k2 = 1;
107
+ i1 = j1 = j2 = 0;
108
+ }
109
+ }
110
+ else {
111
+ if (y0 < z0) {
112
+ k1 = j2 = k2 = 1;
113
+ i1 = j1 = i2 = 0;
114
+ }
115
+ else if (x0 < z0) {
116
+ j1 = j2 = k2 = 1;
117
+ i1 = k1 = i2 = 0;
118
+ }
119
+ else {
120
+ j1 = i2 = j2 = 1;
121
+ i1 = k1 = k2 = 0;
122
+ }
123
+ }
124
+ const x1 = x0 - i1 + SimplexNoise.G3; // Offsets for second corner in (x,y,z) coords
125
+ const y1 = y0 - j1 + SimplexNoise.G3;
126
+ const z1 = z0 - k1 + SimplexNoise.G3;
127
+ const x2 = x0 - i2 + 2.0 * SimplexNoise.G3; // Offsets for third corner in (x,y,z) coords
128
+ const y2 = y0 - j2 + 2.0 * SimplexNoise.G3;
129
+ const z2 = z0 - k2 + 2.0 * SimplexNoise.G3;
130
+ const x3 = x0 - 1.0 + 3.0 * SimplexNoise.G3; // Offsets for last corner in (x,y,z) coords
131
+ const y3 = y0 - 1.0 + 3.0 * SimplexNoise.G3;
132
+ const z3 = z0 - 1.0 + 3.0 * SimplexNoise.G3;
133
+ // Work out the hashed gradient indices of the four simplex corners
134
+ const ii = i & 255;
135
+ const jj = j & 255;
136
+ const kk = k & 255;
137
+ const gi0 = this.permMod12[ii + this.perm[jj + this.perm[kk]]];
138
+ const gi1 = this.permMod12[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]];
139
+ const gi2 = this.permMod12[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]];
140
+ const gi3 = this.permMod12[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]];
141
+ // Calculate the contribution from the four corners
142
+ const t0 = 0.5 - x0 * x0 - y0 * y0 - z0 * z0;
143
+ const n0 = t0 < 0
144
+ ? 0.0
145
+ : Math.pow(t0, 4) * this.dot(SimplexNoise.GRAD3D[gi0], [x0, y0, z0]);
146
+ const t1 = 0.5 - x1 * x1 - y1 * y1 - z1 * z1;
147
+ const n1 = t1 < 0
148
+ ? 0.0
149
+ : Math.pow(t1, 4) * this.dot(SimplexNoise.GRAD3D[gi1], [x1, y1, z1]);
150
+ const t2 = 0.5 - x2 * x2 - y2 * y2 - z2 * z2;
151
+ const n2 = t2 < 0
152
+ ? 0.0
153
+ : Math.pow(t2, 4) * this.dot(SimplexNoise.GRAD3D[gi2], [x2, y2, z2]);
154
+ const t3 = 0.5 - x3 * x3 - y3 * y3 - z3 * z3;
155
+ const n3 = t3 < 0
156
+ ? 0.0
157
+ : Math.pow(t3, 4) * this.dot(SimplexNoise.GRAD3D[gi3], [x3, y3, z3]);
158
+ // Add contributions from each corner to get the final noise value.
159
+ // The result is scaled to stay just inside [-1,1]
160
+ return 94.68493150681972 * (n0 + n1 + n2 + n3);
161
+ }
162
+ scaled3D(x, y, z, resolution) {
163
+ const memIndex = `${Math.round(x * resolution)}${Math.round(y * resolution)}${Math.round(z * resolution)}`;
164
+ const memElem = this.memScale3D[memIndex];
165
+ if (memElem != null) {
166
+ return memElem;
167
+ }
168
+ let amplitude = this.amplitude;
169
+ let frequency = this.frequency;
170
+ let maxAmplitude = 0;
171
+ let noise = 0;
172
+ for (let i = 0; i < this.octaves; i++) {
173
+ noise +=
174
+ this.raw3D(x * frequency, y * frequency, z * frequency) * amplitude;
175
+ maxAmplitude += amplitude;
176
+ amplitude *= this.persistence;
177
+ frequency *= 2;
178
+ }
179
+ const result = this.scale(noise / maxAmplitude);
180
+ this.memScale3D[memIndex] = result;
181
+ return result;
182
+ }
183
+ }
184
+ SimplexNoise.G3 = 1.0 / 6.0;
185
+ SimplexNoise.GRAD3D = [
186
+ [1, 1, 0],
187
+ [-1, 1, 0],
188
+ [1, -1, 0],
189
+ [-1, -1, 0],
190
+ [1, 0, 1],
191
+ [-1, 0, 1],
192
+ [1, 0, -1],
193
+ [-1, 0, -1],
194
+ [0, 1, 1],
195
+ [0, -1, -1],
196
+ [0, 1, -1],
197
+ [0, -1, -1],
198
+ ];
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxleC1ub2lzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcHVibGljL3dzLXRoYW5vcy9zcmMvbGliL3NpbXBsZXgtbm9pc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsU0FBUyx5QkFBeUIsQ0FBQyxPQUEwQjtJQUMzRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQ2pFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtRQUVELElBQ0UsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUNsQixDQUFDLE9BQU8sT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRO2dCQUNsQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQ2xEO1lBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFBRTtZQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQzdELE1BQU0sSUFBSSxL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LENBQUMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFFNUMsbUVBQW1FO1FBQ25FLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbkIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNuQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNFLG1EQUFtRDtRQUNuRCxNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFH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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcbiAgYW1wbGl0dWRlOiBudW1iZXI7IC8vIFRoZSBiYXNlIGFtcGxpdHVkZSAoZGVmYXVsdDogMS4wKVxuICBmcmVxdWVuY3k6IG51bWJlcjsgLy8gVGhlIGJhc2UgZnJlcXVlbmN5IChkZWZhdWx0OiAxLjApXG4gIG1heDogbnVtYmVyOyAvLyBUaGUgbWF4aW11bSBzY2FsZWQgdmFsdWUgdG8gcmV0dXJuIChlZmZlY3RpdmUgZGVmYXVsdDogMS4wKVxuICBtaW46IG51bWJlcjsgLy8gVGhlIG1pbmltdW0gc2NhbGVkIHZhbHVlIHRvIHJldHVybiAoZWZmZWN0aXZlIGRlZmF1bHQ6IC0xLjApXG4gIG9jdGF2ZXM6IG51bWJlcjsgLy8gSW50ZWdlcjsgdGhlIG51bWJlciBvZiBvY3RhdmVzIHRvIHN1bSBmb3Igbm9pc2UgZ2VuZXJhdGlvbiAoZGVmYXVsdDogMSlcbiAgcGVyc2lzdGVuY2U6IG51bWJlcjsgLy8gVGhlIHBlcnNpc3RlbmNlIG9mIGFtcGxpdHVkZSBwZXIgb2N0YXZlIChkZWZhdWx0OiAwLjUpXG4gIHJhbmRvbTogKCkgPT4gbnVtYmVyOyAvLyBBIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIHJhbmRvbSB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxIChkZWZhdWx0OiBNYXRoLnJhbmRvbSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlT3B0aW9uc1dpdGhEZWZhdWx0cyhvcHRpb25zPzogUGFydGlhbDxPcHRpb25zPikge1xuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgaWYgKG9wdGlvbnNbJ2FtcGxpdHVkZSddICYmIHR5cGVvZiBvcHRpb25zLmFtcGxpdHVkZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5hbXBsaXR1ZGUgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zWydmcmVxdWVuY3knXSAmJiB0eXBlb2Ygb3B0aW9ucy5mcmVxdWVuY3kgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMuZnJlcXVlbmN5IG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zWydvY3RhdmVzJ10gJiZcbiAgICAgICh0eXBlb2Ygb3B0aW9ucy5vY3RhdmVzICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAhaXNGaW5pdGUob3B0aW9ucy5vY3RhdmVzKSB8fFxuICAgICAgICBNYXRoLmZsb29yKG9wdGlvbnMub2N0YXZlcykgIT09IG9wdGlvbnMub2N0YXZlcylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5vY3RhdmVzIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zWydwZXJzaXN0ZW5jZSddICYmIHR5cGVvZiBvcHRpb25zLnBlcnNpc3RlbmNlICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLnBlcnNpc3RlbmNlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uc1sncmFuZG9tJ10gJiYgdHlwZW9mIG9wdGlvbnMucmFuZG9tICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMucmFuZG9tIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zWydtaW4nXSAmJiB0eXBlb2Ygb3B0aW9ucy5taW4gIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMubWluIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uc1snbWF4J10gJiYgdHlwZW9mIG9wdGlvbnMubWF4ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLm1heCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3B0aW9uc1Jlc3VsdCA9IHtcbiAgICBhbXBsaXR1ZGU6IDEuMCxcbiAgICBmcmVxdWVuY3k6IDEuMCxcbiAgICBtYXg6IDEuMCxcbiAgICBtaW46IC0xLjAsXG4gICAgb2N0YXZlczogMSxcbiAgICBwZXJzaXN0ZW5jZTogMC41LFxuICAgIHJhbmRvbTogTWF0aC5yYW5kb20sXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcbiAgaWYgKG9wdGlvbnNSZXN1bHQubWluID4gb3B0aW9uc1Jlc3VsdC5tYXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbiBtdXN0IGJlIHNtYWxsZXIgbWF4Jyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnNSZXN1bHQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGV4Tm9pc2Uge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxPcHRpb25zPikge1xuICAgIGNvbnN0IHsgbWluLCBtYXgsIHJhbmRvbSwgYW1wbGl0dWRlLCBmcmVxdWVuY3ksIG9jdGF2ZXMsIHBlcnNpc3RlbmNlIH0gPVxuICAgICAgY3JlYXRlT3B0aW9uc1dpdGhEZWZhdWx0cyhvcHRpb25zKTtcblxuICAgIHRoaXMucmFuZG9tID0gcmFuZG9tO1xuICAgIHRoaXMuYW1wbGl0dWRlID0gYW1wbGl0dWRlO1xuICAgIHRoaXMuZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMub2N0YXZlcyA9IG9jdGF2ZXM7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlO1xuXG4gICAgdGhpcy5zY2FsZSA9XG4gICAgICBtaW4gPT09IC0xICYmIG1heCA9PT0gMVxuICAgICAgICA/ICh2YWx1ZSkgPT4gdmFsdWVcbiAgICAgICAgOiAodmFsdWUpID0+IG1pbiArICgodmFsdWUgKyAxKSAvIDIpICogKG1heCAtIG1pbik7XG5cbiAgICBjb25zdCBwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICBwW2ldID0gaTtcbiAgICB9XG5cbiAgICBsZXQgbjogbnVtYmVyO1xuICAgIGxldCBxOiBudW1iZXI7XG4gICAgZm9yIChsZXQgaSA9IDI1NTsgaSA+IDA7IGktLSkge1xuICAgICAgbiA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIHRoaXMucmFuZG9tKCkpO1xuICAgICAgcSA9IHBbaV07XG4gICAgICBwW2ldID0gcFtuXTtcbiAgICAgIHBbbl0gPSBxO1xuICAgIH1cblxuICAgIHRoaXMucGVybSA9IG5ldyBVaW50OEFycmF5KDUxMik7XG4gICAgdGhpcy5wZXJtTW9kMTIgPSBuZXcgVWludDhBcnJheSg1MTIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTEyOyBpKyspIHtcbiAgICAgIHRoaXMucGVybVtpXSA9IHBbaSAmIDI1NV07XG4gICAgICB0aGlzLnBlcm1Nb2QxMltpXSA9IHRoaXMucGVybVtpXSAlIDEyO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBHMyA9IDEuMCAvIDYuMDtcblxuICBzdGF0aWMgR1JBRDNEID0gW1xuICAgIFsxLCAxLCAwXSxcbiAgICBbLTEsIDEsIDBdLFxuICAgIFsxLCAtMSwgMF0sXG4gICAgWy0xLCAtMSwgMF0sXG4gICAgWzEsIDAsIDFdLFxuICAgIFstMSwgMCwgMV0sXG4gICAgWzEsIDAsIC0xXSxcbiAgICBbLTEsIDAsIC0xXSxcbiAgICBbMCwgMSwgMV0sXG4gICAgWzAsIC0xLCAtMV0sXG4gICAgWzAsIDEsIC0xXSxcbiAgICBbMCwgLTEsIC0xXSxcbiAgXTtcblxuICByZWFkb25seSBhbXBsaXR1ZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgZnJlcXVlbmN5OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9jdGF2ZXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcGVybTogVWludDhBcnJheTtcbiAgcmVhZG9ubHkgcGVybU1vZDEyOiBVaW50OEFycmF5O1xuICByZWFkb25seSBwZXJzaXN0ZW5jZTogbnVtYmVyO1xuICByZWFkb25seSByYW5kb206ICgpID0+IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NhbGU6ICh2YWx1ZTogbnVtYmVyKSA9PiBudW1iZXI7XG4gIHByaXZhdGUgbWVtU2NhbGUzRDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gIGRvdChnczogbnVtYmVyW10sIGNvb3JkczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiBnc1xuICAgICAgLnNsaWNlKDAsIE1hdGgubWluKGdzLmxlbmd0aCwgY29vcmRzLmxlbmd0aCkpXG4gICAgICAucmVkdWNlKCh0b3RhbCwgZywgaSkgPT4gdG90YWwgKyBnICogY29vcmRzW2ldLCAwKTtcbiAgfVxuXG4gIHJhdzNEKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFNrZXcgdGhlIGlucHV0IHNwYWNlIHRvIGRldGVybWluZSB3aGljaCBzaW1wbGV4IGNlbGwgd2UncmUgaW5cbiAgICBjb25zdCBzID0gKHggKyB5ICsgeikgLyAzLjA7IC8vIFZlcnkgbmljZSBhbmQgc2ltcGxlIHNrZXcgZmFjdG9yIGZvciAzRFxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHggKyBzKTtcbiAgICBjb25zdCBqID0gTWF0aC5mbG9vcih5ICsgcyk7XG4gICAgY29uc3QgayA9IE1hdGguZmxvb3IoeiArIHMpO1xuICAgIGNvbnN0IHQgPSAoaSArIGogKyBrKSAqIFNpbXBsZXhOb2lzZS5HMztcbiAgICBjb25zdCBYMCA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSx6KSBzcGFjZVxuICAgIGNvbnN0IFkwID0gaiAtIHQ7XG4gICAgY29uc3QgWjAgPSBrIC0gdDtcbiAgICBjb25zdCB4MCA9IHggLSBYMDsgLy8gVGhlIHgseSx6IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxuICAgIGNvbnN0IHkwID0geSAtIFkwO1xuICAgIGNvbnN0IHowID0geiAtIFowO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHNpbXBsZXggd2UgYXJlIGluXG4gICAgbGV0IGkxOiBudW1iZXIsIGoxOiBudW1iZXIsIGsxOiBudW1iZXI7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3Jkc1xuICAgIGxldCBpMjogbnVtYmVyLCBqMjogbnVtYmVyLCBrMjogbnVtYmVyOyAvLyBPZmZzZXRzIGZvciB0aGlyZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3Jkc1xuICAgIGlmICh4MCA+PSB5MCkge1xuICAgICAgaWYgKHkwID49IHowKSB7XG4gICAgICAgIGkxID0gaTIgPSBqMiA9IDE7XG4gICAgICAgIGoxID0gazEgPSBrMiA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHgwID49IHowKSB7XG4gICAgICAgIGkxID0gaTIgPSBrMiA9IDE7XG4gICAgICAgIGoxID0gazEgPSBqMiA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrMSA9IGkyID0gazIgPSAxO1xuICAgICAgICBpMSA9IGoxID0gajIgPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoeTAgPCB6MCkge1xuICAgICAgICBrMSA9IGoyID0gazIgPSAxO1xuICAgICAgICBpMSA9IGoxID0gaTIgPSAwO1xuICAgICAgfSBlbHNlIGlmICh4MCA8IHowKSB7XG4gICAgICAgIGoxID0gajIgPSBrMiA9IDE7XG4gICAgICAgIGkxID0gazEgPSBpMiA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqMSA9IGkyID0gajIgPSAxO1xuICAgICAgICBpMSA9IGsxID0gazIgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHgxID0geDAgLSBpMSArIFNpbXBsZXhOb2lzZS5HMzsgLy8gT2Zmc2V0cyBmb3Igc2Vjb25kIGNvcm5lciBpbiAoeCx5LHopIGNvb3Jkc1xuICAgIGNvbnN0IHkxID0geTAgLSBqMSArIFNpbXBsZXhOb2lzZS5HMztcbiAgICBjb25zdCB6MSA9IHowIC0gazEgKyBTaW1wbGV4Tm9pc2UuRzM7XG4gICAgY29uc3QgeDIgPSB4MCAtIGkyICsgMi4wICogU2ltcGxleE5vaXNlLkczOyAvLyBPZmZzZXRzIGZvciB0aGlyZCBjb3JuZXIgaW4gKHgseSx6KSBjb29yZHNcbiAgICBjb25zdCB5MiA9IHkwIC0gajIgKyAyLjAgKiBTaW1wbGV4Tm9pc2UuRzM7XG4gICAgY29uc3QgejIgPSB6MCAtIGsyICsgMi4wICogU2ltcGxleE5vaXNlLkczO1xuICAgIGNvbnN0IHgzID0geDAgLSAxLjAgKyAzLjAgKiBTaW1wbGV4Tm9pc2UuRzM7IC8vIE9mZnNldHMgZm9yIGxhc3QgY29ybmVyIGluICh4LHkseikgY29vcmRzXG4gICAgY29uc3QgeTMgPSB5MCAtIDEuMCArIDMuMCAqIFNpbXBsZXhOb2lzZS5HMztcbiAgICBjb25zdCB6MyA9IHowIC0gMS4wICsgMy4wICogU2ltcGxleE5vaXNlLkczO1xuXG4gICAgLy8gV29yayBvdXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmb3VyIHNpbXBsZXggY29ybmVyc1xuICAgIGNvbnN0IGlpID0gaSAmIDI1NTtcbiAgICBjb25zdCBqaiA9IGogJiAyNTU7XG4gICAgY29uc3Qga2sgPSBrICYgMjU1O1xuICAgIGNvbnN0IGdpMCA9IHRoaXMucGVybU1vZDEyW2lpICsgdGhpcy5wZXJtW2pqICsgdGhpcy5wZXJtW2trXV1dO1xuICAgIGNvbnN0IGdpMSA9XG4gICAgICB0aGlzLnBlcm1Nb2QxMltpaSArIGkxICsgdGhpcy5wZXJtW2pqICsgajEgKyB0aGlzLnBlcm1ba2sgKyBrMV1dXTtcbiAgICBjb25zdCBnaTIgPVxuICAgICAgdGhpcy5wZXJtTW9kMTJbaWkgKyBpMiArIHRoaXMucGVybVtqaiArIGoyICsgdGhpcy5wZXJtW2trICsgazJdXV07XG4gICAgY29uc3QgZ2kzID0gdGhpcy5wZXJtTW9kMTJbaWkgKyAxICsgdGhpcy5wZXJtW2pqICsgMSArIHRoaXMucGVybVtrayArIDFdXV07XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmb3VyIGNvcm5lcnNcbiAgICBjb25zdCB0MCA9IDAuNSAtIHgwICogeDAgLSB5MCAqIHkwIC0gejAgKiB6MDtcbiAgICBjb25zdCBuMCA9XG4gICAgICB0MCA8IDBcbiAgICAgICAgPyAwLjBcbiAgICAgICAgOiBNYXRoLnBvdyh0MCwgNCkgKiB0aGlzLmRvdChTaW1wbGV4Tm9pc2UuR1JBRDNEW2dpMF0sIFt4MCwgeTAsIHowXSk7XG4gICAgY29uc3QgdDEgPSAwLjUgLSB4MSAqIHgxIC0geTEgKiB5MSAtIHoxICogejE7XG4gICAgY29uc3QgbjEgPVxuICAgICAgdDEgPCAwXG4gICAgICAgID8gMC4wXG4gICAgICAgIDogTWF0aC5wb3codDEsIDQpICogdGhpcy5kb3QoU2ltcGxleE5vaXNlLkdSQUQzRFtnaTFdLCBbeDEsIHkxLCB6MV0pO1xuICAgIGNvbnN0IHQyID0gMC41IC0geDIgKiB4MiAtIHkyICogeTIgLSB6MiAqIHoyO1xuICAgIGNvbnN0IG4yID1cbiAgICAgIHQyIDwgMFxuICAgICAgICA/IDAuMFxuICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIHRoaXMuZG90KFNpbXBsZXhOb2lzZS5HUkFEM0RbZ2kyXSwgW3gyLCB5MiwgejJdKTtcbiAgICBjb25zdCB0MyA9IDAuNSAtIHgzICogeDMgLSB5MyAqIHkzIC0gejMgKiB6MztcbiAgICBjb25zdCBuMyA9XG4gICAgICB0MyA8IDBcbiAgICAgICAgPyAwLjBcbiAgICAgICAgOiBNYXRoLnBvdyh0MywgNCkgKiB0aGlzLmRvdChTaW1wbGV4Tm9pc2UuR1JBRDNEW2dpM10sIFt4MywgeTMsIHozXSk7XG5cbiAgICAvLyBBZGQgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggY29ybmVyIHRvIGdldCB0aGUgZmluYWwgbm9pc2UgdmFsdWUuXG4gICAgLy8gVGhlIHJlc3VsdCBpcyBzY2FsZWQgdG8gc3RheSBqdXN0IGluc2lkZSBbLTEsMV1cbiAgICByZXR1cm4gOTQuNjg0OTMxNTA2ODE5NzIgKiAobjAgKyBuMSArIG4yICsgbjMpO1xuICB9XG5cbiAgc2NhbGVkM0QoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgcmVzb2x1dGlvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBtZW1JbmRleCA9IGAke01hdGgucm91bmQoeCAqIHJlc29sdXRpb24pfSR7TWF0aC5yb3VuZChcbiAgICAgIHkgKiByZXNvbHV0aW9uXG4gICAgKX0ke01hdGgucm91bmQoeiAqIHJlc29sdXRpb24pfWA7XG4gICAgY29uc3QgbWVtRWxlbSA9IHRoaXMubWVtU2NhbGUzRFttZW1JbmRleF07XG4gICAgaWYgKG1lbUVsZW0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1lbUVsZW07XG4gICAgfVxuXG4gICAgbGV0IGFtcGxpdHVkZSA9IHRoaXMuYW1wbGl0dWRlO1xuICAgIGxldCBmcmVxdWVuY3kgPSB0aGlzLmZyZXF1ZW5jeTtcbiAgICBsZXQgbWF4QW1wbGl0dWRlID0gMDtcbiAgICBsZXQgbm9pc2UgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9jdGF2ZXM7IGkrKykge1xuICAgICAgbm9pc2UgKz1cbiAgICAgICAgdGhpcy5yYXczRCh4ICogZnJlcXVlbmN5LCB5ICogZnJlcXVlbmN5LCB6ICogZnJlcXVlbmN5KSAqIGFtcGxpdHVkZTtcbiAgICAgIG1heEFtcGxpdHVkZSArPSBhbXBsaXR1ZGU7XG4gICAgICBhbXBsaXR1ZGUgKj0gdGhpcy5wZXJzaXN0ZW5jZTtcbiAgICAgIGZyZXF1ZW5jeSAqPSAyO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjYWxlKG5vaXNlIC8gbWF4QW1wbGl0dWRlKTtcbiAgICB0aGlzLm1lbVNjYWxlM0RbbWVtSW5kZXhdID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { createWsThanosOptions } from './create-ws-thanos-options';
3
+ export const WS_THANOS_OPTIONS_TOKEN = new InjectionToken('thanosOptions', {
4
+ providedIn: 'root',
5
+ factory: createWsThanosOptions,
6
+ });
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGhhbm9zLW9wdGlvbnMudG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3B1YmxpYy93cy10aGFub3Mvc3JjL2xpYi93cy10aGFub3Mtb3B0aW9ucy50b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR25FLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUN2RCxlQUFlLEVBQ2Y7SUFDRSxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUscUJBQXFCO0NBQy9CLENBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVXc1RoYW5vc09wdGlvbnMgfSBmcm9tICcuL2NyZWF0ZS13cy10aGFub3Mtb3B0aW9ucyc7XG5pbXBvcnQgeyBXc1RoYW5vc09wdGlvbnMgfSBmcm9tICcuL3dzLXRoYW5vcy5vcHRpb25zJztcblxuZXhwb3J0IGNvbnN0IFdTX1RIQU5PU19PUFRJT05TX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPFdzVGhhbm9zT3B0aW9ucz4oXG4gICd0aGFub3NPcHRpb25zJyxcbiAge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiBjcmVhdGVXc1RoYW5vc09wdGlvbnMsXG4gIH1cbik7XG4iXX0=
@@ -0,0 +1,58 @@
1
+ import { Directive, ElementRef, EventEmitter, Inject, NgZone, Output, } from '@angular/core';
2
+ import { WS_THANOS_OPTIONS_TOKEN } from './ws-thanos-options.token';
3
+ import { WsThanosService } from './ws-thanos.service';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./ws-thanos.service";
6
+ export class WsThanosDirective {
7
+ constructor(vaporizeDomElem, thanosService, thanosOptions, ngZone) {
8
+ this.vaporizeDomElem = vaporizeDomElem;
9
+ this.thanosService = thanosService;
10
+ this.thanosOptions = thanosOptions;
11
+ this.ngZone = ngZone;
12
+ this.wsThanosComplete = new EventEmitter();
13
+ }
14
+ vaporize(removeElem = true) {
15
+ const elem = this.vaporizeDomElem.nativeElement;
16
+ this.subscription = this.thanosService.vaporize(elem).subscribe({
17
+ complete: () => {
18
+ this.ngZone.run(() => {
19
+ if (removeElem) {
20
+ elem.remove();
21
+ }
22
+ else {
23
+ // make visible again
24
+ elem.style.transition = 'opacity 700ms';
25
+ elem.style.opacity = '1';
26
+ }
27
+ this.wsThanosComplete.emit();
28
+ });
29
+ },
30
+ error: (error) => {
31
+ console.error('error emitted by vaporize', error);
32
+ this.wsThanosComplete.emit();
33
+ },
34
+ });
35
+ return this.wsThanosComplete.asObservable();
36
+ }
37
+ ngOnDestroy() {
38
+ this.subscription?.unsubscribe();
39
+ }
40
+ }
41
+ WsThanosDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosDirective, deps: [{ token: i0.ElementRef }, { token: i1.WsThanosService }, { token: WS_THANOS_OPTIONS_TOKEN }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Directive });
42
+ WsThanosDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.5", type: WsThanosDirective, selector: "[wsThanos], ws-thanos", outputs: { wsThanosComplete: "wsThanosComplete" }, exportAs: ["thanos"], ngImport: i0 });
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosDirective, decorators: [{
44
+ type: Directive,
45
+ args: [{
46
+ selector: '[wsThanos], ws-thanos',
47
+ exportAs: 'thanos',
48
+ }]
49
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.WsThanosService }, { type: undefined, decorators: [{
50
+ type: Inject,
51
+ args: [WS_THANOS_OPTIONS_TOKEN]
52
+ }] }, { type: i0.NgZone, decorators: [{
53
+ type: Inject,
54
+ args: [NgZone]
55
+ }] }]; }, propDecorators: { wsThanosComplete: [{
56
+ type: Output
57
+ }] } });
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGhhbm9zLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcHVibGljL3dzLXRoYW5vcy9zcmMvbGliL3dzLXRoYW5vcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixNQUFNLEVBRU4sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBTXRELE1BQU0sT0FBTyxpQkFBaUI7SUFNNUIsWUFDbUIsZUFBd0MsRUFDeEMsYUFBOEIsRUFFOUIsYUFBOEIsRUFDZCxNQUFjO1FBSjlCLG9CQUFlLEdBQWYsZUFBZSxDQUF5QjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUFFOUIsa0JBQWEsR0FBYixhQUFhLENBQWlCO1FBQ2QsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQVB6QyxxQkFBZ0IsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQVFyRSxDQUFDO0lBRUcsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDO1FBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlELFFBQVEsRUFBRSxHQUFHLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNuQixJQUFJLFVBQVUsRUFBRTt3QkFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ2Y7eUJBQU07d0JBQ0wscUJBQXFCO3dCQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztxQkFDMUI7b0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMvQixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0IsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDOzs4R0F4Q1UsaUJBQWlCLDJFQVNsQix1QkFBdUIsYUFFdkIsTUFBTTtrR0FYTCxpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFKN0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxRQUFRLEVBQUUsUUFBUTtpQkFDbkI7OzBCQVVJLE1BQU07MkJBQUMsdUJBQXVCOzswQkFFOUIsTUFBTTsyQkFBQyxNQUFNOzRDQVBSLGdCQUFnQjtzQkFEdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBXU19USEFOT1NfT1BUSU9OU19UT0tFTiB9IGZyb20gJy4vd3MtdGhhbm9zLW9wdGlvbnMudG9rZW4nO1xuaW1wb3J0IHsgV3NUaGFub3NPcHRpb25zIH0gZnJvbSAnLi93cy10aGFub3Mub3B0aW9ucyc7XG5pbXBvcnQgeyBXc1RoYW5vc1NlcnZpY2UgfSBmcm9tICcuL3dzLXRoYW5vcy5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3dzVGhhbm9zXSwgd3MtdGhhbm9zJyxcbiAgZXhwb3J0QXM6ICd0aGFub3MnLFxufSlcbmV4cG9ydCBjbGFzcyBXc1RoYW5vc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIHdzVGhhbm9zQ29tcGxldGU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhcG9yaXplRG9tRWxlbTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSB0aGFub3NTZXJ2aWNlOiBXc1RoYW5vc1NlcnZpY2UsXG4gICAgQEluamVjdChXU19USEFOT1NfT1BUSU9OU19UT0tFTilcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRoYW5vc09wdGlvbnM6IFdzVGhhbm9zT3B0aW9ucyxcbiAgICBASW5qZWN0KE5nWm9uZSkgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgcHVibGljIHZhcG9yaXplKHJlbW92ZUVsZW0gPSB0cnVlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgZWxlbSA9IHRoaXMudmFwb3JpemVEb21FbGVtLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnRoYW5vc1NlcnZpY2UudmFwb3JpemUoZWxlbSkuc3Vic2NyaWJlKHtcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgaWYgKHJlbW92ZUVsZW0pIHtcbiAgICAgICAgICAgIGVsZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdmlzaWJsZSBhZ2FpblxuICAgICAgICAgICAgZWxlbS5zdHlsZS50cmFuc2l0aW9uID0gJ29wYWNpdHkgNzAwbXMnO1xuICAgICAgICAgICAgZWxlbS5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLndzVGhhbm9zQ29tcGxldGUuZW1pdCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIGVtaXR0ZWQgYnkgdmFwb3JpemUnLCBlcnJvcik7XG4gICAgICAgIHRoaXMud3NUaGFub3NDb21wbGV0ZS5lbWl0KCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMud3NUaGFub3NDb21wbGV0ZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,32 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { createWsThanosOptions } from './create-ws-thanos-options';
3
+ import { WS_THANOS_OPTIONS_TOKEN } from './ws-thanos-options.token';
4
+ import { WsThanosDirective } from './ws-thanos.directive';
5
+ import { WsThanosService } from './ws-thanos.service';
6
+ import * as i0 from "@angular/core";
7
+ export class WsThanosModule {
8
+ static forRoot(options) {
9
+ return {
10
+ ngModule: WsThanosModule,
11
+ providers: [
12
+ WsThanosService,
13
+ {
14
+ provide: WS_THANOS_OPTIONS_TOKEN,
15
+ useValue: createWsThanosOptions(options),
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ }
21
+ WsThanosModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
+ WsThanosModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosModule, declarations: [WsThanosDirective], exports: [WsThanosDirective] });
23
+ WsThanosModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosModule, imports: [[]] });
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosModule, decorators: [{
25
+ type: NgModule,
26
+ args: [{
27
+ declarations: [WsThanosDirective],
28
+ imports: [],
29
+ exports: [WsThanosDirective],
30
+ }]
31
+ }] });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGhhbm9zLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcHVibGljL3dzLXRoYW5vcy9zcmMvbGliL3dzLXRoYW5vcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQU90RCxNQUFNLE9BQU8sY0FBYztJQUN6QixNQUFNLENBQUMsT0FBTyxDQUNaLE9BQWtDO1FBRWxDLE9BQU87WUFDTCxRQUFRLEVBQUUsY0FBYztZQUN4QixTQUFTLEVBQUU7Z0JBQ1QsZUFBZTtnQkFDZjtvQkFDRSxPQUFPLEVBQUUsdUJBQXVCO29CQUNoQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDO2lCQUN6QzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7OzJHQWRVLGNBQWM7NEdBQWQsY0FBYyxpQkFKVixpQkFBaUIsYUFFdEIsaUJBQWlCOzRHQUVoQixjQUFjLFlBSGhCLEVBQUU7MkZBR0EsY0FBYztrQkFMMUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDakMsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUM7aUJBQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVdzVGhhbm9zT3B0aW9ucyB9IGZyb20gJy4vY3JlYXRlLXdzLXRoYW5vcy1vcHRpb25zJztcbmltcG9ydCB7IFdTX1RIQU5PU19PUFRJT05TX1RPS0VOIH0gZnJvbSAnLi93cy10aGFub3Mtb3B0aW9ucy50b2tlbic7XG5pbXBvcnQgeyBXc1RoYW5vc0RpcmVjdGl2ZSB9IGZyb20gJy4vd3MtdGhhbm9zLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBXc1RoYW5vc09wdGlvbnMgfSBmcm9tICcuL3dzLXRoYW5vcy5vcHRpb25zJztcblxuaW1wb3J0IHsgV3NUaGFub3NTZXJ2aWNlIH0gZnJvbSAnLi93cy10aGFub3Muc2VydmljZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1dzVGhhbm9zRGlyZWN0aXZlXSxcbiAgaW1wb3J0czogW10sXG4gIGV4cG9ydHM6IFtXc1RoYW5vc0RpcmVjdGl2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIFdzVGhhbm9zTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8V3NUaGFub3NPcHRpb25zPlxuICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFdzVGhhbm9zTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBXc1RoYW5vc01vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBXc1RoYW5vc1NlcnZpY2UsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBXU19USEFOT1NfT1BUSU9OU19UT0tFTixcbiAgICAgICAgICB1c2VWYWx1ZTogY3JlYXRlV3NUaGFub3NPcHRpb25zKG9wdGlvbnMpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGhhbm9zLm9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3B1YmxpYy93cy10aGFub3Mvc3JjL2xpYi93cy10aGFub3Mub3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBXc1RoYW5vc09wdGlvbnMge1xuICBhbmltYXRpb25MZW5ndGg6IG51bWJlcjtcbiAgbWF4UGFydGljbGVDb3VudDogbnVtYmVyO1xuICBwYXJ0aWNsZUFjY2VsZXJhdGlvbjogbnVtYmVyO1xufVxuIl19
@@ -0,0 +1,263 @@
1
+ import { Inject, Injectable, NgZone } from '@angular/core';
2
+ import { default as html2canvas } from 'html2canvas';
3
+ import { animationFrameScheduler, from, interval } from 'rxjs';
4
+ import { map, switchMap, takeWhile, tap, timeInterval } from 'rxjs/operators';
5
+ import { SimplexNoise } from './simplex-noise';
6
+ import { WS_THANOS_OPTIONS_TOKEN } from './ws-thanos-options.token';
7
+ import * as i0 from "@angular/core";
8
+ const PARTICLE_BYTE_LENGTH = 10;
9
+ const MIN_PARTICLE_ALPHA = ~~(255 * 0.01);
10
+ const HEIGHT_SCALE = 5;
11
+ const WIDTH_SCALE = 2;
12
+ const FLOW_FIELD_RES = 0.05;
13
+ export class WsThanosService {
14
+ constructor(thanosOptions, _ngZone) {
15
+ this.thanosOptions = thanosOptions;
16
+ this._ngZone = _ngZone;
17
+ }
18
+ static getParticleIndicesForBase(base) {
19
+ return {
20
+ x: base,
21
+ y: base + 1,
22
+ dx: base + 2,
23
+ dy: base + 3,
24
+ ax: base + 4,
25
+ ay: base + 5,
26
+ r: base + 6,
27
+ g: base + 7,
28
+ b: base + 8,
29
+ a: base + 9,
30
+ };
31
+ }
32
+ static getColorIndicesForCoord(x, y, width) {
33
+ const red = y * (width * 4) + x * 4;
34
+ return { r: red, g: red + 1, b: red + 2, a: red + 3 };
35
+ }
36
+ static updateParticles({ seed, noise, particlesData, thanosOptions, animationState, }) {
37
+ const { deltaTSec, animationT, maxWidth, maxHeight } = animationState;
38
+ const { particleAcceleration } = thanosOptions;
39
+ const { particles, maxParticleX, minParticleY } = particlesData;
40
+ // the time is used to calculate the vaporization front.
41
+ const time = Math.sin(animationT * (Math.PI / 2)) * 1.1;
42
+ const startAccelerateX = maxParticleX - time * maxParticleX;
43
+ const startAccelerateY = time * (maxHeight - minParticleY) + minParticleY;
44
+ const lengthY = maxHeight - startAccelerateY;
45
+ const accelerateRadiusPow = startAccelerateX * startAccelerateX + lengthY * lengthY;
46
+ for (let i = 0; i < particles.length; i += PARTICLE_BYTE_LENGTH) {
47
+ const { x, y, dx, dy, ax, ay, a } = WsThanosService.getParticleIndicesForBase(i);
48
+ const particleX = particles[x];
49
+ const particleY = particles[y];
50
+ // only update particles that are inside view and visible
51
+ if (particleX > maxWidth ||
52
+ particleX < 0 ||
53
+ particleY > maxHeight ||
54
+ particleY < 0 ||
55
+ particles[a] < MIN_PARTICLE_ALPHA) {
56
+ continue;
57
+ }
58
+ if (!(Math.abs(particles[ax]) > 0 || Math.abs(particles[ay]) > 0)) {
59
+ let pYLength = maxHeight - particleY;
60
+ let pXLength = particleX;
61
+ // we calculate some random looking numbers and functions to have nice looking vaporizing front of particles
62
+ // todo consider to use noise;
63
+ pXLength += Math.tan((pXLength / 20.12) * time + seed) * 0.5;
64
+ pXLength += (particleX % deltaTSec) * 0.5;
65
+ pXLength +=
66
+ 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 +=
69
+ Math.cos((pYLength / 100 + 2323.234) * time + seed * 456.1) * 23;
70
+ const pLength = pXLength * pXLength + pYLength * pYLength;
71
+ if (pLength > accelerateRadiusPow) {
72
+ particles[ax] = Math.random();
73
+ particles[ay] = Math.random() * -1;
74
+ }
75
+ }
76
+ else {
77
+ // use noise to flow along velocity field
78
+ const flowFieldAcc = WsThanosService.getXYFromFlowField(noise, seed, particleX, particleY);
79
+ const accelerationX = flowFieldAcc[0];
80
+ const accelerationY = flowFieldAcc[1];
81
+ particles[ax] += accelerationX;
82
+ particles[ay] += accelerationY;
83
+ }
84
+ // * Math.pow(1 + animationT, 4)
85
+ particles[dx] += particles[ax] * particleAcceleration * deltaTSec;
86
+ particles[dy] += particles[ay] * particleAcceleration * deltaTSec;
87
+ particles[x] += particles[dx] * deltaTSec;
88
+ particles[y] += particles[dy] * deltaTSec;
89
+ // fade particle out ( very late);
90
+ particles[a] *= 1 - Math.pow(animationT, 15); // 255 - Math.sqrt(particles[dx] * particles[dx] + particles[dy] * particles[dy]) / 1.2;
91
+ }
92
+ }
93
+ static drawParticles(drawCtx, particles) {
94
+ const { width, height } = drawCtx.canvas;
95
+ drawCtx.clearRect(0, 0, width, height);
96
+ const image = drawCtx.getImageData(0, 0, width, height);
97
+ const imageData = image.data;
98
+ for (let i = 0; i < particles.length; i += PARTICLE_BYTE_LENGTH) {
99
+ const particleX = particles[i];
100
+ const particleY = particles[i + 1];
101
+ const pI = WsThanosService.getParticleIndicesForBase(i);
102
+ if (particleX > width ||
103
+ particleX < 0 ||
104
+ particleY > height ||
105
+ particleY < 0 ||
106
+ particles[pI.a] < MIN_PARTICLE_ALPHA) {
107
+ continue;
108
+ }
109
+ const { r, g, b, a } = WsThanosService.getColorIndicesForCoord(~~particles[pI.x], ~~particles[pI.y], width);
110
+ imageData[r] = ~~particles[pI.r];
111
+ imageData[g] = ~~particles[pI.g];
112
+ imageData[b] = ~~particles[pI.b];
113
+ imageData[a] = ~~particles[pI.a];
114
+ }
115
+ drawCtx.putImageData(image, 0, 0);
116
+ }
117
+ static prepareCanvasForVaporize(divCanvas, maxParticleCount) {
118
+ const { width, height } = divCanvas;
119
+ // scale result canvas to have more room to draw particles while vaporizing;
120
+ const resultHeight = height * HEIGHT_SCALE;
121
+ const resultWidth = width * WIDTH_SCALE;
122
+ const resultCanvas = document.createElement('canvas');
123
+ resultCanvas.height = resultHeight;
124
+ resultCanvas.width = resultWidth;
125
+ const imageData = divCanvas
126
+ .getContext('2d')
127
+ ?.getImageData(0, 0, width, height);
128
+ if (imageData == null) {
129
+ throw new Error('Could not get image data from canvas');
130
+ }
131
+ const particlesData = WsThanosService.createParticlesForImageData(imageData, maxParticleCount, resultHeight);
132
+ return { resultCanvas, particlesData };
133
+ }
134
+ static createParticlesForImageData(imageData, maxParticleCount, resultHeight) {
135
+ const { width, height } = imageData;
136
+ let particleCandidates = 0;
137
+ let particleCount = 0;
138
+ const particleCandiatesList = [];
139
+ for (let y = 0; y < height; y++) {
140
+ for (let x = 0; x < width; x++) {
141
+ const { a } = WsThanosService.getColorIndicesForCoord(x, y, width);
142
+ if (imageData.data[a] >= MIN_PARTICLE_ALPHA) {
143
+ particleCandidates++;
144
+ particleCandiatesList.push({ x, y });
145
+ }
146
+ }
147
+ }
148
+ const maxNumParticles = Math.min(particleCandidates, maxParticleCount);
149
+ const particles = new Float32Array(Float32Array.BYTES_PER_ELEMENT * maxNumParticles * PARTICLE_BYTE_LENGTH);
150
+ let maxParticleX = 0;
151
+ let minParticleY = resultHeight;
152
+ while (particleCount < maxNumParticles) {
153
+ // select random index from candiates
154
+ const index = ~~(Math.random() * particleCandiatesList.length);
155
+ const { x, y } = particleCandiatesList[index];
156
+ // overwrite index with last element to prevent double selection of particles
157
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
158
+ particleCandiatesList[index] = particleCandiatesList.pop();
159
+ maxParticleX = Math.max(maxParticleX, x);
160
+ minParticleY = Math.min(minParticleY, y);
161
+ const { dx, dy, ax, ay, r, g, b, a, ...xy } = WsThanosService.getParticleIndicesForBase(particleCount * PARTICLE_BYTE_LENGTH);
162
+ particles[xy.x] = x;
163
+ particles[xy.y] = y + resultHeight - height;
164
+ particles[dx] = 0;
165
+ particles[dy] = 0;
166
+ particles[ax] = 0;
167
+ particles[ay] = 0;
168
+ const indicesImage = WsThanosService.getColorIndicesForCoord(x, y, width);
169
+ particles[r] = imageData.data[indicesImage.r];
170
+ particles[g] = imageData.data[indicesImage.g];
171
+ particles[b] = imageData.data[indicesImage.b];
172
+ particles[a] = imageData.data[indicesImage.a];
173
+ particleCount++;
174
+ }
175
+ return { particles, maxParticleX, minParticleY };
176
+ }
177
+ static getXYFromFlowField(noise, seed, x, y) {
178
+ const sampleX = noise.scaled3D(x, y, seed + 33.23, FLOW_FIELD_RES);
179
+ const sampleY = noise.scaled3D(x, seed / 13.23, y, FLOW_FIELD_RES) * -1;
180
+ return [sampleX, sampleY];
181
+ }
182
+ /**
183
+ * start the vaporize effect.
184
+ *
185
+ * It's running outside the ngZone.
186
+ */
187
+ vaporize(elem) {
188
+ return this._ngZone.runOutsideAngular(() => this.vaporizeIntern(elem));
189
+ }
190
+ vaporizeIntern(elem) {
191
+ elem.style.opacity = elem.style.opacity || '1';
192
+ elem.style.transition = `opacity ${Math.floor(this.thanosOptions.animationLength * 0.8)}ms ease-out`;
193
+ const noise = new SimplexNoise({ frequency: 0.01, min: 0 });
194
+ const seed = new Date().getDate() * Math.random();
195
+ const html2CanvasPromise = html2canvas(elem, {
196
+ backgroundColor: null,
197
+ scale: 1,
198
+ allowTaint: true,
199
+ windowHeight: window.innerHeight,
200
+ windowWidth: window.innerWidth,
201
+ scrollY: -window.scrollY,
202
+ });
203
+ return from(html2CanvasPromise).pipe(map((canvasFromHtmlElem) => {
204
+ const canvasAndParticles = WsThanosService.prepareCanvasForVaporize(canvasFromHtmlElem, this.thanosOptions.maxParticleCount);
205
+ const { resultCanvas } = canvasAndParticles;
206
+ if (elem.parentElement) {
207
+ elem.parentElement.style.position =
208
+ elem.parentElement.style.position || 'relative';
209
+ }
210
+ resultCanvas.style.position = 'absolute';
211
+ resultCanvas.style.left = 0 + 'px';
212
+ resultCanvas.style.top =
213
+ '-' + elem.getBoundingClientRect().height * (HEIGHT_SCALE - 1) + 'px';
214
+ resultCanvas.style.zIndex = '2000';
215
+ resultCanvas.style.pointerEvents = 'none';
216
+ elem.insertAdjacentElement('beforebegin', resultCanvas);
217
+ // this should start the transition above defined
218
+ elem.style.opacity = '0';
219
+ return canvasAndParticles;
220
+ }), switchMap(({ resultCanvas, particlesData }) => {
221
+ let time = 0;
222
+ const { animationLength, maxParticleCount, particleAcceleration } = this.thanosOptions;
223
+ return interval(1000 / 60, animationFrameScheduler).pipe(timeInterval(), tap((deltaT) => (time += deltaT.interval)), map((deltaT) => ({
224
+ deltaTSec: deltaT.interval / 1000,
225
+ animationT: time / animationLength,
226
+ maxWidth: resultCanvas.width,
227
+ maxHeight: resultCanvas.height,
228
+ })), tap((animationState) => {
229
+ WsThanosService.updateParticles({
230
+ particlesData,
231
+ animationState,
232
+ thanosOptions: {
233
+ animationLength,
234
+ maxParticleCount,
235
+ particleAcceleration,
236
+ },
237
+ noise,
238
+ seed,
239
+ });
240
+ const context = resultCanvas.getContext('2d');
241
+ if (context) {
242
+ WsThanosService.drawParticles(context, particlesData.particles);
243
+ }
244
+ }), takeWhile((animationState) => animationState.animationT <= 1), tap({
245
+ complete: () => {
246
+ return resultCanvas.remove();
247
+ },
248
+ }));
249
+ }));
250
+ }
251
+ }
252
+ WsThanosService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosService, deps: [{ token: WS_THANOS_OPTIONS_TOKEN }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
253
+ WsThanosService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosService });
254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: WsThanosService, decorators: [{
255
+ type: Injectable
256
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
257
+ type: Inject,
258
+ args: [WS_THANOS_OPTIONS_TOKEN]
259
+ }] }, { type: i0.NgZone, decorators: [{
260
+ type: Inject,
261
+ args: [NgZone]
262
+ }] }]; } });
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGhhbm9zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3B1YmxpYy93cy10aGFub3Mvc3JjL2xpYi93cy10aGFub3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxRQUFRLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBR3BFLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBcUM1QixNQUFNLE9BQU8sZUFBZTtJQUMxQixZQUVVLGFBQThCLEVBQ2QsT0FBZTtRQUQvQixrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUFRO0lBQ3RDLENBQUM7SUFFSSxNQUFNLENBQUMseUJBQXlCLENBQUMsSUFBWTtRQUNuRCxPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUk7WUFDUCxDQUFDLEVBQUUsSUFBSSxHQUFH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QUM7b0JBQzlCLGFBQWE7b0JBQ2IsY0FBYztvQkFDZCxhQUFhLEVBQUU7d0JBQ2IsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLG9CQUFvQjtxQkFDckI7b0JBQ0QsS0FBSztvQkFDTCxJQUFJO2lCQUNMLENBQUMsQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLE9BQU8sRUFBRTtvQkFDWCxlQUFlLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ2pFO1lBQ0gsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxFQUM3RCxHQUFHLENBQUM7Z0JBQ0YsUUFBUSxFQUFFLEdBQUcsRUFBRTtvQkFDYixPQUFPLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQzthQUNGLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OzRHQWpWVSxlQUFlLGtCQUVoQix1QkFBdUIsYUFFdkIsTUFBTTtnSEFKTCxlQUFlOzJGQUFmLGVBQWU7a0JBRDNCLFVBQVU7OzBCQUdOLE1BQU07MkJBQUMsdUJBQXVCOzswQkFFOUIsTUFBTTsyQkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZGVmYXVsdCBhcyBodG1sMmNhbnZhcyB9IGZyb20gJ2h0bWwyY2FudmFzJztcbmltcG9ydCB7IGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBmcm9tLCBpbnRlcnZhbCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRha2VXaGlsZSwgdGFwLCB0aW1lSW50ZXJ2YWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTaW1wbGV4Tm9pc2UgfSBmcm9tICcuL3NpbXBsZXgtbm9pc2UnO1xuaW1wb3J0IHsgV1NfVEhBTk9TX09QVElPTlNfVE9LRU4gfSBmcm9tICcuL3dzLXRoYW5vcy1vcHRpb25zLnRva2VuJztcbmltcG9ydCB7IFdzVGhhbm9zT3B0aW9ucyB9IGZyb20gJy4vd3MtdGhhbm9zLm9wdGlvbnMnO1xuXG5jb25zdCBQQVJUSUNMRV9CWVRFX0xFTkdUSCA9IDEwO1xuY29uc3QgTUlOX1BBUlRJQ0xFX0FMUEhBID0gfn4oMjU1ICogMC4wMSk7XG5jb25zdCBIRUlHSFRfU0NBTEUgPSA1O1xuY29uc3QgV0lEVEhfU0NBTEUgPSAyO1xuY29uc3QgRkxPV19GSUVMRF9SRVMgPSAwLjA1O1xuXG5pbnRlcmZhY2UgUGFydGljbGVzRGF0YSB7XG4gIHBhcnRpY2xlczogRmxvYXQzMkFycmF5O1xuICBtYXhQYXJ0aWNsZVg6IG51bWJlcjtcbiAgbWluUGFydGljbGVZOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBBbmltYXRpb25TdGF0ZSB7XG4gIGRlbHRhVFNlYzogbnVtYmVyO1xuICBhbmltYXRpb25UOiBudW1iZXI7XG4gIG1heFdpZHRoOiBudW1iZXI7XG4gIG1heEhlaWdodDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVXBkYXRlUGFydGljbGVQYXJhbXMge1xuICBwYXJ0aWNsZXNEYXRhOiBQYXJ0aWNsZXNEYXRhO1xuICBhbmltYXRpb25TdGF0ZTogQW5pbWF0aW9uU3RhdGU7XG4gIHRoYW5vc09wdGlvbnM6IFdzVGhhbm9zT3B0aW9ucztcbiAgbm9pc2U6IFNpbXBsZXhOb2lzZTtcbiAgc2VlZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUGFydGljbGVJbmRpY2VzIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGR4OiBudW1iZXI7XG4gIGR5OiBudW1iZXI7XG4gIGF4OiBudW1iZXI7XG4gIGF5OiBudW1iZXI7XG4gIHI6IG51bWJlcjtcbiAgZzogbnVtYmVyO1xuICBiOiBudW1iZXI7XG4gIGE6IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFdzVGhhbm9zU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoV1NfVEhBTk9TX09QVElPTlNfVE9LRU4pXG4gICAgcHJpdmF0ZSB0aGFub3NPcHRpb25zOiBXc1RoYW5vc09wdGlvbnMsXG4gICAgQEluamVjdChOZ1pvbmUpIHByaXZhdGUgX25nWm9uZTogTmdab25lXG4gICkge31cblxuICBwcml2YXRlIHN0YXRpYyBnZXRQYXJ0aWNsZUluZGljZXNGb3JCYXNlKGJhc2U6IG51bWJlcik6IFBhcnRpY2xlSW5kaWNlcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGJhc2UsXG4gICAgICB5OiBiYXNlICsgMSxcbiAgICAgIGR4OiBiYXNlICsgMixcbiAgICAgIGR5OiBiYXNlICsgMyxcbiAgICAgIGF4OiBiYXNlICsgNCxcbiAgICAgIGF5OiBiYXNlICsgNSxcbiAgICAgIHI6IGJhc2UgKyA2LFxuICAgICAgZzogYmFzZSArIDcsXG4gICAgICBiOiBiYXNlICsgOCxcbiAgICAgIGE6IGJhc2UgKyA5LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRDb2xvckluZGljZXNGb3JDb29yZChcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXJcbiAgKTogeyBhOiBudW1iZXI7IHI6IG51bWJlcjsgYjogbnVtYmVyOyBnOiBudW1iZXIgfSB7XG4gICAgY29uc3QgcmVkID0geSAqICh3aWR0aCAqIDQpICsgeCAqIDQ7XG4gICAgcmV0dXJuIHsgcjogcmVkLCBnOiByZWQgKyAxLCBiOiByZWQgKyAyLCBhOiByZWQgKyAzIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB1cGRhdGVQYXJ0aWNsZXMoe1xuICAgIHNlZWQsXG4gICAgbm9pc2UsXG4gICAgcGFydGljbGVzRGF0YSxcbiAgICB0aGFub3NPcHRpb25zLFxuICAgIGFuaW1hdGlvblN0YXRlLFxuICB9OiBVcGRhdGVQYXJ0aWNsZVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgZGVsdGFUU2VjLCBhbmltYXRpb25ULCBtYXhXaWR0aCwgbWF4SGVpZ2h0IH0gPSBhbmltYXRpb25TdGF0ZTtcbiAgICBjb25zdCB7IHBhcnRpY2xlQWNjZWxlcmF0aW9uIH0gPSB0aGFub3NPcHRpb25zO1xuICAgIGNvbnN0IHsgcGFydGljbGVzLCBtYXhQYXJ0aWNsZVgsIG1pblBhcnRpY2xlWSB9ID0gcGFydGljbGVzRGF0YTtcblxuICAgIC8vIHRoZSB0aW1lIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2YXBvcml6YXRpb24gZnJvbnQuXG4gICAgY29uc3QgdGltZSA9IE1hdGguc2luKGFuaW1hdGlvblQgKiAoTWF0aC5QSSAvIDIpKSAqIDEuMTtcblxuICAgIGNvbnN0IHN0YXJ0QWNjZWxlcmF0ZVggPSBtYXhQYXJ0aWNsZVggLSB0aW1lICogbWF4UGFydGljbGVYO1xuICAgIGNvbnN0IHN0YXJ0QWNjZWxlcmF0ZVkgPSB0aW1lICogKG1heEhlaWdodCAtIG1pblBhcnRpY2xlWSkgKyBtaW5QYXJ0aWNsZVk7XG5cbiAgICBjb25zdCBsZW5ndGhZID0gbWF4SGVpZ2h0IC0gc3RhcnRBY2NlbGVyYXRlWTtcbiAgICBjb25zdCBhY2NlbGVyYXRlUmFkaXVzUG93ID1cbiAgICAgIHN0YXJ0QWNjZWxlcmF0ZVggKiBzdGFydEFjY2VsZXJhdGVYICsgbGVuZ3RoWSAqIGxlbmd0aFk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRpY2xlcy5sZW5ndGg7IGkgKz0gUEFSVElDTEVfQllURV9MRU5HVEgpIHtcbiAgICAgIGNvbnN0IHsgeCwgeSwgZHgsIGR5LCBheCwgYXksIGEgfSA9XG4gICAgICAgIFdzVGhhbm9zU2VydmljZS5nZXRQYXJ0aWNsZUluZGljZXNGb3JCYXNlKGkpO1xuICAgICAgY29uc3QgcGFydGljbGVYID0gcGFydGljbGVzW3hdO1xuICAgICAgY29uc3QgcGFydGljbGVZID0gcGFydGljbGVzW3ldO1xuXG4gICAgICAvLyBvbmx5IHVwZGF0ZSBwYXJ0aWNsZXMgdGhhdCBhcmUgaW5zaWRlIHZpZXcgYW5kIHZpc2libGVcbiAgICAgIGlmIChcbiAgICAgICAgcGFydGljbGVYID4gbWF4V2lkdGggfHxcbiAgICAgICAgcGFydGljbGVYIDwgMCB8fFxuICAgICAgICBwYXJ0aWNsZVkgPiBtYXhIZWlnaHQgfHxcbiAgICAgICAgcGFydGljbGVZIDwgMCB8fFxuICAgICAgICBwYXJ0aWNsZXNbYV0gPCBNSU5fUEFSVElDTEVfQUxQSEFcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoTWF0aC5hYnMocGFydGljbGVzW2F4XSkgPiAwIHx8IE1hdGguYWJzKHBhcnRpY2xlc1theV0pID4gMCkpIHtcbiAgICAgICAgbGV0IHBZTGVuZ3RoID0gbWF4SGVpZ2h0IC0gcGFydGljbGVZO1xuICAgICAgICBsZXQgcFhMZW5ndGggPSBwYXJ0aWNsZVg7XG5cbiAgICAgICAgLy8gd2UgY2FsY3VsYXRlIHNvbWUgcmFuZG9tIGxvb2tpbmcgbnVtYmVycyBhbmQgZnVuY3Rpb25zIHRvIGhhdmUgbmljZSBsb29raW5nIHZhcG9yaXppbmcgZnJvbnQgb2YgcGFydGljbGVzXG4gICAgICAgIC8vIHRvZG8gY29uc2lkZXIgdG8gdXNlIG5vaXNlO1xuICAgICAgICBwWExlbmd0aCArPSBNYXRoLnRhbigocFhMZW5ndGggLyAyMC4xMikgKiB0aW1lICsgc2VlZCkgKiAwLjU7XG4gICAgICAgIHBYTGVuZ3RoICs9IChwYXJ0aWNsZVggJSBkZWx0YVRTZWMpICogMC41O1xuICAgICAgICBwWExlbmd0aCArPVxuICAgICAgICAgIE1hdGguc2luKChwWExlbmd0aCAvIDMwICsgNzIzLjM5NCkgKiB0aW1lICsgc2VlZCAqIDEyLjUpICogMTE7XG4gICAgICAgIHBZTGVuZ3RoICs9IE1hdGgudGFuKChwWUxlbmd0aCAvIDAuNDUpICogdGltZSArIHNlZWQgKiAxLjUpICogMC41O1xuICAgICAgICBwWUxlbmd0aCArPVxuICAgICAgICAgIE1hdGguY29zKChwWUxlbmd0aCAvIDEwMCArIDIzMjMuMjM0KSAqIHRpbWUgKyBzZWVkICogNDU2LjEpICogMjM7XG5cbiAgICAgICAgY29uc3QgcExlbmd0aCA9IHBYTGVuZ3RoICogcFhMZW5ndGggKyBwWUxlbmd0aCAqIHBZTGVuZ3RoO1xuICAgICAgICBpZiAocExlbmd0aCA+IGFjY2VsZXJhdGVSYWRpdXNQb3cpIHtcbiAgICAgICAgICBwYXJ0aWNsZXNbYXhdID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgICBwYXJ0aWNsZXNbYXldID0gTWF0aC5yYW5kb20oKSAqIC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2Ugbm9pc2UgdG8gZmxvdyBhbG9uZyB2ZWxvY2l0eSBmaWVsZFxuICAgICAgICBjb25zdCBmbG93RmllbGRBY2MgPSBXc1RoYW5vc1NlcnZpY2UuZ2V0WFlGcm9tRmxvd0ZpZWxkKFxuICAgICAgICAgIG5vaXNlLFxuICAgICAgICAgIHNlZWQsXG4gICAgICAgICAgcGFydGljbGVYLFxuICAgICAgICAgIHBhcnRpY2xlWVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBhY2NlbGVyYXRpb25YID0gZmxvd0ZpZWxkQWNjWzBdO1xuICAgICAgICBjb25zdCBhY2NlbGVyYXRpb25ZID0gZmxvd0ZpZWxkQWNjWzFdO1xuICAgICAgICBwYXJ0aWNsZXNbYXhdICs9IGFjY2VsZXJhdGlvblg7XG4gICAgICAgIHBhcnRpY2xlc1theV0gKz0gYWNjZWxlcmF0aW9uWTtcbiAgICAgIH1cblxuICAgICAgLy8gKiBNYXRoLnBvdygxICsgYW5pbWF0aW9uVCwgNClcbiAgICAgIHBhcnRpY2xlc1tkeF0gKz0gcGFydGljbGVzW2F4XSAqIHBhcnRpY2xlQWNjZWxlcmF0aW9uICogZGVsdGFUU2VjO1xuICAgICAgcGFydGljbGVzW2R5XSArPSBwYXJ0aWNsZXNbYXldICogcGFydGljbGVBY2NlbGVyYXRpb24gKiBkZWx0YVRTZWM7XG4gICAgICBwYXJ0aWNsZXNbeF0gKz0gcGFydGljbGVzW2R4XSAqIGRlbHRhVFNlYztcbiAgICAgIHBhcnRpY2xlc1t5XSArPSBwYXJ0aWNsZXNbZHldICogZGVsdGFUU2VjO1xuICAgICAgLy8gZmFkZSBwYXJ0aWNsZSBvdXQgKCB2ZXJ5IGxhdGUpO1xuICAgICAgcGFydGljbGVzW2FdICo9IDEgLSBNYXRoLnBvdyhhbmltYXRpb25ULCAxNSk7IC8vIDI1NSAtIE1hdGguc3FydChwYXJ0aWNsZXNbZHhdICogcGFydGljbGVzW2R4XSArIHBhcnRpY2xlc1tkeV0gKiBwYXJ0aWNsZXNbZHldKSAvIDEuMjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkcmF3UGFydGljbGVzKFxuICAgIGRyYXdDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgICBwYXJ0aWNsZXM6IEZsb2F0MzJBcnJheVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGRyYXdDdHguY2FudmFzO1xuICAgIGRyYXdDdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IGltYWdlID0gZHJhd0N0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2UuZGF0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRpY2xlcy5sZW5ndGg7IGkgKz0gUEFSVElDTEVfQllURV9MRU5HVEgpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2xlWCA9IHBhcnRpY2xlc1tpXTtcbiAgICAgIGNvbnN0IHBhcnRpY2xlWSA9IHBhcnRpY2xlc1tpICsgMV07XG4gICAgICBjb25zdCBwSSA9IFdzVGhhbm9zU2VydmljZS5nZXRQYXJ0aWNsZUluZGljZXNGb3JCYXNlKGkpO1xuICAgICAgaWYgKFxuICAgICAgICBwYXJ0aWNsZVggPiB3aWR0aCB8fFxuICAgICAgICBwYXJ0aWNsZVggPCAwIHx8XG4gICAgICAgIHBhcnRpY2xlWSA+IGhlaWdodCB8fFxuICAgICAgICBwYXJ0aWNsZVkgPCAwIHx8XG4gICAgICAgIHBhcnRpY2xlc1twSS5hXSA8IE1JTl9QQVJUSUNMRV9BTFBIQVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByLCBnLCBiLCBhIH0gPSBXc1RoYW5vc1NlcnZpY2UuZ2V0Q29sb3JJbmRpY2VzRm9yQ29vcmQoXG4gICAgICAgIH5+cGFydGljbGVzW3BJLnhdLFxuICAgICAgICB+fnBhcnRpY2xlc1twSS55XSxcbiAgICAgICAgd2lkdGhcbiAgICAgICk7XG4gICAgICBpbWFnZURhdGFbcl0gPSB+fnBhcnRpY2xlc1twSS5yXTtcbiAgICAgIGltYWdlRGF0YVtnXSA9IH5+cGFydGljbGVzW3BJLmddO1xuICAgICAgaW1hZ2VEYXRhW2JdID0gfn5wYXJ0aWNsZXNbcEkuYl07XG4gICAgICBpbWFnZURhdGFbYV0gPSB+fnBhcnRpY2xlc1twSS5hXTtcbiAgICB9XG4gICAgZHJhd0N0eC5wdXRJbWFnZURhdGEoaW1hZ2UsIDAsIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcHJlcGFyZUNhbnZhc0ZvclZhcG9yaXplKFxuICAgIGRpdkNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgbWF4UGFydGljbGVDb3VudDogbnVtYmVyXG4gICk6IHtcbiAgICBwYXJ0aWNsZXNEYXRhOiBQYXJ0aWNsZXNEYXRhO1xuICAgIHJlc3VsdENhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIH0ge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZGl2Q2FudmFzO1xuXG4gICAgLy8gc2NhbGUgcmVzdWx0IGNhbnZhcyB0byBoYXZlIG1vcmUgcm9vbSB0byBkcmF3IHBhcnRpY2xlcyB3aGlsZSB2YXBvcml6aW5nO1xuICAgIGNvbnN0IHJlc3VsdEhlaWdodCA9IGhlaWdodCAqIEhFSUdIVF9TQ0FMRTtcbiAgICBjb25zdCByZXN1bHRXaWR0aCA9IHdpZHRoICogV0lEVEhfU0NBTEU7XG4gICAgY29uc3QgcmVzdWx0Q2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHJlc3VsdENhbnZhcy5oZWlnaHQgPSByZXN1bHRIZWlnaHQ7XG4gICAgcmVzdWx0Q2FudmFzLndpZHRoID0gcmVzdWx0V2lkdGg7XG5cbiAgICBjb25zdCBpbWFnZURhdGEgPSBkaXZDYW52YXNcbiAgICAgIC5nZXRDb250ZXh0KCcyZCcpXG4gICAgICA/LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAoaW1hZ2VEYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGdldCBpbWFnZSBkYXRhIGZyb20gY2FudmFzJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRpY2xlc0RhdGEgPSBXc1RoYW5vc1NlcnZpY2UuY3JlYXRlUGFydGljbGVzRm9ySW1hZ2VEYXRhKFxuICAgICAgaW1hZ2VEYXRhLFxuICAgICAgbWF4UGFydGljbGVDb3VudCxcbiAgICAgIHJlc3VsdEhlaWdodFxuICAgICk7XG4gICAgcmV0dXJuIHsgcmVzdWx0Q2FudmFzLCBwYXJ0aWNsZXNEYXRhIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQYXJ0aWNsZXNGb3JJbWFnZURhdGEoXG4gICAgaW1hZ2VEYXRhOiBJbWFnZURhdGEsXG4gICAgbWF4UGFydGljbGVDb3VudDogbnVtYmVyLFxuICAgIHJlc3VsdEhlaWdodDogbnVtYmVyXG4gICk6IHsgbWluUGFydGljbGVZOiBudW1iZXI7IG1heFBhcnRpY2xlWDogbnVtYmVyOyBwYXJ0aWNsZXM6IEZsb2F0MzJBcnJheSB9IHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGltYWdlRGF0YTtcbiAgICBsZXQgcGFydGljbGVDYW5kaWRhdGVzID0gMDtcbiAgICBsZXQgcGFydGljbGVDb3VudCA9IDA7XG5cbiAgICBjb25zdCBwYXJ0aWNsZUNhbmRpYXRlc0xpc3Q6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVtdID0gW107XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIGNvbnN0IHsgYSB9ID0gV3NUaGFub3NTZXJ2aWNlLmdldENvbG9ySW5kaWNlc0ZvckNvb3JkKHgsIHksIHdpZHRoKTtcbiAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhW2FdID49IE1JTl9QQVJUSUNMRV9BTFBIQSkge1xuICAgICAgICAgIHBhcnRpY2xlQ2FuZGlkYXRlcysrO1xuICAgICAgICAgIHBhcnRpY2xlQ2FuZGlhdGVzTGlzdC5wdXNoKHsgeCwgeSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1heE51bVBhcnRpY2xlcyA9IE1hdGgubWluKHBhcnRpY2xlQ2FuZGlkYXRlcywgbWF4UGFydGljbGVDb3VudCk7XG4gICAgY29uc3QgcGFydGljbGVzID0gbmV3IEZsb2F0MzJBcnJheShcbiAgICAgIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIG1heE51bVBhcnRpY2xlcyAqIFBBUlRJQ0xFX0JZVEVfTEVOR1RIXG4gICAgKTtcblxuICAgIGxldCBtYXhQYXJ0aWNsZVggPSAwO1xuICAgIGxldCBtaW5QYXJ0aWNsZVkgPSByZXN1bHRIZWlnaHQ7XG4gICAgd2hpbGUgKHBhcnRpY2xlQ291bnQgPCBtYXhOdW1QYXJ0aWNsZXMpIHtcbiAgICAgIC8vIHNlbGVjdCByYW5kb20gaW5kZXggZnJvbSBjYW5kaWF0ZXNcbiAgICAgIGNvbnN0IGluZGV4ID0gfn4oTWF0aC5yYW5kb20oKSAqIHBhcnRpY2xlQ2FuZGlhdGVzTGlzdC5sZW5ndGgpO1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSBwYXJ0aWNsZUNhbmRpYXRlc0xpc3RbaW5kZXhdO1xuXG4gICAgICAvLyBvdmVyd3JpdGUgaW5kZXggd2l0aCBsYXN0IGVsZW1lbnQgdG8gcHJldmVudCBkb3VibGUgc2VsZWN0aW9uIG9mIHBhcnRpY2xlc1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIHBhcnRpY2xlQ2FuZGlhdGVzTGlzdFtpbmRleF0gPSBwYXJ0aWNsZUNhbmRpYXRlc0xpc3QucG9wKCkhO1xuXG4gICAgICBtYXhQYXJ0aWNsZVggPSBNYXRoLm1heChtYXhQYXJ0aWNsZVgsIHgpO1xuICAgICAgbWluUGFydGljbGVZID0gTWF0aC5taW4obWluUGFydGljbGVZLCB5KTtcbiAgICAgIGNvbnN0IHsgZHgsIGR5LCBheCwgYXksIHIsIGcsIGIsIGEsIC4uLnh5IH0gPVxuICAgICAgICBXc1RoYW5vc1NlcnZpY2UuZ2V0UGFydGljbGVJbmRpY2VzRm9yQmFzZShcbiAgICAgICAgICBwYXJ0aWNsZUNvdW50ICogUEFSVElDTEVfQllURV9MRU5HVEhcbiAgICAgICAgKTtcbiAgICAgIHBhcnRpY2xlc1t4eS54XSA9IHg7XG4gICAgICBwYXJ0aWNsZXNbeHkueV0gPSB5ICsgcmVzdWx0SGVpZ2h0IC0gaGVpZ2h0O1xuICAgICAgcGFydGljbGVzW2R4XSA9IDA7XG4gICAgICBwYXJ0aWNsZXNbZHldID0gMDtcbiAgICAgIHBhcnRpY2xlc1theF0gPSAwO1xuICAgICAgcGFydGljbGVzW2F5XSA9IDA7XG5cbiAgICAgIGNvbnN0IGluZGljZXNJbWFnZSA9IFdzVGhhbm9zU2VydmljZS5nZXRDb2xvckluZGljZXNGb3JDb29yZCh4LCB5LCB3aWR0aCk7XG5cbiAgICAgIHBhcnRpY2xlc1tyXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5yXTtcbiAgICAgIHBhcnRpY2xlc1tnXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5nXTtcbiAgICAgIHBhcnRpY2xlc1tiXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5iXTtcbiAgICAgIHBhcnRpY2xlc1thXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5hXTtcbiAgICAgIHBhcnRpY2xlQ291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIHsgcGFydGljbGVzLCBtYXhQYXJ0aWNsZVgsIG1pblBhcnRpY2xlWSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0WFlGcm9tRmxvd0ZpZWxkKFxuICAgIG5vaXNlOiBTaW1wbGV4Tm9pc2UsXG4gICAgc2VlZDogbnVtYmVyLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3Qgc2FtcGxlWCA9IG5vaXNlLnNjYWxlZDNEKHgsIHksIHNlZWQgKyAzMy4yMywgRkxPV19GSUVMRF9SRVMpO1xuICAgIGNvbnN0IHNhbXBsZVkgPSBub2lzZS5zY2FsZWQzRCh4LCBzZWVkIC8gMTMuMjMsIHksIEZMT1dfRklFTERfUkVTKSAqIC0xO1xuICAgIHJldHVybiBbc2FtcGxlWCwgc2FtcGxlWV07XG4gIH1cblxuICAvKipcbiAgICogc3RhcnQgdGhlIHZhcG9yaXplIGVmZmVjdC5cbiAgICpcbiAgICogSXQncyBydW5uaW5nIG91dHNpZGUgdGhlIG5nWm9uZS5cbiAgICovXG4gIHZhcG9yaXplKGVsZW06IEhUTUxFbGVtZW50KTogT2JzZXJ2YWJsZTxBbmltYXRpb25TdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy52YXBvcml6ZUludGVybihlbGVtKSk7XG4gIH1cblxuICBwcml2YXRlIHZhcG9yaXplSW50ZXJuKGVsZW06IEhUTUxFbGVtZW50KTogT2JzZXJ2YWJsZTxBbmltYXRpb25TdGF0ZT4ge1xuICAgIGVsZW0uc3R5bGUub3BhY2l0eSA9IGVsZW0uc3R5bGUub3BhY2l0eSB8fCAnMSc7XG4gICAgZWxlbS5zdHlsZS50cmFuc2l0aW9uID0gYG9wYWNpdHkgJHtNYXRoLmZsb29yKFxuICAgICAgdGhpcy50aGFub3NPcHRpb25zLmFuaW1hdGlvbkxlbmd0aCAqIDAuOFxuICAgICl9bXMgZWFzZS1vdXRgO1xuICAgIGNvbnN0IG5vaXNlID0gbmV3IFNpbXBsZXhOb2lzZSh7IGZyZXF1ZW5jeTogMC4wMSwgbWluOiAwIH0pO1xuICAgIGNvbnN0IHNlZWQgPSBuZXcgRGF0ZSgpLmdldERhdGUoKSAqIE1hdGgucmFuZG9tKCk7XG4gICAgY29uc3QgaHRtbDJDYW52YXNQcm9taXNlOiBQcm9taXNlPEhUTUxDYW52YXNFbGVtZW50PiA9IGh0bWwyY2FudmFzKGVsZW0sIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogbnVsbCxcbiAgICAgIHNjYWxlOiAxLFxuICAgICAgYWxsb3dUYWludDogdHJ1ZSxcbiAgICAgIHdpbmRvd0hlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgd2luZG93V2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgc2Nyb2xsWTogLXdpbmRvdy5zY3JvbGxZLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZyb20oaHRtbDJDYW52YXNQcm9taXNlKS5waXBlKFxuICAgICAgbWFwKChjYW52YXNGcm9tSHRtbEVsZW0pID0+IHtcbiAgICAgICAgY29uc3QgY2FudmFzQW5kUGFydGljbGVzID0gV3NUaGFub3NTZXJ2aWNlLnByZXBhcmVDYW52YXNGb3JWYXBvcml6ZShcbiAgICAgICAgICBjYW52YXNGcm9tSHRtbEVsZW0sXG4gICAgICAgICAgdGhpcy50aGFub3NPcHRpb25zLm1heFBhcnRpY2xlQ291bnRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgeyByZXN1bHRDYW52YXMgfSA9IGNhbnZhc0FuZFBhcnRpY2xlcztcbiAgICAgICAgaWYgKGVsZW0ucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgIGVsZW0ucGFyZW50RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9XG4gICAgICAgICAgICBlbGVtLnBhcmVudEVsZW1lbnQuc3R5bGUucG9zaXRpb24gfHwgJ3JlbGF0aXZlJztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRDYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICByZXN1bHRDYW52YXMuc3R5bGUubGVmdCA9IDAgKyAncHgnO1xuICAgICAgICByZXN1bHRDYW52YXMuc3R5bGUudG9wID1cbiAgICAgICAgICAnLScgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAqIChIRUlHSFRfU0NBTEUgLSAxKSArICdweCc7XG4gICAgICAgIHJlc3VsdENhbnZhcy5zdHlsZS56SW5kZXggPSAnMjAwMCc7XG4gICAgICAgIHJlc3VsdENhbnZhcy5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXG4gICAgICAgIGVsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIHJlc3VsdENhbnZhcyk7XG4gICAgICAgIC8vIHRoaXMgc2hvdWxkIHN0YXJ0IHRoZSB0cmFuc2l0aW9uIGFib3ZlIGRlZmluZWRcbiAgICAgICAgZWxlbS5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICByZXR1cm4gY2FudmFzQW5kUGFydGljbGVzO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKHsgcmVzdWx0Q2FudmFzLCBwYXJ0aWNsZXNEYXRhIH0pID0+IHtcbiAgICAgICAgbGV0IHRpbWUgPSAwO1xuICAgICAgICBjb25zdCB7IGFuaW1hdGlvbkxlbmd0aCwgbWF4UGFydGljbGVDb3VudCwgcGFydGljbGVBY2NlbGVyYXRpb24gfSA9XG4gICAgICAgICAgdGhpcy50aGFub3NPcHRpb25zO1xuICAgICAgICByZXR1cm4gaW50ZXJ2YWwoMTAwMCAvIDYwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlcikucGlwZShcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwoKSxcbiAgICAgICAgICB0YXAoKGRlbHRhVCkgPT4gKHRpbWUgKz0gZGVsdGFULmludGVydmFsKSksXG4gICAgICAgICAgbWFwKFxuICAgICAgICAgICAgKGRlbHRhVCkgPT5cbiAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICBkZWx0YVRTZWM6IGRlbHRhVC5pbnRlcnZhbCAvIDEwMDAsXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uVDogdGltZSAvIGFuaW1hdGlvbkxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogcmVzdWx0Q2FudmFzLndpZHRoLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogcmVzdWx0Q2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgICAgfSBhcyBBbmltYXRpb25TdGF0ZSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRhcCgoYW5pbWF0aW9uU3RhdGUpID0+IHtcbiAgICAgICAgICAgIFdzVGhhbm9zU2VydmljZS51cGRhdGVQYXJ0aWNsZXMoe1xuICAgICAgICAgICAgICBwYXJ0aWNsZXNEYXRhLFxuICAgICAgICAgICAgICBhbmltYXRpb25TdGF0ZSxcbiAgICAgICAgICAgICAgdGhhbm9zT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbkxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXhQYXJ0aWNsZUNvdW50LFxuICAgICAgICAgICAgICAgIHBhcnRpY2xlQWNjZWxlcmF0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub2lzZSxcbiAgICAgICAgICAgICAgc2VlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHJlc3VsdENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgV3NUaGFub3NTZXJ2aWNlLmRyYXdQYXJ0aWNsZXMoY29udGV4dCwgcGFydGljbGVzRGF0YS5wYXJ0aWNsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VXaGlsZSgoYW5pbWF0aW9uU3RhdGUpID0+IGFuaW1hdGlvblN0YXRlLmFuaW1hdGlvblQgPD0gMSksXG4gICAgICAgICAgdGFwKHtcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRDYW52YXMucmVtb3ZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29sc29rLXRoYW5vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcHVibGljL3dzLXRoYW5vcy9zcmMvd29sc29rLXRoYW5vcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
package/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from './lib/ws-thanos.service';
2
+ export * from './lib/ws-thanos.directive';
3
+ export * from './lib/ws-thanos.module';
4
+ export * from './lib/ws-thanos.options';
5
+ export * from './lib/ws-thanos-options.token';
6
+ export * from './lib/create-ws-thanos-options';
@@ -0,0 +1,2 @@
1
+ import { WsThanosOptions } from './ws-thanos.options';
2
+ export declare function createWsThanosOptions(options?: Partial<WsThanosOptions>): WsThanosOptions;
@@ -0,0 +1,26 @@
1
+ export interface Options {
2
+ amplitude: number;
3
+ frequency: number;
4
+ max: number;
5
+ min: number;
6
+ octaves: number;
7
+ persistence: number;
8
+ random: () => number;
9
+ }
10
+ export declare class SimplexNoise {
11
+ constructor(options?: Partial<Options>);
12
+ static G3: number;
13
+ static GRAD3D: number[][];
14
+ readonly amplitude: number;
15
+ readonly frequency: number;
16
+ readonly octaves: number;
17
+ readonly perm: Uint8Array;
18
+ readonly permMod12: Uint8Array;
19
+ readonly persistence: number;
20
+ readonly random: () => number;
21
+ readonly scale: (value: number) => number;
22
+ private memScale3D;
23
+ dot(gs: number[], coords: number[]): number;
24
+ raw3D(x: number, y: number, z: number): number;
25
+ scaled3D(x: number, y: number, z: number, resolution: number): number;
26
+ }
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { WsThanosOptions } from './ws-thanos.options';
3
+ export declare const WS_THANOS_OPTIONS_TOKEN: InjectionToken<WsThanosOptions>;
@@ -0,0 +1,18 @@
1
+ import { ElementRef, NgZone, OnDestroy } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { 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>;
18
+ }
@@ -0,0 +1,10 @@
1
+ import { ModuleWithProviders } from '@angular/core';
2
+ import { WsThanosOptions } from './ws-thanos.options';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./ws-thanos.directive";
5
+ export declare class WsThanosModule {
6
+ static forRoot(options?: Partial<WsThanosOptions>): ModuleWithProviders<WsThanosModule>;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosModule, never>;
8
+ static ɵmod: i0.ɵɵNgModuleDeclaration<WsThanosModule, [typeof i1.WsThanosDirective], never, [typeof i1.WsThanosDirective]>;
9
+ static ɵinj: i0.ɵɵInjectorDeclaration<WsThanosModule>;
10
+ }
@@ -0,0 +1,5 @@
1
+ export interface WsThanosOptions {
2
+ animationLength: number;
3
+ maxParticleCount: number;
4
+ particleAcceleration: number;
5
+ }
@@ -0,0 +1,32 @@
1
+ import { NgZone } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { 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 ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@wolsok/thanos",
3
+ "version": "1.0.0",
4
+ "description": "wolsok's implementation of a cool thanos vaporizing effect for destroying dom elements",
5
+ "bugs": {
6
+ "url": "https://github.com/SuperheroicCoding/AngularExamples/issues"
7
+ },
8
+ "homepage": "https://angularexamples.wolsok.de",
9
+ "repository": "https://github.com/SuperheroicCoding/AngularExamples/issues",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "superheroicCoding",
13
+ "wolsok",
14
+ "angular",
15
+ "angular-lib",
16
+ "particles",
17
+ "animations",
18
+ "effects",
19
+ "html2canvas",
20
+ "rxjs"
21
+ ],
22
+ "peerDependencies": {
23
+ "html2canvas": "^1.3.2",
24
+ "@angular/common": "^13.0.1",
25
+ "@angular/core": "^13.0.1",
26
+ "@angular/platform-browser": "13.2.5",
27
+ "rxjs": "7.5.4",
28
+ "zone.js": "0.11.4",
29
+ "@angular/platform-browser-dynamic": "13.2.5"
30
+ },
31
+ "dependencies": {
32
+ "tslib": "^2.3.0"
33
+ },
34
+ "module": "esm2020/wolsok-thanos.mjs",
35
+ "es2020": "esm2020/wolsok-thanos.mjs",
36
+ "esm2020": "esm2020/wolsok-thanos.mjs",
37
+ "typings": "wolsok-thanos.d.ts",
38
+ "sideEffects": false
39
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@wolsok/thanos" />
5
+ export * from './index';