From 79ee96306b58b072ba38b9497cbfd0ec2f27d77f Mon Sep 17 00:00:00 2001 From: isaac <> Date: Fri, 29 May 2026 16:08:23 +0200 Subject: [PATCH] Update tgwatch --- .../Accounts/AccountBootstrapView.swift | 64 +++++++ .../Accounts/AccountManager.swift | 15 +- .../Accounts/AccountsEmptyView.swift | 49 ------ .../ChatBG.imageset/ChatBG.png | Bin 70575 -> 73986 bytes .../Auth/PasswordEntryView.swift | 121 +++++++++----- .../Chats/ChatListView.swift | 27 ++- .../tgwatch Watch App/Chats/ChatOpener.swift | 64 +++++++ .../tgwatch Watch App/ErrorMapping.swift | 37 ++++- .../Messages/ChatHistoryStore.swift | 51 +++++- .../Messages/MessageBubbleView.swift | 18 ++ .../Messages/MessageFormatters.swift | 20 +++ .../Messages/MessageListView.swift | 157 +++++++++--------- .../Messages/MessageRow.swift | 6 +- .../Messages/ServiceLineFormatter.swift | 97 ++++++++++- .../Messages/UnsupportedBubbleView.swift | 58 +++++++ .../WatchApp/tgwatch Watch App/TDClient.swift | 32 +++- .../tgwatch Watch App/tgwatchApp.swift | 12 +- .../tgwatch.xcodeproj/project.pbxproj | 16 +- 18 files changed, 649 insertions(+), 195 deletions(-) create mode 100644 Telegram/WatchApp/tgwatch Watch App/Accounts/AccountBootstrapView.swift delete mode 100644 Telegram/WatchApp/tgwatch Watch App/Accounts/AccountsEmptyView.swift create mode 100644 Telegram/WatchApp/tgwatch Watch App/Chats/ChatOpener.swift create mode 100644 Telegram/WatchApp/tgwatch Watch App/Messages/UnsupportedBubbleView.swift diff --git a/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountBootstrapView.swift b/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountBootstrapView.swift new file mode 100644 index 0000000000..1f0740b748 --- /dev/null +++ b/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountBootstrapView.swift @@ -0,0 +1,64 @@ +import SwiftUI + +/// Rendered by `TgwatchApp` whenever there is no active client (fresh install, +/// or just after the last account was removed). On appear it asks the manager +/// to provision a Production account — a no-op if one already exists — which +/// flips `activeClient` and routes the app into `ContentView` → QR login. It +/// only shows persistent UI in the rare persist-failure case, where it surfaces +/// the error and a retry. There is no "welcome"/onboarding step. +struct AccountBootstrapView: View { + @Environment(AccountManager.self) private var manager + + var body: some View { + AccountBootstrapContent( + errorMessage: manager.lastError, + onRetry: { manager.ensureAccountExists() } + ) + .task { manager.ensureAccountExists() } + } +} + +/// Pure presentational body for `AccountBootstrapView`. Shows a loading state +/// while provisioning succeeds (the common case — it flashes briefly, then the +/// app swaps to `ContentView`), or an error + retry when account persistence +/// failed. +struct AccountBootstrapContent: View { + let errorMessage: String? + let onRetry: () -> Void + + var body: some View { + if let errorMessage { + VStack(spacing: 16) { + Text(errorMessage) + .font(.footnote) + .foregroundStyle(.red) + .multilineTextAlignment(.center) + .accessibilityIdentifier("accountBootstrapError") + Text("Try again") + .padding(.horizontal, 16) + .padding(.vertical, 10) + .background(Color.gray.opacity(0.25), in: Capsule()) + .contentShape(Capsule()) + .onTapGesture { onRetry() } + .accessibilityIdentifier("accountBootstrapRetry") + } + .padding() + } else { + LoadingView(label: "Preparing…") + } + } +} + +#if DEBUG +#Preview("Loading") { + AccountBootstrapContent(errorMessage: nil, onRetry: {}) + .background(Color.black) + .environment(\.colorScheme, .dark) +} + +#Preview("Error") { + AccountBootstrapContent(errorMessage: "Couldn't save account list.", onRetry: {}) + .background(Color.black) + .environment(\.colorScheme, .dark) +} +#endif diff --git a/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountManager.swift b/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountManager.swift index 8be3efe193..b32de42e5a 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountManager.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountManager.swift @@ -72,6 +72,19 @@ final class AccountManager: TDClientLifecycleDelegate { } } + /// Ensures at least one account exists by creating and starting a fresh + /// **Production** account when the registry is empty and no client is + /// active. Idempotent — the guard makes repeat calls safe — and + /// synchronous like `bootstrap()` so callers/tests can read post-state + /// without awaiting. Drives the no-welcome auto-QR flow: whenever + /// `activeClient` is nil, `AccountBootstrapView` calls this to land the + /// app on QR login. Persist-failure handling (revert + `lastError`) is + /// inherited from `appendAndStart`. + func ensureAccountExists() { + guard accounts.isEmpty, activeClient == nil else { return } + appendAndStart(account: makeNewAccount(useTestDc: false)) + } + /// Adds a new account, persists, makes it active, and brings up a /// fresh `TDClient` against its (empty) database directory. The /// previous active account (if any) is **closed**, not logged out — @@ -194,7 +207,7 @@ final class AccountManager: TDClientLifecycleDelegate { /// `TDClient`. On persist failure, reverts in-memory state to match /// the (failed) disk write so the user doesn't see a phantom account /// that disappears on next launch. The user sees `lastError` in - /// `AccountsListView` / `AccountsEmptyView` and can retry. + /// `AccountsListView` / `AccountBootstrapView` and can retry. private func appendAndStart(account: Account) { let previousAccounts = accounts let previousActiveId = activeAccountId diff --git a/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountsEmptyView.swift b/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountsEmptyView.swift deleted file mode 100644 index 310419222e..0000000000 --- a/Telegram/WatchApp/tgwatch Watch App/Accounts/AccountsEmptyView.swift +++ /dev/null @@ -1,49 +0,0 @@ -import SwiftUI - -/// First-run / fully-empty state: a single "Add account" button. -struct AccountsEmptyView: View { - @Environment(AccountManager.self) private var manager - @State private var showDcSheet = false - - var body: some View { - VStack(spacing: 16) { - Text("Welcome to tgwatch") - .font(.headline) - Text("Add a Telegram account to get started.") - .font(.footnote) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) - if let err = manager.lastError { - Text(err) - .font(.caption2) - .foregroundStyle(.red) - .multilineTextAlignment(.center) - .accessibilityIdentifier("accountManagerError") - } - Text("Add account") - .padding(.horizontal, 16) - .padding(.vertical, 10) - .background(Color.gray.opacity(0.25), in: Capsule()) - .contentShape(Capsule()) - .onTapGesture { - Task { await manager.addAccount(useTestDc: false) } - } - .onLongPressGesture(minimumDuration: 0.5) { showDcSheet = true } - .accessibilityIdentifier("addAccountButton") - } - .padding() - .confirmationDialog( - "Choose server", - isPresented: $showDcSheet, - titleVisibility: .visible - ) { - Button("Production") { - Task { await manager.addAccount(useTestDc: false) } - } - Button("Test (developers)") { - Task { await manager.addAccount(useTestDc: true) } - } - Button("Cancel", role: .cancel) {} - } - } -} diff --git a/Telegram/WatchApp/tgwatch Watch App/Assets.xcassets/ChatBG.imageset/ChatBG.png b/Telegram/WatchApp/tgwatch Watch App/Assets.xcassets/ChatBG.imageset/ChatBG.png index 92c90ecdf9d39397bac87d7a0267593dfd8bf275..5b17fa7ff61c55bd1f5505b7b08a4ececd6934b1 100644 GIT binary patch literal 73986 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

