async-reactivity 2.1.0 → 2.2.1

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/lib/computed.js CHANGED
@@ -5,6 +5,7 @@ import Effect, { EffectState, InSyncSymbol } from "./effect.js";
5
5
  class CircularDependencyError extends Error {
6
6
  }
7
7
  export default class Computed extends Effect {
8
+ oldValue;
8
9
  _value;
9
10
  getter;
10
11
  isEqual;
@@ -12,7 +13,7 @@ export default class Computed extends Effect {
12
13
  deferrer;
13
14
  constructor(getter, isEqual = (defaultIsEqual), timeToLive) {
14
15
  super(((value, _firstRun, abortSignal) => {
15
- return getter(value, this._value, abortSignal);
16
+ return getter(value, this.oldValue, abortSignal);
16
17
  }), true);
17
18
  this.getter = getter;
18
19
  this.isEqual = isEqual;
@@ -26,12 +27,31 @@ export default class Computed extends Effect {
26
27
  }
27
28
  get value() {
28
29
  if (this.state === EffectState.Initial || this.state === EffectState.Scheduled) {
29
- const oldValue = this._value;
30
+ this.oldValue = this._value;
30
31
  const newValue = this.run();
31
- if (newValue !== InSyncSymbol) {
32
- this._value = newValue;
33
- if (this.dependents.size > 0 && this.isEqual(this._value, oldValue)) {
34
- this.validateDependents();
32
+ if (newValue === InSyncSymbol) {
33
+ this.validateDependents();
34
+ }
35
+ else {
36
+ if (newValue instanceof Promise) {
37
+ // @ts-expect-error
38
+ this._value = Promise.all([newValue, this.oldValue])
39
+ .then(([newValue, oldValue]) => {
40
+ if (newValue === InSyncSymbol) {
41
+ this.validateDependents();
42
+ return oldValue;
43
+ }
44
+ if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
45
+ this.validateDependents();
46
+ }
47
+ return newValue;
48
+ });
49
+ }
50
+ else {
51
+ this._value = newValue;
52
+ if (this.dependents.size > 0 && this.isEqual(newValue, this.oldValue)) {
53
+ this.validateDependents();
54
+ }
35
55
  }
36
56
  }
37
57
  }
@@ -115,6 +115,23 @@ describe('computed', function () {
115
115
  assert.strictEqual(c.value, 6);
116
116
  assert.strictEqual(gate, 1);
117
117
  });
118
+ it('ignore in sync dependencies', function () {
119
+ let gate = 0;
120
+ const a = new Ref(5);
121
+ const b = new Computed((value) => {
122
+ return value(a) % 2 + 5;
123
+ });
124
+ const c = new Computed((value) => value(b));
125
+ const d = new Computed((value) => {
126
+ gate++;
127
+ return value(c);
128
+ });
129
+ assert.strictEqual(d.value, 6);
130
+ assert.strictEqual(gate, 1);
131
+ a.value = 7;
132
+ assert.strictEqual(d.value, 6);
133
+ assert.strictEqual(gate, 1);
134
+ });
118
135
  it('compute when forced', function () {
119
136
  let gate = 0;
120
137
  const a = new Ref(5);
@@ -304,6 +321,40 @@ describe('computed', function () {
304
321
  assert.strictEqual(await v, 5);
305
322
  assert.strictEqual(gate, 1);
306
323
  });
324
+ it('ignore same computed values', async function () {
325
+ let gate = 0;
326
+ const a = new Ref(5);
327
+ const b1 = new Computed(async (value) => {
328
+ return value(a) % 2;
329
+ });
330
+ const b2 = new Computed(async () => 5);
331
+ const c = new Computed(async (value) => {
332
+ gate++;
333
+ return await value(b1) + await value(b2);
334
+ });
335
+ assert.strictEqual(await c.value, 6);
336
+ assert.strictEqual(gate, 1);
337
+ a.value = 7;
338
+ assert.strictEqual(await c.value, 6);
339
+ assert.strictEqual(gate, 1);
340
+ });
341
+ it('ignore in sync dependencies', async function () {
342
+ let gate = 0;
343
+ const a = new Ref(5);
344
+ const b = new Computed(async (value) => {
345
+ return value(a) % 2 + 5;
346
+ });
347
+ const c = new Computed(async (value) => await value(b));
348
+ const d = new Computed(async (value) => {
349
+ gate++;
350
+ return await value(c);
351
+ });
352
+ assert.strictEqual(await d.value, 6);
353
+ assert.strictEqual(gate, 1);
354
+ a.value = 7;
355
+ assert.strictEqual(await d.value, 6);
356
+ assert.strictEqual(gate, 1);
357
+ });
307
358
  it('reset computed', async function () {
308
359
  const a = new Ref(5);
309
360
  let gate = 0;
package/lib/effect.js CHANGED
@@ -31,21 +31,48 @@ export default class Effect {
31
31
  trackDependency = this.innerTrackDependency.bind(this);
32
32
  run() {
33
33
  let firstRun = this.state === EffectState.Initial;
34
- if (this.state === EffectState.Scheduled) {
35
- const inSync = [...this.dependencies.entries()].every(([d, inSync]) => {
36
- if (!inSync) {
37
- d.value;
38
- return this.dependencies.get(d);
39
- }
40
- return inSync;
41
- });
42
- if (inSync) {
43
- this.state = EffectState.Waiting;
44
- return InSyncSymbol;
45
- }
46
- }
34
+ let checkInSync = this.state === EffectState.Scheduled;
47
35
  this.state = EffectState.Running;
48
36
  const getResult = () => {
37
+ if (checkInSync) {
38
+ const dependenciesInSync = (iterator = this.dependencies.entries()) => {
39
+ const next = iterator.next();
40
+ if (next.done) {
41
+ return true;
42
+ }
43
+ const [d, inSync] = next.value;
44
+ const completeCheck = () => {
45
+ if (!this.dependencies.get(d)) {
46
+ return false;
47
+ }
48
+ return dependenciesInSync(iterator);
49
+ };
50
+ if (!inSync) {
51
+ const result = d.value;
52
+ if (result instanceof Promise) {
53
+ return result.then(completeCheck);
54
+ }
55
+ }
56
+ return completeCheck();
57
+ };
58
+ const resultMaybePromise = dependenciesInSync();
59
+ if (resultMaybePromise instanceof Promise) {
60
+ return resultMaybePromise.then(result => {
61
+ if (result) {
62
+ this.state = EffectState.Waiting;
63
+ return InSyncSymbol;
64
+ }
65
+ else {
66
+ checkInSync = false;
67
+ return getResult();
68
+ }
69
+ });
70
+ }
71
+ else if (resultMaybePromise) {
72
+ this.state = EffectState.Waiting;
73
+ return InSyncSymbol;
74
+ }
75
+ }
49
76
  this.clearDependencies(runPromise);
50
77
  this.abortHandler = (() => {
51
78
  const handler = {
@@ -66,6 +93,7 @@ export default class Effect {
66
93
  const completeRun = (resolve, result, err, async) => {
67
94
  if (this.abortHandler.aborted) {
68
95
  firstRun = false;
96
+ checkInSync = false;
69
97
  if (this.computed || async) {
70
98
  return getResult();
71
99
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "async-reactivity",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "types": "types/index.d.ts",
@@ -137,6 +137,26 @@ describe('computed', function () {
137
137
  assert.strictEqual(gate, 1);
138
138
  });
139
139
 
140
+ it('ignore in sync dependencies', function() {
141
+ let gate = 0;
142
+ const a = new Ref(5);
143
+ const b = new Computed((value) => {
144
+ return value(a) % 2 + 5;
145
+ });
146
+ const c = new Computed((value) => value(b));
147
+ const d = new Computed((value) => {
148
+ gate++;
149
+ return value(c);
150
+ });
151
+
152
+ assert.strictEqual(d.value, 6);
153
+ assert.strictEqual(gate, 1);
154
+
155
+ a.value = 7;
156
+ assert.strictEqual(d.value, 6);
157
+ assert.strictEqual(gate, 1);
158
+ });
159
+
140
160
  it('compute when forced', function () {
141
161
  let gate = 0;
142
162
  const a = new Ref(5);
@@ -351,6 +371,46 @@ describe('computed', function () {
351
371
  assert.strictEqual(gate, 1);
352
372
  });
353
373
 
374
+ it('ignore same computed values', async function () {
375
+ let gate = 0;
376
+ const a = new Ref(5);
377
+ const b1 = new Computed(async (value) => {
378
+ return value(a) % 2;
379
+ });
380
+ const b2 = new Computed(async () => 5);
381
+ const c = new Computed(async (value) => {
382
+ gate++;
383
+ return await value(b1) + await value(b2);
384
+ });
385
+
386
+ assert.strictEqual(await c.value, 6);
387
+ assert.strictEqual(gate, 1);
388
+
389
+ a.value = 7;
390
+ assert.strictEqual(await c.value, 6);
391
+ assert.strictEqual(gate, 1);
392
+ });
393
+
394
+ it('ignore in sync dependencies', async function() {
395
+ let gate = 0;
396
+ const a = new Ref(5);
397
+ const b = new Computed(async (value) => {
398
+ return value(a) % 2 + 5;
399
+ });
400
+ const c = new Computed(async (value) => await value(b));
401
+ const d = new Computed(async (value) => {
402
+ gate++;
403
+ return await value(c);
404
+ });
405
+
406
+ assert.strictEqual(await d.value, 6);
407
+ assert.strictEqual(gate, 1);
408
+
409
+ a.value = 7;
410
+ assert.strictEqual(await d.value, 6);
411
+ assert.strictEqual(gate, 1);
412
+ });
413
+
354
414
  it('reset computed', async function () {
355
415
  const a = new Ref(5);
356
416
  let gate = 0;
package/src/computed.ts CHANGED
@@ -12,6 +12,7 @@ export declare type ComputeFuncScoped<T1, T2> = (value: TrackValue, scope: T1, p
12
12
  class CircularDependencyError extends Error { }
13
13
 
14
14
  export default class Computed<T> extends Effect implements Dependent, Dependency<T> {
15
+ private oldValue?: T;
15
16
  private _value?: T;
16
17
  getter: ComputeFunc<T>;
17
18
  isEqual: typeof defaultIsEqual<T>;
@@ -21,7 +22,7 @@ export default class Computed<T> extends Effect implements Dependent, Dependency
21
22
  constructor(getter: ComputeFunc<T>, isEqual = defaultIsEqual<T>, timeToLive?: number) {
22
23
 
23
24
  super(((value, _firstRun, abortSignal) => {
24
- return getter(value, this._value, abortSignal);
25
+ return getter(value, this.oldValue, abortSignal);
25
26
  }), true);
26
27
 
27
28
  this.getter = getter;
@@ -38,12 +39,29 @@ export default class Computed<T> extends Effect implements Dependent, Dependency
38
39
 
39
40
  public get value(): T {
40
41
  if (this.state === EffectState.Initial || this.state === EffectState.Scheduled) {
41
- const oldValue = this._value!;
42
+ this.oldValue = this._value!;
42
43
  const newValue = this.run() as T;
43
- if (newValue !== InSyncSymbol) {
44
- this._value = newValue;
45
- if (this.dependents.size > 0 && this.isEqual(this._value!, oldValue)) {
46
- this.validateDependents();
44
+ if (newValue === InSyncSymbol) {
45
+ this.validateDependents();
46
+ } else {
47
+ if (newValue instanceof Promise) {
48
+ // @ts-expect-error
49
+ this._value = Promise.all([newValue, this.oldValue])
50
+ .then(([newValue, oldValue]) => {
51
+ if (newValue === InSyncSymbol) {
52
+ this.validateDependents();
53
+ return oldValue;
54
+ }
55
+ if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
56
+ this.validateDependents();
57
+ }
58
+ return newValue;
59
+ });
60
+ } else {
61
+ this._value = newValue;
62
+ if (this.dependents.size > 0 && this.isEqual(newValue, this.oldValue)) {
63
+ this.validateDependents();
64
+ }
47
65
  }
48
66
  }
49
67
  }
package/src/effect.ts CHANGED
@@ -37,24 +37,54 @@ export default class Effect implements Dependent {
37
37
 
38
38
  run() {
39
39
  let firstRun = this.state === EffectState.Initial;
40
-
41
- if (this.state === EffectState.Scheduled) {
42
- const inSync = [...this.dependencies.entries()].every(([d, inSync]) => {
43
- if (!inSync) {
44
- d.value;
45
- return this.dependencies.get(d);
46
- }
47
- return inSync;
48
- });
49
- if (inSync) {
50
- this.state = EffectState.Waiting;
51
- return InSyncSymbol;
52
- }
53
- }
40
+ let checkInSync = this.state === EffectState.Scheduled;
54
41
 
55
42
  this.state = EffectState.Running;
56
43
 
57
44
  const getResult = (): unknown | Promise<unknown> => {
45
+ if (checkInSync) {
46
+ const dependenciesInSync = (iterator = this.dependencies.entries()): boolean | Promise<boolean> => {
47
+ const next = iterator.next();
48
+ if (next.done) {
49
+ return true;
50
+ }
51
+
52
+ const [d, inSync] = next.value;
53
+
54
+ const completeCheck = () => {
55
+ if (!this.dependencies.get(d)) {
56
+ return false;
57
+ }
58
+ return dependenciesInSync(iterator);
59
+ };
60
+
61
+ if (!inSync) {
62
+ const result = d.value;
63
+ if (result instanceof Promise) {
64
+ return result.then(completeCheck);
65
+ }
66
+ }
67
+
68
+ return completeCheck();
69
+ };
70
+
71
+ const resultMaybePromise = dependenciesInSync();
72
+ if (resultMaybePromise instanceof Promise) {
73
+ return resultMaybePromise.then(result => {
74
+ if (result) {
75
+ this.state = EffectState.Waiting;
76
+ return InSyncSymbol;
77
+ } else {
78
+ checkInSync = false;
79
+ return getResult();
80
+ }
81
+ });
82
+ } else if (resultMaybePromise) {
83
+ this.state = EffectState.Waiting;
84
+ return InSyncSymbol;
85
+ }
86
+ }
87
+
58
88
  this.clearDependencies(runPromise);
59
89
  this.abortHandler = (() => {
60
90
  const handler = {
@@ -76,6 +106,7 @@ export default class Effect implements Dependent {
76
106
  const completeRun = (resolve: boolean, result: unknown, err: unknown, async: boolean) => {
77
107
  if (this.abortHandler!.aborted) {
78
108
  firstRun = false;
109
+ checkInSync = false;
79
110
  if (this.computed || async) {
80
111
  return getResult();
81
112
  }
@@ -6,6 +6,7 @@ export declare type TrackValue = (<T>(dependency: Dependency<T>) => T) & (<T>(de
6
6
  export declare type ComputeFunc<T> = (value: TrackValue, previousValue: T | undefined, abortSignal: AbortSignal) => T;
7
7
  export declare type ComputeFuncScoped<T1, T2> = (value: TrackValue, scope: T1, previousValue: T2 | undefined, abortSignal: AbortSignal) => T2;
8
8
  export default class Computed<T> extends Effect implements Dependent, Dependency<T> {
9
+ private oldValue?;
9
10
  private _value?;
10
11
  getter: ComputeFunc<T>;
11
12
  isEqual: typeof defaultIsEqual<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAGjD,OAAO,MAAqC,MAAM,aAAa,CAAC;AAEhE,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAC,CAAC;AACtH,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,EAAE,CAAC;AAI9I,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,MAAO,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,MAAM,CAAC,CAAI;IACnB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAEhB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,4BAAoB,EAAE,UAAU,CAAC,EAAE,MAAM;IAkBpF,IAAW,KAAK,IAAI,CAAC,CAapB;IAED,OAAO,CAAC,kBAAkB;IAMnB,YAAY,CAAC,SAAS,EAAE,SAAS;IAOjC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,gBAAoB,GAAG,IAAI;IAKxE,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAW3C,eAAe;IAaf,KAAK;IAKL,OAAO;CAGjB"}
1
+ {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAGjD,OAAO,MAAqC,MAAM,aAAa,CAAC;AAEhE,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAC,CAAC;AACtH,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,EAAE,CAAC;AAI9I,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,MAAO,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,CAAI;IACrB,OAAO,CAAC,MAAM,CAAC,CAAI;IACnB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAEhB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,4BAAoB,EAAE,UAAU,CAAC,EAAE,MAAM;IAkBpF,IAAW,KAAK,IAAI,CAAC,CA8BpB;IAED,OAAO,CAAC,kBAAkB;IAMnB,YAAY,CAAC,SAAS,EAAE,SAAS;IAOjC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,gBAAoB,GAAG,IAAI;IAKxE,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAW3C,eAAe;IAaf,KAAK;IAKL,OAAO;CAGjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhI,oBAAY,WAAW;IACnB,OAAO,IAAA;IACP,OAAO,IAAA;IACP,OAAO,IAAA;IACP,SAAS,IAAA;CACZ;AAED,eAAO,MAAM,YAAY,eAAmB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,MAAO,YAAW,SAAS;IAKhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAc,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ1E,SAAS,CAAC,KAAK,cAAuB;IACtC,SAAS,CAAC,YAAY,oCAA2C;IACjE,OAAO,CAAC,YAAY,CAAC,CAA6F;gBAErF,MAAM,EAAE,UAAU,EAAmB,QAAQ,UAAQ;IAMlF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe,CAAsD;IAE7E,GAAG;IA8EH,OAAO,CAAC,iBAAiB;IAOzB,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAa3C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC;IAIxC,OAAO;CASV"}
1
+ {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhI,oBAAY,WAAW;IACnB,OAAO,IAAA;IACP,OAAO,IAAA;IACP,OAAO,IAAA;IACP,SAAS,IAAA;CACZ;AAED,eAAO,MAAM,YAAY,eAAmB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,MAAO,YAAW,SAAS;IAKhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAc,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ1E,SAAS,CAAC,KAAK,cAAuB;IACtC,SAAS,CAAC,YAAY,oCAA2C;IACjE,OAAO,CAAC,YAAY,CAAC,CAA6F;gBAErF,MAAM,EAAE,UAAU,EAAmB,QAAQ,UAAQ;IAMlF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe,CAAsD;IAE7E,GAAG;IA6GH,OAAO,CAAC,iBAAiB;IAOzB,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAa3C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC;IAIxC,OAAO;CASV"}