From 111b456a1d9e6c47b2ec61586087466f8365ceac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=A0tajcer?= Date: Mon, 7 Mar 2022 10:52:44 +0100 Subject: [PATCH] Added watch complications, background updates --- ios/Runner.xcodeproj/project.pbxproj | 17 +- ios/Runner/AppDelegate.swift | 116 +++++------ .../Circular.imageset/Contents.json | 1 + .../Circular.imageset/ghost.png | Bin 0 -> 42736 bytes .../Extra Large.imageset/Contents.json | 1 + .../Extra Large.imageset/ghost.png | Bin 0 -> 42736 bytes .../ComplicationController.swift | 47 ++++- .../ExtensionDelegate.swift | 67 ++++++- ios/watch WatchKit Extension/Info.plist | 2 - .../InterfaceController.swift | 10 +- .../Services/ConnectivityService.swift | 59 +++--- .../Services/WeatherService.swift | 181 ++++++++++++++++++ .../WeatherInterfaceController.swift | 44 +++++ ios/watch/Base.lproj/Interface.storyboard | 40 +++- 14 files changed, 466 insertions(+), 119 deletions(-) create mode 100644 ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/ghost.png create mode 100644 ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/ghost.png create mode 100644 ios/watch WatchKit Extension/Services/WeatherService.swift create mode 100644 ios/watch WatchKit Extension/WeatherInterfaceController.swift diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 81ad591..2e508ad 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ A565D15527CEA6E600816E0B /* TableInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565D15427CEA6E600816E0B /* TableInterfaceController.swift */; }; A565D15727CF6C5F00816E0B /* ConnectivityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565D15627CF6C5F00816E0B /* ConnectivityService.swift */; }; A565D15927CF6C8500816E0B /* TableDataPersistanceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565D15827CF6C8500816E0B /* TableDataPersistanceService.swift */; }; + A565D15C27D0BA1700816E0B /* WeatherService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565D15B27D0BA1700816E0B /* WeatherService.swift */; }; + A565D15E27D0CE0000816E0B /* WeatherInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565D15D27D0CE0000816E0B /* WeatherInterfaceController.swift */; }; A597401D27CE9D790080003C /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A597401C27CE9D790080003C /* TableViewCell.swift */; }; A5C47DA427CCCC6400DBE1C2 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A5C47DA227CCCC6400DBE1C2 /* Interface.storyboard */; }; A5C47DA627CCCC6600DBE1C2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5C47DA527CCCC6600DBE1C2 /* Assets.xcassets */; }; @@ -97,6 +99,8 @@ A565D15427CEA6E600816E0B /* TableInterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableInterfaceController.swift; sourceTree = ""; }; A565D15627CF6C5F00816E0B /* ConnectivityService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectivityService.swift; sourceTree = ""; }; A565D15827CF6C8500816E0B /* TableDataPersistanceService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableDataPersistanceService.swift; sourceTree = ""; }; + A565D15B27D0BA1700816E0B /* WeatherService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherService.swift; sourceTree = ""; }; + A565D15D27D0CE0000816E0B /* WeatherInterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherInterfaceController.swift; sourceTree = ""; }; A597401C27CE9D790080003C /* TableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; A5C47DA027CCCC6400DBE1C2 /* watch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = watch.app; sourceTree = BUILT_PRODUCTS_DIR; }; A5C47DA327CCCC6400DBE1C2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; @@ -181,6 +185,7 @@ children = ( A565D15627CF6C5F00816E0B /* ConnectivityService.swift */, A565D15827CF6C8500816E0B /* TableDataPersistanceService.swift */, + A565D15B27D0BA1700816E0B /* WeatherService.swift */, ); path = Services; sourceTree = ""; @@ -200,6 +205,7 @@ A565D15A27CF6C9100816E0B /* Services */, A565D15427CEA6E600816E0B /* TableInterfaceController.swift */, A597401C27CE9D790080003C /* TableViewCell.swift */, + A565D15D27D0CE0000816E0B /* WeatherInterfaceController.swift */, A5C47DB027CCCC6600DBE1C2 /* InterfaceController.swift */, A5C47DB227CCCC6600DBE1C2 /* ExtensionDelegate.swift */, A5C47DB427CCCC6600DBE1C2 /* NotificationController.swift */, @@ -389,10 +395,12 @@ buildActionMask = 2147483647; files = ( A565D15927CF6C8500816E0B /* TableDataPersistanceService.swift in Sources */, + A565D15C27D0BA1700816E0B /* WeatherService.swift in Sources */, A565D15527CEA6E600816E0B /* TableInterfaceController.swift in Sources */, A597401D27CE9D790080003C /* TableViewCell.swift in Sources */, A565D15727CF6C5F00816E0B /* ConnectivityService.swift in Sources */, A5C47DB527CCCC6600DBE1C2 /* NotificationController.swift in Sources */, + A565D15E27D0CE0000816E0B /* WeatherInterfaceController.swift in Sources */, A5C47DB727CCCC6600DBE1C2 /* ComplicationController.swift in Sources */, A5C47DB327CCCC6600DBE1C2 /* ExtensionDelegate.swift in Sources */, A5C47DB127CCCC6600DBE1C2 /* InterfaceController.swift in Sources */, @@ -807,8 +815,9 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "watch WatchKit Extension/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "watch WatchKit Extension"; - INFOPLIST_KEY_CLKComplicationPrincipalClass = watch_WatchKit_Extension.ComplicationController; + INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_MODULE_NAME).ComplicationController"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.nativeCommunication.demo.demo; INFOPLIST_KEY_WKExtensionDelegateClassName = watch_WatchKit_Extension.ExtensionDelegate; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -849,8 +858,9 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "watch WatchKit Extension/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "watch WatchKit Extension"; - INFOPLIST_KEY_CLKComplicationPrincipalClass = watch_WatchKit_Extension.ComplicationController; + INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_MODULE_NAME).ComplicationController"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.nativeCommunication.demo.demo; INFOPLIST_KEY_WKExtensionDelegateClassName = watch_WatchKit_Extension.ExtensionDelegate; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -888,8 +898,9 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "watch WatchKit Extension/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "watch WatchKit Extension"; - INFOPLIST_KEY_CLKComplicationPrincipalClass = watch_WatchKit_Extension.ComplicationController; + INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_MODULE_NAME).ComplicationController"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.nativeCommunication.demo.demo; INFOPLIST_KEY_WKExtensionDelegateClassName = watch_WatchKit_Extension.ExtensionDelegate; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 779bd02..70b3fe9 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,23 +1,18 @@ import UIKit import Flutter -import WatchConnectivity +import WatchConnectivity @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { var counter: Int = 0 var flutterEventSink: FlutterEventSink? - let wcSession = WCSession.default var timer: Timer? - var methodChannel: FlutterMethodChannel? + let wcSession = WCSession.default override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - - // Activate session with watch - activateSession() - // Initializing FlutterViewController, he is needed for the binary messenger let controller : FlutterViewController = window?.rootViewController as! FlutterViewController methodChannel = FlutterMethodChannel(name: "samples.flutter.dev/battery", @@ -25,22 +20,51 @@ import WatchConnectivity // Event channel - stream on Flutter side let eventChannel = FlutterEventChannel(name: "samples.flutter.dev/counter", binaryMessenger: controller.binaryMessenger) eventChannel.setStreamHandler(self) + + // Activating session for watch + if( WCSession.isSupported()) { + wcSession.delegate = self + wcSession.activate() + } else { + print("Watch not supported") + } + // Incomming method invocations from Flutter side methodChannel?.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in - // Check conditions for messaging + // Check conditions for ANY messaging guard let watchSession = self?.wcSession, watchSession.activationState == .activated, watchSession.isPaired == true, watchSession.isWatchAppInstalled == true else { + print("Conditions for messaging are not met.") result(false) return } switch call.method { + case "presentTableData": + // Get data from arguments of a call from Flutter + guard let tableData = call.arguments as? Array else { return } + let watchData: [String: Any] = ["method": "presentTableData", "data": tableData] + print("Sedinging table data: \n", tableData) + // If reachable, go with live messaging, if not reachable update application context + if watchSession.isReachable == true { + //print("Watch app is reachable! Going live... ") + watchSession.sendMessage(watchData, replyHandler: nil, errorHandler: nil) + } else { + //print("Watch app is not reachable, updating context... ") + do { + try watchSession.updateApplicationContext(watchData) + } catch(_) { + //print("Error occurred while updating application context: ", error) + } + } + result(true) + case "incrementWatchCounter": guard let methodData = call.arguments as? Int else { result("false") @@ -48,33 +72,13 @@ import WatchConnectivity } let watchData: [String: Any] = ["method": "incrementWatchCounter", "data": methodData] + print("Sedinging incrementWatchCounter: \n", watchData) watchSession.sendMessage(watchData, replyHandler: nil, errorHandler: nil) result(true) case "getBatteryLevel": self?.receiveBatteryLevel(result: result) - case "presentTableData": - // Get data from message - guard let tableData = call.arguments as? Array else { - print("Table data is NOT a list of strings: ", call.arguments) - return - } - let watchData: [String: Any] = ["method": "presentTableData", "data": tableData] - // If reachable, go with live messaging, if not reachable update application context - if watchSession.isReachable == true { - print("Watch app is reachable! Going live... ") - watchSession.sendMessage(watchData, replyHandler: nil, errorHandler: nil) - } else { - print("Watch app is not reachable, updating context... ") - do { - try watchSession.updateApplicationContext(watchData) - } catch(let error) { - print("Error occurred while updating application context: ", error) - } - } - result(true) - default: result(FlutterMethodNotImplemented) } @@ -96,36 +100,9 @@ import WatchConnectivity result(Int(device.batteryLevel * 100)) } } - - func activateSession() { - if( WCSession.isSupported()) { - wcSession.delegate = self - wcSession.activate() - } - } - - } -// MARK: - Flutter stream handler -extension AppDelegate: FlutterStreamHandler { - func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { - self.flutterEventSink = events - timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(onTimerUp), userInfo: nil, repeats: true) - return nil - } - - func onCancel(withArguments arguments: Any?) -> FlutterError? { - timer?.invalidate() - flutterEventSink = nil - return nil - } - - @objc func onTimerUp() { - counter += 1 - flutterEventSink?(counter) - } -} +// MARK: - WCSessionDelegate methods - extension AppDelegate: WCSessionDelegate { func sessionDidBecomeInactive(_ session: WCSession) { @@ -137,8 +114,6 @@ extension AppDelegate: WCSessionDelegate { } func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { - print("Received message: ", message) - // Invoking method for to Flutter side, MUST BE ON MAIN THREAD! DispatchQueue.main.async { [weak self] in if @@ -152,13 +127,24 @@ extension AppDelegate: WCSessionDelegate { func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { print("@session did complete with: acctivation state: ", activationState.rawValue) } - - func sessionWatchStateDidChange(_ session: WCSession) { - print("Watch state changed: ") - print(" Activation state: ", session.activationState) - print(" Is paired: ", session.isPaired) - print(" Is reachable: ", session.isReachable) +} + +// MARK: - Flutter stream handler - +extension AppDelegate: FlutterStreamHandler { + func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { + self.flutterEventSink = events + timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(onTimerUp), userInfo: nil, repeats: true) + return nil } + func onCancel(withArguments arguments: Any?) -> FlutterError? { + timer?.invalidate() + flutterEventSink = nil + return nil + } + @objc func onTimerUp() { + counter += 1 + flutterEventSink?(counter) + } } diff --git a/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json b/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json index 26454ca..5cd67a9 100644 --- a/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json +++ b/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "ghost.png", "idiom" : "watch", "scale" : "2x" }, diff --git a/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/ghost.png b/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..ed2c5e34de523948f28b90811f79f72068b655cb GIT binary patch literal 42736 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%0AoSm5fs#mYp2pX$Ipe_n`ITF@? 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 literal 0 HcmV?d00001 diff --git a/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json b/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json index 26454ca..5cd67a9 100644 --- a/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json +++ b/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "ghost.png", "idiom" : "watch", "scale" : "2x" }, diff --git a/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/ghost.png b/ios/watch WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..ed2c5e34de523948f28b90811f79f72068b655cb GIT binary patch literal 42736 zcmXt9bzGE9v|c)-L%LHMq@<<0q#FTOy1SK5>5%SPI;C4$TDqjWd$}*)z4s4(3+y}d z&N(wD<~h#^S5=llMq389AtH!K_HCY*B_Wc z`x0~DpF}QFIxe5=zqq)YI$40+-QC$N?W~>6OdTxP?47_rPlSj;AWD#&KUT%7 za_OmTZ=aw#sv2GYMvt;qjvhU;gz7WXQpSeT+;Q=^HIO$12Sht1 zkvG6>ln5n=1)0$6(bMwH<1@Hp@I3kvOd}l8?w#wz{yZ`jtYprLWDqhBeqfQ9A?5Q` zm1`iQ;P;C_aTDC?w>n5Hg3ph(ZisY}j0x~!$S)iLdSdT$?)R&t#p*LZA_Pcu9ZVaK z1bTYNpa)@z(4z!kbzmdZBMN|y&)l90ZKD}Ij(UG0XWZ)ry2F1&&W)o5iSJ=YH|3v# zT;TOU8;#N$PUdh50Ux@!O<>}&kaHDrKvWe9aKB)Em0yT0?fI!_NK#>ZFrSc*YWYa1 zz9j(T@eKJLIRB9B!Duw`kp{Y_Z8DiKt(u#V*Di`7Qw1T$d5CUw!jbkZZT!|=_p^Y_ z&VXjMjGsT_i6c{uGs6-h`=DfWL6wy{DtwO-q~UB~kbp1xJnIox;bTnvcj=71I^AH| zHw?Yr1!0M+;(NgV4SUW^^ts=)Msc9=w~1p3!lIVsKO0}9h;)DPY89ltuiZVwTeZ$% z2Ii5kukG?bvlF#;-=#4Qyly~kMn8p-fBhnCpbPAw(puM=A6L}{6+mnQX?zUBQNDq} zqDz8tfjh~E$2cG8ll;_SKs21fE|K<+mPwOEC58=jI~G&_Uz)Ut~~<%^om-p)*^0S1_y>is2S==)fw zyR*2pmkiH;j7XSYYMtlFFD@09<+>2M=DS`3l6VKHgH&W;Ddp2S)=}5Vb8^RO80AX! z!WSFLK0);Gr^+-7^{i&6JGH1dIag24{C3Yh{?@sR5)rj7WYt6-6A2Fet@#-hwPLf7 z-hCqcc!Z%g%ia~)rQ#uj62yp23kWI2&jIU!EL+2uxGATsTp*Y4HKS0av?9Rc|H8w@ zHh1!;p5N<=zkI#|Jhq5lVN@45Ydv?lv>0s;-u+9a=Lmtxf*+s>4`74=ChKM^5r6`6 zr}I{-Tz*0Kf00)zwQ<+^Z&i)H3?s=^rqFMNqx#i}n&tDKbO`alPZh9G%u`+Xc;v7g zI+OrpEz_sT^WsI~Ap~05#3J9Nw=PG2B4Up9CreBXGn9*0Oc4qyDs0}e8}=`IMy7R| z5WRWJy44rX(%Sp$2b~9QV5u7tbr60$D9pqR^gXaRkeGMyf)5*e!{zIIe3r0)vtu#u zOqDw}M(B~ab@0;hm;Kt=r@LuIzb8vXg%rrZ*7;wuxt38l@_ujeT&#~0I3R4r#SO!} z+2Iqh@#J*%G+>VDOC0-R3S3-UcUiirT#2+NAzxlmD0f13@x;!bT*X$2hw|*e)&N&v zC6a2u)_wcPx~^*yuo9S|)}*Y2h`!gK10!ttH>YxCBZxG1uy>P=nTT%#X+Y^N(6IG( zk!*@6xNE74u?;Mbj9m>VHLwD2m1Mv3T;#Gzvlr2oNT{0NJK|N|xD?Fo6_t5f(a;mZ z2%#Xqio26vipHusCj8wY3EJUxE-t%bI@p&#IIJF4EeACe{7~e25P8r1ilNLm+Dha0o zYBHO4@V~Cdv+Fo#swDFxl9NMm3!?NfpWd-;6Ww7Jfx3_)9sd;afIY39Z3+l57^f7E z1jb^yAg;odJ+_(_Ps^Pe88&YhmG93LwzDiSZ(Llyxx0DH_B_l~N#nHcFf<*7vjfd7 z;Rj$*q6AcHzgzcQmwxhL9q8|OdT!8m*gc+CYmle&=VgWMtKGJ~TVp=uvg^TgI}%F` zb!U$R2m1K)vB3kIb>#eRm1xRu1*u8=zINGfN!G4ogK2YXd(Rz4(CuVnc3x!t8MAZq zpIqmu&>hL@WI!;~P6t^I6x8|Q-0z@sDLZWdWC$OQX( zzRJM)-vss=`zqBF zA+eqtg-t`FLI+h}R5lG!F5^0h@p2V#KpQG`fj1pCIqLlvLYxQWA;vtiBIj>dl{0>C zCe5$z7HY3;-JK^ut=w1~-mf=}N(7O=N=6HZ1j??ci;RrihI-rWoCw-c3J44nD1~9U zU+p<&`JK2*cXEb2J;C~Ox4da4PTh_jklc%_QQKfw3OIDpK5%Mj_WOsgNczau?q#5; zlX@(J7>2{d#1wyGD9CYj;div=|HJjr7h2N6y$Vl>S#3KFtL8L>9B`I$(xoE6d^FX< zTGf70Ksrie!+D(YVcGR`tHQ8ph+-@nP8!zFxR_C%?RA+maC3VlB~FE?Pp9`XEjAAJ zWV0xyx~8U7_MNvx`B@%A6iAp5I7C%GBhr#ze|!M-7%Ni3M3#f}nyiKsPenF{ znIEvp*+}lgx^VFEq3L43cbT2Y zdP+ZMz(ar@Pq%Kd-|o~+1{8I{Qm$yDhs7&MgMubfcXp6bsj~;U?M3H1+4b7Ko%*Ma zKcMUX9vjR5-0uX;ncUIdI`l;(Pg1wdoUXUBC6iVEz0Yi)qX`Gcf71YNX#@Am_{lK8 z@K%79+aR?hCBG|E%8SqwTK?MIA8jSPP2sPHw#Gb^@^5t!DC^&=9G^t>z9;*>`1))P zuw|2%@#8?G8e@OI<8+`=c|uPrX5U6}^yQ$^AW;a|UC8KDCJo1E6(^&GJBv7c9-v+> zo3H*_6*>w7F)JNk^Ke&fgPxr(ija-CP*lH~rWcv+9DAT8aC*!$zM&e=2M&^A_5(sb zdCQy7UWTTP)&Tb(-fhhwA{eY;MQ2<7dryi@;X#9)BxE&sjL`4OWct$uj>1KX&q-}< zJ}XMx2v%@wFyt#qk?Rb6*13J$?zE~VihTtMD>ca26}+~q16?C_SF_#X34v4rH*!eS z%|mBDsz-&A)S`XNvRt6zC8e70ql2A0EPm%G_^SEZo1kJHMh;7z#mj&;tMURB0zZnW zv=!fN!y%3P#igaFA@y>?$zFN~i6@F}Y;2&Bd%VNO#vV;=5WCG4pADGn(rFt(2>t;K zcHijo5AY6bc7A$PUne(dOv|1mjNM{D8@_ulMkU_gj3Ub6^Dpz?&dz@2gG`R-YJpJ@ zzb8B;X!D$n$ScFy9SRx?FkY;;x*#nw`volYZv4l`l#7v>D#lOra_+Ojf$X5{V9=DKl@d8j5HG_j_#0g0rxL(b+2{!>+#C}0V8)Ps0JLUrK6e!StDGFpAeI(}3OJAA zDKI|B25QUSfb=TPsOjzXp<#h26IEZfq?8mF;9qPO+mad%c@Haoajwev)tZ@v#lus& zJYzO5SZx5=+rw?Uq#3_>*rj7j2HMeD!b+=q?dMslhof6Xz(zRH695SaE$D%>CkQGWZ5#$;wpL3a$&gdVkD7lbmW3P0alK2RI-Fs!fO z{(F-nrd>$QAqT5^(Q-zPw5TX!VQR`oAMKr;Sf=NMLKQ@Zk%Kh~tJhExIUKJjZjDAA`1Cgrf?HwW6P_o3&*%}G(d096nULFxhsNV&p*^k9ee4{uy2 zMy*hFUjlrNc`H6)VR`Ltwr7~WeT%fVt2i=#2<|BCIO)m!_2y2-=&)&b-kM9pAM8^q z6FqkdoInYjfcWzFXCKn(y;j|C$AoV73cwaiW6$v@5)EI}zv_p4EG>fjiy! zxCH|V#SZHNc5Fz4JQXo1sp;w8BPTZ-2%~r&|Nj=cBd+RpyyvRlv^}{kQEVAi~U{_dQJb_PTh>A zwnrJZVjg_W5n7#wV>l>LgvZbw)VvTv{F+ucpX;m80ew<3s6EWa3LL>6Gq&H3i`($I zymr=5nQqkEm2Y#7kVK(2`$ebVzAnQ}>&8=7T>JIJotA!}T!t>_jCBI#blw;^w+Xxi zYmz&0TLOARNQ-cht{U`53^X7*8P9byZXXqeq=@aG=cfw0?2^?EeHoWk*0UAEe8!>* z=H|^YT0Q4>Sa`+xT&AL))%sk`0YhTHtfZ8S6V8p>C6;*gZqRYW?}E2f6ksQ`8st5# zW=nd4?7tj*WyC(!>R#I~QT(d_XxafT( zox^$@m5h}KW)4 z%@{0K{b==@jwdG<(Q=sAC)LuuL5W+$5|XX$+1_{xvgDfRhET zoKk65pFQ~CYcxG?eIB4liBO@j4)cKRkfF-cvzR|j?r26VX^k^ z-}3|(y;`jXI)>H!0a3{q3=DzSG1`F&8qE8v4REJz=TS$1G~t_1(=Z=*rwc#5FM9r! zy5fyd%BzFI56hwsk-bY8hI;aK;fGpko zX};#k7!|m^=>Gg0_5emugBb@(Lj&rjL%SnCl_pJYF<|S+<_{5YwK@m~t`8pL0+f3` zIJoj^HJ`cGd_?sd8XVTC+hl%3QogFZg@Uk5Z>aa>o{uI3a}p~Ci<+aQYm{ku&qAp_4fN-9Z8=1o9> zW`lKKXRP>vR9V}W2lsT!To)e;-kc&}{hT-=)8E5`FgwaqSHPc2JW%bb0eW6&c7L}b zpO}6mB#g8L zmuu?V1-PeO7|lim*$>eKbP=FGA!>XoEzlgH2XZNx;!jQ@RN^6zl&SYpex61~Fwy$P zy${huWvuL=MQU$2cy3R4tUGe?n#K>27*+-Wn^eJL= z+~i<;xmc{fOfbed9#d=6Dk5TQt1DNMv_Z(!(s8^90{T|+2sbB!qqX=Xnk4q&?yVQF zuS){N=(>U7P%r%EwcnuIu_yCkPbN%NvpM!nCb|O~gYuV8O+!gX3*~JJ>swuBWl6|u zfN}%NF*pngVS70|cB8?Cmju*_AE+Y?3p5PS>|;BOWe#uQ-U%?_JOFW{*$6(->m-hb ztyt->D7^<;9KLvS430nFeWDTVU`?*!oN=89(B^;3m_bR+RsX224ojjnLHXf>nhJ1q zDYr$Q33Kjlj)WzTrL})#K2I#68V8_oBWjguP+uj;1q2R)2H@~DnLM{0?x@rMseNJJ)C-}Z}Y&vkX%>+Xz=DBX2Bp>9*1&ieovYB~ruiM%km{`MH>DheYK=mi+>|H~{9B~e@wE#}{}9u&+2X2Cg%MMr zZ&-Pf=Xm=rUCta`(~do*T!fxRFt5IRH)i=2Gmmu9EBu#(maG8MF^#}5S7 zud%`%Ta518dIvT5R`&$!qFE}o2iQ_zK09irXcvUfm;WJL4d6M$*{?TCtF(zH5MzR@$op^A+$k^oTDrb6rajI&!51}*fOF zv3L`(1G@ga2_C0d&qcCJ7&k_CgxMJ8(I_>DA*nnr)*I^=!`(Is;v#}UM!P)E%CeB# zmdF3wX2%;BXC>hy9)?rtfLX?Hb+VK#ckT84gDaCtVLE$&seB-^1sAMI=MAF^6m+}h zT?b@iVg6rAvfro!ifdZtP;E#b2`C%xMy7jxtfmXAJa{BY>C0o$y`+@x(y2Z&wz!Z? z_oue4z=>^#9nPr(j2&~W7C|Ma_=L@t zF)DGw`nD#7iwx>{G zFs{ZD=KQ?yKLwxTxx))Bod_ezDNrbW{Fp1x^F0tn4;H7N8dzzIQsLSE?ONU)cLh8@ zkiyrZ5joUY@mvsg(E}QYb?YK65AN+Tuvz2I2Ar%lnjA7V4mSjz-|T)kn%mYJB9Bj= zBk&`aj#AD1_4zoaU?lWCI^Z1iQ2Ww=KuW~3MGD1Vm^ArS+Za%-X<^Pf3EL*xSRQXX z6Kid$BpIjgkk_NUPXM>tFWXg0g{OuV54u}3X&W(Sv0N+=vDITHBcTjJwtT=1AYajo zGb&D($4?5#0!&y6(Bez9>N}rD2$wp2km~w(Y)~&p^S(f#@EE9a9y^jzAPs)ccs2l{ zR9a2-%c41vbm^>aQHr>|VK(tSZ$H*rQp3q-HE4n6s)4Mp{D} z83Q&z2=UC^7e{X(G=6_@RWI#9FsNi8R>K2U7z<+nQSau_))#p%3xKhkKkwc643<%t%TLQhQM|c!jCcr;&T;1AK4$7 zf~#8O@Bgt<1@VvZHTeND*hx|pG6jrq2h%_U6=AP1;r_{RatyTtGfa?|Eo~y;`rIOUx2XrN+$#yG}7y{r4UYxGhKkp(98{#0wsz+NcPd z;$mB>F7+v=sK}uYK^AxnP6O50xdH9v4VBBqagjIR5c2ebM?G%fJmJ?V4g(`A@K}s1 z(OR3>2lf*Uxq`8NHLIK=tdlU*IWeYql@4ct$^%1)C2)2rX+Rw*G5zBdCSot-Q}=JE zuDE<37ueZ&)3a9e%QYrJveS4m{Fu+);t`$d>Cd7$#+ZhVi8_Ffs}(jQAQE(oi>vu5 z5&9lLV5EV&4IUnz!_i+9#cBAi4F}a4;3F@Y!ulmfSW)jc;j&P$CT@RY`o_`!u$Js07}A%9fT7T7q`sIqYjUW$pe6A z07Q5P2*zVopq}r=l*Fvr#qrGpG>chd%zO5k-cJy4tS4PdUU}HNIDOgx-pz4(vI*&-^JzN1qbQ=Y9eoTIF{bs;j!P8QHX;jwBFi&t}w5?B39`4eys} z615+|IWReSqEmdfq!(4m9<#UR+jKiz>3zy>Hee&>Es?mbB-@*8$F)(zqVEKXf z_AQq^RJ{m#)UK=rF*?0Hq~+rJ_I8Y9GS^T+!0oHl;0**;(DSz26XfrDeyYzSfVlT|J&Yvf4!R)MJAf|ig64j=(>eoF#!H( zZ@ySC1^q;+iH!{Qk>2>*_AUVj08T}by$G)-ZG3-qOd{@&df?c&b2QP2P_f~BzeEiZ61zin0 zP3UcpPy(Nu?Y@B4v}_e8C+gl%^v#gN%0x)|v-xufYujx%fzQP~JlA{Qy0mCJeCEWh z+U|Cu51UR0^L0WDI_$R}IWB=Wh9@l0YVXT^4BVF7l3EvurV6hEtVVz7j2y37K3uGWx3JSi754+pnpJG9l;;>b=fHr*9`#n1nMM98?&k=>GXg)rAOR+_gAfT zRNbNL?I)s-pQ&vH(a{3b*j{{~hm(*b`EwUMH#K|$pv-m3DBO0sSlC|44;!&`ypu3N z|6{e}jYP=mXhf3rF@{_#I!Tk$G5Rg=UuI*!=i^faEU8IPA@UC5M>6!EhT@$c=W9HM zw(s zqWChoiSHJ=sXdm?yAGMpD$<=sbPL77)2h@P>9q3?LU@z1Ko&8fl>IKqR2HAy6kw%sGNaZfsY^nO3qhdVaGuw4l(`H9yzrk#%m!< z_iAElxTg=A3crk&mCYD$IF%AqM1G1Ldyx@64}|&|r;y2_zIpTdyMab0Znh6^_lX1S zxVBkmzLu9vmiIa2N4g-V`|9UbiL=P8m82b*8Terk+qF5T6BEH{ zZqMs$&iZ5SfMX(HYZ=y$|F(q27>1r59GV?r^q;Q!zPwpTNZROPeeC`zUB({;(5Q`xG|WOv;)uLY<%PlLb#b6)ongek7!%Ok~~)4OnQe ziYv$XhnO8FW@h%TGu!PH>Ay%AWu5ZnqPX}z7=3m}_M2{Om|{x(;&BQQr&;JT=qzGv zt71(@GKQ^w>7w$wAsQdnys6yhlczJK)eQP4Pgpo2=0Pj%0Uspu(HzZ0+z#VkW)I8n z;3tDov(WW3^3mQ_&bpX|w~qjVSM5FFN3Zhmqp#0nY4fabbTr>!(Ld-oRye8|KI-4_ z4-IS@=#?wZTNG?HETUs!rdthOyni1*itLmoqz+>C#`&ho+<5v|nc5@KbfDS4oh!a+ z+%kxNyBzx*k!ScbgsH#xY*l}EFI+kR2iVBG)F9x0!uwNujpUyK%5xA{*hhIuu5H~UraChd`1LB zuQTh`jz*vm>UGtTeofMN*R*jad+MqV>A0Q$H@vEBBxMS-6Nn}xIA?aEbJ(uzr2MuD zLz~ca9!ik!#0v77WfbNOFZh2hz}Vi2W~usc>>$dcBMzkp1$MGRd!j@rE5o8YD4!<; z?*iCRdlrs9`R>4HZ?26)cka+FL1wMWLU4BZ2Zuiwh!p*wX%l-Vb7*4plsK8RkU|ST zB}a}Q4=mTAObiryXifA8#qBTMD3`0ZP`?V`%2u|Ka^qur{7dO-&zGn5_UKZgpNQwTZ_Ns3o~PFag9SYsyfs5+6|OAm z{m-0%H0$L8>CUZo8}t0s?A(FJ(Jmge*Mw2cUAKD=Cg1F6wVxx6u^-K<3lo8>x_%zu zjhp13TH3Vvi;{0ec6wGprieRn!{ebf)>mg2I3a@wgrvLkR+X=-ik5$8+#*vd3cza{ zq#ri72AMbF_zxNfCQIJO%y=~#G3;cGdHDT|1aIMt(meXVFxbN`!GM4I6;sG%E>(Ml zx4Froa+-={#=qqt1haFJ*Cltyn^8tbTZ&L9#hWi?FsJ6L0VP1 zDub00K3=Ke*q?}HF3I_qu7blrKOYmaBfalkgq#^ZXI-s0)&teS(R)|%KQZtX`kiSQ zhKP?>zl~^$xMSvg9UAwDJmyiv#!*I>ZK6u}!IHP=~1jkDY0#e#spN3T?%^6sm#Sf+b;^4)q za=Qq$P>VFnhv(3pc|!B&ff{oCp-`C8&!+tVZ9;orio%_|U10oIVSamL_BAe@?lkc<21fq46ZL?h?P-JyU0$8_j6nD42vKWzx6> z9f-p%GYTI(eqWUQF=<1BprD&mfZC@ZZ!1!a^ueTynf!76bnR6aa=WJ`vr*Mc(nzOD zEBGP6TtO=W#4=;_i{-{me(&2K3?g=AsFSvBqC|CL0Y1F-Ne6Zf8 z%;NBq{sn5ufH|>j>(02yT~d4{t6<4Tbq)s3s>KHw*(!YnFsU9;tNv4NZ`Lp0e)trf zI@KH^9A*8tm+-vXe=ammhkRZ$c9Ymir6%k4ZGT=rbMrczmSi4zKo9w$tNVY|7}s2Ry?UjHjp^!R%>m^diWLu9wS9% zh(>J6dXHl@Up794kPsd%{G#XNFW^WW`31smahZJV#pDvaLF^zH<8^#BqYc|W13_)# zWmN!*rwPSRJy*s%wcZmVXuUaZ5N@yA1NkN1F%GtRif>9NVs>^SoEB^YTQ$p}+ORiP zXz$GBU~^QoP12LT@mOn^O)u)E_o|tt)B7UDm|r9sUuh8HEBsBuG}D+BWFcn}($`kI zo2^^q#Ukc)0cHDMl_meuFm#-S_z0hP3nxiQZv5I5<)8Yeb{fo&{vB!fcz1d?%M`d~ z?D{AHi|}~729Jw&|1E+C<;X*zN2|_%tj^uKgrYZsSkmBfR3c`-%}%orT&Kl~l2t)2 z`8IKoNzToGyFo!Q2k7nIor8NHuC_1P8P1PyMXgH}`h(;?)w@Ea6)k(Dh2CZQW8<-8 z4V&?;IjsU$!PTe2*Q`Oej^Kf_Hcw7TP2iAP^AjPJ3a}e2x0~^% z2VC-W8^55sQ5U6p2XDSe_a8J%iy&|o*3Y;Dd7O=~I6pJDf#*pRcl|Bjw0@D z;%zSB!~`bU@V}GCtTR*9er;AwOB}PZA`bB^TF`?IIZTP3RBx1#QZk$Vm^Xz_sgarv zziBUdoC?VA&}rA&sPIot z%nbj(FFpXVg(`;}fl&nZ2R29v2)Bb5$YS!d!vb5?qsMN}m$sOjZmqLSTxh_Vz0O)? z7#~uDh*bJDy_-+SHtw=@7s{i`%X_bspbve; zc`H&0t%JxlXvl$J0|95x4;pFrm@NzByt= z9KH8>>2*QJ#vcQcNiOioXW$u#*H#I;!gIuSpXrE{Hjuf?WJgUCM!C+aCrS&$fq!%V z29CE3^=f`VY?>rFDdHe$*M zG;^HZ@BM4xvQ!i26YBhWYd2MjW?V~;19}Sq^=wR_5l~s5_P>6%jQ`}HRVpHnN3``U zI)dTf|0S_BPea6P&`#vVDZc1yg>y>=Ej=S7L~agWfiXd_fm}}O4LyVYI9WY#1prp3 z)IzS^xx}$~^zs5vLQ^ADX~f4ke>wC1V6E3bZ)>{qaEgQz=ZNAORa!cFU^qc0+wbH$ zAob0Ui~^UohHdZ4yYGO;bvg(WVArE=Dg4uOeWtSWm6<(Hs=6ktabv8k7&6B*+5>>w zf#XI${qK zz&y?`uNLH8`Il}|#{9TBKFe<%d8Db6)$Ou;Uhz^2<u zgp%tt1x-hVQ!yQM{fJ-EvfKn9RHept%n`=T1Gbav%B$ zF7rJ`zWiMbsqi@a`)fmn{=z$Cu^X5_!1Tf_{`K!PnUuk#{akKO=7kqAjc}BsQ&5>r zaq2wB#-l=w;7S@Vm;oi#R%O7LBqS4yzV@AFC}-F{GHY^f{3J^M_O7Euwh)`D<@_r^ z)gn)3A2@TkhBK}B4S+otc)`bJH2IFahn4J<=M3Y??MZXqDo;Byqtv7Xk17CWkkFB4 z)ehuF$;UDMEgy*8z9Ann!*)EHvIPg<9HHcRoC16E-=6=1e}#@R_~R^E+GyG#$uze8 zo|1#_j?1e7E){SkFD4xTh+v5^A#MgU>ido%cSyj|BCc;Tcml4VUncZRIdk$N!&HCW z4h7-7>QsUXrkWux^I=-C@M1h9v%ZgNd?NRbT;-J8A^4xb*93IYbdl6{Z1A`=yz+RK%$&$2?ra$wbo=a?UZxKMN_@u81%iF#vm1 z#-|?h(I8cg3Y})?0mk$FF3UWj(xg-g9Z++~d39{?vory?47EC!ONb-eWat9lOut6S zW+Y6Px)_{n7BUY_G8kK4eTx;U8^9737d2BYiA^unH7*HVP)00Gh#QW;NU(& z?FAC8!)>V=Li{Pp#RrUdg=EO9Sdx;AzF{f=xk>iEdY=8$ea$MHOQo%W_)zBtToRjmzmdKl1 zh88xH7DV;MJLFpBMcN>5sxiNZ`1H}vm;L#8$^E`?^prY}bMr`eM}Rh1hKUTL9&CS( zD}}xMx?Vx|lLiAVi#qJwE{??2$0)M?(^2=6TBxO}bofy|*9A3-*j^kwWgjVj$(e+a zbcpNmXIkxAgSlZNC~y;LT+Tv!St`+p-_8R_B>=Zid^C<`kR^p@6Ng8dI--{`$)?5T z%g*HI6t!Q@UFdAJ!V zRtD;y|9z)i+#>>Yg0GIQ=)6@1pZkw)3!rHAuU(&`^|#+kVZFXXQij<_fSF~6AdE3f z{7~Y8le2%V?VW(0DRs61!_B*T5hq++8XCS_X<$EbNy@7evU|p)7%!Y*u}DbFT7+Aa zZ3=$)^q0{3QZoW?{hTNba;m#VppNJt9ji6qrC;np7E8Q7l%&(j-An9o1&p0a2AIjL z@I8O;sQOUk9~AbZ7C7yF9Oq&;%f#Q+!( z-j3PZf1duv4i7CZI{cE-W6?GzKI`y@ZKkwXqrwPdx z#`-;vvcSL*dva^U!0?{x6c6toFiVzeW-8WO#|MG%GpGnPDh)3TO(`s`R#%vsY=N)r zcDqWc-bXW9YC>RhK9?10)fmi;q6J*`tk{kE>YpDi2ef$8?8H64B1iWB1b~&$YMs%; zCs}Wm=pp6%F!AFh_gk8fuiCa$B%QVlyNVZG<1#dyH*?sA5E+{$%J-->;m2Gx5^Aztcyg^TG>the{QD;f zAnK8Zl`i}II5_goS0xSL;VfT$M~!m(QX9uqB==2So;MQ*x~U8{B4d@5m;lgI?Tdb* zYepr2Av0D4;6Upo3w^u!vOCb@^>ZC25+Wky;0vb+vy#{IM;P+4VTP$`bD~m- z-!~DI8tS&8%Qd^Sk8~C!aVbfE5-hrIbO$HBZ+?p2;fWa~xrUaT-pZ%TrZ3Fe@3cTX z`$@OfC8@A>=R|2eAHHjJ+5JHv4eVd+PxXP}ydpguJgW#Gj-;+C#taq}6TK~16DMQI zBSnQ;JwM1uC1L zjLw8(7RMaxPrlPMWUcbL+1DF1>Lwu0jquu<2*dof5Z<{ww=v#oSLS6!?>PMTPi;BU zudCeyHRd4Np?*J-29i5BNz-unkJ{ETY#kuKAX`ngVQ2e^OseZTFIkI8td z(U#wI4hot3e$(&bP!b|}yR}eFm@iH|uGQ|yy_X|$bja3MXO_9W$*RxYXwWECC*5{E zUYtDa#WnYB2_o_i00!&40JSA>-hxYJ@sR=WEg9dVv7+n0d{cy<*i|cA+bn%GTPaeH zS4G>}7@iJr!>S`YbAkx(4+(*N0)iyV{Ki5v{Ot@UU`zUyG(XZF8`bzNxd$>(_}M#f zWV}d5Ts_??KIv`zDJ#4_ZIHhZGs4)ZL?YU%>`cS(pq`d&$=b>VtjM|CXfhQ@95Yy$>lEw z1rLF{Re?%7dGeYJGq~ZJuxsYnD?4v%~>B4JgdlJogZ4fUp+M6 zpO9j%buXVn6ccW3sx{CGmavV5*RB08htu(+Fl6)QIt5CM?~-mSG8{Ju%(HXO4tL*? zK7N}*v7l4FK|$^Gis=cjf^O|cWF@^%Nw`49*mvl+RbSEzzCW}aHkPOAe5-iVXu zMEb(65=dBI+e;=?OaH|`*`+f!%ErLwga9Z-wD)+y{s3BJ5U+jOYUVu|S04*br^Hqz zg}>PW@XSOZYCfoC0l=XjF4xlNPmDVY&PKp+UNqTardhuW&ZY+)Co->^{GHi0I+p@GD;AbDW zLhk_T{=w`icS}n9Jo4mEx~=o=J;doMEJ zDHA`-gc|>d1y7n6TDj7L%3@)J-Y~qJ`!loTIBb?T7yB~J%Q>dfpQM?!$IgsLwY98x z?D&^!KyJxRRQLd9t00X{iZR>{*6}P!i>odo~<^d?VU29Z1f507PWZfgYgsTdYC9+blJH z2Z-~38@wsVBfU$@FDf!Ve%vuK(0)Riu)jmf#?-BS0sp|@k}N@L%tZd1Uwd?W{SUo7V(rot`%a;;Ly-55xq zgvrCpuN3(I?gH3}v7iiP27qfazV+g};6w(*weG8lCy{?Zv(#9B=Hj32O*d}qsQ_v8 zLmb?Ew})k*nqHyPl3X~V{oeM0^vjs;@6t~qLTV@MqlP5!d~QWf!y{4cnor~*kH1Jl zy02+MolfCi8Vo|g;~qkno!vryI{F4u*g(@oF$QFRu0dFdWWLxj-$fymCX*Gw*OJQT zYHa$6i(a@wjlts#3^LP>Gg2leOFQk#c%niE?#J8wnaU1JJg_-?Xsp z@9)lwiENh0?*yl$q@}C9mp%h^mijsGyEAO2;s#1~c4O=I4pm{+;H(svBJGKBmxDj) zB_*=ijVV8W4j#2cre17Sy_Vg_^dlN2=akt}BBRDGOEqeQnlZoccS_zyRaAWHOFI1A zaA(x@!14t~7B*)DCZ{6lnIjx;C*%hzOnbq`UhC@LtGTd@YomwQ)$BN=3_v_Lmr9} za3gd?mTgq8<^Z?46OK!-y>Mi9z{xBU_Zn-eC~Q;;R)YIxB@#n#T$lXUu}*!@5KcQ@ z5P%X{onVG&+T|hqVuS5T!Y}Z+k=U+X%430Dxq6w_W{kh_;Pt#wu26l|5>P9Ny7yo? zZM!7`;F<-p@odHW6EiO(C$D_QTTYJWPHh>}+@IA`$B?(8LH(G9o0zX_f(>J~qw3{2 z`*(8ok-r~6qoeh&%xA3*i^uolGctbDV6Kis_%NGX{Up@@vd#qnxOiUG5b%5ahHl%~ zE^(Wkpjj6Sz10M8{j~SDLe^8yi~xJ)@w6pa@Wq!5=q_{%b^b^m8#>XE+6RXzJO+ge zJ;Debh@R4IbQq?%loVpi7tmuLVYsH{T`)oIZ88UYOize*atRhcO{?opVfs4>YkHvL{F$?<1o1sxG|g zYQhZ=4~hcqZFKi|69M)!Uem=-IykNtP+m#;`*K1^GWeofIIjt)!Jf43I@0?J&Ys#f z+0TDl=#08m&m4sb{RGCoTepobH~SQA zxS$oNVWy+B`DdAn3l>|CZE3BVcL~@a*9{%T0@(dem1OxKfa7<*AX9a*A6f4=*C%eiN73)XczI)o5jC#DV z#lhWrUc6Zoeg57f@?{wBBvAPXtu5#WyjbRTZi$#Dyu&~jRM>K^KG1maV7Ug}I$6c+ z?;jXH%ZY5D2`+3qvgl8(lv!uJJK(A8|U*8$}Baj;ww5k@sCnH+urMQdm zffOUl?*gVs<@p;^lEMj77LYop37WxT3OoFqQ}To|2?<5b8+lHFud^o(t3>vv-~Vf; zQFjN5r;Y`hQP;LR zPEx90T%>Z)@#E@OL-XMciH~~I$o6I?U)Dyr+AX|6{Lver!zuLT(tg1AK6!$->DTr^ zIlyOx2Irm0wZ2Gl!T`v=6wpOw$Yf%9ST&r)RBgRP-9Gu%0boZQaPN(FJR>#Cru|S& zw;yO%3B6%$m?csydJ#zZn6mae9QR>PUmKzx?pp3wW1AfWfKLT{2jW1F*5W}_bhPOa zfjzWFTDXrzr#VUlP9{Fh@|h*9lS!L54c+<+4u$c-6T1@y{PfGux0(QpM%bH`Jz5b4 z*57*^q;(-0axb}i9RB}YfUIqnnQ_(t_5#4qW%(X_w7u2@-uqfnT^OgxIqW~avpCRB zWVW{KEO91&zSwHCi^n4)>sMfZ%5HoZPGRn?*xwQdNG7Klp=r|t>MiOBwyqs_%QOTh zPcW@JFp|!9!&0Cf&-sgDwQuXLm@0caFEDVXcGJ}4CCk9o zLajseh89#~bt~r0xBA+4tx90lU}96To#)315Nv=32AdY2mf9i3%qPq6tRroM2CE{@ z<3aXBjKfkj;iP#ZKXEe+t5vUKOSUq@6{maPmRaraWnjSa+O)CQP~nb7 zr`dkB=)-3kRfu8?_{ON`P1Ys%1VMd8MQ&rCi(iF?_W*M-O=w?&h)N(7FoXMzrC3&9 zRfiS>pZop8ep&ACPVkh~_BkH`xY;$i?vI!syn{4Q>?6GXo!QT{<-mV;l&@{6+8Gm@ zhw2A#|F#o2tMI(T*8#t!xFx+W5;6P>aJ`-<`=Jq<13+Jr|D$K;aSB!xF`xYI;lvu_ zO`s{@RR{pT&g=yPFs|hQiI{6*LE|2KflJL75l|^FNbklvaQZ(?gwSl-NFW*xzhwE> z|E}she_+19?UcS_qm*h|^J3*Q(5^@KM(bTKB!E`^p4VhNoZZ^ItlAI_Wv<$r_zb0Pl<=HDt@&-jk;%DXwu5dx;IO61{NX-`S{YYGBh>@o{Ucd5-;ZtwhtfTI8Qr% z&-NnTf9P4C{bhj*^gFz_9v63Vz8t?#KRe@qo^A+wZls0!{wn>!)XTBAQvN2yl*506 zYx%_4_?4CTS`cl%4=H~lH9fNe2*(7omEBRgZ-Cay+l(s57K3H?TctMWaKc;+A)gA9 zw64#zpJC6`_95hLHf+TVp)!C=i5Uv!6eoSl6l^H6CK%Z@eN5`z$k9)^LHi%3zB(+b z_j&v5QcDO+H!O{!bmt=7phzf43P^VizSs5s z3wxeAGxN;cbI%-_;X7vM*RO7Og_ktWz{!SdCHcDxA+TnU(gE~gPkc`f+H=BJ%~tLaHK z^Nzzh{g&}9O(5Vm&8LoH3^l<}QdcNCmgJlPGq>i+0cgX(+FmakLM0f}L(W+uvdiy1 zUAdR2uJ^Yswue`Nly|>Zy_L>t(qG;H&ea?p8Qj(%SzVnPhrFv(Rw-3)5FWrKBKjs# zEh9#{F_`1WtC3V)os5e9_Mx}0&l*fK*e^7Zw(;cDS5u!h&<1Ke4 zHTG{=3>q9qWtxORS?|L>vl>Rdtah9VDdAjjq`LEj!8}6x`9R!V_MebW@;dI7?YO$d zkqG0HZ;C?iJM|vslFswUT%Pom5;V^rebn0rMC=GSK(si|k&bs#^_LUJ8~8}y8dxW) z7*+Fjvfe?ds!vf-akxx@^p5@u-aMsgFQdM`8atg@03Fb~rWS*<9sOW(vO`TT@x6)m zj_-ESgw^e5707o(EnW$bAn}L(vdZyh-8?NO99FDwta#_RpYA>%&hw{VJEj5&>-``t zna^*K*=q3RT^eMtA!y~XEyxZ1J-e^09<3j#M5{&U9ee)0M`dBad{Mh^BlZmz!T6o3 zDFNH6FCI~C%XQpUr#}H*A1&j%XkvW_s~K&)HR3Y%Stlk_s7$BGRRQ#GA|fJ~*~Kr< z&MsGb9)5Lm?H-iw0O9+|Iy<7QANJPAsRWw2V{T6t!1WyM;5!|GH@sab&zRIzD{ZQH zz`-D8x_}p-+dB8{%|3`KmKw68+>QNRwMfR8!#c4B6uo9+ju$mnl|Fr*v5XS}FZ}!d z5HR>1y;5wxu1&p6roP=LB-;QmmDkCBf|=Dh=Dc?)LHHYQXume((SschzNXL`UWU*U zm|IwgR$ISX)I7%{sjKrzE*;x+a+6by1nn2$-b-r4F=SS|cBtafph<0Ljj`j`=Wigx ziWZ_wN}f<%u(**z{pyuw#P0R4D_qypSq0B9;uA13G%%M4I4CDOf7NN!&?Y(%(JVvy zAQmuaI>X~p0mf9Iroa9pY%aRZ)a+JEgyd0@O!S-r^_th$R0v_k*KEnGKqPom>i63I zO5bdeA?Vhhb^I~MbZ(SC(`;9!R&eaVVU$Qlfju%56p%Lc{|y~t=E4XTVuZ&L&HWWA zvh6WpPs@DLu?G)&X=B8ZvP-x`sNx!0{Y3*48`U7IE?~!wWn~9!B2|JsrlZ7&zYU~SLWZ`f6Cso z$9rpf9#A~+fwf5KBL6MRGZ5#Z>63`W93yJf$o0FF?M-bt%ePHYjrLvDY-r=;%cb%l z0_m2O5(K-wDH`ir9E_C`(ai^FABrAZTx3DH=wq-eknO{>mnwl@uhL@fNN`@HUCAYu zcSYH6WJ)b>-tXwusPivq(a3?W_zs~$*4I~w=Z?!%V22zhFV27^bXTHEgeorTI`2N{ zipTuJMBJCPrjz~jDys8ghD-)%0SF_H_lCNboSpww20k?81;HbbZ>t$GT4E-yMxnkA zdPBj!d*NnOM#8ls;2%DM8t54Yno>w;z=BB!Cep!V15Wu4Dgrws^`pc8Kxa3mOs};4uFD75 zq~RRBljG%0+V!V%A!T)*OZej?6$UpdhOd)~mR3Csu8KlFhT=k?AI`E~DmPywX3f*q zm428NBq8w?YMdDUHP_jwJiQ;60$E`n=r8vyx{!*?^-DUBj@5fLFXe`(S1}july(Dl zSU9Kmxp;T#`32WlTxoIowZ7T>t=J8MsLn;D$e(= z7MxFwavP299?N&}syA3kTD_DYzDXq6*^Rwd3uu?CamYX`8I6Ep*#wLhETrA$KVO0Y znvi_M;DbxF)VrL9Q;UDo8elaD3s@%|G%|u8c}Yq~7vBG?lqyjSZkT~_H~YspE;_6n z&9MGxT}!JE%PDCLZS!x#Ds2afhE#MCz9#KLq1W*V(tx4dNPJ30XwzHs?>V)4q+E2G*=W!e3ld0l9_Y1PNpSg$MYp$%Mx+0`gG&93hRpZI4RwsD^x%G#^ z4&;=T5hTmL%%TQ}n%+@#y%j;Cbf?_6{Rz@~Hl$B-n9Q%0JvTzGy zAG$~l^OTB&T7D?da*A<0AJDELL4CzT;RATJKwhvY4vG;HpFg@4KPkcx@pgshR^r=K z^sx_?sLL{eX0~KZP^)=za&ms{2eN0+#s}I1i;Ho7{*)vpqe8VH1KeTv6eqZI;M7yN zOJ@0mRZ|#99Ua^z<5Q4$Jdb)*C*iWZO8sf4fLVg2D8PhZK(#Ab#X|7HkQ@`zNa`yj zRzR$9xV*8tS}M@Z!)bdYR$5;E`fF%dm|xP6ij6XyxxusPT+AhUpb3j?4_kQ(=Wf+> zD`|uNJJ8{9H;RM>FtH5_lC#mLv88H7HfiE+m7M$0g^L zjmHgi|Av%cEb*y2To5S4(Yew->3iHEdtvv|vPjd?Zdt=o?-H`-Paje*5O<#rjbG$NG9~qU*ngtI?VH zlj}r47$IX@Wx|B{d@GK&j!x<1v1_t?ojj6=NW|N>J}I*ya0mktiVwJkublm&Q7>CA ziE@}ZLzM4pOQJ_!@MaA}$~1FEdY|3!40HHkf)wE5^J6zl#bI4G)b!RS?K1tk>^PS22Mi~3+w%W`n8&koy1D<)@RJbg|g(hg^%oTg{)5t1hNVT5l|J+>I!FM%yVQFP13+4w;0 zqn{V2#kGIuId*qL$0g4X+`Km$i%va*<)VV$6XK z>e*&RF?R^ltC+HM5)sw4Q3MVo9{k@bY~B{bmQNtDq%P7Gz|)UIa&H@53k?m;1Znsj z*1w3lo&IbzUWzX;y^kmY`+2Q}efxz4h_yoz%t82inlpleRD7?uABn!#H+9kv@8RKW z9i#s7WQb*P5_gvl0!LFwNPz2E!e~irAMWTt!SBVsSmW%&=V^Wi60N_P7{C$k(V^UY zw3o7^d5nUP`gVKR(i}kj5#cyneUIn%%3=MlYjO)vRNoQi0Sozsob^M%Q5>MCVoT$r zqD2Au-JyEVh?WQzTIz;27uHio(IEfQLLGhmA$tubUb_0gmAw5Ni1%gnwbJ++@2(;K z@yGW}sjGZ`jv^xZJN?G7FQp1IzVzt8o6*`VE)E^@#u_s`?eO0~kOp zc|DYXmDCfGwLaJ9cB@O~xgrW$RKal1E-LIpFWNsr3H%&Gt>ACSuQiT0qv|fqRpI~&g zuKm$3DuiI$PuAXJ47j|P^j%c7z(}b@lh_F0yhjOGg7xX%M1Uq2Xn>a^iqUaB&+E@+ zoimOJFq=)6g)q_Z+SzK%`pH1`H@=`OYQOl@A8ts<;?0~V*MYm@ThkCg#s! z)E-Q+b;OYK5Zl)aH(oyTdrGG!9Kb}Pt(%}taE*7DB?;e+g zwwS4c35u8A8UE?9kx5SdW?lpEZU3UOvP!z zLLGs(i=y?Dw%Dbg_=sY${h!TbY;3P|?O^^)BRS14Lo2_`18vn;h;ver7EFMQGHtn$ zsM&OtOo>{M38=3;YRdqRF1q|fXpV%JGti{kf|S-L0BqQY2itGMJ_ z*1-J2t10i5FIuMj8B}5&3H0xnfgJHC5o*f|me!y#nZd*qJGH|8jkEqKLf&b-&mLh|Tr4p?YARA9p?P3p_@Ry}t4F2{6* zNXhCXHSF3wGA}Y-vFfPJa1q+#87^ZvSKytCSA5^Z|AsWB5l(?+EcrGf_sgcQHF8sV zV)|_6RWtulD2oK10;GVs)b#^1b={JnGsIM)ofx(0D5>>sG`XVbf-$90+OPhh+?#0y zc-~O<${CHtK0)^s+(BAO=Ik=ffK69i(SH6d2TaH zVcdIjKjrU~SX%;dFta(>f-CtQc#bd#a_n`7DQ_OW6STeRPU-&9{vet8>wDtlS6%VM z+gom;k+JHc{$AaVA|rS`+*+Wz%a?}#M*Lt4P=5PdR1aLB1KjI*#LhG>cCag`ZQE8W z>kcKQrEE15|Ekd7I_ssW+iS+hg(edllJZ5s?IDO-Ksz>=Q{t=cZoL*I01CJRJfPP5 z{JonPm%an5$RFCgsJ*^HYE}2Sq>@mgFGh`lcMlFLGUr|I^3ub=BMm-p>mUWh(!P1j zIGVpOPBUm300&R5^^@J4jhcKjb1FrUv(z2>1d8G&1~vXasaqrl2uVwN(e)hsCn5Lh z(^<`Dz|JMSCm}41z3!N+P^4HbP7y*;mae#BlRAbt5tbRopd_E>eAbQwiM>87-5y|{a zKBN#Kei4>&2t&DoA|#ccM}^V90XWl4HKSowU*OZ^&N@r-D*9e9rksd@vt60~Vd~g7 z-3##WCjce}%yc!ftqlwH56;zhP^ssxv9uFy;~M_SFEDHu6z&=z0cc$ykWd+=hMtcTY4?lvF9 z>=4+X^mGlpYxE>&jQ|58mmE?V^oG%(Smb~v?1__z3RC*E($$V3H&7jX9f6u-E)C)K zQ7lXPb+@YGmv^$64O%?X89e`A1X5;Ei2$HH}E-3 z6gn&=o|sQd_vNX9uDaunhKKM29g?bh+Y|i{+anbaUf$N6#m_4*XR!K~Q6)z=6)%PdpAks3dVmdO5bP|QCEGecXjfDMvz?o}q&-}31ad5D69 zH>6%}<1NHET|o#xG6YlZ11P+!mq;lTA9eaWSP2k~cJ?Y(&MlZUB5zY>SOQI_^(IWo z(^3;N`mX{xBphR5Vfvj(-f0A=`rQklCZ_M{GMdK*%W?qSBKjS95x{|^p##%5U~{~X zOM?wX3EZyC5E=p1T24>e()Vz%^J0I7p?1dfAO*^n+uPgF z#@x>#@fIAGgBZ?UUJ5@r%VJUO&2xiLN?=#+nrV3{KvNA9Cqbm2n5z$bffQ8*$&1RR(40n0>OHi7n?xQp*jl|#n|@Y~L-mgUjz82=eWaHD=MBDbtLdgdF%sq| z#`o#b!gTO@rt?lj5hIFIE5ddty_}cogqKExb=_B4%Bbeszg`#cKpn!{&{BT#Z5{7S zUTV7e{@c;C=c34Uyyf}SYi0yuy)$~sDNt8a{??y%2b4EN1drfPV{MtEAxZU+|1DnX10^_2y2sF4lc2FRHc z7NJ!rYLo_CtXwh6^>zevzcnGozwf;MSNzc?%`n}RZyv)mwhzp%7hdrCpW$hn;2&qm zwMzjfzEV!}#RfKNE zX(1@!VG0>$^NrZ|d^ivx3M3W3S=b}X<(Rt$VW}2?Pp8<~F1?&ZE@tTq;tX*QXK&0r z4|Cu=o~HO@zi*g4wlG0BUbGhTcu%No@|ubzk5|TdDXWBjZ2eQ)Sn=UNhQ6d zH@{v$f8bF9U*xXw=a>Yk=-VVfE52g-p@@BE25X$x8HgLPWuT6OFgJv#`{KI3)s-(L0V|FU8dQk z%W;B&F~GoP4i^`9nH(St%v-kr%4=Q(;-mhku>Ng5LXa6H025@x-H-z7^e#Eg#}e5|)zUrWXN#vrtDZn5&QbD&YmT7q#KG1cPC zEn^Mg5QYr|oX83&Wzqsx4b+e*#;^Q14{m>A2SdP@ZsF{Uhh1EpXB}tL087X>+&VZb zzSP+$xtAk34g?|cOqidMA>O6%#D*Nt`&Zw42P`fH#QrmqapTv!Zqz*8_`T(x&g+lq znC)@zEC1-?-@kLK&1q@+=4;#c&Nq`P4x3H%TI_}U_C`PdW$(MC17U$#h;GkUch@Ic zpA9n9YzMKB_y;hg8z#`6qXJr?$=20~!lm6^w!d!C)Iwxor{%3*D;7GQt%QoqfWgbe z1TAT2Tno`cQ(Um0p7}|)z2V!V!^6&T{g~u`Vxp(WCRb#ye2Z?kVR4BLcw(Ab%5#O` zpi6Fn|MF#Sx};0>Lpwh|KeH{4ilsD0nVQ#v9_nYD*O#LlAS*zBX>IL(l+#o87!Z01 zduZpj6Q1{N6LB8H@EvcIov}j9}L!FWG;Bbp~xO!RYiN4(+Ch`BPM%q1d8v6O?Pq0s}l@eyPwys zEXs_m3pR7nzc3D3zo84BTl73VlY@Kn*R-*W@&T_fTj-IJEc$d%ZXh#J)s_mx2)T27 zey9+Nfv*>N8ZRqfW0>*Upn6fUhVXmKZqz!$defA71{{vp-=5GSPP9y(BMu1Pqksf7 zufO^%ocCtq5qTRH^67}mJ)FaYk963Q$E%IP3rv2#zKb_rFSS<(pTjYK{<|c}Qai_# zZNXP#NbKQ?y&Uf0r`LvK641pXzhP#ydTN6Qf_E4uH#p4I<)ciS9!;T$5%fPUK-iv% zWzqm`g>=lOqw%Yw60x~Lmc#iMLo=4g2f;tgOdl}zuIs{%Rv{mXb)LmLL!7CN03&87 z;Bu<#OH;wSRJqjCwb!{r`?2QA3$zPrx%G@9gY}A#icEfs%W?1Zo~zF^Yks3UTi(|R z666Pwg%2=&Xry%TP&UAu=UG_X0Jp4XC2q^WKne%onhpYq2TKh+OG!j8Uw;oaL9a@m zuS^tqA2hw|75Abhnrnvj1zh|bAMytU{LSfa^wP}_lS)-iXF7sk^rmHi9m$4E#uq9Zze%Z5cuTfe3W5*Eg`Ya-(uABW-2*aY!WPBE4}Cg_RKb8t(Has z9@%UlJ-2fREp~)}wRTiB+Ok(UNs?S0;c*R;!}fqleAG#`v>+6<0Wnx~5yR!t76g_- z4IvC0g$6YUBEtE$FiMYrM96`PE-3a1ki78FgB>fvu(sFtPNg86q!44K2%tC&AHZFX z*FM`+4)K7QZGnw=mqZEq1+liN7@|v*%X&VwD>cPpQUWA$%J;_oh5MGAMNbuSZLack z%X&W%==s}Fa|0iSWnBD}LGT0orvn1^wI5qq3-lm@nUrD*Iv1h9CQ(b+m^T~@Ucki( zgM-sZhKoAU0@uid^Ic95K_I>*0ukhj+}{u1f3B49Q-) zlo#0ZvyB>DUv*UOg)<^Y6Lj>#@c};xQ|psF8lW8vy66bI9$1QE=RL&fM`jVs@Oc5ikN)LYoJ{gBZN}ye|g(`Y?J_ zq^e%`Nsq9F0_Q{mVS=FoaoZypoKUdhi-l+|mV>b&>xyZ!nw~hI^Z4klTIL71M+nzc< zIo>BbiEeXwBYl0&WhC@k^HY`#0D|sIomu;>i5n*R!veI#Mh}%BJ5;F}DN*E@_bL1D zyR5@nf`Qa{DqmmUJXR;7+1bg|?qMXo>BXZ)j!rI@O6 zV|;=Wrz98ryR4ZK6ViNrUggW;vhKR|D|~v|7t@m_A~REbgl!MwfEhfZ5CJ71G=awI z1Cev)zygTG&g0}(`5xn-La|x){Nj~gxQJ$R)t&_wf0@6AAjuSF&lXA22Oh-O;^(TT zxp{dN(Gz92^-_LW`V4KsAREmKz2}j85U}^hcrsuye87|I_GQ?&jU&s0@HQ6)FqVyK z)_16!a@=o{1GC*f2pIT~yd}F-ro4cNVz~{TH8~KB1Rl`S3kV0c7ueUVLk#w?ifoV6}Pfm^wnt+ zI^5gO4-A*vT%_N;4aZ4&^44putHoUy^|C@v&q^kfEt{XH#mDoj+PT~V2y1IbE1EqC z7l(+RrDmUE{2d5i#2yoqPi0J=w)`sO%}^(3G$UA<0@}Wo908YdG{if)qJ;nzUMVh| zcrY38-g%$&AA}OOJD&4@&oWK~PuA4b5Tfa1I)-UGHz(I2+U!soprqRIiFCFO5X~&K zGa?4%n=3T9EU-P@l~K2!;rkhUIg{ur`hbIXn9+>>armyv1MlSE-SEZ9+=TE=W&bZg zwB=fqp0gqZdCe{{IwynV0BrV*MCk_EY?{;r7t9n)>9D##_F*8J#Ks;BvI8UloKaok z#g$1WV_e92E`ijNb2eod1#kfLg;pnb0SQ3%c39sOCQ#K%iV2Yev2+>+$fENkobqoA z6lv;5!24zsm}bjp^wV7cIcx^4_7xL14 zabmHjq|(EXcPEfl_d4pu6*Xi)3E%=e0QHB?L5f=$*Aq-I=8Uk%l118AP<1l6hz{b$ z041M3byWpu@}DSTWAgAyVdrt-^ar_fFOi8R0o~XN%^TTf?bEVJ!y$wc3L$MnaX$lb z!`i^)35roX)C*CgkLE)Gu=bp(EWS53crkT2D0Rj15(aA$pxs(xZ_iPa5|X#Y+<9jU zYuY;!mBw^=0N~>|z!F;2IuK(!89z#g0RlZ(Q*zk9Mn_*4JO;d>h_FI-x&{&;6$ZEj z)Ubongs{+N9v~^q5G{aYD*)|~aCRXEkC`JFi>@YL?kAxcgk{HPG-M;%mEA@=X| zGw33jiuxck&^byKM=h0{!kC$t|0}$(OA|f=f-p;!@75(eHV^m&1xtRC0F|s5U(K$m zwlf~B7@X&Of^)!|GeCdo&Jj~H(Ipxn3Pr#+$CE@SLE`>%lp-*U=i33F)PP0rQ3NvZ z>9%#(0?u$Kgn(7Zv-3bkqr1{B4R(I6J+QX!EULe_zyEhK1&D#|#6mh_KB~?Rq6EeM zkHAS$q9KJ7fB9U`;i*kFLG)z#kHK7sGzO|IA>yS}L)$=%q?&)4 z-Vs1`ib*BKd{3NyTo`OQUG7O|45%Z7)M+P)WMv@_-~PrF+(3hV%Hs0!FtGq(mm}E4 zz2rG`f3hwOoV2ZkCQr@=ae4Mv;aj^rdu$1r5(S_F)F;ry(eJ)l3jpRW0-l&d<+MP3 zO<_Ha;iwtcWk4;qe&zty_>cr2G`|u?u;2p^*4Cr{p#kF>UJ%oBUhTO5077HtPJo;u z0s!`^1GyM5%7o@fc)0hv)@*On&`G;yPfAx2UCei!FgGkpsGs1Jr$JpkAOAbYqv)CftKT7bLj3 znWx@;PuX58Y1NLB>K@G8nZTJGUuG<{5VYt5v@$Y`1brWKS&LLWck@+%)jK)E1ud$l zod!_LuYygNk%Y(SRAv(-$ABSP0KhPKQDf(2E^Vc@4&Mm|<{$%cBw=k;48^6GHX*WP zEpv0^7Mo=dYz$bDr~E7Mfpl2pgwWRZZvx}rgzQNXwlFvd^NRK&lVG)AMn8SPDs-L` zHTX1>7}>LmYbdzxD{A@_p+p8u#MAit`H8(clL18EtcpGhrA{@Il< z%tC6epkAA8)|Q(X4!ED-cIM{pQ3*+=SVhnQy8l9K+kRuVuxhI(IR812L3#_1t(33r9e~&qrw4CT1q04V|0IKqbW=mCrRDw0`|Q44w4^ z%mUn{?hl4_!kLFlpHg8HZiclWmwzQ|DuB+J@Wx(ChJX(o^EGS`l`LPZG3XGn`eEMS zhjd!EUQz@KCCEOhtMt9SmT&70|8sDV+9H_%yx;fYk}rWDrXe6(LjPv@wzSsq@!tmu zF`sRMsz+Kta!G|#%Uw=W-vnJbwfPKGC-wKf{xyMl6xfOt%F?J-C*6H9{3yZbMX<@EHTqq6R>=%7rX8EhUf6)gBERg9vjM z$NRTYAs^`M=W1pM8OpN2V@Zfl4jxM7wyU|oK$@BHG5GH&SQ6w!CnoYsc$aWra-6Z% zJmTi=km=ImJ5iK%KVb`e%Kn5AL$u!>0KXOTROQ~>++23el?jV+gFJld;@rDXDO%36 zr~2*!tkPcy2d9|1nJFkBiKdbuE!KShtVO`V8DvpJ(|P4QqrF;xB*E)HVow#Lh$Z=y zN6NgQgaqRDW6yjuCWu!Vn@+}x*T~q|CKVxVt4ABl475Tl<7wjPq%ozX2j@CHy$Pq* zXobvSC%(%qQF36bKt}W9RC+!1+t*uI59@D;sij6J@F}E1zJ7K6g!XUibO67>qh)!b zd;><&Cu%zy_D(Sd&p3RMd7s9P&W;r|Jp(e?zAhrh0dOkz;N|b?xtp^~0YJKx-Gl4v zH}*9R4oh^@KYtT~Y>JA;+k^p68T2J3$TegSR+=_nxNSSXiF+nI(|GxwsCr^JluytH zcu`~f3_$hpwXA*uV*~c568TU%1wfrc$lb%^*Ll^T*v-Bx2yh)<3lL3N3S5PjQf22d zCn-&vf}_bVz0n~%?1~iP_x|uG6P%bXD93Z7InG~N4; zkMZ%SeG8=O6+H5{ALUQUBf+#s=>`T^nz4!4mCEcS#?s4 zGQv1n!uu_u8ZUHob)k%mPGEmt3mZN0*|{wVS1~*Vg`)Nv|0ct9j@5~I zVi3FOQE5EfFtHTct()<**wYZ8@+*QrUU`F3U1np~pbC2D)g=EE`t}iuGMru;@|+Tg z07#T$!mNsp_w2vqjc$Q~Hg)hw;_hx_S$?U?#(Syz1@d_NI0$--csyWN4{9)c1#~_D zm=k=Q<7N0qNe|Dq9X>FyLc?+Le$DriJePsyC02k4Rd+8@Y|<0m*`Hf+-!Y%s`^P@k zMqCJSu0v4|h)luQprowKYBOeJI1O_!U6CI0#|EbGxDSfNiBwkysZ{FOyovb|bk-s4 z1R8EpL+5|m`KZ(u+kDZrkjl9dGE3FD_e$W)PAT9WnnAVx|iW^=082St#Q8K#qR zL^U>Zyq?{FN?( zkB50&D8WpuorqK{;MF#lwNhpAF3S zmCe{eAPo1TYIhDcGD+z7b8`C?o zN7pa0akv23gqez#y4Y9jZKlc3ilf@fwk@O_9g@k>1AFi^kD{X95o7OJN%RZ`0o zh9Tlw=Eq~n-tF$i+dC38NX`N1DKZMWD6UO+e$Ws=$Q2pc?FSqjqtyd|(OuZA;Fe0cqh7-1Y9Ow}Z z%Op(Bn;ii_Sz^oUr>=|J+mDZT1en$^Y@m;DQJl|W+IHz!WPF;b)&bkT~&BKKy#z?a$wOOi9(^2GA_MLfIeu`=@ARPf*p^#tIcK;E00O*4HnBYWX_X5NA;_ z6D#>KJ`_o0Dm(yn+c4_uChsZ)Y|EnQr@8*8m8|uy$Su2?mb|H8TwDLxCF9E zA_dRAl>#vs+QXTnlv7Wwf8hn)v=F|a_2&nyEg%0AoSm5fs#mYp2pX$Ipe_n`ITF@? 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 literal 0 HcmV?d00001 diff --git a/ios/watch WatchKit Extension/ComplicationController.swift b/ios/watch WatchKit Extension/ComplicationController.swift index 8d9cf5a..ee35cdc 100644 --- a/ios/watch WatchKit Extension/ComplicationController.swift +++ b/ios/watch WatchKit Extension/ComplicationController.swift @@ -10,11 +10,15 @@ import ClockKit class ComplicationController: NSObject, CLKComplicationDataSource { + // MARK: - Properties - + + private let tableDataPersistanceService = TableDataPersistanceService() + // MARK: - Complication Configuration - + func getComplicationDescriptors(handler: @escaping ([CLKComplicationDescriptor]) -> Void) { let descriptors = [ - CLKComplicationDescriptor(identifier: "complication", displayName: "Runner", supportedFamilies: CLKComplicationFamily.allCases) + CLKComplicationDescriptor(identifier: "complication", displayName: "Runner", supportedFamilies: [CLKComplicationFamily.circularSmall, CLKComplicationFamily.graphicCircular, CLKComplicationFamily.graphicCorner]) // Multiple complication support can be added here with more descriptors ] @@ -25,7 +29,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource { func handleSharedComplicationDescriptors(_ complicationDescriptors: [CLKComplicationDescriptor]) { // Do any necessary work to support these newly shared complication descriptors } - + // MARK: - Timeline Configuration func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { @@ -37,23 +41,50 @@ class ComplicationController: NSObject, CLKComplicationDataSource { // Call the handler with your desired behavior when the device is locked handler(.showOnLockScreen) } - + // MARK: - Timeline Population func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) { - // Call the handler with the current timeline entry - handler(nil) + if let template = getComplicationTemplate(for: complication, using: Date()) { + let entry = CLKComplicationTimelineEntry(date: Date(), complicationTemplate: template) + handler(entry) + } else { + handler(nil) + } } func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { // Call the handler with the timeline entries after the given date handler(nil) } - + // MARK: - Sample Templates func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) { // This method will be called once per supported complication, and the results will be cached - handler(nil) + let template = getComplicationTemplate(for: complication, using: Date()) + if let t = template { + handler(t) + } else { + handler(nil) + } + } +} + + +// MARK: - Private methods - +private extension ComplicationController { + func getComplicationTemplate(for complication: CLKComplication, using date: Date) -> CLKComplicationTemplate? { + let text = tableDataPersistanceService.getTableData().first ?? "n/a" + switch complication.family { + case .graphicCorner: + return CLKComplicationTemplateGraphicCornerGaugeText(gaugeProvider: CLKSimpleGaugeProvider(style: .fill, gaugeColor: .purple, fillFraction: 0.44), outerTextProvider: CLKSimpleTextProvider(text: text)) + case .graphicCircular: + return CLKComplicationTemplateGraphicCircularStackText(line1TextProvider: CLKSimpleTextProvider(text: "\(text)1"), line2TextProvider: CLKSimpleTextProvider(text: "\(text)2")) + case .circularSmall: + return CLKComplicationTemplateCircularSmallSimpleText(textProvider: CLKSimpleTextProvider(text: text)) + default: + return nil + } } } diff --git a/ios/watch WatchKit Extension/ExtensionDelegate.swift b/ios/watch WatchKit Extension/ExtensionDelegate.swift index 729ccc0..80da632 100644 --- a/ios/watch WatchKit Extension/ExtensionDelegate.swift +++ b/ios/watch WatchKit Extension/ExtensionDelegate.swift @@ -6,11 +6,17 @@ // import WatchKit +import ClockKit class ExtensionDelegate: NSObject, WKExtensionDelegate { + + private let weatherService = WeatherService.shared func applicationDidFinishLaunching() { // Perform any final initialization of your application. + CommunicationService.instance.setupService() + weatherService.fetchWeatherBackground(isFirst: true) + updateComplications() } func applicationDidBecomeActive() { @@ -21,14 +27,17 @@ class ExtensionDelegate: NSObject, WKExtensionDelegate { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, etc. } - + func handle(_ backgroundTasks: Set) { // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one. + print("HANDLE CALLED for some background tasks: \n", backgroundTasks) for task in backgroundTasks { // Use a switch statement to check the task type switch task { case let backgroundTask as WKApplicationRefreshBackgroundTask: // Be sure to complete the background task once you’re done. + print("APP REFRESH BACKGROUND TASK!: \n", backgroundTasks) + //WeatherService.shared.fetchWeatherBackground() backgroundTask.setTaskCompletedWithSnapshot(false) case let snapshotTask as WKSnapshotRefreshBackgroundTask: // Snapshot tasks have a unique completion call, make sure to set your expiration date @@ -38,7 +47,17 @@ class ExtensionDelegate: NSObject, WKExtensionDelegate { connectivityTask.setTaskCompletedWithSnapshot(false) case let urlSessionTask as WKURLSessionRefreshBackgroundTask: // Be sure to complete the URL session task once you’re done. - urlSessionTask.setTaskCompletedWithSnapshot(false) + print("URL SESSION TASK!: \n", urlSessionTask) + weatherService.onUrlSessionBackgroundTaskCompleted = { [weak self] shouldUpdate in + //weatherService.fetchWeatherBackground(isFirst: false) // schedule anotheer refresh + if (shouldUpdate) { + print("UPDATING COMPLICATIONS") + self?.updateComplications() + } else { + print("Did not update any complications") + } + urlSessionTask.setTaskCompletedWithSnapshot(false) + } case let relevantShortcutTask as WKRelevantShortcutRefreshBackgroundTask: // Be sure to complete the relevant-shortcut task once you're done. relevantShortcutTask.setTaskCompletedWithSnapshot(false) @@ -53,3 +72,47 @@ class ExtensionDelegate: NSObject, WKExtensionDelegate { } } + + +// MARK: - Private methods - + +private extension ExtensionDelegate { + func updateComplications() { + Task { + let complicationServer = CLKComplicationServer.sharedInstance() + let activeComplications = await complicationServer.getActiveComplications() + print("Active complications: ", activeComplications) + for complication in activeComplications { + complicationServer.reloadTimeline(for: complication) + } + } + } +} + + + +// This is used to get active complciations safely, check apple documetation +extension CLKComplicationServer { + + // Safely access the server's active complications, main actor enabels the code torun on the main thread + @MainActor + func getActiveComplications() async -> [CLKComplication] { + return await withCheckedContinuation { continuation in + + // First, set up the notification. + let center = NotificationCenter.default + let mainQueue = OperationQueue.main + var token: NSObjectProtocol? + token = center.addObserver(forName: .CLKComplicationServerActiveComplicationsDidChange, object: nil, queue: mainQueue) { _ in + center.removeObserver(token!) + continuation.resume(returning: self.activeComplications!) + } + + // Then check to see if we have a valid active complications array. + if activeComplications != nil { + center.removeObserver(token!) + continuation.resume(returning: self.activeComplications!) + } + } + } +} diff --git a/ios/watch WatchKit Extension/Info.plist b/ios/watch WatchKit Extension/Info.plist index 552fed0..9396ace 100644 --- a/ios/watch WatchKit Extension/Info.plist +++ b/ios/watch WatchKit Extension/Info.plist @@ -2,8 +2,6 @@ - WKCompanionAppBundleIdentifier - com.nativeCommunication.demo.demo NSExtension NSExtensionAttributes diff --git a/ios/watch WatchKit Extension/InterfaceController.swift b/ios/watch WatchKit Extension/InterfaceController.swift index a3af0ff..81bd2e1 100644 --- a/ios/watch WatchKit Extension/InterfaceController.swift +++ b/ios/watch WatchKit Extension/InterfaceController.swift @@ -7,20 +7,15 @@ import WatchKit import Foundation -import WatchConnectivity class InterfaceController: WKInterfaceController { @IBOutlet weak var label: WKInterfaceLabel! @IBOutlet weak var button: WKInterfaceButton! - var wcSession: WCSession? private var counter = 0 private let communicationService = CommunicationService.instance - override func awake(withContext context: Any?) { - communicationService.setupService() - //communicationService.addDelegate(self) } override func willActivate() { @@ -38,15 +33,14 @@ class InterfaceController: WKInterfaceController { extension InterfaceController: CommunicationServiceDelegate { var subscriptionTheme: WatchReceiveMethod { - .incrementWatchCounter + .incrementWatchCounter } var id: String { - "interfaceId" + "interfaceId" } func onDataReceived(data: Any?) { - print("Receieved data for counter: ", data) self.counter = (data as? Int) ?? 0 print("Receieved counter: ", counter) self.label.setText("Counter: \(self.counter)") diff --git a/ios/watch WatchKit Extension/Services/ConnectivityService.swift b/ios/watch WatchKit Extension/Services/ConnectivityService.swift index aa73c6b..ffb8479 100644 --- a/ios/watch WatchKit Extension/Services/ConnectivityService.swift +++ b/ios/watch WatchKit Extension/Services/ConnectivityService.swift @@ -23,15 +23,39 @@ enum WatchSendMethod: String { case sendCounterToFlutter } -final class CommunicationService: NSObject, WCSessionDelegate { +final class CommunicationService: NSObject { + + // MARK: - Properties - + static let instance = CommunicationService() + private var delegates = [CommunicationServiceDelegate]() private let tableDataPersistanceService = TableDataPersistanceService() private let wcSession = WCSession.default - // TODO: Add removal from delegates, so no calles are made when not needed. - private var delegates = [CommunicationServiceDelegate]() + + // MARK: - Int - private override init() {} +} + +// MARK: - WCSessionDelegate methods +extension CommunicationService: WCSessionDelegate { + func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { + print("@session did complete with: acctivation state: ", activationState.rawValue) + print("Is reachable: ", wcSession.isReachable) + } + func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { + handleIncommingMessages(message: message, replyHandler: nil) + } + + func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { + handleIncommingMessages(message: applicationContext, replyHandler: nil) + } +} + +// MARK: - Public methods - + +extension CommunicationService { func setupService() { if(WCSession.isSupported()) { wcSession.delegate = self @@ -48,9 +72,6 @@ final class CommunicationService: NSObject, WCSessionDelegate { delegates.removeAll { delegate in delegate.id == id } - delegates.forEach { delegate in - print(delegate.id) - } print("Removed delegates, now list: ", delegates) } @@ -65,11 +86,15 @@ final class CommunicationService: NSObject, WCSessionDelegate { let messageData: [String: Any] = ["method": method, "data": data] wcSession.sendMessage(messageData, replyHandler: nil, errorHandler: nil) } - +} + +// MARK: - Private methods - + +private extension CommunicationService { func handleIncommingMessages(message: [String : Any], replyHandler: (([String : Any]) -> Void)?) { print("Watch received message: ", message) guard let method = message["method"] as? String, let subscriptionTheme = WatchReceiveMethod(rawValue: method) else { - print("No such method for watch: ", message["method"]) + print("No such method for watch: ", message["method"] ?? "n/a") return } let data = message["data"] @@ -77,8 +102,7 @@ final class CommunicationService: NSObject, WCSessionDelegate { if (subscriptionTheme == .presentTableData) { handleTableData(data: data) } - - print("Notifiy for delegates with theme: ", subscriptionTheme) + delegates.forEach { delegate in if (delegate.subscriptionTheme == subscriptionTheme) { delegate.onDataReceived(data: data) @@ -92,19 +116,4 @@ final class CommunicationService: NSObject, WCSessionDelegate { } tableDataPersistanceService.saveTableData(tableData) } - - func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { - print("@session did complete with: acctivation state: ", activationState.rawValue) - print("Activated state...") - print("Is reachable: ", wcSession.isReachable) - } - - func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { - handleIncommingMessages(message: message, replyHandler: nil) - } - - func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { - handleIncommingMessages(message: applicationContext, replyHandler: nil) - } } - diff --git a/ios/watch WatchKit Extension/Services/WeatherService.swift b/ios/watch WatchKit Extension/Services/WeatherService.swift new file mode 100644 index 0000000..2c54ff2 --- /dev/null +++ b/ios/watch WatchKit Extension/Services/WeatherService.swift @@ -0,0 +1,181 @@ +// +// WeatherService.swift +// watch WatchKit Extension +// +// Created by Ivan Stajcer on 03.03.2022.. +// + +import Foundation +import WatchKit + +// api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API key} + +typealias WeatherCallback = (WeatherData) -> Void + +struct WeatherData: Codable { + let temperature: String + let windSpeed: String + let pressure: String + + static func mock() -> WeatherData { + WeatherData(temperature: "mock", windSpeed: "mock", pressure: "mock") + } + + static func createFromData(with data: Data) -> WeatherData { + guard let weatherDataJSON = try? JSONSerialization.jsonObject(with: data, options: .topLevelDictionaryAssumed) as? [String : Any] else { + print("JSON object failed to be created.") + return WeatherData.mock() + } + print("Created JSON object: \n", weatherDataJSON) + guard + let temp = (weatherDataJSON["main"] as? [String : Any])?["temp"] as? Double, + let wind = (weatherDataJSON["wind"] as? [String : Any])?["speed"] as? Double, + let pressure = (weatherDataJSON["main"] as? [String : Any])?["pressure"] as? Int + else { + print("Converting to data from JSON failed") + return WeatherData.mock() + } + print("Success!") + let weatherData = WeatherData(temperature: String(temp), windSpeed: String(wind), pressure: String(pressure)) + return weatherData + } +} + +protocol WeatherServiceProtocol { + func fetchWeatherForeground(completion: WeatherCallback?) + func fetchWeatherBackground(isFirst: Bool) +} + +final class WeatherService: NSObject { + + // MARK: - Properties - + + static let shared = WeatherService() + var onUrlSessionBackgroundTaskCompleted: ((_ shouldUpdate: Bool) -> Void)? + private let tableDataPersistanceService = TableDataPersistanceService() + private let apiKey = "33a595b1052037a58ebbd6503b0303ac" + private var backgroundTask: URLSessionTask? // Store task in order to complete it when finished + + // MARK: - Comupted properties - + + private var backgroundSession: URLSession { + let sessionIdentifier = "backgroundConfigurationIdentifier" + let config = URLSessionConfiguration.background(withIdentifier: sessionIdentifier) + config.isDiscretionary = false + config.sessionSendsLaunchEvents = true + + return URLSession(configuration: config, + delegate: self, + delegateQueue: nil) + + } + + // MARK: - Init - + + private override init() {} +} + +// MARK: - Public methods - + +extension WeatherService: WeatherServiceProtocol { + /* SCHEDULE A BACKGROOUND REFRESH TASK -> tis task DOES NOT ALLOW NETWORKING! + + Shedule task -> afte tim is up, system decides whento call and calles the WKExtension delegate handle method + + Can only have about 4 of them in 1h, when you have complications. Only 1 if not. + */ + func scheduleBackgroundRefresh() { + WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate: Date(timeIntervalSinceNow: 8), userInfo: nil) { error in + print("Error when shcedualing background refresh task: ", error) + } + } + + /* SCHEDULE A URL SESSION BACKGROUND TASK -> ALLOWS networking! + + Schedule task -> time passes -> WKEExtension delegategate 'handle' method called -> you set completion handler -> when task completed + URL session delegate method 'didFinishDownloadingTo' gets called -> you call your completion ahndler there + + Can only have about 4 of them in 1h, when you have complications. Only 1 if not. + */ + func fetchWeatherBackground(isFirst: Bool) { + if (backgroundTask == nil) { + let task = backgroundSession.downloadTask(with: getUrlRequest()) + // if not first task, schedule in 15 minutees + task.earliestBeginDate = Date().addingTimeInterval(isFirst ? 10 : 15*60) + backgroundTask = task + task.resume() + } + } + + // Can only be called while app in foreground + func fetchWeatherForeground(completion: WeatherCallback?) { + let task = URLSession.shared.dataTask(with: getUrlRequest()) { [weak self] data, response, error in + guard + let data = data, + let response = response as? HTTPURLResponse, + 200..<300 ~= response.statusCode + else { + return + } + let weatherData = WeatherData.createFromData(with: data) + completion?(weatherData) + } + task.resume() + } +} + +// MARK: - URLSessionDownloadDelegate methods - + +extension WeatherService: URLSessionDownloadDelegate { + func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { + processFile(at: location) + } + + private func processFile(at url: URL){ + if let data = try? Data(contentsOf: url) { + let weatherData = WeatherData.createFromData(with: data) + tableDataPersistanceService.saveTableData(["Bok", "From", "Background", "WOW"]) + onUrlSessionBackgroundTaskCompleted?(true) + print("Weather data from file downlaoded in background: \n", weatherData) + } else { + print("Can not get 'Data' from file at loaction: \n", url) + } + } +} + + +// MARK: - Private methods - + +private extension WeatherService { + func getUrlRequest() -> URLRequest { + var urlComponents = URLComponents(string: "https://api.openweathermap.org/data/2.5/weather")! + urlComponents.queryItems = [URLQueryItem(name: "lat", value: "45.5550"), URLQueryItem(name: "lon", value: "18.6955"), URLQueryItem(name: "appid", value: "33a595b1052037a58ebbd6503b0303ac")] + var request = URLRequest(url: urlComponents.url!) + request.httpMethod = "GET" + return request + } +} + + +//extension WeatherService: URLSessionDownloadDelegate { +// func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { +// processFile(at: location) +// +// self.pendingBackgroundTasks.forEach { task in +// task.setTaskCompletedWithSnapshot(false) +// } +// } +// +// +// private func processFile(at url: URL){ +// if let data = try? Data(contentsOf: url) { +// let weatherData = WeatherData.createFromData(with: data) +// print("Weather data from file downlaoded in background: \n", weatherData) +// weatherLabel.setText("Temp: \(weatherData.temperature)") +// windLabel.setText("Wind: \(weatherData.windSpeed)") +// pressureLabel.setText("Pressure: \(weatherData.pressure)") +// } else { +// print("Can not get 'Data' from file at loaction: \n", url) +// } +// } +//} diff --git a/ios/watch WatchKit Extension/WeatherInterfaceController.swift b/ios/watch WatchKit Extension/WeatherInterfaceController.swift new file mode 100644 index 0000000..d7c5e0e --- /dev/null +++ b/ios/watch WatchKit Extension/WeatherInterfaceController.swift @@ -0,0 +1,44 @@ +// +// WeatherInterface.swift +// watch WatchKit Extension +// +// Created by Ivan Stajcer on 03.03.2022.. +// + +import Foundation +import WatchKit + +final class WeatherInterfaceController: WKInterfaceController { + @IBOutlet weak var weatherLabel: WKInterfaceLabel! + @IBOutlet weak var windLabel: WKInterfaceLabel! + @IBOutlet weak var pressureLabel: WKInterfaceLabel! + private var counter = 0 + private let weatherDataService = WeatherService.shared + + override func awake(withContext context: Any?) { + + } + + override func willActivate() { + print("WILL ACTIVATE") + //weatherDataService.fetchWeatherBackground(delegate: self) +// { [weak self] weatherData in + +// } + } + + override func willDisappear() { + } + + @IBAction func onFetchButtonPressed() { + WeatherService.shared.fetchWeatherForeground { [weak self] weatherData in + self?.updateUI(with: weatherData) + } + } + + func updateUI(with weatherData: WeatherData) { + weatherLabel.setText("Temp: \(weatherData.temperature)") + windLabel.setText("Wind: \(weatherData.windSpeed)") + pressureLabel.setText("Pressure: \(weatherData.pressure)") + } +} diff --git a/ios/watch/Base.lproj/Interface.storyboard b/ios/watch/Base.lproj/Interface.storyboard index 05c4497..9c68803 100644 --- a/ios/watch/Base.lproj/Interface.storyboard +++ b/ios/watch/Base.lproj/Interface.storyboard @@ -11,7 +11,7 @@ - @@ -29,7 +34,30 @@ - + + + + + + + + + + + + + + + + + @@ -56,7 +84,7 @@ - + @@ -73,21 +101,21 @@ - + - + - +