?`ojlBD}36K*PZM(coaL? z-W4_kTAl4jV#t;K!5HfPzFENdV|%1v*g>IHT4T(@VQ-o>jZUojA}e5JpebjAkU5hYdDJpqjNk-0*&_&ILOf>{n*TVj8W*wSXbZe#;(d{|99`I_!h==ILO(Wm7ZEI%YW&RNEUGLwr zxfoIhlN2IO3tovhlanI62T?;<#T*{%iGMt=fj?Md%5)?=jDwkva*hUw%a$AOo*W8{ z3;MZb4jnv{wdWY-6@kGBk_Mv4lfO0G3M@f_hZb&pYuWu!Cmg0=28%u?q)5Ymmj`TR z%{sYrBMYb(4ilwdUI9N*KoDf zVIKD)m;&w50K50^7kf@f6sEEg{lqN#F^IVDO) zURR=v>vDFqvKptrzWT{dEi%#3lra^ILJFh=z#@a7hy)A1b{ciGL2P6w`T8XZ{)bs%h@!Q% zteZ$<^%=Rjsn?hKp+OXqvTV!D(Shbt#V|0k-e#)Hf>?)X>xG<&4J#Y+q*dn$!|ok3 zT?GmSVSC;i0_Wht1Knw?(_8xaj3psS@D8%Hhar@jx)X&cyGB(gCLi@0TR~GJFbM%o zfj-2e3o}NNn?R;R5e2HWBi0K-!B7x$ua7lvXsJrv`)7&V;PCdX9Jj!f7qyVkUSR$X zvi1Mtk3X_PK-h4365bjUO5M?d-QI9z$pXVzv>95Zg?zD(cqEV&v6)gKHy ztl>)X-5S@rmQm}q76G}F_?NG1b`Kc@jFok1|2`%q!Je`l%fsTTgwKvH)y}}5fBuz} zl{1-EriC-cqSZ{5bu>x6%F4>d+LaN!2|tT^zfsT%ni&8=VqVNm2umb3DFT2jA3~;| z#XyTP5DGBMc`zCb&$V*(L_))&fkj3G4Ig$C(uL43w|ptDvHSHmOkhwepm2e*K?=Wdh4gIiqXz4ziMTSPE4IDQGx?5Yfaq3B;BHy~^V(_Hq;| zZz+Z>kYY^7rpopr_ac1sc(sgSoO7O)q?HY|D}fYfJZK#2sTDLc!Un>n6yWSfKrter z*BzDsSwW`0U2S`kt1W5aKp2hEk|Rb0Ac$!6I89}>_c>r^x{WIr&5eUe@GmQ{8?*+) zD!aL21Z$5R;hH(zdH?QxVv<~KUpku-v)S66hDxB6*C+QaJ9IehgYM>&GXbATz!5fD z>ac8mIRF=d=8MerF}`O70~zGOmJg z|H1vN(1;C=lRXyWuj@XSk*whRMvWb|f@Thg!DqehffbqSwp+_I34@9_ffS=wc;d@U8FLzc07*pBC1Wu<;mWwvdCb8-ch@74;3#`>m>K@_8d> zH4!$W4nDN(_H>qg>!KH7S-5%5S>v*c#=ti<%3gPPza5;J*kt%VMm5Z@9U*a6JXJ)*mog74-AiR zF~=o}#Eb?waA5yf?dV-gR0uBu+#7e(!|s5%DlzIsZ!O~Gn`-5k@h%X=1m?ppi{ zbcC+ZRK#kcX2t%M8}d3wZ@G~Z-=~PNQfEh|D2ir z_M|C4cxY(Z)0}RpVD#R-yPX$FaD3=yyCDwWPfH@i!e!xr%f=FbBz%Uo{|Mx4D%IFs zzqo56)QU-|@4A8W*K=p64j*54Z=0Wa07Eh!f)Y?=$KGWDVO;k6qb0G%ESS@O7cX4Q z^yGKvN0#RH^crW#IjMVpSL>fJjX$%|)$2svF`GXU?2W zik4w@EdQ^o1+Af6v0%<5_b}QelrAM}pTZ^nHBQ#rA^^QOUwFqTOuc9TTmM-*bm(xt zo^d)kv@K|AM#Nd(ym_75&tSq1NC=x~WkH%3hdTV|7Dl1x-zeMu}$4Y)%Alt=l}4pZ-+0VP*vDF+zmo5lj)Y$D|`o8PlfO zAi7>6j~+>0bNSME8gmSua&R3Ygv8B+SaXlBL{w3mFwWtM&vjipckN68(#1)IZZRKZ z3pvI4b|rd2e^IkiR=S)SZe9vfSgGiJ)8;}5lv9tZhN5fV;SA48dBFp?sYXd*cRr&J zTa|*aC`#R!<3*=Vp6cAbb9?NR`c}|X3<3gS97=~l2H4wf-?L!;1WOD&B19rZIf^Sy zfjpdu*`~56V)U^0=f<0faSObcQy#rf%;nzwdn5V&BTci&-r10ag3m`h(Jm)iwL4JJ zoi?n4Q8n_&t~+|=)-ROU0MpgH^FLZHV~9jbz&Qa~nBGGRc_5F;63ZPWsOw;sPkwz?8wdIG^G=`a?bFj=1$) z9^d+SxXFxAXh;XsVUaxWIcYt&lHWT7z`u^@!%4_FXqbTKM$sG{ zN;(aX0aLETyrN<4t#sbJw_nk070B-5^r)+kT0ea4 zHenqVVxnSJ5_`D8@t<&`Z|)`|u@cL!^6oADv!(HmZne*Ycn(r)SVG(5=>@+=#$r5;xG(&37$YX zv`$g$wX$&~Pw|zt*H2&&M7iN_mlsJ~y07g~1#_=M}`g7D~|2R0tX7A*+Fj zh}rvn)-D+u1A?Qa53>wL0j5uLF=Y@__PG)8q}BC~63+dM(m|uGAPjxa`q`zlx_Etj z4}!z+%QIQ}!RI3Ke(-tG;E^zrRmVhU&Gqw-M<&{~?Xz<^v{-)REX}0koj!HCbNNb< z1jEvn2CZ$=B%Xz}fW8kMIykeMl}N;yl)uFN=VH?hov~(Ex!35II4yr&s1`IV7{nFY zK7t~6FwR-QqQ{K$Xahg(Cd8CLM1X-alL^nA$=yXeBTUOopEeh%o`8vO*}A1~lg=_x z5i%DqTv#2}G%Rx@tR>(pm)Jn~g=q~Ab+q5`-L93n-A_Q}%%F{JNU%k_h&H)Ji15LTL7`|N|u~8Aqf2L+J+&7##$CwF=~3(H$HAw3hRY1 z(Y07?>X%=B$-!5L*=M>24LkkRY9)Nxp_#pF<1;O40GgKCuPb>dIL^((M-RK@0M)U% z=$ySb3AL)NrCvBc{RAOZ4!eHWj!<{(*xq?nQ+-2=(ScT2rrO%GOv_gCA|n@Y zCi>#y4FSOGfR@+ll0Gh27)lZ9v}&9silew^RS4yE9OT&Q)^#FiED(!j(4eiTA`ZW4 zG{37_<6uH^PgUIzF*4Zrl)1LF8^^5UzTKP5HWj&LcnxC2$c@8wu=I+W#?(dN1jNH` zS81Q^cY=&i(di%$0848g*4E!CrsNu>n?}6s>C-3K?Z>TI%vb-kG^2-`gh*i@l(^9g z%<X7xjDxfVAWJaFEndGIRhFw-cYq`-RJ7897~cCo1#X+JZP7Ojp2lXH-0(HO8nS9^Bv$r??#cc#fg@i~N<_(qjkZYR{i zBuj~f5E*8AhwB9VD&6~|tf4}b2n+ft!M{y5B)JjkSoDG>!D=S6o_F>sjteLlO z-{ks;>;g*XCAvv3dNFNu4X`FJU%bpI|7a0E@O+huj?cB0RevrJmNGdhl2x4-U9Q#I zjoWw>O*y~Q)+{zo&_rLIeO-Zp@wriz@G+;mA8dSdF}69FuJ-sbzkC0_{hh-{ims!R z5(X^;qo}HBoqNS3j--bG{WwkP0x<>`abgw(QcT&5K5C;7i1#?4gtg!*0in&uP9t+~ z+(@5yI`4sw1^qrRQkcDu1%ogheEU))ITY4loelq*4s=X#)3}Xsc>a8{`h?gkv_t9f z(CHW*7$dBq=^$a_OxcqNFz0a(>5N5l%0-8>jm{1nJg`cGxuZB{St0Gk)LP9vpQU}Q zD%IJwp6$++8g&lMC~%H<@7dkCe{cK_*Z5{{H-T}{C_#f+B6|LQ76>LuQx+2u*c*1E z4oYbC4onCe&sn4=$(2KMBPb>{N3}1Hjs#U8+Gs>w(4>gg{?U=yXL(>m9+8qQ=TJqJa*YdjUP4|8^xyjZFOh%>(;fdinkddgdtD9gj ztIoGg0_H~mhhR984sWEXj|*1F$s}m5r~Pm?oD-kLijPqftd)LD3Y|p1J%~Pc&fK$S z&*xJ7Ts53~^y|LDve$3#-MhDy4oLIaVG#~m?{VNf5?uH~D0@|b0_icRZf+3V(}4pA zvlTqe+BK%IK`cN4rkmkwt=g1#xG>!5rr~|9%qJT`+2`FMXwyLa1LGj1-J|R<0!Mv| zLqLm_#K1?(%EL^G?$TS6;7slo)&2L1hMaL-UVrUcLF~s<{75UBQC)G?*k@pBf|qph}BNBc8w7<1yPtWaidc;VrIO9IE^)uiw+ZWsG?F9!^I#BFPrwWST9G99?61* z%j}0AE+&R^Cu??y!((Gt(-qj;ylHb+=oHg6F}>&^cO+?kGQ<>(dOtVM`$Y7E5;6KA zItO@fnB3-zbA5Ua6IgFnjWxzR#JSK>xH`v$eJon}yvgpfZRvA%r8wlXXHQq%nm2A- z&zAD5m#@BSP+3`=V`Al^__bGbQiWUw=ulmHVs1(FUz!oIU3*+{|_MZH&@`Nq`?rTc_9OWL&Q^)W zmn@ylnaIAZ`tswzMZ-N73!(Ss^_x6*BG#Y#%+GN(+;a9>)G+vW)I80qi$l{8O-ZLg zoD0@r#KZc*{-ZM^B`%f5M+Z}uPLCeE4ikZGZgzN_t;R+^q{MQz*x|@8PD6WA#bv zMPmewL!%~x392AaPq!Z-3UHnX^?4LqaTw1~E)3-BEI7)TjViEd3IU6jrtMSMs4j;X z@1=h(<#alQWTd=Jd-3AM*qg!MT+Ftn#sLn*@#XVSM;lwE1R+S{#gX-0sX= zTikHQj#ljg$Zm$@=U%I?*dP#4n8Y~2^-P*^ld0Y+;bLl~h6BA9rb zKNbXmnUi2rT=Lwx^SMLCmgE*@#RWsB@O(-P^V7%KCZR+vn{(tm42#>;e=U=JZwQxZ z&T(TofCHjnDf0Zs0Vc_8t|Q=V(FsBfbrNAiXvW-(I^dpVvZ=)X&wqaF96xb9uLmLt zzcmdDqanoq^Pm4@H=6g9uZgf8$8SvAaoAZ^v0pi*IUV>}j&WFaSj$bDH|DXsqvB7kq3wnztvr_2MuQo|6vTI4v5toX%NKA&kw~pPm_Is*K z&ncI!(E~#A7}Czyu@{Jz<3I_H->4y7ns!16vKpc=bW~vAb=Q&5oGxF!lGi}i*pb6W ziatkKqxqT}0{UG#xonw!@hj=B<77nJ$iE@hR7t z2N)$Qr<41=eOk>x8+6SZQ}FNY+tCvqxMd#p>1xdlL)a`s#d#B;Lj!uAr0cSMaHh~K z_Y*}#_FBKaiTJ4O!6qsR1V^M46PV7UGZ;##`}91k2d&?jqL^|iFomE9m)SJy*JweL z189Bxik?4u^jOx`F;mQ}_pl%?2Zc60?WpB`@OciYYoRgGun_yO&B%S+Hf@?|WqdT~ z97ijS_B5lu$Dt5;{I!Awa%#@(6>y+ zNTqHXBBj_FCs4ThK4)6nkkfJ9FX76ywyuRtXSyVuO`A5aCNWI>8Jz~B-`YeQdzOLx zc?2fK(P5yymoqw|8aQX0)Sywv!F}DGgQ0P!1cYINgcZ6de&SKDv#>nB)>5Ca9uV=f zwP-XZnzA;caClrHj^Rcbfg)xCXHde2=N0=NXVoM{Y7l}>=0Vrdg+i(}i+#)Hf2Y1$ z&-E@~0#QRW2_&9OTWZp1LDQR#=b#B-TQC_?F|%HLz`-MQB9NI24h`(8Im;s^?zt91 z?Z+Q~%s%5mE(zCF#SHFQV8e)6CXx2o9_sNSDI@BRr0Nb!#bZ!BiAS*f_KITV@?|~Oh(s{)m zqX|59X$4KuTWn)qAg&pcCttsLooh5glgmT6lKYH*Rz?oLGZWgOu{e=xTQ?k5-}T@B z{x=D|qd8{5+9}U*2sc*MbIj{No)w-1`zSr7r(t^Y!j^8@^*o2M<#*?n+bDNvlJ zplLB2=xR`w;V|SLiRpdQmWec4(B#=MX@P$J`Iqc+iq}Oo1EV@b8k#N(ZI-qlWXIrrqC$yUxCJ{`vdwY`Tp)z$-AXI0!3-Ao=|1bLap4zyFt+8ke4m`Rwyf2Ri1% zG&xq|I@KO*7@_tcT!fJY*i=Lp?>#9lq4(XqyALqutbziFwUd%$77WV7! zzyIp|n1cQS{{+uCai6GqUvEuP7Y(drZcxhLs8(<^Bz`euklv_hyuSmJbEp=@|L>4; zp~;Bj%EK^ds8TUmHJGu3*~F^rG6bBtmqw}Aus6{ux2cHH$6P#@6Ekf>EBx#?-?Vu( zNb7f21*N2)KRpL@yDmzMBWP(-gpfe9*2Er;E4(OGgjJge(ro03!|&d&=}igG1Vo4L zDw_Ycy+LY#O%)u~1_$%Sh?$;Tf9AZH6B6w}nhK1JmO9FHM*pcvvsz{W0_O1HBe|ZU zDOOkRn7nc28=*oOA#kGVy^P%4u=`r~P)tZ2zn&&wnqzdgpyf&x9%o(?;qCo(v{PzP zEu7IukBfnXgU)I6DzvB3FHYfZ73CPMps5K`E*(JC%VjMBL$={IbIXh^fEd~~3Ze!< zM&DYNO4QvnwO%G%W@0i;iX}wvtFUfeXC#UoK78mqt2cy8q(XDkPP69sAKcG@{7@#w z%^XA*toByWECyI6(YmJ}9|*c4SO^@nKw+)|t)Qt1Hc9F=>qgB2h8>750{ctP)eQtD z!)TlVM%-tt8re|8tQ8DL{X$a%!UVnRpLP~Z)ri#in6^q7s@ms1d;R*&cWx~1DesB& zc!h}52pSfZB3mv+t!>5yhK0V@<7n1>vg`9f?!^e(t%My zxj3EnT}pGC2(UP?-{=d?Wv@zdy?Qv`gwM&7MgK;PNvkY!Zv{=wh`IwC>EDD)v^uxJ zTo;qf+nEIW_U&E$?oqKTF~EZd59C%rt{p=pFu6=3n+{=OkWI{@qx};!+y?VZWgY~A zo9jxoJ~u@Oa@LDE+3jr){zB0>OTx z3qSFtP)g7q3-?ixG+)rdfvW608~l z*$_avy?+w&YmL=?lLW_yv_ELg=Tr^XEV%_;w?lJD!Bi=8@a>+ov5nw&yjds%{9KP>@2wD86Gy zcIPc(tcL3deQZfe)%$nvTVYufT0t`-MBypzFXpxbCW8q)Pu50c9&za7aA&k25B}|a;5l2|G3?o7kBjF}!s(`f5yLa#E zTVd~-C6aiJ9(pXZakBfo)}B?xK+z`axJ*BOqMcbKwp0ZIQkI`Om`L zW{40f+#fMRJPV>M z27Beo)kaj)j|&XeT3Cao3(2s&%5eSmLB`n!=;_mEt4ayFm6hmPo0#3#50Wa-xi!u4 z(sVwmDo||kE!wQJIe^x8{l@jo>}BmB?sEJfDsl-70)=oW^4t&Q-dLJ3hQNvDoH0?< zfsfW8{Q1Qg=dJm*vc=w~*AXs0A4BMkTX-ENQdmTfmtqVv!Oca2ku){?41<3D?0M(V z!9%%4Q5jK8*%U#^ZMI>2!D6Dtym4izCSFQuuf>|o4XxZqrFTq!LyUy zEFV99D!K!w`!e$+ItBNO{Y3i{jDqlE<!a8uEUcG*mwX}C{>+cv%Gt^}B*wJITJq#0tIe5XZZn{mx>)gjIsH?C(PwM@8k_g=DUE+*mmGBM3&b_hTZtW1m|hKLdV_Gj2A z;#8bmp4k<{JjrK8=+dJSKY3g)k0?2tuL7bFbu$I&yTi+j8AmD2V*l?OUA}iTOnk zpS!B=EUBm1uEZ zi5S+5W$PUM^7Aj9r_Y||%(oc-?A(--ELbyKm4py_T6DMTAg~xHW@0rC)m?Fd(i0BWz<-w!s(80J6!{4)~;A%zJe6mG3q znAMR9Ca4Q@2x>2O4!BU%r^wy44WabSJ9d@u zQXClm@mXmlQ3n&V*uQ-Kk_$TtoM>!`Ne-*%E#fsBRx{Lm&YnHHlK|V1wH*Si$+abQ z!2vY7p$Pt7Z=|r1QXXTmwU8;tY?=UTh~ZkhLGCfH;SP>i-=YJ5P%E@|&)z)dgVi=l zx_oXKl=w)vrn%)=gmnl2H1peUzvZsW6e@LZO>ti?ji3o%^0s6NY+Bjaxpw{9SlWY4 zB4}(*_{YJ4iR>`KW|jqMh}8G9ZU_oLV+^!jV;>W<3{5Hv9BIty5y=732E0f)eVd4` zDBc@)EcUX&8p<}}?znONM&rgCurygR_779y!d*o0EYSX0WQ*#Ojn+#PSnlNqX+PY{ zxUr9LRr6L5(iFWa+aggYl_Mzp=Al48lVA&$o|bv`r6H)a}c7h8O;k(`<;-P zb!J@?;c#0I2j0QAzD?@c=K8j7+uGT_ZF>%`*Qwl0GYWbwSXXPzI$y*LMtp=q!b4&o zxW1P0IQda)lc!f zY21I|#tuZE!(xQRsq}NQmQzK>=+>O&$1ipL#*I}AiP9W=s|i?mLBj%(yRS7zNN)># zSbwWznT*3YFg|I}d-oNsG|C%q18EL41q`ZfzBfK-w?F^<^J+H(qYCC-K*`FppDf@= z3!TI@QY8f2DM|_m>s}w4wKGze5U`E}_{pTe*>6^O(~;d!Nys?wgv_*VKe1LW#8?Z! zTktFE9xbP2$0{orMc|-Qyy)Dy^Q(1uWnQ;u_nstsT0v6@!ewTm%kwZ|E_QEQl~JIM zCIWYuP+98^O9_Fjhb*nC!3{x^6RdQIB`1vI-mD9h2-o4zJMhu_ZC-mUkn38eog?FX z(00-BpjZHbkFM(s*k`xom#>`@Cr{*cZgPB(;(GCiA37ToeM--+!s_-J(ZjIURTe|Y zSd@nkA4%3<5yOf4q-Y@(ZKPP;7Sp??xtqjFr!k2b3tdMOjr@8mrlWvr z5`snu(gM$(J(KHdXaq3}#O4(Ya?es^(##qT+lCd%3Pt*7(=xssb{Z@VG^SHd>zAJd z(S9G(oA$fWD>}wB`&mbka8eb*J=)tbTBg?a9ouIzAqlr*z1*>8&pwHObCxY&c)Hr7?(vT1GQV}t{y5H1aKO5T5% zoppmrv#NYIt(B4!t%lH^q!*9q8eo>nAQu}8!s}#C_G{zM{X!U3MbEC0MMfF3j%8&6 zGj%rILlfgQycPBw!=G2D@7N!E&hn4gt1y6g9V-`Yu4Qd=zoO;VqNxB5p+cy#b`)`x zaT5Xhfp4}~SnV{kJss{A@S3^|5Z$PMkY`F2_q|<>q5qStr)I4%?VE zE1f%ML$}olSjR~E(1^1iy?f5J(~vJ-xY)UJ^~yJa{}@A16nuD_duiLb`@_0A2)) zGhb)kpuh;S(h9`_Y3s9UBabO##KDYvGnb-)C2iLk7^YN(uyHmnBw?daHPZAW22dpk z8?gg|u=lz!Pp;`0IMxJ>yFAQo+PK)X;EBQ4BsWb1?$9R9U#c&OzGg(lduV6n_V#tT zWE{xc+i3v@fVG$$v`Yd9qZWv*nlX=p5DM`ih{TUv&&KS#U;F)D|M201%v8CEq7h_W zv9duLxid@fol4f??p?b(^M-vjQiE`ucQz?2cG@uu(GjFcBQX|M&=duV#lN{0Xh>XU zO!c}_`uMtOX-^xFDb-@OAZ!G&BipA5z>v7}#9u}MCaP+jwv4$FI6HRioJ$I<>wcW9 zwKHeWWaVvMP)uqqxX9-{K{i@XRbk~3G)>BkU06W_8&@{u*6;l22$xCTufZQeCWQEn zSv&;BxPIvvYwUa4)aLbxSKY>l=gyuR$%?2O1c$B<6fFgMqrQjGbXHh0j~_o8IacDH ztISX%^nAAzYzo{wpjg*BJbKiBc1xrc&jQw#muA{(erxHP+Zas+$QANwA!(U|Hio~G zZ++|5ZAk#V$>ylTLNIwh7h7*(W*ndYu;Q4}AC-J1YYH%sWk&(&IYLq`>>1 zfBZ4B8%z?xxN!h(I%mrJ{KSN(VT$3-!xVq|>8C9GX6f#seD2=8E8WkHflQfl>UEMc z>P86hX=%#m_>3kAnuSeowvfAa?apb({Y+lWfTqL@=|BtH<9ACEK{MS*B=<`GI0XfuX200g+WEEmr+RU5I{M zm>8vv>#K^yi104FPU|YxItw=%>&zK<5B&n~1fTtl485750wsacQMbY|E*83AlO~5K zwQY#b#4&UUGgvEC(d(l#b4&^pj6-0wHJ=~#6EfOp2zX3H)h*V4Ai{ev)zg9i`fhK~qPiXj0b z{u6zoeAl+NP_soB=z=m+rv))CVuVDmh29U&i`h-%qRw_aah?e?8F6)G_tE&nni<5< zJx|DZ?UBPp;9%cY zL-WSM3z`5;OE&-y0!3!omMwZJz03k4=6w@5UQ^6;dDmA%yL0z$7Cr&*-Q3OOXt6$k zhGO=6d8k}jv*qeJdGbVlO;bi(f1%``l_dOQ_~Rcqv*)s%vK@H zxxn`B*_{P))5e%bZ!*_7iV*AtI^DB(Pxi(%ZH&p%2%0it)&mz>IZngPfpFJqRsOt3 zgW9}lbMBnFsN-l`jD{$fD|(FWDqI-d5!rn|0Y{8GOf@C z0pvh)nZ0{kC?2ya=o<&zJ?=%UqhEbW)2tcm%5~j)U6`ipmjQ|abEQq1B!CzA9@aur zi>~vmt9S1^hYua@+`e;r>tFlYD)o45A0#FA)Y{v#R-PO=yd^n)z zXv)cg;btB6V2jldFltvq8*fq*Lx|Zr2hD9t0*6K4L>i9RM4pU$=y2acL(EflDCJQ4 zv-KZGxKj#rPk50&V^$rwCj}wM8s)-u&ubx4n(?kCy3Jte1r6docIh!4`w;8oC(f#jBjC+>WjP<6-Zri45=!Vs4nWF$- z(v`set<~(4l}C{fmuqT*N5ckw)&ortWn)~vd@09n)z2lDZzr9^N>GU#{Povg z`RArhn>+vf^LHby2G=U>S&VYtGgqnrTD0c&k)kk65k#}U{`zZvjd;&2k>hz?s~4S( zV@*+jDMI#aP!XrkwXddeHr1MeMhF@V3*lfub^$#C8(s`XUB6T-{fn_&I%y7sB zTIqENn7gcLtsJU``wSsML-dGo2!$Zokk-mH%#S%+hYRwsmq&E!ZzXWs4R2Z1XlS~Eqz zzePq2Iux5AJh_f~nK9b4&zQZIQ}c+k25*UTG7h3KFz*b3Q+5|}uPMB>m+rsG>FRUO zIXeRlwG4tdn1)5C(0Ns%eq5CCNFd6Giu>0v?x@T5QZUw({M;5lzFye7Q*a+~l24<0V znmb4Q{7dKhjq4M~ELgq{y7uw0M!R?K$qdhZG}c#cCVgVO$BrJ&O5G?LekdJHW@hM| zCjy;6OYTto#Jy4~qi5lwpKF4YB_1_i&M&v&BHY*9EgA$u3kk-zeS-c=3QgYGG;Vk1S9 z-A=N~7hlMLGmK_=BGB5kYu6X1TghAn4Wg%cFy)zuh=Z2ZVl+gdVH6SWAf(fC){>@v z|9%oI=>UHD+@Bcp43MPR9!VOm@zj6(@#kC^Bsz%By|csQ?d>tMt?62C^b8Km%uKtY zw60BeyK=XnAMTi8!vjG9E6afEZ4~ztx8yw1y(3N9y%3_#h2Vd`(uPS9BSbL!ty{Mw zM*lSn>Rf1<&RSh@FMGwBAw;?LJr*g(Hg}7LHDjYf$js7DzlbQ0rgorr?AV?UlI$tO z=YX%Jy*Vu2D@f{a{GEcN^G-egd=U#l4sm z3&s7cW!a!93L$zCP+tqtWkGDAYGH%^BXOu-;D2Xw`*Oo>T-lgin7!YR_MIJ8rwp)B zEduY0$*M9g-*!C%8#ivqu4&IZOHZCWPL^)9Y3{C7os9V3wWQoUudvDJtT1;$6J2nd zG!3q4K;)QW3~SoBaZ`2)5IBU3&eNkDXa`Xo;lzpK`GE27hB-cOY}ve}^XkKFgq{1P z`LgCl8RZ>t;A!?;W`h)>MQglDU}BJjjW|ZX6xk3;81yJ$Ep6JoDaWv?o=Qs@k%i?< zynFwy^EoM5U%St5-@dK0vSB4#=LBOvx+bJp{x6eaHL6A6oT-O#ekjHSFF_aYmzlYF zbI~P&)p7XnkyV~HO=43__$9O{0j#qocAyvqOI@(J=)lpR0eN1#$J@7}wc zg0gb_0>eE05MNyywB>9ElB2q{GWyxV@GX-p8a z_|I>@b^e@j4GInP{P_#H5n*V+!4RSVm1~KXDl^VL(Ch~>F^a)||NGz0pMUZ$KpAr&EAoLa>bTGX8w@1qv29=T3M)Le~=`yjU(ahd! zuU`Bt_s~OS+e>3iibS6MxeGI)B~hlSJ?cim(splNG!$;F16dP7#=X77Q*4V7a&EIe4lw_J?BvD`jv}EgtNhnZ_fcc>H zBQSk-Q8S!a9-fm1ZDyLZN7ay~olYISDCm=3wNTL3HP)SctoD!EH8uIL2OE zQv$@fCAfC%SlMXODv=wq=G#kLGW1}Hp)CR#;T1WmQQ%RE6z)AUx5TtW=+1jr6^R=B(f zoN{B>=pY_F`UoKJXY~wJV z^nRi#*2R2f?ADO;!&~j>V)y zLVyuO{K|`@mBkRN$4?$FY)c@;iJ0)iZftEC!HS6{s1$=}6*S9Wb4e4pQFBsq-UxzAYm=*wpbpnml%x%q7Rj)R8|WtyzhU8BWlXkBMhKrz+x zRPG`6GzIt{CKJC`=1z21jyC<#Nx2GxjT~|{Ffm_)b+qV#XZ~@|F0*NoU=J`bg|rWI zXNHGcDu5g{B1KKtfucpt(i3^+pg4gu|q6%z-hda(bVcG>Cq_a?v^{P^RK8?mZIfOX{t4Q6yFxj>(9;of|a z7OuEh1wB^s>eb(ci4>PPX zSvNa(9>@x!WQUm56q7q86QF@MIbeLW7R?x7S;*zzv7_jRG%Q|1bK@@h_rL$Wp+ONo zg%9~m=fMMWCLV6QpYVx#8;5X^&p2Anc)$0>_=P4STXjGF(E0u5?~SeZu~(QSgzKhd zIQ0=tNHO$b?f9)Vy2aEZv1L});_lpP=wP<22)&}I==&5ODiR%7G_B=2K3YMu3FL9O zNgLuyAzTQ7I$AElM9{D@SU(uH@#2MzCYsCCb842L_*_g@LD1wNVH3??(FJ<9_OrAcV-$ybW`Py6 zWuCRx>x9q>nh_BNUaSpPjJ7eOfc8d!$f)63;EE}0%ZObT%&sJaVqVN3L`MJzMMr?9 zx2MNYWYI-HwrSu76(E)gw=7lu^F*Y8M`wXy3J^<3Q%_T2%Ly-A9g#4xs8)3=Xhr~S zr<^7^Nv4j72q4*LgjXF+I?^`1pBA_Xnzxt-pSV`~P16<&rg$lL&uu5YP7ahI@s9Uq z`6S^nj7}*dQTh>SI^ z8qBwDg?|XWMJw23F`PPis*zo#S*vSlFYff2p4nnNM5~u@9i#JMG~n+nOU%_Y)Q_J& zjx?=u(IGRFi{3epaR=7Tnn<3&GZv+&v=uZ1z~tv&X0r0xPg0|D?ej^%97zI<@0yEX zm`fqtYlIV_w@ChL_wH~wFx7(8CV-assXNWI#dJW}P>j$%mv5vK5Bm%Oh1My2lojW2 z*%LIJ7tbs0x_ZuIFrT$p6h(7;r^PpjRN*UEzROwzAu}n>ffaKs35p+5K>Tw$EHba^ zxV}Qjux6OdixwnxC}?Q1>zbyKDjwwnj~HBw=>e0ZSfOFAU(A#uHwfrO8vM0u*YfAN zlPFu&4j9XXsFmv%$0VTreNoU_G(C`KU0l47{Gvr4t4X<1Xd!9~6kl>5jS|3*5d*(> z+q5qdLOUa@o0e(j-s}l0OVIh$sgp^FzioW>-lBsw^Cnp)(wUDOS<6<+Fl8=ALlZo# zW0uh}4=SVhc;;S8rFDDv?(M?xf>zL!fa!3dsKnQ&Y*KENY{eWqo?|gDU%tq0uTk7^ zx%e$h0TqG=hQKXR$Z&0*Cp?T2cAGZ{KRRyuAF)OMD^FE+eHl7MH8gaK~FCR^dHpy?C@d*S@~ z&b~zKQZIY8^xw=inYSmB#`WyaqBwCghk%fxRlBc6WNH{Y26FZ4)rqX@Cn`jX4!ai(GOQp%%fV*#im}Zr`zLzaVNC9$jz!Q^5bBZa!bL`K3|d!( z&3lqH#04!2Q!6Ot2a8+-6%AY|y*h*6zdu}fN*jOw{#}ZHHa9JQ%L|&A8i<)sD(H_P zag+IZt7ctHFJNexG;L)OYX}?~ovLZ4wA5LCueC4FONs2ANoc&TkFgV8N7s(#F4$&siGVMxa;6h=+Eqd!5=P){ZAJ2X9j^^KoJI%ShaN%OkU@Qm9{o9^! zCwVPWBh=!VF68XTsMjk`)b)G9wW@H&kVVQxlQU7b?3e(X7xT|q4C4x!U~mXrMp-$L z05M>=t4ZVBwR2a}fLAhu@}7PS3DcmZ%rmYr4jha~0GO3q$r{_!4~fxRw^>+$m|@IL zvG?VfM6+OWNoC2j7lXr=C1ylmvqE#wKe+~-ElM2MnCINSeOu3AXqc_NKbu_6TuOv+ z(=8kOclolB1Vz1GRXIghTnz40uXbZH<1)hBrS{^5 z#Ms_tZ6w??gxGm8mh{u1prz5uVv65=+IBijz3xw~fJ4^A#*>4<664bFa{pp8(}wkO z;G)LpX^%CX6(|R2Vdu_5Ntm{l8J#7p!Q1p**B79%>Shof&1vtLEk$imzd^3efBfSg zxu@Qw5__fr3Z?XVXXTGdR|;o|fWcqT625}YDRC53dminaW*z?=6OP_=3ZC-z`cDnk^@2imtFH5>vW9mZpPo(>C6x zYurobd|WH6rHD=R(`aKznbgJVL5PW+#vG4(NFp%-^Z(!f{#Q%eby$D=@rR^kz09tP zIw)LaXS3kWLEI!@A5OVBWmqx?4;<{={Qc(4wYuHAcXjqFs{6E_t<~~gg|flj!+o=8 zMYc@`8fDoOF6q@w=ai!r9REz*8x;quGF-j1#%VSR1pLWWiy(@Zfru2FvSpoQqTi*aBY z)mn%a~|SplG?hgo*1ijcI73GN(v9IC=6!4lX`T%>Q%} zHV+>?s@+eGfN~Fmgt7PL7*x{C03&tJgiiFNnkMW8M$dOWYahIQIeYe8qNQ6|>$LAb z|NL{Nv2uXgdb8}p4Z^k8PHdbG&|8z4vhyNqEQCmPo=jLd&MrEMRy)grEzwky7D33w zh}cmPftyDJ-@Qr*MWNZtp4l*EV9+u}`lT%sKp0Y;hJ$f`yZ7wQR)tFGGiT4F zYd+BcF)HT!eP4W+>xK`RwaC<;b^ttjr#Y2LM z_2jPU)#T9M`QQl~%~V@#Jw(~VrDWOSLDfNSksO3CP}nFh%NA=}dW$CNQJAP0=%}DM zUpRlEvvb$Ztf}{7qL@sy?;k`Yh)G5nhTPAxTJLsscHjT{*S|J0*2-o!;*6eLdPNDh zc~7*taSyrDIuZEoAv0Ds;tA>gB`3Hp=Gp5xXk0nVDgB#(ac?WFHPTP}BnPD~mz9yXJOg>a+G^a-$I$B%V(CT13M!~H#&>Aibz^7mGW)MvM) zdm2jxL?y6VWRt2_vaA?WkF*N4WH7;km*loTaR$J?M{r}8c$mji^iwrIu(ap z2Zdm+YmRiu*Y<_&%R->lras$c!sN0smaG$Ja zO}ot42_II+nbW6}RaCU3sq5}Ruq>#u6_puVO=eC|_S5KHhx-n*eDmgY=a-~SZLHBY z%=B+2PE%w0yH>R>fdvr>7PH9kiJoO;x1&S;D(#W%u6R~1Qo^5LkHWoigkTgzu6G46 zMZtH(@9JoxmT-Y^(;THEDnY|ip;^F-LDDz&GrDJ zJXivsKdGmr~G# zUzDa$*CfS!xit=VM=RHvdRYZ`5@swl7;_3nhr!GvwbhJu4Ay#h7L3yK5il5Cj6*0t zXT*LY?trOQYeZmQde8UCHGt`FCib-%*rRCg5^$fan||3`p3h+p>uxjONqIm=*5S;V z)46u1R|7+e1%VX(#vWBN{bH1{d-1oef|wQ=t#T+b&cm|ABkGnSFeZ&C|)n<`9fqU5=?WMN8q@VNuE3H&10xx0;yntM*y* z?3lRt2Zr$B{fBI!5x8YUXXHyMu#Jh=E$EyC#9*L&Kpoy;>rDvN$=>S)&uT7BtQX6a z6<39Ik;1&5zKh@^%%NJe>R#>1C@#=NMR*8Up|t*TQ6kIEI-##c>#|&iXQEuIV9AU#Zil(ly>}FmlXVX4=V9C)0I4<*c(=u2;0(D1YatbRUF4KX^6* z_UR_4rRJDS=gUSchC8uWaj1La4*9?T`@fBbhZsv$(Db}(+y9vv0)|x2hU1dD>+TratyMvIGn*Op&4-wSI%Ai7p7q?Fp;=^ zudK0Hix7GkPcO?juHn0v1%zzQ`b*Dl&BV-d*X1K?+4YL~mX({R=(on-B`c5>O(0Wt z4oUXtbS;5o6ufx;Vxz9Bsj&CX1FMEBmmsw!p1q8mF!Xsn|GgD76M_S4u^qNqEh-Zo zlNdArsNC=}Tu6&-x^EVUoeKy4Sr5KVF=t|x~7raNsjKmgIeqedsRQH;*N{XGhG zqxFt;TKhm&Ifnqq(<5YCN5|!Xl6+F?&d@15Xu*y=9tku#O&Pp%w(#; zYlsGuTrA-)-ilTXw+@C(YcY#lo0>YBb##EnI0g-Cn>HMRXaipsjxEXoE~AopI( z_vm$~2Oab}nj9hKyD+{GG_0FpGwvf5cGA;6=LOGmWbH^kbLHnDOryE#Ab1}E^7zr? zZ-h+1@9rldbRfCZtX;43-9+F;=z+EE%o)_CqjVF;El1Hcq0Vw=l@m6T%qE?vjOB1I$2t!oiVYHcyui zCQg8aG`1pwnni#=K17<-Wq*2?y zi~=Tl6b+UMJ7(7FT&$RCnObg-f^3bPKcA<3(pV6FU1E=90P9+1?DIgh-siJtSrogb$@)kTS!nrZCj$^c~3?2M- z&c(*`F`P#R^Q2YT5nud67x(XlREn4@a^g!Q=; z(-Padas5UkGi1Wl$G|UNzLfX+MYsKaIYt;kY0X1-ceB-^Hm0cK;P3y|l^88kvS3Ot z)<}_>x;>{wyT;q}o$t~$e0Oz(^Nz%5_a%B{@%S89*|6-sMFfG}>zRhdWb@pnSAPw) zuyZSj_Wk)R;E2Nyv6ufSV2QW#0a9=c5UrQGOeF{Gr4Xnz`>>^61-B% zWBTW2u9F4Tk;Ca4HyX_tb2d_nyV-x;3Z!e(u(Oa!e`m>R2cv$5&zakWaEWG^qbMO! z)lIOSoheAUP2tL)`^*V-1DC7DD6EZqDAwukb;JQiFxgpFJDTolXs10jMG5$9i!RPp6}ng*ZH%OYC6ibP9|ne zd%tnx=EB6a?D?I$ce9X07okmm?phv`NMnyFnqduv%Pf4_UJ>WpUoV#eP)dYb~0Ig%mWb8AL4WMAi2)jy@fR$g0aJ%jwW^ z&5Yx#mPda)2^xi3^D4+32N?XUef8nfUZ$R9b%Fl+r7*KJcC7U7<;Iox>C?wri7CU@ zb?@GNTdtMMqGI6$O~fGt62&04nt%cBg0pAOrL|be0p@YiWigA$;v%dTA!W2hGeFq% ziUG3b9z5(_?57VJ;V`ayduNWF9rp<2ksSYejTRtos%I*cPnIzRsS zL$+oF`vp_S5i)ts`IRd0G_~>%@ZdgbXXj7-sR9Ce+A8dl>ubXVkzbzHH+~ zi-Y&?-(?|E2F1t}$@0vgnA$i@NsJN5b!n9FqJ(b60fvi)g%C8faa#DKinF2@R5{A~*+QmMMn`0@H@;7X9j#WPLd!t`54_et|S^4#;cdt zN>{tWI2{zsc$V%O2Sy7WT7Ar~_iU458b#{z#Ux1gjny?E3#tnjIuDa|;b2?CI&Izi zA%x7WuGLn(PE1jh4X6FP^lSIu;&0en4B6hGqnCfZ>^yt=Y;FQMdY#4O%Rp7AgbOWP zrf4aigOH*OY4`71;cbXUrv8q0C?UIc?&`dG`zFUOc_X;(w(3B`MMI+n4PwHSH_PC1 zSK~yar;_D>XrCmr98n`^hgO>JG^WY*f`jAGF!{At=N_753!UhSt2K>YQeiP{7S`=W zS{DKt^Cyt4=Vn}5F&jQc+YW-gVPSrM<@;=XF4O#$&B8grlrdKOti?Vh>Ewx%nfbB= zW)0`bp6*Wfwms2`^EAvNNB^vsaJ8W;)=yc9^d5;nGE8?SSL)~Ph;Eh++KF+x#b}E>T1?{xW z)S3{$6r-SHjMv}n`K+0(bLEAe(I3x){T)Pio*|}g_In>1i1{)x4!YNSW7Na2**7hk zfyN4&$i&*re3^~InKUMaj^*(Iu1gbhNND}j3_3@U^X!?kosa9EazC+2W_{&2O424h z>xXnGjW(WC2V>Sp_Mda{C5`j;?aeWK8mBcF#0&{xlPuK?0S3a#G{P4nnU}^&L7?nd z2U<4`e3ouj0{VPXh;H1x*|U}^)9#n~^!q}4gaF}UeM~#GKEo{5VfX5p>YNdl4`r?G z-nI#Z+z?CT8N_lCE zju!)s6f_t$Z4SZKbunS+my!_ChTJIUDs$SXC+S);)6#^*U$_y(miU#q7A7gsFkfrq z^;cp*hJH1I$T!FKU)kIh8+qZ6K*J1SZvbUJ&o(mT{zu%f}Rvfn> z2HsD|Sl89n{n<*M2ka+CZ=LL)dnEuUaulCQD^`H^oht(N-TQZ2s^{UNqmhCJLD7`z zW*ucAlY|I{ey2zOF4w~#9E5R$6uvV}iQ;b1mlR9jXt>*d|oFM8V418me*q1@~ zNf<}Hj^~WPw|(8aZ*OPTaL?{HgbetJp(+~YCOUTPXu9v|q{K&RxjpU&e}DGpv*Z?@ zpOS&m6TX)&U+UbvaWg9flnQ4pn!pa*`(cQBH`gP4(LQ>aR@2UTBeLy0Gy3=c*3gS^ zUsMaOk%ETRVNvUt;8}^Kd2oPUa$k-fiR?NM!K>?Fv;(5eSUg`Cn@5OU+yeiixyTL3#D#>p~MZr@2H)a zhd_<^)VXu#lOTDYnWvZpi^l%4SU-IHknd4!Y|^k!XcnXG=Q_*P_pAFm^M>`14aeH} z?z=0w=`GmM_;Fyk_^V67YJK0+*&Z4R_xxK>G?|S$E)-H7ME+&2LmU z28S`aZvw>uN1OILw@FFQf)1tyiWWC1#?woK$7K8+GmpUhyx?p}NhTbv)6YNuobTKJ ztKMJjx<4_@lP6DYbmS<*J`>*W-@VUkOpu0PUuF=f3X~}?vPOIDwKb6W>1AChZs*cE zqswszAkGSW8jVsD2ndYnKmYm9(D!kPRi{H@1_TTtKmbg#7}K>KZcNa1ZE`tvdK{Ep za5P!g5m&*Y2$=At6Oy_A)sB^p8H~JUm|HcLL*yZ7$) zeGh*o^PGUekRxcz((rF4JPmLX8eU}ooKDx)BaI7dQUZo{%mgODzI^$dw3;XBzO~0$ zoavziNOWSRmC>vs=vzfJMeGIpzB9d!q_vQ3hG90P^?Nn8gb@&c>TEV^El0(_wTom4 zbbYJRz1#Oh_FXULv%dbRbMNlGoCQZnHOXh6U14dh+Jeg7ICA(%XXmb+okx#f<)jH3 zKkFZ<5gK*U`B^a(a>9n9H;-0Cbf-_miM;2r;K!=^#E%zDoyl zQiH+>uj9$e5TJaT0-UnF#<_NMs-^vN>-jg|I_B)>BKe|&QQ8ap;9v~X!eZu3uWOw? zbGox5Y3GqXOlfd%2Br5-8!U-Pr=`4<872Y4+SqJt#PbnU){S5(uV*>SEz(*eMZ6aX z7&PRwlTdzEA5Y^pmfS>;gp0A?zDB9T&n z7!p^8?u%pq80)M#oMRoXt! z#S*jcm(5>ptvoA#@+c60pv8?MoUCQm=H>v0`|2-Ovv%9hl^gx|&=A2JjDg^}c=1wp zWkgFBw5IMsm3Kc)^RK^NWtWL{@)_5mq1LsWxLB4+p_v8Bo!ki&bAHx8t#8Crxj1z^ z7&Q5FGvA3G%#7;wH#CplqALm-8bx`?Wd#FbI`cx~3N{@!ngz{|c2QoiUW;9BZxVkW zv@zwTln!Rh`0)PdEfiTmIXOW_R5uMZS1+fRd-|A|!JBlC&y#z_y)L6*DI*R6EpL>V zRrF{Z)y)?BFfT+PK49N5bD%k5PJH4zPLvtE^&xop-YcyM zDA&dKIV_tjirh0DbVtKCt^Tetf+n&jXurpgpZJE+e8qGG&N{t?OzBOuq@Emn)0QV1pJ!#bfMuxxI;wx0mcF{WZ_`sf#|1_tJFGnJA>dh7_pj!HyJ?OQCZHvjym|9B z3+d0v%HE!|-f-!ztRxLM{q6T|!^sx)fPT-PKiAh9?dNuY}LL0@IJe8b5>i5CtB01SAXqXPp+I+ z$c%=@?*bc8cG7F0xgQS)uI1k5EI_Dv#6OG2Zh41vT;t(%)aD4o2CM^Su}Q( zbBktyl_>~L+pmt-4l9SYm%BA|YmsP;qb5kOW}<3-R*1@cY3>f|&90jaqG0YxxAO#u zw_sG-*^lZ@tc!5r{`u!%e|x#je(Xctn9x?lkt1ul62I!owT7(N7^+r9xHQKV4uHm9 zzj>X`%39~agNL;~L#V`@E*2GmXAT$ZB`mC5`;-38<%?e1I+_*>2?vnIUuLfUEl|pO z5!if}7__XJ$mAOZ5z{fEy6#AUae+A(byP=E%;jG8$CnQ%_Zh3^$x zba7n7s0O7gTPx}2N0NZlu(ZIJ9AtJc?itf;VwLzjA)}R&P+b#D+?rA*`enCzO-iY7 z4`|2mykV9*a?``++fF|4)nBY-(i`G_oLWrNc6d_*~31VnN-!d84mz%-Zj^qDL7)WEIh9%vvMvPm{o>=Q~l?vab#nPuF1P&!df%V^ycI@}1OPBLNIm#U2A>BCy zVswLu&!ZPsaBc>iXuDVUfq9@6G%ZGg11fHjr%ZND_FM;G?Cd5FV74kw7L6vQkj|d-hEFSRI*r*7&z+A5!==#gl@qu4W)8uxjod#y69gqz#n(W}qRJC@f9nieAg!*VeAvk~&R zLLnv$Vy+I}thBFPyLRVvP+41bG=2x$;iXB^D#Ox<(R%qDwe)`}n)Psg5)V-+q%ak)kHci;%UJvvThh2^?QGD(?fByY{*_&oBrRqh`qJvk;o7NhA{E|YHTSKA=h@U z<~g#V6*MhIMij2{F%uA@HXy{5W0sBhj!Y^R!YsA!5DI$Hje=ebF`B$u2Z!DeE2+nI zExc%B!~NB74QRUDB!m%$f}@4j++4VA|nywMg!5Qcvd40 z6l?qLUU3>0AVFfy?1}X}nJi4gM%(^LDM8$2p}2qqg)`l$!ZB6XcM>wrMOhJ&R{!Vo zzg=zi7A?5fUT#v)8qbc84-wU(ao$%=bBMSd)ML>tCJg>AR{{O&REO zl&%h=fWko05f3743EHCN(Cyse0j$dp-+!Nk%JVFIz&fK_3Q0Bdlb~_kerx#CPd{yH zWb~xaS~M*-4NQclOrr{4@>+LFrqs=N>A!URSfOz{Kn@9JgXm`+JBTc^NKu|NFi#AO zg@du4IC)}&`3@2y$5Pw{0}1Bat1vdYWb}jYupcZQ0zU-#H0Q|^E`-NnE~#y~@l$7Y zU(pASQW5b743&!%v-2uz)`Y!1A$+E7)wsTq>6rVV1dga1o5uab*lr3}WQzISnKNfI z-Gq|1((SJoZqJ~NaD|m!rO{T$p7-)D_#LHiURF&jXj+U72a=FM{9Fte9cKF~y>eV5 z5%-g)PqHvlqw>64$1o3qr#U;QF}`71zyvUe*RNh@hU+^C;b_!K_{4bYjo8kI_eFw2 z^3_Ax(!)q-rI<-nmG`p*bJN#uQ_yLyF(ycOu-rm%c=_UG{z+(rwGx4LZXNNb>OJMy zLvkPKo;(Z112cC&+<0|eiuTI$PU`;9o^^_|;Os=Ye2j*OiJRroC`BP};R-`f&RAGo z*3o*Suc|fa`&hha=T&Kn>#WcUnidlQhIzP~su_((-@h+@ItVl>rhRC0^FoZ$CTJ#c z*dislAEN6ohGH#ZC|=P#_IMV)x!7|1w$7o0hc@QYMA2)RDPtz?ot1L@*zx?m^U5ZQ zbaaZuqjW#Lga^UmMaUAc{YHLghMFw8$dsBk;@$`w@h#t3wF1I&^qetu*PczYVWoSr z2B%J)%$DJ+zly1uXsE0dxnHz_Ry+gxa{p*SM|m_tA@P~==Um$)Rzlr1X6a361x<^I zAWU=US8VyIJ3(@uskRuqdmYzpmgl}FCg7Q)8v>?9+w3L4qMiX$z$9p?G)(uwb@KSp z;|(7=jq_w;AQA5hU>agS&$^$d)rLkpYtZg7x!Xy23=-IRAX^fo?zx}!fSJ3Nb(s}y z_#Q%o@E`~YlkBog0$<@V!H8koU$0l))<4s(?<$nC&)HhB#{@#InM(9lp3ZB{-IM#L z{9#E4oiZbfeDhw{vGZ2lgMxdol~pLMv!mOaxKGA;8&>aQh7rn-#*3?Qm_T zh%sU(G)V)ofOSDQxL&v>>W)MZm*8Hjy1=a8{^V|pjG;389y9TM7~#AMGBH97E&|nq z5H&shU_I>%+L>h|UG!RXPky;kkQpz}=XW7s?D4GJO=xUwt%%vhq+Uu*HLetA&iz(n zFS+koQU*LjS@8>c@!aS&XmHxk*0!K&F%e)8qoxYa8qpK1uDi)0br@MH5nGAgVi1!U zF@D$dJ{o3S5G4KFZXvj;mRHoqB}3HRC)dDa zd%5v2zbM2kU(b6L6&_6SoR1$rBtQOadcsvtjnLczPAXs^hmEL$(SS^SX%=*eWYu!f>mtNcAa`{PeVxAJLv8(Klr0EA${Sd4a+ z9%|#GEx&`PaI1-PCKd@%7g0wO*AnN}?OR#El-&z^_wLL4@yjp2xxQM79m$$`_wMb?+&NXmx{S-92yK>N*`nC$pxD@R{Gcp2?0u1` zC}HGpI@8-sGu12KUFkf2@;F;Bp%hV2(OGrWMSyEgW@N9f?2|+rqnQJun9k;6S~Ow7 zU$Z1Wyf1=z+)z1?nhr8knI;oKz80H9v}3802p~931Eet$B;jsT??Pae4`mc6`V32? z>;ei4wO{=UR|tQ3H8z1h!uMX?bMKvY>hdtShv?0<*-qQhts4U^r|@od#J)y6vAqA` z%6(NSHbr+it1Ma9r%qE|RyMNfT(6peRz@gD)8s9!pqU{e1z5WY2TU**Az(BF3xN{B zVZX$FM`?K(jJmb?bow1U}z(HPb5s_v#q@^j$FuIx7En z?cVj(f%X~gN8Tmvv^pmq6OPQICMp*ZJFp&Tbu--^VidL7s&<<0*B}&(e{k+&22ISw z!8^>esq%s-LZ%c^h>jjTmiJ|t#W}6Q)G}H@Gi6lMBrza z#s}?0#mysnf*FfEObfRs=gyzY0-&r368!xRu7i(xvP4)U_KlE=);zglJ_(=arOY9% zdAK#IZc$2!47R2U8i?8r!X_p?*1cEsO(?6uc{!&zQQ6#TcTl5eShV6FgqSHW<`8MUQNW4@R?~MA zB9W4e8PHm*?lbREz^S7`laoNgZRi;Y*cekV=$@SqJ-gm?6|OePr9aS*(F8H+HFujx z!X0fz<4^oE=(7w$$Qp|`9zJq-!!nu&W-e$VJ=DU{f#N>Q(ajkdiHA{hJadx|+Yp)e3G(U9_0Y494Q!mN@-*l*A3c_@qAg{FR5 z>v;b1`6cY7+>*i26^ z#9(d8+MYE$nhx=^KBHz^3`YdmSsRp_I!{W%BIawL2?Q;zWU>_tx<&{M?hzqbYm7D2hc?sz)U{fgXL?JahC4(}2@j%A%Y{ zM}tL%^+jWm41f=?c%q|1ZsMARNd*7PsnKZ6`|wr6^Y$er#_wk3mYsTfv%|yvfY74K z)#CVfKPH?HY9df(U(@{4;pTIYn4|ml?(4iu&w~ktU>OIleIyYRfm_!0ti$%MHP~u_ zn?qi=FU4B2G+B+9-Y{Xq!gMH$IXv&vXCGw2f<{l61Jdbi9PaDgmi#fjvz(sn-+L3Y z)jYEd@4s>5W)_0nBP%Q0^L+R^RrgH;`WIKCEMkbO>3LW8ucqfZol~;?ZBl*awi>LN zE(HoV32aJu#CN%Z@gK^KUTM)2uN>3$KB>=?0d(dX5;0~W@TV$h94y6U9?ZcW#dXA& z{piMxPLqJiht{y8+rR1hz3UV00!-`MliUkcw@!JORg2BR8h%>;v@s5s5+soAunn>j z9Z(8DfufKuhL6c4TiL#{(JeW@BmEtnIQZ4;5l!JP-6$kfZKA@DKD9X%M%)4)u48nvkBf!d_M1*xT=pKD`$Icx~ zwa=}aY;wReST^_W-ODspU0aF~+D79t`*>fxzidUud&JCUf$g0sBC6X*arMyHN$aZX zXx7NRq`I?9{_&50(`BfLZc~bMgAQwq*ri}Rdi3y{zj4n+Lct)Y2B)aB z^-?V+g(hUFPEF9{&a>T-q;+v9xeOf2a);4rV*-Eg(!uInGCsd9EU z-)PFT=Y9f&#fJ%9IDa7t*uh$?zsYiIF&^yIm82L@24bJXl2LK3qwT1SK4%Li*Vupm z``>T&kR@Y|%#EbD48w^;hwiVnvD{KrNt7a?z{S|Q7;gc;k^)jhPJN^ubFWDl^rX68#K142YaCnOtj|+6wOSF zv}XbRQIIX3ZhQAK&{vM_B)S^b*_m>t4rkoypDkK64O6jbqKf_I2*Y#)WF68nvn|@v z?9T3@ZQHhg)5&xa(DvQ6xwX!nJDc4nQFumx4C<1b+k_;>5G~_-fzbNTfBw_=8ZmQT z3}D!^xtEo0`s=9XaEu~|amrgAtWQCA3Pw5I*uHabmDBR;&|I!@xO+FbOD`p1^)T-h z!ExgFiJU+%tP6qtp|m_qpKTkbwpcbyMbIc3`k0tm-Ps%%XS7RqIP+YV{Y5+M&X;Yu z_5qWm=}FU@Bq*R?zI@(DMI|63NMEF~zD=%-r_eX=@_cB}ex0q2eD zL+K;vU*+f1XKlOu7R!f;3!1XfsB3)$1!-4J$_&Vv*n-vTK-=6V*|NCE#OK{~>Yk0OI z2pI0t%a<;9Zrr@_l|Zm3gpDd|0!NFaXHTCEwFc2nx&Eupo{8;92rdqgWmUlKK>kyE+@e?;JvmzdS2@QiypC4trT^jU00?buFwcn(D=impUIle%N3- zF*klQ#dQ%t9>pcd`WjW>#1zEHpbK|hTcusN&EUneOdlCa)WVe>odvrZ4 z)qRxxp~$eFSyzkP37|!bL6~?`%}5a)wHc;^8`Izd;kR}er5aCzG5Wr!UFetX7Tr!` z2$_F-zrs@e$7I)Sri%e<#&zn%XMnY*2iB-rdDc}CA(x;Gw^xZ#K5d(GZh&=1S+GV$ zKeKNKN<}9K0?9h&b~c-6m>LM0la)xwv|YJdEHfr5Xb1*^h6ONg`;6SdHo2_0;S?N= zGK+mwU@Qhw)oHL8%@YY7FV9KfMCruqMilV=2;b$Eb z!sccEd~3<{My&0b(`RyLZi1y(&$+*Htge`olwE4crP|q6tnnZLZV#OSF`w1deVMk0 zP5NxnVi_<|K_gw%Xj&RNS45skkz6(BlJ>_sIhtGrZ{NNdYMr=_1I&_{mERge;W~*C z2BQFT3OC=bUAq&rS3JvsWx<&g_%&sl8NhO3ki zj!wpPCR zi?m!pC-&NUp&NhC6DHH&49${!A%?+P%LVxKz>`oFL1`G<*itYp4Y>RBoV8}6fG5WfB zRWl6(ksTLF6UHk%dGdJXi43e7-_PPg-(q^NUcc&mOh4Dxi}4LH5YOLPL+IV_2qiP$ zU$*Jw6M;3g#uO3z67!ipfBD?`^zlU7;9HJBe4NF-k;O@hJd#p zguBMPFP=Yd*S;Z`nV^xz=^*y1uc7_@@Wc1Hbw{sREVD%PKAVSC6(b7Py0HoqJgvu~ z7x7tBmMVrU?pBUVVGuFYEi4|wgvEnas_sSC;Bpi5bFDU*-h70j6#^OakGR_~K@bXt z*cLjXa8XivbyX*fSUCg|Ws%FC;@Vo0^T$jC4PyD}r=K#@tXeCykSpI^={!hUF1JV% zG!Tqz?MSk|e*1N1X}~mO*3`j+2a1V= z=a1WeMXl&bJewfJ=E!rtd@}8V8Ah z!E9p&&Tqe6n`+I_EaCa|3iCWwA%p3#N=z+1bf}2U5k@axyv*y6=k#nlwQ-#)ZK!9# zOw2_e6!&W}Ti93W-pAAVF^-y5!77#Z|M6qt3dQ`Leb#H#Em1(ri4ykQ-Z~$njO_@p znq_smhIDetH*GW7`C%r422oY}d0`~nWls}jmXOXaG1`0zolb)judnm`@K1Kq4E zt}=)0>eZ_wr&Tu@SsP96j@;F_GOs*f%h%UG<&^Dz{_~%iPH3(mF~mMdAn|()tD4%) z>WlUdt5n>j0w_2YK`6?KhfkQ-JAn?YP&?6i8MPJ<(`;#t~qot}By_ zcD`)d76D3I<=X0HZ8-2ncGjK^3&xtr#tUsWreRti*Yo$Pn~b$|>eT64T^(9X2hkCP z;zamU97jpii1tp=Dv1?iulv!?C~yz%Ese|%GqGrP@7cZK4nmYP48(=WHnkOs z`-(R5nA>J*dLm0H8ggQ+p8N6RCnLA4StLZK1k7WQ8<4y7O0rmJw$_72i!l&T*1T*9 zxy}zi{P2w%4I_H-;(2z%wXvGn!+DnI!|EKTz}h}jGPu`SvG)5+5<1(Hf@-_pym_7f zz8QW&&`?-dO)ZVg2Qv{gd-v?k)z;BVie}GM)bwmBhX!#wNL(|Bf7smksHF%EoLj&r zjEH`a+;MMSzgc?o9n)D&LY1{T2-Z{IHSU(|7EAOHR;2%rOf>6xtlNvO*V++iEFe~M z+h%`u2usF!7DoZ599iQTM{&x@1N&AxYe&~QpS1G%^11Udxm7pkWT!s4&w7Oa!hK*Qv6kAX=;Cao|;S8f7p60YzTqhacTCKv-|vbwrI z5#_H_Z<0Al(5m^Ji&(&^EG$jc^i)M{!1nZ>B3<)!GVkx*yPMwoexaUmlCUP+go3cc zKuF6rBW(EffyRkeT!U4E;e7n~A;r5sQP4)WqYh$%`nI~fMW>kYmtbl-NTVDJPE<=I+I)@pva`0Jw0Za?M zM5pgMK6Ptv+_&#-F?~=5xGGuulS;*(MXWYvPqmmmW+G@5YK~HD)npJVZShxsM8ZRz zy;gMj=bz6ugmffM5HJK4*GwHj6S1)`omSY-0`|rJF4C~J=oGF&>ms06?HHhQiY{;m zE{cLX6F~#*pslR|F{(ONYmx4~>#OFXg87&jhQNgqjVbFKrrgMNy``~fBld{Zxky2E zG_`y8p3eJs%}#HoY)SD(`;>EuE-`*xJj|@5T`3mHFjHf+C~m-+37QsL1GKF=nr`lB zy?w`5)?rk0M_;V}_y7K1K48QA_THPd)z;FSIw%sbXlcSMZSmBm(}>KtnAod@4xw%| z$lBVG&fye(P#R%?p?I-4=A;CTGgQnI+nJM?CLLpL1x<^I0>OTGKm0H|_mt;Xi)=sBIcLj1S%FoxV%bkwipXgh69J_>trFhmV?;# zJDV<|QD)tNee*=PT?6HrK}`k=CAwXsXW5w7u3zumxbgQi-WVe?sePcR>9xq4U>29Q zP!z#Qq7^hPCX8*}*MN6)8J0eB5=AsIt-{~yrYiGYZ-qkGc|)C2C%1HIcGFi%itZz2 zL4%&^xMAlF!UNrNo5lUdY@+~oT1=j2GrVD7b}tK>}*t)OW!Q52(?2a}ZpUv^=z zX!wVvI)ek|{{=#aVba=Ni~g`r?oS5EjP~l)>tw#) z$p4RF)X~_uNT4m$oIWTAF|e#j2n(6}N4=gz1x418(#$$AN?q^5CR@F64hTa9&%FdX zOGD=bt$)zI_f0~0QtAle^0}NOT0ye}2%qjKagAw#rsdENLV5Ht5EB3X_rHr;n8XN} z@9*Bd9UAP6E(EmKwtv+uu&uELj|UFy&)R;(VPs|PP0ET`!`pZ7a@T<-CjmGUnu*HT zlsX;)u~&LOK`NG`O_LzL#DPf&hdL8aH;Y!#EI5MMGI?o47%uHZ>|?M1M5(X#VPY4RNY|G@tJot3oSTv;Ii{NBGQVG;#&H21lt z4@+zX&4PpPSv-R|jo1(!vzqW3XUuV)ews9_5Hhr{qotTSygEw#A%;b;>z*2ni60)IvOTvUBzf>uekn~&tI|?7xQx_0rYMpd8A(lUD zHy+bhr+v^1|NRe1z#UC%e=@Dj`pn!x<(Q1;Wa$!kEagbEZAznD3V{2a1WmY(=ezRV zcUiFBOP0Lz@aW;A{Oo>5nKQ~_l4C%saT3>dhOIGy?(F&gX^fbkCffAo1w{;l8f2|F z7zi?$VqI{F@NxHIX1>q-5yFCNEmD%p@Hv9Q!S4k^k6_{2bFFZ4UU-O+Qe>nGTkimE zTHTU;FI;HN(5Bssb=r*eUWK!Txf3LhpFGKl1oj)<+W$PTFP*Jhzu)SdJasY)q-nu9 z(esR@@A+1CtmHGjXlMn^f+9v04C+bbP;l{Zv9TQL0+XRF^~=)nom^^!2}V>+XD+_? zPG-WrTKBuQ_mtg04z}zd*4MCm^WI6Nb=Co^5tGTo*t&@f+>?)=JkGzv1g44Y+lx%9 z?cF#5<~~gU>$?P*&0S)#QB*>qh!_@voh_NQ)_F$txUAgjIc9*hXDKovi z0r|WBdYN6*r%#{RNVA^?C^l06Su^*OwZDiRFj_&gpok2!VKD+4k(z>I$Bx&Y*W!J{ zQXO4ae8eHYc;VtV8uqJKe`O|x0aW3-4sQfky@!S3Kn?m%&wMd4IIfXdHg&Yd?(N9h zkqryReM-QfL7z>UFF`)7)Zahh|4-(xFD!#j%vTpq& zUd6hZcUu=iFb3s~<4!`41nAzq`?8R!+_ z(lTcW>){^PKdpC8ck45NuvAgay~4_pVm=L6m+RNBXDf;&Ic;W>EzV>$dFJECk8K3~ z1KARNTUesH{Z3Px9|jg~)Sry2d{7po6r<@;vesCYPw{lJ5JvB=F*S2%E5MxY5e-j7cKgjI#&;`z{(iD|2n_Xm-DrU9^6G_T1SV zFS3u5vgTa3mj&DpEE#k`$gsS|fjwp|-bs5oYU_P;E_TwZIc$pp3zc;i#2ndFXV0AN z99=t_eV4oU?A{1MZw15vDuKc}z@QuiTI#T@9Ph(eUAqob=eM^9-doK;!W>->11Se; zY3bnt>$hjQcr#f;7(1=;&YeGIzQ68W911hD9$Y1a^;%kc_Y^Kh&qg3}qj}~EM)8nf$G`KM!}SiB};B+diHTItsjxSp%R{fv~^tzz9^1cXi9#(EB-SPfUhFsp`8 za^1QbngfbC$cpI&!el?|rKZ+fOyAs{8QQtzTDyDaPUl|IH0R+uAegO#wF_WIg5a#U zpf~sC_kTYBGim$Nvux%K`x4V1!E^tfTum>>XlhD8U%q@fUyF6z3sEqMse3OsZ(iQ&+mX;|eHKa7!Ey{br2>!9j=KW zXo4Zvb*C`#X&rB10_jFeGt!^ktEGe(u?wzIXp>rp0K%Y=euy>V&}%q8;vPwoCKHl z-EIpL!iEXH?4~T{cIaS=r6gZ@UEi=Zd;a42#=P-f0@<~^4-=q0`bo2AHTL_Sa?6Zf zD1T4H*a(-G4ruzDgNk{-|L{H^-gzTiR>zNZZr-@r_n9$VX{X$K*Wdqbd4;c^>rbYf zjJjnRW3VeR;7Mh@u?}KnG3a~{!|({1uz+U~_wc>ahw%>dX)h@d&Oy*FdL?jJb?Ae| zO$ljdAq_{P1x;v`yLRo~(3DqK_b1Kc;>MhKj4ZV)|2g2b?*;uhbc(UEf|w3h>n z+2tNr$^Y%}n_r@?05gnYGQ>$s3fIN3xhRuBZk>`$Y6oP}bGC61tLRzM+eKmC36+cuakNS|%0kg=zS4;{>|nmP;*<9Ye= zMd!N|q%J2=ST`=f_wV0j#b=)NCX>R4WO3Fl{2dkO$J!4YoY!LU&{#o3s1Pz-U}c7c z$YnTT0R1ZC{hq*?c3!)C#6S)v_mw%@vSE5L;c0?(l6xSHFxJ(Yy+~_F(DZY4(Y`Ut z5MuT~U>>6(ELe>MxxWj36S4$+zwh%k)`#1LTdB!zP3uBn*7du`JQR&L!&(az!shp^ z5J;h&HGNDP6p(2tR56oi(buTOw`i=OAy6FHav(KVl)rnMwP!H~!8;7G>i>=u%xSwS zB7ptJAGdRgCuUr&ke@aP8uu`4*jN?fJJzV5_DERMF!`hdm@hXaVIgyk;J`fX)1Wwn zYbkUjh@=TOS;&Nf^Xc>YNU8D|qe)`6}Xbt@ivs_)>*OMvor4uTwMhvuY5A|Pb>!c255i)ba<+?4AAE8hd#L+QZ zTr4cQY8!p@NYNpP%YU;^x4M~=1oWc1(cFK(9(Lm*Mv}K_!pnz7cLqSrF^3_ro;%9^ zmHpxfK3r!6j{>@5M~`)${rPMrE#zI_y=liGR`gu8^q8$MHUo!0iY4o2H@SDI(dB8D zn5en{f_hi_{nNC@y|VXw*7p!@m}+?+799kD{$AHoT#yTm0zp7}X7s2&2CSRs4>xVV zTA|tVU8|;CEpLq|K*jL1qYF1vB!J$WH5U9NmAM%5B^h85*QG^&G*-|=(G<-PF+0E* zp~KosfM5bK<7Ad~3z!TIKTo}zQ)ks^Qb|DMK!433J7#(K$l=bjr_VCeq-mQ&!}{PN zi}v`vfDsV(F~H1wmqFNY6|zvd`M3xv5J!%zB}->}wqzuxa94665h7fN)pg2KM$_M< zaQl5(5Jf9{aXl_z|6Vkv8g*9Z&!0=r_HKjT!s6TP^Ax?+)`oWRZn1c1v_*qyI;bZS zGt*D$Xd=S(iUtV;5?2ow(!8q3=Y23D-=9Si$r8ihJ;#p~>ng@WxL~jZ^`Peomypi~ zGp6}tnv2dLJO^e;d59inhYlUgLZ&=%6s);t|I~vfi$cHG*#g3d%Pv*x_Bxm6E@slv})kt(fXj*)|#0dczRgW_@%uW)G2-1Sg0`p;IJab_eq=bZ-<=r z*$SBg1Pg{mC>%JjKaYUzM_gPxEXBHOM}W~b#iJ1ItMvKMKK-QOozWh1?Q7$`-UDPhwqlhS@+1jmn`SeR_I+^Hi82^}M}>_42eX3y43P>N-- z2+Of7>EV}>B_jbv*}}NW39X%*a?#zllLBS)!}|}N$4?$-1xffWu8 zS6pUXTG`fZsC%d@?BAUo!L46`yER)PNG zIqvl_r;PhtxzLjEp~bpp1kC*|7=_OrKXE(@s6}idS;Pasq~P}PEKvGcf??sDO+uAN zsIIVyu?vJvHMO}AHZQUjY9G9}$qbXQ;6@E)gkbC?WVo}=oj;$}X?y3u!2?;lewNmj zt87w5ym>ZEx3*+m&3Z|$PP&uVFTH7q@Vb{-%2F_|5HX!cZySG^=ILxD1Hr^kp%~j@X-FEHX z)j6I1{;@~ubQ6G?i_JV4P+S>t83JG>J@1Vh*E0p6L(CQto=009 z&v5a=#ev;~9b!#FW$+Okb)MN;>0I$TeU^}}UZ3E(_4}zK3PjvwnZ4VbxCzvh~G6mk-f`&RemZXMH1c}HuJdhVWB*RyVJ+hQV&RAJftn&VgmvCjc$$|J;Ca;4S_}n+&i8a3uN2w{P2?8P~X#=d@R^thFb` z!o9=_DrcB+AC*&~mjSe8L2R9!*Vc~qO&5>8X9Nd^TSuGUXmgXSLh+2XwIg|-#5H_} z_ygwIwDpWExpLN-H4@kBSGzS05c-l>V!XS!)}Mbqn`v|17K70Wnk@ixa(3+4nOtM{ zJLBTysgs?{mo8^_g@AdL+2*zv=Pz{b-M_bRy}O11Lwok@&ukeIB+(6_ipcblZDpP6 zr0|9-D%^8=&xO^rXV2~|Y*;r zK1^?1i{{b8M|rG31cR%{v6^jP7P{ZrAQWSp@8@+4K@y#w%fNJ{iE}S{Z?E@ML742= zxubLM?xU}mb+o)`hl2G7fiFg8joP&4=Algn*aE=xxHn`)jf-gi(@V%i!RM1F%U{DF z27$4OPl>1W%D%Ghzx?t`Uiave)(`5DPMtp0x%0=J?0zaEtfrQay$c~B*sr*;pRg%LU0moqO#)hKZdHi; z{}@%?qQxSjrQ9t7aRN+Cn(j0hmMVH}Rc_z9y>PAW#{uh3#+~*3v73cgg}+_DcCDvn z6D{%ylU|)0BosvFfkm!MYO%G^3YskfE(J9q7#i()SWV3+P_sazkMRLp4c1gW%>4%s z@;YeGUKI*rR$?|{WdujGXYp@VCd;VW%7qY;cu`DGo&OZq7A-c5HtTE)Ax0Bpb~1Eg zLgr?HQMwK*Nq~H-XZjE(TxBdfF`Md0?3hMMxUc}Z+N6T3z3G*q7d`6y&HJr!D{NXU zBB)(0!^oJ5(aWmOG03`1jDX=H;s(M9Y4h!5#J{1>7ORnfU`19_pb41ozyChh zHr={?E2riXOgqzB?n&0ou3hQhJ9c*VA2^WrihvULnrHXj7A?j>D`>Vba;DR%Q<*Ww z7~S$5ln^}O=D`eohJYeyqBw8a>SZPYYo*r4+G_2ifRQVVWg-P!wwfuiS_Aq04%O`4 zCY4-h(c(Q%lbu6tN{begL@Q{vI54>wjI_FMH4(#?qJy&`R*B&ukR6F>iX(V^PK@w% zauJEgENiXIq!44FS$>g#L142`qD2pZLa-3<*3-Y2rB_^w7J*jKwAcW~m^ zniefuv}iF^w1TEZixw?fOckx5Y0;uZixyKwD`;A@Xwjm@RM85W7A;z|Xfaj%|Lg|c UGabXcEdT%j07*qoM6N<$f<<1UO8@`> literal 70575 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 =*b&nGAWm3VitcQz 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 diff --git a/Telegram/WatchApp/tgwatch Watch App/Auth/PasswordEntryView.swift b/Telegram/WatchApp/tgwatch Watch App/Auth/PasswordEntryView.swift index 7c342256ec..36b26e4551 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Auth/PasswordEntryView.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Auth/PasswordEntryView.swift @@ -6,61 +6,106 @@ struct PasswordEntryView: View { @Environment(TDClient.self) private var client @State private var password = "" @State private var submitting = false + @State private var errorMessage: String? + + /// Drives the error `.alert`: presented whenever `errorMessage` is set, + /// and clears it on dismiss. Mirrors the optional-state→Bool binding + /// pattern used by `AccountsListView`. + private var errorAlertBinding: Binding { + Binding( + get: { errorMessage != nil }, + set: { if !$0 { errorMessage = nil } } + ) + } var body: some View { - ScrollView { - VStack(alignment: .leading, spacing: 8) { - Text("2-step verification") - .font(.headline) - if !info.hint.isEmpty { - Text("Hint: \(info.hint)") - .font(.caption) - .foregroundStyle(.secondary) - } else { - Text("Enter your cloud password") - .font(.caption) - .foregroundStyle(.secondary) - } - SecureField("Password", text: $password) - .textContentType(.password) - .accessibilityIdentifier("passwordField") - Button(action: submit) { - if submitting { - ProgressView() + NavigationStack { + ScrollView { + VStack(alignment: .leading, spacing: 8) { + if !info.hint.isEmpty { + Text("Hint: \(info.hint)") + .font(.caption) + .foregroundStyle(.secondary) } else { - Text("Continue") + Text("Enter your cloud password") + .font(.caption) + .foregroundStyle(.secondary) } + SecureField("Password", text: $password) + .textContentType(.password) + .accessibilityIdentifier("passwordField") + Button(action: submit) { + Group { + if submitting { + ProgressView() + } else { + Text("Continue") + } + } + .frame(maxWidth: .infinity, minHeight: 36) + .padding(.vertical, 6) + .background(.fill.tertiary, in: RoundedRectangle(cornerRadius: 18, style: .continuous)) + } + .buttonStyle(.plain) + .accessibilityIdentifier("passwordContinue") } - .disabled(password.isEmpty || submitting) - .accessibilityIdentifier("passwordContinue") - if let err = client.lastError { - Text(err) - .font(.footnote) - .foregroundStyle(.red) - .accessibilityIdentifier("passwordError") + .padding() + } + .navigationTitle("Password") + .navigationBarTitleDisplayMode(.inline) + // Force the nav bar to materialize so the title renders under the + // clock — watchOS-26 skips chrome on a NavigationStack root view + // otherwise (same reason as ChatListView). + .toolbar(.visible, for: .navigationBar) + .toolbar { + ToolbarItem(placement: .topBarLeading) { + Button { + returnToQr() + } label: { + Image(systemName: "chevron.backward") + } + .disabled(submitting) + .accessibilityIdentifier("passwordBackToQr") } } - .padding() - } - .onAppear { + .alert(errorMessage ?? "", isPresented: errorAlertBinding) { + Button("OK", role: .cancel) { errorMessage = nil } + } + .onAppear { #if DEBUG - if password.isEmpty, - let preset = ProcessInfo.processInfo.environment["TGWATCH_PASSWORD"], - !preset.isEmpty { - password = preset - submit() - } + if password.isEmpty, + let preset = ProcessInfo.processInfo.environment["TGWATCH_PASSWORD"], + !preset.isEmpty { + password = preset + submit() + } #endif + } + .accountSwitcherSheet(presentation: .sheet, logoutAffordance: .suppressed) + } + } + + /// Returns to QR code entry. Blocked while a password check is in flight + /// (TDLib rejects `requestQrCodeAuthentication` with a pending auth query). + /// On success TDLib transitions to `waitOtherDeviceConfirmation` and this + /// view is torn down; on failure the message lands in the existing alert. + private func returnToQr() { + guard !submitting else { return } + Task { + errorMessage = await client.returnToQrCode() } - .accountSwitcherSheet(presentation: .sheet, logoutAffordance: .suppressed) } private func submit() { + // Button is always painted enabled; ignore taps when there's nothing + // to submit or a submission is already in flight. + guard !password.isEmpty, !submitting else { return } let passwordCopy = password submitting = true Task { - await client.submitPassword(passwordCopy) + let error = await client.submitPassword(passwordCopy) submitting = false + errorMessage = error } } } diff --git a/Telegram/WatchApp/tgwatch Watch App/Chats/ChatListView.swift b/Telegram/WatchApp/tgwatch Watch App/Chats/ChatListView.swift index 5f41b221b7..01906670fa 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Chats/ChatListView.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Chats/ChatListView.swift @@ -6,6 +6,7 @@ struct ChatListView: View { let store: ChatListStore @State private var dismissedLastError: String? = nil + @State private var opener = ChatOpener() /// Bound to the outer chat-list `List`. Re-asserted after every pill tap so the /// digital crown stays glued to the chat list, never the pill bar's horizontal /// ScrollView (where rotation has no useful effect). watchOS otherwise routes @@ -24,8 +25,8 @@ struct ChatListView: View { } content(proxy: proxy) } - .navigationDestination(for: ChatRow.self) { row in - MessageListView(row: row) + .navigationDestination(item: $opener.target) { target in + MessageListView(row: target.row, store: target.store) } .navigationTitle("Chats") .navigationBarTitleDisplayMode(.inline) @@ -78,13 +79,16 @@ struct ChatListView: View { emptyStateRow(loadState: folderLoadState) } else { ForEach(Array(store.chats.enumerated()), id: \.element.id) { idx, row in - NavigationLink(value: row) { + Button { + opener.open(row, makeStore: makeHistoryStore) + } label: { ChatRowView( row: row, onRequestDownload: { store.requestFileDownload(fileId: $0) }, onCancelDownload: { store.cancelFileDownload(fileId: $0) } ) } + .buttonStyle(.plain) .onAppear { store.ensureChatsLoaded(near: idx) } } } @@ -101,6 +105,23 @@ struct ChatListView: View { .padding(.top, store.pills.count > 1 ? -20 : 0) } + private func makeHistoryStore(for row: ChatRow) -> ChatHistoryStore? { + guard let loader = client.makeChatHistoryLoader() else { return nil } + return ChatHistoryStore( + chatId: row.id, + chatType: row.chatType, + lastReadInboxMessageId: row.lastReadInboxMessageId, + lastReadOutboxMessageId: row.lastReadOutboxMessageId, + unreadCount: row.unreadCount, + lastMessageId: row.lastMessageId, + loader: loader, + selfUserId: client.me?.id, + userNames: client.userNames, + draftText: row.draftText, + coalesceUpdates: true + ) + } + @ViewBuilder private func emptyStateRow(loadState: LoadState) -> some View { Group { diff --git a/Telegram/WatchApp/tgwatch Watch App/Chats/ChatOpener.swift b/Telegram/WatchApp/tgwatch Watch App/Chats/ChatOpener.swift new file mode 100644 index 0000000000..406fcee0af --- /dev/null +++ b/Telegram/WatchApp/tgwatch Watch App/Chats/ChatOpener.swift @@ -0,0 +1,64 @@ +import Foundation +import Observation + +/// Carrier for a pushed chat: the row plus its pre-built (warmed or warming) +/// `ChatHistoryStore`. Navigation identity is the chat id only — `ChatHistoryStore` +/// is a reference type and intentionally excluded from equality/hashing. +struct OpenChatTarget: Identifiable, Hashable { + let row: ChatRow + let store: ChatHistoryStore + var id: Int64 { row.id } + + static func == (lhs: OpenChatTarget, rhs: OpenChatTarget) -> Bool { lhs.row.id == rhs.row.id } + func hash(into hasher: inout Hasher) { hasher.combine(row.id) } +} + +/// Coordinates "warm the store, then push" so a cached chat opens instantly and +/// correctly positioned, while an uncached chat still pushes promptly (with the +/// in-view spinner) instead of hanging the tap. Owned + injected by `ChatListView`. +@Observable +@MainActor +final class ChatOpener { + /// Drives `.navigationDestination(item:)`. Non-nil → push. Cleared on pop. + var target: OpenChatTarget? + /// Chat id currently being warmed (available for a pressed/redacted row + /// affordance during the wait; not wired by default — the wait is ~150ms). + private(set) var pendingRowId: Int64? + + /// Max time to wait for `warm()` before pushing anyway with the in-view spinner. + /// Instance-mutable so tests can shorten it. ~150ms: long enough that a local + /// cache load wins, short enough that an uncached tap still feels responsive. + var openTimeoutNs: UInt64 = 150_000_000 + + /// `makeStore` returns the store to warm+push (or nil if dependencies are + /// unavailable, e.g. no TDLib client). Kept as a closure so `ChatOpener` has no + /// `TDClient` dependency and stays unit-testable. + func open(_ row: ChatRow, makeStore: (ChatRow) -> ChatHistoryStore?) { + guard target == nil, pendingRowId == nil, let store = makeStore(row) else { return } + pendingRowId = row.id + let timeoutNs = openTimeoutNs + // Owned task: runs to completion regardless of the race below. Dropping a + // Task handle does NOT cancel it, so the timeout-loser keeps loading. + let warmTask = Task { await store.warm() } + Task { [weak self] in + await Self.waitForWarmOrTimeout(store: store, timeoutNs: timeoutNs) + guard let self else { return } + self.target = OpenChatTarget(row: row, store: store) + self.pendingRowId = nil + } + _ = warmTask + } + + /// Returns when `store.loadState` leaves `.loadingFirstPage` (warm finished) OR + /// the deadline elapses, whichever is first. Polls rather than `await`-ing the + /// warm task's value — `Task.value` is not cancellation-aware, so awaiting it + /// inside a race would block until warm finished even after the timeout fired. + private static func waitForWarmOrTimeout(store: ChatHistoryStore, timeoutNs: UInt64) async { + let stepNs: UInt64 = 16_000_000 // ~one frame + var waitedNs: UInt64 = 0 + while store.loadState == .loadingFirstPage && waitedNs < timeoutNs { + try? await Task.sleep(nanoseconds: stepNs) + waitedNs += stepNs + } + } +} diff --git a/Telegram/WatchApp/tgwatch Watch App/ErrorMapping.swift b/Telegram/WatchApp/tgwatch Watch App/ErrorMapping.swift index 0f89ed8557..8c0a2c18a1 100644 --- a/Telegram/WatchApp/tgwatch Watch App/ErrorMapping.swift +++ b/Telegram/WatchApp/tgwatch Watch App/ErrorMapping.swift @@ -8,6 +8,23 @@ func humanMessage(_ error: Swift.Error) -> String { return (error as? LocalizedError)?.errorDescription ?? error.localizedDescription } +/// Maps a TDLib error from `checkAuthenticationPassword` to one of three +/// user-facing messages for the 2-step verification screen. Unlike +/// `humanMessage`, unknown codes collapse to a generic message rather than +/// passing the raw code through. +func passwordSubmitErrorMessage(_ error: Swift.Error) -> String { + guard let tdErr = error as? TDLibKit.Error else { + return "An error occurred" + } + if tdErr.message == "PASSWORD_HASH_INVALID" { + return "Incorrect password" + } + if let flood = floodWaitMessage(tdErr.message) { + return flood + } + return "An error occurred" +} + private func humanMessageForTdLibCode(_ code: String) -> String { switch code { case "PHONE_NUMBER_INVALID": @@ -21,13 +38,17 @@ private func humanMessageForTdLibCode(_ code: String) -> String { case "LASTNAME_INVALID": return "That last name doesn't look right." default: - if code.hasPrefix("FLOOD_WAIT_") { - let suffix = code.dropFirst("FLOOD_WAIT_".count) - if let seconds = Int(suffix), seconds > 0 { - return "Too many attempts. Wait \(seconds)s." - } - return "Too many attempts. Try again later." - } - return code + return floodWaitMessage(code) ?? code } } + +/// Formats a `FLOOD_WAIT_` code into a wait message, or `nil` if the +/// code is not a flood-wait code. +private func floodWaitMessage(_ code: String) -> String? { + guard code.hasPrefix("FLOOD_WAIT_") else { return nil } + let suffix = code.dropFirst("FLOOD_WAIT_".count) + if let seconds = Int(suffix), seconds > 0 { + return "Too many attempts. Wait \(seconds)s." + } + return "Too many attempts. Try again later." +} diff --git a/Telegram/WatchApp/tgwatch Watch App/Messages/ChatHistoryStore.swift b/Telegram/WatchApp/tgwatch Watch App/Messages/ChatHistoryStore.swift index 87ddf2b953..4efc14ad25 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Messages/ChatHistoryStore.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Messages/ChatHistoryStore.swift @@ -39,6 +39,7 @@ final class ChatHistoryStore { private var files: [Int: File] = [:] private var trackedFileIds: Set = [] private var openChatSent: Bool = false + private var closePending: Bool = false private var isLoading: Bool = false private static let halfLimit: Int = 15 @@ -124,6 +125,48 @@ final class ChatHistoryStore { } } + /// History-only initial load with NO side effects (no `openChat`). Safe to run + /// before the user has committed to the chat (e.g. pre-warm on tap). Mirrors the + /// load half of `start()`; `activate()` performs the `openChat` half separately. + func warm() async { + guard !isLoading else { return } + isLoading = true + loadState = .loadingFirstPage + lastSendError = nil + unseenNewerCount = 0 + defer { isLoading = false } + do { + try await loadInitialWindow() + loadState = .loaded + } catch is CancellationError { + return + } catch { + logger.warning("warm failed chatId=\(self.chatId, privacy: .public) error=\(String(describing: error), privacy: .public)") + loadState = .failed(humanMessage(error)) + } + } + + /// Notifies TDLib the chat is being viewed (`openChat`), guarded to run once. + /// Called from the view's `.task` once the user actually lands on the chat. + /// An `openChat` failure is logged but does NOT blank already-loaded history — + /// the worst case is delayed supergroup/channel live updates, not a dead screen. + func activate() async { + guard !openChatSent, !closePending else { return } + do { + try await loader.openChat(chatId: chatId) + openChatSent = true + // If stop() landed while openChat was in flight (the view popped during the + // round-trip), honor the close now so the chat doesn't leak open on TDLib. + if closePending { + try? await loader.closeChat(chatId: chatId) + openChatSent = false + closePending = false + } + } catch { + logger.warning("openChat chatId=\(self.chatId, privacy: .public) failed: \(error.localizedDescription, privacy: .public)") + } + } + /// Anchored initial fill: when `unreadDividerAfterId != nil`, we call /// `getChatHistory(fromMessageId: divider, offset: -(halfLimit+1), limit: 2*halfLimit)` /// → up to (halfLimit+1) newer + divider + ~(halfLimit-1) older. Otherwise we @@ -186,7 +229,13 @@ final class ChatHistoryStore { viewDrainTask?.cancel() viewDrainTask = nil pendingViewIds.removeAll() - guard openChatSent else { return } + guard openChatSent else { + // activate() may have openChat in flight (the view popped before it + // returned). Mark so activate() closes the chat once openChat completes — + // otherwise it leaks open on TDLib. + closePending = true + return + } do { try await loader.closeChat(chatId: chatId) } catch { diff --git a/Telegram/WatchApp/tgwatch Watch App/Messages/MessageBubbleView.swift b/Telegram/WatchApp/tgwatch Watch App/Messages/MessageBubbleView.swift index aa1322c4e7..59622835cf 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Messages/MessageBubbleView.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Messages/MessageBubbleView.swift @@ -83,6 +83,11 @@ struct MessageBubbleView: View { replyHeader: bubble.replyHeader, onVote: { onPollTap(bubble.messageId, poll) } ) + } else if bubble.isUnsupported { + UnsupportedBubbleView( + isOutgoing: bubble.isOutgoing, + replyHeader: bubble.replyHeader + ) } else if bubble.replyHeader == nil, let emojiCount = emojiOnlyCount(bubble.body) { Text(bubble.body) .font(.system(size: jumboEmojiSize(for: emojiCount))) @@ -249,4 +254,17 @@ private let previewSampleBubble = MessageBubble( ) .bubblePreview() } + +#Preview("Unsupported message — incoming") { + MessageBubbleView( + bubble: MessageBubble( + messageId: 13, isOutgoing: false, senderName: "Alice", body: "", + photo: nil, video: nil, videoNote: nil, voiceNote: nil, audio: nil, document: nil, + sticker: nil, location: nil, poll: nil, sendingState: .sent, replyHeader: nil, + isUnsupported: true + ), + onPhotoTap: { _ in }, onVideoTap: { _ in }, onVideoNoteTap: { _ in }, onPollTap: { _, _ in } + ) + .bubblePreview() +} #endif diff --git a/Telegram/WatchApp/tgwatch Watch App/Messages/MessageFormatters.swift b/Telegram/WatchApp/tgwatch Watch App/Messages/MessageFormatters.swift index c7460e1645..674a8cbbe2 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Messages/MessageFormatters.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Messages/MessageFormatters.swift @@ -25,6 +25,26 @@ func messageBody(_ content: MessageContent) -> String { } } +/// True for message content that has no dedicated bubble rendering and should show the +/// "Unsupported message" placeholder. Uses positive classification so TDLib's closed +/// `MessageContent` enum's `default` cleanly captures every unhandled type +/// (animations/GIFs, games, invoices, calls, dice, stories, gifts, expired media, …). +/// +/// Service-message content is filtered to `.service` rows upstream (see +/// `serviceLineText`) and never reaches the bubble path, so it is irrelevant here. +/// `messageContact` is treated as supported — it keeps its existing "Contact" text +/// fallback in `messageBody`. +func isUnsupportedContent(_ content: MessageContent) -> Bool { + switch content { + case .messageText, .messagePhoto, .messageVideo, .messageVideoNote, + .messageVoiceNote, .messageAudio, .messageSticker, .messageDocument, + .messageLocation, .messageVenue, .messageContact, .messagePoll: + return false + default: + return true + } +} + /// Day separator label between messages from different days. /// `Today` / `Yesterday` for the boundary days, weekday name for the last 7 days, /// `MMM d` for older or future dates. diff --git a/Telegram/WatchApp/tgwatch Watch App/Messages/MessageListView.swift b/Telegram/WatchApp/tgwatch Watch App/Messages/MessageListView.swift index d653925466..3313d81858 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Messages/MessageListView.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Messages/MessageListView.swift @@ -11,7 +11,7 @@ struct MessageListView: View { @Environment(TDClient.self) private var client let row: ChatRow - @State private var store: ChatHistoryStore? + @State private var store: ChatHistoryStore @State private var presentedPhoto: PhotoVisual? @State private var presentedVideo: VideoVisual? @State private var presentedVideoNote: VideoNoteVisual? @@ -40,28 +40,23 @@ struct MessageListView: View { // next pagination is allowed. @State private var canPaginate: Bool = true - init(row: ChatRow) { + init(row: ChatRow, store: ChatHistoryStore) { self.row = row + self._store = State(initialValue: store) // Opens at tail → starts at bottom. Opens at divider → user is NOT at bottom. self._isAtBottom = State(initialValue: row.unreadCount == 0) } var body: some View { - Group { - if let store { - content(store: store) - } else { - LoadingView(label: "Loading…") - } - } + content(store: store) .navigationTitle(row.title) .accessibilityIdentifier("messageListView") .toolbar { ToolbarItem(placement: .topBarTrailing) { AvatarView( avatar: row.avatar, - onRequestDownload: { fileId in store?.requestFileDownload(fileId: fileId) }, - onCancelDownload: { fileId in store?.cancelFileDownload(fileId: fileId) }, + onRequestDownload: { fileId in store.requestFileDownload(fileId: fileId) }, + onCancelDownload: { fileId in store.cancelFileDownload(fileId: fileId) }, size: 36 ) .glassEffect(in: Circle()) @@ -71,72 +66,57 @@ struct MessageListView: View { PhotoViewerView(photo: photo) } .sheet(item: $presentedVideo) { video in - if let store { - VideoPlayerView(video: video).environment(store) - } + VideoPlayerView(video: video).environment(store) } .sheet(item: $presentedVideoNote) { note in - if let store { - VideoNotePlayerView(note: note).environment(store) - } + VideoNotePlayerView(note: note).environment(store) } .sheet(item: $presentedPoll) { target in - if let store { - PollVoteView( - initialPoll: target.poll, - currentPoll: { store.poll(forMessageId: target.id) }, - onVote: { await store.setPollAnswer(messageId: target.id, optionIds: $0) } - ) - } + PollVoteView( + initialPoll: target.poll, + currentPoll: { store.poll(forMessageId: target.id) }, + onVote: { await store.setPollAnswer(messageId: target.id, optionIds: $0) } + ) } .sheet(isPresented: $showAttachment) { - if let store { - AttachmentSheet( - stickerPickerStore: stickerPickerStore, - onSendSticker: { await store.sendSticker($0) }, - onSendVoiceNote: { await store.sendVoiceNote($0) }, - onPrepareVoice: { - store.voicePlayback.tearDown() - store.audioPlayback.tearDown() - }, - onSendLocation: { latitude, longitude in - await store.sendLocation(latitude: latitude, longitude: longitude) - } - ) - .environment(client) - } + AttachmentSheet( + stickerPickerStore: stickerPickerStore, + onSendSticker: { await store.sendSticker($0) }, + onSendVoiceNote: { await store.sendVoiceNote($0) }, + onPrepareVoice: { + store.voicePlayback.tearDown() + store.audioPlayback.tearDown() + }, + onSendLocation: { latitude, longitude in + await store.sendLocation(latitude: latitude, longitude: longitude) + } + ) + .environment(client) + // Inject the picker store at the sheet-content root (above + // AttachmentSheet's NavigationStack), mirroring `client`. The + // store must live above the stack so pushed destinations — + // StickerSetDetailView and its StickerCellViews — inherit it; + // injecting only inside StickerPickerView (below the stack) + // left pushed set-detail views with no store and trapped on + // the `@Environment(StickerPickerStore.self)` lookup. + .environment(stickerPickerStore) } .task { - guard store == nil, let loader = client.makeChatHistoryLoader() else { return } - let s = ChatHistoryStore( - chatId: row.id, - chatType: row.chatType, - lastReadInboxMessageId: row.lastReadInboxMessageId, - lastReadOutboxMessageId: row.lastReadOutboxMessageId, - unreadCount: row.unreadCount, - lastMessageId: row.lastMessageId, - loader: loader, - selfUserId: client.me?.id, - userNames: client.userNames, - draftText: row.draftText, - coalesceUpdates: true - ) - self.store = s - client.setActiveHistory(s) - // Build the picker store HERE (in the chat .task), not lazily in the - // attachment-tap closure. Creating an @State and flipping a sheet-present - // flag in the same closure races: the .sheet evaluates `if let pickerStore` - // against a snapshot where the store is still nil → empty body. Having it - // non-nil before the tap (like `store` above) avoids that. + client.setActiveHistory(store) + // Defer openChat to here (the store was warmed without it). Independent + // of warm: if the window is still loading, openChat proceeds anyway. + await store.activate() + // Build the picker store HERE (not lazily in the attachment-tap closure): + // creating an @State and flipping a sheet-present flag in the same closure + // races the .sheet's `if let pickerStore` against a nil snapshot. if stickerPickerStore == nil, let pl = client.makeStickerPickerLoader() { stickerPickerStore = StickerPickerStore(loader: pl) } - await s.start() } .onDisappear { let s = self.store client.setActiveHistory(nil) - Task { await s?.stop() } + Task { await s.stop() } } } @@ -270,26 +250,6 @@ struct MessageListView: View { .ignoresSafeArea() } .environment(store) - .task { - // Default branch only appears once `loadState == .loaded` - // (the .loadingFirstPage case above keeps the spinner up). - // .task fires once per view appearance; the guard makes the - // scroll idempotent across re-renders. A short sleep lets - // SwiftUI lay out the freshly-rendered VStack before scrollTo - // resolves the target id — otherwise scrollTo can land before - // the row exists in the rendered tree. - // - // .defaultScrollAnchor(.bottom) on the ScrollView above - // positions the no-divider case at the chat tail BEFORE this - // task fires (so the user never sees the top-flash). We only - // need to override that for the unread-divider case. - guard !didApplyInitialScroll else { return } - didApplyInitialScroll = true - try? await Task.sleep(nanoseconds: 50_000_000) - if let target = store.window.initialScrollTargetId { - proxy.scrollTo(target, anchor: .top) - } - } .onScrollGeometryChange(for: ScrollSnapshot.self) { geometry in ScrollSnapshot( contentOffsetY: geometry.contentOffset.y, @@ -317,6 +277,28 @@ struct MessageListView: View { // pagination so it only fires after the user actually moved. userHasScrolled = true } + .task { + // Initial positioning. This `default` branch only renders once the + // store is `.loaded` (the `.loadingFirstPage` case keeps the spinner + // up), so `store.rows` is fully populated — true for BOTH the fast + // path (warmed before push) and the slow path (warm finished after + // push, swapping this branch in). For the unread case, scroll to the + // divider; the spinner cover (see `content`'s ZStack) hides the brief + // bottom-paint→divider settle so there's no visible jump. We use + // `proxy.scrollTo` rather than `scrollPosition(id:)` because the + // content is a plain (non-lazy) `VStack` — `scrollPosition(id:)` only + // positions reliably inside lazy stacks, and switching to `LazyVStack` + // reintroduces the `defaultScrollAnchor` over-scroll gotcha. + guard !didApplyInitialScroll else { return } + if let target = store.window.initialScrollTargetId { + // Let SwiftUI lay out the rows before resolving the target id. + try? await Task.sleep(nanoseconds: 50_000_000) + proxy.scrollTo(target, anchor: .top) + // One more runloop tick so the scroll offset lands before reveal. + await Task.yield() + } + didApplyInitialScroll = true + } .onChange(of: store.rows.first?.id) { oldId, newId in // Scroll preservation across `loadOlder`. When older content is // prepended, SwiftUI keeps the absolute scroll offset where it was @@ -384,6 +366,17 @@ struct MessageListView: View { } } } + // Cover the brief bottom-paint→divider settle (the `.task` above scrolls to + // the unread divider ~50ms after this branch appears) so the user never sees + // the jump. Only for the unread case — the tail case is already correctly + // placed by `.defaultScrollAnchor(.bottom)`, so it reveals immediately. + .overlay { + if !didApplyInitialScroll, store.window.initialScrollTargetId != nil { + LoadingView(label: "Loading messages…") + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(Color.black.ignoresSafeArea()) + } + } } } } diff --git a/Telegram/WatchApp/tgwatch Watch App/Messages/MessageRow.swift b/Telegram/WatchApp/tgwatch Watch App/Messages/MessageRow.swift index 1a206b5ea7..17962fd892 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Messages/MessageRow.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Messages/MessageRow.swift @@ -55,6 +55,9 @@ struct MessageBubble: Equatable, Hashable { var senderColorIndex: Int? = nil /// True for a sent outgoing message the recipient hasn't read yet (`id > lastReadOutboxMessageId`). var isUnreadOutgoing: Bool = false + /// True for content with no dedicated bubble — renders the "Unsupported message" + /// placeholder. Set from `isUnsupportedContent(msg.content)` in `messageRows`. + var isUnsupported: Bool = false /// The delivery-status indicator to render for this bubble. Outgoing only; /// `isUnreadOutgoing` already encodes "sent, unread, not Saved Messages". @@ -184,7 +187,8 @@ func messageRows( userNames: userNames ), senderColorIndex: sender?.colorIndex, - isUnreadOutgoing: !isSavedMessages && msg.isOutgoing && msg.sendingState == .sent && msg.id > lastReadOutboxMessageId + isUnreadOutgoing: !isSavedMessages && msg.isOutgoing && msg.sendingState == .sent && msg.id > lastReadOutboxMessageId, + isUnsupported: isUnsupportedContent(msg.content) ))) } return rows diff --git a/Telegram/WatchApp/tgwatch Watch App/Messages/ServiceLineFormatter.swift b/Telegram/WatchApp/tgwatch Watch App/Messages/ServiceLineFormatter.swift index 0224b26f45..efa097ebeb 100644 --- a/Telegram/WatchApp/tgwatch Watch App/Messages/ServiceLineFormatter.swift +++ b/Telegram/WatchApp/tgwatch Watch App/Messages/ServiceLineFormatter.swift @@ -40,6 +40,18 @@ private func autoDeleteDuration(seconds: Int) -> String { return mo == 1 ? "1 month" : "\(mo) months" } +/// "{m} m" under 1 km, else whole "{km} km". +private func distanceLabel(meters: Int) -> String { + if meters < 1000 { return "\(meters) m" } + return "\(meters / 1000) km" +} + +/// "channel" when the chat is a broadcast channel; "group" otherwise (incl. nil). +private func groupNoun(_ chatType: ChatType?) -> String { + if case .chatTypeSupergroup(let s) = chatType, s.isChannel { return "channel" } + return "group" +} + /// Renders the pinned-snippet phrase used in "{Actor} pinned ...". Returns /// "«{snippet}»" for text content (with truncation to 24 characters + /// ellipsis), "a {type}" for non-text recognized content, or "a message" for @@ -105,7 +117,10 @@ private func targetList(_ ids: [Int64], userNames: [Int64: String]) -> String { /// Renders the centered-italic line for a service message, or `nil` for content /// that should render as a regular bubble. Pure: same inputs always produce the /// same output. See `docs/superpowers/specs/2026-05-16-service-messages-design.md` -/// for the full classification and string set. +/// for the original classification and string set, and +/// `docs/superpowers/specs/2026-05-29-extend-service-lines-design.md` for the +/// extended coverage (theme/background/boost/forum-topic/upgrade/game-score/ +/// content-protection/sharing/web-app/suggest-photo/proximity/giveaway). /// /// - Parameters: /// - msg: the cached message carrying senderId + content payload. @@ -225,6 +240,86 @@ func serviceLineText( } return "Group created" + case .messageForumTopicCreated(let m): + return withActor("created topic «\(m.name)»", actor: actor, includeActor: includeActor) + + case .messageForumTopicEdited(let m): + if !m.name.isEmpty { + return withActor("changed the topic name to «\(m.name)»", actor: actor, includeActor: includeActor) + } + if m.editIconCustomEmojiId { + return withActor("changed the topic icon", actor: actor, includeActor: includeActor) + } + return withActor("edited the topic", actor: actor, includeActor: includeActor) + + case .messageForumTopicIsClosedToggled(let m): + return withActor(m.isClosed ? "closed the topic" : "reopened the topic", + actor: actor, includeActor: includeActor) + + case .messageForumTopicIsHiddenToggled(let m): + return withActor(m.isHidden ? "hid the topic" : "unhid the topic", + actor: actor, includeActor: includeActor) + + case .messageChatSetTheme(let m): + guard let theme = m.theme else { + return withActor("disabled the chat theme", actor: actor, includeActor: includeActor) + } + if case .chatThemeEmoji(let e) = theme { + return withActor("changed the chat theme to \(e.name)", actor: actor, includeActor: includeActor) + } + return withActor("changed the chat theme", actor: actor, includeActor: includeActor) + + case .messageChatSetBackground: + return withActor("changed the chat background", actor: actor, includeActor: includeActor) + + case .messageChatBoost(let m): + let noun = groupNoun(chatType) + if m.boostCount == 1 { + return withActor("boosted the \(noun)", actor: actor, includeActor: includeActor) + } + return withActor("boosted the \(noun) \(m.boostCount) times", actor: actor, includeActor: includeActor) + + case .messageChatHasProtectedContentToggled(let m): + return withActor(m.newHasProtectedContent ? "enabled content protection" : "disabled content protection", + actor: actor, includeActor: includeActor) + + case .messageChatUpgradeTo, .messageChatUpgradeFrom: + // Chat-lifecycle event — actor-less (Telegram convention), ignores includeActor. + return "Group upgraded to a supergroup" + + case .messageChatShared: + return withActor("shared a chat", actor: actor, includeActor: includeActor) + + case .messageUsersShared(let m): + let action = m.users.count == 1 ? "shared a user" : "shared \(m.users.count) users" + return withActor(action, actor: actor, includeActor: includeActor) + + case .messageBotWriteAccessAllowed: + return withActor("allowed this bot to message you", actor: actor, includeActor: includeActor) + + case .messageWebAppDataSent: + return withActor("sent data to the bot", actor: actor, includeActor: includeActor) + + case .messageSuggestProfilePhoto: + return withActor("suggested a new profile photo", actor: actor, includeActor: includeActor) + + case .messageGameScore(let m): + return withActor("scored \(m.score)", actor: actor, includeActor: includeActor) + + case .messageProximityAlertTriggered(let m): + // Actor-less: the line names traveler + watcher, not the message sender. + let traveler = serviceActor(senderId: m.travelerId, selfUserId: selfUserId, userNames: userNames) + let watcher = serviceActor(senderId: m.watcherId, selfUserId: selfUserId, userNames: userNames) + return "\(traveler) is within \(distanceLabel(meters: m.distance)) of \(watcher)" + + case .messageGiveawayCreated(let m): + // Actor-less — giveaways are posted by channels. + return m.starCount > 0 ? "Stars giveaway started" : "Giveaway started" + + case .messageGiveawayCompleted(let m): + let winners = m.winnerCount == 1 ? "1 winner" : "\(m.winnerCount) winners" + return "Giveaway ended — \(winners)" + default: return nil } diff --git a/Telegram/WatchApp/tgwatch Watch App/Messages/UnsupportedBubbleView.swift b/Telegram/WatchApp/tgwatch Watch App/Messages/UnsupportedBubbleView.swift new file mode 100644 index 0000000000..b2d4eeb0e8 --- /dev/null +++ b/Telegram/WatchApp/tgwatch Watch App/Messages/UnsupportedBubbleView.swift @@ -0,0 +1,58 @@ +import SwiftUI + +/// Placeholder bubble for message content types the app does not render +/// (`isUnsupportedContent`). Mirrors the standard text-bubble chrome — +/// `BubbleShape` corner radius + min-size pill, incoming/outgoing fill via +/// `BubbleStyle` — and shows an italic, dimmed "Unsupported message" line. +/// Renders the reply header when present; captions are intentionally ignored. +struct UnsupportedBubbleView: View { + let isOutgoing: Bool + let replyHeader: ReplyHeader? + + private var style: BubbleStyle { .resolve(isOutgoing: isOutgoing) } + + var body: some View { + VStack(alignment: isOutgoing ? .trailing : .leading, spacing: 2) { + if let header = replyHeader { + ReplyHeaderView(header: header, style: style) + } + Text("Unsupported message") + .font(.caption) + .italic() + .foregroundStyle(style.content.opacity(0.6)) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.horizontal, 9) + .padding(.vertical, 4) + .frame(minWidth: BubbleShape.minSize, minHeight: BubbleShape.minSize) + .background( + RoundedRectangle(cornerRadius: BubbleShape.cornerRadius) + .fill(style.fill) + ) + .foregroundStyle(style.content) + } +} + +#if DEBUG +#Preview("Unsupported — incoming") { + UnsupportedBubbleView(isOutgoing: false, replyHeader: nil) + .bubblePreview() +} + +#Preview("Unsupported — outgoing") { + UnsupportedBubbleView(isOutgoing: true, replyHeader: nil) + .bubblePreview() +} + +#Preview("Unsupported — incoming with reply") { + UnsupportedBubbleView( + isOutgoing: false, + replyHeader: ReplyHeader( + senderName: "Bob", + snippet: "anchor message earlier in the chat", + minithumbnail: nil, isOutgoing: false + ) + ) + .bubblePreview() +} +#endif diff --git a/Telegram/WatchApp/tgwatch Watch App/TDClient.swift b/Telegram/WatchApp/tgwatch Watch App/TDClient.swift index 809f629dc5..9dd589f944 100644 --- a/Telegram/WatchApp/tgwatch Watch App/TDClient.swift +++ b/Telegram/WatchApp/tgwatch Watch App/TDClient.swift @@ -96,14 +96,38 @@ final class TDClient { self.delegate = delegate } - func submitPassword(_ password: String) async { - guard let client else { return } - lastError = nil + /// Submits the cloud password. Returns `nil` on success, or a user-facing + /// error message (see `passwordSubmitErrorMessage`) on failure. Does not + /// touch the shared `lastError` — the password screen owns its own alert. + func submitPassword(_ password: String) async -> String? { + guard let client else { return nil } do { _ = try await client.checkAuthenticationPassword(password: password) + return nil } catch { logger.warning("checkAuthenticationPassword failed: \(error.localizedDescription, privacy: .public)") - lastError = humanMessage(error) + return passwordSubmitErrorMessage(error) + } + } + + /// Re-requests QR authentication from the `waitPassword` state, driving + /// TDLib back to `waitOtherDeviceConfirmation`. Valid because + /// `requestQrCodeAuthentication` is callable from `authorizationStateWaitPassword` + /// when no auth query is pending. Returns `nil` on success, or a user-facing + /// error message on failure. Does not touch `authState` — the QR screen + /// renders via the normal `updateAuthorizationState` path; on failure the + /// caller (the password screen) shows the message in its own alert and stays + /// put, so we deliberately avoid the `.failed` transition that + /// `requestQrCodeAuthenticationIfNeeded()` performs. + func returnToQrCode() async -> String? { + guard let client else { return nil } + logger.notice("returnToQrCode requested by UI") + do { + _ = try await client.requestQrCodeAuthentication(otherUserIds: []) + return nil + } catch { + logger.warning("returnToQrCode failed: \(error.localizedDescription, privacy: .public)") + return humanMessage(error) } } diff --git a/Telegram/WatchApp/tgwatch Watch App/tgwatchApp.swift b/Telegram/WatchApp/tgwatch Watch App/tgwatchApp.swift index dfc8056beb..668da7a0bd 100644 --- a/Telegram/WatchApp/tgwatch Watch App/tgwatchApp.swift +++ b/Telegram/WatchApp/tgwatch Watch App/tgwatchApp.swift @@ -4,6 +4,10 @@ import TDLibKit @main struct TgwatchApp: App { @State private var manager: AccountManager + /// True when running inside an XCTest process. Computed once and stored so + /// both `init()` and `body` can reference the same value without repeating + /// the `NSClassFromString` lookup. + private let isUnderXCTest: Bool = NSClassFromString("XCTestCase") != nil @MainActor init() { @@ -14,7 +18,6 @@ struct TgwatchApp: App { // `td_receive` is single-thread-global — see CLAUDE.md gotcha). Hand // the test process a no-bootstrap manager; tests never drive the // SwiftUI scene, so its `factory` is never invoked. - let isUnderXCTest = NSClassFromString("XCTestCase") != nil let factory: any TDClientFactory if isUnderXCTest { factory = NoopTDClientFactory() @@ -38,8 +41,11 @@ struct TgwatchApp: App { .environment(client) .environment(manager) .id(manager.activeAccountId) - } else { - AccountsEmptyView() + } else if !isUnderXCTest { + // Under XCTest the scene is not test-driven; suppress + // AccountBootstrapView so its .task doesn't call + // ensureAccountExists() → factory.make() via NoopTDClientFactory. + AccountBootstrapView() .environment(manager) } } diff --git a/Telegram/WatchApp/tgwatch.xcodeproj/project.pbxproj b/Telegram/WatchApp/tgwatch.xcodeproj/project.pbxproj index 6514e9d26f..b1af92c605 100644 --- a/Telegram/WatchApp/tgwatch.xcodeproj/project.pbxproj +++ b/Telegram/WatchApp/tgwatch.xcodeproj/project.pbxproj @@ -21,10 +21,12 @@ 1773B32101D7CB51E65BE91B /* PhotoVisual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0240D336BD11E2613A457C43 /* PhotoVisual.swift */; }; 1D1502C120B3AF8B91C1A91D /* AVRecordingBackend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9127473C7DAD18736234B3 /* AVRecordingBackend.swift */; }; 1D4E75A6F594617ACD668616 /* SampleStickers in Resources */ = {isa = PBXBuildFile; fileRef = 72755AB1D5DB932DDC3CE2D3 /* SampleStickers */; }; + 1F7CEC07D0DBC5FD130AF942 /* AccountBootstrapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377FDFE2ED14BCD51D22429F /* AccountBootstrapView.swift */; }; 20167DF49E7A2E543B274E76 /* Secrets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A065521FE790E0BF29D1B3B6 /* Secrets.swift */; }; 20863684FA2F51495BB2A9A3 /* AccountsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 148D11BBC0B40441DCC8EA0A /* AccountsListView.swift */; }; 25F6B3EFED8EDDD9983CB0F7 /* PollVoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF0F4F15CB43635717B31B92 /* PollVoteView.swift */; }; 2A0FDF9EF2B8BE9F4C46FD4C /* RLottieKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5083D73573D84E386C2E3B4C /* RLottieKit */; }; + 2E2B46A1FFFDC24F47FF33D4 /* ChatOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED3696C9BA38845E621A1B67 /* ChatOpener.swift */; }; 3679D6EA591522207E69F8A5 /* ChatListTimestamp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCDFBD19F9CAA87E938BADC /* ChatListTimestamp.swift */; }; 39A386FFBD00EEE14B2B33D5 /* MessageFormatters.swift in Sources */ = {isa = PBXBuildFile; fileRef = E09479749C40E78AD852AF8B /* MessageFormatters.swift */; }; 3BA42E87FCC662196BB80B64 /* MessageRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F01C7C9A4B9948C0BB710E2 /* MessageRow.swift */; }; @@ -54,7 +56,6 @@ 787D692CF045D92B0DEFC1F2 /* TDClientFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 695248F618E8ABD4F9840F92 /* TDClientFactory.swift */; }; 79A01936CFB9168EC5ABD641 /* VideoPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BFBE65008CE5037F6DF19A1 /* VideoPlayerView.swift */; }; 7BF1C89F67290EBAF50900F8 /* ChatRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C2B6C3E8643BAF27074570 /* ChatRowView.swift */; }; - 7C375DD06A2EF2BFCCC62C7D /* AccountsEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9F5A0906CC20AEE02CA838 /* AccountsEmptyView.swift */; }; 7D835D5CE3C3B58799AFAF36 /* StickerPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9196F9ED24A5500CE7A073D9 /* StickerPickerView.swift */; }; 7DD192512B16EA3515244C22 /* VoicePlaybackController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E7405292B1E44847A760AC5 /* VoicePlaybackController.swift */; }; 80C0C6603FDC96FE26ED7658 /* VideoNotePlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A73BF3FB58AE7A1F8891DB8 /* VideoNotePlayerView.swift */; }; @@ -82,6 +83,7 @@ B14FB831F58FBE797B2E5E22 /* UnreadDividerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 677A0F85CE4C41873A7774C2 /* UnreadDividerView.swift */; }; B60D32384AEF65DF99757144 /* PasswordEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E86853697764EDEB0866DA2 /* PasswordEntryView.swift */; }; B777F8B2ACBABCC223BE25A4 /* VoiceRecordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 604A4F1FAB5820C300C709D5 /* VoiceRecordView.swift */; }; + B79AB6E8675A1A32B8DD9E4A /* UnsupportedBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8545CFD4F2B01CDACB225974 /* UnsupportedBubbleView.swift */; }; B8FB9BDD812396930990235C /* SecretsValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E049ECC956A583A92C5C7CB /* SecretsValidator.swift */; }; B9F6D473AA0F1DAF77799E77 /* QrLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D3A8FBA5EBDBFDE5AA2FFEC /* QrLoginView.swift */; }; C00221119F0E81D881582EEE /* VideoNoteVisual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D49A955BB3D23881CE8E150 /* VideoNoteVisual.swift */; }; @@ -127,7 +129,6 @@ 148D11BBC0B40441DCC8EA0A /* AccountsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsListView.swift; sourceTree = ""; }; 182DA99AD90B93DE2FB37A41 /* ChatHistoryStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatHistoryStore.swift; sourceTree = ""; }; 1932CC94F39BD57A56E59C08 /* ChatRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRow.swift; sourceTree = ""; }; - 1E9F5A0906CC20AEE02CA838 /* AccountsEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsEmptyView.swift; sourceTree = ""; }; 20DF1E1C15EBF3931AC3843C /* VideoVisual.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoVisual.swift; sourceTree = ""; }; 22AAEA9EF0EC8A548BB916EC /* StickerRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerRow.swift; sourceTree = ""; }; 23B6E36BD1D21CA9073903BF /* AccountManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountManager.swift; sourceTree = ""; }; @@ -137,6 +138,7 @@ 3448938C1F69F0D9DE679238 /* ChatPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatPreview.swift; sourceTree = ""; }; 35B32555B3686A7A4884B215 /* AvatarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarView.swift; sourceTree = ""; }; 36FCB0CB6A9A867B1E8BD673 /* OpusKit */ = {isa = PBXFileReference; lastKnownFileType = folder; name = OpusKit; path = Packages/OpusKit; sourceTree = SOURCE_ROOT; }; + 377FDFE2ED14BCD51D22429F /* AccountBootstrapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountBootstrapView.swift; sourceTree = ""; }; 3B4D75BC5502D8D705E859FB /* LocationProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationProvider.swift; sourceTree = ""; }; 3DAB96C768DF82BCF185BAE2 /* AudioPlaybackController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlaybackController.swift; sourceTree = ""; }; 3E86853697764EDEB0866DA2 /* PasswordEntryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordEntryView.swift; sourceTree = ""; }; @@ -171,6 +173,7 @@ 7889969AFF462911B9828843 /* MessageRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageRowView.swift; sourceTree = ""; }; 78DB439A3F9A5EA35ECDFB86 /* PhotoViewerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoViewerView.swift; sourceTree = ""; }; 7B0F1DD19A57CC68887E4F98 /* ChatListKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListKey.swift; sourceTree = ""; }; + 8545CFD4F2B01CDACB225974 /* UnsupportedBubbleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsupportedBubbleView.swift; sourceTree = ""; }; 8724043C70C9B97BCBA4712F /* ReviewVoiceBubble.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewVoiceBubble.swift; sourceTree = ""; }; 8D49A955BB3D23881CE8E150 /* VideoNoteVisual.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoNoteVisual.swift; sourceTree = ""; }; 8F01C7C9A4B9948C0BB710E2 /* MessageRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageRow.swift; sourceTree = ""; }; @@ -217,6 +220,7 @@ E855E4C62401AD1CF41D1835 /* DaySeparatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaySeparatorView.swift; sourceTree = ""; }; EB5C5FEFC91B0D5FDF164032 /* TDClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TDClient.swift; sourceTree = ""; }; ECA5A0C122ECD5BBB6EBBBBD /* AvatarVisual.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarVisual.swift; sourceTree = ""; }; + ED3696C9BA38845E621A1B67 /* ChatOpener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatOpener.swift; sourceTree = ""; }; F424F5E873CD24E281387693 /* ErrorMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorMapping.swift; sourceTree = ""; }; F595E3DA02BF871A797A649A /* ReplyHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyHeader.swift; sourceTree = ""; }; F59F34916FE776927C3B2CB1 /* ServiceLineFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceLineFormatter.swift; sourceTree = ""; }; @@ -299,10 +303,10 @@ isa = PBXGroup; children = ( BABCBE66AF47816CA3518036 /* Account.swift */, + 377FDFE2ED14BCD51D22429F /* AccountBootstrapView.swift */, 6DDFFE71E0C32258348A2510 /* AccountListProjection.swift */, 23B6E36BD1D21CA9073903BF /* AccountManager.swift */, 42427DC1E64A2F55DE8BE345 /* AccountRegistry.swift */, - 1E9F5A0906CC20AEE02CA838 /* AccountsEmptyView.swift */, 148D11BBC0B40441DCC8EA0A /* AccountsListView.swift */, 6B89EE0100295ED590F73723 /* AccountSwitcherSheet.swift */, 695248F618E8ABD4F9840F92 /* TDClientFactory.swift */, @@ -371,6 +375,7 @@ F59F34916FE776927C3B2CB1 /* ServiceLineFormatter.swift */, DF393D904BF677AC5721EC7E /* ServiceMessageView.swift */, 677A0F85CE4C41873A7774C2 /* UnreadDividerView.swift */, + 8545CFD4F2B01CDACB225974 /* UnsupportedBubbleView.swift */, 0386BF4C7B1D4BDAE0B73509 /* VideoBubbleView.swift */, D4AF5A180BB3A37832AC5349 /* VideoNoteBubbleView.swift */, 9A73BF3FB58AE7A1F8891DB8 /* VideoNotePlayerView.swift */, @@ -413,6 +418,7 @@ F824052186720912B44D8263 /* ChatListStore.swift */, 0CCDFBD19F9CAA87E938BADC /* ChatListTimestamp.swift */, 7108EAF6A69D8D59376A8914 /* ChatListView.swift */, + ED3696C9BA38845E621A1B67 /* ChatOpener.swift */, 3448938C1F69F0D9DE679238 /* ChatPreview.swift */, 1932CC94F39BD57A56E59C08 /* ChatRow.swift */, 29C2B6C3E8643BAF27074570 /* ChatRowView.swift */, @@ -508,11 +514,11 @@ files = ( 1D1502C120B3AF8B91C1A91D /* AVRecordingBackend.swift in Sources */, 0BE4BEE5802CD229F61FF464 /* Account.swift in Sources */, + 1F7CEC07D0DBC5FD130AF942 /* AccountBootstrapView.swift in Sources */, 7059458F1317797724013AC8 /* AccountListProjection.swift in Sources */, AAE21A407D0201F0A8630FD9 /* AccountManager.swift in Sources */, 8364AFF20E93D890EFEF7C41 /* AccountRegistry.swift in Sources */, 881BA28087741D8F6B406FE9 /* AccountSwitcherSheet.swift in Sources */, - 7C375DD06A2EF2BFCCC62C7D /* AccountsEmptyView.swift in Sources */, 20863684FA2F51495BB2A9A3 /* AccountsListView.swift in Sources */, 039B8E2B7418D9004EAF9533 /* AttachmentSheet.swift in Sources */, D1E96E63A3AE93646AD3F532 /* AudioBubbleView.swift in Sources */, @@ -533,6 +539,7 @@ 81C79089068A1B436DFFD2EF /* ChatListStore.swift in Sources */, 3679D6EA591522207E69F8A5 /* ChatListTimestamp.swift in Sources */, 4938F79EA33D5C8041A659C3 /* ChatListView.swift in Sources */, + 2E2B46A1FFFDC24F47FF33D4 /* ChatOpener.swift in Sources */, A8EF6F72C78B619893C05AFE /* ChatPreview.swift in Sources */, E48523AFA2E23409CC0C2C2C /* ChatRow.swift in Sources */, 7BF1C89F67290EBAF50900F8 /* ChatRowView.swift in Sources */, @@ -590,6 +597,7 @@ DDB206E2134B52F472D5E9FE /* TDClient.swift in Sources */, 787D692CF045D92B0DEFC1F2 /* TDClientFactory.swift in Sources */, B14FB831F58FBE797B2E5E22 /* UnreadDividerView.swift in Sources */, + B79AB6E8675A1A32B8DD9E4A /* UnsupportedBubbleView.swift in Sources */, DD9FB33F951CC225F8D5B3EE /* UserNamesStore.swift in Sources */, 939315A8C737DB06ED040E4F /* VideoBubbleView.swift in Sources */, 074BE3F4D6AB9EA220A8EDF2 /* VideoNoteBubbleView.swift in Sources */,