resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
257 lines • 19.3 kB
JavaScript
/**
* Stream Coalgebra System
* Mathematical foundation for streaming signals using coalgebra patterns
* Following the pattern: State → (Output × State)
*/
import { signal } from '../core/signal';
// Create a streaming signal from a coalgebra
export const createStreamingSignal = (initialValue, coalgebra) => {
const baseSignal = signal(initialValue);
const state = signal({
buffer: [],
lastEmitted: Date.now(),
isActive: true,
errorCount: 0,
});
const subscribers = new Set();
const streamSubscribers = new Set();
const notify = (value) => {
subscribers.forEach((fn) => {
try {
fn(value);
}
catch (error) {
// Suppress subscription errors to prevent stream interruption
}
});
streamSubscribers.forEach((fn) => {
try {
fn(value);
}
catch (error) {
// Suppress subscription errors to prevent stream interruption
}
});
};
const streamingSignal = {
value: baseSignal.value,
map: (f) => {
const mapped = createStreamingSignal(f(baseSignal.value()));
baseSignal.subscribe((value) => mapped._set(f(value)));
return mapped;
},
subscribe: (fn) => {
subscribers.add(fn);
return () => subscribers.delete(fn);
},
// Async iteration support
stream: async function* () {
const values = [];
let resolve = null;
const unsubscribe = streamingSignal.subscribe((value) => {
if (resolve) {
resolve(value);
resolve = null;
}
else {
values.push(value);
}
});
try {
while (state.value().isActive) {
if (values.length > 0) {
yield values.shift();
}
else {
yield await new Promise((res) => {
resolve = res;
});
}
}
}
finally {
unsubscribe();
}
},
// Buffer values into arrays
buffer: (size) => {
const buffered = signal([]);
const buffer = [];
streamingSignal.subscribe((value) => {
buffer.push(value);
if (buffer.length >= size) {
buffered._set([
...buffer,
]);
buffer.splice(0, buffer.length);
}
});
return buffered;
},
// Throttle emissions
throttle: (ms) => {
const throttled = createStreamingSignal(baseSignal.value());
let lastEmit = 0;
let timeoutId = null;
let pendingValue = null;
streamingSignal.subscribe((value) => {
const now = Date.now();
pendingValue = value;
if (now - lastEmit >= ms) {
lastEmit = now;
throttled._set(value);
pendingValue = null;
}
else if (!timeoutId) {
timeoutId = (typeof window !== 'undefined' ? window.setTimeout : setTimeout)(() => {
if (pendingValue !== null) {
throttled._set(pendingValue);
lastEmit = Date.now();
}
timeoutId = null;
pendingValue = null;
}, ms - (now - lastEmit));
}
});
return throttled;
},
// Handle backpressure
backpressure: (strategy) => {
const backpressured = createStreamingSignal(baseSignal.value());
const maxBuffer = 1000;
const buffer = [];
let emittedCount = 0;
streamingSignal.subscribe((value) => {
switch (strategy) {
case 'drop':
if (emittedCount < maxBuffer) {
backpressured._set(value);
emittedCount++;
}
// Drop values beyond maxBuffer
break;
case 'buffer':
buffer.push(value);
if (buffer.length > 0) {
backpressured._set(buffer.shift());
}
break;
case 'error':
if (emittedCount >= maxBuffer) {
throw new Error('Stream buffer overflow');
}
backpressured._set(value);
emittedCount++;
break;
}
});
return backpressured;
},
// Take only first n values
take: (count) => {
const taken = createStreamingSignal(baseSignal.value());
let emitted = 0;
streamingSignal.subscribe((value) => {
if (emitted < count) {
taken._set(value);
emitted++;
if (emitted >= count) {
taken.state.value().isActive = false;
}
}
});
return taken;
},
// Skip first n values
skip: (count) => {
const skipped = createStreamingSignal(baseSignal.value());
let skippedCount = 0;
streamingSignal.subscribe((value) => {
if (skippedCount >= count) {
skipped._set(value);
}
else {
skippedCount++;
}
});
return skipped;
},
// Filter values
filter: (predicate) => {
const filtered = createStreamingSignal(baseSignal.value());
streamingSignal.subscribe((value) => {
if (predicate(value)) {
filtered._set(value);
}
});
return filtered;
},
// Transform values
transform: (fn) => {
const transformed = createStreamingSignal(fn(baseSignal.value()));
streamingSignal.subscribe((value) => {
transformed._set(fn(value));
});
return transformed;
},
// Merge with another stream
merge: (other) => {
const merged = createStreamingSignal(baseSignal.value());
streamingSignal.subscribe((value) => merged._set(value));
other.subscribe((value) => merged._set(value));
return merged;
},
// Debounce emissions
debounce: (ms) => {
const debounced = createStreamingSignal(baseSignal.value());
let timeoutId = null;
streamingSignal.subscribe((value) => {
if (timeoutId) {
clearTimeout(timeoutId);
}
timeoutId = (typeof window !== 'undefined' ? window.setTimeout : setTimeout)(() => {
debounced._set(value);
timeoutId = null;
}, ms);
});
return debounced;
},
};
// Add _set method for internal use
streamingSignal._set = (value) => {
baseSignal._set(value);
notify(value);
// Apply coalgebra if provided
if (coalgebra) {
const currentState = state.value();
coalgebra.observe(currentState);
const newState = coalgebra.transition(currentState);
state._set(newState);
}
};
streamingSignal.state = state;
return streamingSignal;
};
// Utility function to create a stream from values
export const streamFrom = (...values) => {
const stream = createStreamingSignal(values[0] || null);
// Emit values asynchronously
Promise.resolve().then(async () => {
for (const value of values) {
stream._set(value);
await new Promise((resolve) => setTimeout(resolve, 0));
}
});
return stream;
};
// Create a stream from an async iterable
export const streamFromIterable = (iterable) => {
const stream = createStreamingSignal(null);
(async () => {
for await (const value of iterable) {
stream._set(value);
}
})();
return stream;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29hbGdlYnJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0cmVhbWluZy9jb2FsZ2VicmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBVSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWlDaEQsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQ25DLFlBQWUsRUFDZixTQUE4QyxFQUMxQixFQUFFO0lBQ3RCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQWlCO1FBQ25DLE1BQU0sRUFBRSxFQUFFO1FBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDdkIsUUFBUSxFQUFFLElBQUk7UUFDZCxVQUFVLEVBQUUsQ0FBQztLQUNkLENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQ2xELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7SUFFeEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFRLEVBQUUsRUFBRTtRQUMxQixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDO2dCQUNILEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNaLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLDhEQUE4RDtZQUNoRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ1osQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsOERBQThEO1lBQ2hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUF1QjtRQUMxQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdkIsR0FBRyxFQUFFLENBQUksQ0FBYyxFQUFFLEVBQUU7WUFDekIsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzVCLE1BQXdELENBQUMsSUFBSSxDQUM1RCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQ1QsQ0FDRixDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLEVBQWtCLEVBQUUsRUFBRTtZQUNoQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLE1BQU0sRUFBRSxLQUFLLFNBQVMsQ0FBQztZQUNyQixNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7WUFDdkIsSUFBSSxPQUFPLEdBQWdDLElBQUksQ0FBQztZQUVoRCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3RELElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNmLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzlCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDdEIsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFHLENBQUM7b0JBQ3hCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTs0QkFDakMsT0FBTyxHQUFHLEdBQUcsQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztvQkFBUyxDQUFDO2dCQUNULFdBQVcsRUFBRSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLE1BQU0sRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBTSxFQUFFLENBQUMsQ0FBQztZQUNqQyxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7WUFFdkIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3pCLFFBQXlELENBQUMsSUFBSSxDQUFDO3dCQUM5RCxHQUFHLE1BQU07cUJBQ1YsQ0FBQyxDQUFDO29CQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtZQUN2QixNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO1lBQzFCLElBQUksWUFBWSxHQUFhLElBQUksQ0FBQztZQUVsQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFFckIsSUFBSSxHQUFHLEdBQUcsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUN6QixRQUFRLEdBQUcsR0FBRyxDQUFDO29CQUNkLFNBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMvQixZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixDQUFDO3FCQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDdEIsU0FBUyxHQUFHLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FDMUUsR0FBRyxFQUFFO3dCQUNILElBQUksWUFBWSxLQUFLLElBQUksRUFBRSxDQUFDOzRCQUN6QixTQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzs0QkFDdEMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDeEIsQ0FBQzt3QkFDRCxTQUFTLEdBQUcsSUFBSSxDQUFDO3dCQUNqQixZQUFZLEdBQUcsSUFBSSxDQUFDO29CQUN0QixDQUFDLEVBQ0QsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUN0QixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsWUFBWSxFQUFFLENBQUMsUUFBOEIsRUFBRSxFQUFFO1lBQy9DLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQztZQUN2QixNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7WUFDdkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBRXJCLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEMsUUFBUSxRQUFRLEVBQUUsQ0FBQztvQkFDakIsS0FBSyxNQUFNO3dCQUNULElBQUksWUFBWSxHQUFHLFNBQVMsRUFBRSxDQUFDOzRCQUM1QixhQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDbkMsWUFBWSxFQUFFLENBQUM7d0JBQ2pCLENBQUM7d0JBQ0QsK0JBQStCO3dCQUMvQixNQUFNO29CQUNSLEtBQUssUUFBUTt3QkFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNuQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ3JCLGFBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUcsQ0FBQyxDQUFDO3dCQUMvQyxDQUFDO3dCQUNELE1BQU07b0JBQ1IsS0FBSyxPQUFPO3dCQUNWLElBQUksWUFBWSxJQUFJLFNBQVMsRUFBRSxDQUFDOzRCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7d0JBQzVDLENBQUM7d0JBQ0EsYUFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25DLFlBQVksRUFBRSxDQUFDO3dCQUNmLE1BQU07Z0JBQ1YsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixJQUFJLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRTtZQUN0QixNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN4RCxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFFaEIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQztvQkFDbkIsS0FBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDM0IsT0FBTyxFQUFFLENBQUM7b0JBQ1YsSUFBSSxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7d0JBQ3BCLEtBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztvQkFDaEQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDdEIsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBRXJCLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxZQUFZLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ3pCLE9BQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLENBQUM7cUJBQU0sQ0FBQztvQkFDTixZQUFZLEVBQUUsQ0FBQztnQkFDakIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixNQUFNLEVBQUUsQ0FBQyxTQUFnQyxFQUFFLEVBQUU7WUFDM0MsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFM0QsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNsQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNwQixRQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixTQUFTLEVBQUUsQ0FBSSxFQUFtQixFQUFFLEVBQUU7WUFDcEMsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbEUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNqQyxXQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsS0FBSyxFQUFFLENBQUMsS0FBeUIsRUFBRSxFQUFFO1lBQ25DLE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRXpELGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFFLE1BQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNsRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBRSxNQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFeEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtZQUN2QixNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7WUFFMUIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNsQyxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztnQkFDRCxTQUFTLEdBQUcsQ0FBQyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRTtvQkFDL0UsU0FBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQy9CLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ25CLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNULENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztLQUNGLENBQUM7SUFFRixtQ0FBbUM7SUFDbEMsZUFBdUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFRLEVBQUUsRUFBRTtRQUMxQyxVQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFZCw4QkFBOEI7UUFDOUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkQsS0FBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUQsZUFBdUIsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBRXZDLE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGLGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBSSxHQUFHLE1BQVcsRUFBc0IsRUFBRTtJQUNsRSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUssSUFBWSxDQUFDLENBQUM7SUFFakUsNkJBQTZCO0lBQzdCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMxQixNQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRix5Q0FBeUM7QUFDekMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FDaEMsUUFBMEIsRUFDTixFQUFFO0lBQ3RCLE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLElBQVcsQ0FBQyxDQUFDO0lBRWxELENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDVixJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNsQyxNQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUwsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDIn0=