From 9e2453444d522a662734c659b34869a149a8ff2c Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 12 Sep 2023 15:02:16 +0100 Subject: [PATCH] Prettier --- packages/app/public/bench.html | 18 +- packages/app/public/index.html | 2 +- packages/app/src/Cache/GiftWrapCache.ts | 2 +- packages/app/src/Element/CashuNuts.tsx | 2 +- packages/app/src/Element/FollowButton.tsx | 2 +- packages/app/src/Element/Nip5Service.tsx | 4 +- packages/app/src/Element/Note.tsx | 6 +- packages/app/src/Element/NoteCreator.css | 3 +- packages/app/src/Element/NoteCreator.tsx | 10 +- packages/app/src/Element/NoteFooter.tsx | 2 +- packages/app/src/Element/NoteReaction.tsx | 4 +- packages/app/src/Element/Poll.tsx | 10 +- packages/app/src/Element/PubkeyList.tsx | 2 +- packages/app/src/Element/ReBroadcaster.tsx | 6 +- packages/app/src/Element/Reactions.tsx | 2 +- packages/app/src/Element/Relay.tsx | 4 +- packages/app/src/Element/SendSats.tsx | 2 +- packages/app/src/Element/Thread.tsx | 8 +- packages/app/src/Element/Timeline.tsx | 4 +- packages/app/src/Element/TimelineFollows.tsx | 8 +- packages/app/src/Element/ZapstrEmbed.tsx | 2 +- packages/app/src/Feed/BadgesFeed.ts | 6 +- packages/app/src/Feed/FeedReactions.ts | 2 +- packages/app/src/Feed/FollowersFeed.ts | 2 +- packages/app/src/Feed/LoginFeed.ts | 6 +- packages/app/src/Feed/ThreadFeed.ts | 8 +- packages/app/src/Feed/TimelineFeed.ts | 4 +- packages/app/src/Hooks/useImgProxy.ts | 2 +- .../app/src/Hooks/useInteractionCache.tsx | 2 +- packages/app/src/Hooks/useLogin.tsx | 2 +- packages/app/src/Login/MultiAccountStore.ts | 2 +- packages/app/src/Nip05/ServiceProvider.ts | 2 +- .../app/src/Nip05/SnortServiceProvider.ts | 2 +- packages/app/src/Pages/ErrorPage.tsx | 2 +- packages/app/src/Pages/Layout.tsx | 4 +- packages/app/src/Pages/LoginPage.tsx | 4 +- packages/app/src/Pages/Notifications.tsx | 6 +- packages/app/src/Pages/ProfilePage.tsx | 4 +- packages/app/src/Pages/ZapPool.tsx | 2 +- packages/app/src/Pages/settings/Accounts.tsx | 2 +- .../src/Pages/settings/handle/LNAddress.tsx | 2 +- .../app/src/Pages/settings/wallet/Cashu.tsx | 2 +- .../app/src/Pages/settings/wallet/LNC.tsx | 2 +- .../app/src/Pages/settings/wallet/LNDHub.tsx | 2 +- .../app/src/Pages/settings/wallet/NWC.tsx | 2 +- packages/app/src/SnortApi.ts | 4 +- packages/app/src/SnortUtils/index.ts | 8 +- packages/app/src/Toaster.tsx | 2 +- packages/app/src/Upload/VoidCat.ts | 2 +- packages/app/src/Wallet/Cashu.ts | 2 +- packages/app/src/Wallet/LNCWallet.ts | 2 +- packages/app/src/Wallet/NostrWalletConnect.ts | 2 +- packages/app/src/Wallet/WebLN.ts | 2 +- packages/app/src/Wallet/index.ts | 2 +- packages/app/src/ZapPoolController.ts | 2 +- packages/app/src/benchmarks.ts | 185 ++-- packages/app/src/chat/index.ts | 14 +- packages/app/src/chat/nip24.ts | 6 +- packages/app/src/chat/nip29.ts | 4 +- packages/app/src/chat/nip4.ts | 17 +- packages/app/src/index.tsx | 15 +- packages/app/webpack.config.js | 4 +- packages/system-query/pkg/package.json | 2 +- packages/system-query/pkg/system_query.d.ts | 64 +- packages/system-query/pkg/system_query.js | 910 +++++++++--------- .../system-query/pkg/system_query_bg.wasm | Bin 120018 -> 120012 bytes packages/system/src/index.ts | 2 +- packages/system/src/nostr-system.ts | 10 +- packages/system/src/query-optimizer/index.ts | 47 +- .../src/query-optimizer/request-splitter.ts | 2 +- packages/system/src/system-worker.ts | 2 +- packages/system/src/zaps.ts | 2 +- packages/system/tests/node.ts | 12 +- yarn.lock | 1 + 74 files changed, 776 insertions(+), 728 deletions(-) diff --git a/packages/app/public/bench.html b/packages/app/public/bench.html index 00b952b0e..95159cd91 100644 --- a/packages/app/public/bench.html +++ b/packages/app/public/bench.html @@ -1,10 +1,10 @@ - + - - - Snort Benchmarks - - - Check console - - \ No newline at end of file + + + Snort Benchmarks + + + Check console + + diff --git a/packages/app/public/index.html b/packages/app/public/index.html index ee84c3b73..b5a138322 100644 --- a/packages/app/public/index.html +++ b/packages/app/public/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/app/src/Cache/GiftWrapCache.ts b/packages/app/src/Cache/GiftWrapCache.ts index 71e82b457..67f00b917 100644 --- a/packages/app/src/Cache/GiftWrapCache.ts +++ b/packages/app/src/Cache/GiftWrapCache.ts @@ -38,7 +38,7 @@ export class GiftWrapCache extends RefreshFeedCache { } catch (e) { console.debug(e, v); } - }) + }), ) ) .filter(a => a !== undefined) diff --git a/packages/app/src/Element/CashuNuts.tsx b/packages/app/src/Element/CashuNuts.tsx index 8674657b7..4e124e389 100644 --- a/packages/app/src/Element/CashuNuts.tsx +++ b/packages/app/src/Element/CashuNuts.tsx @@ -26,7 +26,7 @@ export default function CashuNuts({ token }: { token: string }) { e.stopPropagation(); const lnurl = profile?.lud16 ?? ""; const url = `https://redeem.cashu.me?token=${encodeURIComponent(token)}&lightning=${encodeURIComponent( - lnurl + lnurl, )}&autopay=yes`; window.open(url, "_blank"); } diff --git a/packages/app/src/Element/FollowButton.tsx b/packages/app/src/Element/FollowButton.tsx index 64a1dc38e..c2cb0e54f 100644 --- a/packages/app/src/Element/FollowButton.tsx +++ b/packages/app/src/Element/FollowButton.tsx @@ -34,7 +34,7 @@ export default function FollowButton(props: FollowButtonProps) { if (publisher) { const ev = await publisher.contactList( follows.item.filter(a => a !== pubkey), - relays.item + relays.item, ); System.BroadcastEvent(ev); } diff --git a/packages/app/src/Element/Nip5Service.tsx b/packages/app/src/Element/Nip5Service.tsx index 19318901a..5a389c445 100644 --- a/packages/app/src/Element/Nip5Service.tsx +++ b/packages/app/src/Element/Nip5Service.tsx @@ -261,9 +261,7 @@ export default function Nip5Service(props: Nip05ServiceProps) { />  @  )} diff --git a/packages/app/src/Element/Note.tsx b/packages/app/src/Element/Note.tsx index db857738b..85deb9dc8 100644 --- a/packages/app/src/Element/Note.tsx +++ b/packages/app/src/Element/Note.tsx @@ -135,7 +135,7 @@ export function NoteInner(props: NoteProps) { { [Reaction.Positive]: [] as TaggedNostrEvent[], [Reaction.Negative]: [] as TaggedNostrEvent[], - } + }, ); return { [Reaction.Positive]: dedupeByPubkey(result[Reaction.Positive]), @@ -150,7 +150,7 @@ export function NoteInner(props: NoteProps) { ...getReactions(related, ev.id, EventKind.TextNote).filter(e => e.tags.some(tagFilterOfTextRepost(e, ev.id))), ...getReactions(related, ev.id, EventKind.Repost), ]), - [related, ev] + [related, ev], ); const zaps = useMemo(() => { const sortedZaps = getReactions(related, ev.id, EventKind.ZapReceipt) @@ -241,7 +241,7 @@ export function NoteInner(props: NoteProps) { function goToEvent( e: React.MouseEvent, eTarget: TaggedNostrEvent, - isTargetAllowed: boolean = e.target === e.currentTarget + isTargetAllowed: boolean = e.target === e.currentTarget, ) { if (!isTargetAllowed || opt?.canClick === false) { return; diff --git a/packages/app/src/Element/NoteCreator.css b/packages/app/src/Element/NoteCreator.css index e879558e6..444170171 100644 --- a/packages/app/src/Element/NoteCreator.css +++ b/packages/app/src/Element/NoteCreator.css @@ -2,7 +2,8 @@ border: 1px solid transparent; border-radius: 12px; box-shadow: 0px 0px 6px 1px rgba(182, 108, 156, 0.3); - background: linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box, + background: + linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box, linear-gradient(90deg, #ef9644, #fd7c49, #ff5e58, #ff3b70, #ff088e, #eb00b1, #c31ed5, #7b41f6) border-box; } diff --git a/packages/app/src/Element/NoteCreator.tsx b/packages/app/src/Element/NoteCreator.tsx index d9a5ab854..3ea2e7dd6 100644 --- a/packages/app/src/Element/NoteCreator.tsx +++ b/packages/app/src/Element/NoteCreator.tsx @@ -76,8 +76,8 @@ export function NoteCreator() { setError( formatMessage({ defaultMessage: "Invalid LNURL", - }) - ) + }), + ), ); return; } @@ -256,9 +256,9 @@ export function NoteCreator() { ? false : // otherwise return selectedCustomRelays with target relay added / removed a.filter(el => - el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el) - ) - ) + el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el), + ), + ), ) } /> diff --git a/packages/app/src/Element/NoteFooter.tsx b/packages/app/src/Element/NoteFooter.tsx index 6e74f1f1a..068c8ac50 100644 --- a/packages/app/src/Element/NoteFooter.tsx +++ b/packages/app/src/Element/NoteFooter.tsx @@ -71,7 +71,7 @@ export default function NoteFooter(props: NoteFooterProps) { }, { captureEvent: true, - } + }, ); function hasReacted(emoji: string) { diff --git a/packages/app/src/Element/NoteReaction.tsx b/packages/app/src/Element/NoteReaction.tsx index b639b951c..a2992c7f5 100644 --- a/packages/app/src/Element/NoteReaction.tsx +++ b/packages/app/src/Element/NoteReaction.tsx @@ -46,7 +46,7 @@ export default function NoteReaction(props: NoteReactionProps) { * Some clients embed the reposted note in the content */ function extractRoot() { - if(!inView) return null; + if (!inView) return null; if (ev?.kind === EventKind.Repost && ev.content.length > 0 && ev.content !== "#[0]") { try { const r: NostrEvent = JSON.parse(ev.content); @@ -66,7 +66,7 @@ export default function NoteReaction(props: NoteReactionProps) { const root = useMemo(() => extractRoot(), [ev, props.root, inView]); if (!inView) { - return (
) + return
; } const isOpMuted = root && isMuted(root.pubkey); const shouldNotBeRendered = isOpMuted || root?.kind !== EventKind.TextNote; diff --git a/packages/app/src/Element/Poll.tsx b/packages/app/src/Element/Poll.tsx index a72cf2cd9..d1c163db7 100644 --- a/packages/app/src/Element/Poll.tsx +++ b/packages/app/src/Element/Poll.tsx @@ -47,15 +47,15 @@ export default function Poll(props: PollProps) { }, { amount, - } - ) + }, + ), ); } setVoting(opt); const r = Object.keys(relays.item); const zap = await publisher.zap(amount * 1000, props.ev.pubkey, r, props.ev.id, undefined, eb => - eb.tag(["poll_option", opt.toString()]) + eb.tag(["poll_option", opt.toString()]), ); const lnurl = props.ev.tags.find(a => a[0] === "zap")?.[1] || pollerProfile?.lud16 || pollerProfile?.lud06; @@ -68,7 +68,7 @@ export default function Poll(props: PollProps) { throw new Error( formatMessage({ defaultMessage: "Can't vote because LNURL service does not support zaps", - }) + }), ); } @@ -85,7 +85,7 @@ export default function Poll(props: PollProps) { setError( formatMessage({ defaultMessage: "Failed to send vote", - }) + }), ); } } finally { diff --git a/packages/app/src/Element/PubkeyList.tsx b/packages/app/src/Element/PubkeyList.tsx index 176484339..8a5d14dfa 100644 --- a/packages/app/src/Element/PubkeyList.tsx +++ b/packages/app/src/Element/PubkeyList.tsx @@ -34,7 +34,7 @@ export default function PubkeyList({ ev, className }: { ev: NostrEvent; classNam pk, Object.keys(login.relays.item), undefined, - `Zap from ${hexToBech32("note", ev.id)}` + `Zap from ${hexToBech32("note", ev.id)}`, ); const invoice = await svc.getInvoice(amtSend, undefined, zap); if (invoice.pr) { diff --git a/packages/app/src/Element/ReBroadcaster.tsx b/packages/app/src/Element/ReBroadcaster.tsx index b3ad9dabc..53029aebe 100644 --- a/packages/app/src/Element/ReBroadcaster.tsx +++ b/packages/app/src/Element/ReBroadcaster.tsx @@ -55,9 +55,9 @@ export function ReBroadcaster() { ? false : // otherwise return selectedCustomRelays with target relay added / removed a.filter(el => - el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el) - ) - ) + el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el), + ), + ), ) } /> diff --git a/packages/app/src/Element/Reactions.tsx b/packages/app/src/Element/Reactions.tsx index cd755b26e..076089c27 100644 --- a/packages/app/src/Element/Reactions.tsx +++ b/packages/app/src/Element/Reactions.tsx @@ -60,7 +60,7 @@ const Reactions = ({ show, setShow, positive, negative, reposts, zaps }: Reactio value: 3, }, ] - : [] + : [], ); const [tab, setTab] = useState(tabs[0]); diff --git a/packages/app/src/Element/Relay.tsx b/packages/app/src/Element/Relay.tsx index 1fca237aa..0de4d2888 100644 --- a/packages/app/src/Element/Relay.tsx +++ b/packages/app/src/Element/Relay.tsx @@ -22,7 +22,7 @@ export default function Relay(props: RelayProps) { const navigate = useNavigate(); const login = useLogin(); const relaySettings = unwrap( - login.relays.item[props.addr] ?? System.Sockets.find(a => a.address === props.addr)?.settings ?? {} + login.relays.item[props.addr] ?? System.Sockets.find(a => a.address === props.addr)?.settings ?? {}, ); const state = useRelayState(props.addr); const name = useMemo(() => getRelayName(props.addr), [props.addr]); @@ -34,7 +34,7 @@ export default function Relay(props: RelayProps) { ...login.relays.item, [props.addr]: o, }, - unixNowMs() + unixNowMs(), ); } diff --git a/packages/app/src/Element/SendSats.tsx b/packages/app/src/Element/SendSats.tsx index 368095d9e..1c0823f01 100644 --- a/packages/app/src/Element/SendSats.tsx +++ b/packages/app/src/Element/SendSats.tsx @@ -285,7 +285,7 @@ export default function SendSats(props: SendSatsProps) { {makeTab(ZapType.AnonZap, )} {makeTab( ZapType.NonZap, - + , )} diff --git a/packages/app/src/Element/Thread.tsx b/packages/app/src/Element/Thread.tsx index ee6512b54..73532db7d 100644 --- a/packages/app/src/Element/Thread.tsx +++ b/packages/app/src/Element/Thread.tsx @@ -243,7 +243,7 @@ export default function Thread() { if (t?.root?.key === "a" && t?.root?.value) { const parsed = t.root.value.split(":"); replyTo = thread.data?.find( - a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2] + a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2], )?.id; } if (replyTo) { @@ -264,7 +264,7 @@ export default function Thread() { thread.data?.find( ne => ne.id === currentId || - (link.type === NostrPrefix.Address && findTag(ne, "d") === currentId && ne.pubkey === link.author) + (link.type === NostrPrefix.Address && findTag(ne, "d") === currentId && ne.pubkey === link.author), ) ?? (location.state && "sig" in location.state ? (location.state as TaggedNostrEvent) : undefined); if (currentNote) { const currentThread = EventExt.extractThread(currentNote); @@ -280,7 +280,7 @@ export default function Thread() { if (replyTo.key === "a" && replyTo.value) { const parsed = replyTo.value.split(":"); return thread.data?.find( - a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2] + a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2], ); } if (replyTo.value) { @@ -348,7 +348,7 @@ export default function Thread() { notes={replies} related={getAllReactions( thread.data, - replies.map(a => a.id) + replies.map(a => a.id), )} chains={chains} onNavigate={navigateThread} diff --git a/packages/app/src/Element/Timeline.tsx b/packages/app/src/Element/Timeline.tsx index acdd12217..0b5c545a4 100644 --- a/packages/app/src/Element/Timeline.tsx +++ b/packages/app/src/Element/Timeline.tsx @@ -47,7 +47,7 @@ const Timeline = (props: TimelineProps) => { ?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true)) .filter(a => props.ignoreModeration || !isMuted(a.pubkey)); }, - [props.postsOnly, muted, props.ignoreModeration] + [props.postsOnly, muted, props.ignoreModeration], ); const mainFeed = useMemo(() => { @@ -60,7 +60,7 @@ const Timeline = (props: TimelineProps) => { (id: u256) => { return (feed.related ?? []).filter(a => findTag(a, "e") === id); }, - [feed.related] + [feed.related], ); const liveStreams = useMemo(() => { return (feed.main ?? []).filter(a => a.kind === EventKind.LiveEvent && findTag(a, "status") === "live"); diff --git a/packages/app/src/Element/TimelineFollows.tsx b/packages/app/src/Element/TimelineFollows.tsx index 8866a2857..c96499683 100644 --- a/packages/app/src/Element/TimelineFollows.tsx +++ b/packages/app/src/Element/TimelineFollows.tsx @@ -28,11 +28,11 @@ const TimelineFollows = (props: TimelineFollowsProps) => { const [latest, setLatest] = useState(unixNow()); const feed = useSyncExternalStore( cb => FollowsFeed.hook(cb, "*"), - () => FollowsFeed.snapshot() + () => FollowsFeed.snapshot(), ); const reactions = useReactions( "follows-feed-reactions", - feed.map(a => a.id) + feed.map(a => a.id), ); const system = useContext(SnortContext); const login = useLogin(); @@ -48,7 +48,7 @@ const TimelineFollows = (props: TimelineFollowsProps) => { ?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true)) .filter(a => !isMuted(a.pubkey) && login.follows.item.includes(a.pubkey)); }, - [props.postsOnly, muted, login.follows.timestamp] + [props.postsOnly, muted, login.follows.timestamp], ); const mainFeed = useMemo(() => { @@ -63,7 +63,7 @@ const TimelineFollows = (props: TimelineFollowsProps) => { (id: u256) => { return (reactions?.data ?? []).filter(a => findTag(a, "e") === id); }, - [reactions] + [reactions], ); const liveStreams = useMemo(() => { diff --git a/packages/app/src/Element/ZapstrEmbed.tsx b/packages/app/src/Element/ZapstrEmbed.tsx index 844b5b67c..fa112e8a7 100644 --- a/packages/app/src/Element/ZapstrEmbed.tsx +++ b/packages/app/src/Element/ZapstrEmbed.tsx @@ -17,7 +17,7 @@ export default function ZapstrEmbed({ ev }: { ev: NostrEvent }) { ev.tags.find(a => a[0] === "d")?.[1] ?? "", undefined, ev.kind, - ev.pubkey + ev.pubkey, ); return ( <> diff --git a/packages/app/src/Feed/BadgesFeed.ts b/packages/app/src/Feed/BadgesFeed.ts index d6905c5d0..d180f160c 100644 --- a/packages/app/src/Feed/BadgesFeed.ts +++ b/packages/app/src/Feed/BadgesFeed.ts @@ -23,7 +23,7 @@ export default function useProfileBadges(pubkey?: HexKey) { if (profileBadges.data) { return chunks( profileBadges.data.tags.filter(t => t[0] === "a" || t[0] === "e"), - 2 + 2, ).reduce((acc, [a, e]) => { return { ...acc, @@ -44,7 +44,7 @@ export default function useProfileBadges(pubkey?: HexKey) { } return acc; }, - { pubkeys: [], ds: [] } as BadgeAwards + { pubkeys: [], ds: [] } as BadgeAwards, ) as BadgeAwards; }, [profile]); @@ -77,7 +77,7 @@ export default function useProfileBadges(pubkey?: HexKey) { }) .filter( ({ award, badge }) => - badge && award.pubkey === badge.pubkey && award.tags.find(t => t[0] === "p" && t[1] === pubkey) + badge && award.pubkey === badge.pubkey && award.tags.find(t => t[0] === "p" && t[1] === pubkey), ) .map(({ badge }) => unwrap(badge)); } diff --git a/packages/app/src/Feed/FeedReactions.ts b/packages/app/src/Feed/FeedReactions.ts index cd32b57aa..5faaeb004 100644 --- a/packages/app/src/Feed/FeedReactions.ts +++ b/packages/app/src/Feed/FeedReactions.ts @@ -13,7 +13,7 @@ export function useReactions(subId: string, ids: Array, others?: (rb: Re .kinds( pref.enableReactions ? [EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt] - : [EventKind.ZapReceipt, EventKind.Repost] + : [EventKind.ZapReceipt, EventKind.Repost], ) .tag("e", ids); } diff --git a/packages/app/src/Feed/FollowersFeed.ts b/packages/app/src/Feed/FollowersFeed.ts index 84544a292..e8b5c2898 100644 --- a/packages/app/src/Feed/FollowersFeed.ts +++ b/packages/app/src/Feed/FollowersFeed.ts @@ -14,7 +14,7 @@ export default function useFollowersFeed(pubkey?: HexKey) { const followers = useMemo(() => { const contactLists = followersFeed.data?.filter( - a => a.kind === EventKind.ContactList && a.tags.some(b => b[0] === "p" && b[1] === pubkey) + a => a.kind === EventKind.ContactList && a.tags.some(b => b[0] === "p" && b[1] === pubkey), ); return [...new Set(contactLists?.map(a => a.pubkey))]; }, [followersFeed, pubkey]); diff --git a/packages/app/src/Feed/LoginFeed.ts b/packages/app/src/Feed/LoginFeed.ts index 8eceb79fe..f1eda0d6a 100644 --- a/packages/app/src/Feed/LoginFeed.ts +++ b/packages/app/src/Feed/LoginFeed.ts @@ -85,7 +85,7 @@ export default function useLoginFeed() { Nip4Chats.onEvent(loginFeed.data); const subs = loginFeed.data.filter( - a => a.kind === EventKind.SnortSubscriptions && a.pubkey === bech32ToHex(SnortPubKey) + a => a.kind === EventKind.SnortSubscriptions && a.pubkey === bech32ToHex(SnortPubKey), ); Promise.all( subs.map(async a => { @@ -97,7 +97,7 @@ export default function useLoginFeed() { ...ex, } as SubscriptionEvent; } - }) + }), ).then(a => addSubscription(login, ...a.filter(a => a !== undefined).map(unwrap))); } }, [loginFeed, publisher]); @@ -106,7 +106,7 @@ export default function useLoginFeed() { useEffect(() => { if (loginFeed.data) { const replies = loginFeed.data.filter( - a => a.kind === EventKind.TextNote && !isMuted(a.pubkey) && a.created_at > readNotifications + a => a.kind === EventKind.TextNote && !isMuted(a.pubkey) && a.created_at > readNotifications, ); replies.forEach(async nx => { const n = await makeNotification(nx); diff --git a/packages/app/src/Feed/ThreadFeed.ts b/packages/app/src/Feed/ThreadFeed.ts index 6603bd2d3..8fe289a2b 100644 --- a/packages/app/src/Feed/ThreadFeed.ts +++ b/packages/app/src/Feed/ThreadFeed.ts @@ -35,11 +35,11 @@ export default function useThreadFeed(link: NostrLink) { .kinds( pref.enableReactions ? [EventKind.Reaction, EventKind.TextNote, EventKind.Repost, EventKind.ZapReceipt] - : [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost] + : [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost], ) .tag( "e", - allEvents.map(a => a.id) + allEvents.map(a => a.id), ); } if (trackingATags.length > 0) { @@ -50,7 +50,7 @@ export default function useThreadFeed(link: NostrLink) { .authors(parsed.map(a => a[1])) .tag( "d", - parsed.map(a => a[2]) + parsed.map(a => a[2]), ); sub.withFilter().tag("a", trackingATags); } @@ -85,7 +85,7 @@ export default function useThreadFeed(link: NostrLink) { id: b[1], relay: b[2], }; - }) + }), ) .flat(); const eTagsMissing = eTags.filter(a => !mainNotes.some(b => b.id === a.id)); diff --git a/packages/app/src/Feed/TimelineFeed.ts b/packages/app/src/Feed/TimelineFeed.ts index ea45ede4d..6feb29da4 100644 --- a/packages/app/src/Feed/TimelineFeed.ts +++ b/packages/app/src/Feed/TimelineFeed.ts @@ -43,7 +43,7 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel .kinds( subject.type === "profile_keyword" ? [EventKind.SetMetadata] - : [EventKind.TextNote, EventKind.Repost, EventKind.Polls] + : [EventKind.TextNote, EventKind.Repost, EventKind.Polls], ); if (subject.relay) { @@ -149,7 +149,7 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel .map(a => unwrap(a)[1]); const repostsByKind1 = main.data .filter( - a => (a.kind === EventKind.Repost || a.kind === EventKind.TextNote) && a.tags.some(tagFilterOfTextRepost(a)) + a => (a.kind === EventKind.Repost || a.kind === EventKind.TextNote) && a.tags.some(tagFilterOfTextRepost(a)), ) .map(a => a.tags.find(tagFilterOfTextRepost(a))) .filter(a => a) diff --git a/packages/app/src/Hooks/useImgProxy.ts b/packages/app/src/Hooks/useImgProxy.ts index 090fa4f4c..2f1a04cd3 100644 --- a/packages/app/src/Hooks/useImgProxy.ts +++ b/packages/app/src/Hooks/useImgProxy.ts @@ -21,7 +21,7 @@ export default function useImgProxy() { const result = hmacSha256( utils.hexToBytes(unwrap(settings).key), utils.hexToBytes(unwrap(settings).salt), - te.encode(u) + te.encode(u), ); return urlSafe(base64.encode(result)); } diff --git a/packages/app/src/Hooks/useInteractionCache.tsx b/packages/app/src/Hooks/useInteractionCache.tsx index ab73a99cd..64cc81228 100644 --- a/packages/app/src/Hooks/useInteractionCache.tsx +++ b/packages/app/src/Hooks/useInteractionCache.tsx @@ -15,7 +15,7 @@ export function useInteractionCache(pubkey?: HexKey, event?: u256) { const data = useSyncExternalStore( c => InteractionCache.hook(c, id), - () => InteractionCache.snapshot().find(a => a.id === id) + () => InteractionCache.snapshot().find(a => a.id === id), ) || EmptyInteraction; return { data: data, diff --git a/packages/app/src/Hooks/useLogin.tsx b/packages/app/src/Hooks/useLogin.tsx index b4ffedffd..cf3a205e5 100644 --- a/packages/app/src/Hooks/useLogin.tsx +++ b/packages/app/src/Hooks/useLogin.tsx @@ -4,6 +4,6 @@ import { useSyncExternalStore } from "react"; export default function useLogin() { return useSyncExternalStore( s => LoginStore.hook(s), - () => LoginStore.snapshot() + () => LoginStore.snapshot(), ); } diff --git a/packages/app/src/Login/MultiAccountStore.ts b/packages/app/src/Login/MultiAccountStore.ts index 3c35ec226..1b25a66c9 100644 --- a/packages/app/src/Login/MultiAccountStore.ts +++ b/packages/app/src/Login/MultiAccountStore.ts @@ -96,7 +96,7 @@ export class MultiAccountStore extends ExternalStore { type: LoginSessionType, relays?: Record, remoteSignerRelays?: Array, - privateKey?: string + privateKey?: string, ) { if (this.#accounts.has(key)) { throw new Error("Already logged in with this pubkey"); diff --git a/packages/app/src/Nip05/ServiceProvider.ts b/packages/app/src/Nip05/ServiceProvider.ts index 610d4ed53..eda713714 100644 --- a/packages/app/src/Nip05/ServiceProvider.ts +++ b/packages/app/src/Nip05/ServiceProvider.ts @@ -97,7 +97,7 @@ export class ServiceProvider { path: string, method?: "GET" | string, body?: unknown, - headers?: { [key: string]: string } + headers?: { [key: string]: string }, ): Promise { try { const rsp = await fetch(`${this.url}${path}`, { diff --git a/packages/app/src/Nip05/SnortServiceProvider.ts b/packages/app/src/Nip05/SnortServiceProvider.ts index d6efa314a..f4de626a2 100644 --- a/packages/app/src/Nip05/SnortServiceProvider.ts +++ b/packages/app/src/Nip05/SnortServiceProvider.ts @@ -54,7 +54,7 @@ export default class SnortServiceProvider extends ServiceProvider { path: string, method?: "GET" | string, body?: unknown, - headers?: { [key: string]: string } + headers?: { [key: string]: string }, ): Promise { const auth = await this.#publisher.generic(eb => { eb.kind(EventKind.HttpAuthentication); diff --git a/packages/app/src/Pages/ErrorPage.tsx b/packages/app/src/Pages/ErrorPage.tsx index 687c068d5..b3fcb5410 100644 --- a/packages/app/src/Pages/ErrorPage.tsx +++ b/packages/app/src/Pages/ErrorPage.tsx @@ -25,7 +25,7 @@ const ErrorPage = () => { {JSON.stringify( error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : error, undefined, - " " + " ", )} } diff --git a/packages/app/src/Pages/Layout.tsx b/packages/app/src/Pages/Layout.tsx index 1df8c6048..a428f9410 100644 --- a/packages/app/src/Pages/Layout.tsx +++ b/packages/app/src/Pages/Layout.tsx @@ -89,7 +89,7 @@ export default function Layout() { useEffect(() => { const osTheme = window.matchMedia("(prefers-color-scheme: light)"); setTheme( - preferences.theme === "system" && osTheme.matches ? "light" : preferences.theme === "light" ? "light" : "dark" + preferences.theme === "system" && osTheme.matches ? "light" : preferences.theme === "light" ? "light" : "dark", ); osTheme.onchange = e => { @@ -174,7 +174,7 @@ const AccountHeader = () => { const hasNotifications = useMemo( () => latestNotification > readNotifications, - [latestNotification, readNotifications] + [latestNotification, readNotifications], ); const unreadDms = useMemo(() => (publicKey ? 0 : 0), [publicKey]); diff --git a/packages/app/src/Pages/LoginPage.tsx b/packages/app/src/Pages/LoginPage.tsx index ba004d7b1..07401626e 100644 --- a/packages/app/src/Pages/LoginPage.tsx +++ b/packages/app/src/Pages/LoginPage.tsx @@ -55,7 +55,7 @@ const Artwork: Array = [ export async function getNip05PubKey(addr: string): Promise { const [username, domain] = addr.split("@"); const rsp = await fetch( - `https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(username.toLocaleLowerCase())}` + `https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(username.toLocaleLowerCase())}`, ); if (rsp.ok) { const data = await rsp.json(); @@ -103,7 +103,7 @@ export default function LoginPage() { setError( formatMessage({ defaultMessage: "Unknown login error", - }) + }), ); } console.error(e); diff --git a/packages/app/src/Pages/Notifications.tsx b/packages/app/src/Pages/Notifications.tsx index 7af560251..23cefcd7b 100644 --- a/packages/app/src/Pages/Notifications.tsx +++ b/packages/app/src/Pages/Notifications.tsx @@ -75,7 +75,7 @@ export default function NotificationsPage() { const notifications = useSyncExternalStore( c => Notifications.hook(c, "*"), - () => Notifications.snapshot() + () => Notifications.snapshot(), ); const timeKey = (ev: NostrEvent) => { @@ -119,7 +119,7 @@ function NotificationGroup({ evs }: { evs: Array }) { return zap.anonZap ? "anon" : zap.sender ?? a.pubkey; } return a.pubkey; - }) + }), ); const firstPubkey = pubkeys[0]; const firstPubkeyProfile = useUserProfile(inView ? (firstPubkey === "anon" ? "" : firstPubkey) : ""); @@ -213,7 +213,7 @@ function NotificationGroup({ evs }: { evs: Array }) { pubkeys.length - 1, firstPubkey === "anon" ? formatMessage({ defaultMessage: "Anon" }) - : getDisplayName(firstPubkeyProfile, firstPubkey) + : getDisplayName(firstPubkeyProfile, firstPubkey), )} )} diff --git a/packages/app/src/Pages/ProfilePage.tsx b/packages/app/src/Pages/ProfilePage.tsx index 434b816bf..b5655eec1 100644 --- a/packages/app/src/Pages/ProfilePage.tsx +++ b/packages/app/src/Pages/ProfilePage.tsx @@ -221,7 +221,7 @@ export default function ProfilePage() { } as { [key: string]: Tab }; const [tab, setTab] = useState(ProfileTab.Notes); const optionalTabs = [ProfileTab.Zaps, ProfileTab.Relays, ProfileTab.Bookmarks, ProfileTab.Muted].filter(a => - unwrap(a) + unwrap(a), ) as Tab[]; const horizontalScroll = useHorizontalScroll(); @@ -433,7 +433,7 @@ export default function ProfilePage() { type: TLVEntryType.Author, length: 64, value: id, - })}` + })}`, ) }> diff --git a/packages/app/src/Pages/ZapPool.tsx b/packages/app/src/Pages/ZapPool.tsx index f6703ee3d..26664371e 100644 --- a/packages/app/src/Pages/ZapPool.tsx +++ b/packages/app/src/Pages/ZapPool.tsx @@ -73,7 +73,7 @@ export default function ZapPoolPage() { const login = useLogin(); const zapPool = useSyncExternalStore( c => ZapPoolController.hook(c), - () => ZapPoolController.snapshot() + () => ZapPoolController.snapshot(), ); const { wallet } = useWallet(); diff --git a/packages/app/src/Pages/settings/Accounts.tsx b/packages/app/src/Pages/settings/Accounts.tsx index 9ad666963..ce113010b 100644 --- a/packages/app/src/Pages/settings/Accounts.tsx +++ b/packages/app/src/Pages/settings/Accounts.tsx @@ -27,7 +27,7 @@ export default function AccountsPage() { setError( formatMessage({ defaultMessage: "Unknown login error", - }) + }), ); } console.error(e); diff --git a/packages/app/src/Pages/settings/handle/LNAddress.tsx b/packages/app/src/Pages/settings/handle/LNAddress.tsx index 562dc571e..0cad952a3 100644 --- a/packages/app/src/Pages/settings/handle/LNAddress.tsx +++ b/packages/app/src/Pages/settings/handle/LNAddress.tsx @@ -29,7 +29,7 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) { setError( formatMessage({ defaultMessage: "Invalid LNURL", - }) + }), ); return; } diff --git a/packages/app/src/Pages/settings/wallet/Cashu.tsx b/packages/app/src/Pages/settings/wallet/Cashu.tsx index 5a2f4efa2..e1a6d4117 100644 --- a/packages/app/src/Pages/settings/wallet/Cashu.tsx +++ b/packages/app/src/Pages/settings/wallet/Cashu.tsx @@ -39,7 +39,7 @@ const ConnectCashu = () => { setError( formatMessage({ defaultMessage: "Unknown error", - }) + }), ); } } diff --git a/packages/app/src/Pages/settings/wallet/LNC.tsx b/packages/app/src/Pages/settings/wallet/LNC.tsx index d33fa9fe1..64c66d212 100644 --- a/packages/app/src/Pages/settings/wallet/LNC.tsx +++ b/packages/app/src/Pages/settings/wallet/LNC.tsx @@ -32,7 +32,7 @@ const ConnectLNC = () => { setError( formatMessage({ defaultMessage: "Unknown error", - }) + }), ); } } diff --git a/packages/app/src/Pages/settings/wallet/LNDHub.tsx b/packages/app/src/Pages/settings/wallet/LNDHub.tsx index b33462ec0..d2c20f446 100644 --- a/packages/app/src/Pages/settings/wallet/LNDHub.tsx +++ b/packages/app/src/Pages/settings/wallet/LNDHub.tsx @@ -37,7 +37,7 @@ const ConnectLNDHub = () => { setError( formatMessage({ defaultMessage: "Unknown error", - }) + }), ); } } diff --git a/packages/app/src/Pages/settings/wallet/NWC.tsx b/packages/app/src/Pages/settings/wallet/NWC.tsx index 921d6c598..41419615f 100644 --- a/packages/app/src/Pages/settings/wallet/NWC.tsx +++ b/packages/app/src/Pages/settings/wallet/NWC.tsx @@ -37,7 +37,7 @@ const ConnectNostrWallet = () => { setError( formatMessage({ defaultMessage: "Unknown error", - }) + }), ); } } diff --git a/packages/app/src/SnortApi.ts b/packages/app/src/SnortApi.ts index a69f71e67..f29a529e7 100644 --- a/packages/app/src/SnortApi.ts +++ b/packages/app/src/SnortApi.ts @@ -88,7 +88,7 @@ export default class SnortApi { path: string, method?: "GET" | string, body?: { [key: string]: string }, - headers?: { [key: string]: string } + headers?: { [key: string]: string }, ): Promise { if (!this.#publisher) { throw new Error("Publisher not set"); @@ -110,7 +110,7 @@ export default class SnortApi { path: string, method?: "GET" | string, body?: { [key: string]: string }, - headers?: { [key: string]: string } + headers?: { [key: string]: string }, ): Promise { const rsp = await fetch(`${this.#url}${path}`, { method: method, diff --git a/packages/app/src/SnortUtils/index.ts b/packages/app/src/SnortUtils/index.ts index 242b516fc..65062b2a5 100644 --- a/packages/app/src/SnortUtils/index.ts +++ b/packages/app/src/SnortUtils/index.ts @@ -50,7 +50,7 @@ export async function openFile(): Promise { } }, 300); }, - { once: true } + { once: true }, ); }); } @@ -209,7 +209,7 @@ export function dedupeByPubkey(events: TaggedNostrEvent[]) { list: [...list, ev], }; }, - { list: [], seen: new Set([]) } + { list: [], seen: new Set([]) }, ); return deduped.list as TaggedNostrEvent[]; } @@ -226,7 +226,7 @@ export function dedupeById(events: Array) { list: [...list, ev], }; }, - { list: [], seen: new Set([]) } + { list: [], seen: new Set([]) }, ); return deduped.list as Array; } @@ -487,7 +487,7 @@ export function kvToObject(o: string, sep?: string) { return [match[1], match[2]]; } return []; - }) + }), ) as T; } diff --git a/packages/app/src/Toaster.tsx b/packages/app/src/Toaster.tsx index eecb85ca2..1d45a177c 100644 --- a/packages/app/src/Toaster.tsx +++ b/packages/app/src/Toaster.tsx @@ -39,7 +39,7 @@ export const Toastore = new ToasterSlots(); export default function Toaster() { const toast = useSyncExternalStore( c => Toastore.hook(c), - () => Toastore.snapshot() + () => Toastore.snapshot(), ); return ( diff --git a/packages/app/src/Upload/VoidCat.ts b/packages/app/src/Upload/VoidCat.ts index 8eb8a11a4..0fe5e010a 100644 --- a/packages/app/src/Upload/VoidCat.ts +++ b/packages/app/src/Upload/VoidCat.ts @@ -12,7 +12,7 @@ import { magnetURIDecode } from "SnortUtils"; export default async function VoidCatUpload( file: File | Blob, filename: string, - publisher?: EventPublisher + publisher?: EventPublisher, ): Promise { const api = new VoidApi(VoidCatHost); const uploader = api.getUploader(file); diff --git a/packages/app/src/Wallet/Cashu.ts b/packages/app/src/Wallet/Cashu.ts index 541e65ba1..b88dc13ce 100644 --- a/packages/app/src/Wallet/Cashu.ts +++ b/packages/app/src/Wallet/Cashu.ts @@ -57,6 +57,6 @@ export interface NutStashBackup { mints: [ { mintURL: string; - } + }, ]; } diff --git a/packages/app/src/Wallet/LNCWallet.ts b/packages/app/src/Wallet/LNCWallet.ts index 342dfec86..6093289ed 100644 --- a/packages/app/src/Wallet/LNCWallet.ts +++ b/packages/app/src/Wallet/LNCWallet.ts @@ -126,7 +126,7 @@ export class LNCWallet implements LNWallet { err => { this.#log(err); reject(err); - } + }, ); }); } diff --git a/packages/app/src/Wallet/NostrWalletConnect.ts b/packages/app/src/Wallet/NostrWalletConnect.ts index d2d1113d2..5930e60d2 100644 --- a/packages/app/src/Wallet/NostrWalletConnect.ts +++ b/packages/app/src/Wallet/NostrWalletConnect.ts @@ -182,7 +182,7 @@ export class NostrConnectWallet implements LNWallet { ], () => { // ignored - } + }, ); await this.#conn.SendAsync(evCommand); return await new Promise((resolve, reject) => { diff --git a/packages/app/src/Wallet/WebLN.ts b/packages/app/src/Wallet/WebLN.ts index e97082772..68db42121 100644 --- a/packages/app/src/Wallet/WebLN.ts +++ b/packages/app/src/Wallet/WebLN.ts @@ -84,7 +84,7 @@ export class WebLNWallet implements LNWallet { await window.webln?.makeInvoice({ amount: req.amount, defaultMemo: req.memo, - }) + }), ); if (rsp) { const invoice = prToWalletInvoice(rsp.paymentRequest); diff --git a/packages/app/src/Wallet/index.ts b/packages/app/src/Wallet/index.ts index ad8a01dd1..cb5b98e0c 100644 --- a/packages/app/src/Wallet/index.ts +++ b/packages/app/src/Wallet/index.ts @@ -248,7 +248,7 @@ window.document.addEventListener("close", () => { export function useWallet() { const wallet = useSyncExternalStore( h => Wallets.hook(h), - () => Wallets.snapshot() + () => Wallets.snapshot(), ); useEffect(() => { if (wallet.wallet?.isReady() === false && wallet.wallet.canAutoLogin()) { diff --git a/packages/app/src/ZapPoolController.ts b/packages/app/src/ZapPoolController.ts index 0695b5d7d..617933bc8 100644 --- a/packages/app/src/ZapPoolController.ts +++ b/packages/app/src/ZapPoolController.ts @@ -54,7 +54,7 @@ class ZapPool extends ExternalStore> { Toastore.push({ element: `Sent ${amtSend.toLocaleString()} sats to ${getDisplayName( profile, - x.pubkey + x.pubkey, )} from your zap pool`, expire: unixNow() + 10, icon: "zap", diff --git a/packages/app/src/benchmarks.ts b/packages/app/src/benchmarks.ts index c56a7415b..1b6acb80f 100644 --- a/packages/app/src/benchmarks.ts +++ b/packages/app/src/benchmarks.ts @@ -2,104 +2,113 @@ import { bytesToHex } from "@noble/hashes/utils"; import { DefaultQueryOptimizer, FlatReqFilter, QueryOptimizer, ReqFilter } from "@snort/system"; import { compress, expand_filter, flat_merge, get_diff, default as wasmInit } from "@snort/system-query"; import WasmPath from "@snort/system-query/pkg/system_query_bg.wasm"; -import { Bench } from 'tinybench'; +import { Bench } from "tinybench"; const WasmQueryOptimizer = { - expandFilter: (f: ReqFilter) => { - return expand_filter(f) as Array; - }, - getDiff: (prev: Array, next: Array) => { - return get_diff(prev, next) as Array; - }, - flatMerge: (all: Array) => { - return flat_merge(all) as Array; - }, - compress: (all: Array) => { - return compress(all) as Array; - } - } as QueryOptimizer; - - const makeOnePubkey = () => { - const rnd = globalThis.crypto.getRandomValues(new Uint8Array(32)); - return bytesToHex(rnd); - } + expandFilter: (f: ReqFilter) => { + return expand_filter(f) as Array; + }, + getDiff: (prev: Array, next: Array) => { + return get_diff(prev, next) as Array; + }, + flatMerge: (all: Array) => { + return flat_merge(all) as Array; + }, + compress: (all: Array) => { + return compress(all) as Array; + }, +} as QueryOptimizer; - const randomPubkeys = (() => { - const ret = []; - for(let x =0;x<50;x++) { - ret.push(makeOnePubkey()); - } - return ret; - })(); +const makeOnePubkey = () => { + const rnd = globalThis.crypto.getRandomValues(new Uint8Array(32)); + return bytesToHex(rnd); +}; - const testExpand = (q: QueryOptimizer) => { - q.expandFilter({ - kinds: [1,2,3], - authors: randomPubkeys - }); +const randomPubkeys = (() => { + const ret = []; + for (let x = 0; x < 50; x++) { + ret.push(makeOnePubkey()); } - const testGetDiff = (q: QueryOptimizer) => { - q.getDiff([{ + return ret; +})(); + +const testExpand = (q: QueryOptimizer) => { + q.expandFilter({ + kinds: [1, 2, 3], + authors: randomPubkeys, + }); +}; +const testGetDiff = (q: QueryOptimizer) => { + q.getDiff( + [ + { kinds: [1, 2, 3], - authors: randomPubkeys - }], [{ + authors: randomPubkeys, + }, + ], + [ + { kinds: [1, 2, 3, 4, 5], - authors: randomPubkeys - }]); -} + authors: randomPubkeys, + }, + ], + ); +}; const testFlatMerge = (q: QueryOptimizer) => { - q.flatMerge(q.expandFilter({ - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - })); -} + q.flatMerge( + q.expandFilter({ + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }), + ); +}; const testCompress = (q: QueryOptimizer) => { - q.compress([ - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - }, - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - }, - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - }, - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - }, - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - } - ]) -} + q.compress([ + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + ]); +}; - const wasmSuite = new Bench({ time: 1_000 }); - const suite = new Bench({ time: 1_000 }); +const wasmSuite = new Bench({ time: 1_000 }); +const suite = new Bench({ time: 1_000 }); - const addTests = (s: Bench, q: QueryOptimizer) => { - s.add("expand", () => testExpand(q)); - s.add("get_diff", () => testGetDiff(q)); - s.add("flat_merge", () => testFlatMerge(q)); - s.add("compress", () => testCompress(q)); - } - - addTests(suite, DefaultQueryOptimizer); - addTests(wasmSuite, WasmQueryOptimizer); - - const runAll = async() => { - await wasmInit(WasmPath); +const addTests = (s: Bench, q: QueryOptimizer) => { + s.add("expand", () => testExpand(q)); + s.add("get_diff", () => testGetDiff(q)); + s.add("flat_merge", () => testFlatMerge(q)); + s.add("compress", () => testCompress(q)); +}; - console.log("DefaultQueryOptimizer"); - await suite.run(); - console.table(suite.table()); +addTests(suite, DefaultQueryOptimizer); +addTests(wasmSuite, WasmQueryOptimizer); - console.log("WasmQueryOptimizer"); - await wasmSuite.run(); - console.table(wasmSuite.table()); - }; - runAll().catch(console.error); \ No newline at end of file +const runAll = async () => { + await wasmInit(WasmPath); + + console.log("DefaultQueryOptimizer"); + await suite.run(); + console.table(suite.table()); + + console.log("WasmQueryOptimizer"); + await wasmSuite.run(); + console.table(wasmSuite.table()); +}; +runAll().catch(console.error); diff --git a/packages/app/src/chat/index.ts b/packages/app/src/chat/index.ts index f29f9122d..d6b9326ae 100644 --- a/packages/app/src/chat/index.ts +++ b/packages/app/src/chat/index.ts @@ -116,7 +116,7 @@ export function createChatLink(type: ChatType, ...params: Array) { type: TLVEntryType.Author, length: params[0].length, value: params[0], - } as TLVEntry + } as TLVEntry, )}`; } case ChatType.PrivateDirectMessage: { @@ -127,7 +127,7 @@ export function createChatLink(type: ChatType, ...params: Array) { type: TLVEntryType.Author, length: params[0].length, value: params[0], - } as TLVEntry + } as TLVEntry, )}`; } case ChatType.PrivateGroupChat: { @@ -139,8 +139,8 @@ export function createChatLink(type: ChatType, ...params: Array) { type: TLVEntryType.Author, length: a.length, value: a, - } as TLVEntry) - ) + }) as TLVEntry, + ), )}`; } } @@ -161,14 +161,14 @@ export function useNip4Chat() { const { publicKey } = useLogin(); return useSyncExternalStore( c => Nip4Chats.hook(c), - () => Nip4Chats.snapshot(publicKey) + () => Nip4Chats.snapshot(publicKey), ); } export function useNip29Chat() { return useSyncExternalStore( c => Nip29Chats.hook(c), - () => Nip29Chats.snapshot() + () => Nip29Chats.snapshot(), ); } @@ -176,7 +176,7 @@ export function useNip24Chat() { const { publicKey } = useLogin(); return useSyncExternalStore( c => Nip24Chats.hook(c), - () => Nip24Chats.snapshot(publicKey) + () => Nip24Chats.snapshot(publicKey), ); } diff --git a/packages/app/src/chat/nip24.ts b/packages/app/src/chat/nip24.ts index 9344e6fbc..6281a6b79 100644 --- a/packages/app/src/chat/nip24.ts +++ b/packages/app/src/chat/nip24.ts @@ -39,8 +39,8 @@ export class Nip24ChatSystem extends ExternalStore> implements ChatS value: v, type: TLVEntryType.Author, length: v.length, - } as TLVEntry) - ) + }) as TLVEntry, + ), ); }; return dedupe(messages.map(a => chatId(a))).map(a => { @@ -72,7 +72,7 @@ export class Nip24ChatSystem extends ExternalStore> implements ChatS } as { t: number; title: string | undefined; - } + }, ); return { type: ChatType.PrivateDirectMessage, diff --git a/packages/app/src/chat/nip29.ts b/packages/app/src/chat/nip29.ts index 956472e79..261f7e86d 100644 --- a/packages/app/src/chat/nip29.ts +++ b/packages/app/src/chat/nip29.ts @@ -46,12 +46,12 @@ export class Nip29ChatSystem extends ExternalStore> implements ChatS .map(a => a.tags.find(b => b[0] === "g")) .filter(a => a !== undefined) .map(a => unwrap(a)) - .map(a => `${a[2]}${a[1]}`) + .map(a => `${a[2]}${a[1]}`), ); return groups.map(g => { const [relay, channel] = g.split("/", 2); const messages = allMessages.filter( - a => `${a.tags.find(b => b[0] === "g")?.[2]}${a.tags.find(b => b[0] === "g")?.[1]}` === g + a => `${a.tags.find(b => b[0] === "g")?.[2]}${a.tags.find(b => b[0] === "g")?.[1]}` === g, ); const lastRead = lastReadInChat(g); return { diff --git a/packages/app/src/chat/nip4.ts b/packages/app/src/chat/nip4.ts index c766ba5a8..f011d5757 100644 --- a/packages/app/src/chat/nip4.ts +++ b/packages/app/src/chat/nip4.ts @@ -34,7 +34,7 @@ export class Nip4ChatSystem extends ExternalStore> implements ChatSy const dms = this.#cache.snapshot(); const dmSince = dms.reduce( (acc, v) => (v.created_at > acc && v.kind === EventKind.DirectMessage ? (acc = v.created_at) : acc), - 0 + 0, ); this.#log("Loading DMS since %s", new Date(dmSince * 1000)); @@ -49,12 +49,15 @@ export class Nip4ChatSystem extends ExternalStore> implements ChatSy listChats(pk: string): Chat[] { const myDms = this.#nip4Events(); - const chats = myDms.reduce((acc, v) => { - const chatId = inChatWith(v, pk); - acc[chatId] ??= []; - acc[chatId].push(v); - return acc; - }, {} as Record>); + const chats = myDms.reduce( + (acc, v) => { + const chatId = inChatWith(v, pk); + acc[chatId] ??= []; + acc[chatId].push(v); + return acc; + }, + {} as Record>, + ); return [...Object.entries(chats)].map(([k, v]) => Nip4ChatSystem.createChatObj(k, v)); } diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index 8435f23cf..b86f360c5 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -9,7 +9,16 @@ import { StrictMode } from "react"; import * as ReactDOM from "react-dom/client"; import { Provider } from "react-redux"; import { createBrowserRouter, RouterProvider } from "react-router-dom"; -import { EventPublisher, NostrSystem, ProfileLoaderService, Nip7Signer, PowWorker, QueryOptimizer, FlatReqFilter, ReqFilter } from "@snort/system"; +import { + EventPublisher, + NostrSystem, + ProfileLoaderService, + Nip7Signer, + PowWorker, + QueryOptimizer, + FlatReqFilter, + ReqFilter, +} from "@snort/system"; import { SnortContext } from "@snort/system-react"; import * as serviceWorkerRegistration from "serviceWorkerRegistration"; @@ -51,7 +60,7 @@ const WasmQueryOptimizer = { }, compress: (all: Array) => { return compress(all) as Array; - } + }, } as QueryOptimizer; /** @@ -193,5 +202,5 @@ root.render( - + , ); diff --git a/packages/app/webpack.config.js b/packages/app/webpack.config.js index 3c8edf011..d002edba3 100644 --- a/packages/app/webpack.config.js +++ b/packages/app/webpack.config.js @@ -19,7 +19,7 @@ const config = { import: require.resolve("@snort/system/dist/pow-worker.js"), filename: "pow.js", }, - bench: "./src/benchmarks.ts" + bench: "./src/benchmarks.ts", }, target: "browserslist", mode: isProduction ? "production" : "development", @@ -156,7 +156,7 @@ const config = { extensions: ["...", ".tsx", ".ts", ".jsx", ".js"], modules: ["...", __dirname, path.resolve(__dirname, "src")], fallback: { crypto: false }, - } + }, }; module.exports = () => config; diff --git a/packages/system-query/pkg/package.json b/packages/system-query/pkg/package.json index 79f43f397..74743550f 100644 --- a/packages/system-query/pkg/package.json +++ b/packages/system-query/pkg/package.json @@ -11,4 +11,4 @@ "sideEffects": [ "./snippets/*" ] -} \ No newline at end of file +} diff --git a/packages/system-query/pkg/system_query.d.ts b/packages/system-query/pkg/system_query.d.ts index 4fdcb2a92..b1781e0da 100644 --- a/packages/system-query/pkg/system_query.d.ts +++ b/packages/system-query/pkg/system_query.d.ts @@ -1,31 +1,31 @@ /* tslint:disable */ /* eslint-disable */ /** -* @param {any} prev -* @param {any} next -* @returns {any} -*/ + * @param {any} prev + * @param {any} next + * @returns {any} + */ export function diff_filters(prev: any, next: any): any; /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function expand_filter(val: any): any; /** -* @param {any} prev -* @param {any} next -* @returns {any} -*/ + * @param {any} prev + * @param {any} next + * @returns {any} + */ export function get_diff(prev: any, next: any): any; /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function flat_merge(val: any): any; /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function compress(val: any): any; export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; @@ -45,21 +45,21 @@ export interface InitOutput { export type SyncInitInput = BufferSource | WebAssembly.Module; /** -* Instantiates the given `module`, which can either be bytes or -* a precompiled `WebAssembly.Module`. -* -* @param {SyncInitInput} module -* -* @returns {InitOutput} -*/ + * Instantiates the given `module`, which can either be bytes or + * a precompiled `WebAssembly.Module`. + * + * @param {SyncInitInput} module + * + * @returns {InitOutput} + */ export function initSync(module: SyncInitInput): InitOutput; /** -* If `module_or_path` is {RequestInfo} or {URL}, makes a request and -* for everything else, calls `WebAssembly.instantiate` directly. -* -* @param {InitInput | Promise} module_or_path -* -* @returns {Promise} -*/ -export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; + * If `module_or_path` is {RequestInfo} or {URL}, makes a request and + * for everything else, calls `WebAssembly.instantiate` directly. + * + * @param {InitInput | Promise} module_or_path + * + * @returns {Promise} + */ +export default function __wbg_init(module_or_path?: InitInput | Promise): Promise; diff --git a/packages/system-query/pkg/system_query.js b/packages/system-query/pkg/system_query.js index 57dd87cf8..67836cbdf 100644 --- a/packages/system-query/pkg/system_query.js +++ b/packages/system-query/pkg/system_query.js @@ -4,20 +4,22 @@ const heap = new Array(128).fill(undefined); heap.push(undefined, null, true, false); -function getObject(idx) { return heap[idx]; } +function getObject(idx) { + return heap[idx]; +} let heap_next = heap.length; function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; } function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; + const ret = getObject(idx); + dropObject(idx); + return ret; } let WASM_VECTOR_LEN = 0; @@ -25,536 +27,560 @@ let WASM_VECTOR_LEN = 0; let cachedUint8Memory0 = null; function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; } -const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); +const cachedTextEncoder = + typeof TextEncoder !== "undefined" + ? new TextEncoder("utf-8") + : { + encode: () => { + throw Error("TextEncoder not available"); + }, + }; -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' +const encodeString = + typeof cachedTextEncoder.encodeInto === "function" ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} + return cachedTextEncoder.encodeInto(arg, view); + } : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length, + }; + }; function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - } - - WASM_VECTOR_LEN = offset; + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0() + .subarray(ptr, ptr + buf.length) + .set(buf); + WASM_VECTOR_LEN = buf.length; return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7f) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + } + + WASM_VECTOR_LEN = offset; + return ptr; } function isLikeNone(x) { - return x === undefined || x === null; + return x === undefined || x === null; } let cachedInt32Memory0 = null; function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; } -const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); +const cachedTextDecoder = + typeof TextDecoder !== "undefined" + ? new TextDecoder("utf-8", { ignoreBOM: true, fatal: true }) + : { + decode: () => { + throw Error("TextDecoder not available"); + }, + }; -if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; +if (typeof TextDecoder !== "undefined") { + cachedTextDecoder.decode(); +} function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); } function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; - heap[idx] = obj; - return idx; + heap[idx] = obj; + return idx; } let cachedFloat64Memory0 = null; function getFloat64Memory0() { - if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { - cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64Memory0; + if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { + cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); + } + return cachedFloat64Memory0; } function debugString(val) { - // primitive types - const type = typeof val; - if (type == 'number' || type == 'boolean' || val == null) { - return `${val}`; - } - if (type == 'string') { - return `"${val}"`; - } - if (type == 'symbol') { - const description = val.description; - if (description == null) { - return 'Symbol'; - } else { - return `Symbol(${description})`; - } - } - if (type == 'function') { - const name = val.name; - if (typeof name == 'string' && name.length > 0) { - return `Function(${name})`; - } else { - return 'Function'; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = '['; - if (length > 0) { - debug += debugString(val[0]); - } - for(let i = 1; i < length; i++) { - debug += ', ' + debugString(val[i]); - } - debug += ']'; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches.length > 1) { - className = builtInMatches[1]; + // primitive types + const type = typeof val; + if (type == "number" || type == "boolean" || val == null) { + return `${val}`; + } + if (type == "string") { + return `"${val}"`; + } + if (type == "symbol") { + const description = val.description; + if (description == null) { + return "Symbol"; } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); + return `Symbol(${description})`; } - if (className == 'Object') { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return 'Object(' + JSON.stringify(val) + ')'; - } catch (_) { - return 'Object'; - } + } + if (type == "function") { + const name = val.name; + if (typeof name == "string" && name.length > 0) { + return `Function(${name})`; + } else { + return "Function"; } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = "["; + if (length > 0) { + debug += debugString(val[0]); } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; + for (let i = 1; i < length; i++) { + debug += ", " + debugString(val[i]); + } + debug += "]"; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == "Object") { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return "Object(" + JSON.stringify(val) + ")"; + } catch (_) { + return "Object"; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; } /** -* @param {any} prev -* @param {any} next -* @returns {any} -*/ + * @param {any} prev + * @param {any} next + * @returns {any} + */ export function diff_filters(prev, next) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.diff_filters(retptr, addHeapObject(prev), addHeapObject(next)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.diff_filters(retptr, addHeapObject(prev), addHeapObject(next)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function expand_filter(val) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.expand_filter(retptr, addHeapObject(val)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.expand_filter(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } /** -* @param {any} prev -* @param {any} next -* @returns {any} -*/ + * @param {any} prev + * @param {any} next + * @returns {any} + */ export function get_diff(prev, next) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.get_diff(retptr, addHeapObject(prev), addHeapObject(next)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.get_diff(retptr, addHeapObject(prev), addHeapObject(next)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function flat_merge(val) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.flat_merge(retptr, addHeapObject(val)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.flat_merge(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function compress(val) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.compress(retptr, addHeapObject(val)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.compress(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } } async function __wbg_load(module, imports) { - if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { - try { - return await WebAssembly.instantiateStreaming(module, imports); - - } catch (e) { - if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - - } else { - throw e; - } - } - } - - const bytes = await module.arrayBuffer(); - return await WebAssembly.instantiate(bytes, imports); - - } else { - const instance = await WebAssembly.instantiate(module, imports); - - if (instance instanceof WebAssembly.Instance) { - return { instance, module }; - + if (typeof Response === "function" && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === "function") { + try { + return await WebAssembly.instantiateStreaming(module, imports); + } catch (e) { + if (module.headers.get("Content-Type") != "application/wasm") { + console.warn( + "`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", + e, + ); } else { - return instance; + throw e; } + } } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + } else { + return instance; + } + } } function __wbg_get_imports() { - const imports = {}; - imports.wbg = {}; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; - imports.wbg.__wbindgen_string_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - var len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbindgen_is_object = function(arg0) { - const val = getObject(arg0); - const ret = typeof(val) === 'object' && val !== null; - return ret; - }; - imports.wbg.__wbindgen_is_undefined = function(arg0) { - const ret = getObject(arg0) === undefined; - return ret; - }; - imports.wbg.__wbindgen_in = function(arg0, arg1) { - const ret = getObject(arg0) in getObject(arg1); - return ret; - }; - imports.wbg.__wbindgen_error_new = function(arg0, arg1) { - const ret = new Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { - const ret = getObject(arg0) == getObject(arg1); - return ret; - }; - imports.wbg.__wbindgen_boolean_get = function(arg0) { - const v = getObject(arg0); - const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; - return ret; - }; - imports.wbg.__wbindgen_number_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'number' ? obj : undefined; - getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); - }; - imports.wbg.__wbindgen_number_new = function(arg0) { - const ret = arg0; - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }; - imports.wbg.__wbg_getwithrefkey_5e6d9547403deab8 = function(arg0, arg1) { - const ret = getObject(arg0)[getObject(arg1)]; - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_841ac57cff3d672b = function(arg0, arg1, arg2) { - getObject(arg0)[takeObject(arg1)] = takeObject(arg2); - }; - imports.wbg.__wbg_get_44be0491f933a435 = function(arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); - }; - imports.wbg.__wbg_length_fff51ee6522a1a18 = function(arg0) { - const ret = getObject(arg0).length; - return ret; - }; - imports.wbg.__wbg_new_898a68150f225f2e = function() { - const ret = new Array(); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_is_function = function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; - return ret; - }; - imports.wbg.__wbg_next_526fc47e980da008 = function(arg0) { - const ret = getObject(arg0).next; - return addHeapObject(ret); - }; - imports.wbg.__wbg_next_ddb3312ca1c4e32a = function() { return handleError(function (arg0) { - const ret = getObject(arg0).next(); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_done_5c1f01fb660d73b5 = function(arg0) { - const ret = getObject(arg0).done; - return ret; - }; - imports.wbg.__wbg_value_1695675138684bd5 = function(arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); - }; - imports.wbg.__wbg_iterator_97f0c81209c6c35a = function() { - const ret = Symbol.iterator; - return addHeapObject(ret); - }; - imports.wbg.__wbg_get_97b561fb56f034b5 = function() { return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_call_cb65541d95d71282 = function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_new_b51585de1b234aff = function() { - const ret = new Object(); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_502d29070ea18557 = function(arg0, arg1, arg2) { - getObject(arg0)[arg1 >>> 0] = takeObject(arg2); - }; - imports.wbg.__wbg_isArray_4c24b343cb13cfb1 = function(arg0) { - const ret = Array.isArray(getObject(arg0)); - return ret; - }; - imports.wbg.__wbg_instanceof_ArrayBuffer_39ac22089b74fddb = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof ArrayBuffer; - } catch { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbg_isSafeInteger_bb8e18dd21c97288 = function(arg0) { - const ret = Number.isSafeInteger(getObject(arg0)); - return ret; - }; - imports.wbg.__wbg_buffer_085ec1f694018c4f = function(arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); - }; - imports.wbg.__wbg_new_8125e318e6245eed = function(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_5cf90238115182c3 = function(arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); - }; - imports.wbg.__wbg_length_72e2208bbc0efc61 = function(arg0) { - const ret = getObject(arg0).length; - return ret; - }; - imports.wbg.__wbg_instanceof_Uint8Array_d8d9cb2b8e8ac1d4 = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Uint8Array; - } catch { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbindgen_throw = function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }; - imports.wbg.__wbindgen_memory = function() { - const ret = wasm.memory; - return addHeapObject(ret); - }; + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_object_drop_ref = function (arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_string_get = function (arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "string" ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbindgen_is_object = function (arg0) { + const val = getObject(arg0); + const ret = typeof val === "object" && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function (arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function (arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_error_new = function (arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_clone_ref = function (arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_loose_eq = function (arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_boolean_get = function (arg0) { + const v = getObject(arg0); + const ret = typeof v === "boolean" ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbindgen_number_get = function (arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "number" ? obj : undefined; + getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; + getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); + }; + imports.wbg.__wbindgen_number_new = function (arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function (arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_5e6d9547403deab8 = function (arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_841ac57cff3d672b = function (arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); + }; + imports.wbg.__wbg_get_44be0491f933a435 = function (arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_fff51ee6522a1a18 = function (arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_898a68150f225f2e = function () { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_function = function (arg0) { + const ret = typeof getObject(arg0) === "function"; + return ret; + }; + imports.wbg.__wbg_next_526fc47e980da008 = function (arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_ddb3312ca1c4e32a = function () { + return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments); + }; + imports.wbg.__wbg_done_5c1f01fb660d73b5 = function (arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_1695675138684bd5 = function (arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_97f0c81209c6c35a = function () { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_97b561fb56f034b5 = function () { + return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments); + }; + imports.wbg.__wbg_call_cb65541d95d71282 = function () { + return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments); + }; + imports.wbg.__wbg_new_b51585de1b234aff = function () { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_502d29070ea18557 = function (arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_isArray_4c24b343cb13cfb1 = function (arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_39ac22089b74fddb = function (arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_isSafeInteger_bb8e18dd21c97288 = function (arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_buffer_085ec1f694018c4f = function (arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_8125e318e6245eed = function (arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_5cf90238115182c3 = function (arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_72e2208bbc0efc61 = function (arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_d8d9cb2b8e8ac1d4 = function (arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbindgen_debug_string = function (arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbindgen_throw = function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function () { + const ret = wasm.memory; + return addHeapObject(ret); + }; - return imports; + return imports; } -function __wbg_init_memory(imports, maybe_memory) { - -} +function __wbg_init_memory(imports, maybe_memory) {} function __wbg_finalize_init(instance, module) { - wasm = instance.exports; - __wbg_init.__wbindgen_wasm_module = module; - cachedFloat64Memory0 = null; - cachedInt32Memory0 = null; - cachedUint8Memory0 = null; + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedFloat64Memory0 = null; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; - - return wasm; + return wasm; } function initSync(module) { - if (wasm !== undefined) return wasm; + if (wasm !== undefined) return wasm; - const imports = __wbg_get_imports(); + const imports = __wbg_get_imports(); - __wbg_init_memory(imports); + __wbg_init_memory(imports); - if (!(module instanceof WebAssembly.Module)) { - module = new WebAssembly.Module(module); - } + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } - const instance = new WebAssembly.Instance(module, imports); + const instance = new WebAssembly.Instance(module, imports); - return __wbg_finalize_init(instance, module); + return __wbg_finalize_init(instance, module); } async function __wbg_init(input) { - if (wasm !== undefined) return wasm; + if (wasm !== undefined) return wasm; - if (typeof input === 'undefined') { - input = new URL('system_query_bg.wasm', import.meta.url); - } - const imports = __wbg_get_imports(); + if (typeof input === "undefined") { + input = new URL("system_query_bg.wasm", import.meta.url); + } + const imports = __wbg_get_imports(); - if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { - input = fetch(input); - } + if ( + typeof input === "string" || + (typeof Request === "function" && input instanceof Request) || + (typeof URL === "function" && input instanceof URL) + ) { + input = fetch(input); + } - __wbg_init_memory(imports); + __wbg_init_memory(imports); - const { instance, module } = await __wbg_load(await input, imports); + const { instance, module } = await __wbg_load(await input, imports); - return __wbg_finalize_init(instance, module); + return __wbg_finalize_init(instance, module); } -export { initSync } +export { initSync }; export default __wbg_init; diff --git a/packages/system-query/pkg/system_query_bg.wasm b/packages/system-query/pkg/system_query_bg.wasm index 8590da75f1d85807cab185e994d2f223b8f054d5..9ab1834bc2edd04da5a3dad0369b69ee3dfff4b4 100644 GIT binary patch literal 120012 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

sNBJzQ>dGogK2i)yVo~`&_W= z1E-?vn@>g82zy@#VY_!4yB42z>=&JZQHO`J%VwstQqHKE$VJgdIus3ue$$NlOt=`t zr#tObQR{$F(?kOp?-?;WMn%Qp{pvm zH%ot!_sf0c{hWOtMBej!8BE?R)W1dEp1eQxO+wxU9Pdc-#_qJ>-p}OZ{koCuScK-Y zAaAr#BJa=kk@u_ieGqvc=gVO7KK?E8&T`@8UwxC1cLB#clDuEP_6M*?lwZx~sI= z5okx~zNIfmH`7LMpgn$GRR}tT(GAI{eE7K-wUv! z)^>_olc$Td50K||CzZy5gZ$gb6itkn3+VHTg4EtzDJbc@iFd5oDMtiC3sgw3H1vSp~5ZI9( zL3j>zR53LEz8#zu;9(X>Df0SZYSvav%-PF_r>O)x`|Y+WK5 z((C|C$&8IBwkGugDDMq|?7uwAsj$GayaMjz<4CYF1x#DQFuO9?GOv=^9(z|*m#PGV z<1A{c6t$V!9jnT}2v1!f){#Yhs|VEA@bw)Y0G~1z0G5g>M*#3I{^PIxbma=set+XN zobrAKDeaY6*swl11Myw_~4E5Ez^_@4MKC`zt zYxpGDo}oTFMd-=n`~mef-xPdWD4wCd#a;L=7*HQufzS={#0t7?K^8I_6lNwK>1yQyrGM#;3rYa^Er()?CoZINq_ zW5ED}7>i~J+<0_=V9{7~E5QXaOTkh`hANRee>}Q@psBsn$ekx67PiD?#L`=_W(pI!B_cdQ?%bi_seN?3c%B{K0W*oR_Wb+It9hQQZJW5cK zk(I16l7H?SRIvvAP#P`9afdgFXsiuv{)SJ{h`-TE*9=3&)egFvE<( z9+^X^luh@0Vew2RQ&ZE~-7{Itxke(Qt5>_=T5O&J8tt=|ve%!V4`?}4PzK!7?KnED zhioq5Nbjob0v@q&s9wzrj}?BkL${>C^dTls3JPbZvu~ej==9la_VO3zZTE#^u4XqC zKyqbKJ;&#gUkYc<*32S};=|<6SY5i3&JGjMau;7GCd@n-rEyCsW8MfcfP>ZA}TAJgE_x{V{u zzZj+vVhqLjNa2$<#XD2564NY5V0Am>vr-yqk~jIX@Es=C=LmAKtXcHo4@5(8^2;pj zb1Vg|kRuM!wv0lu3ue+_Hu-f5b;0b6S|;4};YorY#07Ty@WiXf6O5&UCqovA!B&)G z3!@J;Lcy2ARLm@%H9F~UQzTXwaE{XV1yuIH7mcXf6^Oa$;m8^tAEJRXB2ViZy6T_? zwwV@HVSNpekC_O8FGT#N_=pc^b4@i_gQn=iv#OS(zO?P6YQr~GZNnfkiPri;1cnst zNvM3%SBa>!lg}xlpGS`?AM}F~QzBPUzZFBDZY0skwAF@NBGH5plpT~VgAsljv?95* z;wcM!ly;`!YKiF}3yNFqc!S;`GsbS%w)5*yrY4|fSaxMq*P;3}xRy-fJ=e_;&sszj zSz&-&A8qT< zL)5S58i!8x%($Xpa%2zlW`8s;#S-{kt+GJ&5ucKtdKsqH4(RzH`BLa=2)~Xput^q6 z#TfahPf5#Zq^n)KT1`--=6vYpQPuJWrkp``f}$iB1le&tY2jhTTgvQp;%wL|dhR)1 z#ANlNu=C}JzI-kJqOg?Av;mq+q13OmW3(95Iw7loZ< zPwC~c{ENa)vZwX(Wd22AC)sCuzs&1JF>2^%dtaW_i(>TUnckNd^r9Gjd9L^6CA}y{ zUta8eIj$GQ=*!E!FDLY(7=3xA_vJOcC`Mmi?R|M&FN)EZIi`W^tNDw<&X*(l^0oYn z!cMY>_2mKnr~rkXWJmS#Q2s?>C)qK*Jd%G=*h%(;ULMWADC{JAN-vM)UlewdJ*}4~ z^DhcJ$>#O)nf!~wPO@k9^4a{0!cMXm^zuypMPVn|OL}=O|Dv#y?6_WD%)cn?Bs-y( zm-8($EwX#pdN(BFb{&ArVK`rVzhN*&`bG_+${Tk#G|v z|2eeD1)FZvF2+Uz}kbZ(Eo&2bAp@&Jnt6c>Q-jXOnGZ__?`+p>k3W= ztj(k#s0~s3rfVxEqCCIF3BM9K^XhSgAx_=p;SdRgvePCM zES`mB&;O%s%mCmLd`rB|XMm8&Ht$$kmH3Y3iBu+KY6hS{-b=m%JqaQ+Yx#mas(wS! zqBjvJv^PD4G-2~TvX{q|M1qib5W_lVTCN=mBs<@l0*P0&tcl3)Gv*p3+D5AoQp&l2 z5G2=YmJhr}&SdsnDiu(mMbo@3atFzxWkiQu9A)V^)s`iGSrUp?jI=FCei8vFuZoD| zgRFI|o0*MErxr=H+*lxr4irfcKGi)YgI0Z8tD=QkQ4O=PjdW7@F8za4?P1( z7f)v^q4d77>)6zWUQ6WnoccaCb)*uwoR)=d9yw*K#v1I`Dpq`bU7~7 zqV>UUJ@128@qDwMZ%xn7-Km{Vp{;XHa;FyO4gzAUQyJvUMnl`YsZoSs73Wr0wuYOl zY|*6VKnpY+rJWkCEIV80C`!nLg3b^xI62*4%ao zJTZ$3^~YEQ3>2z3(g$g*c%~OSx?f-*`zy}BKE*jF`KA$dD#^`KdGIJ91dM0FZMFMA9QTasYYz+QfmwRJmKr z+_|)N34@e^dR^oYMXGMMN_9&_U$-ja)^^y35jmnN`ZOspvi$4B2oA$KecA>i%YeMm zTqcaL_tuY*MibbZK+)?CCs_c+%Cm$*j@t?-h6^axyaiCCK*2fVc9Yfu1zU&xP&CyS zEuiRieS^=xzP>o;ETLcnwF8AKpji7BK!F#M_6neA(ORIunPEQ^ExBD>1Qfk)ZWb+o zV#QfPG13FYNCCwqZvhl|+-!4by}gLm0tFndABshCwzwE5dOh0UI~{mfFfFwV3;JPL{yLfD#p@pH z;dQK6`hZwkG@*yr!N|qyl)Ke*tH5_%#tv3iuge-@`^s7}pe$xKm8IM?2)B)L!G#c_ zcJ(@}A-1n9_PL7byu*WSZoOF>ELXPbPMpPruSEWNg2G`9GD3+6a8gGLNMKqzOb4{s z#99EEhhUMP=%Ce3M)P#@?#FjH+)9*pn45*NHmTl46ux3s5+$a+QgLgE!~M!RdE7aQ zyO1~>f~?5nRwynd4!0A_^Elh|Y7>Vyon?94GNp6G)pxk1dE8RPT|iv2!!60)&`5NZ6}8ip66V_uhZ)-D z4BWf4zZtl-cHZ7ys2$C~rT#oVJE1zE&lcz?0ehco2{<&rhJb~$&T?~-zDd9Vdsc<4 z6gb4s7c{lFxWI`G&$se?4$q5t*6IEgJhynhp6BH}H+jCC=Vd%Mc-DFGr99VpzJzC; z3r~1AmX;ot_9g;%DCx@<@)@ z79Ju088^~+N#v5ubCz~UCXBI&eFEz!O$&2R$B$hb>(GK3Zz5+3~`GUFzx}X z2Y5yMfTlV;{o7K zTXKq1*X2gufZ^<8WV%OQsA$d_KA9^G(>US#f|i$XVN;#K(Iq+v;ef-`(hF3wzh&Pu zp0QnC&T6YU_#6$=B|7(8J+i&<{uJKtmTZ6HZ~y!M_uu~NPk-x;-~n@|N|WDQhDdfl z$oiSwN88pM?J(=4H(NJCK~|ICUUjW0S6vqb9215cE3BN|(s1M$H?INu^R@%yMpD2jVMkNZwFS&S5C2x+Qi_olHs> zOKiyR&=hR_PoP+KEA_fT57lxLbSO%ggcaB0BK()xg9rH{Z*sHKR3$Wp|Y26#)MCiSec1gZ%SV#w{8Je(BNxC6&r&mrdof zji&Oe1e9+Mwug%Hhb|3pN4P$y7vk;Y}(lOoTB+G*#9f*FsMd`bObnbgS+8#Y3FJh z+NO~<@Ss;IOVh;~XK-q7Na7ZE$r(FE#*rL+GR!oZDuYKw|2TqQ`f-FWW7iy`M4xWVHyZt$RzMVVs)YdqKZ zI_E5-EGe@g8BRyT2sLlT>RAY4(7c7_0V9glq|v;ElVKEPy)##=nJd=JRbl3$q|VF* zAupV_hHTzyfK%x74Qw;YeKS}&LQevToo)s*+fR5VPBhG=%2~}|8iH>sLq3Dyw-~Q7 zMrPd^?9J6J24OQ;*~v`U(~GFUcmt7|!D=VXV3=YRGZ^--(`Gj7XE2yw8c(H-?hGc+ zkl0E=M6g(qX*7#!-)1m&-kHI+Kc2Q`(jlyf%5G@DeAF}Ysy#Cp+}71*(&~U5hLUnI z@~Trx*E90UryhAj({%9=Ggz%NgMrX|25a@tV6_=KTEov~FaR%rtL8IUNz)M%xU1&V z5fLF)&lX`*8WE^MeFPkv5xYK!jqj4hrZj{IF@dUM3c(Ibb!qY@v6gpeh!8>G6gC4u zN7FPsZ&fh^G;(g=_cf10rtr){CLPA{V^>?q@v+0fSB@O+z~SM);^i^`DL6dcJ>+AD zPRZfvZ@e+~a(Dz$ad^nr4fSz&?Lmpd$2}ZgE$|$k>B4jP7A1->yBr=mlzTD_!BRhm zM=y!ABsbsFqBc1EAgbx7GdK%G7L;4f|X{hw#B$viYft-_04+CT)CHiW11pI_^}v_ZW) z;L--X4JBz!uBmw9(uQh&X@gY`^@quoG(^7Mthw5AQd*>SxQsoLktUDFY&^K?czh4! zV@OH%sL>CFtnr~x9v=>MM~P-Iay$}x8(-kPiS%+WXB#KU`w4-2K^aDQ)T>f#3eR_+ zN1_9%DRKC6t2QM@G;l$?>6&yW9>ta+R*r&R#LtWw*6x8ET7aV@nRquzvGfiR4ma}L4PxU+0#pui=2^m)vC=eZC?JQ^@ zgZ04yXr^=df^`yp3{GLazdIcq1zTiD-8zds30ea>w z(c0}=qbK)y2X97UB;|gEd^_jUu4)&2+BI02ou3L2roj#%cMd3GHZS687{i3`)PeH@)tH5&)$g`ZNrhOaou|)+BBXO_B;6q4XegHA`HE6SIszR3}Bh zG<#4iRbkJ9u1v@AaI-k<{W-G7YD40Z;(H7ocaoedpN`ALU8$;sEeipg1sbD~ zXrh~u`+kbDSNV+oUXjbYNi7+g1r)7OYowMCE5JD%-1wIXXJi1~}fOB~WDAW`8FXV?h z?RvIhHZv(GVK}Zv(R&}&W@zO;SV(pe6tzrv7N2^eB%o1>X>Hq-> z5J_kppSqa99j!XoAFV=axP-T1f3%7n z9>*Jpsn!s1ic0(QoUqb%B!{VVw2Bi}O#;qT(LSB2lIESWSkhIh@vOo~D4dAOP&X8- zF=(oLPD<`N!INdnbuRU2>EW`Z^m#9(BOl}}j{yJE#>d;pJB*erY-pJz_8o1@IEKVP z_jl>JiWXFezl4kwSDDVLhjP#%iUr?`(Vn+OX)^$zu{v3SR#!1}h^c6@7)P|R_A7Ku zi+bp!GGs;^hr6*IvwaSXX1c0O+M#$heCUII+ z3n+QF*~K3w$s|*BS|rNh!ae#T3l}I zf{?uQF-8n@%wk_>rKoenRYa;*C!D%fREUm5q^AagljLf9b-a>7>P}W)<`maXAV!|= z&`H{pMj_(|F$FwLn>3J#(LlDf)n`LvF=$b_UI}Efkn(~XG=>La>)sQ7hTxn{=Tk3v zf((twK<9PfmsC_kS!<2usCbnDjkFf74GdL7D68X~LQAVr4H#)dgc&OG)yzI9+o8)0 z4U@E}OE{dD))A*LHAZ_XrK%h$*CosmB~@u{CmMkEGP+@jBo!Om!pE0C?(vZ|xn)c^TL;9{~w4mFE&dgL28*vm@jb^}=eZU>}7U}&6ke69jErL!p z`Un&?Y<;JLXJB6@A7Ee3#}So(dV6%U=cdO|vDRr9GoF}XeY==2*b=NTJ)q?qV@sB& zMnH9Nle1>hcnOtvyC$Z?6x5kn(=!IyvK0FsY!4c_ln z1%>CbeU6?<_PQ@Kn5h}>1czN!HNdm9^~l7gYXXpN7PlJ|)<}m`H#-Ar>~aN|b+B+a zFQ$Fg#^vrj8>uQzJ3Y&lk`uatu*bZibB+q_Y_Sb1gmQ0oz}Aq?^4day6ukK1sqSND zw85qtQ>(wEVKd|!$*tCmHXW)~fe#ww&+)Mzt_Et7r87rBgIydU)=ZI!wT}wLEU1rB z4uPu(QBW>9vi8Mvhe(b*!VX7pQ11z$;w4dbwzYxoecVV#Iubp`c_`9rkQ2SsP?*f%02nlmTiabPI{t^P!57=%7KxfLwuJ zcfZP026Xp@$^v?E#Yy>&tZbW+wg2xcC0I2p}!JZciHv(OI4O4sDduSpb3vJh# z5F@*yaGHrT$3lCr*l`aU3dsGu26Q)q6hU_*%5x80-Vns996E(SC#wLzA_F4-Am~c6 ztxlQOnsz2vFLWz1FBfXU^HKG2R$Sg+*k`cWk9{)jk(ki7R9iEP+@R}r_9{iGy(AX( z^rFMzWd@Ygn008A=*m!=61@Pgo>;U~1Ww95IB794h%`FRld;F%p6=Ox?vd?p1owB1 zIqqvudLFaP?Li2k&ztdKryB&9%&>>FE(p?nZt_8L9)6JGJ4PTMy}#G|puH#BMuVZ; zkXqaOI}O>x47JGZ*Ii!-Z(wf%GVfna>&Y~x!2w^VLYVGerv{+DalCm=!?RBRB zlRJrQ;Zt)freuS$WXdg_k~!hBDYuAKlCYZ7 zQ$k#ADtnoiWbCUJ*#f0WX zTU0e{QK5x_$;nNEhAq<*lYRZEBYH`DRHiE>WPUb76!~g9m)|OWYxteV4^!aw`TQ>6 z=lHb|NaxD7oh=%pqwCa|rdmr}3rr=uVgD>~<=aTe;w*h{z91b&FifRKku%Hb5hAzd*;y=(MbAd4MNpPLqY#zI zyh1dbpH;|`6K|iUKK+bBmKNOoh8}e+I)RQ*5*&dScj8{lMC4sB-)WDTB_o%Ao3WISLVenRmEtIv!g`rEF#sghpk~P zmGqr_Kf?E`^O9OB=^7&Eh`ct>q#Hle?;;Z6DZQ?UR7rOVSE#Q+yPAl0`Gi95kULUB zWkUtmlMS7G`rUa2OH{!Ji9Al^_vB?QQ3W>;sg=d|7LlspdS3y4MV=^OJx_rjBH6Pf z`@X!u6)NyXBDYPa{~*u0LgjrwaT8PNKP=)@+^8?k(cTiPLW)D*j(#)!fxNWkD(xQ; z=cdwKc}~tTPo*~#NAlf8oJ!LPU!c9jwM}1vI^+bKRp_y`oY9&;t!YUKZ(;euaIWPm zM@|7ZB=cFBxjUo*>P*y<8-z0kda3eksz- z1cVbFLaIIy8I<|b;u{O*i8F!8CDNw@6B;VuWQWrOx(-0u-^u}<6Db4e>(U)+^-MtPhW=FCpHe3gP;XC}cKxSRu2< zLkbzdN8+5Q@97Zr6TY_}@G|Q+mZ+bgyQ`-gyCbJ3YFK&E@%}zkM(+sNfN>X8JugV1 z>Zc1xkJ_#fj11P{L4EA)0QK23fqK#DL1q3cK;^DzjYy>hT=ZmkLl>o)|L* z)Ds@md?oUY?bQ=!0`=Xe2ld%5sNAILL47x%B2g5e&aucaUR8klQWw-CCC{$jj$S>& zR>Nrt_+6(5^+Xp`u5k6Bz6(%a>VkSK2lc3J;lh|-?}GY-2Q^Aj23#IP{H<~|favNdoS|lLdqcqmGn~CteFsJ2mJTEo5 zfH5JTmn1D#0K--eH&~F}@7|=vqM+t?SJHgZAPI`eXN%jMS3T~=@~5qCB5%Z{?%X`? zGWWjx>D%4=J55|^aoh*Ps=^*$uu1MjU-S{o%BoW3DKVVO6?2W_qh+{>HmSdF;Ddm-S>CW zudpYUfZ(>&cJ2q6hD6f?SOx(smcyf}LGe?fzipq#bb1J4wq> z($Wrfw&rp+FEoX-fu|XsT?=G%yJecYjkUtF8;t!e)|a83S<7aeC=ha#9ACojfC$#8 zorukffOhk?n$DaU252XVT+u`sE7MNQix$J+E^_J6ux^=U{l=}F8OBHCfX@}*vsW#K zHD#v^Bumo3^NJWjqJ`;A6d?0-TO)P~@P^qeC5z-zev{_uZj1`hdh}iz!fH*oDVkY> zts^@HJ!#okM0N^76riA^-5A3u1#x$HN$WjbT$jCQsgCr(^qj@8i0qWaOiM`!B1Mc! zV*SWv<0UN^bwybARZE1-+G*0O7K30{WRohGf>evu(P_B|R%iCi;qDeaIE#CC38ssJ2}{V`)@(jr_ZlN5WDf^kevMQRM| z!bf$kmj5XOre$RjTGI#(R>G&%RDI7w(Fd{1f{HJ$K_PJ@mMu1A9g|V|AZ--%vY`aheZ)fnf`x# z{ZApw7ahf78238X75KlS;yC#$is<;5qeZYQ&Ya^-n|<@Hb3T&7Y4N`$7Y{LG zUq`POxSYd&n*|~DcuTUf%yq=2;7fyC&c*Bw<}T-=#@xd<eXs zr156*mARa3?z~wnoy8O8f5f5G`fMn#N)*O9tMPbXVXt)xW9B?lVaZt+#+-Mi!WcTV z?Bck#b#Tib{^0^l=Djl&CLc>8AV&2-FrVxc=FVK0TpfWknJo4f#(t1G;F(Tg?K2l9 zk3;H1Vus4h^!Sn}%DR~>Ia1?k(22JD?SB+sk*#~CO-&eR5 z0VQK4+a(Lga#opjLkBHoRHTeZiO#e#d(hI~DTg=Go;Hb4k+CH#XG>?{{;vfyDn0Jx zIY=Ak=AJOQC5wruAQ#ZILw1Le4DL)NXbmzl$nv-g%I}ckVQ+X1O$( zIk^^UQw!Dd94xi$;K97sup!Q@!$a^_R{}~+X?nzvR!UvHg|1}2EVf-GvqX%Ebyfw% zD*k1dIha@MXf0P8h1P@Z8YRM#HI>mb$)?;(Sgx5ChB;|HV^-{39wi4rnntx9ZlCT2 zQ5HUwfq==8J$AK6m?EBu$!Xq-f>0{}Yq>ddqg|W;u;%HBaTcps=2oU6 zD3=PL+yts1Sl$lQ3RMUR!)+0%%Y0oDaC-y7H$tA!53>0L7WJ{YBo1UZX4r`ilOIyC zo|1i@ud2TotAIxCY)DR{Rx2uRk1z0)9~xisqYjWmKtPB=grT9+DQ+;-rW(g=={}w- z)}2{k@+X9JMLN_9$VX~a`BPa8BI#QiOi2(^s?p~=Q|<0~>FLavDvK{|NKjqr9Z^s? z#Y8$htkT+%6&&>>j)V<}lOT7$6gW2IblA)^Y#Lnm&LE}bd3@h%e9=djF#1JK7RjO4 zJTl57&GXwKdJ)q|dRM*B1_crn=XFM|LU7$`#;8af%EI(rH{K9polJo zOq`f?)W60HlJzsi=(cC+U95J~T_KbU~DC^GHbqWMkD$=Nz zf$pg{Zv1M+yd7BMs*EYH$un>tlY!MbaUE~U6P^uNtI9uv`VPpIh zU(gr~{8A-5L@#;V6Fi52L6J?W*+}-x=jVguFyeiswC$9wA!A-l_awj2|`Y z4lLW}KL4fn4n%J8WgvbBee9t4V%?7K59Pjajz?`>f`1@ANR&ZSkzzDcmwz zCbip-Rt8Z2OF1)y3Z3ny$4Lu{5FTZn=E3GXn7vo1z1C*DQ*Z1RU7@RK1)V(g(HQuc zrz5&rT2xbl~{L&lEYp;5xy@B z27h|RKC$>j(X$}e%k~N4I{DMn_6affp;ed^SeMmBxl?Y*u2NaM)b#EhWl5^$ZwT9|W4QIZq6PL`usl*+m%8 zYAl=)9x9ZTJ(IVSrJh;3!O#)$X@brIA#?@2A<9XWDQ|dUah&k9wO;nr?=+{g7k>TX zokafb&+=Smg&Jl*@m01B{!>G-fA%FFe{y)|LB-!Ull{bN^(%P#seeuMB4Xi{VRrLO zcKrFe7QS>um_7V&=Y#B$?1X}6!tBYX2|phv*O=oxzW@4{>(iM$hWTbagUsou>%t12V*!(MwRkI> zdT(ecIV~r*pdbNvpHFnzbq62X7>_07sRZKwrsdVIwHJFC4 zZ`X})h@>ty#fl`5H7Q3LXLOSyQ#BJeZdfB`L#{aWiV(3LA}Cjb2Y~}ci5Fh|_gs)= z88c+b@?}gO%`!$uibDo_NM_9U8lA<8=GLBueiIearHB#bQ2c-dRRGUdC%@DgZw9@FIqOCH& z3ig%u7pJyN<4sY^WPWmGR8~7wO5^!bRJjk~h|)3sMW$q{TELD(m!%ClSyaoFt{EH0 zoLZ-Qb?P4y;^FD`xmTno_j={+ ztxpOncJA*@%MYfkcR}g)C7*my{wcukcK1o`2%))grR~WlDPa4GPYM%!xHm14On%r= zukj?fc)_6y*tiUoQ9B|tURr@QlD#Yuf>KRD)Kv?Bk6@UYS#2<#qZSl(J97#hQK1@( zE`j#BnC3p1#%g4&MoMlS)UNV_6sWdS3qAiJB8r>=s3VvF)kv@-_$t2rB@bg67&xd7 z-va;EQ|&l2sMI1li`P;Eh>Fevo+;}u6bhaGVp2KShR%hFA>UP&PQBGhr`}Qr(beFp z@riO+&$kBsdJV%Ird!&X;e_%M0`{ZU5TNQ90UHF)zu}cfkxg&69BtEveUjE8K`QgQ zEmWm2KUq4246JxodJah26eCD<#S80__X*^kJ_~j2ZxUCo+>xUec z!-w)~zsUz=q|K2{eqmZG6+^M)WQP#%rzTWNBrs`5JtsUeC8-GOME>;lBUC}<^bGKnH1>!BZjgx`?}15 z{RfiPv-+JrC0Q{aLpRdROr}=?Su7zV0i=#msSw60i+K?d(r~#CgY=}tV0i(d&%J_N zgjDqc;2)R5p`4IP5K@j)Val=Aux41*;KPO;$V-G$8zvJfKK3q(NXek9z55 zNM$6*jEEO&kbxMWb!ct~zHhEb__|z4aGR4{%KDY2S`^F!;xc|v$S`ymvyaJ1*(hb? zLR3lAAnJMP5$)hgrijr%WRRq*vX-m@Z5xSI-3Y}?kJTZYsF%{grLjo$as(m)#52T5 ziwj7hOGjl-M;eoqEE)<{84;C@i0mYXMiu0)T@`@Inz{LyUxlKEp*?Ktvg_l=9X-pk zosrWOz~XiU)fqL#61)5kkeFlc6x~l5yuyx5jzg`+8DX4a zF}~tHcP%8J$aSr;nSuO; zHU6mQ!Ygaix`Z{q{4@Rt7nYYiFs=ez>2VZl=m<1PBganzZ+>HqMbSxMS~KGezLB(8 z;Ta#}^#Suj8XwXMUpmi=q?!dOO5j%;ny;8=5Ac*rasl);vxaw3y zV5>DXPHQ)UwUk`T%6XO6mL#>V1oC8!Cmp&uNU&*i6ppXS7(qX|ONHVXS;1xoC&8%1 zO~ieAT|TQ(LgBL7T12Mc6gdzUk?m+jHS-S2vdg^rs2WC9@XgHxM}A16&nQn^U2qL; z=j|$jSf>hPoUcal2N&!+U}{K6G{m=O1apoh4RBQY^l!E0S=QCJ#$*sOC|bAYY#>1J z9`z=%h>46QDA}Yvb*DVOZMPw-b14~TT@+`mzm&cHPt`P?1YjtyC8t^;WJzRmJn3AF zFm4{tVCK3mK>|ER6Sgdt%8P$JR=DbiQf{z>Dh^bH0L7jVRbh37aFnxA5o*AFeOmAU zAwj7fD$oI6>rGp5d8Y?L& znd~``Mv!yRF53Q;FZ_q!ef*(6{N=9(XziRu{pFwh=vO}V+{?fEilT;zinssSD?k2~ zKX~;IKl`ep5{vqqFFb$$m!ABiU;T=rqw0D@8@6+Z;^(ufS2!KLuD+!@bQddL?-ZY0gUp1a?V-e4nsLC~JyGd=wL_ zC7)()Qo>QoIU;6KmLHco<%tm>5w63J3uL)1_jm8;se^Dm^TAPZtp&`h-GaxpOiH(% z@2asohK<;r&5GEbEXb3#Jj0_MBk-y+S`)R&F_>B%<|nyYP+B2`$*&oNT-d9$!-#dd z8nKl8M-yWy$;9#z8VC<;-4EofFT4Sd98Ae!OaWl*#Jl8Q-LRAVZ&osH{8e(I>6maW zGlLg`MXy7%gSNI^n5L#!>mcLSxmW4_Uq$ zAJ+1ZEf-{lWINmo5h0hkhmwo)xn3qn@;If{V0qzc5IO&Gc$-9vHkwu`L}8^E9_9B~ zVLSsX(PTpbr*f=Winr0zC`;9Y@kxuc7E?^`BF(P9Di&#WN~N<%!$?X@n?)ME*dCG+ z6z{vXMq^njGk@5+rp!~U(KxK3^seleWGHF6OENaZVH*|&dO?)tw*gBs3Sh}G4c2Vc zA(1FwnbNo5(XTWO2&EHs$>;>vYxILH*nUV0HZQsq+C>nge;Rw>N#c$lg-qrPjp)sq zrNRz@^qsPFmD{q2evw?lBy0C35hhl3oDEyZ`L`(v6qcc4VC4n?3Z;=fO*|l?>UdJZGEue!*0B3>9bgEPs-F zf{thzdC`(_vMy?N7S6dFW{n`p*$kb(i9-3V?f!$hYaaqOf{(h|jb{FWL6NI`^alM! zUqCc}zu)xQhyou%8=-SU=>9OvVi#Cik=jSo%12%0L)>BPKe(`sNGr_Zl^rZW^Ku@= zP@hg&U%(yL2SK(K6}UKwy@XSuPts45mdnjBtgG{+y=`)7HO*QVlO0wfP>c*?HjshO zabb(?Q}b%6v(W}M%0lpS5^X#w>7W=^@tYbod?m|D?bmKW!1pV7=B+Ub%v?H>A2p~8efYrkM0%V5z)P2w@L1hgO)Fn-c5D~w%q&( zSMzh7`=l`d=lG*;<-~4^G~HV{%{E&1axyB`AQlk}lk#Ka=3?nc2P-pX4)WLql&S`D zwzYvQZ?!hS6qypW3SeO>dSPuK#RCk8qbl%Y#fB%X4Qg$xw5b|&o3d72U7`mL5j|Tc zP_kbiBtFA(FF%7OBxb`s0UU_|VV5}3W75XFp*0mB z?hDj(p;Zo>>cAc-+wNO_J*wD4UvB^v zCU@Vg*#F^}le8i?xJ;-~KdN)YXoRq*6tejge@+Uo?<4^PB#OxQ!Wd!NAhoo^K0vn7 z5EDm7n*pVxETFG>U4veXf$d+GvzqZw$yE06lTtshn-1wA&P%}uWly6#gB5oQ$0|;O zlhIK*`%%jykwevVYv>e;YLK;fU$N3KV#FpkgDiy%D*YT2CMJwlwx>}Ol7I~LC&NrD z_^55BM4gr(ALfl;(`kHO%32B=LCLCm(PO}_JifsTPfcfc z<8uIPz!J+>uXX{l!nJSZBVG!KaEc&R4>=j_lx~ww z*fs?O*u{d8!e^AK+cY@KpQ&HrBK!@fIr6vKR=V^Aeaz?I*AW^pRZ9LPdH}T_4I!1?Eai*y;%vv!KgY>s^i1-aZB|k}qrcMl zcba-7YBfQWB(BuNz?df6Jv;F>szjG;`d=>;Woz{!`6%)#qT)KY{PXBZpC@{AUv|>x z+|gm4-FqA9E1pF?HRdu|hHIFG_2)kM@)C}poWT1+DN4Xq%)%1zC(}~}{#AMs06#8R zKr0h7^yIb2h+FDDl7WQAA4Q0h8JiuE@a5Z~*#T4iIy5l%xA?!P9cqJr?WNjUicwuls^#MI8dk6Y`eGvE_KpCWSA?UVTlPRW-nK6W6#UmA&Ni^psTQmw?mfu~K2Sw`C zmVnBk+1Bco1We}gA!+5MBbmd%H<^>tPs&ewlQhw($_u0%w9_&Xb^&3S6@b+uZG1Zb z$g-Lm%`+XE&@Uqd8~Jv75FeSGwda!6IG-yeJ`gHJ_Lt%X7iX{i3XL#@KeR0yTa#iD zs_v3f+T~I)?=y`bE%}+!o9`RW)dIg?P1k6j0|{3%E*0gVxL!Hm9%%4x{$>9x=d(w1@D9ZE}$V<7fekOa(ip`9H+fcH_o_xjhEi}|e zs5U__vJdIdnCfbuGJHZR(ABW&D64U`kGW^OfZcVlEu|_51xUNl2L+d`xsW5hGbhm@ zvb$t>i7WJ*q-<{UkvahM6Xc6dII^^XnmjboMBUqbjA}{B0!dUYt+2n%$4lvIYOPHc zG6R6=7D)$Vl0~x>){AV97*IFwu@cGDAvAccB-o%C@`*bpcXSKSi^ME}a?OJdglybT zx0l%BEejg+9np0Zw$Du@7s*?g*8#Rt$WCxwNKq_kEPx zqm8g-xx(g0IGg>+FU|*3xoI~W1=Fk|s(i&lMrJSzQ{?+f!S**k_oerKhyfHBZ>T*^ zb^lqj7!8KDp=MfvI*fSGYbB{hT@o_5Wbye@W`>u2CD7k}ZPbYKOewEIT6{V~E1}TL zPMCgj6l51M7bN4nj%v;Iv=~2hIj1>ot%g%RpiEZhyqO3t;*c4mDL~@ZGfGtv#FvJIT zhhVsTin5o#07<9HtW9`EP=>)L>M#8KaLJg7bh*_y z^-zclVN9<-KkxsLExS+6U1Oe=WQie37n5Cz;F#z(-r*&*Mwy2-!Sz^as`=XSqc#3> z<5x9NLUw*TEo1volqY#-Ipg6XK+7$wuq>9HB6Ogtg6v}vF6y92W*s_1$d05G(S>nl zI3>{Lyb5c5P*2IXKH%7fgh6N*VyqL^uR|BWCo>lChKtN@Ncn1Fu?c6JAkYGksR<%j zZ7Gkn};T68sl=$1{_ z3v$)fHcuu}P`RqD`s>*v?2qd>(@#ZauSDb2b!Z$YIAawq`>qRk)cND9y#|6kKZK22 z;IN07KEYFns_fg@@S@{n0bCG;CKl^y5f-e)v5+ro+*>5=EPFpj)`Ox@5fP&~PJRiT zTffO(2msX^-W*JYL;MIH=FrD2|Jl0bakRpVUbu_8-E@JYE{p_KCMzjE8)kBDq*=2#etm__{_)VbyD^( zLKHjD$)!QqMBN!O1!O<{1$qu#+VgRq5!LMZ1kY$K?D<(EIsg0$I!2XJ%}e1-y`J#P z6K21mddg--qr*jC=)Qu#?Dx8_KyKmzu`d>}t&&s?4b8G<;PEqa^T4l0i@0m5g#Ga# zLvd>E)WYnSlr^^MASsoIw>aeoXg(;N9W`VR-ON~No1V~!+c722stajGm-}zh&%cIxY(Pw-0`9;?{jDeG&cqvSrr{OZ(UJVZ#`maF3J*%oSRv1 z_U6W-%%?A8GaKAJ#dB*YZ%DOXq%D#cLT{(`BBI5ihGe6m&#Y#_Pr=6FYMSp&>Hd|_ zD_xAC%LxS|l4mEwg@6h>3rkrl_-~gK-#V+x?zf5JTW3kx{dRfrt-GA;e!RZ;*j-9? zKi*V)>@Fj_A8#!_c9)R)C@9dCc__MzM}2BMBtZ*cLi!uBvL$4;9Q*c?A0Qw{r(z?9 zg=8wypy@b(+>n?7i5VUg%+9>%xbfZP3$QzPCj6PE_T0Q%n21zTWyn)8^7z@4*N2}>#rH;7H2elEa zJe6Mnrb!$CBs(;IAZ#AaUisa5k$}Vp@0hQ`+=;Nmr~m;3IQy}I;yFtbwYu>ER-On& zlCizd!#B8g8c5%`;94%f3|y`8D?{Nq;!J)~;ODDcTSjwilF`nnx`P?X(IeWEOqUR_ zMY@zWsT|uIW$Q2@nR*Q!=&bMtxY{CJX8V%u8f~_V7ui{*v)U2$N|=Tv(n}BlqlRu7 zPT5hBti+XvYQQ-PxXD+6!=ygA5`>RLm!#m#KTdGUD}TH^Z55B#r;Ccmo6^O_qlJzjx9|lpf|Bst%AGMxe>u$OF?G zu>~Oeuw*>|<_T_vNUFuO!bWJtHbNVgk%6KlcRDf5%{_Vd`Mft<-h8I*A+#@J8kdBx|1S%)>2RiJ(m2S${e*6+P9W19$9QHA4@6g zvq)mdWLrv?`z#}QmP?8(=lEJ&kwqd38JNodv8r%+`n5&+6+S&%`o0RuFr?>FW=roI z&AOpTzuc#Xzxec$Zb*;wNK5YtR3`;;b3*hOhAsZgCeK*s>gID^Yg&aW8iLo%3wvSW z%|h+G;7U#k4o(YdBx^|^VVVIdEeJu4iBy*zM;&{DVToH<0Lnoysl{?^9J35U*jnnA z(8mQ=z$bC+jOSoU>8%MQgix+IVIW)%3-#6nhz5SLRvZ%=c3U`y4W!G|5JA^0CrW?-9P8tJMWp~<~^?@`<_fl0(neclLxOkkyqqt ziIifLOfnOanUKe1!lNc(kcU`lL8Tfc)!0%&4HcDIYEgrtQbom2tZ1pGEp5@-!e?oV zHIVQ3U;CUpcP5zttzT;cch1@S?C08Rt-bbIYwsNwtb^i`c1sORMsJNQ8N{Y|y*$SL z?O(5p$7iqHh%q61=gNqQ**kYCOv>K5bb#Bu#K0(qWBI38V2FdU?<0cj#KCOWG!s?_ zzSFkJZM)`Aef7iKlu;9hxzlBlSgd12Til}8M$ zBIT0>JW)i;LzBfABqGCZm@D|M$)Z-11!E?Q29w1@GGEwa(O_GARhBrhpDc7vp`R?s zuE~OjO%^O5A-oH04O-=ph48LV_ln`3teJqKMsXXAOMAtr z&pXvs^g4`s+ACH|@m}}Gc_7qC8%NtErc+h{ZSHutb4$!&Qqpm;+3nn43!`vvg=T)W zJ@&^ws!yzrHEC8b`zPR0Yy(K@ z@!WnSM5_TF(n0Ub2W$bOeEHBZQ&n1KkQ{v1AxbYvwvlI6KMSMWu-==QKnrWBgbH6W z9|$^tw3!`nj@fco5*D=&N>w3!n0i@T5h_;6@2PsXJqlMC7NF(hfO=OU!Q227B@22B zZvYSO`d-n>hv?~KnLoS$-(RKOmkTD||GqUtZx={e+3EAuh zB8a`qmx7miZ$wDP5x3F@ZqjfSbBrat4KNm|MJp_6NWJn^T~6I(WHUD8H>W+l`KI`> zV*#dt6j5RS{88F5^s~~~yyh)kkKcRDL;2Gt*9TKwsrb=J1=wBUU?-)WbM*TrI)7tJ2P) zs(Wc+WVo2l5H{-thHf@P7^??vFp&}bzQ{ai&MZ}ah6rtj@T|>Hvv|w`smjj~D27Ti z1Rezdjd{XjW2IO?mF9=4o2X#4`2pLukueRm`GLL(9}Q%6pBGXJvj21!NX@FtTLupWtC7vLe;Q1r zhMe%yJYRAG4*`tW30R^7Z`cOS=H1qG9f0`5Cv$!g@lm2EQiWt}!rOY#A*H^^GTEm5 zR)|LNWzH`-&n~_Z2EIF#6Pd4)g3M8(b8Dc@uQpp+lamldIJ-!OX4NEQI!#qqjD7-K z3V&kuHFeR_Gii-TUni@AII9{B{KPl?d}NerMq+*OGnHoG(iElCeDWgXP&P%?{e>j! z5?l8@)6zy@$c9Ol+9CUPX_#^v7=c)Gaa0;66J~%+I!ug-@p**fr{m^D5|n84 z-w%^9enO>T@-y%WhDkHe@L`JlFfm>I=lkWAWx3>CzkN?`HD2w8e#i97RD~!%bk)~? zU&sDS1IF1h8nBOl_ha83qN`&%RvNJS|HgiO_rEe=W|lETtbP@ESoPnChd-(=-(Dmu z8vY4UCs@NSuF1Wc946QjAjR#FK*F1&s@_ISHpiw zjE5U>qb=0pH&Gk+F}h|QqDv!Z^FUwHW=zAJL`97VW2qbn2ccG4r8TP5dAS@NuxS|% zBM%R26ZrTv7J$M@O0>U%WeCrG71S$BD69*31h73*=SP@^3u~1EHI#|&Z5%g(w*pr{ z;(u73Jm4?eBf(r)meSdxfov?9HY;MTK@05)71KYopuT8kYE@+CQ(0-HvPh`*&b48X zku>r`tM4bGs*2UQ;WR^KEg=D{nIjWX-};u7%947sE9KrS=4=L2?^wCDrOUJ@st^NU z-Z+I;*!&|#o+?K{nl;jm7W|1KLZo?tv`2WeL}4JOybNCQ@6==<#Io$kp_>5nnZ@5cSPITv8OV=|5;R7_M;EQCUdB`#u{zaoCWr7fW>U8QIFX5lXq8Iy zt`#s4c=biEtW8-UkBMlVM(Lp{Fr;k2AFcxaBzvfebgYqbTGieLCUa=B4W%+YCAq=J zmjG#~N2Q>+LpvR2AABh)vNbkTYV-)ey06kB0EQ?E1tD3_8v-E90S5YMS7QG z0~HKf343W9(Om(d-`f!@!?vsV~UYs!EQZrtkghd{Q)=1^VrAkKo zopS#_J_8cN76TIE@duxYCr-eC?qos}HkLCWN+@GM+>KYpfcE9=OhaqLYhgfl<}^ha zCft?tyywnb8Sg=@4AS}$6doRsFwB$qp~29!M@vh*Cmrx|-eZU~#C!67+}X@-i~&~= z8~5X~9;zIw3gMf%XLQyhK9?#@{0y4|TM>o8Rw?_yR(}Z&81jnDse~7=mO0&-H|7LB zj9^X`o;lqdp<3{(3#{46Q>^Iik8vF9Sm3Ez3#lNv=bMLudGhtOH#uR#rHHdX;D-VXDkp~zrmi~h29}B!4Mo|g|C67_9YJ{n%76lnlfz=0+Cwu~q0YsZ2 z3M-5Y#r-hdpy8~~zEdO$(2?Tc9!?hU-`Bzt6mo68!y&Ux zwivF~g6O!5VeS3M>s}`IelVdPy8@=m;vlemEq_bvDl>y2O7iKKz5M+j?#orCM`Hs1 zWh~|YC^Q2afR!8``Ne#;kSA7P6y9ioBpHl4(Hv;xv|P6{?-&yKU6({=xEE`C9IQ1< z3o*6!9$Iosl+{Xo#2S8R%|4V`6`Cw(yT2LXpzin7UZ@F8CDcR%)ofk1LX)6%=6;C0 zFs=&JO+_%XT`~m`u8$+_6$|~IPg6874b$9q)udG+CNP*5k2s`%GPX#Z^p;WjO$(?@ z?wjo6yz6$Ta#7*1^o%M*dPbTjQ;iX{$rSlQ(HjjyGe}Fa#G`5mSZF=~mh{~mLNya7 z-)V7WVLEJUm?ljV|Mwipm|!%kRi`YBZ)k(sO8=e6Z`oU3Pe;+9`dY4DUj;@ z?4apYED3y(EXKv`kGUownjb>l17R-Q%^qZFXj3IL+H#s#sEI&AUL@ggK3wV( z85E|P$a7X;{|E0jfX}BOZbCc5B z8(Q!LQUaxwN?_7*i-(bk`iRiJ*OMys?$Sw^xIRh(hPq342$+Clbr}?MpbkCFsWG*=d(8pbDf%K3Ia|h%MU62G!TVa+sVLv5lZDRJztq_@~ ztz6Wp{}f;o6{M29iiuZbOnE;hshaqT)99vvX$qnehTn!LjJz%cFHM_)5Ri>&$wPOl zC-uC6fU|wsb9n^mw5T^fRm$X=945KpAkjunSC%k8T^8D6&{3x7vNfBfRh^cFx8Gub z9Ug7E2n!HSWg?w6TDp{JZkkyCXI0uG~TAz9KYu;&>+eThzA5qM&ZgaJh zkp|LU3GsS^j(GSEN3Yad(Ih3F>LC2Z1eXRLW}ICmW^&6}C_PLgccUM(R8*SV7RU{9}nPW{nFB@=yE~`Qp{TB48>zfZ(%->I;O%Wxm`;hO1n+CPjT1z$0i;)&csw{noSPAoYNg=9+!jnw??noyftUYy~LGu`-Z|j#MbARY-c55wt*+B71k1 zb?qzUT<1ZwHqF0#j`OWJ?A9E}8}&`(`(By$O_or0kmCj{QX3c+6M3qIP*37J?b(f{p= z=&F*0J&OWn3HpnGK4Mk_;RYsgnAp{heK3v1*%9ZIG6ltsC7$FW0YNw#!zkv#bB$O*9+HykKQDIv9CWCh96W=uSVnRyE3*Fb@ zg*@2qM3ayOa(*Md^ip68XP$5pDowTPlh_SqZL6Uixdo>)ek9C@uxaQP1`Yrfk8W^H zV)YF=EqWq=rHVNK`Y^86Uf2O2QM$@1C?`%qKAz5an%rr!5PwW|Ra2!(jo303IMT?% zqbGi}n&dLwnT9BHHD!BCDIS+oGYnM#^a{&YI=i-J)s5&g3izzjGc5tV_{$9kq~*$r z-Xel@u|@b;t1h?FWk0T*;ZmHcZ~UqlIZk)c>bcTE>vMSkgV{V<9e3tno&jo0yo{}F zKH{x47>ac_)ihV*=lHl*^@VbPt|m{B4U}|Ij9iTZL(AR3b@scD9DTO+1%#F5!r(7u@5a{lAQQMPZXgN{geW zfIW1@RAYQqa#MlZ^*il44xr8qZ=xKvkoqLUQ5_RHxU3SWu2sA4foGPOyVrc;fw)nN z^Sbo2nwm?FcpujB%DG!NpEWvm(&@YciV!w4nHF%LW1MP>oUBo7q%hLDc>LLFfwK)_ za>t)!tC>c}1|1b_8&lbcCLy1espv`CqUVcd(rZ++C@Dxw3PzMfGpr=QrDS;>3QION z6xSBV^PA+e&yB}fL+08JHZ^2|HDr=w*NYlryIf=T!TUEgWP%&##*`W|DQ(E|w4~)D zN}|!eB-^}dCE44tC5>0x#_^lr+jdqw#@cq4?Wj}RCR*DjxG}y&zonJUdr`W(Rb@_O zBg@!Q>n5bFTbq`(c0^h9#Fyo_saje7_1Ln;seNPkP4w;C6pyv`ZL*zxYTsmQ-$ciz z9>I<+tQw#xw9mh)%*pJEolt3;5A&2N;34u0 z>G$!R%=1Ok3(211i6=|)5YMUl&U2c+ldnzRdCt^#o+r6l6T&HPPBdsYhfu|w=rC$* z2#xtLUP{v25YjquYxa@&Su7*+P9m3=BGG}bAQJm=ypoP<1hpil{KqIiNh_V8maHQ32_j!tililH5y_T;`0TVLjKZAgfR!{( zC7r`}oDJf0(@f)3(s@KaK;-IDBqhC`$cKnLztpF>9np(wE83!cIX4O6A)Y~^eI&Xd zO*BcxT}Y&sbQh(?O;W`d6L}kvmt>JPY}T;xD(MY;XM05aYiUX2RnnzI!g%5}X{PZi z>5W9Poj$%Si&RPLG`^9W*AYDgM{x52qn-aj3>T4t)NjAAfsz5X?#Um zR--C-6Orr{jn`(8s-V+Xz?IAU@~%z=zL{jpd*ipH<<+UYD~W6Gjn}0)@eu2cyNH|J z8?VpeRGRapEu^`5cmbttAQg}9w6tcG)#I{N=)-f?5(?@#R>L=h7>Gbeh6Yj^MDCKbNiiJRl; z?j*Wv+pJagN%T{-V(L>s>h9#ld~X&(0lDWXz|0T6GLGibH7qAl=job)=(#d7o#N_j%^XKEvjY=`#bPKF_4PdY%K5gYaX&c#-wqZSKQ}%SgY&&!nMC1o-UrzGruhf7| zD<80F<=vb%vYX6PqYc=!vH?5GBPj>z`c6OetJmqN<(-~d-s!0$JIy3LTBoO$b=r31 zSBcZ6r1`7Y>DKa2x0ZLB8)t{JBP5j3I^9~<>9u~OQFi)Hzxb=y=_%!%o>JcFDI+_L zcs5$6r<8SilkYV1b4t@?6VI;*6P{e&>B;4to;Mw87v5B=(O zdTe>8$Ch_mSHujPZ4t~z>-1RbwCiw7C3G-VFL%q*x0P;1D!SNlDb;Z%(K0a?;!NBn z(5Mr9OctJKSqCLj>iTf9$C)@><<%!~CN5Wb{YIRM(|DuHNBA^%YFhgl?)3Dn)18^N zBXMyW_d2&KeLLHoRchrJi#yB`&rPt`L%d3CD8_oe7!~Kb^WE#y^sC)@X&L9bbJDj9 z+>G?=Mef2h?haR8W3D*g{hE72TGkqOX`bK+WI>o?~FSfh4xHqTi*SRaxRO?+= zDSe&2IcrzGxX^XG4Qcv~t|v{k$z4@S-<-asI-(`gP%hD8)(k^sCMZT*HdIDZ2Zn+O zTsNm>4~jIcdIBEcn-*}goU;B|?qjr$I}IH~o3N8roMa89mdVssaHWVPieUAYwl|kB zxe~+Dt&{{s3o)$QN->-#NDPa%ESF<>BeNE(8=0ygX1=qO%DyL@BS;J@u2LE3S%_g_ zmc^(iTDGmFfV;3<*$S#u!0i^pLMuy-Em3J$k7Y3`K&!RgG=#OxJ}EjLv_!13N(CLX z7?xOBw&Wg*VSSaw7)&WhmNcz~@YBg9Pg*KgS*4O5w-}aKS-#{^i-CVu#U=NR8Z%#=xG(iGU`PYbQh)=t)fZ|y4@n$ zOPP|JEn;>lLZ!H6(Giux@@b!RpATA^k}f-!9JGi+DN}NfMO2p}R0`;{KRuI%HNO?a z)0)N8`pNSlHB;Zyr*MNHn4-sW|7i3NnOcbi!S#R^P@Tx2SL-b}Y_#&*h7R3&C`i5% z&~uhT$!%{Z^elgLACvS$jcAE^O!O)z7Dg3pi&4B3#XRMWCL60Met5I33}}T+Til2S zyyf>cY|)++71yg$od(jy|cUZXFm--?cx^yt`fo#eK)1g(}gm>RC~in6Le;T4ow z=UVt$qfhdv;7SmVs5U$RA&X5d${hIhQS@i$=*{So9sPj?!age6bn?8b1a`r?qp`}xoupptw}W> zhRG9S(vX>Z_UZO44U3t34%eh1Gxyx*%|u#!laJ-DPif{J)KLnB$)O1zQrKcDTnjC7 zwA7n>Y+H;jGi9zb;{#qIQulj9a%Pc2AI4bFNtGkLdt3nGHty2;$^K!^Gv-o{{X-@! zX(bB_TqQPT09(ShbZqRPR&O@7(P`DRjY;ZU7Zz*8ujiyr^nsh>N7G!Y)t^d?Nh!wW zG1>`-Fe8E4n48>mH>Yrg40d_!R6NYWDJvAsASf>p9%k@v;@utNXCVV#+$4NrutI0M z1sw(_44nVTVnSa`B>;j7MtUYUgyTxTIHR= zZiH-Vj5^U_=;jEhqN?2J#wZL?14yJJ0yAn58!&397B%FZJR~YoYLJO5r3QLnN1$?{ z$VlU7N)4&;Go^+Kgf9S)QiD8238mDK8b4ENFh|r9HKfMR5!4`x!7!`4<)MaZPYo!a zpfe}UjHp3(B;wi$HAGNtiD01y-cxGO#f!1_a2DmpBfY#lsDPy0B#{f-fP7%uRHG^fcY#d==PY9W-u+~~RlbHBMj zAS&lTDa^;2_AjpTFvm_Lm}C7IBbd{&SA;o=C4XhHV9wG;Fvm$iFvp-PnEUew5z+)< zPyN7FsBWa6Zi;o9;5`$P#xZJ?$2zzwCZs6^eqt&qNKdp+Np@&}x}@U<{j6EyK{@dt zhMOaB8{k1uRC;`i_niZ-@E~GaX$6l)%~Uel601{i>j~pXA-}Z~Ce^r;ww#kVTqVq5 zBEkm7nC5u^6cN2Sebr{HgqIWgOVoN+auyzrnrGQt!~h%Py*STFFPe`do6hMppyPjh z4#&uMMu*D4kW@Eu)LnP33L#P;<`40-BF?3Ewm>P_oh@)yD=7yy5&L6q#S=ovj{&RE zt0-r?6|IetCo1P+++BwzbM;PCOzVpHK>AtTTwg&KKc~J_r;FM zzM1&&)>SY2og!mzBDmx>E^fs^Cg7r? zRUCy@k>s>XP5&i$J0&c^vg|J&4Q`67E{U64I2cFJ;U95tXi4xzcf?j+(vq-+Jr}UE zgsGL5z!HMw)75=g04pwGg9~n5v@Xl+997=RA79pB^&8@_r5LRumgy8z<=3xG9>11X zht|ZGQ0JU$JT-i_nkUNs!#w40|CGX9ZT^IwZ07h$H62K|G0_o5ordXP_E^Z1ySOFR zaK7i@A&xZS4}AEyX!WSOn)*oq5~6uBo4;c%Tk)svjVB3AnhA3X|WZ zh>qwky>j8;ow#H`g({^uhp0QNd&NkGlJ6UlJWT`07`&_uH%s%lOAf&5W(h-`F8JGT zb)?n$>jSM?)qylKkW{$FN8*4jTEJ`zFNaU93D3OkR_MfW zuk&8$%H4)DQ%=F$UMwv!QRxYnrjqX2sx;LzELW?1lB70)oRgaKVI24-B>(Wf zLqXD-?4z0K?UB4CZOP-Mi1dERr?Uw9|80&^`3M=fI)^o?`f%X4E7Q8@pF-4DS8R$p z{eO;$tB>jNk$Admg(P(GXKa^s;VnQ^-y?1&&!ErEI|hjvupQ5RhGOGuq>J09b+D z`r>99!m3Hps@lB>2cSyYHcH-G1RGuDO-!q?wJyfJ3L(lGK$IGQ$ciJ(Ibu#TY1KVy zCGZ`VCbagUYZ_{(csj`+EG17B8Lf{L=SQ8+;X`fy*Dg5(&pFxioR|sg5SN)wZ40sy zI??l3wxhjPaZVQj@P=RhB|x1%?{?7|2p0)ujYb0|#4uoSIs;82u7QcjR{RE5p#|E( zkXSJ&?jyDpTY)h5xI%fMT>(5*sx*T8vmoLEo9ig5BYJ{yzW+;P4)?S^gY-Y`(FSADg3*BoDkGkop6Jjb>Q=DwaKIRY9*B)tX3h zU`f;B;4aK3N|B>L^g%Hsu@t5QXm7na2I%4;gK_Q*;u>9}eFEhzdhed&Bw`4&uT+bZ zg@gvl6LE_nE~0Op-8Tn1v*IYPF0G8J>fH2%GjRB$+i?Ne!D&{TqCCkoCq>5ydPof)qrPeuR;9;AaZ~wKO8*F5h-X&9|4PEPXH1I z`WT3i-JoF*s6grjUc4U+W9Wy80r>|MY2e;BsS|=?pzGFQVmpdOJzqPaWLcD*;75Hq>;Io54k+@eHvpxL!7OJpX}|pC)(hI}{{Slfk>Q zh({ICn%r56xR10+M>5F#>1Uh6?W4eeD6ePYBl^) zJ!!ShyJpR=G`}})w7$A#b*XiAKd#NJ{ru%V$t>=g@+G){;(EnHKwFzCMA7haXc>l} zA43A7Ud&BoMuUx}g1~o|E5HF|Uo5c0KU8rnit;T}sQFy-H`$eqUkRQPnbT!f!Ho%TRVLxh`w9q$u zjLfPnYYiFGVt|L|CwL~_8=GTHsBsdXGX)C6q;Y{p1Tt}LEf^1)TXAy)%SM!N^B;*@ z&x;pJ8lL9nn{WB=uerY4wsiXG&B0*!4b zBx)-$fTH+=Bq0~N+4>pd0m~=TK?)d#Xw*L!qtITzw;IWB_JfRi*ysAXEw zg~b^}g_LfWT6yMWO)|a(F_$y0Q;czOG>dR=hVd>8d?^OcFvD%UFymd8Yz8ekMYKM* z#J*;@g^HK~`^-TL>ENg>8ya;t{)I;77M9>SOr|sgH~s75NGByP`AWOhG2_W>tSmbW5VfX zo{vN|-4)N_>cpapxeQjJKFLR1SUAL8AP4A4f<{<038%Si1du7vg3uDCk5h(50PHRw zfw@B?5Tql3!EX2nEE+Kaft$M;WLu~aFjAf27AfL*BXEkqT^a$}R2l)##zbl;SOO7~ zTUr_c3QI=-Mxe6GM*s!RRL9JPEP0YH5IYIx=oaXgVfTdNVfQk_ZU!^s=0hV8W+O0y zeMcn#H#0+v zku?C*9RNHuNy3IMZs4BXW7$W?YiA!r0EUhP;IIT>n*oHu;Rpg7)}YIdmh4+ zAq*DtgqX!@%Xo-QFV5Ef2IO)qhL0Qvi*0HHi|GB+^#7BA|%>5`swBN4G)PIc2EeC1w&--Vc<1$6thG)Rq7Z@KBZ z6kCJOEUlHR&C+>H%E>}EomMuxI9W&rP2##s*CH&nnyJ)DJL_t65mY?QE!G+W)RKnh zKuRQ{5cP%LSj|c~UEETX^FT&9)-@tecGFG`t9h^t%=3sfpHD^kBNH7QL75I^nHn>c z7rB*Co%dw=nY*prx$54g4WM9emz&SSuUDLAMAr`Omotqy%Rvnv0#j$*pBI*$8 za<(vY`iGlER&?N8Tu+RQ;5@47X%gw(>+R9G8~;}XtkHD)cONY2_N8P8H14(O*GRbJaazxJUbPl^j84eWi*C^24t1)HL@3t^r}BKh+S@)sf^<0q z_@Jv0joToI7<&^@6m`0iiOBDf7{x>s4L1=*B@OxUkLFbGS+Yra_>nJ84x>saGq9MZ6a6L~l%^A%r!<{8j0Bmk zGcR3d2_&+^Ao8ac7||Zv?_7RQtj#cv{}R{7!>2brDC$X!GEGEbltFE;arNMp!GvHF z+Bf@-QD)fpK^bK%0Y(`WfKg^df~z0wC9A6=%)Vh>c4XNdb=4BN}z5<$y!at2HuZ62<`BW4^n$|?U z!EvU{e1szkTK}f|Wj~^86ZXb(GU8FIV1v3@k=2HYYm8zGyIt*2V=8>)g3;3Ulx(-4iA7+vHI6C ztkqaLcDu2=u*Vhl zxG{TZe1ij#$Lw|!cXKRe0I+iab@!fP-70zNu>DqndVr_bm=iQOqu!c<%Seug?r!P@uH;gq_duB(?!ZmhEIW9)jDGnt zB^ag98^wlrI72amJ{6;=6@)3EigwpJ?!Q!UsF#HHxQe~Tqkwd=eigUF(LH4VR&=kD z<`S&)-J@S7pfSOzUpAtZu2!I^T2o}Ub2XZ1IAlZ6)bTe}u0i99UO5@Zf47S){Muz) zvOf((f@jqgcu#1fsR09Q(AyrhWY3x%#J768CX2JkO<9%Ob2$twx?+c5KJ=;8wTboH z@gKM&*{S5YVkAQvBX)%gR0F5Vse9DGn`)>YRs)kW!?Eh}y;u&Zgx86Cht)%Zp?au9 zLD@63GEAM!cta{{WM1cp$PnoYEuA(l@W8tQKPkREA3$1s3X&J^m;6}oL>)T7PTbhX zO|&?<6YEU6+x|%Dq~XTV3GFL|vDH_)DM2C7*$@6i(Lh@lvR8H&tjfvJ37vgMw3f%C zR?g+Tan9&zR1x4h-w~~|H#P4(ds9<7O{GM)Xc~U-ez#7L%vKmT_%y5|1lY&pC`h$& znt;k=Yed$D5iL7if-7^aZ_bOa)SOF7&G8M>@s^$NcZz7_bvaM=5G41Bp~^ukLSoXk zWq=afX2JP9k+U37KTvA}lJPsF7L_bwFp0`(+m0Rv5$G37f zJyM(l0I_mI2p2I9p_7T5-1o2^O6qQL02>%#(0*S1{wCoExp>KCd|a#J>4H-#A-J) zZDPE1vsUw`D9tp(h+^GMU(JH|WNZUP5>ml5a$7x9S*@ejYc$j5kXOvj$RK{1n2IM4 zmLgK|6;BRh;T&e#+?PeTHZy0NuF(2NecoiN9Uul_=}cLDxMJF3l!UA4d5bI# zMUD*;Z#Fxo2Xm{`EZ&X@_*mpHZMjxI4zocW%5O!V)S79+Yv`^FMW*5i7=jxFJ!waL zd#D|qkwOfy>2ERia059mIn&CmnJo3D)nRNqN%&S$fx(@RuL2X4&4wAWpbY%IjwSUM za+Qy@F%Cx93vF;yHI|H;P*G}0)WBs5u907cRA0ltD0>mN5xLy~Rdrq74AS<^5&Y)J zCJTxV*)gY?9TOxwPP-@~El@5(@ia;rvSXS$jLkZLLk)9*zJU3Q%sL;oV8WO}n z(-9p5MtnMVcxRRrkRr_#m?28LOqU2ShrWysP^cyA&j^5y@&$k%_sb{%1vg$R+?p~A zFr30`5cwOF(Hr8dp8{eBe4#TaKNak97d%tqr<4lHH`wJQN949<9_+& z!N_dn#^I50p0yLon!UN)vkyC0%^|nI+{@X)v#80?W#T%eH3J*iXsD4m%fi(74aQ-T zUQ9Ch_3dmIcv60b4^}E^St1#~nGUiaIIl5u-!#6)D%0=$i#xz+K>Frt%T zM3C2o>O*on*53}E4{$m4GM-Oz`_*z^a&eZP4^(0c=lNun9eLEuST!SNi|Gw#VW~M) zE%nUIo1V^1=bU3%7sS>Ubq@U}p@a#+j<{nBLJ}5>B!O{ytEtUN(_IL-=sLf_0 zGw?K(Pe`dLd1^KxSqja9ZMY=*ISD49b)Pw_Og+w=gig6MC;4eo_G(2A#LN;PoA@=o z9%d?K>M$!IMQiG4&ZZ9Bt!!>MAWJpVt)1qUfq=0=Uu`z)%&>7Rl)cFml}|a8TjdR) z3FcTRg95-*2I)qYXd=Nf(1LKXZZ&DT_n-yYhJzN^(LoQma?mmzsN=JTfmWVOQ)MT$ z>E0mF>SikfKcM2s>3%q9X^R=6OQ0?J0R(QyNNTe(lPi;f#*C>r1ML)n*0c0BnV{R~ zDkf-tz{Pw3v=})CYrTb(`L-OMjps5B$DeSA;Mr7e;P!^&PRpkFjO4{ zp7^5-M^%Go)2o0dZ5a;FGE`kG+Dz@CplS+FL)GE%WC#z0t_=zhJe%Dt{fvJwT~0U- z7f7L45?w?XwgVff4wyC_SBM#cX*1F&IC^68M=W}EFikONIF5?^N5C{C|JkpIqmq)3 zPySvWFSj#~#sUmafw;jH`2o1LNF^oZmg@!9-pI_7-UJglB~J(9fdrI^BqfWee$aoAD8NjGOINuIA4vS~JX6%A&k4h(G^WCbD7} zf2J)OAkUqBTTUq7`?ZUg@8MaQeBY)CU28urqrm=5zNdH_Fi67W`&n3>+F0O}hG+C~ zp(Gm@v>B9}N%ln%MG*)emvJ|_lg`5-&t!a4{7Bdb3D`PSKS2Y4OEs&whAQ~$NI|U8 z1The0n9R>gudz%7dnK7awSo_q-%aKp!{3Fhbg&bxl3e$M@f5${;YBFg7ET$uNcMgz91@JBt#zJYAn6=Y#x3OWgBm7 zp`_cu*mh9PBgScSBhNIc-#?ip_1^)T&&dNNrb_gl8%pNbITG^Zm^IIJV!2mbPAg}0 zsDbjXps`XX<5CghHUVgGpTYzA2u@ z)@6MTblSPLYV!!{umGWu5>lb776M?UU|Y7PwY*x!T3vr21-d^k7+2V8I7PdZgN({? z_?2>48)z~wKgM~rF*t>eR%Df#g4{c1JX^8SQ$gMX*+II zn-ERBA)nsUHx`)KHvM`Yf|v~phMfueAdMd#$#ZZqkDwSvoe75R+Yc!;4shstlxp4q zPjzyGC#xP?(lXIPPcCz+-PQg?b-a70vXDBl6oajKi(Hj_rP5w>9h{!F|&S6xFs+M3qhnB0gr%XQ~ssirNh z@D6Y}P$M}0n%3xQ%Bme4-om**(r`n4TFFMXyA8ExF4svD=p9${Y2UMkWL4E|Lt}Ci z@I3nROTYN{=YI5sqruH~EUu0@c}*Eoop27fq3l8r1bVf{>gMrk>o!Q!r)ur;#Q~(3 zgEE3(SzumXI&edgg=ca706layUwvP3l0ag(1TDrnjv$&B0BLPi;0*p8hyhY^KDXMU z^pVYW;{YKe&4XMmF;}(hh%4nAK&4b!j;XP56vYpfPzag<%t|zcagYt1d=VabXjYFF8(VeQ*V4zS9ofB~$eQy8r45@@ng6DCdQ zBZ)c%SkkD0Eomp^&uN%2F9^+W57!D;2C%+)K|}|jR$f*HnEK`gxuR^zMC4Wmuo!A8 za<;f4a4^##QaT8$TaHELbxOsd;rd46imZG-Q}Db%V6@z1!@52%sLIN(S{Yz1pBLn_ z^0_cs43vbxROM?E8Rg?Kqw?|onHSV#<=3nXaFUo8)Mn+^t_*4wQJ0lZPI@vgsLsl- zUKv#T@-g42{90eW;7s||&~_aMPaOp`P-;0u(>M(@7o-&f0|jja6}hp zFgHLbx_YLB?OfMJKg6Lm+rV2i6S;~OF3iXupL|9kIP*O@eh!0hR7P-=Tt;v@0dEw7 zLwFr0vI0E>SjZ~B!y(5q@@W)gMVPt8&_O++cM5A%N|;gMF@te;Rp3A*_!3>@qqD-klOmu6KH+_-`uoIK}KS4b(aL#=4mBg?y z&_XK=A}1yXmB13G2{crMt!f6%cVVty0nmep9)K^@reTs)UAhpNkoEV3iEn33;J7_G zOFRqc8L2b!F6>XDelIVZj3pM3go>$~sdR9WY98r;&;lZ90c9Nygd}xybnp`iL~?>h zDtim&!8!Vy2YNe{awTJu-1D_Vn!t*fLU|L|xi^zHQWrUd)Z#p9r6p0bNR5lHJFU^$ zQ?E8yb$ZoxdY};?0=jwhrfF|{FVr-gH&lrFBPGUNw^Omdl$@^&rjx)xOAF&_gSzQq zwAV{U^0ztj?Q!lFc@ajq5L4Afs%g|xtc;05>Q_iJ`BkK;eidn0Z@gk%jX~Ws+QSIt zMj7Z@pvfHccQ`*yC#5)qMz1i|2134Qk_HThaI8^!Z+*|(IRF}9%}8PL;wJ%hMPZS4 z3nVWokS{EzXy}^^0U5nGlr=$8pxt^^ zSJ$l0q$qnMN6dt}=sS?7RNZ(^P2ppBO<$r!)6Z?Go6HNXG~Cx)iZ!jgifWG>JjAkq z1ZC`_u8BN+6!lU{`Iju)N4`Whuxr@If>ni^i)s)1cGP{OGOWA-h7yU}`1T#E$GoEB3cc`NR z>zVYyV+oka3*TU5^oM3Adud7Tnrn?ur2wI4!ZOzO>b<>ufQBNLr4M``8*1zX3yv8i zE@-IM_#E*?s;{(;I}YiKc!V>lu7MXI{U~Y0NJc2aZ29-QE;iiwA|CEwV{G#Z8GQwENwF?Lk$Ku%FHz`|SG8DgzAPvC$QtXHhW0`tv7+TH^>t+jSEyj>2)Ip_e{#ERjj5l{_zf{mLjR z1|^J0DQ<-ornr=F0kn@(N|T|}vQz;$0vvegT*-0psJGYnTb<>HTfqd4hq%y-B^Kx< zBB81qBgmIIZxAA!8w^It7jAgHBnV`C!big_{IZ2#E`?tT>!1}cC4b?D3m^}>7;~ba zhG3Lb6swYlKYa*iYYh{FBxPRu%~YC|9-+W35GP;w0*syS2yd-CIIOhMQ?YL*I2z*_ z1L#em1-D`RX@7J!kzmMgMlL+5#tj&l-NtfvkJz!FBfl}PL*M~xJ~>31wxrE00d z@<&+`y$u&Rd00Ye%-K6yOyZwdGdBnX2#P>^(?_4Efijf7hKM*SPXNu9Pl5N-76jWj`*121MK8i6EO8$&o1{6U?Y`px?4? z7i?LsC-p?wLE%v{egKB|e1PzVZlILB9|F|Tkhq+tqeG!&91K~R;;W(8g1y4^6&Tbi zx0s^tYz9<)(BY~T$!Wc-D&&S;q4VbD=dD+qv$I$9+{qa}R({%N`d56cmXPkz2PL() z^M>;K0?Mt>MON~()~kH3H`$wf#n;)JZeYLM-Xz{%VsCQOK2N(Aq_qHln6_!7T4wI( z71Fh5%~2cDMnZ*Z!_9yEN^S72_aQgtSInfe{y)k|gI#Ga9QVk7&$_tr(&)3A3WHYUS!jwcu%teMyKUMTW*ilM2L? ze1VMxw3#I#vX^#3>y?c^^MWz91=My&J0^3_6m22Hu=;T_PNPja07486R?8-9>2@dw z?xbGv5I-Undt^%d2%N38Y{Z6r4mfLRiy&rqx%m|%Vq@4XRY>VMaW;S+EfiX*+Oy*nh{?OW6wZF z9FfbkY^~G4(~~+Rw8XT7&2b27)Lz(9^mRz`;XiniZIMDBCY=k@i>472k~lRuc)sQp z9ZSufy^ix=DO-AFS1P_r8`GIE=|sx*cpYMU8a}Z-aeL5*gY5g5XieN2o0=okzvQkj zLWeTNRsnQIEV=7bMA$@HI^aqM2)>n%A48FipJoapYUVVa=?LXY!-F{k;!wMboPraX zO35_{r+t;V^LJ7GVo*nP0-vw!)nKYivs55Dt!pWq$O-+R-OFTL|Kf2qrKd=Wpn z?+f4l#@oOCwV6J}yAFQugYWp#yS@zG1SU3(JRMnVVil+3sy_BY2X){qgu}7wJ6L0h zt%Ri>XazWi&n8mwr%-RHEr>kXFf7zuSMQS+*tdIb9V=CW4B3vly0nJej-nw_?k<+ZQVgQpuosw${AXA&=K@t&PPFPz{0YVgErEtW^O*1%&`d0>Hga=9e zHOXOxw3jwaDz7PhZb)*Tg%9NzJ2FkFh^)*8OEDg`?hbB+QL%~bInywsTUH04OwU^L z)@qoG$U#OWE!jzcwF@ysz038k(zVPji zEixwsl^t41eee*~M+LNv`6Z;TU)R&^kqIjFNGb6ih7{C2j{;J=7~fTcIK- zQ4DgOlq-V+;!S(^( z*^)|@CTSWuqPCKPV%8xdH7rV4c6Lw>qj3RnB&20)qb`=IP(sY$eNqzuOU0r(0XJ;i zkmDJ5T39n6aZ85Ns%y~k(Gkl7%H)^?Z8MOS9@5y#Ui(I4)9lK5oIEzWsp~Wi)vOJo zZv>sk+RBD#|HXyYm|?w^Tm>w^4&MUbbuM?#t4GYeVoS`@rOsEX^P0Ag?K~5;uXjY} z>37vNS-)!rvVN0XJ(HmhmQYjLNtpx<%xIA?7|BTjF4~9q30V3x>&l8})ssUgQdSP}^u-!mSNBk4NQvoT zG}t4wqHHL^zS5c{JG4lZ*+9}v+N=sSODiZg!gFnjV2_mTVb3Bw=MfLdU$7@MK&1xd zoDGu%T){qXhzIHl@l>DoXxF5$N5L=*_PT#X^HBzSD?M;I>pW}bA#4-;%2Ue^#9(i0 z0ftRlUITs3`d9|CGSC}_!(i$@5r#R|J$987ywBsUow)|n7x6GMzz$Ft>_W<d?$%hZ_v9 z#t$?NejV+N=poFMwuon_96c(S_QiEYMni~3n@lkWU>r&d3738ry5|nqZgpuEI;dby z!7BQVsGL6g?8zLTKKtr&0XnsxtgeKU4;~8Y{%z9c?yg+}o3{1$ZQk15bLBwSRonHa zTYm=hr(b_|_H^}c*mUWpZM(K~yRF*>Tz^m3hD~l$Pk&D_2!d0BLNJ-<&i)MxHg4WB z(9=J^e<$G!h;QI|APj;rJU4W0+0xVP)?K`PVDq-ED_8E?dToE#_StjRxoulrms@wy zwyizu+%;WWcJ-9<{waBgdTf9?E-Z`UZ#`YNlGrDK=@7%m~L(i_Q z1Dm&O*?jfp0rGs3`g1%VW_e_d{8&yHO^fIbK|Z)NN@cl!}s>E^ng>$dl7 z7+}c3g{TmWrT#bZtmE0eYx|bX8@dL1+{Vp4VAZ;HL2w=4SRDoL;FGKEab3@lw5k%L94Lv(| zx-Pe76SUFoF4zXLyGsYQ^>;{oEjclB@HdX?MO@47ZZBd)v0;|R161htf{f9kj3 zv!H+1&VdaJ+84L?Ea_gne9^{*-5VFTFIv*Rq<#6)CG8s*E#1()aKnZT%e&XF-?+4W z!IsVI`@8zDU$Aqadx7YX@ueLLwx}JV#(lX$a53fn8^30LuYnd9ym4nw|IP({n|u1Z zwl0{zp{xI@Z43H)uG&oVsgTOVJFc6*p`YR0Ie+uEc^w-UF6&;jX#M)Gg-hGp7j9gz znf?xJ+qPxry!QDE7tU|DTwUE=+X2wd1y}FdGO+o|?fu)jAtxF;BVP!1(8lfj+N`a= z92koS>EHh^7$2eCvzY89s+z0q3SY_Y9KjjP_CSJ6?{(9I+SAT!k^+E7BaiXbR zTQ?7+Q%Z0+jq~%5k9~o-deUv}xmLsEJV^#Yb(J5VjJr9))ug++YkSbnyLd{^)?HVh z#=H1(T2KGxuB`*-5m#R3HC+}RtR-IX9f0?VDfn2z#A}}Pbq{^Gop_B6Jl1-;dGVsx z@4QUYCp-n?nf%la{Z8UHi{EU1uYt}J<6&p__iyXJy65U`{ntC@YxsvI zYqxEqbAs>Abjp}qT?i&o{wX}w_L2O@vVv*n@x77n>uIELVr07QU0XMAU?#tcwA)GB zN}A0u=IK1Ma4%uW0CV^WuIl5-{M2W`K;ctHgy#}QunOk$6Fw=;0)FlM7V^_S!EF)0 z^SX9!asyrK8I%oO+q*Vw9stj;>FEbIug%x^HZAziu)R$byq0bW81Rv zYVqv$+H{<$%aN{YCv36wdo`CorA37Uy!Qjnc%DjbP@Wp?u3+`HaZ4f-N?Ps^n zAXO0D_}sx;-jrND@1OICzwbr-oe)m%{X+LYE#LZ2@4NR0FZ}$>ALlM^M7gR@CxvJH z?);kf|0ws;@=0SCJToxkr~mq`?^HjXfAj|reB zzBj%7JD>0W(D$Eu`+`a1zjDbB`?ha={kO(G^}FBQy5mzPJ+SdB_qTOSntH`|R-HCx z&Cv~qcE0iPDbM}9=V!AYe&fG?_36Q<|7q(B-+b=rEC2n{iV}>6foJ2EfkoXt8<^lV z&0cl=f^I~MZCe4>v7qjre>H5#o#EPphfu`|?|1Pt95`lNNW6LLuAP=TD5byV1nIYL z@yWBY0rDtiuiv$C{+6Dtv*&2oFHA1K^3v7kUU}B)b62mqlssAf-%Rso;YSE-%(L)+ z@Gc&cg+q{0bTL}T=Wp25vw?~0%ALE`&rZ8HXa44$SMJ<)HLSB#4%5Ua?e+jHmDAPT zO*!gzc`>DOu1m|w+E+{a1nVqZHzHg=BD{leTUq*R2>*In_$I>YZ&qFp;c|GKPdG07 zK8A34{S9gOM`t&mp8Hnw-#_w;$6qFS@U^de;Hy(!-v05YfAOS+FMj&r&mZ~ZwMYN$ z7f)Nb{xABH=iYVM=f@p+#=@r^x#7&Kt= zwoe|JXyIj-{o=xoy9!_Y`jJ)(U%c#V=}@+~i|vG9BUeCD5h^Fw{_Iq=e23*Y>Q>-V&6Irx{KeW}~R z|Mr6`8!q4Y@jv+POIs{_(*OO^58w0R-~7vSFAZ4up~0gcyYK!#{^Q!0cU$z`JpZW657QVFoktOSnKK$orzI?ld-+0nz-*x*f7rpn2m+!Lh=l0Io-gfQJe>Cv& zehc66(BD1uq0jy3BX_)fkA?5rGjQ9tuKehWAAR|tg}-(8eRsTP`&obb=*tgUxNp+f zFTD7C^>6*?<%cc&nS~2`-Z=AtZ~Xk_M=gBthPOWPmA^Uj{S%KqZsE#PPdWL~!rEu% zAAQoo-+A}W&F^n(``GHEPg{7**MggV_Q!93X~WTHEc}nnQ>sFk3<1~{2g5cAWs{Z_~-+bSpiLEjIz?73_UHqZjg468#tY19(EQ#J<&!3U=9SoQO%Z+`S=!CFgy`9HLLWbWn* z-`x;)Tlgoxy}h~npTi%_3b$DJ_18Z4f%pHx)xWzi(UcX+#nPk-}!AN%s9OCLKJ-euuWA9&w?tbOq0 z-~DR1-@<=;<$?Eq?nCGN@UO#rEIjk}6@R(pi+BIwk?^2}*M4Z6El|72nGu!a97iGMcbUyj^%LG-AF|M0rC-?{sn?(vP$;}-tWrNy`Y%N3LN z-55P-;g#*v-}m$%ANZTQqo*zW-cSGS+DpIv{rf%>J!9e1&bs%W@9)0*7f(b#wQ%9A zd+xp9f@}WlAEOs6+`PZ@Gtd3b$KP3*J7VFvH~;!a3eQb{0__|82kC9$yMFw4_Z03v z73;skzgNHi!@sz@@DFdyP4wSiICcH^-Ry(gbFCJ>%P!XIt<+XvtMmrWo1*W6ha z{{FQ;`s~&(y!Ri+<}a}DafOg$X4$LyH}BkK5{a8oFlllRZI|Smg+I!>xNR2x*og4Q zM}+?<4UaZ^xl^2w2!wm2XzV?ArvwVvY9|f~4 zj9PaXT(*n||1Dujo>}_m2*188{CFBZAx?RrKNy%)z=9V9qSE8{AJD$3{mlqu>(|a| zUrSd?c|JF4p6y-z13QOgttCTwKA+~9-#&ldDHnBJw0Y~s_G58xn51@f*L6s3W%b@b z|0Ho7(?5j&bTKo3KHs-Z_FA=7+gLnYd*QADTTOOtkuK_bx87oVx>vg2BHeh>ck4FJUyf$J6&nc9(lBdzn zu#C!)W+hFQXKk8yOPVLkOR>S_tZwvgAKw6Nu*dB=E@)X78SnW7=~_s)nV;IxeqB3y zwf04*2bZ)jZSQDb*1o)b#lrT53l}b0xOm}`g-aK9EL^s5`N9>8+7~Tcv}n=dMN1Yf zUDUB?*`no(RxEB`ym0ZN#fuj&S-f;{$Kqv+moHv{VsYV;MN1YhS+Zp5l8zhpykq&Y<;$0^SV0q4Q2h#uUO~1Miuy19 z3xYL_yI}Ja#5A4f#;z?pd(h1H@Sc5ZVbG-Y%)%21$AnR6qMqG30P&N$MnM|G! z@)VuDY5x5AZ(fgzb*nq=bR~1M^)km@y9q*2iBf#6TlWa*$B_P8JcaY$;iZAqON!xd7%5by2l4p)Oye`N$dyU&zp3*8UQM>9sMcpM<=;Yj^)GAJG04uUHsvG1e$r|@b97)X&tuY}YTK}_yJx|6w11|xF%k(L zBi~HYYn-)O%EHnDN;?!(VlE8xQAJf%R9#&Y)mGF+WAcS?Tr|F7!nldyq-aXi)X-Wn zwR(Ek7WU@*qEF;L89f|*EBbcyWc_z*{v!Hb^n>tl#a~DNkbgG%XZL*m#ppkBzX6#DRJ%7Qh*>C*410Vi_d+xpO{?9)AXk}gf zq^T>OZ?V~Tz+0|V=i1UfADQna|_3|=G$tf zRh&|BR({OMgCDDG%eUocS1+l%=yf+PtC?I|-FWKRD{>pEYuYDQ6mu;VVdwJv`4tQD zwN*7$oo-gXzNRC$vZA>vUte{}>Sc=?7FW%$uD$W3UpxPl>XRoopVT^WO3g)7a8^T8 zRc+;Y)w61L)vY??6@%|wKkdBg+QE;!B|f{Zwz6Tu%F5b~x%nxB ze|lQ?rS<34)Sh#8%X!t8Hmt6y9sIX*YNzJTUA-(frnF$lY>INVEtqV3Z+}vK6e8v9z8&0hpldrz<_IKp_DjIS%|F4c?i;d#C&bg1dcV=f_4qmT! z?cFs2;@7^w_4*mCBp95!#z3fRFs#?z#R3JK#&+{k!>sKnZNY$}G@wLOxT2&4LLO?H zDo{`xVM3x}5`~bGHV(+Nm0A&}6^T>|?wO@Tm1s2|JNI?&x#ylak9*Et;d-WfsW#AH zexdivhw_^rpJU81IFiSa)IHApk@ldfn&&F`-6il)nEDvWHU-^v9I|K2hyG-K zS=P#QMuy$@wKkf+ZBT)&=Kd;@byTvn@lD-4Qd4ZNWSSrj)qH;VBj%=d`Up#^1_P(T zYH)F-a&BAp0izgksg@4xstNPm`TB^e0Oed&iBP4`+xC@ z3x(7t{7^)Ko)E2|VOs=ZG)@-6i{v1Ai5-&vB-i+La)ZulFF*R&w$Y!&I=;1S`>vut zI-Fl`z4ot2baB_Z#pdP&$jd>8W-QQ zWY^fL-odv|pMCG6-~ai>tP)Dj9hzc8_enof-Pywq^AHbeSwAh5z@n^*2?|0LZoS=^ zCsqr}igb-iDk!0p8jMq$3XXi=@qr4tD&8wNm=MEU=hdzUwv)r6A{=Szcv~1TL^H(tC)Z;|fNTABGn_0WE!fW^mI_QC?Zj>OFauIyC-p>h>l zN11t?`l-|Ye`WZ8WO*{38c3lS-yU-1PQu$!Tw5pNx5{1kZt0I$eBq+1uT>{%YEwPm zPG>gU1~+3Jh-Y#NVH#msx&Te#n-R9bCzM-tJy>Vi;J1yp4x)QD_TI9)=9Rc|k%z;m zi!6P5yWPB{@1|9IdrNv_@5X_CbmFT1hq>K{M(o4Zk!#LCMrEfc!z`qX@or_^9s88L zf>6*1bq7DI+*eT^3sv?V__UJztUDaI)*Vr9gsOi$+g*JfE>?qHl9*?|m^kD})keMJ zwXveqvVR1|Tbrs$pgx#7gry-lEVIS(U64WEBm~%<5b&?H)oB`d8EB|Rc?E5dLh^wRs@*4 zqd_TxN2rwJ*C2>32h~CeCnZ+7h}0r}w`M7ZWxxP|gM<}8gdux?Xg1M8{0I*q;Q*YG z+hCps8yKjF6e%Q(x)@%0A}TlmX-|tu0G}qz#F9X48sL`*gJdpzmolP(N@x*n!qyBMzi>l8`+V>>#WODVb#NVsB=4Ui#SF3Wv@ zOYkF(<`Uto6wg|IitrWEPMd9U_5@Tr%W$1KjU!9}jdUIdc{koXs?tyqL6TaeM54f6 zpfW#4SpW|>1m$l@YcT~DRdKJZen9?;xT*N-C#$7Zv&o_dwq_`9DpxchS8?Z&BVZTK z#~`Gas=1v~35_7Z6@dhSl^#R|p**hQ1W0q_Hft(SaCfUXx86W?Dkz>5Sj<*ny%He> z3etdaDTxTMXQ`543ne(f!@-GA-8qOn4f}9RBSQ*^%|humXOv;kZe|u>4g--7qQO6i zDH*_4Vt$2UV3U=&kx7Sp9-};$b1^?2Nnorlyv6bjG2&hNRSrf7ovB6PSZz2SD^njq zuXeCs#lT)|Bxd|~v^_5tSs1BFgi6uRu1RGU_0*Orl}_|AdNTvb4Ve^%*fRa3!nt`c XXT64dAMEQvpQS?fqu>c=9v%2ME_R3F literal 120018 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 E-{I | Uint8Array; encryptData(plaintext: string, sharedSecet: Uint8Array): Promise | MessageEncryptorPayload; decryptData(payload: MessageEncryptorPayload, sharedSecet: Uint8Array): Promise | string; -} \ No newline at end of file +} diff --git a/packages/system/src/nostr-system.ts b/packages/system/src/nostr-system.ts index b7105016d..4382471e9 100644 --- a/packages/system/src/nostr-system.ts +++ b/packages/system/src/nostr-system.ts @@ -93,7 +93,7 @@ export class NostrSystem extends ExternalStore implements System this.#profileCache = props.profileCache ?? new UserProfileCache(); this.#relayMetricsCache = props.relayMetrics ?? new RelayMetricCache(); this.#eventsCache = props.eventsCache ?? new EventsCache(); - this.#queryOptimizer = props.queryOptimizer ?? DefaultQueryOptimizer; + this.#queryOptimizer = props.queryOptimizer ?? DefaultQueryOptimizer; this.#profileLoader = new ProfileLoaderService(this, this.#profileCache); this.#relayMetrics = new RelayMetricHandler(this.#relayMetricsCache); @@ -254,9 +254,7 @@ export class NostrSystem extends ExternalStore implements System if (existing.fromInstance === req.instance) { return existing; } - const filters = !req.options?.skipDiff - ? req.buildDiff(this, existing.filters) - : req.build(this); + const filters = !req.options?.skipDiff ? req.buildDiff(this, existing.filters) : req.build(this); if (filters.length === 0 && !!req.options?.skipDiff) { return existing; } else { @@ -275,7 +273,7 @@ export class NostrSystem extends ExternalStore implements System const expectIds = new Set(filters.flatMap(a => a.filters).flatMap(a => a.ids ?? [])); q.feed.onEvent(async evs => { const toSet = evs.filter(a => expectIds.has(a.id) && this.#eventsCache.getFromCache(a.id) === undefined); - if(toSet.length > 0) { + if (toSet.length > 0) { await this.#eventsCache.bulkSet(toSet); } }); @@ -411,4 +409,4 @@ export class NostrSystem extends ExternalStore implements System } setTimeout(() => this.#cleanup(), 1_000); } -} \ No newline at end of file +} diff --git a/packages/system/src/query-optimizer/index.ts b/packages/system/src/query-optimizer/index.ts index eb5a166d3..21d8b44a8 100644 --- a/packages/system/src/query-optimizer/index.ts +++ b/packages/system/src/query-optimizer/index.ts @@ -1,7 +1,7 @@ -import { ReqFilter } from "../nostr" -import { expandFilter } from "./request-expander" -import { flatMerge, mergeSimilar } from "./request-merger" -import { diffFilters } from "./request-splitter" +import { ReqFilter } from "../nostr"; +import { expandFilter } from "./request-expander"; +import { flatMerge, mergeSimilar } from "./request-merger"; +import { diffFilters } from "./request-splitter"; export interface FlatReqFilter { keys: number; @@ -20,24 +20,27 @@ export interface FlatReqFilter { } export interface QueryOptimizer { - expandFilter(f: ReqFilter): Array - getDiff(prev: Array, next: Array): Array - flatMerge(all: Array): Array - compress(all: Array): Array + expandFilter(f: ReqFilter): Array; + getDiff(prev: Array, next: Array): Array; + flatMerge(all: Array): Array; + compress(all: Array): Array; } export const DefaultQueryOptimizer = { - expandFilter: (f: ReqFilter) => { - return expandFilter(f); - }, - getDiff: (prev: Array, next: Array) => { - const diff = diffFilters(prev.flatMap(a => expandFilter(a)), next.flatMap(a => expandFilter(a))); - return diff.added; - }, - flatMerge: (all: Array) => { - return flatMerge(all); - }, - compress: (all: Array) => { - return mergeSimilar(all); - } - } as QueryOptimizer; \ No newline at end of file + expandFilter: (f: ReqFilter) => { + return expandFilter(f); + }, + getDiff: (prev: Array, next: Array) => { + const diff = diffFilters( + prev.flatMap(a => expandFilter(a)), + next.flatMap(a => expandFilter(a)), + ); + return diff.added; + }, + flatMerge: (all: Array) => { + return flatMerge(all); + }, + compress: (all: Array) => { + return mergeSimilar(all); + }, +} as QueryOptimizer; diff --git a/packages/system/src/query-optimizer/request-splitter.ts b/packages/system/src/query-optimizer/request-splitter.ts index 97f9b6284..623a2798d 100644 --- a/packages/system/src/query-optimizer/request-splitter.ts +++ b/packages/system/src/query-optimizer/request-splitter.ts @@ -29,4 +29,4 @@ export function diffFilters(prev: Array, next: Array implements Syste get RelayCache(): RelayCache { throw new Error("Method not implemented."); } - + get QueryOptimizer(): QueryOptimizer { throw new Error("Method not implemented."); } diff --git a/packages/system/src/zaps.ts b/packages/system/src/zaps.ts index ee22cb15a..bf9a65b5a 100644 --- a/packages/system/src/zaps.ts +++ b/packages/system/src/zaps.ts @@ -16,7 +16,7 @@ function getInvoice(zap: NostrEvent): InvoiceDetails | undefined { export function parseZap(zapReceipt: NostrEvent, userCache: FeedCache, refNote?: NostrEvent): ParsedZap { const existing = ParsedZapCache.get(zapReceipt.id); - if(existing) { + if (existing) { return existing; } diff --git a/packages/system/tests/node.ts b/packages/system/tests/node.ts index 8dd7862ef..d572afb00 100644 --- a/packages/system/tests/node.ts +++ b/packages/system/tests/node.ts @@ -1,14 +1,14 @@ -import {NostrSystem, SystemInterface} from ".."; +import { NostrSystem, SystemInterface } from ".."; const Relay = "wss://relay.snort.social/"; const system = new NostrSystem({}) as SystemInterface; async function test() { - await system.ConnectToRelay(Relay, {read: true, write: true}); - setTimeout(() => { - system.DisconnectRelay(Relay); - }, 1000); + await system.ConnectToRelay(Relay, { read: true, write: true }); + setTimeout(() => { + system.DisconnectRelay(Relay); + }, 1000); } -test().catch(console.error); \ No newline at end of file +test().catch(console.error); diff --git a/yarn.lock b/yarn.lock index 149d04eb4..9946756bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2852,6 +2852,7 @@ __metadata: "@peculiar/webcrypto": ^1.4.3 "@scure/base": ^1.1.2 "@snort/shared": ^1.0.5 + "@snort/system-query": "workspace:*" "@stablelib/xchacha20": ^1.0.1 "@types/debug": ^4.1.8 "@types/jest": ^29.5.1