From 0d8e2e2b8e5364771e181a8aaafb34e382447d0d Mon Sep 17 00:00:00 2001 From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com> Date: Fri, 24 Apr 2020 11:52:21 -0400 Subject: [PATCH] UI: support dark mode Change-Id: I9dd5ed0b9dd22ec88a6eeabb71107e2b77c840bf --- Ring/Ring/Calls/CallViewController.storyboard | 4 +- Ring/Ring/Calls/CallViewController.swift | 11 +- .../ContactPickerViewController.storyboard | 2 +- .../ContactPickerViewController.swift | 22 ++- Ring/Ring/Constants/Generated/Images.swift | 9 +- .../Contact/ContactViewController.storyboard | 3 +- Ring/Ring/Contact/ContactViewController.swift | 10 +- Ring/Ring/Contact/ProfileHeaderView.swift | 7 + Ring/Ring/Contact/ProfileHeaderView.xib | 12 +- Ring/Ring/Dialpad/DialpadViewController.swift | 6 +- Ring/Ring/EditProfileViewController.swift | 4 - Ring/Ring/Extensions/UIColor+Ring.swift | 91 +++++++++++- .../Extensions/UIViewController+Ring.swift | 12 +- .../ContactRequestsViewController.storyboard | 15 +- .../ContactRequestsViewController.swift | 9 +- .../ConversationViewController.storyboard | 45 +++--- .../ConversationViewController.swift | 15 +- .../Conversation/MessageAccessoryView.swift | 20 ++- .../Conversation/MessageAccessoryView.xib | 40 ++--- .../SmartList/Cells/AccountItemView.swift | 1 + .../SmartlistViewController.storyboard | 90 ++++++------ .../SmartList/SmartlistViewController.swift | 138 +++++++++++++----- .../InitialLoadingViewController.swift | 6 +- .../Me/LinkNewDeviceViewController.swift | 4 - Ring/Ring/Features/Me/Me/AccountHeader.swift | 6 + Ring/Ring/Features/Me/Me/AccountHeader.xib | 16 +- .../Me/Me/BlockListViewController.storyboard | 15 +- .../Me/Me/BlockListViewController.swift | 7 +- Ring/Ring/Features/Me/Me/DeviceCell.xib | 2 +- .../Me/Me/MeViewController.storyboard | 13 +- .../Features/Me/Me/MeViewController.swift | 33 +++-- .../CreateAccountViewController.storyboard | 4 +- .../CreateAccountViewController.swift | 26 +++- .../CreateAccountViewModel.swift | 1 - .../CreateProfileViewController.storyboard | 2 +- .../CreateProfileViewController.swift | 18 ++- .../CreateSipAccountViewController.storyboard | 1 + .../CreateSipAccountViewController.swift | 20 +++ .../LinkDevice/LinkDeviceViewController.swift | 20 ++- ...kToAccountManagerViewController.storyboard | 1 - .../LinkToAccountManagerViewController.swift | 17 +++ .../Welcome/WelcomeViewController.swift | 7 +- .../GeneralSettingsViewController.storyboard | 12 +- .../GeneralSettingsViewController.swift | 4 +- Ring/Ring/Info.plist | 2 +- .../MigrateAccountViewController.swift | 10 +- Ring/Ring/QRCode/ScanViewController.swift | 4 - .../Contents.json | 56 +++++++ .../Contents.json | 56 +++++++ .../background_ring.imageset/Contents.json | 21 --- .../background_ring.png | Bin 48001 -> 0 bytes .../Contents.json | 56 +++++++ .../row_selected.colorset/Contents.json | 56 +++++++ .../shadow_color.colorset/Contents.json | 56 +++++++ .../text_blue_color.colorset/Contents.json | 56 +++++++ .../Contents.json | 56 +++++++ .../Contents.json | 56 +++++++ Ring/Ring/Resources/LaunchScreen.storyboard | 12 +- Ring/Ring/TabBar/BaseViewController.swift | 4 +- 59 files changed, 994 insertions(+), 308 deletions(-) create mode 100644 Ring/Ring/Resources/Images.xcassets/background_input_text.colorset/Contents.json create mode 100644 Ring/Ring/Resources/Images.xcassets/background_msg_received.colorset/Contents.json delete mode 100644 Ring/Ring/Resources/Images.xcassets/background_ring.imageset/Contents.json delete mode 100644 Ring/Ring/Resources/Images.xcassets/background_ring.imageset/background_ring.png create mode 100644 Ring/Ring/Resources/Images.xcassets/message_background_color.colorset/Contents.json create mode 100644 Ring/Ring/Resources/Images.xcassets/row_selected.colorset/Contents.json create mode 100644 Ring/Ring/Resources/Images.xcassets/shadow_color.colorset/Contents.json create mode 100644 Ring/Ring/Resources/Images.xcassets/text_blue_color.colorset/Contents.json create mode 100644 Ring/Ring/Resources/Images.xcassets/text_field_background_color.colorset/Contents.json create mode 100644 Ring/Ring/Resources/Images.xcassets/text_secondary_color.colorset/Contents.json diff --git a/Ring/Ring/Calls/CallViewController.storyboard b/Ring/Ring/Calls/CallViewController.storyboard index 9a4ff90a3..c7804a409 100644 --- a/Ring/Ring/Calls/CallViewController.storyboard +++ b/Ring/Ring/Calls/CallViewController.storyboard @@ -171,7 +171,7 @@ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> </view> <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="0.17999999999999999" colorSpace="custom" customColorSpace="sRGB"/> - <blurEffect style="light"/> + <blurEffect style="regular"/> </visualEffectView> <imageView userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="left_arrow" translatesAutoresizingMaskIntoConstraints="NO" id="gWE-IS-b5p"> <rect key="frame" x="-17" y="393.66666666666669" width="60" height="70"/> @@ -306,7 +306,7 @@ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> </view> <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="0.17661065924657535" colorSpace="custom" customColorSpace="sRGB"/> - <blurEffect style="light"/> + <blurEffect style="regular"/> </visualEffectView> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Dj8-CK-PQm" userLabel="Call Pulse"> <rect key="frame" x="117.66666666666669" y="130" width="140" height="140"/> diff --git a/Ring/Ring/Calls/CallViewController.swift b/Ring/Ring/Calls/CallViewController.swift index 11a453c5f..1fcf053e3 100644 --- a/Ring/Ring/Calls/CallViewController.swift +++ b/Ring/Ring/Calls/CallViewController.swift @@ -88,15 +88,11 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased { private let log = SwiftyBeaver.self - override var preferredStatusBarStyle: UIStatusBarStyle { - return self.viewModel.isAudioOnly ? .lightContent : .default - } - var tapGestureRecognizer: UITapGestureRecognizer! override func viewDidLoad() { super.viewDidLoad() - self.beforeIncomingVideo.backgroundColor = UIColor.white + self.beforeIncomingVideo.backgroundColor = UIColor.jamiBackgroundColor let callCurrent = self.viewModel.call?.state == .current self.setAvatarView(!callCurrent || self.viewModel.isAudioOnly) self.capturedVideoBlurEffect.isHidden = callCurrent @@ -117,6 +113,9 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased { // The durationLabel and buttonsContainer alpha is set here to 0, and to 1 (with a duration) when appear on the screen to have a fade in animation self.durationLabel.alpha = 0 self.buttonsContainer.stackView.alpha = 0 + nameLabel.textColor = UIColor.jamiLabelColor + durationLabel.textColor = UIColor.jamiLabelColor + infoBottomLabel.textColor = UIColor.jamiLabelColor self.showAllInfo() self.setWhiteAvatarView() } @@ -177,7 +176,7 @@ class CallViewController: UIViewController, StoryboardBased, ViewModelBased { func setWhiteAvatarView() { self.callPulse.backgroundColor = UIColor.jamiCallPulse - self.avatarView.backgroundColor = UIColor.white + self.avatarView.backgroundColor = UIColor.jamiBackgroundColor } func initCallAnimation() { diff --git a/Ring/Ring/Calls/Conference/ContactPickerViewController.storyboard b/Ring/Ring/Calls/Conference/ContactPickerViewController.storyboard index 823fcb6e2..2001f7538 100644 --- a/Ring/Ring/Calls/Conference/ContactPickerViewController.storyboard +++ b/Ring/Ring/Calls/Conference/ContactPickerViewController.storyboard @@ -35,7 +35,7 @@ </visualEffectView> </subviews> </view> - <blurEffect style="extraLight"/> + <blurEffect style="regular"/> </visualEffectView> <searchBar contentMode="redraw" translatesAutoresizingMaskIntoConstraints="NO" id="ht5-JP-L4t"> <rect key="frame" x="0.0" y="44" width="414" height="44"/> diff --git a/Ring/Ring/Calls/Conference/ContactPickerViewController.swift b/Ring/Ring/Calls/Conference/ContactPickerViewController.swift index f4153bf22..7272ea071 100644 --- a/Ring/Ring/Calls/Conference/ContactPickerViewController.swift +++ b/Ring/Ring/Calls/Conference/ContactPickerViewController.swift @@ -34,6 +34,8 @@ class ContactPickerViewController: UIViewController, StoryboardBased, ViewModelB var viewModel: ContactPickerViewModel! fileprivate let disposeBag = DisposeBag() + var blurEffect: UIVisualEffectView? + override func viewDidLoad() { super.viewDidLoad() self.setupDataSources() @@ -43,6 +45,24 @@ class ContactPickerViewController: UIViewController, StoryboardBased, ViewModelB dismissGR.direction = UISwipeGestureRecognizer.Direction.down dismissGR.delegate = self self.searchBar.addGestureRecognizer(dismissGR) + self.setUPBlurBackground() + } + + func setUPBlurBackground() { + if #available(iOS 13.0, *) { + blurEffect = UIVisualEffectView(effect: UIBlurEffect(style: .systemChromeMaterial)) + } else { + blurEffect = UIVisualEffectView(effect: UIBlurEffect(style: .extraLight)) + } + if blurEffect != nil { + blurEffect!.frame = self.view.bounds + self.view.insertSubview(blurEffect!, at: 0) + blurEffect!.topAnchor.constraint(equalTo: searchBar.topAnchor, constant: 0).isActive = true + blurEffect!.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0).isActive = true + blurEffect!.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0).isActive = true + blurEffect!.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 0).isActive = true + blurEffect!.translatesAutoresizingMaskIntoConstraints = false + } } @objc func remove(gesture: UISwipeGestureRecognizer) { @@ -148,7 +168,7 @@ class ContactPickerViewController: UIViewController, StoryboardBased, ViewModelB self.searchBar.returnKeyType = .done self.searchBar.autocapitalizationType = .none self.searchBar.tintColor = UIColor.jamiMain - self.searchBar.barTintColor = UIColor.jamiNavigationBar + self.searchBar.barTintColor = UIColor.jamiBackgroundSecondaryColor self.searchBar.rx.text.orEmpty .throttle(0.5, scheduler: MainScheduler.instance) .distinctUntilChanged() diff --git a/Ring/Ring/Constants/Generated/Images.swift b/Ring/Ring/Constants/Generated/Images.swift index 1fdfba0aa..0882d278e 100644 --- a/Ring/Ring/Constants/Generated/Images.swift +++ b/Ring/Ring/Constants/Generated/Images.swift @@ -27,7 +27,8 @@ internal enum Asset { internal static let audioOn = ImageAsset(name: "audio_on") internal static let audioRunning = ImageAsset(name: "audio_running") internal static let backButton = ImageAsset(name: "back_button") - internal static let backgroundRing = ImageAsset(name: "background_ring") + internal static let backgroundInputText = ColorAsset(name: "background_input_text") + internal static let backgroundMsgReceived = ColorAsset(name: "background_msg_received") internal static let blockIcon = ImageAsset(name: "block_icon") internal static let callButton = ImageAsset(name: "call_button") internal static let camera = ImageAsset(name: "camera") @@ -52,6 +53,7 @@ internal enum Asset { internal static let jamiIcon = ImageAsset(name: "jamiIcon") internal static let jamiLogo = ImageAsset(name: "jamiLogo") internal static let leftArrow = ImageAsset(name: "left_arrow") + internal static let messageBackgroundColor = ColorAsset(name: "message_background_color") internal static let moreSettings = ImageAsset(name: "more_settings") internal static let pauseCall = ImageAsset(name: "pause_call") internal static let phoneBook = ImageAsset(name: "phone_book") @@ -59,13 +61,18 @@ internal enum Asset { internal static let qrCodeScan = ImageAsset(name: "qr_code_scan") internal static let revokeDevice = ImageAsset(name: "revoke_device") internal static let ringLogo = ImageAsset(name: "ring_logo") + internal static let rowSelected = ColorAsset(name: "row_selected") internal static let scan = ImageAsset(name: "scan") internal static let sendButton = ImageAsset(name: "send_button") internal static let settings = ImageAsset(name: "settings") internal static let settingsIcon = ImageAsset(name: "settings_icon") + internal static let shadowColor = ColorAsset(name: "shadow_color") internal static let shareButton = ImageAsset(name: "share_button") internal static let stopCall = ImageAsset(name: "stop_call") internal static let switchCamera = ImageAsset(name: "switch_camera") + internal static let textBlueColor = ColorAsset(name: "text_blue_color") + internal static let textFieldBackgroundColor = ColorAsset(name: "text_field_background_color") + internal static let textSecondaryColor = ColorAsset(name: "text_secondary_color") internal static let unpauseCall = ImageAsset(name: "unpause_call") internal static let videoMuted = ImageAsset(name: "video_muted") internal static let videoRunning = ImageAsset(name: "video_running") diff --git a/Ring/Ring/Contact/ContactViewController.storyboard b/Ring/Ring/Contact/ContactViewController.storyboard index c55c6a932..9bdf78037 100644 --- a/Ring/Ring/Contact/ContactViewController.storyboard +++ b/Ring/Ring/Contact/ContactViewController.storyboard @@ -11,7 +11,7 @@ <!--Contact View Controller--> <scene sceneID="ufa-hq-gXE"> <objects> - <viewController id="4oO-a5-k5Y" customClass="ContactViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> + <viewController extendedLayoutIncludesOpaqueBars="YES" id="4oO-a5-k5Y" customClass="ContactViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> <view key="view" contentMode="scaleToFill" id="l1v-RV-Jo2"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> @@ -54,6 +54,7 @@ </constraints> <viewLayoutGuide key="safeArea" id="cTQ-BN-ANe"/> </view> + <extendedEdge key="edgesForExtendedLayout" bottom="YES"/> <connections> <outlet property="tableView" destination="Cjc-Dl-AsW" id="NB3-A4-6sy"/> </connections> diff --git a/Ring/Ring/Contact/ContactViewController.swift b/Ring/Ring/Contact/ContactViewController.swift index 7dca2072d..815389fad 100644 --- a/Ring/Ring/Contact/ContactViewController.swift +++ b/Ring/Ring/Contact/ContactViewController.swift @@ -35,21 +35,19 @@ class ContactViewController: UIViewController, StoryboardBased, ViewModelBased { private var stretchyHeader: ProfileHeaderView! private let titleView = TitleView(frame: CGRect(x: 0, y: 0, width: 200, height: 50)) - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - override func viewDidLoad() { super.viewDidLoad() self.addHeaderView() self.setUpTableView() + view.backgroundColor = UIColor.jamiBackgroundColor + tableView.backgroundColor = UIColor.jamiBackgroundColor navigationItem.titleView = titleView } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - self.navigationController?.navigationBar.layer.shadowColor = UIColor.clear.cgColor - self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) + navigationController? + .navigationBar.layer.shadowColor = UIColor.clear.cgColor } private func addHeaderView() { diff --git a/Ring/Ring/Contact/ProfileHeaderView.swift b/Ring/Ring/Contact/ProfileHeaderView.swift index 14f47acdd..1de306471 100644 --- a/Ring/Ring/Contact/ProfileHeaderView.swift +++ b/Ring/Ring/Contact/ProfileHeaderView.swift @@ -23,6 +23,13 @@ class ProfileHeaderView: GSKStretchyHeaderView { @IBOutlet var avatarView: UIView! @IBOutlet var displayName: UILabel! @IBOutlet var userName: UILabel! + @IBOutlet weak var background: UIView! + + override func willMove(toWindow newWindow: UIWindow?) { + super.willMove(toWindow: newWindow) + self.backgroundColor = UIColor.jamiBackgroundColor + background.backgroundColor = UIColor.jamiBackgroundColor + } override func didChangeStretchFactor(_ stretchFactor: CGFloat) { var alpha = CGFloatTranslateRange(stretchFactor, 0.2, 0.7, 0, 1) diff --git a/Ring/Ring/Contact/ProfileHeaderView.xib b/Ring/Ring/Contact/ProfileHeaderView.xib index b185f4979..4a82a9f53 100644 --- a/Ring/Ring/Contact/ProfileHeaderView.xib +++ b/Ring/Ring/Contact/ProfileHeaderView.xib @@ -1,11 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> - <device id="retina4_7" orientation="portrait"> - <adaptation id="fullscreen"/> - </device> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> @@ -20,7 +18,7 @@ <rect key="frame" x="20" y="45" width="335" height="170"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="O5s-f8-qTg"> - <rect key="frame" x="117" y="0.0" width="100" height="100"/> + <rect key="frame" x="117.5" y="0.0" width="100" height="100"/> <constraints> <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="100" id="0bW-FE-CyE"/> <constraint firstAttribute="width" constant="100" id="3zC-80-Zmb"/> @@ -73,9 +71,11 @@ </userDefinedRuntimeAttributes> <connections> <outlet property="avatarView" destination="O5s-f8-qTg" id="37V-MG-dre"/> + <outlet property="background" destination="qRJ-Vm-D2L" id="xgo-qd-4CJ"/> <outlet property="displayName" destination="pXf-5b-Ea7" id="XwT-cN-xyc"/> <outlet property="userName" destination="RXO-IT-XHT" id="tuJ-tQ-OQZ"/> </connections> + <point key="canvasLocation" x="138" y="121"/> </view> </objects> </document> diff --git a/Ring/Ring/Dialpad/DialpadViewController.swift b/Ring/Ring/Dialpad/DialpadViewController.swift index aced5e144..a4d0cb5ff 100644 --- a/Ring/Ring/Dialpad/DialpadViewController.swift +++ b/Ring/Ring/Dialpad/DialpadViewController.swift @@ -40,6 +40,8 @@ class DialpadViewController: UIViewController, StoryboardBased, ViewModelBased { override func viewDidLoad() { super.viewDidLoad() + view.backgroundColor = UIColor.jamiBackgroundColor + collectionView.backgroundColor = UIColor.jamiBackgroundColor self.applyL10n() let device = UIDevice.modelName if device == "iPhone 5" || device == "iPhone 5c" || device == "iPhone 5s" || device == "iPhone SE" { @@ -111,7 +113,9 @@ extension DialpadViewController: UICollectionViewDelegate, UICollectionViewDataS cell.contentView.subviews.forEach { (view) in view.removeFromSuperview() } - let label = UILabel.init(frame: CGRect(x: 0, y: 0, width: 70, height: 70)) + let originX = (cell.bounds.size.width - 70) * 0.5 + let label = UILabel.init(frame: CGRect(x: originX, y: 0, + width: 70, height: 70)) label.cornerRadius = 35 label.backgroundColor = UIColor(red: 204, green: 204, blue: 204, alpha: 1) label.textAlignment = .center diff --git a/Ring/Ring/EditProfileViewController.swift b/Ring/Ring/EditProfileViewController.swift index 669920071..3c0336896 100644 --- a/Ring/Ring/EditProfileViewController.swift +++ b/Ring/Ring/EditProfileViewController.swift @@ -33,10 +33,6 @@ class EditProfileViewController: UIViewController, UITextFieldDelegate, UIImageP var model: EditProfileViewModel! fileprivate let disposeBag = DisposeBag() - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - // MARK: - functions override func viewDidLoad() { diff --git a/Ring/Ring/Extensions/UIColor+Ring.swift b/Ring/Ring/Extensions/UIColor+Ring.swift index 1c175e93c..752b2b0b0 100644 --- a/Ring/Ring/Extensions/UIColor+Ring.swift +++ b/Ring/Ring/Extensions/UIColor+Ring.swift @@ -80,14 +80,95 @@ extension UIColor { static let jamiMsgCellEmoji = UIColor(red: 0, green: 0, blue: 0, alpha: 0) static let jamiMsgCellSent = UIColor(hex: 0x367BC1, alpha: 1.0) static let jamiMsgCellSentText = UIColor(red: 255, green: 255, blue: 255, alpha: 1.0) - static let jamiMsgCellReceived = UIColor(red: 231, green: 235, blue: 235, alpha: 1.0) + static var jamiMsgCellReceived: UIColor { + if #available(iOS 11.0, *) { + return UIColor(named: "background_msg_received") ?? UIColor(red: 231, green: 235, blue: 235, alpha: 1.0) + } else { + return UIColor(red: 231, green: 235, blue: 235, alpha: 1.0) + } + } + + static var jamiTextBlue: UIColor { + if #available(iOS 11.0, *) { + return UIColor(named: "text_blue_color") ?? UIColor(red: 231, green: 235, blue: 235, alpha: 1.0) + } else { + return UIColor(red: 31, green: 73, blue: 113, alpha: 1.0) + } + } + + static var jamiTextSecondary: UIColor { + if #available(iOS 11.0, *) { + return UIColor(named: "text_secondary_color") ?? UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) + } else { + return UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) + } + } + + static var jamiInputTextBackground: UIColor { + if #available(iOS 11.0, *) { + return UIColor(named: "background_input_text") ?? UIColor(red: 255, green: 255, blue: 255, alpha: 0.57) + } else { + return UIColor(red: 255, green: 255, blue: 255, alpha: 0.57) + } + } + static let jamiMsgCellReceivedText = UIColor(red: 48, green: 48, blue: 48, alpha: 1.0) static let jamiMsgCellTimeText = UIColor(red: 128, green: 128, blue: 128, alpha: 1.0) - static let jamiMsgBackground = UIColor(red: 252, green: 252, blue: 252, alpha: 1.0) - static let jamiMsgTextFieldBackground = UIColor(red: 252, green: 252, blue: 252, alpha: 0) + + static var jamiMsgBackground: UIColor { + if #available(iOS 11.0, *) { + return UIColor(named: "message_background_color") ?? UIColor(red: 252, green: 252, blue: 252, alpha: 1.0) + } else { + return UIColor(red: 252, green: 252, blue: 252, alpha: 1.0) + } + } + + static var jamiMsgTextFieldBackground: UIColor { + if #available(iOS 11.0, *) { + return UIColor(named: "text_field_background_color") ?? UIColor(red: 252, green: 252, blue: 252, alpha: 0) + } else { + return UIColor(red: 252, green: 252, blue: 252, alpha: 0) + } + } static let jamiMsgTextFieldBorder = UIColor(red: 220, green: 220, blue: 220, alpha: 1.0) - static let jamiUITableViewCellSelection = UIColor(red: 209, green: 210, blue: 210, alpha: 1.0) - static let jamiNavigationBar = UIColor(red: 235, green: 235, blue: 235, alpha: 1.0) + static var jamiUITableViewCellSelection: UIColor { + if #available(iOS 11.0, *) { + return UIColor(named: "row_selected") ?? UIColor(red: 209, green: 210, blue: 210, alpha: 1.0) + } else { + return UIColor(red: 209, green: 210, blue: 210, alpha: 1.0) + } + } + static var jamiNavigationBarShadow: UIColor { + if #available(iOS 11.0, *) { + return UIColor(named: "shadow_color") ?? UIColor.black + } else { + return UIColor.black + } + } + + static var jamiBackgroundColor: UIColor { + if #available(iOS 13.0, *) { + return UIColor.systemBackground + } else { + return UIColor.white + } + } + + static var jamiBackgroundSecondaryColor: UIColor { + if #available(iOS 13.0, *) { + return UIColor.secondarySystemBackground + } else { + return UIColor(red: 235, green: 235, blue: 235, alpha: 1.0) + } + } + + static var jamiLabelColor: UIColor { + if #available(iOS 13.0, *) { + return UIColor.label + } else { + return UIColor.black + } + } static let jamiCallPulse = UIColor(hex: 0x039FDF, alpha: 1.0) static let jamiDefaultAvatar = UIColor(hex: 0x039FDF, alpha: 1.0) static let jamiSuccess = UIColor(hex: 0x00b20b, alpha: 1.0) diff --git a/Ring/Ring/Extensions/UIViewController+Ring.swift b/Ring/Ring/Extensions/UIViewController+Ring.swift index 428970bbf..7fcf6e14b 100644 --- a/Ring/Ring/Extensions/UIViewController+Ring.swift +++ b/Ring/Ring/Extensions/UIViewController+Ring.swift @@ -124,13 +124,13 @@ extension UIViewController { } func configureRingNavigationBar() { - self.navigationController?.navigationBar.barTintColor = UIColor.jamiNavigationBar - self.navigationController?.navigationBar.layer.shadowColor = UIColor.black.cgColor - self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0.0, height: 2.5) + self.navigationController?.navigationBar.barStyle = .default + self.navigationController?.navigationBar.isTranslucent = true + self.navigationController?.navigationBar.layer.shadowColor = UIColor.jamiNavigationBarShadow.cgColor + self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0.0, height: 1.5) self.navigationController?.navigationBar.layer.shadowOpacity = 0.2 self.navigationController?.navigationBar.layer.shadowRadius = 3 self.navigationController?.navigationBar.layer.masksToBounds = false - self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) self.navigationController?.navigationBar.shadowImage = UIImage() let textAttributes = [NSAttributedString.Key.foregroundColor: UIColor.jamiMain] self.navigationController?.navigationBar.titleTextAttributes = textAttributes @@ -138,9 +138,9 @@ extension UIViewController { } func configureWalkrhroughNavigationBar() { - let attrPortrait = [NSAttributedString.Key.foregroundColor: UIColor(red: 0, green: 0, blue: 0, alpha: 0.5), + let attrPortrait = [NSAttributedString.Key.foregroundColor: UIColor.jamiTextSecondary, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 31, weight: .thin)] - let attrLandscape = [NSAttributedString.Key.foregroundColor: UIColor(red: 0, green: 0, blue: 0, alpha: 0.5), + let attrLandscape = [NSAttributedString.Key.foregroundColor: UIColor.jamiTextSecondary, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20, weight: .regular)] let isPortrait = UIScreen.main.bounds.size.width < UIScreen.main.bounds.size.height self.navigationController? diff --git a/Ring/Ring/Features/ContactRequests/ContactRequestsViewController.storyboard b/Ring/Ring/Features/ContactRequests/ContactRequestsViewController.storyboard index b166a90f0..33a206913 100644 --- a/Ring/Ring/Features/ContactRequests/ContactRequestsViewController.storyboard +++ b/Ring/Ring/Features/ContactRequests/ContactRequestsViewController.storyboard @@ -1,11 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="gUS-mM-rdY"> - <device id="retina4_7" orientation="portrait"> - <adaptation id="fullscreen"/> - </device> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="gUS-mM-rdY"> + <device id="retina4_7" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <scenes> @@ -22,14 +20,14 @@ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="bPe-Vn-J7U"> - <rect key="frame" x="0.0" y="20" width="375" height="647"/> + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> </tableView> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cXe-K6-eM8"> - <rect key="frame" x="0.0" y="20" width="375" height="647"/> + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <subviews> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No invitations" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pSV-RV-i1C"> - <rect key="frame" x="135.5" y="313" width="104" height="21"/> + <rect key="frame" x="135.5" y="323" width="104" height="21"/> <fontDescription key="fontDescription" type="system" pointSize="17"/> <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> <nil key="highlightedColor"/> @@ -54,7 +52,6 @@ <constraint firstItem="bPe-Vn-J7U" firstAttribute="leading" secondItem="m1T-eD-duJ" secondAttribute="leading" id="jOx-2Z-yoO"/> </constraints> </view> - <extendedEdge key="edgesForExtendedLayout" bottom="YES"/> <navigationItem key="navigationItem" id="dMs-kf-EuK"/> <connections> <outlet property="noInvitationsPlaceholder" destination="cXe-K6-eM8" id="fuk-gt-pdZ"/> diff --git a/Ring/Ring/Features/ContactRequests/ContactRequestsViewController.swift b/Ring/Ring/Features/ContactRequests/ContactRequestsViewController.swift index ed4349ee2..4cfd1d46c 100644 --- a/Ring/Ring/Features/ContactRequests/ContactRequestsViewController.swift +++ b/Ring/Ring/Features/ContactRequests/ContactRequestsViewController.swift @@ -37,12 +37,13 @@ class ContactRequestsViewController: UIViewController, StoryboardBased, ViewMode fileprivate let cellIdentifier = "ContactRequestCell" fileprivate let log = SwiftyBeaver.self - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - override func viewDidLoad() { super.viewDidLoad() + self.view.backgroundColor = UIColor.jamiBackgroundColor + self.tableView.backgroundColor = UIColor.jamiBackgroundColor + noInvitationsPlaceholder.backgroundColor = UIColor.jamiBackgroundColor + noRequestsLabel.backgroundColor = UIColor.jamiBackgroundColor + noRequestsLabel.textColor = UIColor.jamiLabelColor self.configureRingNavigationBar() self.tableView.rx.modelSelected(ContactRequestItem.self) diff --git a/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.storyboard b/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.storyboard index bdbd0bc45..14376b22c 100644 --- a/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.storyboard +++ b/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.storyboard @@ -11,11 +11,25 @@ <!--Conversation View Controller--> <scene sceneID="2Fj-m2-pCD"> <objects> - <viewController hidesBottomBarWhenPushed="YES" id="O1m-sW-gim" customClass="ConversationViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> + <viewController extendedLayoutIncludesOpaqueBars="YES" hidesBottomBarWhenPushed="YES" id="O1m-sW-gim" customClass="ConversationViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> <view key="view" contentMode="scaleToFill" id="lhx-ny-Zct"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="yc2-Jn-6vm"> + <rect key="frame" x="0.0" y="-100" width="375" height="767"/> + <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> + <prototypes> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="MessageCell" id="Cd7-Fm-IM5"> + <rect key="frame" x="0.0" y="28" width="375" height="44"/> + <autoresizingMask key="autoresizingMask"/> + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Cd7-Fm-IM5" id="TOb-Hu-RG9"> + <rect key="frame" x="0.0" y="0.0" width="375" height="44"/> + <autoresizingMask key="autoresizingMask"/> + </tableViewCellContentView> + </tableViewCell> + </prototypes> + </tableView> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5cj-ge-3dv"> <rect key="frame" x="0.0" y="0.0" width="375" height="60"/> <color key="backgroundColor" red="0.88391119240000005" green="0.82437592739999999" blue="0.76125866170000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> @@ -32,20 +46,6 @@ <color key="tintColor" red="0.1215686275" green="0.28627450980000002" blue="0.4431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <state key="normal" title="Navigate to call"/> </button> - <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="yc2-Jn-6vm"> - <rect key="frame" x="0.0" y="60" width="375" height="607"/> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> - <prototypes> - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="MessageCell" id="Cd7-Fm-IM5"> - <rect key="frame" x="0.0" y="28" width="375" height="44"/> - <autoresizingMask key="autoresizingMask"/> - <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Cd7-Fm-IM5" id="TOb-Hu-RG9"> - <rect key="frame" x="0.0" y="0.0" width="375" height="44"/> - <autoresizingMask key="autoresizingMask"/> - </tableViewCellContentView> - </tableViewCell> - </prototypes> - </tableView> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6Wq-EJ-CAF"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <subviews> @@ -54,48 +54,45 @@ <color key="color" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> </activityIndicatorView> </subviews> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <constraints> <constraint firstItem="NYW-Ie-8yB" firstAttribute="centerY" secondItem="6Wq-EJ-CAF" secondAttribute="centerY" id="I23-W6-yIz"/> <constraint firstItem="NYW-Ie-8yB" firstAttribute="centerX" secondItem="6Wq-EJ-CAF" secondAttribute="centerX" id="vB4-hR-9sj"/> </constraints> </view> <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XRu-HM-jhQ"> - <rect key="frame" x="0.0" y="640" width="375" height="27"/> + <rect key="frame" x="0.0" y="641" width="375" height="26"/> <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="lK5-Aw-CC5"> - <rect key="frame" x="0.0" y="0.0" width="375" height="27"/> + <rect key="frame" x="0.0" y="0.0" width="375" height="26"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> </view> <constraints> - <constraint firstAttribute="height" constant="27" id="b0Q-Xd-v7V"/> + <constraint firstAttribute="height" constant="26" id="b0Q-Xd-v7V"/> </constraints> - <blurEffect style="extraLight"/> + <blurEffect style="regular"/> </visualEffectView> </subviews> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <constraints> <constraint firstItem="ehB-ol-cdx" firstAttribute="leading" secondItem="lhx-ny-Zct" secondAttribute="leading" id="AUO-95-xlZ"/> <constraint firstItem="XRu-HM-jhQ" firstAttribute="bottom" secondItem="yc2-Jn-6vm" secondAttribute="bottom" id="D1h-vM-lOK"/> <constraint firstAttribute="trailing" secondItem="6Wq-EJ-CAF" secondAttribute="trailing" id="EuA-fk-PFm"/> <constraint firstAttribute="bottom" secondItem="6Wq-EJ-CAF" secondAttribute="bottom" id="QKw-Wp-ff0"/> - <constraint firstItem="ehB-ol-cdx" firstAttribute="top" secondItem="mrp-Ty-hZO" secondAttribute="top" id="R8w-E8-UAR"/> <constraint firstItem="yc2-Jn-6vm" firstAttribute="leading" secondItem="lhx-ny-Zct" secondAttribute="leading" id="RmT-dh-QdK"/> <constraint firstAttribute="trailing" secondItem="yc2-Jn-6vm" secondAttribute="trailing" id="Vbp-Qr-Bjn"/> <constraint firstItem="XRu-HM-jhQ" firstAttribute="centerX" secondItem="yc2-Jn-6vm" secondAttribute="centerX" id="Y16-31-gDX"/> <constraint firstItem="5cj-ge-3dv" firstAttribute="leading" secondItem="ehB-ol-cdx" secondAttribute="leading" id="ZMK-xT-VM8"/> + <constraint firstItem="yc2-Jn-6vm" firstAttribute="top" secondItem="mrp-Ty-hZO" secondAttribute="top" constant="-100" id="a1b-Sx-HXo"/> <constraint firstItem="5cj-ge-3dv" firstAttribute="trailing" secondItem="ehB-ol-cdx" secondAttribute="trailing" id="adg-fs-d5i"/> <constraint firstItem="5cj-ge-3dv" firstAttribute="top" secondItem="ehB-ol-cdx" secondAttribute="top" id="bMn-Xz-w1J"/> <constraint firstItem="5cj-ge-3dv" firstAttribute="bottom" secondItem="ehB-ol-cdx" secondAttribute="bottom" id="bi2-5t-Ueh"/> <constraint firstAttribute="trailing" secondItem="ehB-ol-cdx" secondAttribute="trailing" id="hsT-qM-JJP"/> - <constraint firstItem="yc2-Jn-6vm" firstAttribute="top" secondItem="ehB-ol-cdx" secondAttribute="bottom" id="iIZ-h0-wyd"/> <constraint firstAttribute="bottom" secondItem="yc2-Jn-6vm" secondAttribute="bottom" id="m6U-Gp-jhl"/> + <constraint firstItem="5cj-ge-3dv" firstAttribute="top" secondItem="mrp-Ty-hZO" secondAttribute="top" id="ucp-wl-kSP"/> <constraint firstItem="6Wq-EJ-CAF" firstAttribute="top" secondItem="lhx-ny-Zct" secondAttribute="top" id="v3Q-NK-vb1"/> <constraint firstItem="XRu-HM-jhQ" firstAttribute="width" secondItem="yc2-Jn-6vm" secondAttribute="width" id="vBi-yc-6H9"/> <constraint firstItem="6Wq-EJ-CAF" firstAttribute="leading" secondItem="lhx-ny-Zct" secondAttribute="leading" id="was-ym-C9C"/> </constraints> <viewLayoutGuide key="safeArea" id="mrp-Ty-hZO"/> </view> - <extendedEdge key="edgesForExtendedLayout"/> <connections> <outlet property="callButtonHeightConstraint" destination="e7R-TC-NQ2" id="5uM-Sy-1EZ"/> <outlet property="currentCallButton" destination="ehB-ol-cdx" id="hXv-aJ-8DN"/> diff --git a/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.swift b/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.swift index cd50c74ef..f66daec84 100644 --- a/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.swift +++ b/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.swift @@ -53,10 +53,6 @@ class ConversationViewController: UIViewController, @IBOutlet weak var scanButtonLeadingConstraint: NSLayoutConstraint! @IBOutlet weak var callButtonHeightConstraint: NSLayoutConstraint! - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - var keyboardDismissTapRecognizer: UITapGestureRecognizer! func setIsComposing(isComposing: Bool) { @@ -101,6 +97,12 @@ class ConversationViewController: UIViewController, self.viewModel.setIsComposingMsg(isComposing: false) } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.navigationBar.setBackgroundImage(nil, for: UIBarMetrics.default) + self.navigationController?.navigationBar.layer.shadowColor = UIColor.jamiNavigationBarShadow.cgColor + } + func importDocument() { let documentPicker = UIDocumentPickerViewController(documentTypes: ["public.item"], in: .import) documentPicker.delegate = self @@ -480,6 +482,7 @@ class ConversationViewController: UIViewController, .bind(onNext: { [weak self] _ in self?.contactTapped() }).disposed(by: disposeBag) + titleView.backgroundColor = UIColor.clear self.navigationItem.titleView = titleView } @@ -492,8 +495,8 @@ class ConversationViewController: UIViewController, func setupUI() { self.messageAccessoryView.sendButton.contentVerticalAlignment = .fill self.messageAccessoryView.sendButton.contentHorizontalAlignment = .fill + spinnerView.backgroundColor = UIColor.jamiMsgBackground self.tableView.backgroundColor = UIColor.jamiMsgBackground - self.messageAccessoryView.backgroundColor = UIColor.jamiMsgTextFieldBackground self.view.backgroundColor = UIColor.jamiMsgTextFieldBackground if self.viewModel.isAccountSip { @@ -592,7 +595,6 @@ class ConversationViewController: UIViewController, } self?.currentCallButton.isHidden = false self?.currentCallLabel.isHidden = false - self?.currentCallLabel.blink() self?.callButtonHeightConstraint.constant = 60 } return @@ -600,7 +602,6 @@ class ConversationViewController: UIViewController, self?.currentCallButton.isHidden = true self?.currentCallLabel.isHidden = true self?.callButtonHeightConstraint.constant = 0 - self?.currentCallLabel.layer.removeAllAnimations() }).disposed(by: disposeBag) currentCallButton.rx.tap .throttle(0.5, scheduler: MainScheduler.instance) diff --git a/Ring/Ring/Features/Conversations/Conversation/MessageAccessoryView.swift b/Ring/Ring/Features/Conversations/Conversation/MessageAccessoryView.swift index 996b92f75..972df2bf9 100644 --- a/Ring/Ring/Features/Conversations/Conversation/MessageAccessoryView.swift +++ b/Ring/Ring/Features/Conversations/Conversation/MessageAccessoryView.swift @@ -33,7 +33,6 @@ class MessageAccessoryView: UIView, NibLoadable, GrowingTextViewDelegate { @IBOutlet weak var shareButton: UIButton! @IBOutlet weak var cameraButton: UIButton! @IBOutlet weak var emojisButton: UIButton! - @IBOutlet weak var blurEffect: UIVisualEffectView! @IBOutlet weak var messageTextView: GrowingTextView! @IBOutlet weak var emojisButtonTrailingConstraint: NSLayoutConstraint! @IBOutlet weak var sendButtonLeftConstraint: NSLayoutConstraint! @@ -42,6 +41,8 @@ class MessageAccessoryView: UIView, NibLoadable, GrowingTextViewDelegate { var messageTextViewContent = Variable<String>("") weak var delegate: MessageAccessoryViewDelegate? + var blurEffect: UIVisualEffectView? + override open func didMoveToWindow() { self.setupMessageTextView() super.didMoveToWindow() @@ -54,6 +55,22 @@ class MessageAccessoryView: UIView, NibLoadable, GrowingTextViewDelegate { multiplier: 1) .isActive = true } + blurEffect?.removeFromSuperview() + if #available(iOS 13.0, *) { + blurEffect = UIVisualEffectView(effect: UIBlurEffect(style: .systemChromeMaterial)) + } else { + blurEffect = UIVisualEffectView(effect: UIBlurEffect(style: .extraLight)) + } + self.backgroundColor = UIColor.jamiBackgroundColor + if blurEffect != nil { + blurEffect!.frame = self.bounds + self.insertSubview(blurEffect!, at: 0) + blurEffect!.topAnchor.constraint(equalTo: messageTextView.topAnchor, constant: -12.0).isActive = true + blurEffect!.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 40).isActive = true + blurEffect!.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0).isActive = true + blurEffect!.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true + blurEffect!.translatesAutoresizingMaskIntoConstraints = false + } } func setupMessageTextView() { @@ -67,6 +84,7 @@ class MessageAccessoryView: UIView, NibLoadable, GrowingTextViewDelegate { self.messageTextView.maxHeight = 70 self.shareButton.tintColor = UIColor.jamiMain self.cameraButton.tintColor = UIColor.jamiMain + self.messageTextView.backgroundColor = UIColor.jamiInputTextBackground } func textViewDidChangeHeight(_ textView: GrowingTextView, height: CGFloat) { diff --git a/Ring/Ring/Features/Conversations/Conversation/MessageAccessoryView.xib b/Ring/Ring/Features/Conversations/Conversation/MessageAccessoryView.xib index aeb4b501c..654444b44 100644 --- a/Ring/Ring/Features/Conversations/Conversation/MessageAccessoryView.xib +++ b/Ring/Ring/Features/Conversations/Conversation/MessageAccessoryView.xib @@ -1,30 +1,20 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> - <device id="retina5_5" orientation="portrait"> - <adaptation id="fullscreen"/> - </device> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15705" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> + <device id="retina5_5" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15706"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> <view contentMode="scaleToFill" id="Fja-dy-lIy" customClass="MessageAccessoryView" customModule="Ring" customModuleProvider="target"> - <rect key="frame" x="0.0" y="0.0" width="315" height="80"/> + <rect key="frame" x="0.0" y="0.0" width="315" height="60"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <subviews> - <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UEs-8c-9hC"> - <rect key="frame" x="0.0" y="23.666666666666668" width="315" height="56.333333333333329"/> - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="H5g-m6-my5"> - <rect key="frame" x="0.0" y="0.0" width="315" height="56.333333333333329"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - </view> - <blurEffect style="extraLight"/> - </visualEffectView> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="eZ6-Cr-td2" userLabel="Upload Button"> - <rect key="frame" x="6" y="35" width="34" height="34"/> + <rect key="frame" x="6" y="15" width="34" height="34"/> <constraints> <constraint firstAttribute="height" constant="34" id="efZ-wn-OTj"/> <constraint firstAttribute="width" constant="34" id="i8S-m1-tB0"/> @@ -32,7 +22,7 @@ <state key="normal" image="share_button"/> </button> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" hasAttributedTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ifq-LQ-X1n" userLabel="Send Button"> - <rect key="frame" x="274" y="35" width="28" height="26"/> + <rect key="frame" x="274" y="15" width="28" height="26"/> <constraints> <constraint firstAttribute="height" constant="26" id="9PM-CR-8PT"/> <constraint firstAttribute="width" constant="28" id="cfz-1y-EkK"/> @@ -43,7 +33,7 @@ </state> </button> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" hasAttributedTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="w2N-XG-vU1" userLabel="Emojis Button"> - <rect key="frame" x="271" y="35" width="30" height="34"/> + <rect key="frame" x="271" y="15" width="30" height="34"/> <state key="normal"> <attributedString key="attributedTitle"> <fragment content="👍"> @@ -56,7 +46,7 @@ </state> </button> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qCm-fg-RY1"> - <rect key="frame" x="46" y="35" width="34" height="34"/> + <rect key="frame" x="46" y="15" width="34" height="34"/> <constraints> <constraint firstAttribute="height" constant="34" id="0I0-Zq-DPq"/> <constraint firstAttribute="width" constant="34" id="Cby-RM-6vW"/> @@ -64,7 +54,7 @@ <state key="normal" image="camera"/> </button> <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="pNY-Qf-lFT" customClass="GrowingTextView" customModule="Ring" customModuleProvider="target" colorLabel="IBBuiltInLabel-Red"> - <rect key="frame" x="85" y="35" width="177" height="34"/> + <rect key="frame" x="85" y="15" width="177" height="34"/> <color key="backgroundColor" white="1" alpha="0.57138270547945202" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <accessibility key="accessibilityConfiguration" label="sdg"/> <constraints> @@ -74,9 +64,7 @@ <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/> </textView> </subviews> - <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> - <constraint firstAttribute="bottom" secondItem="UEs-8c-9hC" secondAttribute="bottom" id="5zL-s3-P0H"/> <constraint firstItem="eZ6-Cr-td2" firstAttribute="leading" secondItem="qCm-fg-RY1" secondAttribute="leading" constant="-40" id="73K-N5-liQ"/> <constraint firstItem="w2N-XG-vU1" firstAttribute="top" secondItem="qCm-fg-RY1" secondAttribute="top" id="73b-aO-sT5"/> <constraint firstAttribute="trailing" secondItem="pNY-Qf-lFT" secondAttribute="trailing" constant="53" id="7c1-TB-XnJ"/> @@ -87,16 +75,12 @@ <constraint firstItem="w2N-XG-vU1" firstAttribute="bottom" secondItem="pNY-Qf-lFT" secondAttribute="bottom" id="WH1-PP-VfU"/> <constraint firstAttribute="trailing" secondItem="w2N-XG-vU1" secondAttribute="trailing" constant="14" id="Yyb-X2-nbp"/> <constraint firstAttribute="trailing" secondItem="Ifq-LQ-X1n" secondAttribute="trailing" constant="13" id="a3L-Tj-DTf"/> - <constraint firstItem="UEs-8c-9hC" firstAttribute="width" secondItem="Fja-dy-lIy" secondAttribute="width" id="d3l-7B-cW5"/> <constraint firstItem="w2N-XG-vU1" firstAttribute="bottom" secondItem="qCm-fg-RY1" secondAttribute="bottom" id="gxN-rs-CSX"/> - <constraint firstItem="UEs-8c-9hC" firstAttribute="leading" secondItem="Fja-dy-lIy" secondAttribute="leading" id="n3x-GA-Jbz"/> <constraint firstAttribute="leading" secondItem="eZ6-Cr-td2" secondAttribute="trailing" constant="-40" id="nXf-yT-cg0"/> - <constraint firstItem="UEs-8c-9hC" firstAttribute="top" secondItem="pNY-Qf-lFT" secondAttribute="top" constant="-11.5" id="vDE-3k-XJo"/> </constraints> <nil key="simulatedStatusBarMetrics"/> <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> <connections> - <outlet property="blurEffect" destination="UEs-8c-9hC" id="gdz-mH-WtC"/> <outlet property="cameraButton" destination="qCm-fg-RY1" id="8WG-DR-guy"/> <outlet property="emojisButton" destination="w2N-XG-vU1" id="7d7-4L-GBI"/> <outlet property="emojisButtonTrailingConstraint" destination="Yyb-X2-nbp" id="0wO-iY-lA3"/> @@ -110,8 +94,8 @@ </view> </objects> <resources> - <image name="camera" width="64" height="67"/> - <image name="send_button" width="102.40000152587891" height="102.40000152587891"/> - <image name="share_button" width="72" height="68"/> + <image name="camera" width="21.333333969116211" height="22.333333969116211"/> + <image name="send_button" width="64" height="64"/> + <image name="share_button" width="24" height="22.666666030883789"/> </resources> </document> diff --git a/Ring/Ring/Features/Conversations/SmartList/Cells/AccountItemView.swift b/Ring/Ring/Features/Conversations/SmartList/Cells/AccountItemView.swift index aa6be7489..5926b9261 100644 --- a/Ring/Ring/Features/Conversations/SmartList/Cells/AccountItemView.swift +++ b/Ring/Ring/Features/Conversations/SmartList/Cells/AccountItemView.swift @@ -42,5 +42,6 @@ class AccountItemView: UIView { addSubview(containerView) containerView.frame = self.bounds needMigrateLabel.text = L10n.Account.needMigration + nameLabel.textColor = UIColor.jamiLabelColor } } diff --git a/Ring/Ring/Features/Conversations/SmartList/SmartlistViewController.storyboard b/Ring/Ring/Features/Conversations/SmartList/SmartlistViewController.storyboard index 3239252b1..e3d4df286 100644 --- a/Ring/Ring/Features/Conversations/SmartList/SmartlistViewController.storyboard +++ b/Ring/Ring/Features/Conversations/SmartList/SmartlistViewController.storyboard @@ -19,8 +19,38 @@ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="1" sectionFooterHeight="1" translatesAutoresizingMaskIntoConstraints="NO" id="HFM-G6-hMN"> + <rect key="frame" x="0.0" y="-80" width="375" height="747"/> + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + </tableView> + <tableView hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="1" sectionFooterHeight="1" translatesAutoresizingMaskIntoConstraints="NO" id="opE-y7-3Rm"> + <rect key="frame" x="0.0" y="-80" width="375" height="747"/> + <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> + </tableView> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HGv-QU-VSD"> + <rect key="frame" x="168" y="126" width="39.5" height="19.5"/> + <fontDescription key="fontDescription" style="UICTFontTextStyleCallout"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EvL-Bu-O1T"> + <rect key="frame" x="0.0" y="116" width="375" height="551"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No conversations" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8bB-XU-6gh"> + <rect key="frame" x="121" y="265" width="133" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> + <nil key="highlightedColor"/> + </label> + </subviews> + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <constraints> + <constraint firstItem="8bB-XU-6gh" firstAttribute="centerY" secondItem="EvL-Bu-O1T" secondAttribute="centerY" id="1R2-tE-dtX"/> + <constraint firstItem="8bB-XU-6gh" firstAttribute="centerX" secondItem="EvL-Bu-O1T" secondAttribute="centerX" id="PCa-ph-Sbp"/> + </constraints> + </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="e5o-cY-djH" userLabel="Network Alert View"> - <rect key="frame" x="0.0" y="56" width="375" height="56"/> + <rect key="frame" x="0.0" y="60" width="375" height="56"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HKv-H1-GYI" userLabel="Alert Labels View"> <rect key="frame" x="171" y="0.0" width="33" height="56"/> @@ -71,10 +101,10 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DKd-eF-L6f"> - <rect key="frame" x="0.0" y="0.0" width="375" height="56"/> + <rect key="frame" x="0.0" y="-106" width="375" height="166"/> <subviews> <searchBar contentMode="redraw" placeholder="Enter name..." translatesAutoresizingMaskIntoConstraints="NO" id="xPr-nI-I35"> - <rect key="frame" x="0.0" y="0.0" width="325" height="56"/> + <rect key="frame" x="0.0" y="110" width="325" height="56"/> <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="56" id="4yw-AN-guZ"/> @@ -84,7 +114,7 @@ <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" returnKeyType="done"/> <userDefinedRuntimeAttributes> <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="2"/> + <real key="value" value="0.0"/> </userDefinedRuntimeAttribute> <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> <color key="value" red="0.92156862745098034" green="0.92156862745098034" blue="0.92156862745098034" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> @@ -92,12 +122,12 @@ </userDefinedRuntimeAttributes> </searchBar> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="RSG-bY-flb"> - <rect key="frame" x="325" y="8" width="40" height="40"/> + <rect key="frame" x="325" y="118" width="40" height="40"/> <color key="tintColor" red="0.2470588235" green="0.42745098040000001" blue="0.65490196079999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <state key="normal" image="phone_book"/> </button> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Eta-uf-Ija"> - <rect key="frame" x="325" y="8" width="40" height="40"/> + <rect key="frame" x="325" y="118" width="40" height="40"/> <constraints> <constraint firstAttribute="width" constant="40" id="eb8-7R-X3e"/> <constraint firstAttribute="height" constant="40" id="j8h-fg-qMp"/> @@ -111,47 +141,15 @@ <constraint firstItem="Eta-uf-Ija" firstAttribute="top" secondItem="RSG-bY-flb" secondAttribute="top" id="C2I-Kv-faQ"/> <constraint firstItem="Eta-uf-Ija" firstAttribute="centerY" secondItem="xPr-nI-I35" secondAttribute="centerY" id="Epv-9a-Rkg"/> <constraint firstAttribute="trailing" secondItem="Eta-uf-Ija" secondAttribute="trailing" constant="10" id="O7M-He-7UH"/> + <constraint firstAttribute="height" constant="166" id="P1R-qO-qwd"/> <constraint firstItem="Eta-uf-Ija" firstAttribute="leading" secondItem="xPr-nI-I35" secondAttribute="trailing" id="SnW-M7-wRB"/> <constraint firstItem="Eta-uf-Ija" firstAttribute="trailing" secondItem="RSG-bY-flb" secondAttribute="trailing" id="fK5-6j-fKX"/> <constraint firstItem="Eta-uf-Ija" firstAttribute="leading" secondItem="RSG-bY-flb" secondAttribute="leading" id="ggB-jL-tbn"/> <constraint firstItem="xPr-nI-I35" firstAttribute="leading" secondItem="DKd-eF-L6f" secondAttribute="leading" id="m1O-ZV-Pkx"/> - <constraint firstItem="xPr-nI-I35" firstAttribute="top" secondItem="DKd-eF-L6f" secondAttribute="top" id="nlW-pc-ggm"/> <constraint firstItem="Eta-uf-Ija" firstAttribute="bottom" secondItem="RSG-bY-flb" secondAttribute="bottom" id="wOa-Ne-n5e"/> <constraint firstAttribute="bottom" secondItem="xPr-nI-I35" secondAttribute="bottom" id="xcp-FC-G0l"/> </constraints> </view> - <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="HFM-G6-hMN"> - <rect key="frame" x="0.0" y="112" width="375" height="555"/> - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> - </tableView> - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EvL-Bu-O1T"> - <rect key="frame" x="0.0" y="112" width="375" height="555"/> - <subviews> - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No conversations" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8bB-XU-6gh"> - <rect key="frame" x="121" y="267" width="133" height="21"/> - <fontDescription key="fontDescription" type="system" pointSize="17"/> - <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> - <nil key="highlightedColor"/> - </label> - </subviews> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> - <constraints> - <constraint firstItem="8bB-XU-6gh" firstAttribute="centerY" secondItem="EvL-Bu-O1T" secondAttribute="centerY" id="1R2-tE-dtX"/> - <constraint firstItem="8bB-XU-6gh" firstAttribute="centerX" secondItem="EvL-Bu-O1T" secondAttribute="centerX" id="PCa-ph-Sbp"/> - </constraints> - </view> - <tableView hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="1" sectionFooterHeight="1" translatesAutoresizingMaskIntoConstraints="NO" id="opE-y7-3Rm"> - <rect key="frame" x="0.0" y="112" width="375" height="555"/> - <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> - <label key="tableHeaderView" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="4Yu-Fe-ixq"> - <rect key="frame" x="0.0" y="0.0" width="375" height="24"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> - <fontDescription key="fontDescription" type="system" pointSize="14"/> - <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> - <nil key="highlightedColor"/> - </label> - </tableView> <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="79Q-fh-vhV"> <rect key="frame" x="285" y="577" width="60" height="60"/> <subviews> @@ -178,7 +176,7 @@ </userDefinedRuntimeAttributes> </button> </subviews> - <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> <constraints> <constraint firstAttribute="height" constant="60" id="GEI-dw-9ar"/> <constraint firstAttribute="trailing" secondItem="k8G-Me-4BI" secondAttribute="trailing" id="a7d-Q1-Fvz"/> @@ -202,16 +200,18 @@ <constraint firstItem="cfq-zl-uux" firstAttribute="top" secondItem="79Q-fh-vhV" secondAttribute="bottom" constant="30" id="8G6-0D-3ma"/> <constraint firstItem="HFM-G6-hMN" firstAttribute="leading" secondItem="2dZ-8A-4nq" secondAttribute="leading" id="8tr-Rd-1kr"/> <constraint firstItem="DKd-eF-L6f" firstAttribute="leading" secondItem="2dZ-8A-4nq" secondAttribute="leading" id="9fi-2r-wE8"/> + <constraint firstItem="HGv-QU-VSD" firstAttribute="centerX" secondItem="2dZ-8A-4nq" secondAttribute="centerX" id="A6i-gd-82k"/> <constraint firstAttribute="trailing" secondItem="DKd-eF-L6f" secondAttribute="trailing" id="AhH-s9-pfe"/> <constraint firstAttribute="trailing" secondItem="opE-y7-3Rm" secondAttribute="trailing" id="D0f-nM-KEs"/> + <constraint firstItem="HFM-G6-hMN" firstAttribute="top" secondItem="sbJ-yn-t3e" secondAttribute="bottom" constant="-80" id="TVk-tz-qtF"/> <constraint firstItem="cfq-zl-uux" firstAttribute="top" secondItem="EvL-Bu-O1T" secondAttribute="bottom" id="TsM-9H-eI1"/> <constraint firstItem="cfq-zl-uux" firstAttribute="top" secondItem="HFM-G6-hMN" secondAttribute="bottom" id="VfB-5H-uHq"/> - <constraint firstItem="HFM-G6-hMN" firstAttribute="top" secondItem="e5o-cY-djH" secondAttribute="bottom" id="Yn5-dO-Y5x"/> + <constraint firstItem="HGv-QU-VSD" firstAttribute="top" secondItem="e5o-cY-djH" secondAttribute="bottom" constant="10" id="XCA-fc-GKd"/> <constraint firstItem="EvL-Bu-O1T" firstAttribute="top" secondItem="e5o-cY-djH" secondAttribute="bottom" id="cCR-S3-3AW"/> <constraint firstAttribute="trailing" secondItem="79Q-fh-vhV" secondAttribute="trailing" constant="30" id="elh-uT-3vG"/> - <constraint firstItem="opE-y7-3Rm" firstAttribute="top" secondItem="e5o-cY-djH" secondAttribute="bottom" id="fgp-c6-UxE"/> - <constraint firstItem="DKd-eF-L6f" firstAttribute="top" secondItem="sbJ-yn-t3e" secondAttribute="bottom" id="gbl-PR-kL4"/> + <constraint firstItem="DKd-eF-L6f" firstAttribute="top" secondItem="sbJ-yn-t3e" secondAttribute="bottom" constant="-106" id="gbl-PR-kL4"/> <constraint firstAttribute="trailing" secondItem="e5o-cY-djH" secondAttribute="trailing" id="k9v-18-oxL"/> + <constraint firstItem="HFM-G6-hMN" firstAttribute="top" secondItem="opE-y7-3Rm" secondAttribute="top" id="kok-5h-ENq"/> <constraint firstItem="e5o-cY-djH" firstAttribute="top" secondItem="xPr-nI-I35" secondAttribute="bottom" id="mKv-lK-yDx"/> <constraint firstAttribute="trailing" secondItem="EvL-Bu-O1T" secondAttribute="trailing" id="nSK-QH-snj"/> <constraint firstItem="e5o-cY-djH" firstAttribute="leading" secondItem="2dZ-8A-4nq" secondAttribute="leading" id="rXu-fF-ESz"/> @@ -226,6 +226,7 @@ <outlet property="dialpadButton" destination="k8G-Me-4BI" id="Ij7-SF-nvZ"/> <outlet property="dialpadButtonShadow" destination="79Q-fh-vhV" id="VcA-wc-j6h"/> <outlet property="networkAlertLabel" destination="Fu7-Dr-XvA" id="0qV-lk-9mE"/> + <outlet property="networkAlertView" destination="e5o-cY-djH" id="uV5-WT-vai"/> <outlet property="networkAlertViewTopConstraint" destination="mKv-lK-yDx" id="bJk-Ie-hf6"/> <outlet property="noConversationLabel" destination="8bB-XU-6gh" id="n4g-mz-w7z"/> <outlet property="noConversationsView" destination="EvL-Bu-O1T" id="tVV-6a-4Xg"/> @@ -235,8 +236,9 @@ <outlet property="searchBar" destination="xPr-nI-I35" id="Y3U-rV-yfc"/> <outlet property="searchBarShadow" destination="DKd-eF-L6f" id="CKZ-ws-ag1"/> <outlet property="searchResultsTableView" destination="opE-y7-3Rm" id="F3g-9d-IQt"/> - <outlet property="searchTableViewLabel" destination="4Yu-Fe-ixq" id="dq3-QM-bfA"/> + <outlet property="searchTableViewLabel" destination="HGv-QU-VSD" id="cVs-pr-n1f"/> <outlet property="settingsButton" destination="iaz-fd-fEz" id="R2O-R8-BDk"/> + <outlet property="tableTopConstraint" destination="TVk-tz-qtF" id="lIj-Yu-ZL7"/> <outlet property="tableView" destination="HFM-G6-hMN" id="Gci-vk-ijr"/> </connections> </viewController> diff --git a/Ring/Ring/Features/Conversations/SmartList/SmartlistViewController.swift b/Ring/Ring/Features/Conversations/SmartList/SmartlistViewController.swift index f0c465a82..6a0a9f628 100644 --- a/Ring/Ring/Features/Conversations/SmartList/SmartlistViewController.swift +++ b/Ring/Ring/Features/Conversations/SmartList/SmartlistViewController.swift @@ -32,12 +32,15 @@ import QuartzCore //Constants private struct SmartlistConstants { static let smartlistRowHeight: CGFloat = 64.0 - static let tableHeaderViewHeight: CGFloat = 24.0 - static let firstSectionHeightForHeader: CGFloat = 31.0 //Compensate the offset due to the label on the top of the tableView - static let defaultSectionHeightForHeader: CGFloat = 55.0 + static let tableHeaderViewHeight: CGFloat = 142.0 + static let firstSectionHeightForHeader: CGFloat = 51.0 + static let networkAllerHeight: CGFloat = 56.0 + static let tableViewOffset: CGFloat = 80.0 + } // swiftlint:disable type_body_length +// swiftlint:disable file_length class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased { private let log = SwiftyBeaver.self @@ -53,6 +56,7 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased @IBOutlet weak var networkAlertLabel: UILabel! @IBOutlet weak var cellularAlertLabel: UILabel! @IBOutlet weak var networkAlertViewTopConstraint: NSLayoutConstraint! + @IBOutlet weak var tableTopConstraint: NSLayoutConstraint! @IBOutlet weak var settingsButton: UIButton! @IBOutlet weak var dialpadButton: UIButton! @IBOutlet weak var dialpadButtonShadow: UIView! @@ -60,6 +64,7 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased @IBOutlet weak var qrScanButton: UIButton! @IBOutlet weak var phoneBookButton: UIButton! @IBOutlet weak var scanButtonLeadingConstraint: NSLayoutConstraint! + @IBOutlet weak var networkAlertView: UIView! // account selection var accounPicker = UIPickerView() @@ -73,10 +78,6 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased private let contactPicker = CNContactPickerViewController() - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - // MARK: functions @IBAction func openScan() { self.viewModel.showQRCode() @@ -108,8 +109,13 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - self.navigationController?.navigationBar.layer.shadowColor = UIColor.clear.cgColor - self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) + navigationController? + .navigationBar + .layer.shadowColor = UIColor.clear.cgColor + navigationController? + .navigationBar + .setBackgroundImage(UIImage(), + for: UIBarMetrics.default) self.navigationController?.navigationBar .titleTextAttributes = [NSAttributedString.Key.font: UIFont(name: "HelveticaNeue-Light", size: 25)!, NSAttributedString.Key.foregroundColor: UIColor.jamiMain] @@ -126,7 +132,15 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased // swiftlint:disable function_body_length func setupUI() { - dialpadButtonShadow.layer.shadowColor = UIColor.black.cgColor + view.backgroundColor = UIColor.jamiBackgroundColor + conversationsTableView.backgroundColor = UIColor.jamiBackgroundColor + searchResultsTableView.backgroundColor = UIColor.jamiBackgroundColor + noConversationsView.backgroundColor = UIColor.jamiBackgroundColor + noConversationLabel.backgroundColor = UIColor.jamiBackgroundColor + noConversationLabel.textColor = UIColor.jamiLabelColor + searchTableViewLabel.textColor = UIColor.jamiLabelColor + dialpadButtonShadow.backgroundColor = UIColor.jamiBackgroundSecondaryColor + dialpadButtonShadow.layer.shadowColor = UIColor.jamiLabelColor.cgColor dialpadButtonShadow.layer.shadowOffset = CGSize.zero dialpadButtonShadow.layer.shadowRadius = 1 dialpadButtonShadow.layer.shadowOpacity = 0.6 @@ -134,15 +148,21 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased self.viewModel.hideNoConversationsMessage .bind(to: self.noConversationsView.rx.isHidden) .disposed(by: disposeBag) - - self.networkAlertViewTopConstraint.constant = self.viewModel.networkConnectionState() == .none ? 0.0 : -56.0 + let isHidden = self.viewModel.networkConnectionState() == .none ? false : true + self.networkAlertViewTopConstraint.constant = !isHidden ? 0.0 : -SmartlistConstants.networkAllerHeight + tableTopConstraint.constant = !isHidden ? -(SmartlistConstants.tableViewOffset - SmartlistConstants.networkAllerHeight) : -SmartlistConstants.tableViewOffset + self.networkAlertView.isHidden = isHidden self.viewModel.connectionState .subscribe(onNext: { connectionState in - let newAlertHeight = connectionState == .none ? 0.0 : -56.0 - UIView.animate(withDuration: 0.25) { - self.networkAlertViewTopConstraint.constant = CGFloat(newAlertHeight) - self.view.layoutIfNeeded() + let newAlertHeight = connectionState == .none ? 0.0 : -SmartlistConstants.networkAllerHeight + let newTableViewTop = connectionState == .none ? -(SmartlistConstants.tableViewOffset - SmartlistConstants.networkAllerHeight) : -SmartlistConstants.tableViewOffset + let isHidden = connectionState == .none ? false : true + UIView.animate(withDuration: 0.25) { [weak self] in + self?.networkAlertViewTopConstraint.constant = CGFloat(newAlertHeight) + self?.tableTopConstraint.constant = CGFloat(newTableViewTop) + self?.view.layoutIfNeeded() } + self.networkAlertView.isHidden = isHidden }) .disposed(by: self.disposeBag) @@ -159,32 +179,33 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased generalSettingsButton.contentMode = .scaleAspectFill let settingsButtonItem = UIBarButtonItem(customView: generalSettingsButton) generalSettingsButton.rx.tap.throttle(0.5, scheduler: MainScheduler.instance) - .subscribe(onNext: { [unowned self] in - self.viewModel.showGeneralSettings() + .subscribe(onNext: { [weak self] in + self?.viewModel.showGeneralSettings() }) .disposed(by: self.disposeBag) qrScanButton.rx.tap.throttle(0.5, scheduler: MainScheduler.instance) - .subscribe(onNext: { [unowned self] in - self.openScan() + .subscribe(onNext: { [weak self] in + self?.openScan() }) .disposed(by: self.disposeBag) phoneBookButton.rx.tap.throttle(0.5, scheduler: MainScheduler.instance) - .subscribe(onNext: { [unowned self] in + .subscribe(onNext: { [weak self] in + guard let self = self else {return} self.contactPicker.delegate = self self.present(self.contactPicker, animated: true, completion: nil) }) .disposed(by: self.disposeBag) self.viewModel.currentAccountChanged .observeOn(MainScheduler.instance) - .subscribe(onNext: { [unowned self] currentAccount in + .subscribe(onNext: { [weak self] currentAccount in if let account = currentAccount { let accountSip = account.type == AccountType.sip - self.navigationItem + self?.navigationItem .rightBarButtonItem = accountSip ? nil : settingsButtonItem - self.dialpadButtonShadow.isHidden = !accountSip - self.phoneBookButton.isHidden = !accountSip - self.qrScanButton.isHidden = accountSip + self?.dialpadButtonShadow.isHidden = !accountSip + self?.phoneBookButton.isHidden = !accountSip + self?.qrScanButton.isHidden = accountSip } }).disposed(by: disposeBag) @@ -242,7 +263,7 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased func confugureAccountPicker() { view.addSubview(accountPickerTextView) accountPickerTextView.inputView = accounPicker - accounPicker.backgroundColor = .jamiNavigationBar + accounPicker.backgroundColor = .jamiBackgroundSecondaryColor self.viewModel.accounts .observeOn(MainScheduler.instance) .bind(to: accounPicker.rx.items(adapter: accountsAdapter)) @@ -280,7 +301,7 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased let flexibleBarButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil) let addBarButton = UIBarButtonItem(customView: addAccountButton) let toolbar = UIToolbar() - toolbar.barTintColor = .jamiNavigationBar + toolbar.barTintColor = .jamiBackgroundSecondaryColor toolbar.isTranslucent = false toolbar.sizeToFit() toolbar.center = CGPoint(x: self.view.frame.width * 0.5, y: 200) @@ -367,6 +388,7 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased //Bind to ViewModel to show or hide the filtered results self.viewModel.isSearching.subscribe(onNext: { [unowned self] (isSearching) in self.searchResultsTableView.isHidden = !isSearching + self.searchTableViewLabel.isHidden = !isSearching }).disposed(by: disposeBag) //Deselect the rows @@ -389,20 +411,54 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased } func setupSearchBar() { - self.searchBar.returnKeyType = .done self.searchBar.autocapitalizationType = .none self.searchBar.tintColor = UIColor.jamiMain - self.searchBar.barTintColor = UIColor.jamiNavigationBar - - self.view.bringSubviewToFront(self.searchBarShadow) - - self.searchBarShadow.layer.shadowColor = UIColor.black.cgColor - self.searchBarShadow.layer.shadowOffset = CGSize(width: 0.0, height: 2.5) + searchBar.backgroundImage = UIImage() + searchBarShadow.backgroundColor = UIColor.clear + searchBar.backgroundColor = UIColor.clear + self.searchBarShadow.layer.shadowColor = UIColor.jamiNavigationBarShadow.cgColor + self.searchBarShadow.layer.shadowOffset = CGSize(width: 0.0, height: 1.5) self.searchBarShadow.layer.shadowOpacity = 0.2 self.searchBarShadow.layer.shadowRadius = 3 self.searchBarShadow.layer.masksToBounds = false + if #available(iOS 13.0, *) { + let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .systemChromeMaterial)) + visualEffectView.frame = searchBarShadow.bounds + visualEffectView.isUserInteractionEnabled = false + searchBarShadow.insertSubview(visualEffectView, at: 0) + visualEffectView.translatesAutoresizingMaskIntoConstraints = false + visualEffectView.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: 0).isActive = true + visualEffectView.trailingAnchor.constraint(equalTo: self.searchBarShadow.trailingAnchor, constant: 0).isActive = true + visualEffectView.leadingAnchor.constraint(equalTo: self.searchBarShadow.leadingAnchor, constant: 0).isActive = true + visualEffectView.topAnchor.constraint(equalTo: self.searchBarShadow.topAnchor, constant: 0).isActive = true + visualEffectView.bottomAnchor.constraint(equalTo: self.searchBarShadow.bottomAnchor, constant: 0).isActive = true + + } else { + let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) + visualEffectView.frame = searchBarShadow.bounds + visualEffectView.isUserInteractionEnabled = false + let background = UIView() + background.frame = searchBarShadow.bounds + background.backgroundColor = UIColor(red: 245, green: 245, blue: 245, alpha: 1.0) + background.alpha = 0.7 + searchBarShadow.insertSubview(background, at: 0) + searchBarShadow.insertSubview(visualEffectView, at: 0) + background.translatesAutoresizingMaskIntoConstraints = false + visualEffectView.translatesAutoresizingMaskIntoConstraints = false + visualEffectView.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: 0).isActive = true + background.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: 0).isActive = true + visualEffectView.trailingAnchor.constraint(equalTo: self.searchBarShadow.trailingAnchor, constant: 0).isActive = true + background.trailingAnchor.constraint(equalTo: self.searchBarShadow.trailingAnchor, constant: 0).isActive = true + visualEffectView.leadingAnchor.constraint(equalTo: self.searchBarShadow.leadingAnchor, constant: 0).isActive = true + background.leadingAnchor.constraint(equalTo: self.searchBarShadow.leadingAnchor, constant: 0).isActive = true + visualEffectView.topAnchor.constraint(equalTo: self.searchBarShadow.topAnchor, constant: 0).isActive = true + background.topAnchor.constraint(equalTo: self.searchBarShadow.topAnchor, constant: 0).isActive = true + visualEffectView.bottomAnchor.constraint(equalTo: self.searchBarShadow.bottomAnchor, constant: 0).isActive = true + background.bottomAnchor.constraint(equalTo: self.searchBarShadow.bottomAnchor, constant: 0).isActive = true + } + //Bind the SearchBar to the ViewModel self.searchBar.rx.text.orEmpty .debounce(Durations.textFieldThrottlingDuration.value, scheduler: MainScheduler.instance) @@ -496,14 +552,20 @@ class SmartlistViewController: UIViewController, StoryboardBased, ViewModelBased } extension SmartlistViewController: UITableViewDelegate { + + func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { + guard let headerView = view as? UITableViewHeaderFooterView else { return } + headerView.tintColor = .clear + } + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if section == 0 { if tableView == self.conversationsTableView { - return 0 + return SmartlistConstants.tableHeaderViewHeight } - return SmartlistConstants.firstSectionHeightForHeader + return SmartlistConstants.tableHeaderViewHeight + SmartlistConstants.firstSectionHeightForHeader } else { - return SmartlistConstants.defaultSectionHeightForHeader + return SmartlistConstants.tableHeaderViewHeight } } diff --git a/Ring/Ring/Features/InitialLoading/InitialLoadingViewController.swift b/Ring/Ring/Features/InitialLoading/InitialLoadingViewController.swift index 64820b764..e0268db73 100644 --- a/Ring/Ring/Features/InitialLoading/InitialLoadingViewController.swift +++ b/Ring/Ring/Features/InitialLoading/InitialLoadingViewController.swift @@ -11,8 +11,8 @@ import Reusable final class InitialLoadingViewController: UIViewController, StoryboardBased { - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = UIColor.jamiBackgroundColor } - } diff --git a/Ring/Ring/Features/Me/LinkNewDeviceViewController.swift b/Ring/Ring/Features/Me/LinkNewDeviceViewController.swift index eed7867f0..ba6f15783 100644 --- a/Ring/Ring/Features/Me/LinkNewDeviceViewController.swift +++ b/Ring/Ring/Features/Me/LinkNewDeviceViewController.swift @@ -28,10 +28,6 @@ class LinkNewDeviceViewController: UIViewController, StoryboardBased, ViewModelB var viewModel: LinkNewDeviceViewModel! let disposeBag = DisposeBag() - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - override func viewDidLoad() { self.view.backgroundColor = UIColor.white.withAlphaComponent(0.0) diff --git a/Ring/Ring/Features/Me/Me/AccountHeader.swift b/Ring/Ring/Features/Me/Me/AccountHeader.swift index b9883a831..7e0b96303 100644 --- a/Ring/Ring/Features/Me/Me/AccountHeader.swift +++ b/Ring/Ring/Features/Me/Me/AccountHeader.swift @@ -22,6 +22,12 @@ class AccountHeader: GSKStretchyHeaderView { @IBOutlet weak var profileImageView: UIImageView! @IBOutlet weak var profileName: UITextField! + @IBOutlet weak var background: UIView! + + override func willMove(toWindow newWindow: UIWindow?) { + super.willMove(toWindow: newWindow) + background.backgroundColor = UIColor.jamiBackgroundColor + } override func didChangeStretchFactor(_ stretchFactor: CGFloat) { var alpha = CGFloatTranslateRange(stretchFactor, 0.2, 0.7, 0, 1) diff --git a/Ring/Ring/Features/Me/Me/AccountHeader.xib b/Ring/Ring/Features/Me/Me/AccountHeader.xib index 885b68056..14a4e42d8 100644 --- a/Ring/Ring/Features/Me/Me/AccountHeader.xib +++ b/Ring/Ring/Features/Me/Me/AccountHeader.xib @@ -11,14 +11,14 @@ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="AccountHeader" customModule="Ring" customModuleProvider="target"> - <rect key="frame" x="0.0" y="0.0" width="375" height="210"/> + <rect key="frame" x="0.0" y="0.0" width="375" height="270"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CHp-YH-dZ5"> - <rect key="frame" x="0.0" y="0.0" width="375" height="210"/> + <rect key="frame" x="0.0" y="0.0" width="375" height="270"/> <subviews> <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="bD3-jT-xLr"> - <rect key="frame" x="137.5" y="40" width="100" height="100"/> + <rect key="frame" x="137.5" y="100" width="100" height="100"/> <color key="tintColor" red="0.24705882352941178" green="0.42745098039215684" blue="0.65490196078431373" alpha="1" colorSpace="custom" customColorSpace="displayP3"/> <constraints> <constraint firstAttribute="height" constant="100" id="2mb-uU-dHb"/> @@ -32,7 +32,7 @@ </userDefinedRuntimeAttributes> </imageView> <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Name" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="oQJ-jT-wTv"> - <rect key="frame" x="20" y="150" width="335" height="34"/> + <rect key="frame" x="20" y="210" width="335" height="34"/> <fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/> <textInputTraits key="textInputTraits"/> <userDefinedRuntimeAttributes> @@ -42,7 +42,7 @@ </subviews> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <constraints> - <constraint firstItem="bD3-jT-xLr" firstAttribute="top" secondItem="CHp-YH-dZ5" secondAttribute="top" constant="40" id="HnG-Ht-Pfl"/> + <constraint firstItem="bD3-jT-xLr" firstAttribute="top" secondItem="CHp-YH-dZ5" secondAttribute="top" constant="100" id="HnG-Ht-Pfl"/> <constraint firstItem="oQJ-jT-wTv" firstAttribute="top" secondItem="bD3-jT-xLr" secondAttribute="bottom" constant="10" id="oKl-Yq-gZw"/> <constraint firstItem="bD3-jT-xLr" firstAttribute="centerX" secondItem="CHp-YH-dZ5" secondAttribute="centerX" id="pf4-Dp-CPJ"/> <constraint firstItem="oQJ-jT-wTv" firstAttribute="leading" secondItem="CHp-YH-dZ5" secondAttribute="leading" constant="20" id="txQ-DZ-CHU"/> @@ -61,10 +61,14 @@ <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/> <userDefinedRuntimeAttributes> <userDefinedRuntimeAttribute type="number" keyPath="maximumContentHeight"> - <real key="value" value="210"/> + <real key="value" value="270"/> + </userDefinedRuntimeAttribute> + <userDefinedRuntimeAttribute type="number" keyPath="minimumContentHeight"> + <real key="value" value="0.0"/> </userDefinedRuntimeAttribute> </userDefinedRuntimeAttributes> <connections> + <outlet property="background" destination="CHp-YH-dZ5" id="9s3-V0-LLh"/> <outlet property="profileImageView" destination="bD3-jT-xLr" id="wNj-F7-4yD"/> <outlet property="profileName" destination="oQJ-jT-wTv" id="yaH-GU-Sih"/> </connections> diff --git a/Ring/Ring/Features/Me/Me/BlockListViewController.storyboard b/Ring/Ring/Features/Me/Me/BlockListViewController.storyboard index 13ac2d906..99d548e63 100644 --- a/Ring/Ring/Features/Me/Me/BlockListViewController.storyboard +++ b/Ring/Ring/Features/Me/Me/BlockListViewController.storyboard @@ -1,11 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="cWr-kq-EfK"> - <device id="retina4_7" orientation="portrait"> - <adaptation id="fullscreen"/> - </device> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="cWr-kq-EfK"> + <device id="retina4_7" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> @@ -13,24 +11,22 @@ <!--Block List View Controller--> <scene sceneID="CDw-GO-ni9"> <objects> - <viewController hidesBottomBarWhenPushed="YES" id="cWr-kq-EfK" customClass="BlockListViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> + <viewController extendedLayoutIncludesOpaqueBars="YES" hidesBottomBarWhenPushed="YES" id="cWr-kq-EfK" customClass="BlockListViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> <view key="view" contentMode="scaleToFill" id="YKN-B2-7X7"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="72" estimatedRowHeight="72" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="eGc-th-VK5"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> </tableView> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No blocked contacts" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nUo-eH-a0f"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <fontDescription key="fontDescription" type="system" pointSize="17"/> <nil key="textColor"/> <nil key="highlightedColor"/> </label> </subviews> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <constraints> <constraint firstItem="eGc-th-VK5" firstAttribute="top" secondItem="YKN-B2-7X7" secondAttribute="top" id="5Nj-Mt-QeY"/> <constraint firstItem="nUo-eH-a0f" firstAttribute="top" secondItem="YKN-B2-7X7" secondAttribute="top" id="6YC-L1-UO0"/> @@ -43,7 +39,6 @@ </constraints> <viewLayoutGuide key="safeArea" id="wN6-Fz-tau"/> </view> - <extendedEdge key="edgesForExtendedLayout"/> <connections> <outlet property="noBlockedContactLabel" destination="nUo-eH-a0f" id="0zv-9l-3GL"/> <outlet property="tableView" destination="eGc-th-VK5" id="4JY-jU-2Xb"/> diff --git a/Ring/Ring/Features/Me/Me/BlockListViewController.swift b/Ring/Ring/Features/Me/Me/BlockListViewController.swift index 351ef8f3a..9bb42df77 100644 --- a/Ring/Ring/Features/Me/Me/BlockListViewController.swift +++ b/Ring/Ring/Features/Me/Me/BlockListViewController.swift @@ -32,12 +32,11 @@ class BlockListViewController: UIViewController, StoryboardBased, ViewModelBased @IBOutlet weak var tableView: UITableView! @IBOutlet weak var noBlockedContactLabel: UILabel! - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - override func viewDidLoad() { super.viewDidLoad() + tableView.backgroundColor = UIColor.jamiBackgroundColor + noBlockedContactLabel.backgroundColor = UIColor.jamiBackgroundColor + noBlockedContactLabel.textColor = UIColor.jamiLabelColor self.configureRingNavigationBar() self.navigationItem.title = L10n.AccountPage.blockedContacts diff --git a/Ring/Ring/Features/Me/Me/DeviceCell.xib b/Ring/Ring/Features/Me/Me/DeviceCell.xib index acbf73c0c..d7d4e61b6 100644 --- a/Ring/Ring/Features/Me/Me/DeviceCell.xib +++ b/Ring/Ring/Features/Me/Me/DeviceCell.xib @@ -54,7 +54,7 @@ </constraints> <userDefinedRuntimeAttributes> <userDefinedRuntimeAttribute type="number" keyPath="borderWidth"> - <real key="value" value="10"/> + <real key="value" value="0.0"/> </userDefinedRuntimeAttribute> <userDefinedRuntimeAttribute type="color" keyPath="borderColor"> <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> diff --git a/Ring/Ring/Features/Me/Me/MeViewController.storyboard b/Ring/Ring/Features/Me/Me/MeViewController.storyboard index 277025b76..2722a4eff 100644 --- a/Ring/Ring/Features/Me/Me/MeViewController.storyboard +++ b/Ring/Ring/Features/Me/Me/MeViewController.storyboard @@ -1,18 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="RuW-kz-iBP"> - <device id="retina4_7" orientation="portrait"> - <adaptation id="fullscreen"/> - </device> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="RuW-kz-iBP"> + <device id="retina4_7" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <scenes> <!--Me View Controller--> <scene sceneID="JC9-vU-UJ4"> <objects> - <viewController id="RuW-kz-iBP" customClass="MeViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> + <viewController automaticallyAdjustsScrollViewInsets="NO" id="RuW-kz-iBP" customClass="MeViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> <layoutGuides> <viewControllerLayoutGuide type="top" id="SYf-gf-IKh"/> <viewControllerLayoutGuide type="bottom" id="tam-QD-Xpf"/> @@ -21,7 +19,7 @@ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> - <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" estimatedSectionHeaderHeight="40" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="eg8-N7-lDA" customClass="SettingsTableView" customModule="Ring" customModuleProvider="target"> + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" contentInsetAdjustmentBehavior="never" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" estimatedSectionHeaderHeight="40" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="eg8-N7-lDA" customClass="SettingsTableView" customModule="Ring" customModuleProvider="target"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> </tableView> @@ -34,7 +32,6 @@ <constraint firstAttribute="trailing" secondItem="eg8-N7-lDA" secondAttribute="trailing" id="tv6-ma-ze2"/> </constraints> </view> - <extendedEdge key="edgesForExtendedLayout" bottom="YES"/> <navigationItem key="navigationItem" id="vC8-Ti-TTd"/> <connections> <outlet property="settingsTable" destination="eg8-N7-lDA" id="gJV-8a-jA3"/> diff --git a/Ring/Ring/Features/Me/Me/MeViewController.swift b/Ring/Ring/Features/Me/Me/MeViewController.swift index 288edc3fe..fed5ae63f 100644 --- a/Ring/Ring/Features/Me/Me/MeViewController.swift +++ b/Ring/Ring/Features/Me/Me/MeViewController.swift @@ -41,9 +41,6 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas var sipCredentialsMargin: CGFloat = 0 let sipCredentialsTAG: Int = 100 - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } private let sipAccountCredentialsCell = "sipAccountCredentialsCell" private let jamiIDCell = "jamiIDCell" private let jamiUserNameCell = "jamiUserNameCell" @@ -51,18 +48,23 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas // MARK: - functions override func viewDidLoad() { + self.view.backgroundColor = UIColor.jamiBackgroundColor + self.settingsTable.backgroundColor = UIColor.jamiBackgroundColor self.addHeaderView() super.viewDidLoad() self.applyL10n() self.configureBindings() self.configureRingNavigationBar() self.calculateSipCredentialsMargin() - self.adaptTableToKeyboardState(for: self.settingsTable, with: self.disposeBag, + self.adaptTableToKeyboardState(for: self.settingsTable, + with: self.disposeBag, topOffset: self.stretchyHeader.minimumContentHeight) - NotificationCenter.default.addObserver(self, - selector: #selector(preferredContentSizeChanged(_:)), - name: UIContentSizeCategory.didChangeNotification, - object: nil) + NotificationCenter + .default + .addObserver(self, + selector: #selector(preferredContentSizeChanged(_:)), + name: UIContentSizeCategory.didChangeNotification, + object: nil) } @objc private func preferredContentSizeChanged(_ notification: NSNotification) { @@ -91,7 +93,10 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas supportEditProfile() return } + headerView.backgroundColor = UIColor.jamiBackgroundColor self.stretchyHeader = headerView + let point = CGPoint(x: 0, y: 100) + self.stretchyHeader.frame.origin = point self.settingsTable.addSubview(self.stretchyHeader) self.settingsTable.delegate = self self.profileImageView = stretchyHeader.profileImageView @@ -296,6 +301,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas case .device(let device): let cell = tableView.dequeueReusableCell(for: indexPath, cellType: DeviceCell.self) + cell.backgroundColor = UIColor.jamiBackgroundColor cell.deviceIdLabel.text = device.deviceId cell.deviceIdLabel.font = UIFont.preferredFont(forTextStyle: .caption1) cell.deviceIdLabel.sizeToFit() @@ -314,6 +320,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas case .linkNew: let cell = DisposableCell() + cell.backgroundColor = UIColor.jamiBackgroundColor cell.textLabel?.text = L10n.AccountPage.linkDeviceTitle cell.textLabel?.textColor = UIColor.jamiMain cell.textLabel?.textAlignment = .center @@ -336,6 +343,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas cell.selectionStyle = .none cell.sizeToFit() let button = UIButton.init(frame: cell.frame) + cell.backgroundColor = UIColor.jamiBackgroundColor let size = CGSize(width: self.view.frame.width, height: button.frame.height) button.frame.size = size cell.addSubview(button) @@ -347,12 +355,13 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas case .sectionHeader(let title): let cell = UITableViewCell() cell.textLabel?.text = title - cell.backgroundColor = UIColor.jamiNavigationBar + cell.backgroundColor = UIColor.jamiBackgroundSecondaryColor cell.selectionStyle = .none return cell case .removeAccount: let cell = DisposableCell() + cell.backgroundColor = UIColor.jamiBackgroundColor cell.textLabel?.text = L10n.AccountPage.removeAccountTitle cell.textLabel?.textColor = UIColor.jamiMain cell.textLabel?.textAlignment = .center @@ -392,11 +401,13 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas style: .footnote) case .ordinary(let label): let cell = UITableViewCell() + cell.backgroundColor = UIColor.jamiBackgroundColor cell.textLabel?.text = label cell.selectionStyle = .none return cell case .shareAccountDetails: let cell = DisposableCell() + cell.backgroundColor = UIColor.jamiBackgroundColor cell.textLabel?.text = L10n.AccountPage.shareAccountDetails cell.textLabel?.textColor = UIColor.jamiMain cell.textLabel?.textAlignment = .center @@ -413,6 +424,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas case .notifications: let cell = DisposableCell() + cell.backgroundColor = UIColor.jamiBackgroundColor cell.textLabel?.text = L10n.AccountPage.enableNotifications let switchView = UISwitch() cell.selectionStyle = .none @@ -458,6 +470,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas return cell case .accountState(let state): let cell = DisposableCell(style: .value1, reuseIdentifier: self.accountStateCell) + cell.backgroundColor = UIColor.jamiBackgroundColor cell.textLabel?.text = L10n.Account.accountStatus cell.selectionStyle = .none @@ -472,6 +485,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas return cell case .enableAccount: let cell = DisposableCell() + cell.backgroundColor = UIColor.jamiBackgroundColor cell.textLabel?.text = L10n.Account.enableAccount let switchView = UISwitch() cell.selectionStyle = .none @@ -546,6 +560,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas func configureSipCredentialsCell(cellType: SettingsSection.SectionRow, value: String) -> UITableViewCell { let cell = DisposableCell(style: .value1, reuseIdentifier: sipAccountCredentialsCell) + cell.backgroundColor = UIColor.jamiBackgroundColor cell.selectionStyle = .none let text = UITextField() text.tag = self.sipCredentialsTAG diff --git a/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewController.storyboard b/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewController.storyboard index d396af62c..9642d3064 100644 --- a/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewController.storyboard +++ b/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewController.storyboard @@ -186,7 +186,9 @@ </constraints> <fontDescription key="fontDescription" type="system" weight="thin" pointSize="18"/> <color key="tintColor" white="1" alpha="1" colorSpace="calibratedWhite"/> - <state key="normal" title="Create account"/> + <state key="normal" title="Create account"> + <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + </state> <userDefinedRuntimeAttributes> <userDefinedRuntimeAttribute type="boolean" keyPath="roundedCorners" value="YES"/> </userDefinedRuntimeAttributes> diff --git a/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewController.swift b/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewController.swift index 9630aff48..7128222a2 100644 --- a/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewController.swift +++ b/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewController.swift @@ -59,10 +59,6 @@ class CreateAccountViewController: UIViewController, StoryboardBased, ViewModelB var keyboardDismissTapRecognizer: UITapGestureRecognizer! var isKeyboardOpened: Bool = false - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - // MARK: functions override func viewDidLoad() { // L10n @@ -101,6 +97,7 @@ class CreateAccountViewController: UIViewController, StoryboardBased, ViewModelB self?.choosePasswordViewHeightConstraint.constant = 133 + height self?.view.layoutIfNeeded() }).disposed(by: self.disposeBag) + adaptToSystemColor() } override func viewWillAppear(_ animated: Bool) { @@ -109,6 +106,27 @@ class CreateAccountViewController: UIViewController, StoryboardBased, ViewModelB NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(withNotification:)), name: UIResponder.keyboardWillHideNotification, object: nil) } + func adaptToSystemColor() { + view.backgroundColor = UIColor.jamiBackgroundColor + scrollView.backgroundColor = UIColor.jamiBackgroundColor + registerUsernameLabel.textColor = UIColor.jamiTextSecondary + recommendedLabel.textColor = UIColor.jamiTextSecondary + chooseAPasswordLabel.textColor = UIColor.jamiTextSecondary + enableNotificationsLabel.textColor = UIColor.jamiTextSecondary + passwordInfoLabel.textColor = UIColor.jamiTextBlue + registerPasswordView.backgroundColor = UIColor.jamiBackgroundColor + registerUsernameView.backgroundColor = UIColor.jamiBackgroundColor + usernameTextField.backgroundColor = UIColor.jamiBackgroundColor + passwordTextField.backgroundColor = UIColor.jamiBackgroundColor + confirmPasswordTextField.backgroundColor = UIColor.jamiBackgroundColor + usernameTextField.borderColor = UIColor.jamiTextBlue + passwordTextField.borderColor = UIColor.jamiTextBlue + confirmPasswordTextField.borderColor = UIColor.jamiTextBlue + usernameSwitch.tintColor = UIColor.jamiTextBlue + passwordSwitch.tintColor = UIColor.jamiTextBlue + notificationsSwitch.tintColor = UIColor.jamiTextBlue + } + func setContentInset() { if !self.isKeyboardOpened { self.containerViewBottomConstraint.constant = -20 diff --git a/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewModel.swift b/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewModel.swift index 841597815..41d3fb543 100644 --- a/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewModel.swift +++ b/Ring/Ring/Features/Walkthrough/CreateAccount/CreateAccountViewModel.swift @@ -254,7 +254,6 @@ class CreateAccountViewModel: Stateable, ViewModel { }() required init (with injectionBag: InjectionBag) { - // var isPageDisplayed = false self.accountService = injectionBag.accountService self.nameService = injectionBag.nameService diff --git a/Ring/Ring/Features/Walkthrough/CreateProfile/CreateProfileViewController.storyboard b/Ring/Ring/Features/Walkthrough/CreateProfile/CreateProfileViewController.storyboard index 2443ad7c5..62ceb82e9 100644 --- a/Ring/Ring/Features/Walkthrough/CreateProfile/CreateProfileViewController.storyboard +++ b/Ring/Ring/Features/Walkthrough/CreateProfile/CreateProfileViewController.storyboard @@ -76,7 +76,6 @@ </constraints> </imageView> </subviews> - <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> <constraint firstItem="Ebb-h3-1X3" firstAttribute="centerX" secondItem="0Yq-n7-91P" secondAttribute="centerX" id="3Do-Tm-CjF"/> <constraint firstItem="Wss-Rm-aKz" firstAttribute="centerY" secondItem="8lL-e0-PFL" secondAttribute="centerY" constant="95" id="8Qr-wz-HY8"/> @@ -165,6 +164,7 @@ <outlet property="arrow" destination="RuJ-k9-6d2" id="sfC-3H-hGp"/> <outlet property="arrowHeightConstraint" destination="RIv-ZQ-8Uw" id="wPN-ra-uLi"/> <outlet property="arrowYConstraint" destination="SXy-dy-AW4" id="tL4-Ml-YxQ"/> + <outlet property="backgroundView" destination="0Yq-n7-91P" id="sEk-A5-g23"/> <outlet property="createYourAvatarLabel" destination="dwE-6U-bqU" id="eNT-V7-RAm"/> <outlet property="enterNameLabel" destination="N1N-hn-LTy" id="4gq-l5-bHn"/> <outlet property="infoProfileImage" destination="z2z-6h-lsY" id="XkJ-uW-3b9"/> diff --git a/Ring/Ring/Features/Walkthrough/CreateProfile/CreateProfileViewController.swift b/Ring/Ring/Features/Walkthrough/CreateProfile/CreateProfileViewController.swift index bea499aa6..c02b5d739 100644 --- a/Ring/Ring/Features/Walkthrough/CreateProfile/CreateProfileViewController.swift +++ b/Ring/Ring/Features/Walkthrough/CreateProfile/CreateProfileViewController.swift @@ -38,6 +38,7 @@ class CreateProfileViewController: EditProfileViewController, StoryboardBased, V @IBOutlet weak var profileImageViewHeightConstraint: NSLayoutConstraint! @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var infoProfileImage: UIImageView! + @IBOutlet weak var backgroundView: UIView! // MARK: members private let disposeBag = DisposeBag() @@ -46,10 +47,6 @@ class CreateProfileViewController: EditProfileViewController, StoryboardBased, V var keyboardDismissTapRecognizer: UITapGestureRecognizer! let tapGesture = UITapGestureRecognizer() - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - // MARK: functions override func viewDidLoad() { super.viewDidLoad() @@ -62,11 +59,11 @@ class CreateProfileViewController: EditProfileViewController, StoryboardBased, V self.profileImageView.layer.shadowOpacity = 0.5 self.profileImageView.layer.shadowOffset = CGSize.zero self.profileImageView.layer.shadowRadius = 4 - self.profileName.tintColor = UIColor.jamiSecondary self.infoProfileImage.layer.shadowColor = UIColor.gray.cgColor self.infoProfileImage.layer.shadowOpacity = 0.5 self.infoProfileImage.layer.shadowOffset = CGSize.zero self.infoProfileImage.layer.shadowRadius = 4 + adaptToSystemColor() // Animations DispatchQueue.global(qos: .background).async { @@ -133,6 +130,17 @@ class CreateProfileViewController: EditProfileViewController, StoryboardBased, V }).disposed(by: self.disposeBag) } + func adaptToSystemColor() { + view.backgroundColor = UIColor.jamiBackgroundColor + backgroundView.backgroundColor = UIColor.jamiBackgroundColor + self.profileName.tintColor = UIColor.jamiSecondary + scrollView.backgroundColor = UIColor.jamiBackgroundColor + subtitle.textColor = UIColor.jamiTextSecondary + enterNameLabel.textColor = UIColor.jamiTextSecondary + profileName.backgroundColor = UIColor.jamiBackgroundColor + profileName.borderColor = UIColor.jamiTextBlue + } + func dismissInfoView() { UIView.animate(withDuration: 0.3, animations: { [weak self] in self?.infoView.alpha = 0 diff --git a/Ring/Ring/Features/Walkthrough/CreateSipAccount/CreateSipAccountViewController.storyboard b/Ring/Ring/Features/Walkthrough/CreateSipAccount/CreateSipAccountViewController.storyboard index c9932670d..a8a0f6a83 100644 --- a/Ring/Ring/Features/Walkthrough/CreateSipAccount/CreateSipAccountViewController.storyboard +++ b/Ring/Ring/Features/Walkthrough/CreateSipAccount/CreateSipAccountViewController.storyboard @@ -233,6 +233,7 @@ <viewLayoutGuide key="safeArea" id="asY-zx-uYD"/> </view> <connections> + <outlet property="backgroundView" destination="daQ-3e-VKq" id="RtR-Mp-68e"/> <outlet property="createAccountButton" destination="31a-Gd-rzz" id="emU-Tv-WdU"/> <outlet property="passwordLabel" destination="h1h-xB-2Im" id="gNl-Yq-JdG"/> <outlet property="passwordTextField" destination="N2t-MA-mli" id="A0W-4E-Lmu"/> diff --git a/Ring/Ring/Features/Walkthrough/CreateSipAccount/CreateSipAccountViewController.swift b/Ring/Ring/Features/Walkthrough/CreateSipAccount/CreateSipAccountViewController.swift index cd84bfa0f..7cd30fb7c 100644 --- a/Ring/Ring/Features/Walkthrough/CreateSipAccount/CreateSipAccountViewController.swift +++ b/Ring/Ring/Features/Walkthrough/CreateSipAccount/CreateSipAccountViewController.swift @@ -36,6 +36,7 @@ class CreateSipAccountViewController: UIViewController, StoryboardBased, ViewMod @IBOutlet weak var passwordLabel: UILabel! @IBOutlet weak var serverLabel: UILabel! @IBOutlet weak var portLabel: UILabel! + @IBOutlet weak var backgroundView: UIView! var keyboardDismissTapRecognizer: UITapGestureRecognizer! var isKeyboardOpened: Bool = false @@ -59,6 +60,7 @@ class CreateSipAccountViewController: UIViewController, StoryboardBased, ViewMod self?.createAccountButton.updateGradientFrame() self?.configureWalkrhroughNavigationBar() }).disposed(by: self.disposeBag) + adaptToSystemColor() } override func viewWillAppear(_ animated: Bool) { @@ -71,6 +73,24 @@ class CreateSipAccountViewController: UIViewController, StoryboardBased, ViewMod NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) } + func adaptToSystemColor() { + view.backgroundColor = UIColor.jamiBackgroundColor + backgroundView.backgroundColor = UIColor.jamiBackgroundColor + scrollView.backgroundColor = UIColor.jamiBackgroundColor + userNameLabel.textColor = UIColor.jamiTextSecondary + passwordLabel.textColor = UIColor.jamiTextSecondary + serverLabel.textColor = UIColor.jamiTextSecondary + portLabel.textColor = UIColor.jamiTextSecondary + userNameTextField.backgroundColor = UIColor.jamiBackgroundColor + passwordTextField.backgroundColor = UIColor.jamiBackgroundColor + serverTextField.backgroundColor = UIColor.jamiBackgroundColor + portTextField.backgroundColor = UIColor.jamiBackgroundColor + userNameTextField.borderColor = UIColor.jamiTextBlue + passwordTextField.borderColor = UIColor.jamiTextBlue + serverTextField.borderColor = UIColor.jamiTextBlue + portTextField.borderColor = UIColor.jamiTextBlue + } + @objc func dismissKeyboard() { self.isKeyboardOpened = false view.endEditing(true) diff --git a/Ring/Ring/Features/Walkthrough/LinkDevice/LinkDeviceViewController.swift b/Ring/Ring/Features/Walkthrough/LinkDevice/LinkDeviceViewController.swift index bfabeb1c1..a0da40827 100644 --- a/Ring/Ring/Features/Walkthrough/LinkDevice/LinkDeviceViewController.swift +++ b/Ring/Ring/Features/Walkthrough/LinkDevice/LinkDeviceViewController.swift @@ -48,10 +48,6 @@ class LinkDeviceViewController: UIViewController, StoryboardBased, ViewModelBase let log = SwiftyBeaver.self - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - // MARK: functions override func viewDidLoad() { super.viewDidLoad() @@ -61,8 +57,10 @@ class LinkDeviceViewController: UIViewController, StoryboardBased, ViewModelBase self.configureWalkrhroughNavigationBar() self.view.layoutIfNeeded() self.linkButton.applyGradient(with: [UIColor.jamiButtonLight, UIColor.jamiButtonDark], gradient: .horizontal) + self.pinTextField.tintColor = UIColor.jamiSecondary self.passwordTextField.tintColor = UIColor.jamiSecondary + adaptToSystemColor() self.applyL10n() @@ -118,6 +116,20 @@ class LinkDeviceViewController: UIViewController, StoryboardBased, ViewModelBase }).disposed(by: self.disposeBag) } + func adaptToSystemColor() { + view.backgroundColor = UIColor.jamiBackgroundColor + scrollView.backgroundColor = UIColor.jamiBackgroundColor + pinLabel.textColor = UIColor.jamiTextSecondary + passwordLabel.textColor = UIColor.jamiTextSecondary + enableNotificationsLabel.textColor = UIColor.jamiTextSecondary + self.pinTextField.backgroundColor = UIColor.jamiBackgroundColor + self.passwordTextField.backgroundColor = UIColor.jamiBackgroundColor + self.pinTextField.borderColor = UIColor.jamiTextBlue + self.passwordTextField.borderColor = UIColor.jamiTextBlue + notificationsSwitch.tintColor = UIColor.jamiTextBlue + pinInfoButton.tintColor = UIColor.jamiTextBlue + } + func setContentInset() { if !self.isKeyboardOpened { self.containerViewBottomConstraint.constant = -20 diff --git a/Ring/Ring/Features/Walkthrough/LinkToAccountManager/LinkToAccountManagerViewController.storyboard b/Ring/Ring/Features/Walkthrough/LinkToAccountManager/LinkToAccountManagerViewController.storyboard index a9dbc2424..ec6e86178 100644 --- a/Ring/Ring/Features/Walkthrough/LinkToAccountManager/LinkToAccountManagerViewController.storyboard +++ b/Ring/Ring/Features/Walkthrough/LinkToAccountManager/LinkToAccountManagerViewController.storyboard @@ -175,7 +175,6 @@ </constraints> </stackView> </subviews> - <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> <constraint firstAttribute="height" constant="800" id="BuH-dc-4uY"/> <constraint firstItem="cZa-pp-ILv" firstAttribute="centerX" secondItem="kQW-jH-EMh" secondAttribute="centerX" id="J9V-hd-HTu"/> diff --git a/Ring/Ring/Features/Walkthrough/LinkToAccountManager/LinkToAccountManagerViewController.swift b/Ring/Ring/Features/Walkthrough/LinkToAccountManager/LinkToAccountManagerViewController.swift index 385d9b42f..a548d82bb 100644 --- a/Ring/Ring/Features/Walkthrough/LinkToAccountManager/LinkToAccountManagerViewController.swift +++ b/Ring/Ring/Features/Walkthrough/LinkToAccountManager/LinkToAccountManagerViewController.swift @@ -56,6 +56,7 @@ var viewModel: LinkToAccountManagerViewModel! self?.signInButton.updateGradientFrame() self?.configureWalkrhroughNavigationBar() }).disposed(by: self.disposeBag) + adaptToSystemColor() } override func viewWillAppear(_ animated: Bool) { @@ -148,4 +149,20 @@ var viewModel: LinkToAccountManagerViewModel! accountManagerLabel.text = L10n.LinkToAccountManager.accountManagerLabel self.enableNotificationsLabel.text = L10n.CreateAccount.enableNotifications } + + func adaptToSystemColor() { + view.backgroundColor = UIColor.jamiBackgroundColor + scrollView.backgroundColor = UIColor.jamiBackgroundColor + userNameLabel.textColor = UIColor.jamiTextSecondary + passwordLabel.textColor = UIColor.jamiTextSecondary + accountManagerLabel.textColor = UIColor.jamiTextSecondary + enableNotificationsLabel.textColor = UIColor.jamiTextSecondary + userNameTextField.backgroundColor = UIColor.jamiBackgroundColor + passwordTextField.backgroundColor = UIColor.jamiBackgroundColor + accountManagerTextField.backgroundColor = UIColor.jamiBackgroundColor + userNameTextField.borderColor = UIColor.jamiTextBlue + passwordTextField.borderColor = UIColor.jamiTextBlue + accountManagerTextField.borderColor = UIColor.jamiTextBlue + notificationsSwitch.tintColor = UIColor.jamiTextBlue + } } diff --git a/Ring/Ring/Features/Walkthrough/Welcome/WelcomeViewController.swift b/Ring/Ring/Features/Walkthrough/Welcome/WelcomeViewController.swift index 2316c5add..fe0badf60 100644 --- a/Ring/Ring/Features/Walkthrough/Welcome/WelcomeViewController.swift +++ b/Ring/Ring/Features/Walkthrough/Welcome/WelcomeViewController.swift @@ -41,10 +41,6 @@ class WelcomeViewController: UIViewController, StoryboardBased, ViewModelBased { // MARK: members private let disposeBag = DisposeBag() - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - // MARK: functions override func viewDidLoad() { super.viewDidLoad() @@ -100,6 +96,9 @@ class WelcomeViewController: UIViewController, StoryboardBased, ViewModelBased { self.connectToAccountManagerButton.rx.tap.subscribe(onNext: { [unowned self] in self.viewModel.linkToAccountManager() }).disposed(by: self.disposeBag) + view.backgroundColor = UIColor.jamiBackgroundColor + self.welcomeTextLabel.textColor = UIColor.jamiLabelColor + self.createSipAccountButton.setTitleColor(UIColor.jamiTextBlue, for: .normal) } func applyL10n() { diff --git a/Ring/Ring/GeneralSettings/GeneralSettingsViewController.storyboard b/Ring/Ring/GeneralSettings/GeneralSettingsViewController.storyboard index db093a3fe..ef647c07e 100644 --- a/Ring/Ring/GeneralSettings/GeneralSettingsViewController.storyboard +++ b/Ring/Ring/GeneralSettings/GeneralSettingsViewController.storyboard @@ -1,11 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="0KF-lS-cXQ"> - <device id="retina4_7" orientation="portrait"> - <adaptation id="fullscreen"/> - </device> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="0KF-lS-cXQ"> + <device id="retina4_7" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> @@ -13,7 +11,7 @@ <!--General Settings View Controller--> <scene sceneID="35j-2a-aAz"> <objects> - <viewController hidesBottomBarWhenPushed="YES" id="0KF-lS-cXQ" customClass="GeneralSettingsViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> + <viewController extendedLayoutIncludesOpaqueBars="YES" hidesBottomBarWhenPushed="YES" id="0KF-lS-cXQ" customClass="GeneralSettingsViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController"> <view key="view" contentMode="scaleToFill" id="tdP-kF-vrw"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> @@ -62,7 +60,7 @@ </constraints> <viewLayoutGuide key="safeArea" id="f8H-BQ-kNd"/> </view> - <extendedEdge key="edgesForExtendedLayout"/> + <extendedEdge key="edgesForExtendedLayout" bottom="YES"/> <connections> <outlet property="doneButton" destination="NE7-nL-DvW" id="a2F-oe-Fon"/> <outlet property="settingsTable" destination="XAa-ES-xki" id="Af8-lt-Nsn"/> diff --git a/Ring/Ring/GeneralSettings/GeneralSettingsViewController.swift b/Ring/Ring/GeneralSettings/GeneralSettingsViewController.swift index 4fe7e9d77..ce0e5b2c2 100644 --- a/Ring/Ring/GeneralSettings/GeneralSettingsViewController.swift +++ b/Ring/Ring/GeneralSettings/GeneralSettingsViewController.swift @@ -35,6 +35,8 @@ class GeneralSettingsViewController: UIViewController, StoryboardBased, ViewMode override func viewDidLoad() { super.viewDidLoad() + view.backgroundColor = UIColor.jamiBackgroundColor + settingsTable.backgroundColor = UIColor.jamiBackgroundColor self.applyL10n() self.setUpTable() doneButton.rx.tap @@ -88,7 +90,7 @@ class GeneralSettingsViewController: UIViewController, StoryboardBased, ViewMode case .sectionHeader(let title): let cell = UITableViewCell() cell.textLabel?.text = title - cell.backgroundColor = UIColor.jamiNavigationBar + cell.backgroundColor = UIColor.jamiBackgroundSecondaryColor cell.selectionStyle = .none cell.heightAnchor.constraint(equalToConstant: 35).isActive = true return cell diff --git a/Ring/Ring/Info.plist b/Ring/Ring/Info.plist index addb80c12..6c6e947dc 100644 --- a/Ring/Ring/Info.plist +++ b/Ring/Ring/Info.plist @@ -70,7 +70,7 @@ <key>UIRequiresPersistentWiFi</key> <true/> <key>UIStatusBarStyle</key> - <string>UIStatusBarStyleDarkContent</string> + <string>UIStatusBarStyleDefault</string> <key>UIStatusBarTintParameters</key> <dict> <key>UINavigationBar</key> diff --git a/Ring/Ring/MigrateAccount/MigrateAccountViewController.swift b/Ring/Ring/MigrateAccount/MigrateAccountViewController.swift index c628668e7..3168ac6e1 100644 --- a/Ring/Ring/MigrateAccount/MigrateAccountViewController.swift +++ b/Ring/Ring/MigrateAccount/MigrateAccountViewController.swift @@ -46,10 +46,6 @@ class MigrateAccountViewController: UIViewController, StoryboardBased, ViewModel var keyboardDismissTapRecognizer: UITapGestureRecognizer! var isKeyboardOpened: Bool = false - override var preferredStatusBarStyle: UIStatusBarStyle { - return .default - } - override func viewDidLoad() { super.viewDidLoad() self.view.layoutIfNeeded() @@ -72,6 +68,12 @@ class MigrateAccountViewController: UIViewController, StoryboardBased, ViewModel self?.cancelButton.updateGradientFrame() self?.migrateOtherAccountButton.updateGradientFrame() }).disposed(by: self.disposeBag) + explanationLabel.textColor = UIColor.jamiLabelColor + titleLabel.textColor = UIColor.jamiTextSecondary + passwordExplanationLabel.textColor = UIColor.jamiLabelColor + registeredNameLabel.textColor = UIColor.jamiLabelColor + jamiIdLabel.textColor = UIColor.jamiTextSecondary + displayNameLabel.textColor = UIColor.jamiLabelColor } override func viewWillAppear(_ animated: Bool) { diff --git a/Ring/Ring/QRCode/ScanViewController.swift b/Ring/Ring/QRCode/ScanViewController.swift index 006da5caf..73caa01c2 100644 --- a/Ring/Ring/QRCode/ScanViewController.swift +++ b/Ring/Ring/QRCode/ScanViewController.swift @@ -52,10 +52,6 @@ class ScanViewController: UIViewController, StoryboardBased, AVCaptureMetadataOu return cFrame }() - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - // MARK: functions override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) diff --git a/Ring/Ring/Resources/Images.xcassets/background_input_text.colorset/Contents.json b/Ring/Ring/Resources/Images.xcassets/background_input_text.colorset/Contents.json new file mode 100644 index 000000000..cca9b5e34 --- /dev/null +++ b/Ring/Ring/Resources/Images.xcassets/background_input_text.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "255", + "alpha" : "0.570", + "blue" : "255", + "green" : "255" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "255", + "alpha" : "0.570", + "blue" : "255", + "green" : "255" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "1", + "alpha" : "0.570", + "blue" : "1", + "green" : "1" + } + } + } + ] +} \ No newline at end of file diff --git a/Ring/Ring/Resources/Images.xcassets/background_msg_received.colorset/Contents.json b/Ring/Ring/Resources/Images.xcassets/background_msg_received.colorset/Contents.json new file mode 100644 index 000000000..180bf589b --- /dev/null +++ b/Ring/Ring/Resources/Images.xcassets/background_msg_received.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "231", + "alpha" : "1.000", + "blue" : "235", + "green" : "235" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "231", + "alpha" : "1.000", + "blue" : "235", + "green" : "235" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "25", + "alpha" : "1.000", + "blue" : "30", + "green" : "30" + } + } + } + ] +} \ No newline at end of file diff --git a/Ring/Ring/Resources/Images.xcassets/background_ring.imageset/Contents.json b/Ring/Ring/Resources/Images.xcassets/background_ring.imageset/Contents.json deleted file mode 100644 index 8266831dc..000000000 --- a/Ring/Ring/Resources/Images.xcassets/background_ring.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "background_ring.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Ring/Ring/Resources/Images.xcassets/background_ring.imageset/background_ring.png b/Ring/Ring/Resources/Images.xcassets/background_ring.imageset/background_ring.png deleted file mode 100644 index afc68a862412635aeef5c4bd48ec243b406fadf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48001 zcmeAS@N?(olHy`uVBq!ia0y~yV0y>Ez-q?9#K6Gdx^+n)0|NtRfk$L90|U1(2s1Lw znj^u$z`$PO>Fdh=kX=|<%VLM8ekB6~gKTC<M2T~LZf<H`2?Gc?7o{eaq^2m8XO?6r zxO@5rr0AuxGcYJHc)B=-RNQ(Kd%Nhd72gu!xBvft=-kUc>!HF9K^FZ<lgn~*&w9#4 zFLGEQ%_7x*{dMSvL)`j%#P-CkzyA5>pI^U{?CWdl_nvtDvBKwP+^<-9dHLtZujQ}Y zA0(?#+x*$A%=**1`StN%jqUC1`W{>KJ^uW8^OR3Db~n|pd#^pc=-!m7xt-#%|EpHM z<hS|XRoC%r!RzJ)|1IAC-ShWzlFaOt+xH(zd$IjWdxSjK-pil;Z!GSwulws$>HcM| zyuAF?6|WYVUT@i}EA--~(W?5O`4dg<M(&>a*S?hRP1ft9Q-b<-xm_x`ax|#d$L?<D zyJP=Z?sw?UUa{}lmXI>l{^O57f4*F3eu?Gf^^NBJyQO#Sefj8zyoWq{H2W{kFLA5X zSG}M9e?kAr@BKODXHBbK$-LgQ;$rLC&^y<Em|rR}KbRVMP<6)2^Ph}9ea?Im_Ww`) z|KIYTmpp%axnXaTX4AfErKHvSR#;7V^={?lpFe&lZMPR%wVdTs<m-TP)lxg1qSX$) zZx{bkEK<J|YhQldr6Bj#hZ~zN++Jf|cQ5(FwHIBMiuOB{^|mO9ty*y~;LVChdwwal zKi*t5^Rm+YhtU#W6<+B^xJBwdFqwO5PTYF&(#v+7-3H4eKkojwU(`&gzuEOsmWkH> zCHZN$`!BA~J#+FVTaTsZ8NqbFoX8v3x*oq-JtNp)x<Gu~PuG&I=kKQMy!bi%?9vSv zD)k*Fg`aCmIwGXhtrP#eY{kB%kEZtb_Y0q$5@cs@pMAlqKJ<Ur!~8UrSKnstSpG`L zQY^JFW9Qu`OxNZIOQ>gxn#P)zDt2zqGPXQ@-uAoTg@Su0GTFY?z0OOT9~th@_Uv<U zhMmu?o|=fv-+?>-c5DyiefhH{sO5R`R_D^11V0FTeCDK+vDUn7p(P#1C%m7@y?FNZ zfWXqdmuH2hp74Jrel>Y|B;(=zMeH9e<6qS;n6+q{LWJx5PtRYSGMS(Ad0n&lqdOIU zs@B}U##<`Y79&~q>`>TYtNM)>Ua9&i`~A^rIUCj>_@4O;Cm3eR7EiJd=YLr>|2J>^ znM5O#<hx9t)n8w_UDtH8e6uirhjwg=V3d(tsiV^I*RigAd$%1IQ+eTe<&MGb>?|{$ zf2-cb{;R(r&9eQHMTy*hXVYz`ST(;iK+NVmlWA34G-+{X&Lh9+R;?8$l#EM{yB3_; z6?|*1_whqzf?Ky7UH3V<Fmz(eFSdf0bAD`A;__Tr9eMUn!mf9#L-!|E&VV~puz1lo zh1aj=N`LPcoa-v#Z*3YmVe+{Wy&cQeFHxRU`kHT^oaaK*k6|rNKb~(s+dXCX%RBBp z(sQzvtXIiw=Dg)okScTSt&ZOwBY!j13+aXT?2ILL_0JIQ`%!#zxsjo%f$Wh8lW5yp z|E5i4EM@}3sDpE^h;4Qey7;MZ^EAC5mO@I#kEgWvZ&}o5IrGG$lDEq$Qg;=XTMAwJ zb7|JAW!e9}el1<c`FHJ`d=Hn)h1uJ~icU={^!u~=;DuGbH;+iE@A6I9e#_E_C#zI@ zuI@3JQw^4lV0bpw@5_`j>HL|Kmhk+Vxj;WmI6RE^(b_Hhn#7eqFSu5H<?gF|&#kL+ z-Yxdg-}md`HS=eEx2{e*vu@JCFMS?QI*;!+`R95?i%;t4!8r%OP|Zla^YgZ&*U$1! z`X?Hd5gmIbH(YPG-m_a%zs}_O_~TxV*az8{#xGX=n^TlwossiVI<mHB!?_t>H^m#M zgW+=5Jo8D@yW*n@J_;Yv+i`q${sy5HYYO-7<Sm}2|Ng`;nP2Dhycf8)fAYS$dD<@i zH_mn^R{!$~I{PEkmBVuPiDg#JN3H&d=1H|Jx$|YkthJrHjAG-=g+8sh{qn7cgvu-5 z`b#U|fjsN?!;k>Ox_}*Ljejhk9Bi{yBzIMM!TkC2vo4h%VR$6r?K;yj;<EPqh3}X` zPc59VW@qq@od*-vq|}6$HohvGQO3O5YssoVex`f-um0hV==BiW`(##u2J<r(Ff^HN zY00_2Q?F?5k#AFMrgbHU*gWK@%nuXpb+_AUu(2c2>J@{mWx?`{wH?jJKmLw)RG#>+ zch%gJN1S7OR~0|Yp2aSFrZD1|%h9m)iQ)TxGJw+sQ}M0CbFM9%$-Q~!*$KzEj$Q3z z@h&gCy_cu#z)HDeFF$SeSiE2M-p7dj<<~D5`JPV5a``YjvngYl`QBZ;+(t{yOHXS= zN`eDg-C()sna<3dAb!!7o!76eP`$+`@n!kkg(A;Gn^a1-Jbz_$e6HvEf`-Q(vx@(! zh;D3K`XhesjR(Q!o;GWKPCFa(b<3u^E^}p%u-W`}sN`aqsc~H{J}&fglh*so^)kK= zkT76*HYM4wbh82bmF|Y=VcaVl=O3KD<8fHCiS6&?{~r<^&owNcQR^fedNp9ezauvV zCmC*<vSIO-yw<~|I=2pKOq{b_Bx7sdguely`HKQI%bNtZuXr#|c1z;b`4O?lT>Xx* zLBnL$i8)J3cDxDPugIZSW*aHq7dUs4)z%QzaPR3$Zw3V<y_)iG*)qGySz;^t4o%`q zpT0}|S_JE?qgTb=b6xdW<1L$i=-dwN4QUN-O7k3z7HF+H5?;4q;nkPQ>-x3}gx+r6 zCkigDIL~D26@NN=PwI!k#l0Stt*(-G?8i5B2hN>(n0MWw%CnO`uglPVxbKhE^Ow=a ztm|#Bmxa0Q3V5czbb0A2@etz)A*VhvJZ9Xrz1_TbevQoGx^)ilnCLvS^5@&qRoN;V zrR3A(0-2|KD%+=-Y)?1Ty0E)#zgY4GpE+_W4sm&p=G6z6E|GovJ~`{t-u{SZ*2)|f zxdu6P-J-&?<=Q5tL?w$KEI4y)#-r6&Y!*-MKYn-p)y_3uQ+TslS>`Sgz0xO?u@n|& zUIxqcUZ=KZ>~;Ms`1bf6p_9&Krc$2EZkXmC=Da=W(wg7^-_uJs{j;lblfPrJH2CWj zHS5`Xw@=hbyL@hU%w87BHQ@>z{<RN%vm=#ynK)+#gkDU(Bc)kC&G?OyScS_x_8G!p z7~E%h)VB1)LiU3*Q#l_mpPA*hExRP+`r*{)`)_vy&yu<-w!hTG|C708UMg2l_M-IV z2PZ@>h-#2Hl3VyiVSmY@)J;9_*QBo!6Y+}GlYb_+w+xoOrX>3bsvB#k>C66m6mm=V z)SgSX7Du{opLqDSOVReYCzqxMKE89}RL>L}qy1TpGZt}1t&5hN+2A42oEu?TVUv6F z6(cy8vOL?;VOcu0boJG1rG=L`ZXBO3*stj?$Nh4l#;uF57CnevzU$P~iF2!b)dJM- znIB(msyTm+dT^z8UR|{~QyJH-s{PjkTf)!At&@IT`6cya7=zTVsS@8O#I7h@E_m{5 z*+<4Ikpn@u4z4KYxy1_(5aAh@ztq|azE$n(f101_w#w@MStXG#JLbDxJ94r9v*FKM zyhalx7k2xa8L=K&?pUy1e3DV}m4m<R%C>eay}CHd^sU+w)8ff}DLYrGK9Z`Jg;d%J ze$_LAZ=KP&kaMkQtwYhO&tDf_va)|%eoQr~{=<(Tx&BoaYIY(=e;u2+jen}CZzb1R z<-1ig^kzF$pS~#e@{RfVt<4!~w(BO^3Q9GwS<CflX2bHY$o_^0u`3MLUBBL6K6|yO z)AZ$Mmt{ByM83Ktbu&yi;M1Z)z5^_q{xWWi^{F;3U#il3ZhCIpp%Y)vTzVh2`pc5v zQ>Atao)A^P#Phyyb)d^a9#|M~6wfNXw500Wy|q`qcD&4~)b>24bd&A)qx7$r-i7l$ z3SiH%)S9*TSDbH*X}6q?t8vLkdwcuYUh=EIdtdl2rdWJ`DaX~XW}5waj}=%$ElrAH zHJWac-?f16M@0Ctief)IUrA0)mySv;^S!a%Qpc2WzVOT$aSoj;yH{RLU;8kRb3*RS zEjoFx*S2c><>ENl>mT{ZqOVipgGK2?^*4TZrr5POD!ulTOh}5>42pYXUZEva2@CGm zGbV?=G@bDv@ciRlK8G$crB=C~^SfivXp?BRH2BDB&DCBD88)}Xl~~J7dYm11RWtR8 zoD2V!%0;Um8v0&;d}+J#?oQTaN6u|+xijnZx<ktz7+XQ=&jWMB440p<Rr7ltBG?}1 z@c6v*)@utjJDys<c&YDgznP_N&#z#+h(+hL=JY>*|5&iab^atRr5=?N%C9o~{snbK zuBkY6R_$7eSA^~B|9}33%=A&(AMoaJb?K74>u+Bmm;9c4%V)}e?Vj`G_6;5X*9Lx% z@-4S`yB7WS{(Gun!gehItwi5&=EkL!Z*7jxY4=oq)^RrC$_e>PNl)J|{WaxkvW4wR z9b?vF!`_rbe7P@J4Sf$!dvJB3z^azpg8MyT^-HPVZtdSorP@Rj)*M-QOGj)@z(%QS zJr80_``V>cUMbnkKi}WaZ}oa!5rbA{qUGn0-SOME6;11Cjtb#;!Lv%+*lqdUhpHdv zpLrdu$$NE+jMsv`pp8uO)dgoo?O>sG&2TyI>?vtqRhDgGTM|7v_5Fl>zK<oYs-*@^ z)4eV^-_PXngLzB4IHhZL2<yL;*7&(H@%F<m>-R}t%TERtZYuH5%e8!*+H5jCNE=qJ zY-zMyd$03cV#&`s8~6M1-m6acS4TQu54{liyz7L2g!*e4MZa!|m9Ns5#Mai;t@^v6 zn#WD{<>r#<C-<KBW6(M=`SbM|6Vk-_y1##$CF=uAFSplOiZ=>9wt4zd>G1bb({oD; z^xkh%h&a1(<<HHRtdvqt2CmZ23VqanLf{8W<^(%S$FoeTMgOG!nv~7ky)&{!&MU{j z^=9d6JC0+b^UteqmTXV3NV`+Y7F1vN=1wNWlKowlrK*MOn->;^xNfZe{z@rA>Xdi) z^JR<oK3F$hR_Ik9pIV`QOZmY`|26#;n_|QCkFx!FGG{_W;K}FAkE2fpZCPabBOj4O zO3!49&3d^><8|K+58?lhwwK!JX}Oj^k$zGVTKVK{&8?^B%6{o3Z{}#e^`g4q%)hJO z_`f{0+m&+t!ga%PQ&@A*tA72XF99m$lY{N&G2hwz=xo}4efO%!EseQbW)~dY85Q7j z{qRD@I<F%2#+m<I1=WIier``&owI(@wD|f%a=y<HZTVljeB-UskF?(}c=x5q?cJi& zXQpW}Mc5}!jE<eA`6|i0^Md8<kDq7tIbCgQO=>NCt>a#6GSQPMY+|<OTz-@4{MSJ; z;i;yOWK+jnoE3F+4QJTV89J+fak0NE@vYnVr$W4aXIIZk<<EIdh2}rvxHo;NJGAKZ zZkc;iBRCrmAN#vP#D2!Mn(A_6GiVtWJj-(F`|Ll(8N1^PfB$>I|2Ww0QF8F(6KT<Q z{?j62JCfbj=skD4A};F|_D1X2>ab^%mM`8WBBI2UB<Wvp^v}+^gVA<P^_<XZ=*sCi zGHVy`1_t<r=xz&3|KKO9^|WUa2OsxsnaMR~JFJS1f37@OlaeI+L@Xg{O~~c!&)@Qm zw$Ggq{<Qt;^K|Bwvy41`y!vr$;q($7D{fd0e4u;0dZ&9rYQU!*lT@R;ue7orHx4p4 z4AI`Qe%q5D4;;KVCh4(Hn8dZ|Q{r>E{dach$W}^r%oa|2=GOkm`w66v&}iwK;<xIb zli=foblq96d{j7!m-U^$_51oW-?<9D@26BsWKZ&${(kNZ-z|N<$Df{_dvxOU2O+t6 z8R0z+pIy&4buBq@;S5jbzf+g)y|MLv`Rg!Jx9XPU`_<2Lr?sEX47--FL(|}Ul>ece z$3MS^GQNBMJYBK(*T1;iY)8#RwqLx=@U!>p^OBuec0bsA95|b7N*$tmPxz$#`Ey=t zzucRnCo6?g*&t00;Te~eo?Yo~_`7Aks*dLIvr+X&(~4FG=X4v+T6HIX(scjQ74;R9 zuK%2T{=C0f#g#o4S3eXiD0uh9(){{eF5$BtE9V_v<@E5m{k-$fuU{88mSfBKbBJw! zL2*?@kiE^O%B!pDU#c!))Aa2<?YeDO=p!D>ihlR?>tQ`NuC|RGj%<a?SM3y^;+eA0 zBT6uOzS5D!Yv=u6YFKR`A0}V;RXsgq*`@O(Yi4_8zdUp6QqYUA_a&`u=_=}Pdn`%| zcn<Gd^ZtoRXYtV$t2;I3s#(O%QrNibQpfaZ57tDAs!#0NIyGd2h3fpf;orESX=h4; z-{W<sG_P*TQ*1o(G)${rJ;Ku2Je-@u^-NGy!r$E9-B*^HIBIn_mDZl)J$m7D$-9)J zeJ%?9EekK%`@Z>ee*OCOpFh9cH08sO!|Oahc~|G9J>78C?1|a}$t4AU5P49xSc?Bu z(ZQw1(mpe;%ujyt|Ks1%vbxB#Qym{&Il4y4^vc8!^?8l!*RS{Lil{sHUuo-_d8*%L zq_l<j?wMvT7APohKI26A71gzMZhqIYKb`FO=)>v1xxlBUP-Es6j&Cm3mXPcTt^;>+ z+*suq#DCq($NiMk<f+mZBEMYA<6>Ll%IBUGbF7;!vHWRBj?%_6EUP7t*nV3q7Qbry znyjgY%^S}#J~=gK;q#Q)*QPkwAGT`BtG-)0L7UC~!b!c=fxBzg8x&^DC@I(a=Y1{# z($!`vmMZ6Slu`Cx^>o>`J&Bvm@6B55d3M>Z*tWE=I~95}kI#Ag^VhFmi}a30?czwA zba5S<$}>-;WbIuMh3kU?S))}8oZh-5y*|9w@YwUF%`yhBk4YTQ`uO3>oJ@V@l6M_3 zx@i;G@AH4uTB~-s!+PqBuM%H&LJI5zKfYqAmYtX88~8uE{yZ|yVpHB!<*VN>+nxIR zEBcz|!Y}GNJF^`f?BA?>?fJK-#q{Xg=Mn7<q5n0_`|LZe-|q~{Y_gsBs#@|~H_My3 zp7+&O<i2~ScChTo?Jh;Ri@T*h{he7j31(B_Gn0<w8|z<XZkoJjimF|vX2JfcMVtR@ zH~ur{k%YGWT)X?z112TLiv}+%%nd&`gXwJ2mB}Yx8Md1oyS#c+=u;cjA3uI)-SY@Y zt!s%|ZMD(&^43*aSGo2-dt9s)fA!tzBf9d+@FwGvH?47s?pxzl-O#e|{eJ!Hn>l)x zKVw5;t1g^Z$vU&zLg4J1u!O9Qi#ftLsxsSju0FF674U!0^(O1o=|B<of(@%}!ymgC zr+;3#G(pnE_^f?@gM{R)xwEs1nA7)Lob&2s;+vJ}CR5gb{KPS4Xa_KAV`s?2<6nZT zFE9R+p?-Mb85VO_>)qQtH%$Ma;<Q|S<sz?-s$B^pGv^0?o@-iknrCl`S9Qly<rz0$ z-&Zp5xSQ?stgA>pv_?hO_vPWF$QG%SpT2$5J#|5OskLs(NueiV?=t7Tm023kBoFNf zYMz)gCn5jfj;qd=YdpoXrUVrld^Hd%jdacAE9hw#^Xj_cB5s;58{=boz#_siE~vKn z55soz>#xr@&pr`#^-PA0LXdGn?UX{PwA8rTP_67WYqD~>S#HdF6miyM1OI}n`Ic<* z@M`8z#UG>Rt|zY?vElt{(ATJ#&VKY~qRO^Vnc%C-+2&52^>Ev<y_VC@{`-HXoNv;x zXHPBvrL271HRYXWqt~_S=pN^Ym*<sFa%yKQgr+~v(`ApWv3rmsyp>C7Uugd_Sy;RI z>5Smd7hSF#D8ILRY0;8n%ca&{J-j1st>1pF`CR5FZtfDR>k66rmF@kr#g>14f>+pn zQg{;Fv0QHXlLvG66kWe;W10JP*QN6%U)MyuHR_w;TC@5b7fW44`q7C~bFSY%CDZc1 zw3kl}RxN3s@x016EjH?3<iiC!SFODNqkQ9Y*UeQurWcFfF558q{^^yg{8<~5TN+NX z3*P@BrnttI{mS8pBc6Rra+TJKe*U2oZuV~Ol7j|!&!w$T+AOs&!#QPk=k45IchCB| zvmWS*ZGZ4%GQ5`IFD|-dW6Cm3`aI**+(MK4p3U3uyT9zezsR-j&4j9H+^J#`GZ#%Y z-qV$N<<Pfhx7a>6Svwa!`dg%M_h&?AR!z!g^(yzOn@vkOrw8vUN?CWK(Cc%+p*Qft zW7g3*N-_z~{fPySmt6EweCobQ;FP{bh-}H{mR*tS#Qpb_hTb{N=bLRYYn5vr=Zb09 z3M(^tQ)ln?6>5GpOOs(`ZG3B-=KXhD<4&^Ax_M{aM4g<8p;p(eYp&aKtYSMn%~eR< z7~VEDnQLh|G2(3L%6nNU9=nBi?rzyOd%@d1!PgFZ7}`otIri(`>-Gyz@-joYjy13A z3R4cQSnI`{zHG1P{18L8ubt8A^Ck+evTKn3IBoBwk6WD1%~J5T-C%P%EtR3pcX_|P z+nfz|J{?RDk2Jrk7-FwHbIFrlSU3K%)w7U0=iaW%iB~dO$&*sxH%<Qf)tlQ(wyi#5 zSYmqR<R<02ePMbtk1dR|?eO?@LDJ>CU%u|dJa!*%nKEH9*`K1j^}TpjU7Gs&L091F z^jy_USHV4bws-CsPmcS)=9lNHudC+GpRx+sqbEhuF29fVe)yVAH2VFH@@<taxr#+{ zXP+I3TpYW?exgEJy4dBeM8EFTr017>3~rlVGPRs?W`4w_R`<0ZURK<i=zHqg<Xp+h zb#I^atG?{YS=u>m^Sa(<R~a+A{<($qr{P1OzUh9QzJgcob6YX0vqZ7UT<Oc2H0^Tu z3a;yCmR?wxQ(flRB3!nS&%63or>2RTssHwFTW`HY<Bw_F$J3WJ&YiVx-NC0*-hH`z z;Gka1my|~jram{T$QPJy6>)Up30Uzo>)f2Kg+Hw|e4fr<?CZWaYvSauZ&W@fp0qg? zI;X60Zr@VvRcECXs_xa<?p?~zy)Cup_U12g6IYp*{gZ2V<lLzD&GP@>@9}fj1l^I; ze^u$adCta}r}^#97S0Sl9vdAcYLcQIzy>XuGWCjs7M`h?6KArqMzAfwcy8+!+kfBh z*Z(`R(YxS`#Tnjx3$I-_eiPl(ckAlS$okGlUzsP)v&&A9zpH;HP34}f&7^&v`}S~G z1cq|(rNZjtXGZG(L$XuY(#5SZ%`TN!R+>5J-iWQpQ+n2vz1tyX)<d-nHKA3H^FKU& z_W0zF9S2$LSC!ZM9@+P_S}|(ob&rczrpvD>i~YOGx#C5y46I6eJ!A6Wj#<H1!)~~} z3}pY%e|mQO#XWVaA8GAidMP3QaE0STjpx_qn7e3g|C6;RZuU!~85M~)bqa*1aEIRx zY<`k1`zJ^>dbg4jU)ZJnzaq*HbKX7gB6Q-r>9q$;?UpCEWu2PyP5FZ3Gn0?JXB}gk z&4eW%*gT3^md$&;W?s~7>q65xjNi-C{3dGpt&Xpol=FPG+6M_9tA0&Mmv^<Zeur<Z zoV%&@Y@wRZn*%|*w_Zx0-gBhPhH2V+-pyCcURY-?ymx8!tbOH|=Buqes{NZ4S`E#5 z_jm64I1?S?ypyj#On#F2iDUM*LtnXqryel;ReOs~w|vRDrTR__GBzI+*=}+n^V!tH z{lb;^e<c}4ZwvJ@e({wvw!%cbCOxt*Mqc(*4C@E)oOfURo*kL?(&hNnjBjbP^-}y| z-v{14_2kh8Sqp8JbqRi##bd5LwK(IcdoJQh$8)j#rS@kZ-E_@PxZ_#5{#N-G$Gb@` z{l_0$^i8~WB8L4~TFdgfSXM)GpUFQq-rw}lC06RQdT3|dA?wb`Dc=f}W=(v1%+k(Y z{A`411w7*`JqyV>dE|u7yH2-7S}kgKT15}*q<U9wShVgQXGdncqtp?XUyL(19f*mz z!}HlBXY;Gft#xyRmOoo~u)-x_+3KVVCM5;y=2!`99?HD>cIrmHHZ`l1P25xFoAh(5 z*p|IpG&40|ev|nQ23YzPD_%8e($<_9C;6=#eyu7=JG5se;|kTP(3CwLC)G<Vj{W3+ zmag+a?))CBg0f$q%-FY_JavLA_|>Kh>w;!#<~yAfJvArxa`LWyv#tf6ObyKLk-1p5 zv-8Coxz}8?!@YT}1^><2>2Ne-)uf-S-T`0ar@)%+Q3vPDJO8}?|KD)-_4BxY{QQ}@ zaOQ(Qy*nnp7nvRAXup;>{pYISRjZt47Dr}$Sk`{avO-*3lK<HUrI_o#ibbbvnBn{M z%IitjrgmO0dA6q2>W@O(i&Y<z{XEaUnfCs3|M~chYRukND%-i07-}c%S}p#7yJ6$2 z{QVA}VZ-`SN9Md(z|ZzFt3d1Uuh7n%YhBZYmtW;n34PJ1=e^c&Ro$~1=HTu=<}W*H zE>`sI?EDa-$u4>CT<SvCFQuuE_O7#hBRzkYRo~>0^O~)4H==%WMK3K*N#vaVN}t#2 zRoJUtli>BCU~y2gL8@=M<6f?&<yR)NvT|PTb`#wgY2<TEMRSox_{vj(^DG|}-_269 z(C877e7f-366^00=9cQ4UpGi>6A6{|dzBr%_C)Za^{J)P_GE=Wn_U%nH99KcsQk3! zLK}r9Se7>47IE8kXo3iD`7ej_|82MggW;ike9nsE^`CBvs!f~L<nTUB%6@HL*@o3W zPbcWk?NPe2Zr=Iy(*5ZR@6F^~H}BNW-8&Q}i&{JmEetcAF-1D{{tJh)uNgDsq&#E{ zRQp^`J$Ek&dojzPBAiE4?SJCcg5b@MS7}Gj`ZkZ1c~+8BU4re6e=vJz9i6k}<Avhe zR;82p%3`nFF@JI4<w41>I|XlN^aW1d?jznlHz!QS_{I}?`Qz7Y7NzpV95tM_{H@c0 z^u9SsQl|Uwbtj2m%>3CP(UEAkZKl`un3f~&Hhs8~rN4KBk;`4LYa13P@vHqRI{+Is z-7?E^<@J+o0xMOoPOpwm+xziPs?;*$MXtP)#8&&pEGoIq8mnqmHSOomg!#Wdwa<sG z1#mgC!T(sqUHw?GZ%ZF9tP0o=&1G)l891kWW!&B^$Bf@kw=4Y9`82dj@X*6GcF<9X z%NE651<h7U>mDVD&Uohc=#ToN=O1p|<9w!n*-b<DA<u2mvvW>5Mb*mxDbwELyU|2U z>P9m+Us3*}<X@B5uU~)p@+F^wbKxfb2Wk)IZRKpsG!JNqv%h?(OnLdqHE|PcpFWH1 z`oC=_uLj?=js<aLhVCB>o553ujh4Lz%bzXi%rY=_`I+S=__1}TPv_k_8Mhye?QE9c z=9}E~+|3GJd9Xq?+a$8WYSDx5eka>j9Ze}p)#<(9!Za^e_0+7a7A`I?U8}vR*@xsd zrW&6W=07=Q&6N7w`<hO>FJ<26%zF~oJY8Ggf5qQ8rPZ~Y7~xgYv6+)k&97+>E$_Yc zH|~w2z}d{C=l{RIie6=)*I0N}_KEnJpLZ)mc7J+fv!SoH*6m5SgIT_dZTr;j%X4O{ zUEd?A_KJCJ^j1H?jqgssKX*FO`s>D3clobvDmln{)kfz{on9Y{$+adOuL@)74Jz-e zY-g;5ceYI?T0Z^4ky2~R%_G?Axi#51T`^3lEH>-rF4I>ntHoD^M^u|Cty2#A@MN>j z^B?;%bpKv9*S9ubz;UCf+>g&xsrsT##|FN4p**&=+}7<{XLiZBUM@X(S4rfqm-j=} zfAE3eYlh2RA|}mzFzafu&lbtr%S${&g=f8fr2Ko<zRyeCLYwYPeAiPGb-~}Lf626) zmX#OQot2&weELGM>5SskRVGn}OYZ4LJdT;9+@Uo)dDov#|BOieT$ipU(>Yc~;muoT z?7S<Y6ScMOQY^gDH6__E_{_?@rJpZMdwKJOqkL@b53wh`4*yw#=4@Ix<NE@+A4iUu z@am-3iY)HgtF5+@ccJgb_a08+=jQk4A9z)*yHxw?*V5AFQ=-A{g66-ypZRU>U#wKM z#6kGXHMw%N!!8vQcj<gA7OF1^5`wqBN)4AEd_A$$a_c*-rZlB}OD(7PzDn0S+x0bX zuNQyH^MfzzZ|vM=%&lXgWGA$tx_9!TZzYHPYg2kM#dCFLMLmBW-<HFaDiinh?W#PF zIcLqT@AQsa;yL3om%^9iOm5eW%Wc^rvmYZyFj$Mdro3NiF@tq^l~3e8`I54efo2ou zyb8)Q&GGvrbFI=reRV{fiHF703%hn$g*)+Bu~$CT2!2%^`tjG6_U%*7?oJB0o_a>= zz4FUxIx9T#Yo^_q8tYi-xOLs+zsUuGu;!AI`J?M+BIQ>kbr+w$U{bKzbx-8=rB44N z<rJQ8+I_}tS>tQ_H8LBvPQ0mlGWbEqu_GRfmlmH}9W`bC?o`=jYc9pdCc0-%wwmm6 zZg<Hv6~B`a8?+}*ex@{4(U*DJUZz#yGBe+6D^6dINRV?aS1KD{ej2$oaRT3|gmrD6 zJ}XajTCGSjf5@+;a76Zd!rrLbj#B4P2j}A#r-X$od=0#I<E~@W3;D~&{S)OvbgX@5 zPU^^!NKsn!Ci(TGXH~3jHU}Q4N1u+k&G#ZAX8-DDBcC+gi84DMACWN?EA6k5R)-B* zZfUYKJ)5jz88u(c_DYy7XX)8BFKahEFT9}WvaRe;#f;yn9dG|k^$DG4pV)qPU)kZH zR~CoTb=)1(udhxmezP-#L!<q4P|K5s8IjlJ9ZNeocZ<B5n|NYo%JQr!zct&|DYH(K zDeReJ=KQDG2-a-Wo)KL9B5lu%W1lia{;l$~h;-9ky-K<GxS4w4?7gf9BNIXod7Z0B ze_Z;sukVWA+QWv$(ponIP3Imv%p|;7fb&P%R&JF)2ZA1lSo7aF)|sPvb#)1^QqHL> zC$BR?N7J@+Sh_m+<gc8w$8Xov6sa34=WRQa{O(;r-HYe4yBE#%(h51rvuk0>ogh*3 zU5iSW94t=h=3S-|f6JTCdtH4*>FvL%ku1+HxwB-3X%-*gE7)kX+m}z+Mz2G?p}*rj ztiG2@_v_pq`P*aav}MQ7emZegDkCdba=El#g}86biwa{+fu~DOt`!d2X7P$q?>E=A zV;dKC>TB$nz*Z^rdb3GEYn3Ul&v~wly29eXWl^WLdHnL8Wh<@v`j2Asxz6?HOr0wb z1Noh2GOw9!*%v5knG$`{DtPt9UEI@H<=?q5PiXI)_|0vm;$p+ueitS)zKq&sv1yO* z?7-W6ulB82t5xEB@x|u)NHhOwTiMoyhPdC4G(Hlx)Y0nU-RO-4uwjF@iGF(%J+EHh z_H3;e^NRAQi#*<~W~Ui1cbeN@SZ8qV#LSg3)1IBW^Z9CP@|>GGSGLd3Wj8T+tKwQ- zXK48;&GxX!>UXhklkYUZvd*$QO`+-{_SVxgmPstW*=7BHvv{tH*TUw#v3#tb#BGYs zhHm`4|NlShzQa*7XE#f{_7nE+y>+HD&2N3Ro}ccm-8GSED{Yqio!#}pE8$kp*U9%J z?v^8J<qk_#frT<XS*a#BYdv$bw;knr*(Z~~&->2Ys!4K^r*3<j&duYAoV7RpVO5LV zibt&1W?7g$ey-EJ>6!F_BfPbK0%zU(Odr*2{C@?D##@Ky$Z%ar(V6BjF@EYAG52_( z$q_5-oJ4nN&-%4Ff9>NF(p}wdHkD7#PSo6d^xDT=%=30%+rKjU<gO)uAH0`{iGhuX z2)<=|zGZbK*Rzo9z@2JhSF)pH)<61ur2X{+o^GXYdTS;h3sc{@Y3fc+<syOHMNdv| z{BX<mRGZTE7sZOMo_9WR$t*6Le`m?Fha7rJuyz64hE&B359GsS4nIq9c~Ep+a2xZp zrhDs8_B9E6D;-!@b3HL>*3vUCFQzp~?~|$aljdPH4Ep~_q<B}#^%YS8zZsWKkxF;% zdTbKC_DQ$N(-&F$VL5O$@3C1@iAyK0@!4=|uAiy8?uqQy+*12*WlOAQTX`(1IpA{r z$fV?H3zzEknM$;5Wx03o<O*KKiFX!G=3FK-Rky=5Vfo56dygN^`B&zB-20d9|AiLJ zKW0rZu`7Dev0fSK{9y57sgTe#>vQ@6lV|zp@QD^>XgeCn#-G2`QujMWkJ~!C*!1+L z6|dAnKPOeUycF-5v(SGz`(tS@vuQyI;mi|Oom;Av7vsdat#+=BZeXYRZLimpE>HBg zh9$Ib2I@cm#pDDR2l`xF_^bEVZKq?CJ=1-Kt4+d=dLJ}9zP4les^~Vq@U8P&-yHDx zuy^P8caN`|%t|~EekjIL!0qYe>T5?NKiJ4xtWs!`beqeV?rSG`=h@D`rSP1w^P`1b zhx*|ZpH**jM7TDuJ8AWxCv|g1QvNTkulFpzc1<i%zRi7YfyB&dlb`qZzh9peB9*h@ zgJ%5kJIi_;OIY%2`At<UlhbF<FZ}W0%au*6Nw1XVtX&*d^Zhk1+r$_(c(uKS<ACMO zfNq8rGwn_N!hfFSIGCX9v9i5$%XjwHLyzSmLu)qN@NN;`D4f;yT;;^%8J)bjw)Gjh z?_C<?3g2AQT;6s4X`{o%CugtNtUj|lx*@IfSb1yp#NyX;ST?U(vCfL|dB?F|om1sI zbGE~~5d6iPoF?8XRlU5|DE#=R=~tZQ<fq(mc(?df-;34PbzOvRoNM{KY;~Y3Z`N*x zuX8dlXeJ-LG;2f0B-fe<&Dpt5jk1f6m@aTpn6mU=6z{XWllHB$*UWQ`-K=bM$>nCX z*4*>(=0UHqy8Pwn_tWi{Ke}$Buu|+&X@?qr`s?mPi?^JgI$cFRUO?tYs((ppL|S<5 zmx-ZC($jv;-1MO5lGbjWbs00`mD~;s#AdZsUA0-~a`lVisbjZG>(Z<;b3Q4Fet9w> z_2ru?KZotgMXa!totYDUX!4D@KT_rftX61SYL?17t$5{Ck*hi@lhYg-dz7LcDKFx; zdo*R~$D_JV>Bl$u#yigC@ty3SZ$07Ed(P&>(rH;dlk{9;4gX)$IGdJ{COdh~)5F5e z@ex<&x;k}PzudN3VM*n#Bkba^M6x!`@1?G0^{+K&CPx`vwZ1=_@7Wr^HM17QU%a2g zB7J^^@r7fvetY@Ydc?UM2}yZ=kjue%lEBu0{KBu7FYndQIup0B#8msS_CwcPfoU}h zUjO=g(=OG4;poTJ_f<Z@QhJ!d@;N2E-b+@tZ#cJ|f1X9~=7qcamwjn^<Gr+Ib3u>j zhU|han}cx^j@$jYb&mP#(p6>`mS0odG0Xdi*L@4Y3qI%HpSpEfQ2TB@-v?bpqU*5y zdT24%@wFCj7yS45WRz&O=8M*j*;gF(`ouB}oK~22ToS6O?dmivb$#Nu<VGsD>tBtj zTUK!9uU0lHJlnZoo8DvXR2$hWlcG%z-!$FPIJ{>ad})Zzvnx-VbZ5Ml@&A2YAe?Rc zJ>|#3&c>^n`+jU+uxPRJS=GOu(-V8DElay(f~TL840=C5I8bl@89zHs_cEJ8@in^B zPnyIiv96mJVD9Ln@7SfWC;G{8sp9O5;Xh}>hc&F8T`^T@Y?4sh_h9>mr(y@QPHtJn z&>gr!{qVf_$>(OtH*-Cnw)t!O{NwYz^=7YNn)PMQj&&=grW_11_nyx&HNPWb)0Sgj z%GSNzF7$lrlvnQg$HJQ=>gAUfF4_P0s#VDA80)i7_zhr78qcf@xAM0wm?BZ0672F} zd$8-doVKSW%@R%5&auzcog5i8(M#s1hWic8?<XDqzn>GZ`B`(^dec;^HB#IBP1h`K zdh_atbmz{eeebNc%5O2hw$3rO_R(Ru@wR798uF{DrLbO)WIS*@@!-};u63$w802*B zryb(mwCi->sR;K8v%cw@U(sn(xXpU*=)?>5FBXTLub3#<?$tVV$`?1jBR*f$_wt-l zT+yczeO*;{X?%$cY&_<ahp^?=!;VFD>v!zZ+1Y->=JVRE89sj|KT2RX4vbH!6_-tR zda88u|MP7JUVW6>n!6#Tnr*Fs!*o}*a%Ho}-xuj=DQ^}iuu(a=?(n)NdDFMD`|Ivn z7xT;Z>lT$mx37v?JhJ0}TD7uVJM!GDqbi)wt{iyJ@~p%8#Lq`b-W*1{Mau*HH+6i@ z&wTGBxR>edJ3mfsW!EmD-RD2KzBw{~p`@1ky*&wAFHYUcy+YcZZ&|N>m8E=JZQ3G7 z7uz5WC!ORa$JS*y-&9ick(CqIe=G5QyV%k%cRNH_IH&$?g7#%qXH3?zTcV}(>s9bh z4eQ!DF&B?bU2*j5Rx#gLc{QmN->Sq*F|jY#iAr9(cYdPw<MLz=`vWHSsXR%Wvu712 zAA5YdWSU=LF4Kh#hufdc5I<f~#`m6EYO|@IgWUpnsVP{z>f!Qxi{Bhxel+NkM^)|o z<`pugD;LaPxRxPo+2r0X?OEr9S@lFeo)CV;qT6GCp(7x8iARj+-W0!{S9#(4Uv-#Y zo4WCi&RfwFSNYgJFDp!c_gZkp=FcjRmdnhRoVqo}r&i0*>iYBBv87vt3+E-zS;cLo zqXL^EHaRzE#e>T;_bdqwUj8_Z`TW`mk5d}D49{&lvW2CVMQ8c+6@PleUe2`(zM3$F z>p|#^COy8>{bucrYfk)7yD_o#`swn!xmH3Eb0>v0>VMsy<JQZn-CTYv#x_bLt#wZe z(=?YqA`@%s>P~&xz_mDaXO_XjclUSviY{GQEZJ^xYx0Hrji1=>R>R8K;+dBv7uws~ zUtO#nX)QWONa`a`bC+Z1&skgMZkE_u<&!hZO>O4Su>Tj_4_wo!+JE5U{1dMmt}k1= zYGrv_=8Ymlb3M<%Jp%i*AFpQO6O~-Oz*0gi^<|TlQKXfyRha)bK4ZHJ+V|A-?H+|* z;+^WaLV<C0Xf?das+;8Z++M3M@rJAJnORd8lx}!`=T_O*g;!YSU9Ai-@m;KxcFENv zL8{ZJe^=7G9OI5v*W+7H&DePI;U@1~HH!e9@E0%F><kT8cs%P#mvHgD!s_Vdlk;qu zHa8=!JD)UtRoQI*UoP!`PWT!sndU9+U8`lgD@H3zGo`8a;wb@LlLvP^41A?8u6dQ! zlzmL`^~(qge>R2q+N>&%G`Yp*n`iIP68*jEpi}AQS6+I)H_x#e*2yi&m^`(T9chh& zi|O3Z!o|-ju75ldl;3AONiFA=S@%94v&nmp3#rO`9{=^0_20wNd{M_G-uG8+SzMX7 zGh1hoP@(487a6(onKLilW`Fu-_oa0_7Yy`#1$!Q^P|evIw5^!=ltp$If2`J~H{#HY znaNrlRM<1s!27|=Qn_m<AF@h6xH)%T<4z%l{X6rIBngYnJJ2z)ciFABUxDYJPyXt^ z;gZi*qlc>mcfOus^VxWd#Kg5dyZ)Vxz09MrO7+C#FIU&8eG=8NlgoJvtD@2j)mL|~ zZD9}g>690gWw~!8?EdPL>%}uC^x|YywlyYS<vg9tcvUv{fbjJFI(sH*{M)=O=z7J$ z-#Xoq$Tbq{`NZjN0oejaN<xn8)98Dt${1a^OvjLMan|G9|D7jOb1r!sK5KfrWv0ug z-6y}z-dz#+=0#HH_alaV38&08;0wT*yu$1*NGmVDa)vjkPxD{++mqjO9kN=_mkKr? zldS(0>ueM8TE5ug?CM!T_w-)h+<hlG>8RGE;A)OFpU#SQJ=Y40*d8y#{ZV@I)!LE` z_OPD9tk=BRvnFebpV<FulJULbzvqq~nQtUIA>{3b$}84#qFxEBVh!e-8>Jr$(oR)B z<nwW1&HL$Fc+&D-<bIp!HZR=9^xVFtmlgpn;)1Wecyt#Yzmu9XAvd2VXur4UzU^Y4 z7pSp5gN#0!%(e7f`uM8GhMAFfrmbFG8nWhA&MtA;@;%x=+>A|M_ZTf@tvvTUhP(c0 zYRTGFp(menyUcCBbvD}X%)0zTn@koI_8nCg&*xmGftXWbElzT>UXyIU>GU+K2_?TH zg1M(;8U3v7$T{s3a=c8U+vbRmO7`s3uVVko7MXsw-_%&b|0gvo%hy~w#_Ilg13~@Q zOPaF6c*WM1nQrQ7e|bVUz5cY?LxZZHyzrKuZ@S;|)v1RXLJW4j40`(aTIct3)jD&} z%z51PM>P28luwg<?oV1Nw(<7MuV%iUtsg~JUOp>cKFMh3X_JF9yBHVW%<_$!+*!I; zJwoW#?-(WLkUtxbtePb0Y`pi>`)l(Jcy}$E)*@<H{B`}Sjz_P2LS}wFbgB-vNKMUX z`RCmD`1q}}=JCDy<jT>!S?3Y|l}#tN{9E#c?aES*rFvG!dn4D+2|Rx<VP#2Q#Gwkl z^AiI%%<$i6dS;b$rQQ7a_;?eEla1x729;}X1iw|9cW2_0b1QQ;NH3RH`n-FUUGPON z+nMimzs*>nmz=jK;(2=z-(k(gTliFG%+t-DZF@gpX)U}mFFmu;O|8o0m|Fj|##e@w z=bq*-Vma{EYT>lY&XF>!nD2UJo4jvZb<ozfO-pl<O3Nw%Lk(y3yT3eAf0;h_@Hmtf z!SiWtIA36(uz>K@^VP}mw`Q(L`MQO@s<~9)o_VJYtV#0nOy{|~Hvji0NwH<5EW9V8 z%)d<ZvC6?qcar8EocZgK4WCv(h_9cYS#NZOFwfaj#nJMs*YzxwTj^J@I&sabsL;(5 zlY@?J?r+{_^)IdS%oF8rhuKYgURA$zh%f#Bjq5@``(lneTdeZu)yMlBTO+`_-q^7C zf;{qivX+lO&mDiP*nF9@w#Fg(?8P~ogoQ6(x#}`kbnV~u!B@rB+%4%$3cmj1(x<;B z(+rP2Shm{o!RP<}=VLrsZLK5{ckZn>y%eID{^iuO&UGt}pWE?Tbd{=7tlg3O@AuYU z{gQv?_&i0ow93%*>J6nVu-UnzbN=M7acFOP@apN>hUX<YYafednFT(YVbSsNZM^H@ zqthzRMg9&lc%oijs}k;F*id4pV|KKkkF9j)pT$4bS_>NTZ>g@*OnH_5ZH3d4jSJ?K z2G2by8KxBQ36{sBj?bCZ9UT8PW47lf6JhUt&J%uazO(5>){;5)nj5`prt(Fu_@(8W z`&=oqeQ~ha^dHBJ%|wIL3-Xpeu$#5W=vFJAYOGFU)6pH(TZ|5F*=`d1SpLhI*r_Vh z>@D?o1TFqyD(@S>56$IMlKrmLuAIGbUX3^ZV_|joH66CE?;Tt^E!W`1{nusHzTbP? z__DpYOZy&h9-qJBETf}M%2$mOkL$d)t(J>8lF%ezxnuT|N2jAVBu%Jlj$Lx4$mr_F zup|L?laDfv`5zmqJcJkxFTI)R4j+ydGgN>5X2!frrzV-+stni?_J7Xjt$aRD&wV|A zFmrR<<@sNlVoU!<MyKjo%03DA?bJMNyxO+E?%D+3o{d&<r@v>e>?ygLUO27(Qts4@ zh)gM;!c?=XrkYWg*WEG~_@Y%Jctt%Z_SDb$LDOt6oxE}8wYli>HU0^2*Ik{zA&X@> zv$Nh0!O8?!`yumL$Ug2c)9-@Xis`omeqXh|nq+iM+kj)4@-D|!N2eLqD%^kW;vzFc zZ@P2WvF?XD+DT^4++UTR-#VD(nw=p3SILv%iqzE;b652&vRpR7aj%!c?uKRl-)iQB zM`_Jn!$0Mb#DAYV{H^fLg3_}kYD`xbYnxikjdK-?)%Ch~)PKe9N!>g5tek&i^97%G zRWe17p6^-PGxurDpXCoSTFo!|{LPA5Aug{d)bm1cYmij4jJfC+#m>{4XSKdmPCmV9 z%M<5VnV0@L)xjTkvFNf_+rYfGdB$YZT$8?lOuP4cR;>zMoc8t4(^qHh!~#Y3uh^iu z<F3k{u!)a$?EbvBE4bl?XwU9D3$DBidVD3arEZ?|hNup`*@@PHUtg8{H_AW%W!fLp z`PTiBsyvf2H|O<O<oA4ea;m_g*~s^uS-65mR~f7qs+;5|Xn)~|n26KG!c5;CVJ4z0 z7U=BgdcGth;B)m=(b+~S-FhB2!f$@`K8p}N)qQ1Zr~d)pjHqMpSFhu-J+{{0ei83O zo$k_%1x+({7H-&nIB=PttVuA_U7?TKDM_kl{LaNSCaqZbY?B;3K;@o^d<-Z$c$4c2 zi-E3zS9ffr!{&MGH~z_+bN<Nos~*#$);`UWT06h0oMH7;i;{vfG1sO3=%(J<^!*yY zz}NMUe2&dZ7kb%tQ(*a(hgxegj3PP@9-3L-p#0M~)jhU<2S2=4Ih*PiYwC7R`W*9) zQ?nv&gs~s<Je((Y!;|TO$kElEm(o6Moq0uuC*;iSl2|w6o|Qd?u?Bp8d%qg)UDH~y zsqG`rim9L9ePZ71_Two}n=bcLW@VwboAyn6BvC&<YAS;wqRG%?=~}Y<k^DKScdJ%j z_<GV(lKUXb&%>954?J+X`ak8Z6i?Jwu8H1@C$(L)nLTfx^%cj8KGthO)wil&_ZSzm zyim5x_f{<Xu(1DxOXTSYcKuax+q<6_XD|Hc!fLoGDN=Y|6>?o1<b3GCoodVFvDaQj zHnybJgw{V=)6klBMQNdJ!?8mLj|S}8^k7Y}i2mCnv(#4^t!8=qvdF?$RdD8;l!qs~ zT;60xO-_~6))wEZvn-0KIUr^GCMl)VCELoZvPCv*db8J-w|5P^E6(;z#N;uDdZMt| zl2;2-|Cks>Zr0qj;Qv-eolTN+=bkt)XH98xOwzjlTU@x5R$geSQ@gw<<;cnF)}=?L zttqL#r6r`k^YMAtL&0AaT(@z0zqY!2B2pmI>bBEmzpwBz^VFQG(8^tIt=D%i$Yp;c zaC6q2C|#Gi?`9t6UHvjZuXgn>$;jB_X-};juKn!V(XP4CsO{2y^%uXD)Pf`b_L#=D ztPRrN@xJQFLH<lFyB`Z(>|`UCsvj3#DIHm=X~fq1W5S8se6U(?>6uK^^a(Q)R%z!l z#%!ID^K0L}lg}+u-+zgmKX-YLg=KRHdv3+GhfYddVHec?`Wy-TVUf0BL(x0VhNz^# zJDg6X?;{-D|89BZua_wg--0mBXnCY$K>hkq7M;hz8>_!ON-cZ5^3+T13#Eoa7b2V; zx-%XZoXM<m+P+0)jhYk>Ywi|-MG|*gRqtp|U@QCBsM534y{c4q{`rcPRkPyXI2T;g zHu!$UZpLd{SnJqKMPYf%(i6prmmfW`RIZKQmG@rD#JIxnpM}V_wq}z9hnfW6_Akxl z@{>>fYCQdkcyZqe@d7Vny_G6T-2a#I{Rs6gf#vkvf*sm+r&isy6O8`*Hqt}SGw_hp zEG=v6@JowiGEZ-Jx%8axpls$O**!eo=jL%utgoxPcCNXU{rl!`9Fv!FY>HexH~62Z zHH*gmZljr9&&;Mja)fVTdwJeaXnRxDjDHVTZhrP=&MxnUjVxO#=XBpu^SaWyc`X~q z%}3%broj^mk3==~9IEnP@;&Tr&7H?Ti+?96Ifg!;;BoNFtDvlnck2WW`{bQugm-gf zBif%jS2@35TQQM!!!EhiHTA_3)gQX6(oft^KOD5l#P8+frA5m3u3nD`Fg|sS*{kB> z@0>1JpZg_W=W18K&5`W2?8=cxxP%%DY<T$N{_8wE70Fh7wNGMy+k+{yTNVaIe!J(f zR{&mYti63JbHnUpwJnohpSfpPn5$`Q5qSSl<+aEBhcu_Xa%JAMV^zk=3np>$AK8T2 zdrL1aU*+Wa)P9*je~Y0{j>gNcA=CW2ZfSVAKRf%%+B4>r;U^DRTz+%7@uU3$V}Xgz zRr7F-&Bc*ILig-kJx_~!E_InDE^y+@6xdpT>5~HgiU0g=w0Bp{hf2#8+i&?C-IsOq z<_}k|tsmzq?*A^8@^AJ+Nh^jQha{?C(fhV=S@n)6Q~t6vUEh$b(!A(7TUI1gNy<ig zu%|5*-7}}Vha>WBNb>Ta^i7PeT@$CRRIWIFaONsU(aI@jFV{Z{U2@9C_IlY7v*pJl ze?Es7)>+TCC>mW1aABUbG_=-gW|Dlt`sxe6zl(F{Uz@hv|Ln|$vP!eOM~@e*TC4RY z?dzxDuFsEFPb@gs%o!URbFb+~(VBn@Cw&eUSRvNh9G`O~BPwa>>s6+g%rD2xHT~P{ z7ZsYTrvB@~?yc+Jwx_?X%Teht-hKA_u4xCC*iMbo7JFZs@vYZLFZO;w>zWrub8Fe2 z?k-y$wNaeiN_s*-I4jfbc|2P-`f-PTShH<P7^k-U5$pcY+8zINWr}0r>u8f~n-A}~ zl5p}&vuo;3FQ3y5Zl>9(-!3dqU_00K=+z?+nZv*2BabY~pC+89awl-<+BJt5*aX?c zRW8X!@)(|!Dqng>qg5wl^2?HK={Acd=PA$K{IOT9u`bx?@ckcqwS)DanXv6rK37s9 z*qo~IaLMJ;E5f3oXH731d9{17vXC#Vw{dLd<r7NLdDA%^PR~6ZlvJ0wz__SJy-Ysd zE%et+-VK`>y0QYb#LB}qg?lBp-aH{$|HffK&HNS06UEjRSp46gwQ%F3b30WGf@};n zg%w$EUhX4m`qFFOq;0GIdMpodHVYOCj5eKJcgY;F;D^6>*3<5rfs0Eti=H(%C#$fe zTt0j1Z`{ONnx~g~obKUB-)tFwF69TW<-Zm^@vUN46HlGUy18f9+GqE^b}WnP6E%o> z;S%B9I8C?0*00d1Y-af7qBF6Purl=?&x-mBXQnkxQmQ)iLOK7ZrO?xWH`$`eQ(03# z#d5!x;1k*KG<zBQ{ytBAE6+O|KH=Y!Ydj?vX9VR<yLr}g!>V7mo>sRj9IZU-`28H~ z^Ie*k-|pqv9sOG)?`^4IhIao{wr}}6Pj8hg{;mj}8JaB0SG?MNuJZ4CvB^!Pzs@B_ z%0`|tn^I!Rx%0Hp1!u2r*ONkq>_-grA3AecKE8Iy<ez3r_~M2v<4#}ot<oV%Z)2L7 zH)}0OTsr?#O!cnWx#xD|K02|hIU=e0(Nja&`mW41&u_DSvRVMI1Qm+CuBdF3vVInn z;dSYIXY8iyUy{4SqHX==XsFF#of4_LXX=r+RdLs9N{{Qz-Zy>Q;&l&%rg;bYuc+-4 z|6jJM+i`#P>^|odc2Bm|=eEtR-umXx+;7U(b!vO_;8`r_naL!!<Z~_4{(C1ZbbEKC zAadHxq~_!AmFMdCuUO8K`Tu6%>VW>=H(wo9U*l;$^|IS^g=HODhd-)LdVc!Ti-d{E zo<E`^TP~PxtDLjwO1{0e!pixQ+b>-*m6V1J;hfqPIi=H-@x-c?L8q=?pMI<6-EWu3 zt+MQ|-xP-Qp3)Q9&2-!&?n;j5?5`VE&Arg(xb=|!Lxb71eUsJ%UAFydymrg>UEi-Z zW`wCH80W8LT6ttvzW~F_%+$57=5g^>KKc9e=gB`kqEjDzc?_@DkIz{%tK{bl3DZUA zT%2y-Gu}7x`RcNrs~IO%8ms48Zn}BXUT9xm=t9*#wU=$FcO0IbSnltWJSSkP_UWUU z@-JAXuQ1bCQIXNLdZO*}YwtD$-1XZk$j-7lm;K!44GxFkbM><<e<}vcm2O<68Togu z)E=Ih!q59o-c31}I_>V9-Dj2eGR4lwEZC*nn*F6`)0w=F#V0;!IwU-OrkoZ1x=dL2 zinJy3%i86)<gBmHUvgRgOJ|6^@@j^;yW9|Ku0cy2vh!ZtFg?|MMdz7^dBybfEqXz= zlU{oTJ(KC?QeaCCN;+-LKXIYwa*bTQz!3ix%50k(rRS`f=X&z$%!JAYzvENyJlW9X zI)^LcT#-ZR@t;2)!o%p)9Hp7|H$Sgf^xrmle@%>@_2XFrWiq_0)vqWQ-;|M=95!K* zt>oFfhI<|BmKn^Icp~jHLB6asFY12LsTjkVotk>rg<?{}tLGPWKVx3|YVJO(PEPm= zscVMnr<+e3?M|9wX7$Wg>Bi(6KXh^~NA2CYyirV3%l5JX+uVpp>sP(oW@UdwXyLcc z2{E~0mmauevp;z&IlrdvB4<X;%Qcs*c4T-RyX<>J#U%en&~Arw_1C-8bDgI}Tfl0x zX-4YVC2eaqF5YymnenP;faNuz%%vq(jB5|RnH1xix8$Y&GKZ_KC;iG+td)BZ^k|h| ziT*Jcv(>9~9<fwi{vdo<a`n~ClQt>;YdMyB%>3P-Ntfo9JV|nS37=t)Ix<JcVx8YK z*_ifw8%$2GizuDA>aC>tvpCMPnld?IXSS7WpE+;xR=Y4y2JMW=&X!eoTUq?23wXZn z4U$-N<QB)8i{_4+A4=yXK3eXX$PspPW!wRH;_0vqoaz4SfBMyszbr48@5-^8zEDR0 zmHwj7-J+AMm#^@<Q^c2ex#{9r*ADmZ3o17x9OOBmbul^rbMl3(*?|wQyYM?->``TV z&F=UtS^v4~S)Z~c5)-4meHp?_1GIhQVO_fJ8Nz2DO?jW*_jrj$-9e!Ulcg+fb9@v{ zTi1x4dK7;9Pv_BhMQ11R<&-We+RC^p)^mFIKQG%4dyB<3zt&u_nYCLZI9W+q{MTfY zId6;Hb9T(LvTP82BWGj)TZiYH==b#f%5|%f?#y0&dnd=<kFzB$xdU4>D#W%2oS&J# zNy%DUeNm6ay)=DR>kZQ$=g(XdxUuxo=~<4|(tVp}#!v0&-6?f*kz)APMKfKOJ#sl< zyP`u#eXHm%cq%<I=hXLNt8cnSjyu@TuDR@=wQlqOw|jY4eD}Hg^MS+Kq!f#`HaW4c z-(x<faW7db@#<pZ;q&EQw^tV}u8x^@CfB$MKK8yg+0S*g`F>81xjS;N`md1QmUigr zifL7nMQ2X4aYw$rs(bawF77K+me0R=w=;Q(=WpxN%kTfwxWD=Bf<qQtPlkBy5BimR zbWMjVtF+O&PiB*3UY)%G3uWyY!57;MbPfr>{BY+?$kO$_X<IdeCl$`Rc(kKE({IsM zhHF{JMdNp!QonjMu>5Sv3h|w{^mJ19-n7~^^~lPMSMjcM0*p;9rhfT$?-mDdoa}}d zUYll=t_X*%bTT<NN271y*Q(Vky$#a}HwYWn%PyNTd2?1qny%KN%`YBtN$phJ{ZeOT zNX-I+b!OjlgBkX#tc%>ZbC=Yt)Q&B-X6d4ved;GH>gicKZ{PZ-N8zjByJrYT3%vB) z&Z;7M&|tpC;%71GwQdVMoL^kx*r>?Fy5Gr6Y=u-v5Zj|?+>>TJPW1I%xU?&)ZhQ7M zFV54RF-~692boQKV9ni3!QxHJHso$jf0a1vMqw+jwfl{|m&+bsFKe$A-?ME&)0J0; z*who>mv1P$8C1h<t~_@t<J=79ZlfJp|Egmaznc&u1gkC{#f7a-zmhZU)f=IC=8xq6 zW|(Z6r&W}sb?Nni%OzzZ@n?j>j!dgRtzvcl+rLYv{LLq?bmVv7zjpOZm5P*?#iNcH zt0m4E%{UQOv~Fj){L$#t=J<y^x_v(HI~lefK6ww;UhS>-7M(Y-(r)I{TV_j?0w+&l zzPTmn-a*6Z4Hq@J?@eV5*}1~%<kl{!l9k!Z=Ev$s79Bfg`mrTGB;a=DRW8?^Q`Z%p zI2aospMCC-?xdVD1K9ZD+5|tJj*PCv9+v$3T|%=%c4cZ_Tq4Ex`*U^KpObfG+aDji zoV9xCgDGb|@TMKfxun|paeeod!;!%ir@wFJuv#2vwqT9NHNHzdk-wv4U!)-&Gje*) zjquGs*@CjIpKJfE%u>$WrXW`0b>il<jS+YJ47T4|w5HAOr&)S~A@@Tq4nG-%2-okI z`Pa(|JYF*4X445tyE7lvrg+R|yYFi7==jse`pbS@%RroAa&(T)<bdNF)Ey#Jq9U^H zzKXY8p<2Oc<mdg9joay}T79Y6^U#&?Wh;GIE=+l!RJA1R(d0)GnZ}(a4@KVJwSITl z>GrCv7c$=JbbI+eR=R7seZq(5!B$00maRysBj}@H^sWV6p(@Ew=0Ezm+KM}G)sA>S z)`|AZ-)&d3p1x~V?#a?;hD&Dc*=6+f_Z}Ouo_mLw-FL-AhB8l{w4G;J#^O4OM>2D+ zZI9C4^YiMaeMcL4;Y}E&XDOjeL<`+sUjMziTwHVE?CNVTligSQc+IuYRu-6DvW+R@ zmtpCL+<%KK725tifBt+qYyH!_Npd%|*n4jGL@8?Rby@Q7jOD^<%>h{vg?lDsd0hQF zZ?&SY_6f#W2d@O)*-)bGcA_(MdA8-Q!;z`5)~Dk$71>2|+8#b%x9p6cq$YFMlLIOL zjMmM3*UdAReMh&P;nwFrMBVmmsj~51xc2KB-M!2wZO%&;WSvjA&gCC-o8y_@{cfYB z-X|?{qhv0*&Jk;!VKQstua`%|CO=0U_HcP-@REX6>-u%3gv}Md-S%;V$eO?XDSE1# z-XAg)(umFsnQEis^f|}yF%$c>PpcZXN^Y2WcEw6}&pB&YL!O^8iCsEpjn4eQC2g0i zHZ8YMD`I<FVe?CO3#am@jj?4<&&-w<l<Dl**j;lgaVHPLUsqVKMV@z5VzpkarSb1- zmTF{@Y|4_7S%;pzYd!I>?g)o!Ob17A-;CM|?JP@`svd_2Kf0r7yXGy^&eYBYLCcQC z-Fq^%ti-)@>l|2S`)Z_~ef>mpESqHNVaLy(mbiDRuh5yDv&`V?p_K|zT|N1ekN@qS zus5sytjzK&=0)e;-Lx#7Rk0!<NGp$h@=aCK`)3Pf`MTF}sJ#f1Ioz=&Vp_p-#|c{N zSC>iHKZ3Ugz8Ne}aM{jva&G?nS(5MGUse+;;#(QMX4{#G=ZlQad3|g1*A&!b|2XX* zAKO>9*P6OZPuaEQWx4Rq+hVquf3mi8q2{@&OOGt4wpqqko!qc3(&8CEqTBeeaMo@2 zvqn)T*LD=Tl}x+2{YY!~5@w&@_wQBZh9&5Ezd3F>sYa|WdttFh?%O*od>_o4N=nY% zEZ2J}ai)LOjObO3>JB|;^p0;|?lSFpWQ+3cZM@ff7@vL>>-(Vx+Y3C4?{fFu(7Jo; z&#?3>Y&$YFS~~q`5X;}5HK9^dGSh;qtFJ%bBX@Pa&L+2A{x?nM=eUHf)8D8!+0pBR z!1^zndV2iBymh)PZf#q}ymsDnoA1o<i5=H7p0cx_`dbF5r)(74ko4L+a%nZ^?J({) zUDuXu`+RhZVo2ngd(WliU#4m<+5A03&3Hz87~?e8hf5f4><kMrb>8Z*HE+H6*%R$X zts<ql2bM)il>Up4kGI<!|0GdtYNCvCI0JNQz@#wVJC%K#-PQ9EU);KWxrD_nP5<Jp z&tmv$alPIAOAVK2Tghd=6i$?GfBSUHM~h_N*@2yv{9#j;ePdDSyP})Pe0si*|C!(F zZ_ef4Oqm+BdU~G2x7&fU-!eHK{eR*SyyjXxGkAlx?!0}IcHf?Fda-q#PHt1@ITc%l zGx~{dJ{iZRGGrat_U+uAkK3EwR<kWj^1m3EdiYPRy8jCOiJZOB*14Wxu8(K*RNp$W zcIup_WGTdgRad!mgFoK0H6OmrnU-jwHA`4G<>jUoD=$3zw#Da!<>e_)8??pJSsj)O zO&44Ig6WRPmo){N-XG`dv`jG4etdru?{N`JKUhWfa-M}-ti$qXJ0m{Vb=&?-7ER2| z+cGWlL5py9nL-|e;cEf8&(c$*f6NXH-Mi?+icK#>5Amj!MK2Ov^&-ddsy3VKbmQ|! zKD`QV+b*Nc17D~jQ8o4Q_dw&86K5A~`?@h{)22<&3!CR_-Y<T#Z=%K9mdzzQh0Kh# zTa0D9KE*1WUAZQp-oxJI*`B{yf3q+4EdJy*`Ki{dg}ORtmnEwo(9No|5sQR%ZZ97R z{j{;8xaxI{=53?q+}duVeUJSjo}Fk`xcVtX`j4mIgH@*!ntX0Mm1dobPFg1YNMiZk z5Uz*6RQ8-SSo`bTRz!PfHS^mT{>6Q63%wQdXD;2nt+(y&`@}1j>s1Y|w*0-S#I)gN z!VJ$1oK;5stKBlX^-k^F`Mt){IBteXRKX^%l$*0V()kcM@8Fy@nfHoQrRKCTNLD}L zw1|FXd$FonX9A1K*KiY0&G|b*)3!G;nAAGW4D`EbB2l%@m$&U~edyn-cbJaks-?g6 zed(!{J!zww;db}h+dp=}Pc2$KGkE>2l*_W#jORD9lpZ^wdh)LA{i80OF9P^VbI<qf zd^9gWe{Ro0wx&{!&bsw1HJh3)8_vi*ZB#Dkm2lxr=kq0BvM+4=&hieairXaQebD~R zr#(kA_$Js-bWS|&`YL$#{ufi)1Fk!I1;=eNT4nQV!3&3!7deJ$Cyav}cV1A9sR|S9 z*l%RC^8m-@Q!Gu53p!iWQsDilcauNGw48|i_vz5au+{r#&1{@gn{E5oJ1ni{%;}D^ zChW^Sa+lBVs?~j`SlDwaLMbE7GmH(^jAAbSq`N=6DC_duU-tWLbl$S~6z%j|s`Rbx z;N(-e3hQU8^~_k8CH*R4!s*%G8QV&47q+yhomm~DvF!di#9-vP1lMWVG2i>8dX5-Q zHTZMx`c95lnQvs3E^l3MuyEV{n+a>KIM0mQyITgKC4uSO&Bza%X3uk%J-R{nZOQWo zTQYn;?nwOI8uM!N>swWRHfb$y!wfSvA2n<Led(d=^>@pZ^S;2E($=w`MPhE~7$3@h zl$Gyn?7es9;%8s2d7CZ8O84B|DqabzQF6Dv+Bscu^#j!<i%l=e%gevNG;RO6v>A_* z3gZ7WG#B>8&waN)zAx?Ff2*c4*t}&4=al!n6*>l+uTEfU-hUzF)yb`?iqqHh%=s+! zyrP-IQ|{^J|9dVZJnO3L+aVq~p<MoWHN?7yrJ`Kls}EHhduHvmu|APj<+`8i!iu0d zT35LH7~{@{{+U?g`uefAgb$18T?5m7GnG#oxNN`lG`q-WyFIK{jpSSylUs3pc0Kcg ziNCHFI_%6%)%o~t-G$4knXzo2xdjVixV{#t!_Sg>yK&l1xeb<;r!-9`&$@W&<chrs zu?LOHk6o9Jul=CN>T&hx#)QT>yy17s4izeAu8Lirdu+N%@cX6NE3cMY9T&8_pWXE= z|FinJZC|A)e~($q1W!`SqPzb;s9NuJPu99?ZT{vy&9x^V9@L(>R6f^n=|qNSF4@aC zjxL)q_rJyYFR4}iebMqSKYTyVR&Mz4$98KCU$q&!%hq<us{A=q+vTle945%w{O{}Y zs|ga0cdw-c?0*XDx7|8CXGL@NtN;V0Q=Tc)q&4rm*KCmU+{viib~i^Rx$Ve4y{5EB zQfEI&&nzy;i*GCDWYO*BvfHf|lg)L!ymmeR>?ML$|1RHhx3se~s;Rr3Vw<K?<T>-z z?5a7NCMR#7y%9E|dF|;0rDaR=^h$s1Y`*(6Uv*aC&M>7Ezwh?1f>uo2k<otToadJ2 zi&rnX?V5c>@Le;{ZLY@HIl)&y6*#23yxn|b7u)+Al@BJ=dp|t1|Ln3KKZ@YfY9*X% z-tAUbfBuqx_dee8Waw9eoMRsExgstf|I?o|`_}#DOE-UUod3SGB=yO*S*HcoOlxX6 z7_sjnqsG6NjjfaCEN)v@^W2QpduzGHxjI?aGBJm>i`#bIeEkbCwEeGe$;8cRU)x_v zD;euuY4H8OxhwnkLH$i(MV^_LO1N~kc^#Rh;8rX1@86<LkCkWcNn_b4QyOsKmQlX^ z!6l4)yBeQt*esMCd1EJg>I=?!r50xln)t5j925D1m|IQti{1VvCvJZ46o<b7Df%at z*O>kMZY3;wR_D~ElYi~*-Oe~VFS~HVQ<*<c@}^HpUw?M<_sjWnf|7Uf9xqwAF5#$a zX6DRuw?yFWY`JGwTK9S-oZ9}rfNg#ItS$e4im&UBnYP&^Yudt93{g*42b<il_B^^k zd&Z94nzjqJPZp?(?P`$h{<gE_>-N2(tEbJobL9HO=p<O4=oGNrRPI&3GWfl5km0G7 z;hwo}pSYe0t&ItPGQ)a@;EJwgPyL%X&Y#cy9Wzn%&q}^KQS3W!IR<2G6+2b`yy(&^ z_0_4&o7PQP8_nyp^s0A;qw{_%r5$UVTH?dheoRZ2lz44ZAhA9*&{t-DyAiB_=`M(# z&i$@7NO{J-yol@xCp@-4cu=&lb5-*usm`e%s~@@9I4s$_ZZ&J7bY(JQpq);4&(mMF zYjxJdtL?~em|Z;QkimQ&pXPmkky5&wg5RyPrWXs2w4b`P`r`~+)(?R}A{Vc98K18> z66C$U$nul5gpcHGXQ#zRvv(W0&asVCUw$ld>&>KhURHLIXB~f78*&u(X_m1;8&OYm zoc^4et$rm|ejdZbk6)&qXLQ>ZT9Ybt)3NkSD{JAJ{aabQYfpZP+__63!v983>Bp@8 zCGRh<na8%XWb+ZDKkRQ;m^~3Q&e%IqFSfIyW|l1rJo6Ww(Ud5BTyFAog~{KPt80%; z(cLXmcv*3U=9Z6oPTKb+^HV2Ocj@(AU2{Q(SFAllkbi!11LuyLE(f$`Wty3r6#vw^ zw#DJbxf|0zaEeV1nQgcqF$X7lX64MJFT3x(`?-nlah2%0>W{m!<eGP$jI+#<KN{t4 z-?($`RGIZV@2n{}>#-)df8nbo-v8x4a!xxN;eFk7M(Q=DRnJmPA4Z)$=Y^=kl!|A~ zyTG;Uf$hi6dB-;%nP<E?hvm4-lAX)mESM7<WNWZjT)xG1UAp@3S$PKO?T)$&zAQie zv-#>H$AU+GF{_M9*YPM%{&?=%1s?e6A1uXLzh1Xoy~}vK<mdM<H|J|PJl*|Nx+<Y; z?%9o1eoG%$NJs_VJ{9_L^{KBR%x7l)a{7PpR-}^Ft7~a{65oUsKZ#YhJg)N|7Evj0 z9kZ39cP8!nv1X(Gms8mVo6J0Fuca?u`gP+ggRK)IE4<^+PE9%67Mojm?Uae*f7LYQ z<wq<cbGcI@Y}sRN&CeM;6FRZgym_wws>iGn*VF^%gumJ6w-gZon#Gf}CT7`8ww$+2 zGmfcj?UluQ5-cZ$?Ul{Gv^)5PnW_Q%%t=w}p8vVy&piEo@gtp{*T?r?RW`kG>Py{R zdt2YHDzB<%<;|4zd9uDrS4A*DM&aq3jC$5T(#WSBt=k|{KP&ck_RGlG^EvhIi*oB; zU*qR9+4J&WCn4qg*-IN$7iezWS*lu=b^i_L+>ZRJ@B=@03h$Kt;r;)^o5@>U%+-!v z+nIgCMayyFw8LF)uzdFT%*x37!t$*13yz0ZDtedfuKXA#etTPG#M$*7{cAcywnjfO zuyfZraVxyP=PeVjFVp25&(4l+GkwhyMa_BcvJuiThOh7QT(Dlw?mlN4Y<NX=#^jRS zA2~{Li^~68zLM-Ui!n7bHY<6RQ0Psgg|W}{A6L6y)zET^o%PAY^l<uD{&$8mI`3an zJ?0qOQo8xosXf0>Z+}%RA30;$immVxVe^dOi%&Se9eI3p<)ag3`Cj%Vp}x5*7H=vl zvWw$%n)7VJzO)NBA4DC`4bl=(2{|Nd{#wJn)b;j>!kTmPYGT(e-P0-i+cs}1e82bU zIq%B;US8;6v&kw^Gmx)ztt)R=iS^HOr+>axIxuDSkB1!V*2T@A^Xhn4=%lkItESt* zhO@;C)wllou}wG1GXDN-`L(*NMS8b8?)~~=Yx+s_T7luL|6#$mf=`LQ`{}i2xoeoY z3CDN78#7bq*KO}Twb2r}!93^j%big-CSH|@7vM}upZVyiu83oR=?cl%Eyd^6RtEGR z`d*yV{l@j#6PI5?R~p{Ff4Yvf(>TuaS+nck+X@PQueOV>&DZOgl;Ah<=px-sQ*4hs zkJ{WHyRj`y_>DsGq^EnsxId;X+ac-p-OjW-^z>bmyK+ibWA`bai0wDtu~;%+=*H7@ zne!`|LJo#R#ytJG>QCb?&6@Iu+%u*&DoSXFsZFeVacX%~fOSx<{KNwt2Np!`xUXn7 z(SGBy7e6Flz?;*hAH4G??7VriR82fa>87ug{4u-iB{k=cu8me*-SN-PB26WCg2lG7 z8Em!@AKBmXx~(hx`>{oIV_d@W%A?XT37qw;^N-K_)G_x==USg)!8J#I+p4lO9}K<5 z@98wbxl23jSfXENe5Clx>H8z5J~+!}&hF$p=U`@S?4BiO7;Ai=X?+jO(|YB*r{&lD zumc~Mx9MmVg-l(4G-dDYfVq*!t{o}Vi9Hl3&6DPJeaY5^T><5vZ9h+Gej|EGVv^6V z#r12~K6#^Ti&!8$%kn7u;(NKDI=99c{f^%EeX00kmm4d;y)80o{{2qIWLjLo^YvHO zsIUH$D_2-%Iny@o=*kJ&D}8qQ$hZ{Eu{$_VsdU<5=DH;kg%AE^zCoHpxcJ?pko~#z zY+c>y4`!^pzv{I@bj6jeQ~lKHe$Cub_gusB-9)8?6XH|CvsbCTd&(;>6rT2d@^n6p zk~-_y+iPAXR?VMSQ(xS$@l~2_EPOe|(t_3(La?;}XEJApTve)(iOdrHwfbq>8nbPF zNz>OZ|J@kHceX^b(?>uo{9aCgdxFeFmgwx+-p{!wcu7wA9I>F|oy^Ncp-Zoomd;U* zOyoZM<62VS;zh6E{RH1czc8iAy^J^cv(jhIS+!#2JHfV?^VdKBT(kZE*RQ2s=OT(u z2It)|d?08en_m8j=@Box-IwLt4Nj;C*Logg-EynteEpnn2R@uSe%xJjzRgj~l^Zvn zJT5ltCQq2qZ;xKzYk68>hz08<&q8|Sw6C6A;l90G+56wLM3EOgKIg72*sL74{`&Rn z*E2n?p1<IdS)(~;;m)GvCY%u;s%uZBn7;ZgmL0f$!H26NEHdv;^~^bMl%05Cnq8{5 zU7VS&vHD?+BfDfp!m~dMx(XaQ!5@Oy__WM;`KQ>`o_lL&vhi8%=G~&mcQ&+rg2uIV z--0{zHrUTek&T{_<g}{NBCe?|asT>jk>@qpgeS6ojQ)9rU0qTCtGeIfhQ*SL7tOpR z)R{4D!ZRhml=l(WAF~TSPlB%~Dm}AO;%L^s&U-E^?2Ph)gZ3Tt(RDpM$>OcMF(*?% zk6Ysd8`<Z#(_3%<c*V+GyhJfjEu;EqxNQF`|5My`pMFd%_iNgt&9E}O0@BH8wA4-Y z+cfQtdGp7t7q+|4Sk3F>DVTcxiqx;L%~gB_b6UgK^kjxRFPgmZT<@F0PxrN0W#`;n z^lRNj3H_5izVG}hrwF|*UF$QsWr@D>yHKU;FKwEfzrKN02cU7xz<6K2NZbFZe=Tg? zcQiKsNGopGddTnBs<ggTx5_6k=AYa4=B`emfAk^uCw_}FYJyk4no>9SU&VsJ<PBfy z{EDvMvOc)T|Mi@fC~t8lxg&<xIQtJT>b_=r=XV1<Ol;4rG!Iwl{$0kE^;>W0%)%Tl z&*R&LdVRjcR4-zmXH<L5|J^etN0+N-n)YYPT()WJt2Q>>Y5gdzR^YtByOUdHD|r5^ z+4^VMVzJ4$uOl^kr#Kjg3o7n!_5G^8_x6VGRa!Plp;g)u!7^VgZt?Doo!soNWzlOC zabkw>yGbsp?}B!T*$XYWYPF~1@vLlbv5DK%o<4m8pLxA?curN~v_0jkyR(|r11G+l zl2a0M&?D8C?||3#Pps{mEPq=WP00RZdFe1q_LE3G2fkJQ7oR&-%k4H|RsOes-_I># z&l8_&xJ<qqS-$XEbx-rH<U226QRurd`fK;A)F(&g6p5eQwPnS^Ym@%F&NgRCTzzJ$ zltk0lzJof;SnK~D{_<?W&6lsFb>hz%9o+j{wJ~|k6V<7o3;0a_tbIGh;Fr$aN9x_l z)<)sYSvu!Tl9pE*GZy#HISo5gD(XvD$(8b{3H=LZdQ880r@Eg*%~SodsMfLdia|j; zH|x9Du05BzSFNb`+=bc8yiZp4uq?L?wAdXI8klsgl4&brd~KG^>FOuj%%RIFF2`7Z zWSo2}V;jd=9>4av7SArPk6LWY{-q&$uCw_Jm+5kLGj8-v*|_>gvdq_2#T82OH&TuJ z9%TJ;NJv^SNv>13`*D_<)&FOCQaN`mmi>^0cQ5`${q34O|43`D&Ry^4j>Zq=OJ(QG zDdEfYw)~{0e=23&ic3>P=6Ni)QU3aJueNcyM5KzJYufH(hBHG%HeXq;7a|xe&!s)_ z&C)5Wwk^N9b(TWZ$4Na^;>SBuVZnX&R%&5lQsvFZa~}rzpC~Wy{P`+YV7~3IXU^-7 ztgNvwNMCfxGSg*i>mtkYrP`;SwM}Fd)wr@^iBiJyxks}mEzP`JdbU<jcl*6aJ&_A0 zpTGZ`zdG-Tm*EPT<PQ-K7@$kXqfX7aw$yc{@-~)JvL{Z2Ih+!SRbtGFO$oRW5ccw- z?a>1nPj;S`a%tb^7vHGK(|D^*q)p@70=ccNPN60fLV4{D`Q3T^g{LZfZA$pG@}xBL z7p+LSCDU}4=HJ>+e#f%CZb;boFHW!DJL!Vff{DckuXsrMSNq@h4Q@Lpmb|RXH2T89 z^uAuxtIJj1y_7997Fwc|rgm|y>H;lZx2h=a;~w_L*Yjm&*Fp{&znq`!xB1bW;<FPc zta%oEl~Z){x;@)pI+phQ`x;Sy=*sPtVmlX$WQjId&u!CYo8*)J_R`4`->|^X(^nn5 zQ@?Bze|`6h;KYzq>c@Q7Z(3*aIbyE^yc~(In=83GHO)T6c#ZawlULan#zh;voa(VY z?6Lj%t>@)0?Xt~gY>vpP**UAFjCInsg4te6b>c({SN%&nqkB#%PLZFt>!R3&J%XqA zRKIqd>zY>g1{Tn_4$t`}uw2b(!pi&Qd+y&mYUv+7Q^~UW#dH4U8eaRSAKdUZS+XZI z?YnW@xs44fe&;$5u4&o3f1+fFMVLM>I3-_RpXxV#!QKbKH<sNks65qWH8V?Y>*ocT ziuTeESFViAzWg^tAbH`;PvvX8R9eoSl5#2NsgeEd%MKp0dpX@;`OfWg`hvuYclc}E z{Z_h0>8zH@|BvUk{Z#mK=3Uy1Qc=EbOD={Te|jWcZn`woM*T!TVOzHkaaRn3_BV=~ zUjO|1_3CF0&-wQ4UAw&ZHV=<muh*HAE-V4N41(Vkt2x8#`06~*TlF7iAD-m%(sZev zetLPiLHJGKU)HkkWyKCUNgY>mhP7vRMf>bZbp8D7!-JmE-DSMjbr0p2algLc{6u}< z`VNmXtL2x*oj<;IhVY>v!PIlH!dwUE)LBm1c~a?4*Zx!QzTEd&pUEyWRaW0{Y0uT_ z|4tn_M`O2gy%l#;{mNmz$w+waq{ol?mX^V$x<!t^yXL=Z-OcS+=g+;%!?c?#Y0f{> z)hjldFTJiRB>3~gvlpWGE#|)7_^;M%a^5q}>q_34#ypoiKVE9_^s%{P^KSFOM}Du4 z8>@FUsTOB>Jzn2da!}I2dZAp#<nwc8?aq93xu$!|g<39`vVB@LfrV#kB_4OwM=xAh z`mbJ;>%Xnp;a$qQ3)fp8dA<0$DJ+lsx=33xf9^Hw$gJZ}4YF2By?1@m(=%%?m0a|D zo-b_nxWjryeNcH=?&Loo4Lklii*9&ZwdSAC-U^)^;n0rU%W%WxfB&^)a*7$Q`|7?) zZRUoQSuaZ?GrSp7nMA)tta+JU5mowfM)%~PTT@M^&cEHL_<6S=OJ;A7W~1imy?>5N z$H1mnw)9!*Hf=77YR!^xJ)s`8_qF}``5SKAFXYMYUE(b+d45yJF`v%Lk9!y2Gc}!2 zymp2On{CQ}&$_lv8IoZsDx3D4)%hhN{>?`3W-KH>?QgVvTcR0c7I1H_31?*Gw`IyJ zZmgRqbwTuq#pSHEx?y!;eRmx5wMs)=Up;+se|wzd$!?jXm;e7vn%n|!r}G!jn(?ss z-Ie_w**rU*9=V?<u+oHIt5Nsu!SlZ_S!z{ZI8)(ekzu^5c*5dbUF}JA&+HDL5PI!a z8R*n{b>+$1hk5&QwITb*zMP(Und@`MgBkbMh&I>0&N|8dcZN;))=4{x#MW<}x+Z_& z`!&fA@>a|WOnMx<TQ82)q2yquT14Hywclphyz_VvlKyp$;?{D+P|xOyzJ8lEk|`gb z>14`HyL~f3QMiz&RC5Y<q~3M?x}trnI~JWT@qVl%E^<+}K&kM<&g=db>1|Wqw^o&_ z-R=?ms`mBq`$SQZ=9EkEmy-J@!>8%q`73!pytC}6K!n*Bz9=u>25;ltPxEh9yJ#vu zKNVqD@lO0}l+&S{WzB(+E8Jtx-Yw|SIjdvqocyR;`S2Gd`^nc4eZ{8Vj|-M;|EFoF z8*{dNTI$*<%3b$-HZ{sF@r#_Vwp6E0V4~H9I<Ip(yf3Y(kzaI^yQVqY>9I(*`krXD z9a`%*nZ`Wf)NP*W$MY;5KE@+<^ZdDuA3pgM@0vPqirU7n8H*;$2AyU)lE(AyZ`rNl zQ&E4@XFheAz0j7?du^-f(rb4^j;=G?e?{QsnOS$|@JYN3o5=r5VviK85<Qr|eU0nU zg4u@Cf>)SxpZ&5gGR*g4(r(8$qBmLle(c`gApBc9a@)O)Gv~57|Ml5A&Aa8q)j6+s z@ZJ2f+H1-$-IMSJKQCM6=~qkCcV>N=p?cLqwN_LmA#2e&tA%|!`}*x4rSF(#@c2@D zYN^h<`xes<hG;FC^oLhJP4|1Cap3&ecL}@d&Q1Iw4RaJrao3-PuL{y{ri2THyzN;$ zLv8xLpyD%Ub2QdQ>pRtI?U-j&wBqXby{mH<t~gS&UC>$ge)i*OZTIx5C#wob|KZWj z+`-wAdCSL&N$zpKFu3^TJd;_qE6-}u>s1n;v#;LFn^n4QZByN}b=95X)#)}u5t8>y z;=+#l_no@<V3%c9ba}@$Q+++-gO|?t%*i_)bzuADsj}j|*2i?=_q9CfT*GGA+_!b+ zHlHnAzl2V1S=4>*U4r@*qae42TW!fP-9|tE%5VxOSHF8FykYL&MgL9}F&+F^{Pk>* z!aqCiM>F=iRL6$b_1MV4JpJ<IjMA%T_tw6-ws~5k<voM@Tjb5osLZ(2YcKeEZt>>4 zX}d~T&VKn8wXb!;cKfdMf{#x#4`kIG>)EgKV#3>~$;n3^!;7>pozs(JemW?BK5=gH zDa`{Ry`G!G6(khbo%*)&*1V4~`-Bfi{FGg7x94Z~LP@qz$wDr!<&g?$cQ<X|<~z3O z&P0zteY;fQhdeyWUc~1)!E^m-hck}@zdXsSoYJ>&Rr=(`x3n^HQ^cl*eoj#K{Z>3L za!TjbThpg)TV)cv)3aP`%UX`&DQv5aHt6K6+{{tlG(#v)pmJ)E+)sbLP0RWacQQFX zQ#m}z{zHxSB+dT}ryqZ`n7(k2S7k~31mhUjN1|B?&-btV6;k+o<{7V@xswBmrmX8S zTh`39z}s)d^@+SQ=dD+W;AMHE67^2GN<rXG!{eHswf5&9|2u4`zwdYu_tK>DZ?~CY z@h@APw8P77@!H+WPeOy&nG0<0HnVvb!kAF(|1xCqkL$c?7tKyLSXy6yS@DDM^IKhY zWyS7PU9o#o;-*vGB@h1ovAghJ)zsthZU#KRbu5cy;VIuY-7oCOs<YX<3w<7LUparH zo!sN_Wo<H==TBUkKSkv0skqe-<JX$6*UR3&&6M|EU-#m^RD1m(Z_e2bb{pfb_!L}R zVkEm<+;R%XzMUuc_Qqdq{k8eD-}X<d);;@Lm2u+P(SP^iX6B2(<k5q*WM-Y7vt(<| zHeNZKxU9HWUw>@Y=?_0@EuVhq`_~Eezkfa78gD3`^D@>`CYVY2?9~avF5kYt{G8tG z@+Y-s@wt6J+`=N~mzaK9A2Q7-;_C5+<R_cB59{kQdB1u)<<p<!KlT4UFRWZ@zrSj) zjL&C{=Vn*+AHyuZbzqL3i2lFNd%P<D{*Bjs`n6(C`CpCo{nzE^|E`+D{Yj(W-uvT< z7w^w6+PiDp;ux8eqI1g_wRM)>ZIUY2pR)2x`3u#c2eEfMIJJa+7F2Ou*we7!O4fAl zSHD(V-+uU2xGHD5$j|27uGX;A^2a`Ct#_}yvcJMpKSa~LlEbHD#dHqn0J=%H<=goj z5BJQg&);Svr#|av#ooC7>#J?%E&u=bb(y`~dUwl@=Q=awp01x?8*+cmy({0RY|LR> zlK%bRlRTv=SDDjK4+qcv^-+4)l(UyF%sZbhaP~+3i?{Q6U0>~Y`xkWH{ao!A@#B9! z%bl4yrGDo_`}%J`K7T&`IP{<Eul$@<*QQ?Zx7Tw&2&rN1XItJ?QJX9A^sC1CR}Nm9 zOKWUT9QxC$xBPI;+{{(SABP$rd|JBi@$A)0KfL?ME;RSSa+~;i+kHi4|7+}KH;2sS z&Dbe>Z0@XouRgtFiB$boW^pXN>gD>)7kXO%Uov#v%IKZ?>g$SokMG+p5_z7eQl#ly zwXvqK)N%d({}mssCZ%ikf2x{t-CeW)y7`<ESoQ~<Lg0RXN&oxvsZ)-3r)SB3iRXWq z5??QSX7!(k{?D0erhW?aUUq7KXr--|vUXYD8$t2ouS$)=mR-1cvD>UDSfToV!j8Fd zsRc7?RJ!kL9}bJs`Z<x`{=8e<{fFE~4cD`?o1Zys<MngHsaW|>1y6t1??3fg{)*uO z_^Ni3XCZRaXCK*a@RPs1wpqXa#<}m$zwqDOV{u`n!P}q5^=;$UUw>X6|6lyP?WxC0 z&Gvb(W#|4_GI6HkGvkdG=O^AwnZ>&Kmc95*f4+dIS0AqZo0?iL{luhn$NN`{_w8fN z-n->p;sc3qihIvm_vfdZ-H$t7tE38Ppr23n`+m^y`N~`Fm3!m<Yg}GDrT_YBrs+Zd zI&EzJRo)hV`_C%8r*u>Jf{>%@v~sK-&YLI2=M#KWnddJrOTGTdS(9SJE}l7OEz8*C zyF>E)PO<3kE=hN+?^J92T~MgRe4zfb1V8ir4=esF#T~B@aNl{H8(g-$TyC^{cS=qC z`cKcN{Qaua|NL>`x;w{TfBjf>Rl2U0y@G4XLd&)Je5<Ae*`1hNIpgNK`u<OkA3wI) zUv^@Nmc<i}kf?o5z7H(bXDf%@ono>5m*Ty52X4s+UE6JOX1+^F%<Sn|g`Yf*h2MVg z-*5JRxz;^iw$6$#9+%3^wm6pg=eNFdh3%>RJO+gZ>yJM^XtZy819a#clr|N6zgz5< zj9<Um_s^aM``Ht({MR!7@xHy^Eqm8j?eragHC>))OpNMcJ{VQR&MqD(yW{?(`$=|x zvY69WFRUufew6=y^W~HN307zKciX)E7OMRAe(uK=qB`~5|6V(G6u+;pxca&@?@W~Z zp*g{SWzK%Qw;t9eUT(1b_XCNYcJfdAmnUrhm$7j2OUC%ScV|a4y?6F|^!RX{%B;>g z3@jHrKesnm)?QQp@P13=k@N1p)*Vj{y<D<yxpZ88Y?tPuq}Xrp;m~%=yS!&J7;@P& z3jXk1Jyvsnu2FX6z0-$#;_ElOTDLmw+^^h44gEq>_xJYv|8~ClSlX_ms}w9s)skM@ z%GKLWHI4fCaP9fR=*Mi}p7$@tGoEbER$K9WQ<--)_|~thrZda?o-VRq{=fd)k=)Z$ z-q$O=viWxXwd?Y!mQjnR?>-oJ(pOvijr<Gamg78{|1^}n#TTxu-@j{0(5cA<GuXdc z>bIrc==}Wsr{<T-(t)!*e;Ae3PKVZW%jM6{xsrOv#=7?F^^?CR?K@O?LG;BOVW0Ig zo3_uLvGL}XS0(qd{kQKn5m~W1M19#t1DPwwLi$<N`YKM>JDrcW*;IY)cqM$iO6l2` zpFe+=O{m=^|N7LHtL9e(w`pHE^OXA?f57M3uWZecffwT&qc*F4vlA$06^$uD-fa9N z{?FXkP0frqsx&4&RAHOtrMi5!zm<3JsS`4jem`$+=Fp5Szma3!sl4jMF&;CGoX@ZR zO_%$a4(p(pTr7#)RQxr|{~)8F?a9VuN7WSu2g<ej`FC}+%sD91^vXQ>Sa^<U>MV|V zD#}t{{F<-dIbvAI|JZr{5#vRwGg^7_`}QCWPn_Jp=jz|WV55C!ZlAgxU-I-)%QBI> z{vx+arbY2i7H&M0`*-cC6*sp|tp59I5xbUt=CudWqTf|MF}Z)(1zRD&Hgoc>0O>jJ zOFR^#w}{QOik6wBV{`henpMk7aeeuZYgSJ^U9|gK^rV}-uL^x?`d*t|dBy*JlUtQ4 zJUH2&J?Uxw&~N0v=HmH7eZoCQP8x0980VDAn>YLP^egTcqAm1&4I9&B{Lkea<MP>S z_V|Rxk?`56Ws&|3Pvg=gQ!+Ex#l1+Y_M8=*dZMnBWiLOtC=#9#++=xjb<)iJ%jUm| zDq{~j*Lp?S{p8EK(r=~dYvUB%Z+GjZeQ27!xOnb`qpPk(w9dI&dZSwA&Qa%C;_qXY z{93APmYKMCcji1xqZfrn0+SF2zMr16Cf!B+=BDUvc3BxE|E@8~3meBt``uPH^O^ns zakyxHp2o&V$-VDoV#GqZZx@+P`@7+VSYhF{u&I-M^5*sKb3T^%=#dPh`T}3>))_j{ zeS+6#+wN;0+BR`d=bpIv>&)L4N(`!w&x>@Na<5MLkh(v0U0eV6didh1>KT)pmvg^t zDc{yGCueD$htl&aN4uwedtIv9ENQY{{H49McXbj=+~uQ@3nvL|4E=w5ZP5Wilf`8` zJ>teDzlCSpmp{80=d^SU!(0yMSMRK0Gh}-1-mA7WzS{H1`#H~Ht-rM?tJI#Pl`Y|$ z<twoK$e!CC*3U(fF1VbZcyMo6+l|QF*N^@xXq;ch&iJ>)U2x@`y8@jlMbn#36z0J< z1?VRE?d867^w_M8>WZole3au4GFEL5-E)3^?#w%hd7l-n)F*9DxbvXN`Z-%>^UOuJ z9;{z@<Xx<V<_hC|!Uuoo<<+S6Ke!63S7WF8Ck0kY--^EeZO6MN+5H!#SFQI_T@|~c z`;4ae^_%-V;-9zuYTwD1GEwJ*#Vq(7>^B4TbZ&Fbp8mA1ize5-S4%|P4+u5e6eAd& zdSqpI<i(vIOQYsaVmF(-!|(ozT@A{2+RE&LOb%Q8w@{nVx6w1KncMWxPhnlVv$k^b zoymJ2Mx->sA}{vziz!{vJMOcabbh^gO>e_lrpybr@qJds!D6Lf%VvCyUE_a&^Y+0T zDynyD*9iQ-5xLpD>BW-Dr>Q!{`LbRS$A1Y1*0F!TQV-ux;yp9iASSYZ+3Ja2SEW7_ z+6(LdtNi?SX6?LB0(Di<dKYV}{_aY9dE_bcmFnpy?>;kU`+g`!HLq>ar9jOeQ=Z<| z2{in9<;nTwEpOnBZp~sTe@)d(yUv*fPXGSAQG)#}OYo}I$FICe>EFwCIr>Yb;>2aw z^_O?A*{$LoQGadmn<^G~&Xjv5;_2^q(%7>);QI;NzbAj_eJiz2b&hAb`9+OmxqtQB zqx(8#wXQo(+pE4rZF}fD_WdU&8hyVl`gi`1tOo}x%Q7=6e75Mq`d2P~c}YFrxi6}G zwYofCsF+`EuT1zo7JtVHQjuJ*SA~4Zzj(3bdhElFqD2g6pRf3~GT_baQukNI-@p46 zR(mTe9;jS1(Litw^GEhiCYv|ET$6htP=<3i3%D*}Dwb+#dl}Y{Ht&-DvueBfS3O=C zu9Mmy`rKOewt1`Kmo%%Tep9zjD%y4|Yukk>Q}vT;+0GgluKZ_uPJUL_iZ_;h95G8@ zUPuT#)OAjJO299*WZ3?jwH_O%eC_SEdr^MsV$rcZ#<#^k+V9-D*Q?J)s7K#qhO0r| zwYN{c#VTnpJQVMJw)FXHcuQSA`+NKUi2_EK_{y$k8+_<Lvo5|WxI65ae7;QN8CNBa zZacG&^C~vgKQir~20yB7@6pp;K3NhL+^;0#UoCYmXD~eH#(i$bRQvUJ+1_&mxP|r0 zz4*OKU}E%)-3@1jx_OztPdoVLiqiMBPj@Vz3z@_JYx8W&LSC&&+ZX#bEuAu1pH(>j zT*|J_dul?8kHi(WcN#PN$a_0MJ7?MTgr@VU7bot$%r15FsNj#(r`eD7JVcdqmuVI8 zTLr_XR!xpZnce8mS1ej9Q6s5i|Gp^Tob<F;OMZXqdA0FtYepJ>Um=g0U9HYOug(Xd z{ma=|FC4$V_GMz(wsbQ@gH+_1$<u}6yPrkL7TnJHx~OWNtMCe*sEW@QBNl2~gr(iR zH>J+==}ckv3+wnc9+eAy?IV_bh<o*+H$qhl?Cw1OJX6eNgV=?M2U6EHA5-2RTx7bS zvu`pi=4Z(jDXqSuVi0z4$JA4)<-R)^U5&#m-Xyv2Y<=tNWNmk9=D&+`l3#6+eN(75 zF|%p!gs877pE|AUmaWvXV|~hQ|MT%<<tFc@n@OU51~P}`ye7Y8+5Ywq;+%xF6E@mg zD_QWl?rU79#qD>c-#YQYt_{yBKF|H+dd~IO#T%hDnm4j8v@(ZGT2r_3bAkJXGrRUI z<KKPN;JHQmO>KwVW6ybfm-cK$9P^MqYunG*X$wML%Clb!J*g5~c8;wmy-)eJ<qn;L znJabv=%;e*UHLtsK0dFca8A^nF3(@TS4cK{c_o=V%BrcEFRf`i1wO*H>q78viR(LA z?<cHDjNAG%VH%?jZ{1#<EniMFzLSi$&fb1)?}nx~mIta*R@^B${yN?vct_%&Rnx-C zuJzldy%mP#%}D<XfvVs9la+64ZR!#6ygtv-TR!I5fk(wQZ0BWa+XS9iI(C-*RM@qQ zW4&9&t4-FuO#fDv|M7l#v9U^gAG6PK5$`>_f4-TeaIEO`(yJ8@&$NHL_(VZL`}HjN zN<y~vUU%PzH~NLGc<!_7MbV4kqQ<k#ry?V7ALQM7Fs*9ip*8A@&b3MZ|8pX<?Xzx} zd<F~Cvt3ofXO9NUoi)t61}kxeH`i*#a{jt-@74B>Pm`loxPPBAhi_XR<4Q)8+pLc= zmX!w^uQ%<kds6f;^F)SklH|-UaaOHDk9w|W_6MAeE7iQl<d)zb;IDE{NOyK;N!TW9 zt7B_<!JP=sGno^&{^*{z;(}BS|5t;YHK%?scij=umdu%CyZmioSMl!t$%z|%?@rZn zoXc$<Zo+JImsdL?Li_wJz9z|*FPC{<g+$IwI3`oG_^dp9yV6wFStjQ$x!!qtLgVtB zr!FPii^Fc2%)aBirEbQAH=91q4gRC6q~Hcy3*e*o{<X>UFSjm<{MRpD?fA2KhrdSS zGtO;GVik9AD=oKG_cp$KAu@c^&(h;3F2jaPUpWPyJ@K|9reA%In%d_TlOqcoZksgx zxcT%|X|ng0JR1*zBQcY_c&Z+pI2!SkUHRO#LPu-yC6?!pSnAH?fsbkyozZN%q_aRR z_V%uO=C6ZPU#+rb|9E@-1$Ci&PmZs8ZOnSMr-HfN!q>%kqDZw0=PvoPD(9xVUt6o` zAR04aL7!)hW{6|>%<}O5;Aal-Nf5_pOYYs;<+WQgT0bc2%g>)HpEdmD=6IGQyQ22( zkx3l4PW+U7wp!RpRCz|uL|L!9e)Z0lYv(!&WUgJldFA!e{a(-4``s-p*l_<2ygiYd z;J0e2=Oe-Xh}gNQ%KX|%yNvG6V5sTj+9{nS(YHWy|EHeXoC3GFTWMlzdzKy)6IoHB zl=I}p%(GLzdh?m}i03G=WXo^lMNG*j`TYx<+SR8$Dfc$dn~xP69_O4++qFgO-WSze z)9@9`Z{2(KtEKebZApeV->;TURI=x>RLnWdRg$}F$60t2u6xGhUumm_b01~CQ93SV zUVUs<N>{j;ueo@==C7Hm<(aDD%@40_pCITl<=NqL&1ui1{C`IK`-(cfo)n(RwzB2m znMsWqbskSjthwOPp=P8$U)HqPulTZe?6*66<m}V0t@f*YXz{&}>1B871}C>R=1aYT zmt{9q8O91nJ<4#qq{6=Ai03CWdxN>AKlk!wG2K`LFC(Ik&pEZB;BZ1!=F9u5#7?+a z%h$)BWr^dQb0@d>&_q4<m0R*Ix=QYReZHB)&Q>aC<=H1@va>VgUkb+6UZ^>#eMo37 z-wSwqLa=z3)|a@`>q9(NrPbV&`0TPRU(-2aSE%Mv8`r5X{2y(S4VSzsBFNJDZPvy& z?vG{^n!wjw>wYy2&osG{b$8c}YyXyhFfXkN%AZ`}ksfWvmmnXn{W@oFWODk?C(qXY z^$-v~x!Yj&#m&&3bb{aIi$2$z_HTV2c>7B8@zyZmf4<XF1J0d_-&k_;v2Vc2RkJUo z8ss<!Zn|Q9?8))Rb<ayn{@Nn?0lpK3_gI=1ZChe|?9R%l-OKGu7C9t&%-L*Y9y3`f zWcsWCokPq1+*Hev|NB5-PBP!~*Ne@c{9$;uq_02G@b=A+!kY)?ADnYZK5y+4*%`qX zlvntD(-F--cktb>MddEWAJt#KpBw+E@^5{-+~&(J8K-`q=bgH4cFk@PrvfR?Vxt3w zeM@Egj>G2rW*wbVH)DchfwYy)C954h<`3hWl6SRiRodyF{^D2eT34yfRxPGKWY(5W z(_L!+J0aysX@lj;eQkfG&%FFtF=w*;Dc)n*_uDNm&QjFA+CKg9m)-NuNeAkzj?mJu z|H0gmwCn5zuhwt3&dh6l>)I&zwoTLT_u5SVM?2;1i{c?IguA(~d%ctPZEfDxQt#$c zrB|~+_$mL5Fa4rj(_in(Yo452l(wd7>ix%YbAH;t<%2KnbUl;l_2bTcn;m_@d-Ee^ zwWftco_qPK?{?0z@N1hi50#i_?|gd=-jn!dusrT`h%2Mlg1XnwINbj2(d;O&{Cx87 zT4T3)m9bkLFU@}}XgK3j?2Kxz%Vl$>T7}vrs!#i{YZXsXr|SB7zr&(}bEFa5hH}H7 z`n#TZdHK%gv}Vh--WqqTraYcgQf_)C%HfID0rP)XF3sIADfYiv>lD7N@vu6r^UTRl zLVhQ<n}tvB`0(^Z!!PH`n>{~FpLgD4Kid;AQFOjckCC@X-QB-@zl1eK79D$&CjYL# zKC<#YJgsXMznXfo?)#i|G3=seU8beJw7SE7JVIkz2NOg5%1^S!FRos;x}t4#_l@}i z$@J5R^1!C=mYl>K^Pg@R#~v1iX-((d)XV>6uW?^y8SAfGQ!nwGCx82=<);0?^Ww@K zTiq@Cs|579ZOxA?p1V`*fA!0^^$``%S4Hn)E?#s=VPfjf+%qTRXQo~LZ7uYUqd4nb z_kDxAYmQuDoOSQ<-Y1oRG<mzr9@)z8T{U0spy5Bij|(6A6~2v(Pt-geU7mPQHvQoJ zk5l*kP@aAoR$rW|U4K<_f^~0|xPiE5%unur``p!c-Y(bpA-l-`NLBUpr8jIh$42LD zoj)_L_gd`n{ZHY+A$zE7o@=qwbN!Rau^u_=_TJKbzw_{v?JeFfe|@+U`0u>&j6OuO ziR;-Fo5YZ%lVz>nY&w7Bg(3GmKD+NHzD8`ia?W_G%ten2y>}+=5zKyXvfFvim$mV` zj_X|ZlK<v6uW(-A<{Jlo>4jxp-{MdjmT)KI`;x}LQwzDCspNa|8`vqGIhke7T6{~u zzK*B()_$GlGb_Iz);<2~HqWsx_JjA9x<1)dK5_T2&LV$<I+xXK4L=Iw@)&pbanIgq z!g;hQ#mJDOEN1pbNipHZn)ILh-x$elx%!eVU-9mjr%0Xa;3RA7?#;a}v5PJ~;0ej( zDn8$O;$YRL2STROt9D=LdG)q-wxqpV$NJn2q9y7R<Ic{#;&gI>vTP-i5tkK84y-<{ zdhXKWxQQ!f-?q7EV|AmyVfTZ({;tN><sT;+z-IuLh97OKigNY4EI;At{U`hGU27B5 z5emQj@bPSo?d9JN=p6sPim&Wi-@Dw3Gr5Z<hWvH;Zt+w~r@;85RG;RuW^r&ScX`p& z!2VSIz`lJ;R%ur7*iQ1<+H<!5X3>X^{S$9C&wlai&qSl!r>t(;Om>}@8}>x@I``YZ zljDTnR@L^n_?AV6oqyG}H@8$ITK4+uJv^avU#c2@b;+ORx9;;&&b;k?pQbq!UJZKo zWWA?&@u{^z>o!&FdLAlYzTxwp?0%nv)2A=KJvYFuba`z3jW5UcKJvffG|g^V%#1zE zj;V2}u`F}4lQ&NaJ@<EA-)Z-E|6t=r)9e;6_1p9P_WDZ~y7GHt_@>G|VLg8&{bGND z<f96sirEKq7z}4`kIoCN<(=+&y6DNZS})VX55ASzoZH6jz52}sD~3#^ENjnB-*-za zKINTxsWv;z_wHH`$Fr`+!3j&{6~hdcNB)i6D;oZC`2oAnMOQoTz3<&F%d&Ce<dwB{ z^FMa?X!u30%fDupleg&Jv}pFLz9tf@7Z)tzkH7VC1LF-@Z8HgQzzWZ}tfP=E+kJs? zzVFgc6}6Y1p1k`p&25@^z8~wi`B(1DyI}EcR)+Dkk0m>IOBZc+oxNpydrAM?7DV5t zIy3aTPw0j@cebzo&12yIMzizDENLx?+371Y*6n!hQc)(Azx$3;Ox3Hf3iD4KRqs#V z54(NsIjkR9_1f|KszS93XM7LbQRqvwSYP@0s;m2hb4oIst5&bdYY{yYsXFhK;=eZG zSKi+=Cm%RF^N4EP(;FMUz#7b}zsFv98};LdtRv6fqR2q;gNA+axv#cGe}0}X`f83? z;QfS<sk3J1%*@@;uj}M8?eD6omSw*bz-8$2_|tPPSy)s&cu}(>SvP-fpH|~d<&V8G zI`tvRH!S)RpKaWdcEEf_hr&_b*}tddg{lh|PQG+F`MeWkz~*n-Gm{^^AK$HAck|8r zzT_*m_jV^W*PCY7%}Jea$s!}uqP|~A@A1#zcvAyYMcKtH*VkQw4K;reo2?-}TQ>dg zWTgpjG`<|JJmR%-&Ec-6T`G~w`){2+xHY~tO~|e2=P!7fo6q=O$>oG(_qWe`yozgU z_TO^dD8~4OBRul&Lq6N?6J2??-;3v6JrQ`IE_-?Sr;W$;4$fH<bI77?^78QRbvJMR zzpOt0X+z-8+Vy(MKUZd~_dfGd?RCNA><vLXv$h=IUN4=u)PCEp;tSb-N?!7v-lDhG z>cz6F^S<4GS-37Mplbb#x`$!Ee*D;Rl9{W^=N@BqqVU};_Qce@7ZEB~{_QyVj<uMn z_|WU)#>=fOl5(c~UaY<5O!R{p(XqFW*XljB+j^m#&pU$Uhm_6<j+&jEvv!^|^|4et z_FCMjz>N9Nr|X61kGE~eUCT3#Rr~Y4GcVOT9;&6YUzb|D*=YaGoOe5Qw%dyC_2ewr z=?@$GKW@Bydq?zsExWtd-al*&pT6HVZ+9_djIU0jc-NDK5v`y1S4MUza*5`+{<CHK zeERdOe@_xJb;a9GKh_QVJpK4`X+7?^ioM}yrfrPuviUpd!qTq(>F<+V_ut&^F`<0j zjaJTc-aWxiRy(K4n0`AOUVZ0C3DkU>;$0W6n{VB)zVwK6*s^1Cw-Odcd0)S9ZF}6z z4kz2#UH3QW2<|^6c0@{iZ;8BNOTnG2t5BT=#k+Pk|2z0y`*C4`kwev#v;3bA=a|<0 z+%)By&uojhn$ytA<?{L@zw*NxuN-(zpZqf;weX3q&QW9StKXTYr5e<PtYR>EyxcP^ zf2lQWSmiI<vn_gRz47~JvDAw9t1K_vd*bwR|8q~&JbA*NH;2!Dr1Qpa^Wzehvx{cz zy~6aoZl9@q$yYn8Z~2zcTySX4v|V@Caj!cj;Q8s~_PaL1KFimbIQr-t+^T&1dVzz~ zr(b5l=eORUcw;@Yr{9TrUwe0F!yEE>qF-m5|0v^#*md(@dqg?!Efsf(L%U;sZd<Wk zuSw?hH&JjYb6G##FP}y1ad+|Rsfp6*GRHTRew*u~%4uG*bMqm`njd@qyxQ)t*FM== zetT>l#8vXg=IE8wyp&Zx`^-+;`8Mk^7d7pNwNq2?RbGGNVtkqT|Bo=Q{q@(vqN0&5 zle!v{x9d~M55A2tZ!6D4-indgGwb-ee=P?mtgm`D+v1`8=BZ-W;M3}VuU!9f=jx9` ze7`0~eyevjDV9Iqwyl|$%@}dA^IC%qk@qc*-g`F9+dr|kS>8zStWFZg^}P9xn|Gd! z*|u}~#tdy<t{wXiLU#x)pMP-9qig@fRvwvH{B~m1|DvxalbJrO<^Hez;&|7*hZ9pJ zU$*@C7@f%k-)%9gZ~i@2CF@%P+Gl?MQ+Ot%v1iN9{EO^ixgA%PyY6KiWOx2H@pcrf zu*(;8EjyNz<y3s$KRxu;Uk{VdZWfuPYCoR$YVzbQRnA=iSJ-85wr1NFnOEIQeoWgX z{94^+{`v2*k}?n8-TaYX`{I4Wo)fjQ+pB~i>g{J({%!m5BxGXw%E|c(uD8wVYMf1Z zU$*nE=H!}aU0y5vu<h!H@O9^_d!VCIzbenXG-sANB@=PT|7z<kftlYfOPt<)jQ6Gc ztq9@0mZv|(wW~BAdpYCvas3jLPcn@^=l)O(`D$_gd9h&M&69JQ?io9+t?SupGv8lo z|J>-$^`+?x4{82B5jj7;W0EXi?n0Suy!XpFJU@8LvVE=QS*CeaFtTgDm*TE>uf<cL zNpD?}-}L+cLX&!Y9lg~~ef2hqF1oTh%XRwtV{E&>Ue#P1|5wXe(@iSkJUqVlwifoe zEc5PY+#K+QH=XOlszvSIWm}5(@Bgr8($dEI*~TXs?Nkxtf)g$OrahN7oL8v%q4UPO zRq0D^onPxVGjHFF2L*fMclT%A*;#$_{Xd3C@uOB}7b-mCyZrT?@aj5s`+^5|_2VV& z=XQ#JHk)2O^|y`kDXsji<$69{_Vdqs)L+(r&c-!`@ez0}^q%M~Iu)La*Q$H%FBV?O z^R1+u<94ZeZB0#rrp}es&XRi|MaQ+Bv$G$UaL(BgpEu!gX}F+Ff%6&%<GJ=l(>jtT zynkw?vi{r4IXNpOmwSG4X87*JR;&H2WO4<=Enh>uFz485+drHTcVoJ>RQ|Zb*~4ec zx42aWPmiyE!t`y*1ZyY7@_UXxzw*~b2kig8V_`9*7xydi%uBvwH9uc=_V|>nj0|_2 zZt!mR{1Yb>Y7bj?3G9sPPxMVJ4!FB^TM%DRe}zPLYTxhKKV)Z2{$lDl)8hEEdl!Ej zJS(YWE#Z?{pXT?}cU8xlpzoTI=JD*0R?XUcXRWIm|BBalbeg7}Sa$v73H{zbiTXLW zIzPNiHt4hUm$cSDx}wQ)#_!{Nr#X~GPXCg*AJw;8R{&Cw^e6gVI~sGlWBM_NRoWT% z_MPeud2r%_&lAgEveUQUUF$ocoV__RH#sZHWRg7Zt%t4M2W&RHSzPwcP(2NKU#pJI z{_uh>mo>{4seP5cc51^drp|ex%m4QseI|H4y?6Rfuc;=AH`YpdPBuMRCM<t;Pb;I# zvBY2ZJlUk)BW~o=E4E_w(Ov(yEJLmQU@2>a-h{P1F2-k7tByNo)ptkcicPnk$zsB} z$bA32>r88UobDJGL_{{E-B?<!=rn^LT+FE(EWdhY<-g@QKXw^Eczr70bIIy?-mCt5 zhPU11F_l~CCl_z>)upsv+V8`mD{uGcYPo93s<)}U3YvAYg8fPEZI`p|0y0OA$(2tw zvAT~u==0`s%7R5(Gx8s1&05%c&-IROgk{v#-{$=P)=a+U&9`!`!|OL9tGrIFaaElh ze$zo^j&<<uHM+v;PNu&$+^9caE0Wo?F>1$b`MMu};FsG@uw40b^XcpA8)tl6c>iVe z2BW#>cAbq{Cwh9F+cFuugs;rM4SAzqow(qBI$@4Uy573IrF*{h9@)rlhqzpVwfNIq zwp0%Dldq<R&5vR^!y9L_nD<<k_y3y149^rAO7h!7#P28@E?uTuovRsP^>TXtulXCQ zB8%qV%-Q|2w7(=3KDFz5=44^C7GIe1_e)<lX3ba5pSRU~?d++GUq*J!;-0OxOY?tU zRbfxmEH&XL-sT~B*TokeeVT6DT^2LpLe-9i3cH<4Yi4uKx(REKZRxN)+W-H>!f$5x zFP;ALCu!wN1qVGoZA<>N8uMzQ(`GWIFNK5;6?}W6<RiAQ_|t2dy=?zY4#=}E(3|q> z;U<@dw-yLrbdcP$4bhb>e)adBpoHzywD0~RFOMGV+~{i^Tz>X<R+qTX!mX?4dj$X6 z(k=2eu5!u!58F0BoMj~M3Ew)trOC3?Hg#+9Z@$mLp(m{WZ4iof5L#}%KvG*;_WPOU ze*to`KKJ<!D*fUR;BWfsa&zCTwgrBf*Mz>-^@$3oTkTc;o&oEG>^kJrBrWoGMp2CG z<}F=&m-L=AI@oD#wQ<jx^GAM5Jll2rgkq-E>D#yGWJsP_)Be=CeVP5s(&oC$8Q~kk zCLVb;Vac|w(^6;Ng?o#?SgPjKHHR(t&U>=o)!VUw<4D9y+fa!`Kd&lFe0==)u;Q-A ztOCuCZ(eo&ugQOozp^m1tyITP?)&O1d3Tp>+jePJ13ZzwP4sIPUuo8)d+11C>-|*; z@o$es+)a@(?7w&1BwXtE&zhhd^NmO9Voqpn*XcfSW?op&Rf}aMvhb1T-uF#+)K6&b z)ocE^`}~!bymg9sUI8+deP^y(I6u8&%{xhHTgj`>Z)@LeI$m7Ef2lvJu<C%#jP)!J zube4m>@&GtB9*_K=l)iklWcir^6)z1?A|>die(cdBAo6?draiNxXeOws`Q%A>f2o_ zgoHLOoj2oiU-+%FSy3fz`+6tO?0mid@=SOW{q>B?Q(npMH(tl$w$PIG!R1!zZ@a~_ z-QDM9E-AAs|2T1G>a^|gzRkONj+Ji^@^$m@5MM5pGyB8d_A3!D=bq4RJYDBj;!_d< zsge`?ZpUS*Rd`Lkr^>n9_4Z}=MnRd$-qqik7TE4pb}TYty_fs?vW(%jdtCcZT;6kJ zDZ&+}3d2g)MMj@ApOI$%Z`YG|st2QGXDqejJKnH#Z*PZ4K=qD-+Fd0dLuY52O=qcg z63$q*n#Dj)ttprNqvF2Vod-Am;)c{Zb-KlqRL`tFTvkxKMCH5O|K0K1AFc7&+^}Zx z^P8p<N}qg7wJKXaSyPu&^_HdJ{ou{t&Z#=7Pg}76%=G)}n}7R9-k+E-|3^-Z-^#B0 ztE02eCmhO+KmM!dilN(<4Q{D^OWl`Uv)?>9)l+Eg`$`r;u1{5a=bcYCWT{a;lex?J zPQ%+rXI@6FoH4huPl@Z|BMyCu4eZhXL;ij_t1WzoN&FN?uGx$Vp{JWHYF~0ZuQ>Jg z5I1~iuI`NYv}oV&hrWlT_wBwv`~Hb%8}_by`c3`q%DAM0T4*1F^GxQWP}}+Exv#q% z-66=#7Z#w}78JXq|AncAcCoNcRp-HytsHOmY<Ru#(BDG>h(^TP&Cj{7FUb-&{Bv=S z!E@gC^DbMhzaKSocFeujc-_x)zYFf!ci8lf@&4Pk&6%tV3QrmDo)KL2?a5sk-@D%B zX@2G(jkZTkJFWcv?u^S%cl)p9d@Xy|^tIo6wj)d3uB<it-I{Hr6w!Y@6+W5vGCc87 zxw=io-+8{ZtFPyNek5PM!$Nc`&#ICo@`rh6UbfwSP4)th4PP9m`h#v+>-wWsD$7ca z-dERo_(jb7quc32de45;SC?;lqSKehc;)GXzwtYNEm~}RhsTMDcYea!)y1p+pV^YC z`0W^vVY^SUQ}HH&?b7Z0kE(o@{914P_Ju~mxy_DtU*D<5rlxGW?-7+8K7EPAgv$@P zjO^midKPawY^LLXSN(0=<WJT8&3{xM8SdV4fA7|tMJDOn{$DJUebu^l+i}%T4jF#4 zCO`YK<e5oU+a38uUCb6`i4&9kihCB$C~S>XIx}zaVSaJH4fPSlS>HFjXkTmL==YCT zT8b@h>5ZSe{?2*3^vmzpm(<Ux=&4HY&{Y?^eK-8yydS%Ft^Iki`S!7U7Fs`eSGVcc zdbe;cvCQ<Fby@kc&vyG=yC>!3f1gly;&5y2)veFxe4le*|Hr2<j$P=_Y5sY*=*zeA z{BMRT7kKVeZ1=xt*|k4;{j3-h^|PMEm*&VBn{S(c)XY}KcKOqPpYs-9U2^sNhT9WQ zMtUC03$`tHn8~m7X8&=SeIMm=efOs~^yJQn&7Zg&Z1wEf!P_Gy{JhpDr+w|+;y2q? zsZ5*l_DDsj@~@OT3C0uCgu2fko^tPc?svw5web({$H!EiQv}<2@6H^nH<RCenRevj zzRNO|#vxm!XZ|iODz~y-EVA_e#h1DfmwEp%T0VPm@sRub^6$4EmMLHUE$K6B^0OtD zd$(DZ-d2y@ZCQ~NYnSWW`SjnR{waKiF8aFY-(j^*S6j2|sf)3Ct=qHAkiFaX=a>Ij zc=5-Zdxc-VnDopMxsh?GWUuSIXP}_d&-W`$_c-rcQJwJPT;BRe*>=CU{%sL4z5D;{ z)MTxFpX{0iKCGW&_h4tHdi<@ka$twY-J5f3>IOyYTVGPNqn1U-<W*YEj{AN5;Qlpd z_H2B$ggdSK$E7bkSFQ=CWg0d@1K3JO^LB6c@4Ju6w0CS?vdsJ9tNf+!|5w%@dK0!d zZ+`3(Z%zN_K8v!#Dt)THZi%w}{qEhuzOMLlM>S@qZn{<-xwmKOFP2Mlz=pjNOS+W5 z@ZD|CH_Sz0x67i>uJC>Q-TID#blSx^p7Pe~ZzMl1S#sp#-8|McuGz6wehLsrU!Ajx z{m$L*|9;EAcW?jwbMfI9tyL-Rm)D1_p0a4;dV^bu=Un<;)(e*EdQUwMN)jgOXII|7 zld(PBEB=*z&F7aNLUUTyt}I!4%JOnv=#1NM8=AbI&&XRGxYxQif1QPUdH2nIYwrJ# zSZaB-OKPq7Q-#}}EdrD4#6EsFu6}mwBb)p~Pjd8Y{qC>ZwCBp*Z~yBae*gXV_u0h# zIcw{DY(Mtbv#b0U|0c8RxAi`^%XOyS#>bbO?|xYl;#Lgy^~+mDb3D?1F88?`8SSs1 zwEx@Y@8Z2jzRsS%Qg7b+ub=$dRsT<v4dy?+b@IJW^{c*!T#9<UQ~J}owZ^Bn?kv4E zCn`Tvbp7-^!KAwIIVaA({FJSI*RSZ@;#;<puIKXpy1QZ>ulM52{d+UtZ~a@_Egqa5 z$X9CQc<w@K9oJ9cA1~g%x0~`dG<~1E?+j~q3%~sP7oN|kUD3bki}e4D-^*MfE?ntc zd}`0}OEJ4|EIR&3O-{A!Oa8ox$$Ia%T`pdBG;j9`gD-c|r{@(GpPl?REyyZe3>+yY z%lXb`R)2o#|Ec<hR{lec_N!IDci(ThXMbpW?1klV{{P%GpU39h&pFR|x!$L!P4&uN zt*G^TSGTWDdFL+<HDTG=%+ie|zoHI_O<nnD{oQwA;f-p~W!`={_?~+^)BHTsbM;1f zzdCa^&v%+$-+kR>;=kIsoc3^wlnB4=_hD|2E&e6D_i}XO_KKTpm*086@5#TZ)_3z* z?Fwd}+T-z7|CX5P3e9IeYsG~>Z<%Vh{>g{JN#I<V>8Cp@_+sO(UBb(LiS61wBhK4+ zH+%X054>Mr9xAd*y!G{1VE5IFO2QA<O=bRHa!&8r|3y9ETsJFtarmSirf={2{QeuS z-n(D?UB~9=U3U7xCAr7nw^U}Gv#x5sJ>z!nHXix6my2Eh<^Qz!dwr{%&IRMI@6-Ag zb#K^a{{8j+IZ5-1|K6Wynd`Up+&s=5Kl03HE|#tQuRrzI`I(C*U%Gc$$N2d3*16WU zMxDv?FZxY-ZIjrvXO&|1-HS7Hpzg1ob@_v(P1$MR=l>dSmmZi{`8+sTe)Hyx?;mAz zU49>gh0miIEHn2y%H0>#I_~nj=h2fH8QI=*5`U_k=YI1cXuI^q@4`M4(j+%qx=Kr) z&3yIDBt<#N)M9sJ@%L$3$5uXMV36AF>EakNTh#vMhRDlLI`_*iJ-<@6RQ0|2q3#(; zOs*Mz3orRpImCTEvE;3rNQ$+T#pJar(<dK)|7WMcbff%bA0$7@W}G`+_x94qZA+$h zycCzy{rR;LT*DkW@FwY7UEH5H5ys280ztV&Wv$=Y&KZYI{}k`}e`eqGGt=66y&r{~ zJ`z`2F5n{hGrZWSc;5caJvQd=+7Hb+vU7KQ&xeI7aXW8*nvr<ZZ`-Bn-Al|TAKjO} z=-C&^+S;4n_Wzjo=;Ps_s_e&i6Ho5x{&ITyl&JHL+P#~d?IvEDUA=b|=bU>cDnHz| z)V40~XZOozy<J_tw(Z4gP~9*&G4s|Or&>>`{Zf%F_idun<}m1%1-aj6kkM7^h9-o| z&r;@3;cMM}es}G+9kP25UX6`doU0)C$orh^vE_bI?&&Fc>c`&ON0j})%bk6&_1Tl% zQ?H+!<~cj~YiR!0mY;XGmTuj^vR}F2?#_wD%qNc=nq9Hr>Jmrw&qv=co5_BD<{9UO zyJug0FE}ypd!)tQ^81-@cV1u=I<I)6-w2unLT6om8ThFE?V`N8N1cwlw;gS*I+t<o z#FIb%f^uSatqwlvKl6T$<Zf@PU$3V-pGhy4%s;dU?73%G)>&%0ez)Jfz4r`vf93s} z{rij4?p@TbGCNl{<szi4&bm9t$b5z8bI+saOLl+bvpICVe&gP4Q}-JGkkd7~+<PhS z=IMIz^}8jaL50Zjd1p0^cda#BvGdsS&x;#A|Bq=ozIMxw+82AIL;jtJsdm3@6j>Xw z%HE;eT1~v}YLJNo)C;a>HUG!mSRHEd<HsMjE!Wl;FKV9q-F)Vv?PAX>((g{(xqo%6 z?JkvD8$#+AoPxQ1xn-}epJ@Dt6+z-P*{ekVdf$)w(-vT5w6*Wo|G)FP4j293Dr+0} z;hZ+CiSWy0dG^M|UJq7(oz*`7;(jmV<anQM8DpE}+wRp^?O%MN+vn(M)@i?)LAC0v z$<MA-JvS-S<r9@Ei@rQzZq-H4k8|5o-?*1;`RO7thvPnTO;-H39ao~V!ByI&IltcQ zv{re)!E)Kfu!4tcTWw80yq~5d==aX1c2Dv1g}3*fJTbv^+q?MqS9PFv708bBrw{sZ zy_uQ(%B<zV<z@em-7|htdi%BRReNJ-!B{4L`6*}cF4m**L4A3DLw}v}zMpV;;>wDZ z54QPi`>o+!eep(jQ+WN}iyOY|2}|I#;5G%dg{o4DSJ@f$UV9`t-*Z#6+UoPSCEuF| z{&ndn>DXDo_V9!6%8WzL|9Je5Zq)C6)(cI<+jCcW{irzRs~>(@O}%DLUWx7gC3)MK zuI!y+bVdBT=<z4d^fIrQU-90}2(HaMi(l<@yt<bq=bOW2jhSC9=iGU|&UO0#3&urf zw%+{od%>|YvHtBJBdylJ(x`9vL+f;(cH2$W#sBW_%zwUT>57cvAMZ=GrmLU%JMm`S z5$5yfPuK9SK5BU)>C;<dxBbug!_Fx2pEz{+?=!oZn@+V<#uaP*J#KmSB_sdVf3b;| z_z(WAb*cOy^Lb_At*_tA|MVUxlL>3@s&{`@c|GXQZ{>|A-uNx-k`GvXe($xQ;$7d4 zX}WrEUkFarFQ1-W`Cn+x4zIjpyy;&T##cW$^HT3srMFkrp*7!p=QrP;^Gsj!r*-RF zG1-&@+wW)3k1MeH=CeEXgx2O?f41#jr%>Hzciev4?UNVfGE9y7;|sS5KhD^`*Sd99 zpHB<-dZYdC>plB!zV*9(*x>x_f}*CnXPj@|a~iq^u0Q<oZiBjC&i?CmwVQ4qu-x1u z1!>ycyEeyd>C734U+Nm}<q0m$&cCt5E-QGIQQ|t=B(rCk3zjQZg!DyjouYaoYB4D1 zUVc0~c#g^E6OJe1CHu<e<a-;uJa(xvMT!64#eJIRDnssbFi(-_mOO6}J@?t4@BiPa zZM!UgeNI=|G1tZ6Rt*#1$4)73o^$=&%yZXU`R)s!-}ks@o9WJ1W)JRFe!V`O<M2YT z9n!Nde<*$C8GYe><300~t)BK$mdpC{CpbdFkXQTM2d<Ax_^ZCZd${|5&a`sbhcR2U z4wrs5_xU)nx3;zM+|-M6F3fo{<KM^B2hGR3l}>EEd-CGNQ}?G#*wK6H^z>y%I%mIh zKBW8YSK+m#cMU!7eA~W1e@iAPU(C9kJnQlS@d<H0^Q7Y5``^0WcV_vMMS+Kfavi2w z9EPY+o*n#Od_r&+8=v=i?fm+FuJnHwCFS$4FLxEUUGXCKW8RzSxMO)&m!Ew(_xGDQ zuQ$fePV+O@Eq*qaxoBavP0{?lUZ2b7{r=cCGkD{sZ9in#_bpk}yP|$UWbb)s@$zNE z&WSsIe@=g2dF#B~oG)AKXUVOW_;Tg7XZdrtbHR?Y*bX)>p8M~DfBCh=&(0VX%m9}H zRb|Dm{yZ1j&VJ{vW$WIfS-UTK+@Jh1)cb5;-%3-%cRe>gy!Y&T=6vzQmm2ZY6B5B$ z>80w~l`r4lw+)yc(X{>l<@Z*fXShB)wD$XD<<Cn@CflbAB~O)mc$s}wNRFm$@tK#m z@8>zbeRk&I(HqdB(>Tu}l<!WSJmbaU2rapLtLt8$xO({9v)-!Jmcgr!y^%9sXXJAC zTdnI#J;Q@#&pqdhrhy~Svv^kaxfqL}**`ts+AS_w^X1~}OY-YCJ)f6-=#AQpKkoT) z(OK{AZ_E0<bG!APz%SD-duKmNY1p;?|A#H0PUNLICd=KQ&9I&wG(XYum$NPZH1WS{ zB_HSS7O$C=_Gta~^0-$ot=|@ecc@<Jf+X3=vx2){UVM0!Z>7&n^Cc&G&b^&C@zZyv zruj>^&wb*2$>*!3{05KuPk9QLN>0bl;+qC3m@dyPeXCLWwWj37iuYT$w>KKg|Ex2f zDBgSK{r`&(U0Ua8M*Y3raQbl3uSUL}a^K@BwJtT^_uRO2{n`g;KP%Jk`{AT>Yv)u; z{eGMKOz^&9b8*S7$k(FDzuUK&cfX(T@3V2n>!(T~eU`DM!sc7=|BWb)dkakiS5{cY z-cW716)LZL{BB>YZ()e(1M`23&wb`xk|+z3-Me9qXX)RAtk8(~ZoYj^pUCr?9p`?( zIdgeuTfhJL<R_bbW^nA)IJ9BSwJk@)O44WV`tg7XTDtF&cG|uAjMU!0r}Z~|xhb`@ ze7@Ayj$G!m%g?Irc)Kd_vgPICm7Ke0<nUYNsGom-_OMa(<)TEUOi1nVlt2I3+(nPx zPwo?YdTH&-FM-*N;*<Y%e|VXAMNEA9nTR<`=8G1;+4M_Bzh>F#xznK@3i<wf+0J*3 zmQNCvPfVPq`n1GSx3}CqKMR^7UR|D3ryjj!@>{L4X0iN*hkxewZaX_$dGe2g*Myhd zonf-dr!Z{lrIMnOj+Ct@RPJ3V`rP`8eU|X7;G|FTclRsQE!n+UbLsuSGwr8LqZlu_ z|G4xq^*eie%%khOe6HQ9P~WTjDznSBcP*^pH2;~1&85)!W}@@28I}IN)w}KXLCar8 zRUX~%HZRwX$_mTAyGQZaC$9MtOJS{8|Kh5GzMXs6t7`fz&mQ?19r;{FxKeMg%JC=f zzy7ndD$hUBb@}sz^Djd<wmvHP=caFHVLAWe;aR~ir*K@FW2Jxm=kX_PGB;&^xc7g1 z<haSTWuj&6@4x<;9hN%D%TIk+F?~niO=w76*<!i1g5$8rCI5FkTZ^Tvjl@?y3vNGZ zvvb=s{e?y^C)8~J`|g^LRcxzp?(fSV1zDW=Y($>!4A-@q*?nyFwflc8KX1D`Y2r>B zqjl#!TqU6~zU=JFt*bx0T=wPG+{qI=gRja7rJAV!J#Zq!Z>{^Ar}_K8_L?l8C-Hub z+t18n4JtLdRzKhWI{Wv)iHgT;r%seea~*b?c(iOOsBjkMF~2@Hobze+_9d2?eg-xF zb7gusOBeBE_}xg9Zh5GjyvDBjdau+p<!;3jbArCzx&17~N1*Bb^BG^nrz|)B;qP(h zqwR_11y(xxb961Q_eNER?`zs%w!kvePygmAtN(ZRpPcZ&{Qtk&qrw}Cf<pdJ{5j>$ zqL;R_L!aH=a&8T*>)~9M?0jtb|NFXkpI))uY*+02+TLjC$9IoC3K~wzTnh&^2-VMK zUNNvMs`>YGe$?eR-~Vg;+WONnZ5sdGIhiIm)3$><081=gPqfOqt$aEE#LoCfFMH+6 z<_moKt#2%UWX3;d=WjKl@s|#7Tj`>z7u9%w&$*gnHV>|Apth-I!s3o^zxAIizxsbx zoyzl<i4XSwmw3Bv+H%QtU%pO}^Qu2Qr~b^0m<?0-wnNI2;N60Gwl2MO|1ZkiP@6jE zXyW(#Q|5V3{}C<N_a^RMN1OTH69=o_T-RLKe+ud_+m|<d?oOX&aqrvp2rvIt)d%Wc zWTgE2JKull;q8}YKi#Q4xc~5{-{+a~TnyW*c78JhR|1#jMDbTY`FQevj{ctRtGDf= zvdZc|zds*#$Ml-6>ocFDrr*AtzbZR<M*o|*cRZJMxC_rYKM9|GaIVSchQD9F-QE)Q z+|=JTy-)8D{|-Uh$1D7AxGu|#UH9oGugtFO_4}_CSzVu#IXzkJZX|yPtaW8;-^X!T z?Z4HZGc$|RnU>U>y}8=A_Hg-@M^o-gERU#=|HKL!asmyrt?+-oMPkYHH;d;Ue|aK) zhxWm<@_T-6E`OGFF)#m0_a2+XZH~)7|KwpdKG>XpcW21|Gf*#8@df&I+|0|X-}&c@ zyHl^jqesWfEECEX`1zOhStf2fezE<@436x(i`N<CeoWIdU;gFoe{HknE1&A$+1zvH z>9dmh`|@Qex9*mF^o&0Ech}T+LX7PjU!Ilf+vI(*Inv2>=4Ds4TFX~Y&lXJM{orR= zUpM6>kIBr;z+$iepV&>7U*;^%wX#j#x%1n*IMLVdU1mzMZ@7Cbda2aW9;54OJ{PZ< zzjP~KE_!6+mfu%*m#WtXpWHt~qiAE^_gh7EKVxQxEt22=Q$^_cg(qh|L^+!rRWttJ z`pkafTUFs_j87j*s$b9v?z#9fa8CKVx=ZHoW*1)es@eGWnW+1$ojb2gnP+qSvHP-X z`!ov|9w_lGdUbEd84EXXkw0<f&nFU=Zk`o;mi|{;Xc<{(vb@}E`3&pj<$9VkKmY&O zT&#O`&b-eC@5QWMDs5(&X;suCv)J-t@u3Kxp7X7zrc^2(O_sAUKl}Hl``!zeg{|cZ zp1Ci67V`JoPhnoyi^smTx%>N+OG(aM-aa#7%l!n&ukDcbeRMHX#wMXCmek6{ylOUQ zUT1SK$lVTmDsj)?yzJDAa~K?^FfvFS5cgqd&|qdzIK{xwVT8<NSi}PpMPq{0cNj5% zL_tiD)<ryUtw>BV4a99Ws(~=eq3S{IfHFZc*qI<jI9&+R22udkik%5k1XTcHf)pVc zh{Qy7EGV=<YN1+@m>^T2q97(n2FVm8CaQrjwNR}fZBQmi20Ig^hztW2PDwC<lZ!wq z1A~hsGLs>YjR7i(#snoV7fA+?D2NGC6vzhGio_(-K-^}d8VIu-svhJHC=(=uoe5He z(}f^yAO%pZ*qI<jPz4|+ND-2ONK916f<g<V7OEAA2{HvL3Sxp}kW4{hq8bQO3)KqJ z24#X|uroo5$S@G3jVJ?gnmv?#Pjqn7)Axof@M0OY@Su8WM6`iO1rwR25e<qraNP&; z0-D)qF2q@Mg0zCvLOqAXB-22UHY8J!m>?ObHE2wbBAhM+sRb#3YQ@e3DS|2hF+qxu z3`AnmI5EL2hq?vi4k!~OgPjRdgwur}Z6F0utw>Ce3{(`22~vb)AQF@2zE9@BRc($I x?o$|H?F~?gi&W<zF+nm!)kH|ax$X!5_TQ5%l&|phGB7YOc)I$ztaD0e0suZ+zZd`j diff --git a/Ring/Ring/Resources/Images.xcassets/message_background_color.colorset/Contents.json b/Ring/Ring/Resources/Images.xcassets/message_background_color.colorset/Contents.json new file mode 100644 index 000000000..8debdf0ee --- /dev/null +++ b/Ring/Ring/Resources/Images.xcassets/message_background_color.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "252", + "alpha" : "1.000", + "blue" : "252", + "green" : "252" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "252", + "alpha" : "1.000", + "blue" : "252", + "green" : "252" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "10", + "alpha" : "1.000", + "blue" : "10", + "green" : "10" + } + } + } + ] +} \ No newline at end of file diff --git a/Ring/Ring/Resources/Images.xcassets/row_selected.colorset/Contents.json b/Ring/Ring/Resources/Images.xcassets/row_selected.colorset/Contents.json new file mode 100644 index 000000000..7fd80d0dc --- /dev/null +++ b/Ring/Ring/Resources/Images.xcassets/row_selected.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "209", + "alpha" : "1.000", + "blue" : "210", + "green" : "210" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "209", + "alpha" : "1.000", + "blue" : "210", + "green" : "210" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "30", + "alpha" : "0.946", + "blue" : "30", + "green" : "30" + } + } + } + ] +} \ No newline at end of file diff --git a/Ring/Ring/Resources/Images.xcassets/shadow_color.colorset/Contents.json b/Ring/Ring/Resources/Images.xcassets/shadow_color.colorset/Contents.json new file mode 100644 index 000000000..e527cd9c4 --- /dev/null +++ b/Ring/Ring/Resources/Images.xcassets/shadow_color.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0", + "alpha" : "1.000", + "blue" : "0", + "green" : "0" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0", + "alpha" : "1.000", + "blue" : "0", + "green" : "0" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "180", + "alpha" : "1.000", + "blue" : "180", + "green" : "180" + } + } + } + ] +} \ No newline at end of file diff --git a/Ring/Ring/Resources/Images.xcassets/text_blue_color.colorset/Contents.json b/Ring/Ring/Resources/Images.xcassets/text_blue_color.colorset/Contents.json new file mode 100644 index 000000000..dbac9a07d --- /dev/null +++ b/Ring/Ring/Resources/Images.xcassets/text_blue_color.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "31", + "alpha" : "1.000", + "blue" : "113", + "green" : "73" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "31", + "alpha" : "1.000", + "blue" : "113", + "green" : "73" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "91", + "alpha" : "1.000", + "blue" : "183", + "green" : "131" + } + } + } + ] +} \ No newline at end of file diff --git a/Ring/Ring/Resources/Images.xcassets/text_field_background_color.colorset/Contents.json b/Ring/Ring/Resources/Images.xcassets/text_field_background_color.colorset/Contents.json new file mode 100644 index 000000000..f69d92207 --- /dev/null +++ b/Ring/Ring/Resources/Images.xcassets/text_field_background_color.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "252", + "alpha" : "0.000", + "blue" : "252", + "green" : "252" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "252", + "alpha" : "0.000", + "blue" : "252", + "green" : "252" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "10", + "alpha" : "0.000", + "blue" : "10", + "green" : "10" + } + } + } + ] +} \ No newline at end of file diff --git a/Ring/Ring/Resources/Images.xcassets/text_secondary_color.colorset/Contents.json b/Ring/Ring/Resources/Images.xcassets/text_secondary_color.colorset/Contents.json new file mode 100644 index 000000000..94476a17a --- /dev/null +++ b/Ring/Ring/Resources/Images.xcassets/text_secondary_color.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0", + "alpha" : "0.500", + "blue" : "0", + "green" : "0" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0", + "alpha" : "0.500", + "blue" : "0", + "green" : "0" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "255", + "alpha" : "0.900", + "blue" : "255", + "green" : "255" + } + } + } + ] +} \ No newline at end of file diff --git a/Ring/Ring/Resources/LaunchScreen.storyboard b/Ring/Ring/Resources/LaunchScreen.storyboard index c98c791da..d9c602f98 100644 --- a/Ring/Ring/Resources/LaunchScreen.storyboard +++ b/Ring/Ring/Resources/LaunchScreen.storyboard @@ -1,11 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> - <device id="retina5_9" orientation="portrait"> - <adaptation id="fullscreen"/> - </device> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> + <device id="retina5_9" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <scenes> @@ -30,7 +28,7 @@ </constraints> </imageView> </subviews> - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> <constraints> <constraint firstItem="kP1-oe-ZEx" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="ksh-ub-gUe"/> <constraint firstItem="kP1-oe-ZEx" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="soi-Xo-HWk"/> @@ -43,6 +41,6 @@ </scene> </scenes> <resources> - <image name="jamiIcon" width="200" height="190"/> + <image name="jamiIcon" width="66.666664123535156" height="63.333332061767578"/> </resources> </document> diff --git a/Ring/Ring/TabBar/BaseViewController.swift b/Ring/Ring/TabBar/BaseViewController.swift index 4a59661a2..c9ef44bb1 100644 --- a/Ring/Ring/TabBar/BaseViewController.swift +++ b/Ring/Ring/TabBar/BaseViewController.swift @@ -54,8 +54,8 @@ class BaseViewController: UINavigationController { } convenience init(with type: TabBarItemType) { self.init() - self.navigationBar.isTranslucent = false + self.navigationBar.isTranslucent = true self.tabBarItem = type.tabBarItem - self.view.backgroundColor = UIColor.white + self.view.backgroundColor = UIColor.jamiBackgroundColor } } -- GitLab