From 3204328e5e4778598e5aa7c5fd7cdfe84b864e79 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Fri, 17 May 2024 00:04:54 +0700 Subject: [PATCH 01/17] feat: redesign pen tool dock --- Memola.xcodeproj/project.pbxproj | 80 ++++++++++++- Memola/Canvas/Tool/{ => Core}/Tool.swift | 11 +- Memola/Canvas/Tool/Pen/Core/Pen.swift | 3 + .../Canvas/View/{ => Canvas}/CanvasView.swift | 0 .../ViewModifiers/DraggableViewModifier.swift | 30 +++++ Memola/Config/Info.plist | 51 ++++++++ .../Features/Memo/{ => Memo}/MemoView.swift | 14 ++- .../Memo/PenTool/PenDropDelegate.swift | 32 +++++ .../Features/Memo/PenTool/PenToolView.swift | 109 ++++++++++++++++++ Memola/Features/Memo/PenToolView.swift | 82 ------------- .../eraser/eraser.imageset/eraser.png | Bin 3769 -> 3408 bytes .../eraser/eraser.imageset/eraser@2x.png | Bin 12023 -> 10666 bytes .../eraser/eraser.imageset/eraser@3x.png | Bin 23882 -> 18347 bytes .../pens/marker-base.imageset/Contents.json | 6 +- .../pens/marker-base.imageset/bullet-base.png | Bin 3494 -> 0 bytes .../marker-base.imageset/bullet-base@2x.png | Bin 9837 -> 0 bytes .../marker-base.imageset/bullet-base@3x.png | Bin 20408 -> 0 bytes .../pens/marker-base.imageset/marker-base.png | Bin 0 -> 4108 bytes .../marker-base.imageset/marker-base@2x.png | Bin 0 -> 11965 bytes .../marker-base.imageset/marker-base@3x.png | Bin 0 -> 23702 bytes .../pens/marker-tip.imageset/Contents.json | 6 +- .../pens/marker-tip.imageset/bullet-tip.png | Bin 427 -> 0 bytes .../marker-tip.imageset/bullet-tip@2x.png | Bin 859 -> 0 bytes .../marker-tip.imageset/bullet-tip@3x.png | Bin 1352 -> 0 bytes .../pens/marker-tip.imageset/marker-tip.png | Bin 0 -> 381 bytes .../marker-tip.imageset/marker-tip@2x.png | Bin 0 -> 770 bytes .../marker-tip.imageset/marker-tip@3x.png | Bin 0 -> 1149 bytes 27 files changed, 321 insertions(+), 103 deletions(-) rename Memola/Canvas/Tool/{ => Core}/Tool.swift (65%) rename Memola/Canvas/View/{ => Canvas}/CanvasView.swift (100%) create mode 100644 Memola/Components/ViewModifiers/DraggableViewModifier.swift create mode 100644 Memola/Config/Info.plist rename Memola/Features/Memo/{ => Memo}/MemoView.swift (90%) create mode 100644 Memola/Features/Memo/PenTool/PenDropDelegate.swift create mode 100644 Memola/Features/Memo/PenTool/PenToolView.swift delete mode 100644 Memola/Features/Memo/PenToolView.swift delete mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base.png delete mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base@2x.png delete mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base@3x.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base@2x.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base@3x.png delete mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/bullet-tip.png delete mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/bullet-tip@2x.png delete mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/bullet-tip@3x.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip@2x.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip@3x.png diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index 7401d7e..8991957 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ EC35655A2BF060D900A4E0BF /* Quad.metal in Sources */ = {isa = PBXBuildFile; fileRef = EC3565592BF060D900A4E0BF /* Quad.metal */; }; EC35655C2BF0712A00A4E0BF /* Float++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC35655B2BF0712A00A4E0BF /* Float++.swift */; }; EC4538892BEBCAE000A86FEC /* Quad.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC4538882BEBCAE000A86FEC /* Quad.swift */; }; + EC5050072BF65CED00B4D86E /* PenDropDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC5050062BF65CED00B4D86E /* PenDropDelegate.swift */; }; + EC50500D2BF6674400B4D86E /* DraggableViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC50500C2BF6674400B4D86E /* DraggableViewModifier.swift */; }; EC7F6BEC2BE5E6E300A34A7B /* MemolaApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7F6BEB2BE5E6E300A34A7B /* MemolaApp.swift */; }; EC7F6BF02BE5E6E400A34A7B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC7F6BEF2BE5E6E400A34A7B /* Assets.xcassets */; }; EC7F6BF32BE5E6E400A34A7B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC7F6BF22BE5E6E400A34A7B /* Preview Assets.xcassets */; }; @@ -85,6 +87,9 @@ EC3565592BF060D900A4E0BF /* Quad.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; path = Quad.metal; sourceTree = ""; }; EC35655B2BF0712A00A4E0BF /* Float++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Float++.swift"; sourceTree = ""; }; EC4538882BEBCAE000A86FEC /* Quad.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Quad.swift; sourceTree = ""; }; + EC5050062BF65CED00B4D86E /* PenDropDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenDropDelegate.swift; sourceTree = ""; }; + EC50500C2BF6674400B4D86E /* DraggableViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraggableViewModifier.swift; sourceTree = ""; }; + EC50500E2BF670EA00B4D86E /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; EC7F6BE82BE5E6E300A34A7B /* Memola.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Memola.app; sourceTree = BUILT_PRODUCTS_DIR; }; EC7F6BEB2BE5E6E300A34A7B /* MemolaApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemolaApp.swift; sourceTree = ""; }; EC7F6BEF2BE5E6E400A34A7B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -178,6 +183,63 @@ path = ViewController; sourceTree = ""; }; + EC5050042BF65CBC00B4D86E /* Core */ = { + isa = PBXGroup; + children = ( + ECA738BB2BE60E0300A4542E /* Tool.swift */, + ); + path = Core; + sourceTree = ""; + }; + EC5050052BF65CCD00B4D86E /* PenTool */ = { + isa = PBXGroup; + children = ( + ECA739072BE623F300A4542E /* PenToolView.swift */, + EC5050062BF65CED00B4D86E /* PenDropDelegate.swift */, + ); + path = PenTool; + sourceTree = ""; + }; + EC5050082BF65D0500B4D86E /* Memo */ = { + isa = PBXGroup; + children = ( + ECA7387C2BE5EF4B00A4542E /* MemoView.swift */, + ); + path = Memo; + sourceTree = ""; + }; + EC5050092BF65D5700B4D86E /* Canvas */ = { + isa = PBXGroup; + children = ( + ECA738B22BE60D9E00A4542E /* CanvasView.swift */, + ); + path = Canvas; + sourceTree = ""; + }; + EC50500A2BF6672000B4D86E /* Components */ = { + isa = PBXGroup; + children = ( + EC50500B2BF6673300B4D86E /* ViewModifiers */, + ); + path = Components; + sourceTree = ""; + }; + EC50500B2BF6673300B4D86E /* ViewModifiers */ = { + isa = PBXGroup; + children = ( + EC50500C2BF6674400B4D86E /* DraggableViewModifier.swift */, + ); + path = ViewModifiers; + sourceTree = ""; + }; + EC5050102BF670EE00B4D86E /* Config */ = { + isa = PBXGroup; + children = ( + EC50500E2BF670EA00B4D86E /* Info.plist */, + ); + path = Config; + sourceTree = ""; + }; EC7F6BDF2BE5E6E300A34A7B = { isa = PBXGroup; children = ( @@ -199,6 +261,8 @@ children = ( ECA738762BE5EE4E00A4542E /* App */, ECA7387E2BE5FE4200A4542E /* Canvas */, + EC5050102BF670EE00B4D86E /* Config */, + EC50500A2BF6672000B4D86E /* Components */, ECA738A12BE601F700A4542E /* Extensions */, ECA738772BE5EEE800A4542E /* Features */, ECA738FA2BE61B1700A4542E /* Persistence */, @@ -244,8 +308,8 @@ ECA7387B2BE5EF3500A4542E /* Memo */ = { isa = PBXGroup; children = ( - ECA7387C2BE5EF4B00A4542E /* MemoView.swift */, - ECA739072BE623F300A4542E /* PenToolView.swift */, + EC5050082BF65D0500B4D86E /* Memo */, + EC5050052BF65CCD00B4D86E /* PenTool */, ); path = Memo; sourceTree = ""; @@ -371,8 +435,8 @@ ECA738AB2BE60CB500A4542E /* View */ = { isa = PBXGroup; children = ( + EC5050092BF65D5700B4D86E /* Canvas */, ECA738AE2BE60CEC00A4542E /* Bridge */, - ECA738B22BE60D9E00A4542E /* CanvasView.swift */, ); path = View; sourceTree = ""; @@ -389,8 +453,8 @@ ECA738B12BE60D8800A4542E /* Tool */ = { isa = PBXGroup; children = ( + EC5050042BF65CBC00B4D86E /* Core */, ECA738BD2BE60E2800A4542E /* Pen */, - ECA738BB2BE60E0300A4542E /* Tool.swift */, ); path = Tool; sourceTree = ""; @@ -646,6 +710,7 @@ ECA7388F2BE600DA00A4542E /* Grid.metal in Sources */, ECA738C92BE60EF700A4542E /* GraphicContext.swift in Sources */, ECA738F62BE612B700A4542E /* MTLDevice++.swift in Sources */, + EC50500D2BF6674400B4D86E /* DraggableViewModifier.swift in Sources */, ECA7389E2BE601CB00A4542E /* QuadVertex.swift in Sources */, ECA738B32BE60D9E00A4542E /* CanvasView.swift in Sources */, ECA738C42BE60E8800A4542E /* MarkerPenStyle.swift in Sources */, @@ -655,6 +720,7 @@ ECA738B62BE60DCD00A4542E /* History.swift in Sources */, ECA738D22BE60F7B00A4542E /* Stroke.swift in Sources */, ECA738F22BE6128F00A4542E /* Collection++.swift in Sources */, + EC5050072BF65CED00B4D86E /* PenDropDelegate.swift in Sources */, ECA738A32BE6020A00A4542E /* CGFloat++.swift in Sources */, ECA738C12BE60E5300A4542E /* PenStyle.swift in Sources */, ECA738DE2BE610A000A4542E /* ViewPortRenderPass.swift in Sources */, @@ -798,7 +864,8 @@ DEVELOPMENT_ASSET_PATHS = "\"Memola/Preview Content\""; DEVELOPMENT_TEAM = 9TYSSFKV5U; ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Memola/Config/Info.plist; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -830,7 +897,8 @@ DEVELOPMENT_ASSET_PATHS = "\"Memola/Preview Content\""; DEVELOPMENT_TEAM = 9TYSSFKV5U; ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Memola/Config/Info.plist; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; diff --git a/Memola/Canvas/Tool/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift similarity index 65% rename from Memola/Canvas/Tool/Tool.swift rename to Memola/Canvas/Tool/Core/Tool.swift index 9df2cbb..6ec3144 100644 --- a/Memola/Canvas/Tool/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -11,17 +11,22 @@ import Foundation class Tool: NSObject, ObservableObject { @Published var pens: [Pen] @Published var selectedPen: Pen? + @Published var draggedPen: Pen? override init() { pens = [ - Pen(for: .marker), - Pen(for: .eraser) + Pen(for: .eraser), + Pen(for: .marker) ] super.init() - selectedPen = pens.first + selectedPen = pens[1] } func changePen(_ pen: Pen) { selectedPen = pen } + + func addPen(_ pen: Pen) { + pens.append(pen) + } } diff --git a/Memola/Canvas/Tool/Pen/Core/Pen.swift b/Memola/Canvas/Tool/Pen/Core/Pen.swift index d2a5079..e4b9a89 100644 --- a/Memola/Canvas/Tool/Pen/Core/Pen.swift +++ b/Memola/Canvas/Tool/Pen/Core/Pen.swift @@ -7,13 +7,16 @@ import SwiftUI import Foundation +import UniformTypeIdentifiers class Pen: NSObject, ObservableObject, Identifiable { + let id: String @Published var style: any PenStyle @Published var color: [CGFloat] @Published var thickness: CGFloat init(style: any PenStyle, color: [CGFloat], thickness: CGFloat) { + self.id = UUID().uuidString self.style = style self.color = color self.thickness = thickness diff --git a/Memola/Canvas/View/CanvasView.swift b/Memola/Canvas/View/Canvas/CanvasView.swift similarity index 100% rename from Memola/Canvas/View/CanvasView.swift rename to Memola/Canvas/View/Canvas/CanvasView.swift diff --git a/Memola/Components/ViewModifiers/DraggableViewModifier.swift b/Memola/Components/ViewModifiers/DraggableViewModifier.swift new file mode 100644 index 0000000..689834e --- /dev/null +++ b/Memola/Components/ViewModifiers/DraggableViewModifier.swift @@ -0,0 +1,30 @@ +// +// DraggableViewModifier.swift +// Memola +// +// Created by Dscyre Scotti on 5/16/24. +// + +import SwiftUI +import Foundation + +struct DraggableViewModifier: ViewModifier { + let condition: Bool + let data: () -> NSItemProvider + let preview: () -> Preview + + @ViewBuilder + func body(content: Content) -> some View { + if condition { + content.onDrag(data, preview: preview) + } else { + content + } + } +} + +public extension View { + func onDrag(if condition: Bool, data: @escaping () -> NSItemProvider, @ViewBuilder preview: @escaping () -> Preview) -> some View { + modifier(DraggableViewModifier(condition: condition, data: data, preview: preview)) + } +} diff --git a/Memola/Config/Info.plist b/Memola/Config/Info.plist new file mode 100644 index 0000000..11d6956 --- /dev/null +++ b/Memola/Config/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleShortVersionString + $(MARKETING_VERSION) + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + UILaunchScreen + + UILaunchScreen + + + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleExecutable + $(EXECUTABLE_NAME) + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + + UIApplicationSupportsIndirectInputEvents + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + UISupportedInterfaceOrientations~iphone + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleName + $(PRODUCT_NAME) + + diff --git a/Memola/Features/Memo/MemoView.swift b/Memola/Features/Memo/Memo/MemoView.swift similarity index 90% rename from Memola/Features/Memo/MemoView.swift rename to Memola/Features/Memo/Memo/MemoView.swift index c6e2277..ed6e1f0 100644 --- a/Memola/Features/Memo/MemoView.swift +++ b/Memola/Features/Memo/Memo/MemoView.swift @@ -26,19 +26,19 @@ struct MemoView: View { var body: some View { CanvasView() .ignoresSafeArea() - .overlay(alignment: .bottomTrailing) { - PenToolView() - .padding() - } .overlay(alignment: .topTrailing) { - historyTool - .padding() + VStack(alignment: .trailing, spacing: 20) { + historyTool + PenToolView() + } + .padding() } .overlay(alignment: .topLeading) { Button { closeMemo() } label: { Image(systemName: "xmark") + .contentShape(.circle) .padding(15) .background(.regularMaterial) .clipShape(RoundedRectangle(cornerRadius: 20)) @@ -68,6 +68,7 @@ struct MemoView: View { history.historyPublisher.send(.undo) } label: { Image(systemName: "arrow.uturn.backward.circle") + .contentShape(.circle) } .hoverEffect(.lift) .disabled(history.undoDisabled) @@ -75,6 +76,7 @@ struct MemoView: View { history.historyPublisher.send(.redo) } label: { Image(systemName: "arrow.uturn.forward.circle") + .contentShape(.circle) } .hoverEffect(.lift) .disabled(history.redoDisabled) diff --git a/Memola/Features/Memo/PenTool/PenDropDelegate.swift b/Memola/Features/Memo/PenTool/PenDropDelegate.swift new file mode 100644 index 0000000..972e83e --- /dev/null +++ b/Memola/Features/Memo/PenTool/PenDropDelegate.swift @@ -0,0 +1,32 @@ +// +// PenDropDelegate.swift +// Memola +// +// Created by Dscyre Scotti on 5/16/24. +// + +import SwiftUI +import Foundation + +struct PenDropDelegate: DropDelegate { + let id: String + @ObservedObject var tool: Tool + + func performDrop(info: DropInfo) -> Bool { + tool.draggedPen = nil + return true + } + + func dropEntered(info: DropInfo) { + guard let draggedPen = tool.draggedPen else { return } + if draggedPen.id != id { + let fromIndex = tool.pens.firstIndex(where: { $0.id == draggedPen.id })! + let toIndex = tool.pens.firstIndex(where: { $0.id == id })! + guard tool.pens[toIndex].strokeStyle != .eraser else { return } + withAnimation { + tool.pens.move(fromOffsets: IndexSet(integer: fromIndex), toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex) + tool.objectWillChange.send() + } + } + } +} diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenTool/PenToolView.swift new file mode 100644 index 0000000..d79d558 --- /dev/null +++ b/Memola/Features/Memo/PenTool/PenToolView.swift @@ -0,0 +1,109 @@ +// +// PenToolView.swift +// Memola +// +// Created by Dscyre Scotti on 5/4/24. +// + +import SwiftUI + +struct PenToolView: View { + @EnvironmentObject var tool: Tool + + let width: CGFloat = 80 + let height: CGFloat = 30 + let factor: CGFloat = 1.22 + + var body: some View { + VStack(alignment: .trailing, spacing: 0) { + ScrollView(.vertical, showsIndicators: false) { + LazyVStack(spacing: 0) { + ForEach(tool.pens) { pen in + penView(pen) + } + } + .padding(.vertical, 5) + .padding(.leading, 40) + } + VStack(spacing: 0) { + Divider() + newPenButton + } + .frame(width: width * factor - 20) + } + .frame(maxHeight: (height * factor + 10) * 8) + .fixedSize() + .background { + HStack(spacing: 0) { + Spacer(minLength: 70) + RoundedRectangle(cornerRadius: 20) + .fill(.regularMaterial) + } + } + .clipShape(.rect(cornerRadii: .init(bottomTrailing: 20, topTrailing: 20))) + } + + @ViewBuilder + func penView(_ pen: Pen) -> some View { + ZStack { + if let tip = pen.style.icon.tip { + Image(tip) + .resizable() + .renderingMode(.template) + .foregroundStyle(Color.rgba(from: pen.color)) + } + Image(pen.style.icon.base) + .resizable() + } + .frame(width: width * factor, height: height * factor) + .padding(.vertical, 5) + .padding(.leading, 10) + .clipShape(.rect(cornerRadii: .init(topLeading: 10, bottomLeading: 10))) + .contentShape(.rect(cornerRadii: .init(topLeading: 10, bottomLeading: 10))) + .onDrag(if: pen.strokeStyle != .eraser) { + tool.draggedPen = pen + return NSItemProvider(contentsOf: URL(string: pen.id)) ?? NSItemProvider() + } preview: { + ZStack { + if let tip = pen.style.icon.tip { + Image(tip) + .resizable() + .renderingMode(.template) + .foregroundStyle(Color.rgba(from: pen.color)) + } + Image(pen.style.icon.base) + .resizable() + } + .frame(width: width * factor, height: height * factor) + .padding([.vertical, .leading], 10) + .contentShape(.dragPreview, .rect(cornerRadius: 10)) + } + .onDrop(of: [.item], delegate: PenDropDelegate(id: pen.id, tool: tool)) + .onTapGesture { + if tool.selectedPen === pen { + withAnimation { + tool.selectedPen = nil + } + } else { + withAnimation { + tool.changePen(pen) + } + } + } + .offset(x: tool.selectedPen === pen ? 0 : 28) + } + + var newPenButton: some View { + Button(action: { + let pen = Pen(for: .marker) + pen.color = [Color.red, Color.blue, Color.green, Color.black, Color.orange].randomElement()!.components + tool.addPen(pen) + }) { + Image(systemName: "plus") + .font(.title3) + .contentShape(.circle) + } + .hoverEffect(.lift) + .padding(10) + } +} diff --git a/Memola/Features/Memo/PenToolView.swift b/Memola/Features/Memo/PenToolView.swift deleted file mode 100644 index 4bb1075..0000000 --- a/Memola/Features/Memo/PenToolView.swift +++ /dev/null @@ -1,82 +0,0 @@ -// -// PenToolView.swift -// Memola -// -// Created by Dscyre Scotti on 5/4/24. -// - -import SwiftUI - -struct PenToolView: View { - @EnvironmentObject var tool: Tool - - var body: some View { - VStack { - if let pen = tool.selectedPen { - let thicknessBounds = pen.style.thinkness - let thickness = Binding { - max(pen.thickness, pen.style.thinkness.min) - } set: { newValue in - tool.selectedPen?.thickness = newValue - } - let color = Binding { - Color.rgba(from: pen.color) - } set: { newValue in - tool.selectedPen?.color = newValue.components - tool.objectWillChange.send() - } - HStack { - ColorPicker("", selection: color) - .frame(width: 40, height: 40) - Slider(value: thickness, in: thicknessBounds.min...thicknessBounds.max) - .frame(width: 180, height: 40) - } - } - HStack { - ForEach(tool.pens) { pen in - penView(pen) - .overlay(alignment: .bottom) { - if tool.selectedPen === pen { - Circle() - .frame(width: 5, height: 5) - .offset(y: 7.5) - .foregroundStyle(Color.rgba(from: pen.color)) - } - } - } - } - .padding(15) - .background(.regularMaterial) - .clipShape(RoundedRectangle(cornerRadius: 20)) - } - } - - @ViewBuilder - func penView(_ pen: Pen) -> some View { - Button { - if tool.selectedPen === pen { - tool.selectedPen = nil - } else { - tool.changePen(pen) - } - } label: { - ZStack { - if let tip = pen.style.icon.tip { - Image(tip) - .resizable() - .renderingMode(.template) - .foregroundStyle(Color.rgba(from: pen.color)) - } - Image(pen.style.icon.base) - .resizable() - } - .frame(width: 30, height: 65) - .drawingGroup() - .hoverEffect(.lift) - } - .buttonStyle(.plain) - } -} - - - diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/eraser/eraser.imageset/eraser.png b/Memola/Resources/Assets/Assets.xcassets/graphics/eraser/eraser.imageset/eraser.png index efe860ccf6a6506e0a1bf6de214100f59df4eea2..0dc2a6278067ae3e4a63692f6845b878e9961594 100644 GIT binary patch delta 3391 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 VtULQ;_+kJ6002ovPDHLkV1nJs%j5t6 delta 3755 zcmV;c4pi~b8o3=IiBL{Q4GJ0x0000DNk~Le0000y0001j2nGNE02(~2cab49e-2Jb zL_t(|0qtE)h*ilIuDb8_pJUsxJB}cYEv+cD(2Efq0-4Y-6Btltr-5POCIki~%aDZ& zb&-XTUC6?aU0ms87-m+9i!>N!=VFr4Ac%j6V*H!7ZGXD^-JAOA)wzADZq>c@UN_0} z&imlLs#~}IPMuSyPW{|>h3KP?e?I!?qmMrN=%bH5`iOuO8;mT=3VBK?>6!M!rSOby z^sUU}P-4GoSOxz>lI3b)MMT9(X;D8(*9nBUO7v<&4mvNuHdi6@je}Db@wY+}) zdWJBbR>jlBAT2!8)6?n0hY#hpZQC+5OxA8$u_hFv-O?RMLKMNSm=dA$^Ye+i1S*Ki z?%%&(f|%9SRed#^%?vK3TUl92+`Jo&Mt1MsJ?)>IoXn8s)~#D&&z?P*Y7||($`=g@ zqB12FnmCdSNC6{WtczeHf3i9b#Ef$fTtoU@yLM^f(lnKSdH?;Xo#W%PBT2GzAW5bY zbv32j*$`q(7nWsHvYj#f5EZKFZMdshc4t+}g;tv0S!uOyFK5~9|Gav2=fkhQ`bOoI z-MxD^GYz4o0}`MbLlaKAz*INum|)^6xM})SLL5}0nf&IRceeg?e{yp6ha)408%Z*& z2%80AC{RZx!f+3l3Pio=-VmLw5iU%vwac&NR_hABD5{r>s#@^9z9_~OrFV`D8vLyL&^63m7isYJL5 zVlN&#^t<7Kf#axrgArCBSac}TMWtmEOoTb2of7ee$edszK262TR_hNx{`~V_gXo!= znU+y%X)YOte^^~Nh_f0u8w(2yjlU{lhnmgfk_aVY6qh9@&UM)(7_pKyfG}}$u_v+R z;_HgLA(oy|BUlZk;wS}r@aOyX{oqgEetS_VSg~*4zHDx8PO9NE%gZ-%PW5X3^V3g{ zjSdX_F@XphVjGO3UJet%Ml&Zqf@4M6!(CTtrNnXKe=zw~xRPb@U}@>YV_$#$cW@a> zjKn%=H<+Y6r5fjiQcj<^t?O-dAKW;cgH_f4Vr3fAwxPyudRYYzX)<1_U3tbnk@dy% zA=Ljn&Bx8pX{1~ci#3tfN(*yc>gd6YVhRjZvXfz^EZm1cqd}yxekOPyrisJQ&`_i% zfAUnUTSdbvSEz6&{nt|mNGmBVqLId7#7vY~DRYsgLPKM#Te&LkmOb;OE#q#e3m{FJ z=6*;kI1K5vY-s?21rApc7bD_T=3@wD{W_%01HfV<`CVIDCl40tX6~Auorran#;+iv z&?P*kFG;JK9;PJH7Kg!pB?jf4rfee6f9dcOt93)ePRQIe&qx7-nFUJ=OPz(nI_X<6 z{k5BZ8`2{_!^hLrptK6MG(ZHmTCFwH(k(bvYlaZ2cubnmkS3fuGC-uw{6Ig&Pi|@P z!8urP)llLK4~bn>K5m?tv<}B1(#)2&`!LKe_OKeU#zIJRJCPJugsVmglQ&5#e+-Y{ ze7KO%rwv1uDtpf3#KteHODGP-Q{yq82>Fy&=B=Q6?;7^qfLDy}L*??gu~rw0M}`M+ zI5#b+4_nj2kmB-WoQIX6n{m4AnH%PrJkTnR%VC|v@bGZa(()M@A(SLdL&N`O9j0|n`v643u{`TjAO@6U)tC- zzQ*<$F!Y>1GfInFjdVPN2*!|VAK!j%&;zg)m`9v=y_Ekns*}X^fjRMZNjgfEiVbcjBZE5K; zlqn7#Rt6bic<}OKv^4X>rodJUkCt;7`==I%eWKy|t2j_rdG5w4zcN(S&7C~ZoH4hw zVyvQ&#S>GhGL$t^83J*Pe-*hlJ>(MAJi^F>7pP3n_!v`(GK3Uhv38=P{CpM}Lt(aLwpxUDe_guMp(a!*AJ)@& zZhCiu!OG<;9)R#e`y9~=+qbsxg^1JV}Ut9VwUkaslgqpW% z7x${)38CWXV@eAPf9-ob3n(#~<5Rg!D(L9ZqY@9Hw9MFJO2p}hO=bJg8r|zNj^;iuq+;Sg1e2SNjpg^DD^*iJ*A*Zh7aB#msd7n6Q&F75IZrVx zrSHCrb3bh&)CIpLMD#Aw(NU3Y-mHnI%ZFS`lblD}(r*aZe?q*5%i(A!QNgL{|s!J^71c4a%7Z(@vdsJE}xcu6*X_LO--@0|HevbPQC^G}zu+GaGIgs~D z)&G>Fi5D+ke`x>G(vtQg3>O*$?x+&uG1cdBPYrhHwXZ0%4tqr|r@+XU^oJ=MzV+mAmN*_R=04wh}swS zpVI>Mw0mgHmTCZ6mv%SAGqyjxPJ6Gn5ZZYVY)z{+9Om<3%a$g9{gy5Lh69$Cd7(@c zPVoTXu$ms$Mx>ps7OM{nI$YWf$|eN=PhiAxX)177bkT=h0{@poRSdj`T7Ygj+{=Jz zX|_x4e?H8#be;MzpB@(bFkJ6x+78hxeVAZQ85TJVk=_VPt5^CkUS|MJ-ad>su5p@n zBgWxg;V>;%6^=Ym1-m{k?V#7RG`)ldf4)qM_l2=8EouZhAa0H=*|Q~xG&pRnT1KLW z4G--Gk1chyKU{)d5oubN_HCx=orjLjS~B$7e=tO#m(HN23p)>RqYkyaLBK?az15wkh(8SkmdWf~RnVA`TdI)y&v8pbBJ|YfVOFU3AWJ`CWrF#`bOJOq&AUV(9F0Bbj z5nIC&*Rpluu!FTeOz$3cJ1q4w*c{&;hY59Cmj)C0u*8XLm}}tLwQJ8i*?I8oMEJH{ zf4EENWUHlYf7rM4uy^m?w^UZEN@=we(Jkc5cOJAzSH79{27zAVDVUb#PY-k?>+RAm z(L=VhKGk4`B}-``P@2s&Q5Qg3X(3)14(De)z!j|UnSURv1)LYA+qwofW&uF2@YRXK zgu>*(1Zo+to23PSnT5S2^Otb7+FNp%e`jlH0DZVl946)!{^fy&5ool!ahTpc6rr7m zI`&~qecdGeMkBq&RZF9^#Cp+#I}dP*M;;ay7LqzH z0AR>1{Evr%+^D^!UIAH+g?A4D_7`!r0Y4ERJjGKpXfgJ37}%)2rCtG3z==ew1T9+UFLrhtWC>0ahQ%C`i?y4V?E$-orWct$?O!5hV`PB_f@p%;#UoA>afbpIW+mvXl;rk>Z-yYb;`T82RDi3@E~=4ElT#{1k^=e*j{PPam1j z7Lmked4(9k!W>zXm^8DGKv@;zrW$<@34V%Ceu~TU;jWP;%k*=>^P%$KQkg7{y~T5B9lxqnl;6#S0JC zJmMsmayH8*<%ZN&%qN=u(fP0Icz{K|odkKMb27sM<{B>p#~r5%1}*A0TBeNHPV-*f z_hBCUl!Bj>Mt?#+%GiF^D0o-&Ntj}DrjmUdOckMA95c`c7SoTZ$4W~Ce$u5G#DXpY z9-R~N>A$rzo~n_=W^9ZjsXoFR6!a{q?~MmQmDFrlh!08SByG`~GP_^kei&x?-AwqyUHM^h6&DR7 zE4r+x3v@o*yg03bOLk3Z79i07iq1s&>5Qs(!@jo_^&HX)9?uxjybnpcNyA#ug~i%Nl$H}yoOhnms$8~`q23t z4{Z%*Nu5k&`}nQu3vBkf?Z~?pH2S@@<*g>NwPv*bgEAF;ucF76DU&WZCLuR+|01&_ z`Hhx3^yB;p{7bdFX>k^3bntS_^w+86h%!=$%MRR2!`}Aq{+r;liJG&XYtX{=4wdBC zoe=e&F0YX1v4zL^{vv?DkMD8&Rq}c1uYYXGS3G%mDjCAAKW3VIywX6M7Jh!N3lOY2 zNrMF>cX&k|X<^DnPi{wgTE^t$L85}K;t`|b50>59jt)l8k2ignoB zv0a?0b7tlOT|@wt*rE&d_>+8oV=)Js0SYF4$;rQ7P$F{hFH%bxPC2qCN=RGpsmM2mF_y{oj0n zVHa6XSbrg`@IYzxd7sXb?U#B7u0DnyrET+)=C?!Fa$@gAcF}lfFS(!b0P&wxT(9?z_Px_g%0L}>-tGdOj2@qw(iNh3 zbZ=d5LvBTL5>p(bfp>_2ZbELo#6`l^=)SdDOD8_H#}Xu%$7vtQP&?d8cWMsjSiJC< zbJLC5ve+!$&~Z?o)KG1`qFII0F(4q3ls{O;6{xi0#qtyV;H4HF@l0{OO9FY$64dLa z`ZaLBXVLrAo_`4d~iX)1XcL|FS`@Z$%M0{mV_m)LOVWM!XND_bp&)Jo^siPYwP%*7tHCKTYGCXB}bzA z65g=(y`8~Q4J$469)*4mf0JT7C!b`R(F?t!_Qn4Qq%GS3v~4UuDEBb(Ka%PMExvr} zw|-ykQHE@tm4`>&a|%l-efQcYBt39Q@wT3jLzJI)ARC2H}oR@M-;W2-DsWsQWG58_meo!k*HJ@ni$LdE(Wh-S8VC!_vxAS@es_=Ih=$)U77oHJhbq|cu} zB$~fodmDDNK0r=)IT##z_3u|%S6A0YFmQk#1leWiB;smNUzA{FqPIam)5N%XYYJU z3=a<{4Hp!5LG}UV{Cnrtq;suK0Yw>e&I9RSBd^`4rM^DKC%T~vh(FSs(%!p3LVziWq^O~}f^U0{TIp}-L8(_x^aR=ni!E-^6LgNfBJNggJ z7fa;!b0Q-6(){h+kFVD-CE;0(*`JNs{pABGCU5m5#ozr^S z_;q_Et=gaNnpd(W09!GY&_O}8=NKfdCNa1?8>&$1*7JIIJ@;IP)QkiffvO{|?oCf{H5R+5&w z$pp{gbZ2r5Xg6E$8jcDaYj5hXKUM#T`MZ>JaD-Jyz7uHHoYh=7L7&Qt7N*Cl8n_Ie zTh^=!RJ#28WZyGyMdT$F@uPMmBb8+}rswQ9j^8lXO;KR*c;y5{?Lqz8SoGWi;$E28 z)EsezbPj9{{3MNG*!-04wp1vixr~akJ2N;?JxqR5Jnd_U% zDnBnjkBgL;H$wZ5(do+jQxx9-DfXW6oe;#rKT7?}7lRtcy03p}M!(=rS7Q`09B<-Aia?~nc(?OxCMoXuJ}B5$p!!?Zw!C?1kOdixzp|XJoDxdbs z{Y$NFynu|<$K~smvz% zLWkJ*DuUUA%itW&{2pXRAxLC;;oCVoL0|_ncj`SQ7lW4p>r8`Q^NC|x&DM1?>(Is> zr^BSB#e_|XL;=^u^~Is!4(lq*V~-yLOc1?*T!;F z`Rm5Z}0ZzG+hf-oyxgtpOb+y?(HSg`6RNM3@LCeINZ zoeofnRCkUfgC+)^rH(B-Fnb~sHtO^hGC0jxXB#ea5f=4`a~<1746C7Tx*1(mpO&zK zb`+Fj+H33CmohHRh6P?fI)<+qp@GBms}~m{*RvKax&lV5nXtqFBvr!~ZIc6%V8X{V zndXOHAkD3&u(+WOsOn(0l8R}`-`LeruJ$&)F`0~~Y56nT`kDfJTli4d#*-3Hg9~el zmbYTbWlafHfvv#b4A4R-pTXA0ezIP)kBDww_mb*ly;TEKQz~jr$G7dvmoV|M2|_LFcXMqK3P z=HPH>J%fzlNC-Ncvm{)E0zWGHCp^w&i9{*v13xWua7QmfFSmZAP$AR%XO)Yz3j%O2 zgXX{30}A|nS2n@J>+Ec)Vi!81`5kL%77unuqXMOc72a}`9K>(%Lr`;b1@B|1Q|IqV zBztrsO=M+dsdlNeYTu2jFftc*@Asd)1jFdi`P;Z1Gxt@-|Y0t?gU0bz- z@tw>p5>`}=-7Ig7J2Nf2e!PHZu4M_y>gxl=gxvFwm%8Pt?=n0gBHYQ97Z7e2s$KD9 z9LLD|WAuNG_Y`}Ff%BJL*>4*0_}YVe$EQATzMl2k&g~Jcw{9rD9p2Cs^_a?$Q)KBw z>1ODhh%Uc=zg7)O2yxwF-v2!_(+5{plsjfzRX9OE(eYg6snbG}NU_CPXp&ln*2>Il zLqOOnLUqMusX@QoT;`Y$MMblE7tb>|FUF)dgejp7jn@sXnl1)5gYP?GK0?G$Q8?Qw ze&Y#7^!0q~{C!t(AWMth{)N~>j)0idL4sPBKV93_iox{b3Fichq|ZZ)*d*hp(3>cy zsnn>a2E%%%{DL1FugQYK!!6MlRj>?aR>-ng!2784Wm2Kwms0;Pxgq+js{ucYAqQ4C39{0!xRQ_!>f zj>0`Dy{oFB+eI8Ab*h*q7qufHF@>+EYLa2}ArP||H@o%zv?9iqkDax$JUl$!6yBzt zkwbK1vDjlny>!n*%r~X%Ws>;u;T}HuTql8yQp_w`*3Vlx2vG|Cch5lf8o&KWM}7}Xl|*fW+ZV2-d`@suCDKp zA9a;8%Xz1=HgU2J2IrPuNCSk5o)MSuNZ_8e)KkH|Z_jbu?Om|+U|-U!Gx4)w{)=7b zkC7pC1nN^Gb2MdbX4dtNLYPRG1cbu{Ha$J~ZQ_s#m|M>Gzjw++5~xoT9i{te%I8-V z$_HmKIa6MfKG_{2E6sT~fE9BMU{5p6w}A^u6z{qC{RDr<*^&0q=g?14y2(!Z>B73w zqwR&B*%-?)rGv!_9|^iI3W5SU_tsx=Gs5frqCdf(pC-+uHwvjGjklr^r=#mmEx#Hw z0nJ1W8{QVejEsyC5rom4dmD!_b6WCBik^Fgue+BnbPW{bHm6@a=PFdb{0v%C>b2^# zLqR>JHVF@`9dL#kmbwx6?k23*tNCCq_eX6h^LTHs7T2ncD2Y&Y@#)SRC&4qoCO?k< zoG|u5Zd~0648JY<+=%UBuE3G(mTFS&^@2*Y(4lq-~=q9z-mcg(-btTAVeM#&>Q$*`VIV>3ACy;X+)*5S9>2)uLJJW7H#+Jem30NI7I^MkkEK z^uOxEC%m+%UifQoh{ExPp8Hg9|AQ$2b=`S4&Mip@7^<17P-RnL-KTXk+>HTxKe1A7|AO}&XEbGerU=MJ9bXMk#+)IlFq#Mq(6l-lvW{DI1>m&@>$ z#Tk`RF9TKAkP+@XhU_E89S_~syb2R%wLL%1OWisM?yTZNkK@ajq?Sz%n&SH}o$eTa zlHGaVa$Q$#^V%^@DOrX|nEJd>?VSB$&dSa~DFn@Ls~iboD}xU?2u(pjhp{drrb~?@ z5Zw-skEf;==_CZ8pBg7vK?&8ww1tGkq%>n+PcDM(gMmj84L|8Ev*EDZ_1;f?-H6kP zR~+s(so(@9%epx1R93gb=A0`fXEkx$UPIiqL3G3atn{eEiK#Pt$XHjTI2ub8A)Bbn z>6xaf2r7$w&S!3W;4eG`d`<%Teg@>_$qTch`2C;)-TP-x(o4v(?qrK`;3Mb^S7Gtw zfe?>%(?4LH1n(EB(!r>VkSAj~XMPID6{l}3)3sH##8zh(&iodGWBN11GH6X?JL1(# zh=W;VQT5obVjMYiB!+U+Uc*~@3s(`}6SLR70>*d}#;Qy8zs4uVO6@E=nlAua4;t}$ zS8*g-2vGGO2n9XBW&yaCuf7oOiu>oY7DIVTGx8y$Nn7Z&dwLov(gUl`>&2U`+b%dr zn>omKxByA^l^0Z1QcOjYm(ISQ3KG3uT2WPSs!s*4XC-K{$Xk{ODE5a13@eZr{TN?K zFkimQWWGAvJYtZ?{n|Hz&Gnw2w*Q9H<|=4pxp1{Qd9voWS~90uB+DV@EO?n9)r*5K zOdyV$5LwK+qs>oz7_Opr3!tRb`c3~2m`+?6Vo2p>ociJQnJ}YL)KmMA(y+L(Oqm!1 z(_EVbfM81lJ}zP5{PA{t%urM5m$IhqWUoYGhJnXf*7k`;4f z+C{8(&#x}0>$xS9A$iZPzQGF}x>CmVRo3CD!c_%fYbQ~j;(Ao-J0pujA$uizE?*V* zFheV~&^$GtG6QA!mykR`$?r{VTLG5cwdaIG@K>QLeyJ%b zMU3KzN3z**Tb8R-CGKQ-hmD?tUe?jNe9!Hp8r~VwAwM)R=a=1-R2Uy56)F4LPC^Aw){K6t zqx}Yezt;l-VK~Mo{sw6CO@rOcocwZg4YPvN~ESzzS`s0H8v@>1#s*3#^?RhW3|GVf#FTd7~{y!i*E%2%hg9O)+li!~%;LW*(-aVn@4>i>{K5Ok7J(9mNWmNN&sy5#X_jG=L3QV7mD8VYB1 ztn`r}sGCy$8snu>BinX_xqe5rZQ(YE+DGN6Ob%@VEb+h7;y8ANVrTYOt&V{KG5Ofo zEjO=-mob`;znh7rP$ok6=Bd51-cU*>r2{RCf)Z)^GoL(~Y`9vKte?k&)c=C!3rQEh z_LQQc=9zl4UOX9XotTKX%|v@mmH7|K3=Kta5Nl(R!xhED60SQF6)zw`Pou={uDPaX zn&P$--$K0dEttRq6Mr zUvjT7%o!hEa`@*$F_sb{Cab~>C9W-S4qL7K*qN77Nq#VPRhg>Onsz=N`tT z8FzR+8@;``GNGmU{Q2|mt;>|A-4u*Rie?66mZlVLo|dS|Z(ZHXwM zJwsMy?&+ZS97Khntmt5=27Rc2)YyolJR;8t3_7N^Z_tnjOAU*rkDXh4q&8cOXEv`& zy&m5v_Es@h5G$mG+%W&LC_d?Y$SUQlH*6WqJ~)d#q9F63i1JZ5(@1cviLoj?aD!BY%#}i=hl}BB+1y^75#_mbG%@&YX`@FGj)e6-Eo;Ru1AN5A=G8R z{)NR@HI0+K3F@o(qq3;EwYk`5@pZbEysgozkF6pql-$U>LUrD$m!lf*FHXXZ0@C== z2stqo7Z*QL%YYdmm))C1j^6J1-ocN?q=vAXs(QB?R3x_)4+oCohnzyV#wp9p3KMfz zf-||=ss#=TFf?}p@>|VwSghui(Fv}*R+{(+$8w~d*bopM3rJGI@< ztp9}OC?LB(qw$)_2HEZ9L8tG*)qwA9B93NT!Xt~nbvu8H?m3hF@Zss${lZrmwUMrq zcQ~HWOFwuVB=#^aCT0j6D46v-ODedB;=Uvk1(=cR(emLBQTN5)@UWvJ>R^WSuI`jF zj<8(sdgb_y+yW(CySx{2+v-8TdlFaVg9Sp_>rIM*s1^z!HV&tph9e7>Oxa8*Y19Jo zM4$TLNJ9Pn`|~3?x*OoN4w>?sgD1jBy_}zd-JM(e-e9$o@S}jTh};_ZIg^ntkX2$h&VHB{2fFZ@AB$*Z+U87^(%@~Ao=r$#QQ$R=Piuf z7bY7xJxas(NswSGK-FQs$!Fi;cz+?v_d1X<<7x))y~d2FW|%MstC1vOPUMSf`_Bm< zBUP{^Md@>LI*1g(hz@XiOq^+pbw!QsYj!`ppeGCe3+y!2ctOxy1cjzA%lSfU;E9vq zXV7^oT6-YlZi`s27H0C#Q9*u4DJJ>@h(RXg1K+FeF$>MB2z|A}bOQ5ZN@Ggzo0FiE zbG+VheP@;3Yt;-G^uySR-m|g5A<;ceSkj)%4`M(m@7&qVT3Eim=g(Rq(VMaM+w|KV z-R9SPkPjI;J_Xew!+Mp>k6t)t5=4?bCM$mmX*wCxYwvMyz6v96I!y3QEBOKHw9=Eb zh|dv%pkrRJDSUm_?U5EOn=fOgx}MvkEE5;RS#DM`5<=8R^aQ6PjBaXDu6;E7aMK&1 zFf}N1_q4<;1?F~mJdM6otGbEXFSp^}q)=H^D)6OfoY@a>mBn=jM3hhZMzxKgGu77G zg4fqa^N_C&*~0{IjV{ZO4yo4(9^0;?<8gbdn}zd(EfVq%9Uk8crr#f6{m(1kP&$Ci zElL+-t zsETxE`$C!?9i<(Tn4~GyZ4Zgv=4do^-ZI0tV_MyZ-p?Ncy!^{qa3$gp_$P?4smun| zda`4M`rRhD*wg5BhRX2SsUXj&JDXGcXQ1z$eS7hDL5J!qy%E1BScOpdjb^y$JwpBEIK^OaCZuxLfcAC4Ocz{?{?~Y34{*ga|pAQluHXp5YLAMd!Wr zBx9zkd|z7QeV77EtZ@9q6Eu0w+X+hUjSm@C7ODXiWTWS}1%TfsuDt&0?NgBSswxh=5TlwYK+RnF~28Zmdp! z_(l|D+#1rKReY>$AY~fuV;kQY8X=CPlgs9k_8a~WrneOPk3=O2*2%?AYNbD&?(Z+Q zo$LjRU(zA3rpdLnwZ+a?(%g|gcHBQjIykAt(D6=>pB9>-Wy@yujtwldTzme&x#mvg z9d>}&jLslv%Tpg&*{_lQ@gZITGF5aFHY6mALJ~ir$ZJ9A$hMpLi~d?%0(eo9G2_?? z-AhTT%PIab3kR#{^)@-S!a8#}7^-=q8h8$7K3R&Mr#gkA^hpFC2>fSRzjNE@|LJoC zC$FBK-D7wdbhTFUhWX~tlcmFn3ixWN!LOb~BV-*%RPSd*-Mt;gn(On%cu?7D{q5y; z*ngcx)Ewg~RkQ5CWrE>P`w+8OWq|j%kgRHMmRyQz_xL|cq>a`C+W;^5Wn|GiZL9${ z_{iRdTT{CV@34)hKe1<7Kz!d#=X8OGPcNpvrS=$e-+x(rfq#r7L^e*Mlaemcn?}P^ zSxe;2uQA|PQ(k0(sgiBn&fnFcir?G1K0TfIWx>lSYxXr4;G6r+NFfmsJ+2gEy#ep% zXd&BT%L3k@PWZw@``E}B`84vJwotpSvXYX~iv)J-8q8yt+y*rBPWu^w0CHz(xz($VKRI^dY>{fIp5iT+K$C) zr46MI=37`>f!TXFAP$TT@I zbvlnls6MXi$JS+JUn&(16lEZ8D5u#rhKzl=Bj|dv#m>n&<{CrrPlKgkexrhfhn{$K z=wN(R9lR|IEkI6`qPRxnMCfVv!}1%f<-rXVk9MV9<-8ccnr5(O8uxt6Gj`n=$Jb%I^Frc97`H2LV0jjXbi z(=jvk+6jb9(XMlYq}bb&DFNdQaic7f=nl8&nvt6J3V%$2wQ?Ch+$*i-*;UF^SnZQi z3ouQF%6#~-w$%73N1FD&geQ&EM6-88=G>qFjgbWl&A>a7H0qJtS7GDpN6uA$eJ!+) z)lQ~MTg3e51L%UBMTxyhAKU#7#Dby6k73-iV^P6Ow!*?~!o>GJVRSmKP@olw6^b+# zL9D>+2wuLfy5~c54%;(R%7JYLE@Z;F2@IQ={(anAuD(gGQOM^}-RpDnmQ`oNcP~*I zzbxuK4;LTW9|NI+90{${t-G?e%2#n)ikm`QQ)ikPhp_xpiyi&mXP4eV&#@zRLB4uM zRCuvaRxvguE3VO$ZRYAHyTcgpKOzh`lb&B3vW0(Uyi*`{4PuQ3^?Y$_Rbujk zZ2A9FncmKz6mJxNKJma+%Fu#*kaR16w&I45Zd-zu4R3Q1avW`;0Uo40_gA(7RntyA zu~^`@?84i^qeE~*EAat{rMHGzJ@zy;O1AhhPcC@s-pN$)Q8Ohk_grXx2C`lczf0nbkl}?*s%a*O<@`jLORZp-<|pRtSn(+4 ztu(rCyP;?8qWuj7F+VuwDFu=c6)<_YjMjyVIy{+NU2hC_n2#*=u`rXX-gBI8hV_LApILEPrtB|qw0=HdR>yLQ2+ zT$|r68a0>m#LR<(D>vLu)oNA8JqTR)T%QG5-D5c&KgE5p+FM^2u0ViTscVV=(?WpQK3fL82z;~1<5?5cv(3#jRWQFevM zZIQ^|X32N$%#zw2jK^po=Ov7XlR02njA&2V-}IBuGpJ@|o)wEk@Y6e3eZg}3FgdiP z^R-%{X!GE-=IKbqj(pCfylpT3xi9n%rx^UdCBS=29*Crb?p_=gEiT22OVPz;ad!$7xNs=$E=7wki@OzD9Ey8!FJAoNKHh)u ze#lIcFG=Q@oRge0(Hd&<*cjv(aBy(giVCut@A@ko96S;l%6o6;`tRDiLU&cr_ke>V zX8d1+SJY(q`#uTpp(!s7S3600^gckcky4d{gR4)#d^SghgX4@{r>`+i%s2S1$-VtA&@^BDWalV)l{~>y?qwFoj2Y5 zxDT2%fh>E~t@zKkYtL6!R%V-ppfhFu{|OM$?|Hn?GCO-z?2W(5Eht06lAkW>;z`FV zlMr!n^B2xSx+FS9ajr+6B@4s20xx4eogS4JT|c8 zzt_dDmYT2^8m5rdgx{&XG=xjm%z%*rijjXy!=H3}4#Y3)4x8D0Pik6@8*HWoHec^r zPH+PMhJFJ6V?U_txz4-L#O>Z$53zT}iEl;(Yo# z)HQ|l#u{-VIJQS{4DOok8oc{s{&cy2zdhlCbFrei1yHgRjgodyj*yO+!8!hw<4E8v zpZ1Dv&oCbhMfh4e{PJ)Ae7)nAy{>aMeJ^o;Q&d#+)9JjPsnha4B97Q}v-zij#UJP2 zFXNAommL>I_-NR6kCL_+~1ii0Tvc(jjw^TbW_8oJ%LmbkidgHAA8!14lMd|{6_|BJ4BJtO{uHB`rfpC{K*J_8Q8VC zg#m2o)+*ftZ*SM4Ghq0E6jes2*)1a5(w+F+`b_CtPgUP&z zysiC-oY%ANfu3O3?}$Tflc$@tp}uzj*~quwH~+k4#4e0YE>MwM2xCm5S~Ow{58q7{ zkXbGb6WjGrsF6(io5)7Rdr~fO^W#b4d0OUxM#y7dPkr1vL*V$ae_?;WPU!X3b@h;T zXH{@uiS1~^>9AIwcG*9C^{KRjqwvl-@*fG+pStz@sUDw`^Yx6)&VZ-Ep4ZC+)8{q8 zZnp_9SldbJVM*Lm8A=|}?{k)QcAIIOHHk|(6n!dXO4zAzs15 zxQ!S>Xwes$%R-A?KescMxnY7ImRWBnh%`d?7n22V^JfIioOx?Yt)3R(oiBRl10e`= z7o;I_ok84_>o`arnzH)?ztCEx<~k2sd&dON*L=6*3|qSIXX*mZd}UK+`}Tt!#k5a* zC#mEee*V0qK?zf4@X6N12*p!LSFtA=2q&(PWZ7fE``!X}pdJmnr0BU!I-8hKzRwkV zU>(-vnmG3B;0PnYL~xTs14wMha=&=8?>^F=*<=OVi*DtIM3*aNJLT%@d8@zbdspXczi>Kx z2>5$G?T*S{i26bwpEe(BGV&aQwrvDmUV9S6?$=C_i9h+|(NwQCxZZOGAF>^CX3C<= z`7+S3ATOFn4Eu*5>@ic)nlcVyu}iqbxb)^$IYst4Xy=}FEgAe3}0 z=DKGSaOTQkdY}zPaY}RVao}O?e*ZCvm4cyG)+-U3d}EU!@tSm>D}3#{=r2)($GTh_ zZPu=gXM`*Z1)mD|`7$a)Hq?v~o6b6TL0%Yro&+;LuzmKgU7oKEU0$}qLC?ceq2cu7 zbbi#S(9eW3bFCgDY9By2-NO0E?xnh?OIKJ|x9XG@Z?{Kt1)Co%kTng%A___emNQFP zgi@DfAeLQ`a(zyh6V3+Fj#7g){lxhl@kMVBc|P4YE;u=|9&CyvjHLMi2@J`ZxeuOF|I#4R(fXn&mw_E?ZuDjB=$BZD~K~~Fa z?po^`O0X?w<1WbCzHQp3s99zAN-Nk%usJ8-e-!<*aDY{%<%MR~XTR5ZbqWH8LWqx)BYl2-Dk2wL`9 z1`}@v%+aenHq%9LxL$sW(`HB0?ReVeQ`g%|(5IIp4@ur%bgj&ZKoV=BUC3Hh58FyQj)w>aHfubkO7k#kjM7 ziFmYQD{Nj*--J0p9#5w^iD`bg4wFgTxJ>5xp9VMByuCF9J+-vp?pu#>GhdW@Q8_=` z6Gwj;s5YJAY?C>6Z?DG?dbj|zz4g&8T6O+rcVf9My-I`f#fWoinJRXc38>b)KRZiF zqbkfN1ihFBK4iSzWDQe``t(gKi?ZGQNxpuPbaspqYZx=diXK7fCFTSYBU&f)Tm%&O zc=Tt8(8#vDW+oT7)X!R3dIRjzzl}Fll~8F)B)U|Ii-?txkW%$d+!;Tr_uME?A*mU7 z+^Ui(+_3TE0h#%7&F&F4h>UvviS}IU3nD$P=O=@uPU#=u(@z!ay9hyN3apAEDv`r1 z)nQ%xD+aT*3M&)sucwHXZT}It>T*gLl&Sqk9l}aKnqU72AGdt@vNECYGF3^a zX;Ae$5G)~(W}2acpAU`^shhX1;Tc|`2qnbVdi?LdAg{-pkG;sQA$I2DieWlG{k|Br z0F+Ul1bGW1T|1xT3!Zna^!gu6WWeqfgcdXcyXAvR7m3ZFkr=u}tAhwFMlTp|sc8Qm zC4Bx{vFY1wLP#+$R*L$pm_mQGo)t^%XD84?|LjHpv)VV_F{eJ}i5 zT8PL;K2m%=CFJB;3kl^&JYm)_5Kts?nh<$NvW2-!{-*#~6Wx*g`ps-Ece#?JEGO@S zb%)n{oY~ZdGe$P~0(*U+-3K9g4iRIFEZvn^8q2ievE+;2Q;oC3wBCS=!n0 zkmzLkPcBmJIn_OJU@ckqL51u(_q3nq+5)?wmWceRP#FFQE4Q#P)f_TIN%yk7PbGnV zAQg47^Fd?{xe>P})^}q3>3{92_L|&q4WLH4A;)x}*mu$)ho~0_q2a_{{gOL|`x(qF zBX?=Z0aY=r?ycr}02j}Z+=TQJS+#u>W(N09IKA9V38A>24TU&{yni7bUe&F154%E8 zPJhfbgU%~8D%;+CZvW>J#ie;=vP@|S)=&=6;GBWQ*{C{L_nS)6=qSChu5sZF=yD8h zRTpOOamLDsLT?PYxDyou74d7YoDwYqPqW)p5tY)lhMj!VEQ*z`mCNSL>svu&S2gPu z-009QVLa_w-@D>aE0JI==(EV>-JO8t-!-K<3RDlB5aI_?4ds(Jn0+T;M_no4Ypj9Q z20jdO%=%*=UlyB8o(oZ!iuQ+%5E+)CL!Bj_p1Hpxv&=fjl*24l17*u=$0dxtZanbj zx0Z`mp0~Z$| ziG7lMEW(hZR$^=klK6UXADuU%L!Y4Y+S0!h=7MiI1{c6ie*<@8oVlWtsBO{p%A~S8 zO4y+-3`gtTF!f>-|39A1?N+1`2QYtGuXDM9zZz}MSaDB?`7tgO{#i)#9ICgYu zF^*8Ut7_K2_tePcvq3%OCzi5Qky!36JO;{ttJ2k) zILT)EI?b#lP5&urFJxL-Vh8=gJqCAcgDNLwxxN;|pr zeauXHX{jp*jd#gjQZ1=|4d3E-R&qf_`(07)AgH!lCddb!{{&*yt(?w$g~-L%Il#?| z<*@_ImL}&V1-1`t*3f9MEk@Xv%JgcwDqUe!7{6owP^*`!? zA_6{Ro8pudW8tKzJGfl;Kx1_y55lzI zib9DeZV}v##dX@2Yh3DkNSJ~); zL%uvXF5Eh#gZekLBxcy;7r}cI56Yg%RrE?x56VlOL?i@u7?1{dmk&!KQ&5|K@t(T} z+rMuEu`6(z6Mt+9L#_-S9uSpSBr=#H9Lc8KHII~6>Bq*Kn5Fj;`!qt_I*F*M8BBCK zu4kw?vhR_rydE+kvmLSI!>AsThEG4Otj0ws;kCUt&OPWhPkW=*3LaS zEQzKIr!HRQ+5dCvkJO>RjF4&liJ_}~rl%f^8sI52ri=BRdP z>&3=?ON6Z+Ht+rHD9HtN5QZTtQTWnkhaE1YL6GL_^EXMNM#aZm!VQaP7mqA%hd^Jy zH|$!LeT$I%ZV`7k``1`S=l%PTJ>eeN(`E#k?M*fz9s8L2$V-0EEm_fNaz~-$g^uiA z-zSpF*G>%-{O{fx3e;}|Do=hfK?fS%YY0!t`)Des1ITz%BQOi)P+2l_2$Lfr3W?0$ zbG&DW9Sn8PPj$QvB=WW^#45Z?0y`OX)1|bl*JIh?I0X_(Qz9XJ+x8yPW;6cNsYqB4 z@M9V-(O3&^~GJVyQN8yj~Y^({Et5zDZM^~#^@ zf7W}E({Jj6ff%sSI>M4f(J+D$@4+R%>az+TfCZJ{!e{onzt^rJSScac{@}B}2^=H~ z<}!2VfGa{P1C1*wnPseErIn;OdkSPrs`V3wPS$B1VHVOqd3I=vvaA zMTnLOg1jxnR22!yafvjEAy&Kj$i(higqg*-Ro}Xm_k3daVBV<<4q@hxneV}>V>-F7 zY+Dp%!ac}UR7Hsu;ZX+I^Lm*1xm^#|EK-!7FlM{X127Me2Z}LMYtmksS<(v@gj2nG z%`##3cA!`IH6+rd-6xjlZ^994W0j^7RXMQq?+NN(wh2{Dl9GD4Q35%40E+njDH_^^ zTi#EH$Su@HrR2g$bc`_U7n#JajCedm4his;aQNYm+reHILzeDVxlYdPnDnIS@xmWX zK8PT3uJA)r!}!wr<0Tw9wQ`Q=meg8pV@4$tV0EKvdu^q-Rk^qx;YnXbG~lf)8M%)N zAZ=L9#E2BwoK&%$id>=gV@}_>Y9mvO6WO~JUz~x-!K-}UNoBrf1&$H(4*`tmmz~h8 zgj!#xPb2}=e}^c4t#(HeZ)E)ZDmp2Oy2@Zm^_Eri!$K5u!A}3{bXl!cE4&RTt@s4H3Ym% z|L-IDpY_oOHnM}^KE^A^%|Yp(2=_323VFMh`vQkD^FPupT-N_a!+y@uqmIVWi><0*Z^^utgBX?E0A&ueH-tui#j#b% z-5z=>?scpk@Nl&!ybyX@aUsr;{mmdB8ahy(64yv>RjSVVN%zqx*RqFkFMY_+uG&x2 z_f96OQA7sqVEyP{e zg@yDHZ!xsbtD#C!Y?8*nQ>bk)lB?+fh|*?~BfXNydtX^Ie5KsXIyc{Rwy;+UiwoC} z@)#&tZE@LoypQmhS=cB6g!J`X((({f(1sf30F@OL`MDXdH6?&vd-V$@3^w&MCDJToKA>_A4Q`CSE@ab(^%a^yVunbF-KVo%5j z9aL?c;q=R5FX0YUkyRa!5`pfh0cp$DhLJ0O3gm+FmNRfX6>H(9#Gv~w+i78-;Nmsf zlCOt1`NOu<+Be9kDCM{9MLP$KJc*nVDJu_!`f&#>6h!oc;&t{xW)-B0BZF$$x%v1f zwBfXI=lv@I{+S&};()uMxmiczu3ru_tjh+x=(sUs*z!vMRdeXIsI^o(LujBuG;Nry zOYJL@Vpj5KC+p~En!Xv*H@F;{>verMBX>8V=(EE4 zSejvSbv-RqHLI?3T#%`G&rwqT2W%G!H#RZ4GTZL1oqN0meI=Z=IsncehUPGdMlojW zy>9K6Qf~X{OMLZ4Qxg=E8)ekCD&jf=ttaZ_P56nG_`sOx0> zR{J8kX|>v)nP2hB*@De#85IsEEcI7uigwJF(b&c2DZq)vBJ4GCPGgXNB6OzwRlm>i zt>%;(R79)dv1&D2nsQd<_lVITwmmpyggnA+hP=Najq{nS$;QHvMD1)Y#uSd0Nv`$! zi$<7UVD^LsrvXsl1|td0c~~nKZyOIFoNKKwqt0I_n+QJa<0pY_>Nk1U)t13yvK0i?udV zb6+WpdcDvzuFmE%W?-C~&CJ|%%LUX4s~|{z93TYwqbXytrt8K*2$)w2PLq&ZWYXnh zJr>K=pL`hc$Y5*%4lR3i7`SVs=Knnm;P^bx=K1@}7SC--WnM3yUuuU5Z97jZ%A$TG zU&c%Zw&M@b$64A5oR}(LnZ$c!P$Ew`LoKY^FFqx-4t3c`QYY@O@#CU01luEoD~2f) zJDyR?zOaW`!zmBFUA|T7uaO&cT?BNTYoy<`i zdw}AouPC2-oy+yuoJb`;w5xn9qEE;6`)Qe>30^oq+OM5=w0&T#n+A zT0?FZxM917PR=+hUG$&w{T4XwRH&+brG=}s@x0?X6IYGPW}XLi&fC7Y;KEcpqSog&&TDNRHh0h0Q#~9(AjiX$m{45+(pE6Vh&x+P4)fOmdgN`{ z>~Hh{oLSgaNr7`Gczauv2lMxbRoGKhG8QrC0786~qc74&*- zvW%}Gab0Kxnk*5*=+2=EQIIFKdZmROqFGAntQR!AtcSmaFoX zTS}`}sX(Kx)+h!=FVENfHWTPJ=;pLz^W}V1GGA5~%dNuosAWxNW5xJS3+?Cn6^XDA z{tw`Dd`4xcGhE_(#wzH!`b1I#vJa3K%{=@`j0wmaGGtzVK-#|h64XGKxuUw4E6rOuhER_CvPOZCSlwYq_ci3tF93R zZ4OS@{KCV(u*KnQR!N5yxqvhsw#9`g*!>W?%LlPIhb!$$!k7&0bpc@fSv^b$hF5u*qa~kl(&~H^>Z_=gaVFjYYqJI5eIvkqE|c&duwAopG3UR_GcIISU4QH0=Y}td$GQ<$dkF1=;*4Np=9UHnj zprFSy;|9vJrrK*JXG*$WSZK*qBK8qTbl3YKM?>6H9V!=DOX9?YER)+GI4RN%kDFJC zB#8pfOr0wlwmfnr^#xG)MR@+0$czC1v-d^1I`{R{ri=F6&7J##fDjdViewugRo2lz+#cG0WjinsIJOu&B?ub|m%_|L$lSo?!(U!Jz;w4|{2w>!Nk` zO%*4FJReGbp(+A{01O&Y6#F#7f~%HZ`YOg)+mI>p%=jUk10|u(!=Rx)BwU(mwrxOe%RS;aJtf*7l)rYL+Q~_f_29Gms+IEpZ76C( zm!^pY`s`^f{+%NR7elsO_W3g~eZvrk`eq>x3W)I^s{O9@vBE~xhHo%%yJ*ShOes<8 zVn!$34F2MzsGlJh^>d0i{{!@@5T^o#n+-^cJ3`NG=~MbXediT&G>mqkVVrhlH&Q!V zuUg7!#G)kmBDFPP)8_y)51?&TS6LXpZ$HJMev17KEj%b1aDF2f&^Mb|qoE|GECROc zlqs}*9ROMygKpfGm*IM4SYb|UoHF2)U5UshnCTPXD z^*^2(f3P#cui-4<7VwlaRtv)S4M!_2usTgN%nJC~XV|XKRF&o_t>**A!gUt+H`BqH z*GR9=!?>h7m1OEUjL3S79hm5eecPRfO(0GqlnBr7_0^~YIAkgV_huw#JB{nrZPe9g zKRg8VQQ^V4m6TfY&E7d-X}xOnw}YTp4#9#;g*QUV7OVCF6ekjFi6&d&RAe`llO+K+ z_0id!DUh|-2=|2Cy%Z;jW(>;oFa4Zxgz>h1qFg7^B@Lf*n+L&KNenU#hgUGQSI zGkKlaymlXAu5sL&90Oh+Z9J^u7~^<-D`dp z;q-RFkH7KJ?hIwftn|$Fp)PZ9BE~KhAO>XJu@kpN$L~n@fmhn4w^*^Z8<$O1Hq1+O zru%nm*w2M;xK^ju!=LmQK$0d^0|Ay^>pkA3K4_RUJSjQ}w}1is5js7GpJ1e_I0G&W za?cBy@d_n2eVxRaD(+?B>Voe04ovv$!~eEcY`1{Ak|5P98&7RA(lMhOsl|^>N(a6( zTTt9`Iw8frJbm1JPoM4n@apX+kyXo@st^S-6-IUxcTVy;T?O!UmVzL*XO-KsWm3q1 zpDX-EByIULumHRK!MfUjns#oLcA`(Shz6Ss{E0vq0W_p z*qSj~3f0I~@`=?w1s>3&&g$T*4$Hx_oxVzOM@I1w_1E;I$RcsQHx<*?=4bgIP`#uSU0pu zHR@~!_K~W35Al+yCZdL1lSlm7>wowAbU`C(rq~%v8=8nNIiXD6p7!T;tsMT7whIa5k!MK}m#etQ1sl#M!jmA&@#w;$|0^}eYQ zM=EZUmKF_0gocFXM}Z=vhW(pb1tk>$b> zq&Gdl0N3i`StOI}wRI3k?x^z))2Y5|LeaX=Y$gv}a{NPzUgiCwVT9pQEmuULTqB&x zbIy_w#xuV}-}Sh2cL-pB0efv3j(Gv|{rR#U-qv5Kc>XQI)l)ga1lCb=VmzR+KyMoVMH6)w18yJ2sixDFiVp$5;4_RQ&6!7G(DJ($|B96@$TJG&SX(ZQY;O+;5!#e0K~@Fj=ds%B4d88 zdO!iVi1XFI{UIp7XgkPnli|!ymy2xs?@-%{(YnEv6!T}>Hd7-h zB~qH|NuQl-`wZoW)Db7F7^VMAI2#uTU(^Pe^S}PF6w;ym$P8kx%`2?)_V)hfXY1uY z#17hcg5k!01-+W1CkG;2n+py3x~L?;#8igq3>6kxP200{PjHG<3QWtuFF!?FDVD99 zldPb?N3Q^=5fycJ^jo_V>WQr1vrHqhlJn9jN7_#m3M4Mm?o<9F(7{Q#yIeHl0Ytzk z(m&Pp%2@d}9(v*$+=x12pD!JM^bzK)l5VCEug@dw7Q)SG;LxI0C1rF!S2kl+FV3Re zZ6&M_36(A{?fDoQnIzkExYXrc2v}F!&v=t29r68j{8c~xl|(JeevhNtQL>G4&x}Y> zdmZfm?!T4^xNFlt`%pA!{bFT~zxn(71DenNY;9~KHU|&2x(3-5UGLC;BiCD_vKAbSn|Ijxp~`LrY_YNWqmcRI3K6DER+bfeUIXGG*eW-iU30pnb+y5I(#>V)qFxBmhJ>pzt- zX!TVVwN;^57PYf}nU26J-74*M{mT`_nqW&$75>{hZ&@(%JUew~xLMgFS60^_ON2u+ zh)-9}-1J;i$>y)(IzdF<`GpiD@YA3>NuyfwA?0c-<3Mdp% zgwD_y-}u<0Y_iEG{aVKYl$SVOqlMCwaMJ_+SL1S(2da65iZec5y;y`>{I+@Mv|4bu zIbnWQmE!^s;2hkUe}rmBI_&waGThdzz4=?7dfCk0cc^`qNjl?d+3fhP;7GftUs`$k znYrQ38)RkJQ#bdLOT_Cih~rxC390E)y9j@INsW4*^g23qZgTQ40q@pxW#FbVR;je& zgVT99D+5TPN%sQA(r_;k`wTs6?^+1T`hR8LFWaVY1|fQC_ts{7?{(^MigIeQwbEuG F{|8FUNR3jrxcM3(_>u6-n^1N6mp6)gfvbccZkfxe$lbV67DaY$eEY@? z`4@_>3!O;j$j*i)b83?_XaY$5Z(`d!G!KtYyHGYkFi z=TF2HHXiR47^B~LD9)OL|4U7LT>9{LmhUb9tlNJmEC=6wCy9STD;!_}<_$d%+JErC zO_8rw_9z^eG9jX$XQ$=XmkM<|O4nd==FD;*-#ERBTIKI=xB2dGgEY9lR$^>LkF z2VYG%=xcA7ca(6ZRfx&5zjI{NHWG(eLSk))IM~hg4P#K*e9zAx8OAPs`u<5YLFmk@ zeMg|+tjapqyxcJ69$WZ&F4p4=V1}x`TC%)y8I`k8l1KjR^S#7>4wON?mLF*y^4GfK z6L(i9Lg)1bD2lF)-)oNSl@77lt=5vKAn})cxUPjD#`DKDGJ6~gS07x{UC%r?|PyIk=(Evi|=z+yW;6W2?@?e zo6?xL389eFDI2bLlp*}w)k+2SZ{c4DJKp;_^rrnf1!@7mU&I}Bq?*@F#2Ta1WZ>>+9x>z$3Hz)(0{1*jQG9dYP_>O zr|csYkG5cuIN!UtrKg)s>(n*{Lo6$_^hUD>Y6y<8uM?porsXOR^?CU9jjF$08n-6# zerNdwWy32S1g^KIs>~Yar0}fkGNv`a(%a3Nzl_XToFylc?nb&GMxwq>#O~)xaf{*) zw>N#qCa$Wc?JEp*$;fVTDZPpM8ne3&XY}~-{FYXg#g9lkZ|?>P&qEuRHU_uAL?e%U zNuTotrjm~P@vCi2zNqZ_ZS+|k(@He8e81GyIezLu_8cR7t6%0~e~^J8^1G$WcX~OF zYGlbge}&~5zxS$g8gnLw{{qYJavpsr#FATyiTeWw@!ku1U#cLvM1*-F@gm$A=>TLV z-g_GL^>dR^O>nrbv4pgq4AndgU2A7cH(IyQvh>7$K$JlZD~3>!XNnR@Aa-6reN+x) z=8t}T-Vs^KF!p$)Kjm|@%`=U3c+$vyOr6t{i{I-dSEnWBourmEs?I&IJr)~fS0aAP zt3%WqpH=v2Q`eV?}wu2)8Y#LUb?q?jU*l--(h-M!rzoz*QnK+8S?CxVP zM8`>*bT86sGyRD_e_*3J@bo8R3bsyWQbVl`6A7O6?C33-QR+GCM?(uYM% zUp8FuTc62KzaSd>f!RfQY}MkH-G2XNGskc}7bCfB4zhmCPi^yB>=9>FsdePA4nvk^hn?_Gyg2PpDfnK#^%Y4 zq4>O_c40gN`TWzUNa~=e@wojJI!ePYOnYBm!es`EOMMgVck)oo43Y61qq3qoGWW_? zflHM3Yu-j#6fTQ1yM7yFG2puVgF2I(DRRJtEQTl1(w`at@rEcXEYOC(kAo6O#>a^ClJhtf^IJ?fc z@_27K?Z_7!fMj(NmwANP(8H`KoDe@14jI219syE|7uj8?IDg#Y?26k*@YeRYUsPMFZCsW4qF%-L3k4GlhjB`V{K@xqe9kMz~wwDkA@)8eQVQZCygY7nRLW z>VUogzV!OKMQzjEtrKsV6%jNnJy6kG+jXz^XnSU+f_62d%Hd+#bKC#Uw~fB+0ZAj0 zU(VsE4h2Jx*qfKlG;cUg3>XJ?9ejEg_s=V>!PT^MJ2~Q9Ve85b4511mNAaBDd)>CL zD=2F$U3Wiw+C9vNzB1QQ;TV-dSeMA+Zqk0%H{y#043=SSdhyNcuTXY1TQ!jpIZ9(u z6MpNhrg@!;qi)M{@%zk%`DjI%tjYTGhX5m7KF{Zd!9`2hvI}_F^gYhAUWop{J0Z zxck?RcNZ=WI^sBp8keIT&-GHjn8zviVOHFiI;rk42tT^xKzmMC5!aD3R&5UfOP`0) z@N0*29BYQ)=IHo~0YQVXij+l$oJh8l1*wNsuZ(h|;ntl@d5OmHZ3fffduuM3`;Tmt zs#M0_765MS&el0iG$;X&hE$S;CE-O(#_)S)#aj0%tS7 zP6x|LbiUkj*uIJ5>_c(27`IUpHEj{((w?r&nSkigC_Ik5L)1XNoGY=Tggj-%@k=iu1BmEyYvchRys*So)8x()CCVezy;@ zFmZnS_kBcT0l378j0uJDq;0xUqg*Y;$(tN*G3>I|#@K@;98Oph zyFUH+PS&x63VE?NUvZwgrz%y;%PPGTgbQtw!{FHmAE?>s5Inob)`U4X|A#@1mr-!4 zYFCCfUk*#$P+p>Cj^Pi+TkjDlnGXjqu*$XN>6}ZW{?4VHa%-*Y(4XlJ6T!O6$$aIi zPK=rml1Vd!jY_c%wA`p;uYIg{qOtnQaPsmDP8x_OCY91`c^@dyeABIBzxR68i(3Hds0 z)z@C3=!B@R>I;*xRh5~fQ2#iFB>mIHB|{foi7oC|1m^t#QusS zGr_P^wfwE3jw1KQ$j)H_b4#0q(iH0Y=~OnEM#P0=;gkVyBJCc5J|=H3NrwF1%{n^U z>*61&_)6X@cIeJc7a1ZwvBn)G>(i%JSRz}V_j4BH^Bj zERJ_2>3f}1KM>ss4nvjjNP<=DYd!*++FR@#dF{0lAQEeP@t zXrR-YJ7ST4!Cl-NyLb5Ce1H_Mg?8L0`G?Z{f6h{6)SGqtcGX0<9o!;@Q0*A zldcoCe+UE|L6u9C>#YEu1ckd^g@Aj-i&nI%7iYvJJ70)`7mzUseY;vVO-V~-0==(^O!_>3 zb`)VzoM`lX9^dfztDR?qh(|-?QHL7iiP+I3ei2=F*~3fmMooyTvfR_LT!$T_-q2^@ zp#o5TqpHTspN!Jn)+A$+tVk#0E+bZxuQ-?M5{NVv1(is{Svc+?nhH@^(^k+ zIlR`3s_zi)r>p%#de-iP&VG~Qmu)*=-NMVP7H!>^4P|8mn?<1`UoY1~A0D0mO>?_^ zowC36{W-ZJPhFk{`C}gjrD}~;w^&@|hT_(Q*iYP7W{dP*hEl?bW;W2@HgV*qkEnW1 zM0I!H#tfXeIzvv6+r)gVyf662{px#|b=UQR6DWdmgFPyT>Qiwx!Fbg1`=@NrMIIHk zDElNEs$0U`J0lT1%9s7;QNRGS`|hWVt>6Ac+3tjLtIh6D6|=>@&xsqoWj6Ue>1(dJ1qre=J{R3KOz{O6qoiK$nmgO6=T%$%?n_u!s; zFW5*Yfe%7Ksa%WY^U`f-&doo!gjFo+SH&HM%JTfCyPJH4WTO5EBK$`olU(9%nbQ9L zHY$O?-EK8j?=h4nqbF`Yr+HD%(h%#>u_lx>y;8>7Cf@@PS_qxi$fL)TFfWKO<8hKu z*6$Jz77Q!3IR56Uhrg{$0XG@@!{G2*OzN~08ny-Q*@dc3d7?)f78X0=M5>NFoJ|%w z>WWJwW+s(BO5pmnAL;Kp_w*@8*T>}TFYi*zTGvP=a9Ahlg(ZT!Yl)-c8IV9)es~(F z;oe{;yA5bI^Y?#+XkrGh%Mn62%1RJ-i%ouqL2k_OFE&6<9sWz*CX13j{N^3kVc+Yp zAm+V#gNMW7ps<}Z=U7+u*=<|Z=g4ZR+!kvur``dlW~r;m0Y!7&So`%kc?tb|Xy{h5 z2~!zKnCRShqtZsAYsY2q28bVe)MuI}9|hsb^)HImr-EYW7*hU%0;mEs0ySlE-!fjIHD0+W zE-4uyKH7j`QIyv0Q==M~A6)X*K}*2oTpiUnkve<^*<4HSKdqOYl5@#Z6d9~AZ|%$p z+!<9%l{A0^E?ryu0x00SNg`>~l8Ng-^f?3YoR>gO5;%6y+f|IYLtk>Bq`VP#HrXMu z#kY_Y=7n#$r=H?J?oKPxvbNpLfYR`wNxH64lQxa0RRz$SSe4q`|6FwP#oyM}J2IRG zZe%5go1PC+_>v-Te?Qg)41euwfGf4dyDRnX=}yA~P1o;??Mdz8DWG z1^SZNc?unO8d*5?sY0-;*XOqQu$*((- zN3_AwaV-l)cy(I*qII|wH^pNORb-W(reRv1VMGtEUzm#_7`yT6w9K|Vve!*tiOwUk zVaDOSKQp5!#cVxo=4W!6WJRUs4xv z3kcl^c)jEOoq?k5*+=q%bjNZuIR}&-}SM>j^|h=5*kXq;V$k`KGmKb5T_Cz8*Gj&=8``8)csrZ&^8 zeUJEAAcjG-14Owh;sRm;%of`>C4rHq#M385fJXmK8+im2@vA3>!yysF)h~E+1hxUfPUIU7jJ;0?nIbAdU|^I1I~{V9lnld zn;gZ~vdx}yBaHY_uU-}L;-3OrBDV>TGODry6!6|o402;K6t6Mw+t_)|bhoOBH(5|& zcV2oibpy5^x1T&I=%p?UHeFmPJjWZ^e=WYnd*LiM@s1JX#Cn|o%S|2}dAHU#PKn0v zHxOPtRBci^fBhi?)eOr2BZ%FasuVSbcPCv9tZ>MWTNV&b6V6Nf8fTnrKyCv3#-_Y1 zUta|*0A{I@3qmDe>4WvO)%E0lppWUjvdy!E8{Lds@v^*qPX-iH#DP(p^jII>f%eim zS@dcf;eh^2!pD{D%B|KyP89in1uZG2vZ{|0S6VT=@C?rzrHhJ;LTX&P*#H*L-@3PZ z7`84i&i>ItN%qG+t!*?rTl~wu{DeH627>0+S z!V_^^(|RbjFYu*3i&b9Zv6l;Mu;s(!gsLI;9QVAvv}amm+i|I{}=_PDcEw_eP*zn*cq zFMY9tr*>)AW%2$}az`TOky9@-js(8POUmD&6Nwh`XaL)2Q^_pG=k!UJDtw<0ee>Rl zkHKM;TOsz%0)LdY9=G>1+ekOnH>67Ye2R%m`VZ2}LBr}Lc#vCA8f2Z*>257NPw zb*T|bYbTG#nT5go!0}5BRB->s@S!Y>Ab!-JK)Nw=W+6RdK2F}=qiZ;;`v+Su6w`wx z+B3^b@(kt0x6PX8xomG&5cqiEf2DWpns%Pgcr7eTd&*F|vJ@Zmc;=ezpGX=yli7-b;!ty-^XOeZOkW z@no^xe>_I3zk%3mZ?WSpzVWfo3=u}0hG;q+px04#aAKI z+`|kXnFtKgaUUQ^xR{n)#0kVknsoMJ=17HI2j`2#E0UWl;n<@5mY=9waz(Vp`B1B^ z>bgrPGZmR9IZem6V&#-M@XV{?eSg97or=m6N@-ka%R7})d(a+);8aq>_oc*WFOqSB zdGFRS3Iu254O&`w{vP@)G`4nAzv08G@FMqf?Wl4t_oCO(WT|4-@UDd2TE?^c^6Z29 z07@YqBah>~E<@H%$Kp2gJwFC-XAM^nupmp~~bS zebH5e3(q&&Yg0?c1d89dXF~O+>f5~S1jOVq< z!823T&@XP6XWD8$3K9|8nEO+OMsBKnZsmFaU2t)={=5N=)U5{l=9hfea2t{I3a4LE zQUaH@wq{a3)GZQ-oCGeQ`aOINs+M@5y*aODK%Sn@rGh2))a5x#l<}#_5}b1Del%qy zUGNM-R{r^Y{iezB3BT+~$63ApjFi~#%mxl}FjiMpzP@*WA|^4VYxs%hAzLILu24hB z3EvC?5p52JpFd)DtAWe!5&A=sQzZL-^>G-_qiI9uIMpC!Vy#&AHd*4Z#9Xy!D$k^7 zAhBi^5{&j^B9*_nMTBRBO)HY8SW7^^XKvm(XSn8(N=YAY4lgg8iC6eu!K*$n6$5?{1V~EP=fotE)zxP zc9<>xy?-hJdqE!i7L^=<1>k;Ap7^cgU*8>kfaSA!@zY8v7!*F!WYG$`&BeiOsSW^u zUHB`X1DML(31MDAj`U*axaN-xA|Ag-Zx%FAP7lJZ#Gs6A_Lp=@9{IJxbiy1h3o9H8 z9WhqiK_Zu27aCGLw6$>Rtyh(d)h<1loO}6DzHN1;h^Qb$?l+U;$Eu^%na+ea52o|g zz1g5W!jvA`0g~i3z*>lTOcyLVr=puF_x2x|AB@AKI$}I@&qWx-qaHO35moM4f?8wW z!?AF7UZY^kst)5od~;&-tQYAe#dRsl=IkkV)hEwb+t?@#Xc)_*){JlgvKb3Ch*aD3 zEG+L=?Qy2Xvq8Qf!`Q*9x8wH`EQLYI48n|v={LtoYLt7>(D`^GE0IDAIw_SpsMlc5TlChvW7)$=0wfeor!~8W zEOyFy(e>+9r@yjvB#;#Rr}1`pdMQATK&7;rZq3|4yUd^qFn!73rxp!Q6*HjP$zWyB zpg~{wN@4o?I}5-QA^TWSH(Ss~DtI_GOY4qyUoza%^k+w31gkE9j%Y6B+Q+n72`5ee zs&ZBHT~|KX;xT_)YPUh{U7VPlkaZ*>bH|eJUg569`-oT zqY_Jr7g(43+VqBksVhQ!k~E6Ah#lfm!vL(mZ3uAZ4XhtBieF}}NT~=#asm0p5YsO7$Eu9r0Y17M^WR~El24a+M%|+F$tHTEM z+u@Os-MiQ!(8mDR^mPVY>RP|Ca!+VC1}>SQd8vedGT3F^m1%Vzyl;UFpTtlC;sAH( zB3i*vEL)YD-?AU+B{M;?AOu6Iw5MpHB}5Jz4dn#SD|`H=F2Op3CI3ay3&3N3BFLHH4$j43giI3Y7W!pM@f*JV@v8VzwV(G& zKLO4ku=}1uW!>C#Z&es+D)w1%I2J8I$YA4>dk3xtLp8RnrgSrr*y}%B^8_%VJ(yz<)$L!}|8uG*nmX?cv{pDXmWb|D2zXcxdD^8h1Kc_3|!tJN5oqE9%N- z<40zA-5AiOw61fs01zchg&DMiY(Ru+^U6V-}-?IgZ#Py-y(QmJ!#w> zaQ}Y7k<%m-5|>3D@Y+JiRU zrYz^jUt3iPs>pR_+9+6O>QYab{#)Y0Z}tQAz@sZ4A?4TorA(@%n(up>$=0xr^tBOg z%d|?IKNqEQ#h&yooEI{lM1%-7jJ|G9p<$shHbi^D%pMbxGa+7HlVty3VVQouQvdCq>Hy*%6KK`=s?>uW5`W3*IPn@G(i2AEY>v?6X4xi6_on|Q2 zm{h}S2vy-vsN2jUi#WaiX)0Q8*K)_kzsAnYt|q?|f+r_` zsaz43!G6$n)=F?49j^6qZ|8kRw-(4tZ{@5W%&wC?vZ7AbE9|2O(=$y~O8h1Np9nq7 z@gM4v|1#+tR*`l2#ZdmFO)r5v^I%8a>+|>{Cu#Y+%Aml^hVe&+p?IXgW~M@`K7fgf zL73-h6m9h20pm6FzyAANOiyO-Im3NPioOuk1>opw)cHJ5?+TPoAGu^xCH zS*Je-Vn9+*Hw@DwVAvH6kFE-q9fGJ&eEKL;5<>9FuSw2V2$t`7gQ$0{d3L7{urY}g z4OSj{mg++46wjB!mqe=NlxQe=?1nL~R8>RMYfIz#K#VN2|4L=8)|`-^e+QPDlt1Tq z^g7!O^ss=l=`s4jmXS8?Km1>7tSMBw=Z8^?EzX&+wy&NhMiZ*LXP>eTCG3TF62|L` z^5W@E8z?tq4voJ=v4``-aT)nT320B%^2+6Ac{SI<=cvC3&6mKS+tX0=lP zxzhPrhMobJp(1Me7F1L%p=2>dB5x$R>3qlN+A<<5(BCgsf!~*+Mf5f$*xKeLb4HLL zb}o!lxX`4NtCJC8(8=6%)gELbft%x^rHUmL_vZ`oKVMF0 z)gn$^uXVb&I%h-{4!iOACvMc}=ssOn8Q)#drO8s{+ct($NfUzYt$s{QOczXzsY>?3 zf(1(88i|j~Ayq+w6rv-)AgsX%%Ivb#d@01i2Y!!SC?v7>9w?B*}Ev}wMiX(BI%3o(Kru|hqIYmc(x;Z2D(`|!vDesETP71PU=#N z2gA=+{x&i6P&!KZ^sKU_xuOjxgd}MD4zkzd@fCz;T0;HM@*4;81u0Lt)2XB{#>{iO z3@?6=ut4Sb6`EB&BFIwL4HyE-deV5Yh5IkD zLWTF0TM|1L6%J}NgkVWID$GkS*c#)F=y=SFSGhb_K}KA-q5+(Md|yIekULLF`Ru=SCSN!g^o_a|A}MS>A^cnHQEXXFWrPT51Q=; z#o)0qQ7<>9>fOxP{uR0p>W=)(?Y#3rt(pDHTF@|GbuaM}Yf=@RZ`F@%x%!y*^IJ67 zBzS+O&PkmOz6tqZ*0d-B+-V7;sTW{ORBmfbePtnjDtjxs9p;khGKWUeW?6 zX8^f~v``w1;DSGpP%-N@VmmKf$JS&@Adf#-LR}St@)qx9au?YnP0d=Yoojal5ArqJ z1V<3znRNzXhZ!@5SxVisO2jEn6(D#4a?TN3YiX<=>@1{}HS)6~OW>Q1Du0@@z+TZ< zFg~HK-OECVl^?daU+b){qhjA%uxR{*$jEUnWX|t@kN~ODma}fCi6_DWh5k4Jh2Boj zauwx9E$a$%G%pCZ6)(LGfJ1RSFh>~#CeDku-cm^TOu-2BLAxfNmr05hP*6zh=kZ$@ zKw#a#g1`7FhOL-gh| zmIuXu;db#E#snSQ_?VEn2;vZ!M6vaz+dC2v)AaQPhK#0o>vj?7U00cdLZ0ct$4aA= z#khc>Gakn$Y?0kgn!{fLhsYAn)ul9CAvqecd!GSfV%=%|c~&^THoua9W$2%4l5#f* z<+F-Sk@f#I8J#tRAAI5&T%L#Ay~aExC@Nn{SNd3U+@Qo@A%ToLRR5OJu}*>yFhmgC zu7J^DL!T_COqt)kwieYp-&6XTnsFk&hR|hT#PC^yP=ygB6czvc@7@zrU1_J)9VmG3 z0oTNbhL4egktG$VH{$Zpb`SsW%qzUZVN2IpTTFu8yf2+RMFnqVsO83wk~ceGhwoS6 z5-dThso|Lt2J7i|ii|nuu`y&>O#LbLZ+yaUg8R4Juj|?@BM77|;;2XFGlzW$lmbc- z3@l#uSX{0sN#HZtlzt=68zF*|4cu%Wfm@Iy`&`QXBi}2oP2>0Gh9m;d>Z7fffF-w` zFhgvQv4gWwvz?c4(b;$2+6pXq|vbre zTU(D9go#+N4`|(yRjhs)mb`9AMdB&4jiyfq!<+6$6S3pY_}pt)2!xM2;I#YO^SNE~ zj48T+>5i0)ma{jb;h#v-zzmd+e?8EXm^gZa?p-7pzMeA9l|-UKwI*4#r+{kuw$ZH$ z!y=`b#wo?{n35%A{N)?WyQ$zsw?HBpujBvKdI>GJq(9DfE-xP)zGcS%9jshUEs216!ALZ(^9lG(Uuwb0HGnD6p7rVyM&tL0*eITu_@4j`vpJ@8Q&@Er$ ze^ATrHszvI<8|T$o$E~4-pqJg+#0`6VQLVHpY0DuD#N{?(yf{Row$K}$15)ty|{WR z{SdMd!5_!4^Zq+ACHEck!mimBLG@ziO&-1pPwdO^ozp($+qsV;(=CWuijWi&GZ-g& zh8#)#xil*xUAf6E($*sf!#d9iC;PAg?jT`HbNT0rC$Sk7G1P4v0y#8Y5O7w-zU}P# z5Iy^tiE~Z52SlyV3eE6KS2N`U@^HqsxvZ*cSn9C*d5LPuvH=mh?PzyYlf##{444gv zPY-)uNqm>pd2_Y{1A^J;cvr&dH-Z!jhSiPE}^E7XaDaf+n zrO#rtG;8mdUL+5U*E26R_y}D%oh|&e71G)v;A1pSpWvYf8@5sT5f3x=;q#o3;zQaa zyIr6umb+XH7{o(HqGaMbJO9sgb&3%28P~^kXz{emP5+;Dr|<9doGb^cA>;bf?+VMa zFnDQ=sR}J6Emn5JUt^+@Sq9y6_F@OevPKx4SpgAwh`!Fps@06SJd#NF)?-2GS>7sr z?o86_ae}587WshdAq+|OwkRfh)pV)QdJ8-w^{1jDB!eF+MwxDN(y2LCbct2HoEK*S z`mX)~%%G&msNAG%sbLz^=^3d*nif43K1oJ5b8GsO;3Q1)y5Igrj5s`@Up|VF{0et| zLQ~hz+?#cat4)f1>Rm0HrSfO3p+hJ)Kyve)l5Mqu^fS*G9T6v*f{U{wVp~Rn-x0K; zsr&n@gLx^#q-wGkgqOT*?DIJ^@Jx{g7T>0x>n~wb@|YUAI|8;-VwaH@f0+k{QyhT% zbzg_*#Ow&HTvL_EVq#QTnSaX1k%n4S?MbyUBTrr8hVH%PGRuyT_IBo#g2JlhfQEmS z!|gcN%W6xUKPG`&Ct2F_@a;^!*NHu$-tBWM8~=|ppi-feE*DrXBv!fetcB$^ch6%Z z@aJw8HpAky_?!{_)X4>Fol0~S9a$&k#1lR1BlKme(s=pW;&S| zK@kNN`&ZrEy@>4=*k$7{}WcfDtZ#x^rlJbXxvy1;8)A*+bCM+CR}} zOkq0Pj#@;O<}~4;QRgp`1~$zEcL5gobr6aL$D{Rn&6Jdsp^V0T?DGuoS$_wW=yg+o ziX@`4vLFcL!4um3v9^6<&)TUI@J67#OR_kkSnlR7<2^>pjpmO-*QwN5^V^>g9hr zr^R|t&hsB5{%`GdtBY-&O_amIyoc1}}Y_B2($Q*x^75*n5e6^!EZlQtLj6-Nj3ByB0!L28fn*z?1 ziLuNWLCn|T`_Tm!xdowX$COmvEFEJUv<_4(x6p+=b^CtAD8WxZteikUldR% zH#nta-*ez(G;H9eu&C1c%emS)c2}K-HqUE9 zQ0N1$IbCecs z#60zL^FP{Rh<}A9JI63x3LO7?x{V(b%qu(lgK7&}IWO?PkHx`~G?P;|uZDEcdrb+e z`$6BRO5{E;OD>Om*5;T|XiV$x)3Z&@O4Avp$fN)DAlVhO_b*b|-p=~%dJ=qEl4Fvw zj7#2q6`A<6eyffQqHuScFz5o+&`N8!yMHrhnYFT3jj@>A7Vu3>wZU9p%aSoady(Tr z58RP#q|U@`^o1=E|7%f)Xxg&3Cr;mEVTct)hC(w2`^mJw*qJK5)-^tE*5cAJcSxv! z_7m$xrB9Y4CAWTzL%!H@P0al{t-6oCnv>i$22M-Xk!CM*?H77EY2!X&)#DKi_Q^L`72k$@M+EAp~*gk2nyZv#CytEFe}6l4xO zyt5OO<0@V!;dAbOZpat^H7R5_~}p>+uOVah8I?s&V?FGv60j|Na~QO z_QzNv{@Eb42dcz-S+8|RLx^@j|7LksripS>rWT@PRW)E!0>aAy*X=3Lob1^j0QxUB zjb7S(jMeqiv$309u@jFrZXkoKEtU6&nkpIcE6yz>^o+UaxX~3n$0a{)>J!GpTHtsb z=G~-I7w-k1u3z6jW%tDh(Pa}2`knN_Uk&o$EPaki-p-fq6GX+cfn|bi+dk|1_C9Nb zF+lf^gf`=C+_FJvFq4L3?TEcPK3<4i&htW^O!=THyjE4jUcEZ?p3I2NZbh-izP3zF zcV_9{(@vyYGm(FgZUtaJh>YgVE&*sGrveq%q4ko6>wagM7W;vH>C*Isp?cnM(&0Eo zTwWf;b18xUa-LZB_?u|Yl;N5>N2~F`5*C*lD;l2WbWWJyNz3jV_&`y`y7`W0yiC#O zYF~}aG2Nlnq4PSd3V%$bn7ZZV898{4R}kh5MTGtO9(^*V-l;9|IhefiJ({{2%~J&p z#t&lWof>Mf)5R@cJ}-LY=2yh3MXD}*_>`F0Fqaysk_*omZ0n3;H(7LzcbkTp&oX^} z!T*m~&>8|Bi%Au}h-mm2n9TvCV3ZoAG!~@R{>gZqNoS9IuYz=Z*Q-k39hzSj z9yMNF{BO{7>M2k6MeD*_Ry0+34`>`Vd#B!Hlb}G{W)xMjr+uDhm_nIuzX#J6!xreKM_a422Zpx?jb%Q9eN=0~3 zJX&2esEehg!z8~@6I~HxTiap>G}(VPpt9bekMfpOBIy0?0Up0E(kSr1_hlSj4N|-o zbLS<+t&nD1Hv)I_d{0}t23MJE--pn%WiTyb;`R(ET=c;C1TrH}R_#3Cyio2W4k;uiA&^7m97vIrz&CK1yG^j@4{*EkSvWzIF&5>=KXsy z&qbqZ9oF>+SmZuI?(XR6;BV$2pK!1}$!ZBgT?=T~(X{Vd=qM}=nf}dyAQ-#n1_qKkcl8RVuW#tq84-HbU z%d1oYZMNU2bSR zEogL_;jQ*+*i@Qfpe6SmaV9Ae0j5awb#TS-TMD=73ZV>yDr8;(NUeXQ136@^EO~Ls z9=~HzZ+M!sm@R(7|2O5xP+4Pl{L>3?nh?xdWjyLJMRqp8_0=qY0Q(kI+DqSpGpZWl zs|{H+=SCaSXLkRlS~DePYdFKI@-}A3?R*bTPfz!k5+TJ9k5x7lQ}|3pgXM7JahvaX zrw*g<`5a&dhJ);51|HO=Yps%t$&2OEBn`?#wYA4J)qb(sSO6+m8;4<`44=i_7U}wa znahLJ_5*fLlnI(ZzWKF4)D=AbH9D@tp^4Bx;`^{^AYi0oMZqK^W$Vd1)oI}&z1rrx zedM!;bv|veD@^u@*d6d^-;D`qJtlb(cP#GL!q0}mz8{2iE(;HrXa>i}Eg+W&%VgRp z)09{gi`}9mYR~ZF6(?bMN!Kh1-2a!X6|@{6crOB9BUCq0T<+4OHSut3tA3QXfFbgZ z%E2$+J&wi;96m{EX@#SlL6n_81s7DNue-Ubh&Y^p$&aY3Z|tM^xF!eQzad zU-FLUxI`FvM}Qa2G1Jv9leZWT0W>QVdT-*j@*TB=y?MF%iRotpCm45yC1xm&z2+Lv zTE#BSpin$VhWGwJ-=x$xDZ$JlZnz&Xh$=70G0$uONoY0T_qi_AS4E6otX9Xs_o|m& zm9hWTp4j9c)j~5t&Ybsd%AkKUlpa2dy{;6=Vkwf20{qR^?M9o6xC?58=)i*)ZS*%# z&%&M^YToeLYq+LMw8SvpmgHoH9kB&oFJ_r7J(?0Rvw>@DZo zOOf3$#ao4ut*HXjl&#fY7V4X*L^muL?B&C3dBj9T>+sw<#hQ6)8O5bzFAY9xFi3k; zEQqA3a(meyAB;ds>>4i)BN-!^&Y#d3d*$)nklsExIM@m~7Mpg@)`*+uicC8~h1{_m zw+5Ql-Szw!2h4xiB53%Nvp$=s@A#QciP#uGC?>s_%V;?P2ax|}e)res7sN2ty&RjK zbamfyHaL>3S`w#bjN&VEqL^F``D*%H;|;3t_7(abC&O`!Pc$i`fll4>;YTmCebbYl zKfGYmK^KzJx<1d0?!+f*8WO2=TVuK)<5~d|>IITg+fq?N{M7B#G4c>m1cUnoo20^- zz}cbe-u2#RVzsZ49r=lbjZx6W^B2>ntqz1u!(4}ZzvN$Iu+Ghs0;#<5<_)uJ=(8;r z`S1iRRjNR-e&(oJo%yK5vJAP;@hDi**--Ao*WWJd-_KA@F+>i_w##+mO7gTw;dt2h zhG4;}rEgtN(K*Vftv*nVRR0U=-7InTddXOsezxTgYvSO%rJ$~bk@!f%BMEuQo^T64 zYUABMKd{BM-Z_le^l)F64Vs)O6PdGp&EUzyNpv|-*fXw3-H9`NBK7_zbzskb{GMO) zBoykRizrp=6vizYdqs03M-q!+;tSc8L(|ha1zNcwiC(o^mGRp7tpm0js#*!lZJSz4~uwo=jt<(%+>a#Z+I^Rq20~f<*#!3ki z$!uOlZxJIQCUxI2M$?J#Dl(J->;$eWqhv^uWq9a@b10Mnm;?mp6TIS?YA$*-{2dsM7GUWRFf=Wf4B1#dG6~y;l?sg_>A$jj6of4T| zD*pT-Kh}RfsrPeN@CIg+Y2g$VW2gY&3)=&p*mnv&k<|FGC%&TM#A%rGI&C}$m5p*o zD>8DYY!RQ1{y07Fs{6D4xFqh8yeRv$xVkiRS_uEp`)3^3#6+SY@VxvXYf7wFd2OL& zVJf{9_h+K9I|?#=#0j*!3wuAj94Y9bGMabdndbkj*H+lZS1WqS$-@q>gC=y`_sANP zSH?px4iPsx27AqtG!lFzRp5e?2c7%3+2n`|9Ec%ZcwAk|`qomc=x`KddQW2ksQL{k z(ku6>mu}a%AZ2E-IWLqCs(Isk!)DclsGQojR=`}%@~XovL)4aUH0jv)pg;GSTx>!( zRs)&lKaFax%s4P8%I5f^#W{>}hHd8JD1RE<1jipjf;#&OfX6~ecNZL zf68kStz-8b$kmubJeJfH3P_;BsV&iW#oI`k?h%co+4#SRm4nHnv!>`heuOcRt>RT+ zZ1nwreOsdO9Iy8u1_rsXujuzhpVE~RjU{(7NW}7yuz36g^izompZ_SVQ5~Qr9|Ha4 zMxkRFN#rlgmPUsLbj=#1%87efyfXmL#9}e__xlC014PfIf%}Kcb?;8@L$F_PaX2x= z?%NN){%t+-E1zYkPXzMj^B`q`8-BOxPAG{}vvhz7&1)8KU9-icS^%miUzpBkA1Qr@ zhv)g-rx)_*BFV;U&v9+as!);O1XV^NSyvQE#an`g%>ajZe+fSSBHkEHzZ;Vjj9m2YK99bWZgbI)H}CUX}yZYvM)x zW0?l33uJf74{N)<&h)fTM=DpM=eG3r@9lrd+J8e~)Gnxgz#qad;y14Y?lMV7+QA5p zm^tAt9=&4xuxgs8#e6YdW1>byL)UR0x#tb%9pk$roH%}&fPin@JUz73)0ec*ea+Hf4yGN2kD_Ze(c86t>BBi8>WBv zK@19yG6LyGdf=Mf7&?0JBO7yD(=lvK8Fc*O!&1ZZLE*TLs}&ov4fLWg(wk_bEy=c2 zhCHla{Rnx8r}7{kpp6x_w=JzPh-!tG5;M8$^(@hWRk8pQaQjjM8oSL z*@<{Zn+K{7^hzGd0ADKq_y9_EvTvkRC#hajSyNsq9{i{bV_lfCGz~8=;!9;uI!Br* z)gPkgI#WA{H?RIkX{fxZJy6&~?3F~&lHODoNpH52*xSFi|D|sK{MUw0TOZiBJNUyz zIA9u<4)mirVwxZR@|V9nrE>sI7{-f3)!mZ>l*12Bn^nGE>FB_*6=wJJMvj~^MBgrE zHwP3zh))_bg~1AsZX6vgKc^mixLUEgr&s7f=b#~ZOkZADy$t$Mz7dB-YtbHoDi40R zj+>qIIti2a4>v?Zl`-0Zp3eHl$tvQM=qZeEuEKSpFq}gkY)*QS?m#TF{+#qjI+PFX zo<`*qD`em|w@BMW8&4VkzMN5x?40UP|BDZJL4ubPE7wjBnl53sqMJll$0%K_XASY9 zp{U4XO7yX;I$IHKykV0a0@Z0MSCUQj1#~PgeHnpYY$uxDja-KjbqcY4^?7G{^fxWC zGv$fOB+Bf|pTdZSdUokHvlS8?TZcWf1?`8A!>5AmF~J+CPZPmd$#Md^s1t|cAkCu#V#q+{{hXt+#9 zvyHcio6$k?qA+O-o=)0C$y+VuOIqz(>Y?PJ(rlyIgzF?_Xyr+Hro2kKY1iDQbWQT4 z%`{!PZi~$T*9ZA2}Uwth}LH>A74fkMooUmkmRn zYw4~0Sp1|tM1d#suGvDV6hs@ew6Zc8WwtF(T%MFE^I()^;I!Nhv3_k!r!?}8me&ER zJY=4&`o-z3{AJ2B$=fPRrMy)eXh&HtmMyG$s_CqR2N`a)b8r9N{#U5|hj^{N+`r>! zw&sbet<#yES!Tj;UR~W^xN4f&y{Q9bVr%D?cv|t-q#AZjv~*3|`cN3js<@uv>iB=f z&*cs@hQ3n9%n-deXXM*?im-mc8`HDm;gP;!VKY1DaGNro4W|+MG~ud!X**KNQ^R>N z8%RAWsk7ieqbm<1kw)1D&CaBAn5|PPv~rPkO|1N{l=9UGlONO^(H_sKRP>w4H; zx3<;AYWp^_LDnrLpQf(DmW*VU2Z;-!y^E=T%-O?bP3rI=`(nu|^Al)5HBg@j=4X@vS z;+=EmO#C!w=FXkxdG4Kw1 z9R-C^^nVpqK7-%v-z2KLmZB_5^*GJmzX6)9jG7DzN?jt(qxl;Y6ytS}oXlq*)FYVF zpwo~iUCRwL@IhPeM%e*W$5(ZbP)BTE%%3drY!2eDBiW>k@ewK$W(X1F<1@oRmo*d5 zqR+TsmJ8mF63nCAnc(B=o}`nNm181FT{up7gUZezUreGp;6Ov&r$?_R;^etr;qSFy zu00V1H?gg{U)X7P>7>8<^NE=O#xapCq(}R`kXe>EkEP!n6do&;wM`y;MoxZ%axUZZm5cpJ6?c8aae>`0 z>!bidK+E2u1S6LO*7{p5)cA2&59t`=?-j}^a|iiW0Nd~x;QHy|E8C*beoKhPhNVE9#iII`)AVlm zw&MooVzIz3c@_gWu6bIj*^o35Oz@N3pqsFI)-^C`L5ul*)hA&B@{+A^ic|?7VF1Tv zUnt{`6r3iD#F$yP^T(hSZO64>)Jfi~xKlqO2sT()B17zEexD5l9S&IdGsVfDB1D2O zL_~a^2ZA35nDfIj-4ZW-@VkMTOaYO7J^}srTqXiAjDyVH0;L5On-2Eu(4ti0W*(tb zf2$TVvoQARkHH>KUEREZ*>_Ny7<76;w~0a4*D{O&*uCf$F`avP@`?zYvqM3PaA>fflN9w4ScfcYKo;2ZBviQ$L87*d$sc}aRLc^7gf?|9P%Bi7Z1MM~d# zQfet?o&c!IymJ8!&WhlpSxIInbgrK~CN}?I?H%=pH}QzY0&68=UMNKr7%WJPhKV7U zRvqPka~v2=5=D4-V+&jg}znzldLmJ=y2~hum*Gq`?wwF}WnUtKRi^+wM4wGo2}K3jb_j@E zo*Sg(B<>Dws3BIoZjjFL$j5jU3S}l z6pq|?-tSku?wOR4xnx}9styUepaM&M6v3o-!ePR|*s+2*jo!Q#1kw1>$z++{+mKwH zxTNWWx4-Nob2VD((jr*d$x>S=G{9yY2Pq`UucOxSL~)?i+tm!Xt`nEkSi+B?(aflC zelREFF-Q|yGJJX*Kar7L`|ra=6pkBTaZz5Zw*p0o?YYS-Uq(|^3Tp!{>Rc{ex1?Zb#xG%Y@#1%djD47o zTH$}?xbTY3!al9Bz}0#LvGj?h+tIszC^LLs2{Ze8x}iY4vi_J%553Ey7IBtvKbRL3 zp%1*wa@zfx==5O%jmQ6DiEl;jQL#I4_=u(oXn)$z#PTyU)tM@VpS0@x3*1Z_Z(fPPv)4y=&MbGZ%-?3j@N^?#vN+{uPpOl9y#qjVj@yU zv=6(=NSAC$stus;@?-a%NQ$CUM^0%i#2vySdt<`#@<>K}H0rFB5SCh$d6W=IVSH{Z zgK)flfm0=JGeKpe6J^U%Gr5t-HTe7+QPBUOhfYp>}h9-0?*T?j*!IB;TNdhKwST^vmItClF%W5As|g(Ei1eZVeR;wO-nb4v`}sVZ zC<$E*U~p|CKze)nL*qCm_VWW5T8b38NHp3;eo6CRfx%lG8S33roCD5G&B4kc7h z`1?looC%#eJc8Sv&Q~99Odp%Qj|28*UXc0i;GOZ@+st~gzPIJjH z7%$#u3J5{+O9I4a2u<|gT`Lav$1p3tB|(~phmdTNXJfejl^)bYe_WTkpE7zm%731r z4?JILB*3^kFCwH?7?Z&o!^4v`m|yc{n^Du2gk1$VJet(g320OVQ6@;u;vR5}qq|4h z`)$u#CI(*WCe4^Wa|XY$7{&<(zdYmc25wUGKKAZN-eAj-f?Y<{Qq;wRR051t`%B(2 zv0c=qd~Va~$cPng`$ZE~n{UufupqKjr5=A8= zyDWLJ+vu3z`rJ#Bf1k|Y7qD6Laz*|!^YoDa;BESH?-IN(60})CdRO*c1MKyfVLzw+ zjUX_=rxgxXdN>nyQd+t_ht3>M9}`3 zBHf*SQiPPy2%TX7AJXDU{CQUtv1wzyn+jQREOSU^E^4BdqvZxO|fzwf-!sJlS%Gf34L!%lasn&fRJ98?$Z#c$iff9 zeQyqJY?TB&l**PcsWF|VwV*so18}nhbj1psxdc3J()$ghYCOjmC_L0w8nf838rrFU zVXsk?U+DjmM z&lYX-zu1Wqn`2Lu4 z5m6OHx6ibgl2j&Eys{LgA7P^I$z{Ye*={W$r(d5oN2dfr`LZY)Y8}9v4;F6V`-epIBT8|s808u>GO&& zdEmJ`{!rJ}Z!-K`L|Zu546g61#Nd$HP7=%q`p1XhmyzI$Skp%@!jE**=Y$BQdVFI- z;VlR7exu5^8XC8?HC4zaT{zCs8@=mOf>g;zHj4!K%eHOs^^6F;|Kab~qUW`w%EI$KEgVH!r!J7l0LPXIP&xc6fYD5vfcqq5HW5JGaQ^A29_Hf7O5F-E@Q$ zK!?dMhp4Mh%@H>$!Os)H>ja%oM=x;MqYqY?em5UfLO*mzG6HuIKwpyKUk8TCmZyL^ z`A7B`w7M8gYob-3Z8sBccMV;3it8=QJMjmVQ1T^+zRB>&HxeOc(`UVxGpXmBmrbb$ z+fLp_Mh%Ip&yQ-~IiyvLps@-^3cr~4OV#REiuz5IEc(xdTLeXgV<^KP|8|9qNj>f5 zKUciWeOx=6sB!v0Pd6Pqaat`rxr=`@T>3p*p<)vVH|ppN>OYv;;Lo1)49LodkdN3% zR5s9EHj|v+B21Vfochn6=mT~>cAhWOzucNeEMS$O*r7Er=|(VXr+G<|V(ng7l}RTT z{45De9n3=g%yMM5#_}=lR?*@)fBmMz$n+7({&MoO+Vtg+jq=qHq_Sg8$6_I@XY3l` z80zq5#9+ovfT=&U<@Nx^{=$WxWQl#BrT8cN54RQO2cyy!{8-EUC-VG9WX)rZ)FrTa zx<8_>jtd-_ zUZ3FWH&wRK4aZLKh-powmWkhP!|+f%T}cC!PlKjze`ibE0RuFuYdaioR-!rd&2;}W zkW?n`uB*A@3g=}f@p;z?G^=0pXX#DV^|ZJX3(@eADV;KnUtLAG1^TqiC}9s;wC_bQ znnln_m67SfAT4zOv*ttlY@v}@ETlPzy}}aS)EH+; zRNk@+hT*tgU3(ik?{dPj(zc{v=E5S8k#484U!_)?+#Z0 zE^sDFJ?uQM7(J^Hx|i(+@x0-&>?@~z$JjgYS4> zXt{XT&l0@lRxg*=uA9#OoogbZ)LIFn^UA36ZS!7y7FaDASW`|iD+2Vvuxc^@_D(b4!vm*quqi32+X_ZqD2D1O4C_x+!_2bcX#Lo$$Xggf0w^gz3F#WfPw4 zvFF_$+P)x6+ta=Jh!f# z6d|8-bi*gCFlKfGF}zyKd6i#^lQ5bGFWQc-yJm*Z zSES_+FnFxOL`~Qm_ccc-+Wq`48HasFHWPz|7DrDQkDNi82LKOMnd|W{Z75&5WL=}? zW*gle|Cqe_i4M^INsBI31u2dEoi3(_--u@YG~ZsqHE{5iE^2nK-Rn}J$C!PrZ)~ng zNEu0p=*h>n5R9&lW4xBFMxTyBQxmw9rWJa-jM7LQClE_rLSP$1^Y8}WK!2r#_1RFh zpJn*{z-Ch8RjtA+PE$%LIF`e?&GY$07@Wfc(8yfS^PlW)n;Vu`m=HrQ=v*~B6>&YX z#B8S!YV&$0R>`|@mvLb#HiGoOZ*dV2NohRBZOm2Rn3esQV0=b`=5ie++(E=eV2`Mp zT#8&zkm7Eq%P&!wnRCWoAsK}YRP$@0HOe%)ZBH(=#gJPZ=kRTd;-ujR&`vZi=tZ2L zq$T0YXQi8#6yx%!Qr+Vu9Jreyv`vn?xxuP;+8^E!aZ9?FhL0b&K|yNvGK4}>igjF>;tTzX_ z!@uZ^d-+Q20NY(+<=&N>_D|>>szYDYQoRHdGsd;(A>(;51f!>&vEu_lu5M>+kWHWC z(SNEnl!P^&x$@9q^8k-vl+xh~v$EP+w#d>Y9$S=G74Pt|Y$CYSbuMI-<8^>YXoI8m z<@6xa=7Aq*ygYf+icYymlSkECGWJiq_vGDHhrDy%-#ImYcF*oE3yXKFd`63g0++^G z=Qq?RSsZbSDFY8~HL?L%cOP}sg)-9LMa_Y2V>xHRVlGzp93tep%-~tq{tOSYF5hsM zl4LiBOpv{t;1U*1wsVSoJ=gdYbLS`~Nw-}ZS~{)qN_OUZHuC#7l|qd)KTA_*U7^H=0P&ew{H}m%O(wbA<}1$p z1EG=x_Je{MKhMEAjnechBn%~;;FHp15AlA$!~p(tfM=6O2p|h0u4JsZ zoHB|!BeSpx(tSN&@L?@G08CrNlA`b1=tU^u;Hz4irh%utK7eYyEA8l>S-+!XaA<2` z4^T*U6HheEaUo}q_!MwZG;;mkkol(Z&;2dyc)jlIJ2$EdXGg0At+je?7~>iuz~tvp ze9pXQwR1^;hkj4HeBR0%5sdq?-T8?0Op4zix_%|;$o}G_pd3AOyqghWoA|*x^lZm1 zu}=r52PNfIiE;@P?!ZG@UpD>hq?8E{o>YfM~Z~%pE~q+ z75_{PcW@>&xz#YTR5*3?-O=ZmLn(u$c<ftNsccLV*^D43hd{eXd$CavV_Cjjm4Sp@f|a;{ z4ng?<)2%$WAZ!&eI3I{-6*Z_9fJsb8G|w=QoTX76=AS!^Q&X;@VpJv|%2B*1 z@Mp6g#$|k=slSBh8)uOG!$yFqa1%mR%aUlY!tQPQ%P793@S^(YwB$4!@*`?Hec`Y?-@hCZ4vtAcsbD7onOu(hh)vXr+&T*q6Y# zuVGim`F$4P4F+eqE#Vlz5o>SqD{2&EK+nS1`n( z!}U4hVtE`*`h8GuBq63T7lysFO#R67DSMBdGX+LYr{fNEC{)%dOE}l&za(f?y@Nuv zHN~jn<{R3*R62K+bzPhU@j2y|v3O(3?V?jsEXD0z`Trs3O}E-j;|UTM(Dsw-^zUtt z%}iL+G@d%m!5tq5!E={MFS7&;~ZhIVG>1weqqKiA546fRm~`m?;5A*;#aiIBKZ>GZH%pk2c%H}k*P9^+1|`tzYOEy&T$UL`V5X%tsU zvS0^O{~lkUq2L>?EfF4UKt}?Yaaqvmb=r`d#$+2s_V-;B@%I0<#$1@J=@f}~ z#pi><5*PfM+Oj4i?K5Lbe|rj>t-vx|Bc}JD!IFB9fvf$MZ`ne^xjn?f9=WjdDt!H! zj{5&%QN_N}83MT~TNW0q6LEA2xG|c$K6PYqas*!qGg|*yO0;ydtjJl3Hgk&`E*w8J zYqW>83@|wJzAPoI8e)I~qP~IgXi-vS2PcWa=JIVz495O=*qeOk8tOKPEUOG+n z{Erk@X~E!2u9AweW#yty*qgWbhScc1znnm@0LQiWyesRRu$q%2(u7n$)SYONT$F^U*MT3Y?olbHdMrh}7eO*C2rc&_P5 z4j(CQdH(}|f#pFN{u|b;kzC*vEpTwG5rko82kGW(x?HZZH6K1?D@(zbr?*4PVFlrc-2gxxV_HQ?SJlHUHhJPjkqB(Lmsm3q0A1<&1lZnJRmzAA(EE z9s!_q8zWSh1Ak~!H&)v}wB|{Mhnnf9uNCk>qMQ-y0ab=4ELyKmyvhj(`;0;Wf zNATXqy+ZBjRcMw_zzpB&o)(fJD)P4iU09q%L{cI7+xJ6YV%@|!v{ESq)v^9B#W8mf zg9&@t9)+0HohnJdR`^i7Hez4*F?(DG$3>1Of`cWhfS;*>W|}w3b-o2Meku9Bkp_)D z;_oDf<@r;OHWAKsVB`pTWgQ#Lnl-#Oe)$MfX7^yprHuS$GV?F^n7N62L? zh>`4+j{}+4jXV|aKBX4y(OD+?JIRMDQ+k;*dr4g4Lw94hH7}4mKnX5O2N+GBt5@~% zZ2510S@v~zf3^KZ`6S&sh64I{^%3`@zkjy=SK!PBKsst?&fz1>6i3~Lk0X4arS7E_ zQnrN+sFNEo5pX@Asf)KQ^HPAr(wkxD0~ z%Rng1JmWrX!u_?)+wSEpMVpP?2-(&6OQ{&Gh!9j+fa=M9> zwoBU4qeVug7zA`?7NXoH^$L-xZo(Vsm`rfSN`mx?s3@(ULqyFw9c-@-?g`!0G74){ zeDy61WAtG}O_77{XPK@?20Q&Doy%n%0i-ss}CDw;{pgU!iTsXWgXuYhT}88$2#Qzzuyc{I842$M~yC zL(kt}A77^!E@(p(VOgaS$A1(70DkgLxyLHpf@=e{s2ck=W&GCn1Ye@!246SQ;ytEj zFq^1Q2Wre{ve*rB+3y)qeTzG*k&n#iggWAs#FUbuik}tD4z;(dtc?5usmk?>7d|f+nf5vJIhtEmv6T6Ffi&h!$XlMx;GHqB$ZqHDx;4omwJ?{@zmdSb zWc+OZH<1bVWm1c8;Dmy9Y! z-zP0e9?JGHoFLsa`0s)`()Yns%!W_Ckuz5Ul%c5ghc5fMue)1Wyd`MkbVYV#Qk&DI z8Q&KAs4~IA2q$#ssma)J+zR0Cp_fGpU!8Zvc%Q(GN}XKRJ0u3Wr3eMTgv5_8HCHtC zxGaUf?U|Vx{5@FL{L>Y$&bJ4e!LA};1|mKEBpBl4D{@ez@s>pF#AG{FC7-&=VLDw* zTHWfRH*4PGs{^l3Ys4=KCJeT3{cMY{SM?ut!(Dd!ij#f@*g!$Y*2)_u9b~B0TT7}& z-#gf<*~W#h>bk|p`@s&--|!H}^%3Qtoz24a`vKy`;^BJL6bur#kff^-My{L&Gv`>E zlEgfJlbJy}I2WF^W3)=o!6#kc^N!vS_&0$yyUC?~)?==b`fW72I{!0I<5ioU^GcVT zx|G90#bb`*v7n=ktDa0o<-98xA;4-2Ouy(-{F4Q!_&y5tNI^l%s zl2l@S_so6J<+k>{0kDnc4Q*w`nuZ>-+_ws?91K}i$7Q%;B^FvK=pSLGwRK?qO0SsnYA*

_7Hg%4YQMd?p;shECqsG+0`zrgn2%+wB*m?mH(BYAtIb z^&8?QfdsWp-#M*yW^pbe74BrYdyHZRs}i^R&hqvI3|oG&nxt=2&?Wm%;ueSJ(0r%1 z7EflpNdWjXm=!n9dbM%AuR3ZdqC|no<-yv^W~pYug&E?PzsahPVX<@ul{@oSR5VL_ z4wFkmhHK@$wN&74DK3Pjj_L%6)kwTnOz5Yl4*SvbQ}vAY*g=H;U99aoG8E{=5`LO$6O#7DeUC>l&QV&}h_yd3~` z@2NxDIzl3LSajbhdYH6`P?oXc@&;Gb&Hu;{rMRg~CK+>x^rxM0@INs~Fh`1&v9A@^ z)?&l(QvR5r9W5=&>Jp66$#}O4sb^nJlG#oJGvN&LpGxxQf|87V?3K8;w($0J+p}wF zlxdg0xkPNWI2^b6Fog({pIP~T@ltC$9H6zA{nkj}+||vtDAepu-M=-75}#Ttqq_{| zTG^W)G!W+P)Jq-3C?{gaXT^U~9cdA^|7pJ}XkfAjoqI09f4^SzIRT<^{NQs#_L(L} zJKEGwJ*DHwYl{8Xj~fARfDkN^?e)tp1SpmrBj9m#+7Fq)vyFhPY^HG9OkngNK393x zDhPh*r_xVVC74GhpI8SL0hekb4a!9quDDP5qr$#CJ4EfEu|-_!_xyWe#NMTYj;w0f z)bJRa2pw@4GpstZlVu=q>|P>R_vGrUT)AHZ(H%C=XF+A-!pHo3LD zQaRY;Q_cPx=uth(GZi#0jEELFxN1=tiOW8N5iGqLn*+O5ip_SXf*hlluv7OOT7s(s z4t)38cFg8DzoY_jPKt;^*qYgOoLqhIz3@X7CjN{PZ{(1!bp-l{E{#hZEX$55HX>V% z>E_FlVohcDfU|LECAO@|DkPcedYmcxat`S_JtbG(XL$yLeUK~gdDpZ^5EMj)n{ho! z_aW#@sT~hChOeLb8;7=*gXIU5MhYAR$eu#7_&?5xmEV?w7g>qT5J>wq+nmYMJYNzG z7y4$&2!FO#6zLfw_*7pcu%95Sy76L})vn&XlGH*o!Wp;LjcB{*qL>dpC~O|U!D$lH zR=Jh!`04&rBeQJ$?T^iEM050OlRNHQ)opDcQkc2i0+Z$`Oo%YJF{G1ktSp;U!7M#V z`M+J%#=BjMxzg*1MsXXp^Y#YamNZ`X`0ugWVJk^I7ZY=H-;5lXb9wZdQ=&_IuDnkt zQ-bk+)^IV~0|;xI(NjLoj|rU8?_Dt5$>@t~IO8(yj1&K5JWt1{iObgf5s~RmTlHDw z$xW!sC#TM)VaSuvQET-cj|+)uB0$=2-4a*SQ~6-MfR_9k8`Jrr=-!9iNs`L<{Sr{{ zhY)?ll6tGq7n=CPz=EazUm-VL4v|P<{TU*UKr0^=KhFFdpAtnF*|^b#bGBX8&Kj)R zh}BN=8;Eh+tyqFs#2oOQgX;Do?rk)UF-Oi(p}`alh9e^;Z#+BwHs*x#?~L874>vr* zMRHC)BX&$1o~|ctgI@nt{ls`uQ?BnMK~H|2Doe=U_vKfzk;u?E(IWHiazZ~yUq2=Y z;D8CuNa8v^#?uq)cp`o{a|ER5=*Dc$F~M!3wku*d251}K>5SB=lo5?si8D)*>!J|z zvqgxDmhHu*o9mC$Boobfp@<6kX`~erJiP<(XgT~fR-B@5j`-;4)=%=$&p0|LqCQXEvgATOIURT*dh2+}WeF(N(^SPn*jj(Wajm&&tg5wX_RG(5E5c7i z?7@6<^b?*!MS*gH+W)0R;5r@cES2cOzPPs;G8xa9aqp?@8H##TJub>hpEnEFP}TLn zXJ&U!-(S*7P<82z7)&1Lh$G80=BNxQiBdpl(wXokc=jM&^)7|BU@t~^;?)^YfbD)tTJCbA)bJYk8WBwMS%n(w$p2e8Ut=Ed1dN z)%+zC4&P2c_#`}9$X5Nv(ZpiTTwlx)&5j^2MJI%+1?Z+A# zrC%7`W#3L-8+%or!t)v3guc=@k#C{od!OmT5*)+vpsr^`R%_?*c6Gc;Y6Z!jnmJc@ z8d?*XGLo8j0`c;e*xPexf~gxfyRP>8;1st@*t5<=R(`+-(?s?GB~^jk*5|)9&-?Mx z-pdT&|H5eSM9h{wOxS*Zr)ai^i!kD^H6$uDiN+k?vEoA>cEzODE;Kd?@sHeO0S*4A zz4#~4IR)+$jsvzALxv0IT=q1%x)txixOd`~Z!U!G0A`_C*OiT!6}H6cE5mNMAnF;ZNgtAX zBi^cvbkTA)I<#r>1YQJKAGeq66gxC4VuA!6dIcW{551)t)7l+vpD&q zu9e2u*6;)yv%mBJ4}3EI?MNQV32GA~Q5XBNN|~6RGzAL0FTtF_iG%Kla1ocGKJJM0 zyt-#jXze0C2RA^-yHXli01h2lqZ>_^<@r@i%X#toG6N~?vS7q<89jO5SRiF%pJKjx z@Mzer@{TC?t#&6QhXKx4W}KC>SA6?-59N@K3$h`CM+8c15zh&kUN=ZF00kPN)A)P2^KyPG;>K3Z87 zlG=48JTuo0&%WX5Vsd5#OM5C}Jj~W=Zn8!D)>v#$4H7Q}kO~Mj(9F$y31{Y*Ye&Ix zX9Nx>iR8BHG8Vwbzu1CQTHrw@tHLDq@*~CbVVXQ-x&>P(Rjd=Bsb<Wuph+#)i42R*IykNFRq91Amca4slK+Pd0%tBITtOe zD~7|J^WED2PRXrE$gNSXerdc|@%0lPc(jBq7}XB&4oGq;R~svdcdp0e-;YhYXm*iQ z2(58+bNz&Ord%rn8wx`Xwia^9)<>&uTL(tdh(n$6qBx1bW5s$Irags@Yue48PE-{g z=Qo6dA1DvgWqs|E_<}fNX^fd6Oc>U74gd!5s3NmJ%?J~I?58_NqOG8wxF7$~WS&4^WP+ca0n~U)g2`p0fE(B`H#F~hK$cum z>Rh5}cNG0&xjAz1Dxl92f9;(Wacu}DyT4J>_e1J`{02gH0G(iwxwvYLUs4J; zUn}8W*vrg3UvvJslEj`wf9pW%+mCH!_r7!I8&XuQs$GYv+faR4;BszzGmv7;+VI@j z7h;IGIdAGv#Bo@ga{O-W7Y0=Ex9g`ucP^q43CV2k&OK(*{)bIizsK#l5H)3z`u)pF z{Js?!pJ^T_$6IxCW_W(efMu2aSZ@@4Pe{a~r%`h;*R)8bzqS1@K0|4?_tBR=o<@u- zc;FP-UyudVu(zO?V+9RKys5Kn@xO8YN6B6$We#f{Ew6?R)ze}j%!Zu2xhIU^A9ITy zxehiL*{6>Cv%~}6X$(E5_dLH`{WhHSI1Hsone}oN`YlRD$%G+iI(jmVbWH@3Lprdm zCB?WKXz&tcU5D?ec=Bx zQ}VkFMAm6`28K6R`gxSG`|EOxG(@hfj2x#MQ`|c!hR^Rn#hSi-;C6Gjuf*3}23g%_ z;~R0BI3WJJYvRDo7LKM7(qW6*W~?2enyqx559<_9c||zywfSQ@W2ww~frqF(&KA#K z_r4JkIcfyyX*Ze~@iTyzc&xSg06U)X0Ty%i!pc8PVlL*>7%xb_t`Y_=C)W*sStqM! z!dQ^d#fcb{*<^XKL#{-P;>EL`b$^%JLc)b}K9$;jp^}no3OIR!O%3~ZX15~6%ww?Z zeXiaIHfQ_&5-=MHS^wt&%ifY`^ad!f=W9Y1&*|j! zTd2I%x4aYMYR|6VQF|ZP7gxg%ZgGA8QcV!<9IuMKYHVpG*Ml!UMAkpS@N-bfbzSjF zvAHpDkx9&Qcy?mDm&QN;sXV>By4WQduZ^jw$u^ep=e=UdC*jaqYjY<=1WU0*G{Ms3(hQ=kpt za||o@q+Jg~OTho?`dF%IhSKGZ{3G0b`crX$>TVUK_^V=1bMSuo&r&1=$Zp2W+x>gq z%YM%vNk6V%7!r*8oh`UDSJaYa`c$MeG9J$GDRM)PsOV;-ew+Y$xG7E~$VbbU7`={z z`=)54cAc_veQT3q`;H2hz%w{7c?7u67QlVtyYX6dEG<8D; zW$>TQM|cP5UTv~q?yqA3^~BY#VJE9Fz7|_VEwiX2;zw)|2aDVLS4W}}KHou!co}st zx7YsHsuu8-U}a;;=Qm7=KR(@-bfYq12ssL!lAj1s-#Pk_3YQkTzh(}m1BI-G3hH)W zjQuas!uPC?yt7I|=9tLEav^(NOaI7o3`VYdG1_B4Jh}FpD!J%7OR)iJ3q2qR+y#pK zUFLDMSDjxG)Qv3c7LB1CamVKGQT506?H~Tk4Wt%z={dLVmv?rI{s+v!?x1s{H7}Mo zymn4e-1;p$pnCUS^-S8ID0Eb4c8Y>R^nJgl7^H9hs;x;=DB2MAhYf~o4cdvmQX5#J zeDa+^^T^>f^QZq0;F_CIOp!|G7kTQ^tmOEOhESxXRyHy5+-K=Xs{F6# zpPmgOL!)Jh_~+;?2E0`T-nBH*w0!d0U8M6{tE(r57z9bO@zcMy?JG>g@|_p4vf~My znHo*XQ1RiO$>xjzIgxL@75i?!&ESA}xbW_yG2u$z{%0R=Rfjr{;D29~Zb$eYH}02Z zrZht3C=hNeUBA`9Lx1=V!y(L{j}sZlho4}3YA)a0>;=PE%^pGO*EW@ZN*}208DB3y zLAOjLJ1NQ92%mifC|llrm1vm#6%!`Hs>wT@iN@_YDV>ztbuIGF%si)o*b%8p$bfZj zw0=LY8ZAJB7VSuU+MF7qmM|z?Y=~QrK;|`f_+#z9yBJ;`KU%V|vw47f;4flj;`gc} z6h$%VddK;UnQhD%QA0hgu(mgsgc7i5_rZxjp3f+#u|Iub9 z44W6eEyKji?YJ9r8ArpEWeq`41v9Wc3eY|ag`lSJ2`3xYis`7ET<6UZ3nM}bZjHiH z9uGb7Ic)Udb}kjENU<>aTNmFEBSa00pNV_1KF%Hhbj*P!6MIvgQpjxQgz*+z^wRYQ zB9=sc!krj1%{Z+SlQ}sh2{8H^fL{i+4Zx9)n^&yJYH4)U$318@aUqM;Ij8kGnVVvw zpd7zWK9de#YjfD;Gsw6x?ir?DuaUb1U!u5eCiZHC4$yzCH5%Gp`PFk&tA$AfG5ny} zY&XJBIZmbKZ&x0rE@6r6#>W1`p)WJTFY)qt!LLeOCm+35%R{YB^7X$%s_s)zle%<)xrWsiBRMSQA3`P9m7blDd^k+Y=rGXD0t#yV9jC_JaP=G477zLK zsa-v18Ch^1AyNIlM+nY%8p}2)VLDTa26& zQDHhH?saIu`4Btv*@hnR!T-$3XTqocH!?`YQ&c6V89$j>Ae1>P&V{H0_qD{=hm=X* zc+*GJ^VT;x`S#q3@4xqoS3p=*LlxS4=ZlKmFB2LZ85{uJhl1+ZS@c-vPA>k-seqT{o4|A|4uwr zA)DSKy|nzO)Hi?RVXEG((V6Xu-DFhPWtnHHmwyu@-VRDhyAl+q zk`f8gzh%OphB}$EE`kTcfA19kDb({Gisb?3ivR#o7YxAW&>%oT6OM)AKfSlw#ca6! z({+w)-bz-J*%<8AM_pq*Gho(%u}8Iss)giHf?M)(_Bd6c`3(B=pU<0t|Cp*ZsV|HC zq=zbq;LGEy0TWQ0lBf%s2hp+^--wSLVO*-KM$}HXhHChgbDrCD8GcRTzW{ebBv)>N z0?&QMwQF+Zp{}to?Y+H+S@dtwv~Qdd;wemk?5uE#M!gnLTI9)US$&uZl_9>UIK7yv zu@3h@9plkal|%&4P-u1!tg@~diT?fPZ-rNe`2VFHEez<)0O?=P_v+A^)DYkq)@-3j zk2W;eAa6cv9lZ!qyoa)1lt-o_5l zqLujwoWT8H5T@SP55mD$d!o;vXUy58QdzgWae}*j`(ucqi(MzC<_0OH_}W~HIO520 z0{j)`IJ&2sIYS`=7$sE1&Ff4`%B(3G-bZFIXLG4QFsE~?BMyrRX{hRPp1=joW+jA7 z1B^ic9znyXwGn}QQSd-qd?<+V3AmZ3$UK0l-uCth{K*-lsP#_|yN^0fZR>H%6TM{g z1e9jI&n%e-vv8Ory1tiJ)+rNkbF#5Vc+6*lv*$acPcYdOrdX%DS z*|WnRaPU+{h=NOsvXK2|<1~JD(B0{8JR&BNIrAcK+d4S-RiO#Ci$LE0YvMekn&^YJ zPn903)PycY=^zpU2t*7>6A+~L5~Kz~?=>J2no>h=iYOpOxGbpLYMVbIotAnSH+daO{Q-Gt6ZC(K4Yf;)CD$4%pm$40=|L32adJGj zuI#=8ncCaMt6Xa55Nv-VbXJWGNbpxlR=i-NzuuWkW{dW-i#_)*5;EJW5~|Ndm_^~$mrEnp%$tRp;^%gA@dv& z+SX$On-@fXd$;Fq`AsrRFLy6JeYymTBnxL}^j0a#Bn`-yD8*Ay4?h%I&2#8TGsA@nhbFz&763mC%41wzC65xXdhnrF0Gp3M8uCU7X{}fXUG+G(X*iv} z5C++)ZyB)pU7=~F_f^k!WLD%9C6hCFeU>z-En`@>p@}{2i55<*1KJkgvCF<7ZKqtx*gx3 zy68_VrSlvmCb3tS5p+|?v4K&0F|P>2U5x1j1YIMWO(^OW_l4=j=1>vlMuq24U30uR z!qjvcs8LESUMIf6aHpfj<#fmUBaWhP9h4sX2xNBFna9XdkA<|JzfL}u7gf3g&Zwuj z$SunxT`GD0cs5zdz@+36{a0~QcwZdeERnHKO!&Mh4|pvVqz`B-iv@o^Vg0Jb)^9#* z=REK=F;a2rog0+)M5A<7)ieE7@RlPnCs)feJMtB(cYA?g@hB?3Z~hqf^t~y62otyR zXJ4j9u&W`va6%&N`*tzZt*j9;c}t3?oST#4`_L+hVrFv{_#zdH)28VK$TOTty65-X zj$ZlEi%cGJWzq+_^w$batPda!VBna3OPp}(bshMrWeiSvSmD(s^widI^8{C>pB~pw zj0koJm_n8$fia|=dxwDO>C#6Pe*;BoSETK|Rdzk^wwul!tb_S(L=V|3=1~evoj2-V zWSu|Z`#(|E<5Y*)IH)@%{5N`L*%fjSvdEQ;;iWdRauKi2F31SfD_$c+9^zhJQCs0& z_c^(~b-?PN9f(wAA~WH)`FvKATPhz9ipU*ig;3Yk`XrnqKdvjlET0@3@S4pg`_Mh` z{8VK)>zWD|FxsxJvzYbM1lJ2VlrsQt(Sr@z@RB8+%#IaVwbzgt)2l^>om1?&k7m;v z0kPG+`yy(}nEeSAl>!<)dRh*AW-d~{se4b|9zKJ{lMJv9vT>)($r%kcSP8ZR?}eG=2Iz^jBQoD4^S&V5zObgQTq9QW}W>PiJE>&VOOWc6jH^;6PONJd(zDn{x#0hSCO~UVqhYdZf zn87N?@b^tB3tLg*j4@DWsQs9Pp*Yzr7TB8 z8nIvSD|Ci&S~-rX0RxKDSt0}{wv&gE1Vz`6tK;OcqCP~w2)snj!+&mB+1s0TRHnxB zjNfF}0KMLCr42iM%>QFTMvr7o)P2C0$pc!&W+Jpr{bFH)xK7L8uVxp&`vq@?tr}OL zdQO>}Vn`2}(zNue51G10Py48o;o);|cXC%PtJT_;h#D+6ZRvJXx#GeET;M-l-h4&> zoj0(cj)`ja&V!#dH8LX>ur>bxoQvvOstj7juAuB}%r1LW61SWPK5mrKGY`Gh|GlLn z2#QWy{k5FE_!2a_j7YPyeGOplTz4q12R<`~BNA@Z^0l;y*Cs@AjOzF0Qg!DS*RA4Z z`7$3GSuRAN_@{)6ZKhQbNQ*W$Iim;j4j>J>@lVc6O&` zi&Mw&aBaKB?{@*7Gvu3$Gxg34hnnM`U7<`-&n|rqaq8^n6pC{d-@08H-cB2bLj$!w zfpK>H3}g`MJW$>Gmdx+-9%)_G6k;7}wc&P~yP^+zdd3l=@S$(HAfB*mZ!qv17m9ny zV6T8XOhSevTZ#J!2G|1Fhnac?=tNGWl+~hiZf+FwW6p+?RugGkTpCLddyN2_6L3Fv+;pgl91I6l8vU-%e6To^1lOeh=#*N+2^bu*i)qD0| zS{~7*!K?Or0fxt{-=%I}wTWD#|18-zX%z(_&-ya6|0DHI+>cY;dp8W%YLNsbhgo5|yA)WCoNx?CHy_v)!%pz;tzQ4x%j&v+!PCAQ_~uFRRki50v* zY6U2G&=GDDb?%+3==1Xw@Bs9NV@$*qS|XN@CQQt?1t10qS4c-Ls~BH}aYspc zV7x#qpaPV<8drZ7#(Vup7#t{0AmiOO#ILKQsW_RZQt~b49}}2)@sioyVBG7)=aF4JntO3C(lAJq_aAW*3-r)e@7fFD06EwI&Hy?{j4&~%>8smsWl{o~gTFONq*atNa`#8Ui7Q$;`8bY;ej5MY_j z{T8(gBA)xe^B=92fvy_Dm$uVrPiWe}Gkv{`LFNQFbHWUFLuXH|7PIKxOi13}+9DhLuWj8ofKM-q&CfKSdEW1IqC=%x=o9>DKs{&~i~DeRyC> za>H9mE3*ka*@T*IyAU*kP$`q{Y&A5kzCVB~oM`lE@OMu*b638@Y%~I9F!&g^;yFvw z_g!&JF!!G2_O7=0C7VMHz9vo(q%Q6}Pv+t^DY_-iDOQa_BfK zG*Dq5djy!D3y*3!I|TP$sU9uqGRYEgaAv6g@Ub;){_PZu0HhFr+@*#zO%)t8o*KD*}tQ#lB^?oD^Q=?vb#FwVm^=zT8`xBJB{Xah2Q(Wn(5)8IH z842TDWC})J=)Xh=04_4mnPjUzl+=h(!NGEGk?+=OQNaF{JVRfr#xc!BthAWYkU0pV zg{$K~CCo3k#QabBi@0cti4#uF5b;@C;uNN9JEnH1N$u4-8A5G|nzH4*mJGhqCw230 zV^D-xMMc3ap23jIRX|S$4zDQUB8{ZEBL#+@99|@0!O}K&)$b=Ws+!JzHSGFX?nMO@ z1MWPZX&VkMno!?1C@RaEEdH!V+JRFv(#Wg;Px`BuR2lWX=iD+Ud~Kb7i`9gix3JE7 zq~24MAl+5LT^Dk?m0Ux3;|ypi7wW{?VHo(jG{JG z3jJ-K5&Qgy>ulhO%5x9XfP;nk*o6;4hf7^T-rHZb0bb$Zab8wqfuFkkUsl2Th|ER# zyPf!1cWvd*Ac@XXi@#z4S7`vQ&^6tm1dOs``$b70rY;k3JM?Kqb0q`g7Bb$RJi)A0 zny7pHjDS**7%J#?z>-atsjU@x!Mu?u=i;`VHb6~S{yMmCN$43lew{@>QWo2VM%Le-(MQizOO(*re8>_`CC4b8ffm51)*IfQA zd%^%}@D9VBi5LgT>5y~}etk)eJ9%WMjX%{|UdOw3d{o-uN(yC&n+We_f4}N-<@0&} zWgau}?H1F z|6aa3{k8AZI5t84;kQkeL2~APu~aMXuR1MS{!(PW%+VYT0u+2sGfwsrP!usVr*1(rB&Bd+XtysCzTu8?Rq($aCn zJ$G}CrF))Q+;v@yxq$(!_xrP+JpZW@5jftHvdy@*X>*K&8*+r%Tx972H*z$X(Q zFst?L)BzQdr=J?vi8P#{e0$!%LVG`68$2Wf1n!oGWcy)v$9|RrGW>m-1JULe zNyPqi-IY)Krt(1xqbJ`j)!RQ7+Jk)m?$(bQJ}YXjYn+)*FBWE!B^@_g^d;lgs%tt6 zXq*RXL&VU;Fwb$LBf~wRr#EJwIO7%*lSO1LLy#U#!XAbIsbv%YjarylYk>W5T}x4p z+a?qR>Wfok?{XfL8hyBze9xSoj<6i`9e%J{rAM7YRafclT>U^+Z9*ZDs@$%z788#s zS2=GZLT=k`9)�NQz~w;3%l?Rpv1F#A+O9W^~8(OVi@lZ${ThEr`JA=(jbWZ&8bB zQX3i0>dw701hSU)dM10#2d)_G1cmY+?S#0SZ13^D13xotu$t@RHSeID(;JknBn~XNUvJ`$B*J&S0To?I)pDY{=>OIoTE@+p zI>Jdzxr^Bq-QDVsvIhv>xZe#mRH;dPfdv%S_Ntk?K;UU%DT$$tvoRx?<(Wy28ideJ(|#4X+LRiaFANSqUFkT2gkV zGREJ=c#IxDN&Cns`ns1=dFWrNoNQO0JZ8-H$5%iYAS#v_E zNDm!SAv!m(LOGIF{$q)mVmiMwNr@09{!FkS*3bBiCG!$)qX9ndAPp!;_u3NOE^3)m zp0G;diut20PO*km$lF*}6N$C&BcS$Cj4<|Q*=(T=_ob24!g7xI<$KQYXSNHC(QXp8 zwwu%@v@v@Bxixn_UGFR=rf~&Sn~u_-i^qMl{yrCCcXw3Dat(6l;#}Il`f^SGdX4!% zd?L4j$~WL>3K>AZ$S8J#=4Nr#8piA4 zAKoDZ7H02RcNJvD=sDUyoa>AGmisw>)mm~ppnCOk#gukajw5TI;V_fTKE5>@VL()d zM}4#!9KQ3>H{|69YR6~X&VYpPNQ0ql!cM=@IsWAB9~B<9&!nc`eVi(6GoA+v*dM-I z^j5f9e$egwh2P;gqpR0yPkZ{=S)yN>lj-kzrfjyN_pTvkVisA6zt~5_7}Jra=kjA5`xcXk_im zm%M!;r9az!ZMMeDamOmstmKBBVlH3Nfq+3wQ8}<=Z0VMnODrWnHL-Mki9=wbc;SG6 zR}h^#HA;Tv)~f7G&!F6PXjbAV9DmGEdUSERWAvjuLt9#mdL8G(gRo9pLif@!i>WVw+-0_R+neD~#h zN~|`UpK!#;Iz)>!e;9okPqJplYQO4!`I_OrlpHVk6)8&i+$9Op_NIGDh&Nr_nnYP9 z^iVv3{nH<9$<}q*9=vba7oPX$v`2?Z z(_s05i#mw}On?^3KL6;2AL6>2YlW9K=z}$XO^fnl*6=jRaaqv6KLx}0U;Rt>~3gXI$@yk55%by6*4gGiG z$-IL<=}*~{?!w7GaV(p)qWtCRuqW~&*V+3U z#R|0|i6hE2G&%(R0!`R_P{{j7ca*>@0AteNnG;SEX}#7REh)WUF&Y(A58e>(Qj}F0 zvJH}< @dtS%*6m3mhV8`3>pKKvx|^m_1jx|5qg;o6S9=6X-4)BO4M!e3KA+YTr0 zR*7bPw9F%ZJrAYI@?kKIVqNV})strx?{NltZJ_~jBXMjk#&^VZN8$wqeO_Ca!N_!O zJ7v$AdA8`kRWL4D{SpIe55(cm-r^df@p-Z-4eT9I+iu2TiASwARs? zvSoU8d>oEBVjuZc9q@5RZR*xKtiN^Vq_x9%c6}vTblFGopd%p zYn>TYtzLTMVAp{Sxz&6lnK&~sT#vRWj2=FXZqaJVegbPRz@HkHE#%Oo+}mat4J>>j zHHowR@f=|-1uEP@>*TGBbmVkodq$RX0nryWXw;i0++I?xKwZ8b-Z_LjsO8Gp_+{2q zT{r^w$r`0x>@CT+U+7M|$HowkR(^d}4DBwPO*!b7w^f+c4d*h*Y7wj8xb%9{vThmv zybT#)CV6$8e$4+Ome!n~@ecf&U%KW?_HRh7hom7qRuN#U0?qsE>!4p9K2DoIOII~l>c@Y|;My^kmP%&}Rw^F{f6r(WCb?)# z)c^fds9O0oUDWM&p;2RuLN||SPa&>@Q8xrWbp)jOab@y^Jszz-@l`Qe$VS$H$EY?A zT?gGhRJ5m!A=d>s;tl@Q9VTyHfK*24i38C8b6FZ(x@gv&MJzgv{kJWhNJ~TS!FzSv G=>G@Z_2wf0 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/Contents.json b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/Contents.json index 2734a89..d7ffdfb 100644 --- a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/Contents.json +++ b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "bullet-base.png", + "filename" : "marker-base.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "bullet-base@2x.png", + "filename" : "marker-base@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "bullet-base@3x.png", + "filename" : "marker-base@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base.png deleted file mode 100644 index e14b91e13e3e73ed592ea41d051a4c32d6f96e7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3494 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 UUHmwH+W-In07*qoM6N<$g7mGYlmGw# diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base@2x.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base@2x.png deleted file mode 100644 index c21a5a9f8c0fbb9193e9f6351559382b2bbd526f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9837 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 OgOin10@aEe2mc>U@-{^P diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base@3x.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/bullet-base@3x.png deleted file mode 100644 index 2146f61eac4e5f72e227a0d0ba97c9520a9e77d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20408 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 KMNUMnLSTZ3-rCLp literal 0 HcmV?d00001 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base@2x.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..36370527831bd9db0f1600f62fb9e2b71ab081f7 GIT binary patch literal 11965 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 BTL1t6 literal 0 HcmV?d00001 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base@3x.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7348f5e2a1df9c154d6bd5e8dd185fd0c2a00d2f GIT binary patch literal 23702 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 literal 0 HcmV?d00001 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/Contents.json b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/Contents.json index 6c3c92a..69f40d1 100644 --- a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/Contents.json +++ b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "bullet-tip.png", + "filename" : "marker-tip.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "bullet-tip@2x.png", + "filename" : "marker-tip@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "bullet-tip@3x.png", + "filename" : "marker-tip@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/bullet-tip.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/bullet-tip.png deleted file mode 100644 index fefdcfc6afe79bba934a36ce157a618cd8cea692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 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 az*x^HwO|fo#WtlaAkChxelF{r5}E+Jm@i)d literal 0 HcmV?d00001 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip@3x.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0efd8aad31a67d968125dd423815a0a670eb4032 GIT binary patch literal 1149 zcmeAS@N?(olHy`uVBq!ia0y~yV0-{%Z{c7Al0JL>9{^IE1s;*b3=E1EAk64G%`gEd z$XFcY?!>U}oXkrghb7(7*O7r?V?XzwL{=bI$kW9!q=ND7-S>fa++>bF)c4`?V9(Jq zkX^vHfcY`k8@@LoLd%<`OemQkrlBaSvioA@j*kp>HPud5w&%~}oBXLfU3cT^T}?)y z(R2h2rMo%Ko-aLhZ_E1iW!GP(PZrvC=04Abqy9JhG?!d2z4vzCzH`Y1j0tAXr5F zK5RLidr|gLYY@YniAz~`xPG(izsTCKc}ojJw;sdn&(j#?Ue)wGPGvC5c*n5)!nPN6 zT`!n6Bo?z)toUr%H-qs({c@fScl8)-9*Z!F#WDQoo5!dp*+26=GsB)0?hW28;tX+5 zXE1Dk{8a3oKO>Os&h$o3pF!s3R-n0m#Q2>V8Wzh)0iC)B#EO;sVEuN-&-Wer3?-j0 z@$I;K|F7~PZic(I+nMwD_iumA+8|u1b>RK$Ka%=em>MSkG&}INc5nRSx2_BYLBARE zKK>PAc<@B8?7HIPjm94~bu*M)C_A9~xVnb1VdfTw`$xIgF(icP9ss)S%&NQRf0-Xx zc!!y7SBCY2b_RycS&aW|84j$uRT%aALhrYYlT{CVw`c;(*1xLZU@(~da`J|MT^!5@ za=zJjead!`U`YFT*i{f?12)@J*RDHSS;Hm(hgdV2GJ{&Sui|LTtv z!-Cz;|7PoNly2*kHMnr}DdYan6AI1$DB78FGwiB(TmO0Kx#<-R%(qk7c}hMm?)K~y z*zC*1Q&RXQDM;x^PB#N{?3XAXua+6P0tpMc?{#~glz4QzhrhC+Sowg1_;R4s+=b_! zSNs-w4zl)Hgio85{Odcc*Ze`e7$2`UU6J;TY`ZE}A5B?N9RFM`>C7$;pfiNTChxvm z@lY&V0ceVMw9hh$+mf3@fc9>Dax~?{<8wP$ra1ylxVCA=lpe=@cVlHkKZmhMyhvKx zeKO#=Rq}+}p%Z3;+&1TQl2HoJ$FuLEn3gL7je5Ro#unK^?vDY_V~;7sv-hb3#iFBp zmT7E%9q?Q$d4{)4VzC9#JsW29e0v;Ic765T(t4rex1*ougYq_A!K(iZt{-h5=bC=7 P0om*6>gTe~DWM4f+U=so literal 0 HcmV?d00001 From 4701eac3ba82c8031c842b134a334dad2ffe78b5 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Fri, 17 May 2024 23:30:32 +0700 Subject: [PATCH 02/17] feat: add pen tool persistence --- Memola.xcodeproj/project.pbxproj | 25 ++++++--- Memola/Canvas/Tool/Core/Tool.swift | 51 +++++++++++++---- Memola/Canvas/Tool/Pen/Core/Pen.swift | 55 +++++++++++-------- Memola/Canvas/Tool/Pen/Core/PenStyle.swift | 11 ++++ .../ViewController/CanvasViewController.swift | 1 + Memola/Features/Memo/Memo/MemoView.swift | 13 ++--- .../Memo/PenTool/PenDropDelegate.swift | 5 ++ .../Features/Memo/PenTool/PenToolView.swift | 12 ++-- Memola/Features/Memos/MemosView.swift | 53 ++++++++++++------ Memola/Persistence/Objects/MemoObject.swift | 3 +- Memola/Persistence/Objects/PenObject.swift | 30 ++++++++++ Memola/Persistence/Objects/ToolObject.swift | 15 +++++ .../MemolaModel.xcdatamodel/contents | 13 +++++ 13 files changed, 212 insertions(+), 75 deletions(-) create mode 100644 Memola/Persistence/Objects/PenObject.swift create mode 100644 Memola/Persistence/Objects/ToolObject.swift diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index 8991957..d527bc1 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -7,6 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + EC0D14212BF79C73009BFE5F /* ToolObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14202BF79C73009BFE5F /* ToolObject.swift */; }; + EC0D14242BF79C98009BFE5F /* MemolaModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14222BF79C98009BFE5F /* MemolaModel.xcdatamodeld */; }; + EC0D14262BF7A8C9009BFE5F /* PenObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14252BF7A8C9009BFE5F /* PenObject.swift */; }; EC3565522BEFC65F00A4E0BF /* NSManagedObjectContext++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565512BEFC65F00A4E0BF /* NSManagedObjectContext++.swift */; }; EC3565542BEFC6AD00A4E0BF /* View++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565532BEFC6AD00A4E0BF /* View++.swift */; }; EC3565562BEFC7B300A4E0BF /* NSManagedObject++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565552BEFC7B300A4E0BF /* NSManagedObject++.swift */; }; @@ -70,7 +73,6 @@ ECA738F42BE612A000A4542E /* Array++.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA738F32BE612A000A4542E /* Array++.swift */; }; ECA738F62BE612B700A4542E /* MTLDevice++.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA738F52BE612B700A4542E /* MTLDevice++.swift */; }; ECA738FC2BE61C5200A4542E /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA738FB2BE61C5200A4542E /* Persistence.swift */; }; - ECA739012BE61D9C00A4542E /* MemolaModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = ECA738FF2BE61D9C00A4542E /* MemolaModel.xcdatamodeld */; }; ECA739082BE623F300A4542E /* PenToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA739072BE623F300A4542E /* PenToolView.swift */; }; ECEC01A82BEE11BA006DA24C /* QuadShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECEC01A72BEE11BA006DA24C /* QuadShape.swift */; }; ECFA15202BEF21EF00455818 /* MemoObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFA151F2BEF21EF00455818 /* MemoObject.swift */; }; @@ -81,6 +83,9 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + EC0D14202BF79C73009BFE5F /* ToolObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolObject.swift; sourceTree = ""; }; + EC0D14232BF79C98009BFE5F /* MemolaModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MemolaModel.xcdatamodel; sourceTree = ""; }; + EC0D14252BF7A8C9009BFE5F /* PenObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenObject.swift; sourceTree = ""; }; EC3565512BEFC65F00A4E0BF /* NSManagedObjectContext++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSManagedObjectContext++.swift"; sourceTree = ""; }; EC3565532BEFC6AD00A4E0BF /* View++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View++.swift"; sourceTree = ""; }; EC3565552BEFC7B300A4E0BF /* NSManagedObject++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSManagedObject++.swift"; sourceTree = ""; }; @@ -146,7 +151,6 @@ ECA738F32BE612A000A4542E /* Array++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array++.swift"; sourceTree = ""; }; ECA738F52BE612B700A4542E /* MTLDevice++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MTLDevice++.swift"; sourceTree = ""; }; ECA738FB2BE61C5200A4542E /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; - ECA739002BE61D9C00A4542E /* MemolaModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MemolaModel.xcdatamodel; sourceTree = ""; }; ECA739072BE623F300A4542E /* PenToolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenToolView.swift; sourceTree = ""; }; ECEC01A72BEE11BA006DA24C /* QuadShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuadShape.swift; sourceTree = ""; }; ECFA151F2BEF21EF00455818 /* MemoObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoObject.swift; sourceTree = ""; }; @@ -556,7 +560,7 @@ ECA738FE2BE61D5700A4542E /* Models */ = { isa = PBXGroup; children = ( - ECA738FF2BE61D9C00A4542E /* MemolaModel.xcdatamodeld */, + EC0D14222BF79C98009BFE5F /* MemolaModel.xcdatamodeld */, ); path = Models; sourceTree = ""; @@ -586,6 +590,8 @@ ECFA15232BEF223300455818 /* GraphicContextObject.swift */, ECFA15252BEF224900455818 /* StrokeObject.swift */, ECFA15272BEF225000455818 /* QuadObject.swift */, + EC0D14202BF79C73009BFE5F /* ToolObject.swift */, + EC0D14252BF7A8C9009BFE5F /* PenObject.swift */, ); path = Objects; sourceTree = ""; @@ -696,8 +702,9 @@ ECA738EE2BE6125D00A4542E /* simd_float4x4++.swift in Sources */, ECA7388C2BE6009600A4542E /* Textures.swift in Sources */, ECA738B82BE60DDC00A4542E /* HistoryEvent.swift in Sources */, + EC0D14262BF7A8C9009BFE5F /* PenObject.swift in Sources */, ECA738952BE6012D00A4542E /* ViewPort.metal in Sources */, - ECA739012BE61D9C00A4542E /* MemolaModel.xcdatamodeld in Sources */, + EC0D14242BF79C98009BFE5F /* MemolaModel.xcdatamodeld in Sources */, ECA738F02BE6127700A4542E /* CGSize++.swift in Sources */, ECFA15242BEF223300455818 /* GraphicContextObject.swift in Sources */, EC3565562BEFC7B300A4E0BF /* NSManagedObject++.swift in Sources */, @@ -710,6 +717,7 @@ ECA7388F2BE600DA00A4542E /* Grid.metal in Sources */, ECA738C92BE60EF700A4542E /* GraphicContext.swift in Sources */, ECA738F62BE612B700A4542E /* MTLDevice++.swift in Sources */, + EC0D14212BF79C73009BFE5F /* ToolObject.swift in Sources */, EC50500D2BF6674400B4D86E /* DraggableViewModifier.swift in Sources */, ECA7389E2BE601CB00A4542E /* QuadVertex.swift in Sources */, ECA738B32BE60D9E00A4542E /* CanvasView.swift in Sources */, @@ -944,13 +952,14 @@ /* End XCConfigurationList section */ /* Begin XCVersionGroup section */ - ECA738FF2BE61D9C00A4542E /* MemolaModel.xcdatamodeld */ = { + EC0D14222BF79C98009BFE5F /* MemolaModel.xcdatamodeld */ = { isa = XCVersionGroup; children = ( - ECA739002BE61D9C00A4542E /* MemolaModel.xcdatamodel */, + EC0D14232BF79C98009BFE5F /* MemolaModel.xcdatamodel */, ); - currentVersion = ECA739002BE61D9C00A4542E /* MemolaModel.xcdatamodel */; - path = MemolaModel.xcdatamodeld; + currentVersion = EC0D14232BF79C98009BFE5F /* MemolaModel.xcdatamodel */; + name = MemolaModel.xcdatamodeld; + path = /Users/dscyrescotti/Documents/Projects/Memola/Memola/Resources/Models/MemolaModel.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; }; diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 6ec3144..db49795 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -6,27 +6,54 @@ // import SwiftUI +import CoreData import Foundation -class Tool: NSObject, ObservableObject { - @Published var pens: [Pen] +public class Tool: NSObject, ObservableObject { + let object: ToolObject + + @Published var pens: [Pen] = [] @Published var selectedPen: Pen? @Published var draggedPen: Pen? - override init() { - pens = [ - Pen(for: .eraser), - Pen(for: .marker) - ] - super.init() - selectedPen = pens[1] + init(object: ToolObject) { + self.object = object } - func changePen(_ pen: Pen) { - selectedPen = pen + func load() { + DispatchQueue.main.async { [weak self] in + guard let self else { return } + pens = object.pens.sortedArray(using: [NSSortDescriptor(key: "orderIndex", ascending: true)]).compactMap { + guard let pen = $0 as? PenObject else { return nil } + return Pen(object: pen) + } + if let selectedPen = pens.first(where: { $0.isSelected }) { + selectPen(selectedPen) + } + } + } + + func selectPen(_ pen: Pen) { + if let selectedPen { + unselectPen(selectedPen) + } + withAnimation { + selectedPen = pen + } + selectedPen?.isSelected = true + } + + func unselectPen(_ pen: Pen) { + pen.isSelected = false } func addPen(_ pen: Pen) { - pens.append(pen) + withAnimation { + pens.append(pen) + } + selectPen(pen) + if let _pen = pen.object { + object.pens.add(_pen) + } } } diff --git a/Memola/Canvas/Tool/Pen/Core/Pen.swift b/Memola/Canvas/Tool/Pen/Core/Pen.swift index e4b9a89..01a6b8a 100644 --- a/Memola/Canvas/Tool/Pen/Core/Pen.swift +++ b/Memola/Canvas/Tool/Pen/Core/Pen.swift @@ -10,32 +10,41 @@ import Foundation import UniformTypeIdentifiers class Pen: NSObject, ObservableObject, Identifiable { - let id: String - @Published var style: any PenStyle - @Published var color: [CGFloat] - @Published var thickness: CGFloat + var object: PenObject? - init(style: any PenStyle, color: [CGFloat], thickness: CGFloat) { - self.id = UUID().uuidString - self.style = style - self.color = color - self.thickness = thickness + let id: String + @Published var style: any PenStyle { + didSet { + object?.style = strokeStyle.rawValue + } + } + @Published var color: [CGFloat] { + didSet { + object?.color = color + } + } + @Published var thickness: CGFloat { + didSet { + object?.thickness = thickness + } + } + @Published var isSelected: Bool { + didSet { + object?.isSelected = isSelected + } + } + + init(object: PenObject) { + self.object = object + self.id = object.objectID.uriRepresentation().absoluteString + self.style = (Stroke.Style(rawValue: object.style) ?? .marker).anyPenStyle + self.color = object.color + self.thickness = object.thickness + self.isSelected = object.isSelected + super.init() } var strokeStyle: Stroke.Style { - switch style { - case is MarkerPenStyle: - return .marker - case is EraserPenStyle: - return .eraser - default: - return .marker - } - } -} - -extension Pen { - convenience init(for style: any PenStyle) { - self.init(style: style, color: style.color, thickness: style.thinkness.min) + style.strokeStyle } } diff --git a/Memola/Canvas/Tool/Pen/Core/PenStyle.swift b/Memola/Canvas/Tool/Pen/Core/PenStyle.swift index 618806c..a2a63ea 100644 --- a/Memola/Canvas/Tool/Pen/Core/PenStyle.swift +++ b/Memola/Canvas/Tool/Pen/Core/PenStyle.swift @@ -22,4 +22,15 @@ extension PenStyle { func loadTexture(on device: MTLDevice) -> MTLTexture? { Textures.createPenTexture(with: textureName, on: device) } + + var strokeStyle: Stroke.Style { + switch self { + case is MarkerPenStyle: + return .marker + case is EraserPenStyle: + return .eraser + default: + return .marker + } + } } diff --git a/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift b/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift index 0a37e68..50cc89a 100644 --- a/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift +++ b/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift @@ -183,6 +183,7 @@ extension CanvasViewController { extension CanvasViewController { func loadMemo() { + tool.load() canvas.load() } diff --git a/Memola/Features/Memo/Memo/MemoView.swift b/Memola/Features/Memo/Memo/MemoView.swift index ed6e1f0..60a1a0c 100644 --- a/Memola/Features/Memo/Memo/MemoView.swift +++ b/Memola/Features/Memo/Memo/MemoView.swift @@ -10,9 +10,8 @@ import CoreData struct MemoView: View { @Environment(\.dismiss) var dismiss - @Environment(\.managedObjectContext) var managedObjectContext - @StateObject var tool = Tool() + @StateObject var tool: Tool @StateObject var canvas: Canvas @StateObject var history = History() @@ -20,6 +19,7 @@ struct MemoView: View { init(memo: MemoObject) { self.memo = memo + self._tool = StateObject(wrappedValue: Tool(object: memo.tool)) self._canvas = StateObject(wrappedValue: Canvas(size: memo.canvas.size, canvasID: memo.canvas.objectID)) } @@ -97,13 +97,8 @@ struct MemoView: View { } func closeMemo() { - history.resetRedo() - if managedObjectContext.hasChanges { - do { - try managedObjectContext.save() - } catch { - NSLog("[Memola] - \(error.localizedDescription)") - } + withPersistenceSync(\.viewContext) { context in + try context.saveIfNeeded() } dismiss() } diff --git a/Memola/Features/Memo/PenTool/PenDropDelegate.swift b/Memola/Features/Memo/PenTool/PenDropDelegate.swift index 972e83e..27bc4e2 100644 --- a/Memola/Features/Memo/PenTool/PenDropDelegate.swift +++ b/Memola/Features/Memo/PenTool/PenDropDelegate.swift @@ -27,6 +27,11 @@ struct PenDropDelegate: DropDelegate { tool.pens.move(fromOffsets: IndexSet(integer: fromIndex), toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex) tool.objectWillChange.send() } + withPersistence(\.viewContext) { context in + for (index, pen) in tool.pens.enumerated() { + pen.object?.orderIndex = Int16(index) + } + } } } } diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenTool/PenToolView.swift index d79d558..353ba54 100644 --- a/Memola/Features/Memo/PenTool/PenToolView.swift +++ b/Memola/Features/Memo/PenTool/PenToolView.swift @@ -82,11 +82,11 @@ struct PenToolView: View { .onTapGesture { if tool.selectedPen === pen { withAnimation { - tool.selectedPen = nil + tool.unselectPen(pen) } } else { withAnimation { - tool.changePen(pen) + tool.selectPen(pen) } } } @@ -95,9 +95,13 @@ struct PenToolView: View { var newPenButton: some View { Button(action: { - let pen = Pen(for: .marker) + let pen = PenObject.createObject(\.viewContext, penStyle: .marker) pen.color = [Color.red, Color.blue, Color.green, Color.black, Color.orange].randomElement()!.components - tool.addPen(pen) + pen.isSelected = true + pen.tool = tool.object + pen.orderIndex = Int16(tool.pens.count) + let _pen = Pen(object: pen) + tool.addPen(_pen) }) { Image(systemName: "plus") .font(.title3) diff --git a/Memola/Features/Memos/MemosView.swift b/Memola/Features/Memos/MemosView.swift index 57c6395..4f66f0d 100644 --- a/Memola/Features/Memos/MemosView.swift +++ b/Memola/Features/Memos/MemosView.swift @@ -62,28 +62,45 @@ struct MemosView: View { } func createMemo(title: String) { - do { - let memoObject = MemoObject(context: managedObjectContext) - memoObject.title = title - memoObject.createdAt = .now - memoObject.updatedAt = .now + let memoObject = MemoObject(\.viewContext) + memoObject.title = title + memoObject.createdAt = .now + memoObject.updatedAt = .now - let canvasObject = CanvasObject(context: managedObjectContext) - canvasObject.width = 8_000 - canvasObject.height = 8_000 + let canvasObject = CanvasObject(context: managedObjectContext) + canvasObject.width = 8_000 + canvasObject.height = 8_000 - let graphicContextObject = GraphicContextObject(context: managedObjectContext) - graphicContextObject.strokes = [] + let toolObject = ToolObject(\.viewContext) + toolObject.pens = [] - memoObject.canvas = canvasObject - canvasObject.memo = memoObject - canvasObject.graphicContext = graphicContextObject - graphicContextObject.canvas = canvasObject + let eraserPenObject = PenObject.createObject(\.viewContext, penStyle: .eraser) + eraserPenObject.orderIndex = 0 + let markerPenObject = PenObject.createObject(\.viewContext, penStyle: .marker) + markerPenObject.orderIndex = 1 - try managedObjectContext.save() - openMemo(for: memoObject) - } catch { - NSLog("[Memola] - \(error.localizedDescription)") + let graphicContextObject = GraphicContextObject(\.viewContext) + graphicContextObject.strokes = [] + + memoObject.canvas = canvasObject + memoObject.tool = toolObject + + canvasObject.memo = memoObject + canvasObject.graphicContext = graphicContextObject + + toolObject.memo = memoObject + toolObject.pens = [eraserPenObject, markerPenObject] + + eraserPenObject.tool = toolObject + markerPenObject.tool = toolObject + + graphicContextObject.canvas = canvasObject + + withPersistenceSync(\.viewContext) { context in + try context.save() + DispatchQueue.main.async { + openMemo(for: memoObject) + } } } diff --git a/Memola/Persistence/Objects/MemoObject.swift b/Memola/Persistence/Objects/MemoObject.swift index d3a6b61..ad74aa9 100644 --- a/Memola/Persistence/Objects/MemoObject.swift +++ b/Memola/Persistence/Objects/MemoObject.swift @@ -10,9 +10,10 @@ import Foundation @objc(MemoObject) final class MemoObject: NSManagedObject, Identifiable { - @NSManaged var title: String @NSManaged var data: Data + @NSManaged var title: String @NSManaged var createdAt: Date @NSManaged var updatedAt: Date + @NSManaged var tool: ToolObject @NSManaged var canvas: CanvasObject } diff --git a/Memola/Persistence/Objects/PenObject.swift b/Memola/Persistence/Objects/PenObject.swift new file mode 100644 index 0000000..52380ec --- /dev/null +++ b/Memola/Persistence/Objects/PenObject.swift @@ -0,0 +1,30 @@ +// +// PenObject.swift +// Memola +// +// Created by Dscyre Scotti on 5/17/24. +// + +import CoreData +import Foundation + +@objc(PenObject) +class PenObject: NSManagedObject { + @NSManaged var color: [CGFloat] + @NSManaged var style: Int16 + @NSManaged var thickness: CGFloat + @NSManaged var isSelected: Bool + @NSManaged var orderIndex: Int16 + @NSManaged var tool: ToolObject? +} + +extension PenObject { + static func createObject(_ keyPath: KeyPath, penStyle: any PenStyle) -> PenObject { + let object = PenObject(context: Persistence.shared[keyPath: keyPath]) + object.color = penStyle.color + object.style = penStyle.strokeStyle.rawValue + object.isSelected = false + object.thickness = penStyle.thinkness.min + return object + } +} diff --git a/Memola/Persistence/Objects/ToolObject.swift b/Memola/Persistence/Objects/ToolObject.swift new file mode 100644 index 0000000..fb26c1a --- /dev/null +++ b/Memola/Persistence/Objects/ToolObject.swift @@ -0,0 +1,15 @@ +// +// ToolObject.swift +// Memola +// +// Created by Dscyre Scotti on 5/17/24. +// + +import CoreData +import Foundation + +@objc(ToolObject) +class ToolObject: NSManagedObject { + @NSManaged var pens: NSMutableSet + @NSManaged var memo: MemoObject? +} diff --git a/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents b/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents index 1b277fa..798206c 100644 --- a/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents +++ b/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents @@ -15,6 +15,15 @@ + + + + + + + + + @@ -34,4 +43,8 @@ + + + + \ No newline at end of file From 821b34e1589633ceacb4d98905dac0187882874e Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 01:25:36 +0700 Subject: [PATCH 03/17] feat: add reordering and deleting --- Memola.xcodeproj/project.pbxproj | 4 + Memola/Canvas/Tool/Core/Tool.swift | 17 +++ .../ContextMenuableViewModifier.swift | 29 +++++ .../Memo/PenTool/PenDropDelegate.swift | 1 + .../Features/Memo/PenTool/PenToolView.swift | 122 ++++++++++++------ 5 files changed, 137 insertions(+), 36 deletions(-) create mode 100644 Memola/Components/ViewModifiers/ContextMenuableViewModifier.swift diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index d527bc1..fba1545 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ EC0D14212BF79C73009BFE5F /* ToolObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14202BF79C73009BFE5F /* ToolObject.swift */; }; EC0D14242BF79C98009BFE5F /* MemolaModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14222BF79C98009BFE5F /* MemolaModel.xcdatamodeld */; }; EC0D14262BF7A8C9009BFE5F /* PenObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14252BF7A8C9009BFE5F /* PenObject.swift */; }; + EC0D14282BF7BF20009BFE5F /* ContextMenuableViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14272BF7BF20009BFE5F /* ContextMenuableViewModifier.swift */; }; EC3565522BEFC65F00A4E0BF /* NSManagedObjectContext++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565512BEFC65F00A4E0BF /* NSManagedObjectContext++.swift */; }; EC3565542BEFC6AD00A4E0BF /* View++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565532BEFC6AD00A4E0BF /* View++.swift */; }; EC3565562BEFC7B300A4E0BF /* NSManagedObject++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565552BEFC7B300A4E0BF /* NSManagedObject++.swift */; }; @@ -86,6 +87,7 @@ EC0D14202BF79C73009BFE5F /* ToolObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolObject.swift; sourceTree = ""; }; EC0D14232BF79C98009BFE5F /* MemolaModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MemolaModel.xcdatamodel; sourceTree = ""; }; EC0D14252BF7A8C9009BFE5F /* PenObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenObject.swift; sourceTree = ""; }; + EC0D14272BF7BF20009BFE5F /* ContextMenuableViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuableViewModifier.swift; sourceTree = ""; }; EC3565512BEFC65F00A4E0BF /* NSManagedObjectContext++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSManagedObjectContext++.swift"; sourceTree = ""; }; EC3565532BEFC6AD00A4E0BF /* View++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View++.swift"; sourceTree = ""; }; EC3565552BEFC7B300A4E0BF /* NSManagedObject++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSManagedObject++.swift"; sourceTree = ""; }; @@ -232,6 +234,7 @@ isa = PBXGroup; children = ( EC50500C2BF6674400B4D86E /* DraggableViewModifier.swift */, + EC0D14272BF7BF20009BFE5F /* ContextMenuableViewModifier.swift */, ); path = ViewModifiers; sourceTree = ""; @@ -734,6 +737,7 @@ ECA738DE2BE610A000A4542E /* ViewPortRenderPass.swift in Sources */, EC7F6BEC2BE5E6E300A34A7B /* MemolaApp.swift in Sources */, ECA738A02BE601E400A4542E /* ViewPortVertex.swift in Sources */, + EC0D14282BF7BF20009BFE5F /* ContextMenuableViewModifier.swift in Sources */, ECA738BC2BE60E0300A4542E /* Tool.swift in Sources */, ECA738972BE6014200A4542E /* Graphic.metal in Sources */, ECA7388A2BE6006A00A4542E /* PipelineStates.swift in Sources */, diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index db49795..43c1a36 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -15,6 +15,9 @@ public class Tool: NSObject, ObservableObject { @Published var pens: [Pen] = [] @Published var selectedPen: Pen? @Published var draggedPen: Pen? + @Published var isReordering: Bool = false + @Published var isShaking: Bool = false + @Published var shakingId: UUID = UUID() init(object: ToolObject) { self.object = object @@ -45,6 +48,9 @@ public class Tool: NSObject, ObservableObject { func unselectPen(_ pen: Pen) { pen.isSelected = false + withAnimation { + selectedPen = nil + } } func addPen(_ pen: Pen) { @@ -56,4 +62,15 @@ public class Tool: NSObject, ObservableObject { object.pens.add(_pen) } } + + func removePen(_ pen: Pen) { + guard let index = pens.firstIndex(where: { $0 === pen }) else { return } + let deletedPen = withAnimation { + pens.remove(at: index) + } + if let _pen = deletedPen.object { + _pen.tool = nil + object.pens.remove(_pen) + } + } } diff --git a/Memola/Components/ViewModifiers/ContextMenuableViewModifier.swift b/Memola/Components/ViewModifiers/ContextMenuableViewModifier.swift new file mode 100644 index 0000000..ae270c8 --- /dev/null +++ b/Memola/Components/ViewModifiers/ContextMenuableViewModifier.swift @@ -0,0 +1,29 @@ +// +// ContextMenuableViewModifier.swift +// Memola +// +// Created by Dscyre Scotti on 5/17/24. +// + +import SwiftUI +import Foundation + +struct ContextMenuableViewModifier: ViewModifier { + let condition: Bool + let menuItems: () -> MenuContent + + @ViewBuilder + func body(content: Content) -> some View { + if condition { + content.contextMenu(menuItems: menuItems) + } else { + content + } + } +} + +public extension View { + func contextMenu(if condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent) -> some View { + modifier(ContextMenuableViewModifier(condition: condition, menuItems: menuItems)) + } +} diff --git a/Memola/Features/Memo/PenTool/PenDropDelegate.swift b/Memola/Features/Memo/PenTool/PenDropDelegate.swift index 27bc4e2..dbc479b 100644 --- a/Memola/Features/Memo/PenTool/PenDropDelegate.swift +++ b/Memola/Features/Memo/PenTool/PenDropDelegate.swift @@ -27,6 +27,7 @@ struct PenDropDelegate: DropDelegate { tool.pens.move(fromOffsets: IndexSet(integer: fromIndex), toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex) tool.objectWillChange.send() } + tool.shakingId = UUID() withPersistence(\.viewContext) { context in for (index, pen) in tool.pens.enumerated() { pen.object?.orderIndex = Int16(index) diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenTool/PenToolView.swift index 353ba54..0172a48 100644 --- a/Memola/Features/Memo/PenTool/PenToolView.swift +++ b/Memola/Features/Memo/PenTool/PenToolView.swift @@ -17,17 +17,42 @@ struct PenToolView: View { var body: some View { VStack(alignment: .trailing, spacing: 0) { ScrollView(.vertical, showsIndicators: false) { - LazyVStack(spacing: 0) { - ForEach(tool.pens) { pen in - penView(pen) + if tool.isReordering { + LazyVStack(spacing: 0) { + ForEach(tool.pens) { pen in + if pen.strokeStyle == .marker { + penView(pen) + .offset(y: tool.isShaking ? 1.5 : -1.5) + } else { + penView(pen) + } + } } + .padding(.vertical, 5) + .padding(.leading, 40) + .onAppear { + withAnimation(.easeInOut.repeatForever().speed(5)) { + tool.isShaking.toggle() + } + } + .id(tool.shakingId) + } else { + LazyVStack(spacing: 0) { + ForEach(tool.pens) { pen in + penView(pen) + } + } + .padding(.vertical, 5) + .padding(.leading, 40) } - .padding(.vertical, 5) - .padding(.leading, 40) } VStack(spacing: 0) { Divider() - newPenButton + if tool.isReordering { + reorderCancelButton + } else { + newPenButton + } } .frame(width: width * factor - 20) } @@ -58,43 +83,40 @@ struct PenToolView: View { .frame(width: width * factor, height: height * factor) .padding(.vertical, 5) .padding(.leading, 10) - .clipShape(.rect(cornerRadii: .init(topLeading: 10, bottomLeading: 10))) .contentShape(.rect(cornerRadii: .init(topLeading: 10, bottomLeading: 10))) - .onDrag(if: pen.strokeStyle != .eraser) { + .onTapGesture { + if tool.selectedPen === pen { + tool.unselectPen(pen) + } else { + tool.selectPen(pen) + } + } + .disabled(tool.isReordering) + .contextMenu(if: pen.strokeStyle != .eraser && !tool.isReordering) { + Button { + tool.isReordering = true + } label: { + Label("Rearrange", systemImage: "arrow.up.arrow.down.circle") + } + Button(role: .destructive) { + tool.removePen(pen) + } label: { + Label("Delete", systemImage: "trash") + } + } + .onDrag(if: pen.strokeStyle != .eraser && tool.isReordering) { tool.draggedPen = pen return NSItemProvider(contentsOf: URL(string: pen.id)) ?? NSItemProvider() } preview: { - ZStack { - if let tip = pen.style.icon.tip { - Image(tip) - .resizable() - .renderingMode(.template) - .foregroundStyle(Color.rgba(from: pen.color)) - } - Image(pen.style.icon.base) - .resizable() - } - .frame(width: width * factor, height: height * factor) - .padding([.vertical, .leading], 10) - .contentShape(.dragPreview, .rect(cornerRadius: 10)) + penPreview(pen) + .contentShape(.dragPreview, .rect(cornerRadius: 10)) } .onDrop(of: [.item], delegate: PenDropDelegate(id: pen.id, tool: tool)) - .onTapGesture { - if tool.selectedPen === pen { - withAnimation { - tool.unselectPen(pen) - } - } else { - withAnimation { - tool.selectPen(pen) - } - } - } .offset(x: tool.selectedPen === pen ? 0 : 28) } var newPenButton: some View { - Button(action: { + Button { let pen = PenObject.createObject(\.viewContext, penStyle: .marker) pen.color = [Color.red, Color.blue, Color.green, Color.black, Color.orange].randomElement()!.components pen.isSelected = true @@ -102,12 +124,40 @@ struct PenToolView: View { pen.orderIndex = Int16(tool.pens.count) let _pen = Pen(object: pen) tool.addPen(_pen) - }) { - Image(systemName: "plus") - .font(.title3) + } label: { + Image(systemName: "pencil.tip.crop.circle.badge.plus") + .font(.title2) .contentShape(.circle) } .hoverEffect(.lift) .padding(10) } + + var reorderCancelButton: some View { + Button { + tool.isReordering = false + } label: { + Image(systemName: "xmark.circle") + .font(.title2) + .contentShape(.circle) + } + .hoverEffect(.lift) + .padding(10) + } + + func penPreview(_ pen: Pen) -> some View { + ZStack { + if let tip = pen.style.icon.tip { + Image(tip) + .resizable() + .renderingMode(.template) + .foregroundStyle(Color.rgba(from: pen.color)) + } + Image(pen.style.icon.base) + .resizable() + } + .frame(width: width * factor, height: height * factor) + .padding(.vertical, 5) + .padding(.leading, 10) + } } From 4bf603a4051bee83b28cf9e6d4d10560d090e35a Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 01:36:09 +0700 Subject: [PATCH 04/17] feat: add vertex generator in eraser render pass --- .../RenderPasses/EraserRenderPass.swift | 30 +++++++++++++++++++ .../Features/Memo/PenTool/PenToolView.swift | 1 + 2 files changed, 31 insertions(+) diff --git a/Memola/Canvas/RenderPasses/EraserRenderPass.swift b/Memola/Canvas/RenderPasses/EraserRenderPass.swift index ab4aab8..46bbe54 100644 --- a/Memola/Canvas/RenderPasses/EraserRenderPass.swift +++ b/Memola/Canvas/RenderPasses/EraserRenderPass.swift @@ -14,12 +14,14 @@ class EraserRenderPass: RenderPass { var descriptor: MTLRenderPassDescriptor? var eraserPipelineState: MTLRenderPipelineState? + var quadPipelineState: MTLComputePipelineState? var stroke: Stroke? weak var graphicTexture: MTLTexture? init(renderer: Renderer) { eraserPipelineState = PipelineStates.createEraserPipelineState(from: renderer) + quadPipelineState = PipelineStates.createQuadPipelineState(from: renderer) } func resize(on view: MTKView, to size: CGSize, with renderer: Renderer) { } @@ -27,6 +29,8 @@ class EraserRenderPass: RenderPass { func draw(on canvas: Canvas, with renderer: Renderer) { guard let descriptor else { return } + generateVertexBuffer(on: canvas, with: renderer) + guard let commandBuffer = renderer.commandQueue.makeCommandBuffer() else { return } commandBuffer.label = "Eraser Command Buffer" @@ -42,4 +46,30 @@ class EraserRenderPass: RenderPass { renderEncoder.endEncoding() commandBuffer.commit() } + + private func generateVertexBuffer(on canvas: Canvas, with renderer: Renderer) { + guard let stroke, !stroke.quads.isEmpty, let quadPipelineState else { return } + guard let quadCommandBuffer = renderer.commandQueue.makeCommandBuffer() else { return } + guard let computeEncoder = quadCommandBuffer.makeComputeCommandEncoder() else { return } + + computeEncoder.label = "Quad Render Pass" + + let quadCount = stroke.quads.endIndex + var quads = stroke.quads + let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout.stride * quadCount, options: []) + let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 6, options: []) + + computeEncoder.setComputePipelineState(quadPipelineState) + computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0) + computeEncoder.setBuffer(vertexBuffer, offset: 0, index: 1) + + stroke.vertexBuffer = vertexBuffer + + let threadsPerGroup = MTLSize(width: 1, height: 1, depth: 1) + let numThreadgroups = MTLSize(width: quadCount + 1, height: 1, depth: 1) + computeEncoder.dispatchThreadgroups(numThreadgroups, threadsPerThreadgroup: threadsPerGroup) + computeEncoder.endEncoding() + quadCommandBuffer.commit() + quadCommandBuffer.waitUntilCompleted() + } } diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenTool/PenToolView.swift index 0172a48..2ff0627 100644 --- a/Memola/Features/Memo/PenTool/PenToolView.swift +++ b/Memola/Features/Memo/PenTool/PenToolView.swift @@ -129,6 +129,7 @@ struct PenToolView: View { .font(.title2) .contentShape(.circle) } + .foregroundStyle(.green) .hoverEffect(.lift) .padding(10) } From 682fbbd5b4a719cd66da89b37f58d0691bd8a20c Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 02:41:14 +0700 Subject: [PATCH 05/17] feat: scroll to new added pen --- Memola/Canvas/Tool/Core/Tool.swift | 4 ++ .../Features/Memo/PenTool/PenToolView.swift | 49 +++++++++++++------ 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 43c1a36..c36ffca 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -5,6 +5,7 @@ // Created by Dscyre Scotti on 5/4/24. // +import Combine import SwiftUI import CoreData import Foundation @@ -19,6 +20,8 @@ public class Tool: NSObject, ObservableObject { @Published var isShaking: Bool = false @Published var shakingId: UUID = UUID() + let scrollPublisher = PassthroughSubject() + init(object: ToolObject) { self.object = object } @@ -61,6 +64,7 @@ public class Tool: NSObject, ObservableObject { if let _pen = pen.object { object.pens.add(_pen) } + scrollPublisher.send(pen.id) } func removePen(_ pen: Pen) { diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenTool/PenToolView.swift index 2ff0627..c2c0f85 100644 --- a/Memola/Features/Memo/PenTool/PenToolView.swift +++ b/Memola/Features/Memo/PenTool/PenToolView.swift @@ -15,7 +15,7 @@ struct PenToolView: View { let factor: CGFloat = 1.22 var body: some View { - VStack(alignment: .trailing, spacing: 0) { + ScrollViewReader { proxy in ScrollView(.vertical, showsIndicators: false) { if tool.isReordering { LazyVStack(spacing: 0) { @@ -23,12 +23,14 @@ struct PenToolView: View { if pen.strokeStyle == .marker { penView(pen) .offset(y: tool.isShaking ? 1.5 : -1.5) + .id(pen.id) } else { penView(pen) + .id(pen.id) } } } - .padding(.vertical, 5) + .padding(.vertical, 10) .padding(.leading, 40) .onAppear { withAnimation(.easeInOut.repeatForever().speed(5)) { @@ -40,23 +42,22 @@ struct PenToolView: View { LazyVStack(spacing: 0) { ForEach(tool.pens) { pen in penView(pen) + .id(pen.id) } } - .padding(.vertical, 5) + .padding(.vertical, 10) .padding(.leading, 40) } } - VStack(spacing: 0) { - Divider() - if tool.isReordering { - reorderCancelButton - } else { - newPenButton + .onReceive(tool.scrollPublisher) { id in + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + withAnimation { + proxy.scrollTo(id) + } } } - .frame(width: width * factor - 20) } - .frame(maxHeight: (height * factor + 10) * 8) + .frame(maxHeight:( (height * factor + 10) * 7) + 20) .fixedSize() .background { HStack(spacing: 0) { @@ -66,6 +67,16 @@ struct PenToolView: View { } } .clipShape(.rect(cornerRadii: .init(bottomTrailing: 20, topTrailing: 20))) + .overlay(alignment: .bottomLeading) { + Group { + if tool.isReordering { + doneButton + } else { + newPenButton + } + } + .offset(x: 60, y: 10) + } } @ViewBuilder @@ -125,25 +136,33 @@ struct PenToolView: View { let _pen = Pen(object: pen) tool.addPen(_pen) } label: { - Image(systemName: "pencil.tip.crop.circle.badge.plus") + Image(systemName: "plus.circle.fill") .font(.title2) + .padding(1) .contentShape(.circle) + .background { + Circle() + .fill(.white) + } } .foregroundStyle(.green) .hoverEffect(.lift) - .padding(10) } - var reorderCancelButton: some View { + var doneButton: some View { Button { tool.isReordering = false } label: { Image(systemName: "xmark.circle") .font(.title2) + .padding(1) .contentShape(.circle) + .background { + Circle() + .fill(.white) + } } .hoverEffect(.lift) - .padding(10) } func penPreview(_ pen: Pen) -> some View { From 5a9b9d60c618a806adf1fb0c96da3157ebf27c85 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 11:12:31 +0700 Subject: [PATCH 06/17] feat: add duplicate and remove button --- Memola.xcodeproj/project.pbxproj | 16 +-- Memola/Canvas/Tool/Core/Tool.swift | 29 +++++- ...er.swift => ContextMenuViewModifier.swift} | 6 +- ...odifier.swift => OnDragViewModifier.swift} | 6 +- .../Memo/PenTool/PenDropDelegate.swift | 2 +- .../Features/Memo/PenTool/PenToolView.swift | 99 +++++++------------ 6 files changed, 75 insertions(+), 83 deletions(-) rename Memola/Components/ViewModifiers/{ContextMenuableViewModifier.swift => ContextMenuViewModifier.swift} (72%) rename Memola/Components/ViewModifiers/{DraggableViewModifier.swift => OnDragViewModifier.swift} (75%) diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index fba1545..12d425f 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ EC0D14212BF79C73009BFE5F /* ToolObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14202BF79C73009BFE5F /* ToolObject.swift */; }; EC0D14242BF79C98009BFE5F /* MemolaModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14222BF79C98009BFE5F /* MemolaModel.xcdatamodeld */; }; EC0D14262BF7A8C9009BFE5F /* PenObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14252BF7A8C9009BFE5F /* PenObject.swift */; }; - EC0D14282BF7BF20009BFE5F /* ContextMenuableViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14272BF7BF20009BFE5F /* ContextMenuableViewModifier.swift */; }; + EC0D14282BF7BF20009BFE5F /* ContextMenuViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14272BF7BF20009BFE5F /* ContextMenuViewModifier.swift */; }; EC3565522BEFC65F00A4E0BF /* NSManagedObjectContext++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565512BEFC65F00A4E0BF /* NSManagedObjectContext++.swift */; }; EC3565542BEFC6AD00A4E0BF /* View++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565532BEFC6AD00A4E0BF /* View++.swift */; }; EC3565562BEFC7B300A4E0BF /* NSManagedObject++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3565552BEFC7B300A4E0BF /* NSManagedObject++.swift */; }; @@ -18,7 +18,7 @@ EC35655C2BF0712A00A4E0BF /* Float++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC35655B2BF0712A00A4E0BF /* Float++.swift */; }; EC4538892BEBCAE000A86FEC /* Quad.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC4538882BEBCAE000A86FEC /* Quad.swift */; }; EC5050072BF65CED00B4D86E /* PenDropDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC5050062BF65CED00B4D86E /* PenDropDelegate.swift */; }; - EC50500D2BF6674400B4D86E /* DraggableViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC50500C2BF6674400B4D86E /* DraggableViewModifier.swift */; }; + EC50500D2BF6674400B4D86E /* OnDragViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC50500C2BF6674400B4D86E /* OnDragViewModifier.swift */; }; EC7F6BEC2BE5E6E300A34A7B /* MemolaApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7F6BEB2BE5E6E300A34A7B /* MemolaApp.swift */; }; EC7F6BF02BE5E6E400A34A7B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC7F6BEF2BE5E6E400A34A7B /* Assets.xcassets */; }; EC7F6BF32BE5E6E400A34A7B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC7F6BF22BE5E6E400A34A7B /* Preview Assets.xcassets */; }; @@ -87,7 +87,7 @@ EC0D14202BF79C73009BFE5F /* ToolObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolObject.swift; sourceTree = ""; }; EC0D14232BF79C98009BFE5F /* MemolaModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MemolaModel.xcdatamodel; sourceTree = ""; }; EC0D14252BF7A8C9009BFE5F /* PenObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenObject.swift; sourceTree = ""; }; - EC0D14272BF7BF20009BFE5F /* ContextMenuableViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuableViewModifier.swift; sourceTree = ""; }; + EC0D14272BF7BF20009BFE5F /* ContextMenuViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuViewModifier.swift; sourceTree = ""; }; EC3565512BEFC65F00A4E0BF /* NSManagedObjectContext++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSManagedObjectContext++.swift"; sourceTree = ""; }; EC3565532BEFC6AD00A4E0BF /* View++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View++.swift"; sourceTree = ""; }; EC3565552BEFC7B300A4E0BF /* NSManagedObject++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSManagedObject++.swift"; sourceTree = ""; }; @@ -95,7 +95,7 @@ EC35655B2BF0712A00A4E0BF /* Float++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Float++.swift"; sourceTree = ""; }; EC4538882BEBCAE000A86FEC /* Quad.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Quad.swift; sourceTree = ""; }; EC5050062BF65CED00B4D86E /* PenDropDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenDropDelegate.swift; sourceTree = ""; }; - EC50500C2BF6674400B4D86E /* DraggableViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraggableViewModifier.swift; sourceTree = ""; }; + EC50500C2BF6674400B4D86E /* OnDragViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnDragViewModifier.swift; sourceTree = ""; }; EC50500E2BF670EA00B4D86E /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; EC7F6BE82BE5E6E300A34A7B /* Memola.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Memola.app; sourceTree = BUILT_PRODUCTS_DIR; }; EC7F6BEB2BE5E6E300A34A7B /* MemolaApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemolaApp.swift; sourceTree = ""; }; @@ -233,8 +233,8 @@ EC50500B2BF6673300B4D86E /* ViewModifiers */ = { isa = PBXGroup; children = ( - EC50500C2BF6674400B4D86E /* DraggableViewModifier.swift */, - EC0D14272BF7BF20009BFE5F /* ContextMenuableViewModifier.swift */, + EC50500C2BF6674400B4D86E /* OnDragViewModifier.swift */, + EC0D14272BF7BF20009BFE5F /* ContextMenuViewModifier.swift */, ); path = ViewModifiers; sourceTree = ""; @@ -721,7 +721,7 @@ ECA738C92BE60EF700A4542E /* GraphicContext.swift in Sources */, ECA738F62BE612B700A4542E /* MTLDevice++.swift in Sources */, EC0D14212BF79C73009BFE5F /* ToolObject.swift in Sources */, - EC50500D2BF6674400B4D86E /* DraggableViewModifier.swift in Sources */, + EC50500D2BF6674400B4D86E /* OnDragViewModifier.swift in Sources */, ECA7389E2BE601CB00A4542E /* QuadVertex.swift in Sources */, ECA738B32BE60D9E00A4542E /* CanvasView.swift in Sources */, ECA738C42BE60E8800A4542E /* MarkerPenStyle.swift in Sources */, @@ -737,7 +737,7 @@ ECA738DE2BE610A000A4542E /* ViewPortRenderPass.swift in Sources */, EC7F6BEC2BE5E6E300A34A7B /* MemolaApp.swift in Sources */, ECA738A02BE601E400A4542E /* ViewPortVertex.swift in Sources */, - EC0D14282BF7BF20009BFE5F /* ContextMenuableViewModifier.swift in Sources */, + EC0D14282BF7BF20009BFE5F /* ContextMenuViewModifier.swift in Sources */, ECA738BC2BE60E0300A4542E /* Tool.swift in Sources */, ECA738972BE6014200A4542E /* Graphic.metal in Sources */, ECA7388A2BE6006A00A4542E /* PipelineStates.swift in Sources */, diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index c36ffca..609530a 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -16,9 +16,6 @@ public class Tool: NSObject, ObservableObject { @Published var pens: [Pen] = [] @Published var selectedPen: Pen? @Published var draggedPen: Pen? - @Published var isReordering: Bool = false - @Published var isShaking: Bool = false - @Published var shakingId: UUID = UUID() let scrollPublisher = PassthroughSubject() @@ -47,6 +44,9 @@ public class Tool: NSObject, ObservableObject { selectedPen = pen } selectedPen?.isSelected = true + withPersistence(\.viewContext) { context in + try context.saveIfNeeded() + } } func unselectPen(_ pen: Pen) { @@ -54,6 +54,23 @@ public class Tool: NSObject, ObservableObject { withAnimation { selectedPen = nil } + withPersistence(\.viewContext) { context in + try context.saveIfNeeded() + } + } + + func duplicatePen(_ pen: Pen, of originalPen: Pen) { + guard let index = pens.firstIndex(where: { originalPen === $0 }) else { return } + withAnimation { + pens.insert(pen, at: index + 1) + } + selectPen(pen) + withPersistence(\.viewContext) { [pens] context in + for (index, pen) in pens.enumerated() { + pen.object?.orderIndex = Int16(index) + } + try context.saveIfNeeded() + } } func addPen(_ pen: Pen) { @@ -65,6 +82,9 @@ public class Tool: NSObject, ObservableObject { object.pens.add(_pen) } scrollPublisher.send(pen.id) + withPersistence(\.viewContext) { context in + try context.saveIfNeeded() + } } func removePen(_ pen: Pen) { @@ -76,5 +96,8 @@ public class Tool: NSObject, ObservableObject { _pen.tool = nil object.pens.remove(_pen) } + withPersistence(\.viewContext) { context in + try context.saveIfNeeded() + } } } diff --git a/Memola/Components/ViewModifiers/ContextMenuableViewModifier.swift b/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift similarity index 72% rename from Memola/Components/ViewModifiers/ContextMenuableViewModifier.swift rename to Memola/Components/ViewModifiers/ContextMenuViewModifier.swift index ae270c8..9c7a335 100644 --- a/Memola/Components/ViewModifiers/ContextMenuableViewModifier.swift +++ b/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift @@ -1,5 +1,5 @@ // -// ContextMenuableViewModifier.swift +// ContextMenuViewModifier.swift // Memola // // Created by Dscyre Scotti on 5/17/24. @@ -8,7 +8,7 @@ import SwiftUI import Foundation -struct ContextMenuableViewModifier: ViewModifier { +struct ContextMenuViewModifier: ViewModifier { let condition: Bool let menuItems: () -> MenuContent @@ -24,6 +24,6 @@ struct ContextMenuableViewModifier: ViewModifier { public extension View { func contextMenu(if condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent) -> some View { - modifier(ContextMenuableViewModifier(condition: condition, menuItems: menuItems)) + modifier(ContextMenuViewModifier(condition: condition, menuItems: menuItems)) } } diff --git a/Memola/Components/ViewModifiers/DraggableViewModifier.swift b/Memola/Components/ViewModifiers/OnDragViewModifier.swift similarity index 75% rename from Memola/Components/ViewModifiers/DraggableViewModifier.swift rename to Memola/Components/ViewModifiers/OnDragViewModifier.swift index 689834e..b60d540 100644 --- a/Memola/Components/ViewModifiers/DraggableViewModifier.swift +++ b/Memola/Components/ViewModifiers/OnDragViewModifier.swift @@ -1,5 +1,5 @@ // -// DraggableViewModifier.swift +// OnDragViewModifier.swift // Memola // // Created by Dscyre Scotti on 5/16/24. @@ -8,7 +8,7 @@ import SwiftUI import Foundation -struct DraggableViewModifier: ViewModifier { +struct OnDragViewModifier: ViewModifier { let condition: Bool let data: () -> NSItemProvider let preview: () -> Preview @@ -25,6 +25,6 @@ struct DraggableViewModifier: ViewModifier { public extension View { func onDrag(if condition: Bool, data: @escaping () -> NSItemProvider, @ViewBuilder preview: @escaping () -> Preview) -> some View { - modifier(DraggableViewModifier(condition: condition, data: data, preview: preview)) + modifier(OnDragViewModifier(condition: condition, data: data, preview: preview)) } } diff --git a/Memola/Features/Memo/PenTool/PenDropDelegate.swift b/Memola/Features/Memo/PenTool/PenDropDelegate.swift index dbc479b..d784d1d 100644 --- a/Memola/Features/Memo/PenTool/PenDropDelegate.swift +++ b/Memola/Features/Memo/PenTool/PenDropDelegate.swift @@ -27,11 +27,11 @@ struct PenDropDelegate: DropDelegate { tool.pens.move(fromOffsets: IndexSet(integer: fromIndex), toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex) tool.objectWillChange.send() } - tool.shakingId = UUID() withPersistence(\.viewContext) { context in for (index, pen) in tool.pens.enumerated() { pen.object?.orderIndex = Int16(index) } + try context.saveIfNeeded() } } } diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenTool/PenToolView.swift index c2c0f85..717bb28 100644 --- a/Memola/Features/Memo/PenTool/PenToolView.swift +++ b/Memola/Features/Memo/PenTool/PenToolView.swift @@ -17,37 +17,14 @@ struct PenToolView: View { var body: some View { ScrollViewReader { proxy in ScrollView(.vertical, showsIndicators: false) { - if tool.isReordering { - LazyVStack(spacing: 0) { - ForEach(tool.pens) { pen in - if pen.strokeStyle == .marker { - penView(pen) - .offset(y: tool.isShaking ? 1.5 : -1.5) - .id(pen.id) - } else { - penView(pen) - .id(pen.id) - } - } + LazyVStack(spacing: 0) { + ForEach(tool.pens) { pen in + penView(pen) + .id(pen.id) } - .padding(.vertical, 10) - .padding(.leading, 40) - .onAppear { - withAnimation(.easeInOut.repeatForever().speed(5)) { - tool.isShaking.toggle() - } - } - .id(tool.shakingId) - } else { - LazyVStack(spacing: 0) { - ForEach(tool.pens) { pen in - penView(pen) - .id(pen.id) - } - } - .padding(.vertical, 10) - .padding(.leading, 40) } + .padding(.vertical, 10) + .padding(.leading, 40) } .onReceive(tool.scrollPublisher) { id in DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { @@ -68,14 +45,8 @@ struct PenToolView: View { } .clipShape(.rect(cornerRadii: .init(bottomTrailing: 20, topTrailing: 20))) .overlay(alignment: .bottomLeading) { - Group { - if tool.isReordering { - doneButton - } else { - newPenButton - } - } - .offset(x: 60, y: 10) + newPenButton + .offset(x: 60, y: 10) } } @@ -102,20 +73,34 @@ struct PenToolView: View { tool.selectPen(pen) } } - .disabled(tool.isReordering) - .contextMenu(if: pen.strokeStyle != .eraser && !tool.isReordering) { - Button { - tool.isReordering = true - } label: { - Label("Rearrange", systemImage: "arrow.up.arrow.down.circle") - } - Button(role: .destructive) { - tool.removePen(pen) - } label: { - Label("Delete", systemImage: "trash") + .contextMenu(if: pen.strokeStyle != .eraser) { + ControlGroup { + Button { + let originalPen = pen + let pen = PenObject.createObject(\.viewContext, penStyle: originalPen.style) + pen.color = originalPen.color + pen.isSelected = true + pen.tool = tool.object + let _pen = Pen(object: pen) + tool.duplicatePen(_pen, of: originalPen) + } label: { + Label( + title: { Text("Duplicate") }, + icon: { Image(systemName: "plus.square.on.square") } + ) + } + Button(role: .destructive) { + tool.removePen(pen) + } label: { + Label( + title: { Text("Remove") }, + icon: { Image(systemName: "trash") } + ) + } } + .controlGroupStyle(.menu) } - .onDrag(if: pen.strokeStyle != .eraser && tool.isReordering) { + .onDrag(if: pen.strokeStyle != .eraser) { tool.draggedPen = pen return NSItemProvider(contentsOf: URL(string: pen.id)) ?? NSItemProvider() } preview: { @@ -149,22 +134,6 @@ struct PenToolView: View { .hoverEffect(.lift) } - var doneButton: some View { - Button { - tool.isReordering = false - } label: { - Image(systemName: "xmark.circle") - .font(.title2) - .padding(1) - .contentShape(.circle) - .background { - Circle() - .fill(.white) - } - } - .hoverEffect(.lift) - } - func penPreview(_ pen: Pen) -> some View { ZStack { if let tip = pen.style.icon.tip { From 5d38f33285b88932b3ff5bf9d0a7c074a311ae55 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 11:58:52 +0700 Subject: [PATCH 07/17] feat: add scroll transition --- Memola/Features/Memo/PenTool/PenToolView.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenTool/PenToolView.swift index 717bb28..f75e5f7 100644 --- a/Memola/Features/Memo/PenTool/PenToolView.swift +++ b/Memola/Features/Memo/PenTool/PenToolView.swift @@ -21,6 +21,10 @@ struct PenToolView: View { ForEach(tool.pens) { pen in penView(pen) .id(pen.id) + .scrollTransition { content, phase in + content + .scaleEffect(phase.isIdentity ? 1 : 0.04, anchor: .trailing) + } } } .padding(.vertical, 10) @@ -64,7 +68,6 @@ struct PenToolView: View { } .frame(width: width * factor, height: height * factor) .padding(.vertical, 5) - .padding(.leading, 10) .contentShape(.rect(cornerRadii: .init(topLeading: 10, bottomLeading: 10))) .onTapGesture { if tool.selectedPen === pen { @@ -108,6 +111,7 @@ struct PenToolView: View { .contentShape(.dragPreview, .rect(cornerRadius: 10)) } .onDrop(of: [.item], delegate: PenDropDelegate(id: pen.id, tool: tool)) + .padding(.leading, 10) .offset(x: tool.selectedPen === pen ? 0 : 28) } From ce3a021569fe86de7f559c32818dc943c39a1841 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 12:41:18 +0700 Subject: [PATCH 08/17] feat: update pen dock layout --- Memola.xcodeproj/project.pbxproj | 14 ++++++------ Memola/Features/Memo/Memo/MemoView.swift | 12 ++++++----- .../PenDockView.swift} | 20 ++++++++---------- .../PenDropDelegate.swift | 0 .../eraser/eraser.imageset/eraser.png | Bin 3408 -> 3525 bytes .../eraser/eraser.imageset/eraser@2x.png | Bin 10666 -> 11366 bytes .../eraser/eraser.imageset/eraser@3x.png | Bin 18347 -> 18647 bytes .../pens/marker-base.imageset/marker-base.png | Bin 4108 -> 4372 bytes .../marker-base.imageset/marker-base@2x.png | Bin 11965 -> 12502 bytes .../marker-base.imageset/marker-base@3x.png | Bin 23702 -> 25886 bytes .../pens/marker-tip.imageset/marker-tip.png | Bin 381 -> 384 bytes .../marker-tip.imageset/marker-tip@2x.png | Bin 770 -> 787 bytes .../marker-tip.imageset/marker-tip@3x.png | Bin 1149 -> 1189 bytes 13 files changed, 23 insertions(+), 23 deletions(-) rename Memola/Features/Memo/{PenTool/PenToolView.swift => PenDock/PenDockView.swift} (93%) rename Memola/Features/Memo/{PenTool => PenDock}/PenDropDelegate.swift (100%) diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index 12d425f..e6dc41e 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -74,7 +74,7 @@ ECA738F42BE612A000A4542E /* Array++.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA738F32BE612A000A4542E /* Array++.swift */; }; ECA738F62BE612B700A4542E /* MTLDevice++.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA738F52BE612B700A4542E /* MTLDevice++.swift */; }; ECA738FC2BE61C5200A4542E /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA738FB2BE61C5200A4542E /* Persistence.swift */; }; - ECA739082BE623F300A4542E /* PenToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA739072BE623F300A4542E /* PenToolView.swift */; }; + ECA739082BE623F300A4542E /* PenDockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA739072BE623F300A4542E /* PenDockView.swift */; }; ECEC01A82BEE11BA006DA24C /* QuadShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECEC01A72BEE11BA006DA24C /* QuadShape.swift */; }; ECFA15202BEF21EF00455818 /* MemoObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFA151F2BEF21EF00455818 /* MemoObject.swift */; }; ECFA15222BEF21F500455818 /* CanvasObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFA15212BEF21F500455818 /* CanvasObject.swift */; }; @@ -153,7 +153,7 @@ ECA738F32BE612A000A4542E /* Array++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array++.swift"; sourceTree = ""; }; ECA738F52BE612B700A4542E /* MTLDevice++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MTLDevice++.swift"; sourceTree = ""; }; ECA738FB2BE61C5200A4542E /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; - ECA739072BE623F300A4542E /* PenToolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenToolView.swift; sourceTree = ""; }; + ECA739072BE623F300A4542E /* PenDockView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenDockView.swift; sourceTree = ""; }; ECEC01A72BEE11BA006DA24C /* QuadShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuadShape.swift; sourceTree = ""; }; ECFA151F2BEF21EF00455818 /* MemoObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoObject.swift; sourceTree = ""; }; ECFA15212BEF21F500455818 /* CanvasObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CanvasObject.swift; sourceTree = ""; }; @@ -197,13 +197,13 @@ path = Core; sourceTree = ""; }; - EC5050052BF65CCD00B4D86E /* PenTool */ = { + EC5050052BF65CCD00B4D86E /* PenDock */ = { isa = PBXGroup; children = ( - ECA739072BE623F300A4542E /* PenToolView.swift */, + ECA739072BE623F300A4542E /* PenDockView.swift */, EC5050062BF65CED00B4D86E /* PenDropDelegate.swift */, ); - path = PenTool; + path = PenDock; sourceTree = ""; }; EC5050082BF65D0500B4D86E /* Memo */ = { @@ -316,7 +316,7 @@ isa = PBXGroup; children = ( EC5050082BF65D0500B4D86E /* Memo */, - EC5050052BF65CCD00B4D86E /* PenTool */, + EC5050052BF65CCD00B4D86E /* PenDock */, ); path = Memo; sourceTree = ""; @@ -700,7 +700,7 @@ ECA738862BE5FF2500A4542E /* Canvas.swift in Sources */, ECA738882BE5FF4400A4542E /* Renderer.swift in Sources */, ECA738D42BE60F9100A4542E /* StrokeGenerator.swift in Sources */, - ECA739082BE623F300A4542E /* PenToolView.swift in Sources */, + ECA739082BE623F300A4542E /* PenDockView.swift in Sources */, ECA738CB2BE60F1900A4542E /* ViewPortContext.swift in Sources */, ECA738EE2BE6125D00A4542E /* simd_float4x4++.swift in Sources */, ECA7388C2BE6009600A4542E /* Textures.swift in Sources */, diff --git a/Memola/Features/Memo/Memo/MemoView.swift b/Memola/Features/Memo/Memo/MemoView.swift index 60a1a0c..53c2591 100644 --- a/Memola/Features/Memo/Memo/MemoView.swift +++ b/Memola/Features/Memo/Memo/MemoView.swift @@ -27,11 +27,13 @@ struct MemoView: View { CanvasView() .ignoresSafeArea() .overlay(alignment: .topTrailing) { - VStack(alignment: .trailing, spacing: 20) { - historyTool - PenToolView() - } - .padding() + historyTool + .padding() + } + .overlay(alignment: .trailing) { + PenDockView() + .frame(maxHeight: .infinity) + .padding() } .overlay(alignment: .topLeading) { Button { diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift similarity index 93% rename from Memola/Features/Memo/PenTool/PenToolView.swift rename to Memola/Features/Memo/PenDock/PenDockView.swift index f75e5f7..4b9140c 100644 --- a/Memola/Features/Memo/PenTool/PenToolView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -1,5 +1,5 @@ // -// PenToolView.swift +// PenDockView.swift // Memola // // Created by Dscyre Scotti on 5/4/24. @@ -7,12 +7,12 @@ import SwiftUI -struct PenToolView: View { +struct PenDockView: View { @EnvironmentObject var tool: Tool - let width: CGFloat = 80 + let width: CGFloat = 90 let height: CGFloat = 30 - let factor: CGFloat = 1.22 + let factor: CGFloat = 0.95 var body: some View { ScrollViewReader { proxy in @@ -40,12 +40,10 @@ struct PenToolView: View { } .frame(maxHeight:( (height * factor + 10) * 7) + 20) .fixedSize() - .background { - HStack(spacing: 0) { - Spacer(minLength: 70) - RoundedRectangle(cornerRadius: 20) - .fill(.regularMaterial) - } + .background(alignment: .trailing) { + RoundedRectangle(cornerRadius: 20) + .fill(.regularMaterial) + .frame(width: width * factor - 15) } .clipShape(.rect(cornerRadii: .init(bottomTrailing: 20, topTrailing: 20))) .overlay(alignment: .bottomLeading) { @@ -112,7 +110,7 @@ struct PenToolView: View { } .onDrop(of: [.item], delegate: PenDropDelegate(id: pen.id, tool: tool)) .padding(.leading, 10) - .offset(x: tool.selectedPen === pen ? 0 : 28) + .offset(x: tool.selectedPen === pen ? 0 : 25) } var newPenButton: some View { diff --git a/Memola/Features/Memo/PenTool/PenDropDelegate.swift b/Memola/Features/Memo/PenDock/PenDropDelegate.swift similarity index 100% rename from Memola/Features/Memo/PenTool/PenDropDelegate.swift rename to Memola/Features/Memo/PenDock/PenDropDelegate.swift diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/eraser/eraser.imageset/eraser.png b/Memola/Resources/Assets/Assets.xcassets/graphics/eraser/eraser.imageset/eraser.png index 0dc2a6278067ae3e4a63692f6845b878e9961594..cfaade764f7655013c19307926c4fdcebe62f08d 100644 GIT binary patch delta 3467 zcmV;64RrF*8pRtSiBL{Q4GJ0x0000DNk~Le000280000y2nGNE0Kzcfz>y&|9t~Pa zL_t(|0qtGSiyX%luIj0s9ecGJS;DN4jlB_(b1i>JnD__5L70`X*NDZER*P1%+MVvy z*X}od^X64|&#q#k?fPK0tE*nUdR6_+n^&)Uc8u8uvMjUWT&-tqR#AgG%li~%EAJyr`(!~na*IClXbwL(wM~@!04?p~H zR%Roxyu57rnA}zgX)nf+{iOb)4f-wm&^%~Pq4nf-nqJby=YjdkvSN$69yAWw#pkEl zC2f#0(mptXE?;}O7TWx|J>K3? zA{QSG@K_1Ri$T27WMg9^xpwVZcHn=&fr0$e(vrcsKU#mx`u)CbwOaWRvXGgXnL*i5 zJL*V=j;P}@R5l7|EE=1GbjouYgT|J9s2)0DFO{(l{@l=9Fdo^5`Z8T1+i9t3-Jpk$ zPxX)qjj5f>d6LbTgSPhCoca2ZEmSAh24${~xWR4F+W7i#dzsxs^U~`0`nG@D?R0T* zF&)~7fW+QaCtrT~W#U<${B2?3Cv(%&uQ_Xfo>=?1*$NQLREFZ)kS}oO)mMkk-+S*p z^Vw&gnb%)`-9+qsI4Xd|hn(bg*Qf`67+2o{2l4PjP z&%x~4wQHn4VrL>Ja^a1wCvtz{JG3$>J z>uxbVPWS9li99tm6^YysIHcN;SDc-lZT~# z`sG+$p6iii2J1r$nTWr2>sIcO?H1k`5%(WlapNElEvB4%E%#si;)lwix;n%Oy+O*x z(%OnQf_>nDA^R+zZ^ROhw%{MYlUd zSfBew&N0Tw4T3{#{OEt9k0uXwI;X7`7l$C@W*IKX{&jT+!Ur`BDRlW;X+t3d;$skb z@7}#8q8V_=RN$WXgtgBNd{?GYFPqFJ}opTBXbBEIc2>ZkJ}~W zrR^XxG8U1@&4EkP)H-Vq2QPV@xVFmch6pL^%SanI&$``6hFI;3yu&`L!{OEhIEdjua0cH zJyM06A$xpEE}}VbF0|1Dw9Q^sJk9&n?JMKzGAJ_A^KNWx+~&=u}Wys@AqS9(J&;X1m)zbDr-8ZoTg!YT((X)BF>S18<|ujapU0puK%%G zWUgBdwbg%(k;f#nMpwkhyLaz45zT>9GX+{2tqNKW87RwY)X`t2hn{{D-j|+yi(a`o zaHY43$0b75E$mQR*(R`#oIrepvw3hiRp@a?&68SN?`8(C=U-oYo}$>^wNt6W1w+?(T(-TAy)shja)aYY~6R+$^}PDp#y|W;&PcA$cvYToop0 zp8^5fBxyn9UauF)+#n?WVqeWmWgeJ&N`5ZeHF=4;@pnj%C~H(reYy`sj%W^?&+yuz z@9KrJ1KP$*%1Bgs#Hvq#kS^|}70-)@hUh=kM>GSjZ_HJT@9WVGiMr&{h!*m|HM0%D zw4Hz4^l{v|Gg37%F%e1JFo4Kk<=;Tv<_2p^B&N2y8$)Hh%#6m!&bd6ih-7XKT-NX3 zO#hePHm=GcZ&MdGtCFxF@y(kzBas_~WIav4GUKAot>x_?bX!`3C#(cQimt2Mbp-op+U7fUARj5%mj_hL02x)&2THNumb0l+fkSwmPeVWIaMJj9XD(;%) zyMJSTILflDlX|3lNGI>hb(D<@;;*cXOsd^(o3*ty6VV*FU%mV8)&HD6y<+Jn7Hr8a z;?R?6TBd=Zd3h>VdFC3=V1Ufh^Mc5ziypZ-a7#-|+1-BspA)Uti+PPCTL|OIjT?Vg zSG{=%%8d`i$oM6oh~~h}&dz3cHa7m@h{%MhTf|i{by-eWwvPkZZ+%_$$OtW>M{W-M zzQ|>(o135P3VBD(GuHL8TWRMA-9eOfNVRo;`062ueEat8n0{*z9DZ@~XT9G0pS<$Q zisfHK-AeYMEVk7=cqq2!^|BwltQdbo-i`*5zx(dHNaO|qH}&$X?Zb;db|xmy47FAf zq0HmfiHWN|1**=AW9Bm#>GbrV8DDckSb^}O)9ILqoey{P=+W%!ufI-j^m^xKoI7KF zEQFq&2+5VmX9z7Gd1P=tIXRg>$_XM*Dql{G*m-dHmH3MnFQ&(Rc=6H6lOKOLYo8rS z!G#D{wXx%JArBo&&+&frqBt_G{{U&1PBY*JCd*p0> ze!l;Uciwsb!Und24@&q?~-T`67a8n?1fk<9bM*WO$p@sr4&t$zx=ZYD1ii z%tcJWH3P2rF?EC&+2zZZ`~Uj(+g~5qzyHHLgFyrYw2yYVvE$^E-a3@Y(Bx!)Ikp%- zRi3M$%ta(}Gtj~xPhzvMu#g`=T3=uJ8GEzo&?$NE?xR`e&4=7 zKh$pH|Fh!N9rBV{7WRM2riQn!svk$c_q_chM@-gg4c?*OeDjUDdiAP#=9y>y@4QER z-TT*2(CRBJeqT}I`{ec4qklM1XRx88t+O=!olJ)i3($Z4? zo`5RI5qy2#&d!Z!H>8{73y#v5L++UOCtCt~%*@P8X}dBXL-v2u{J5=zP#d?W%vNp> z06Q@@&6U|QREHz#y?ovVeKdxgA0MaCpJ{S@9k`69hx*Z6=-T24n`j;RkY}1 zh2~9s;?o z4f1#+piFH9Mb>}%tVsqvsKc?4%QPLlOggA9bfFD0q?6=GhV0f~K=LB6OOLd05A-Rr1))dadh(7#0qjgu-WYEUz`MUCTlD3D&mDf;Pdp=*T4|O!g z%F0TDM<956u^w34#NVvS=(;HL4%*4q5#zzm)ENOEVvv6!){{CV4-JD6dcZ@UJ9p0D z$JjZrsqzEl?KnSi;zZ`0000y2nGNE0O4z~6_Ft{9t`D4 zL_t(|0qtGQiyX%luj;9t9ecGJS;9!z#@;NEb1i?^nD~R>AcSP}fe`vwEn3ZLce+!* zcE8b^H?O*Tc5S%_>Ibu3UG?6pSJl6L_0c`k#%uvumRWJG=Cd-Zm_eT9Iz`$_y8&Ib zKCUZ1woIPsNSR7KGwkz-Zz659d{L(LqZJ=nuj-G{`+i6#)NVz^3jZmOU$b7UxK9g9KZSIn-TewCr=L2M~)mBDWg1|*2<&}DyQS# zy?e7WXU-)4lSw;ozx{Rw-?*&Lvt*Ckf-HZ^4jedOAAR)EtjtH?+O=zz*U5dAkp7|` zsVD6hWw39dL+zk8h5D1{X?DpLZwJ~d(~2)@e^5Q-7jK{Dm-KyJWsRp`RAWoURDL})7sja?RL8<`BHx+ zJ3T#}$ujaq1L<};oxHs`E-x=9up|47_X!8-YCcInWS{dix1-t6>PMT;o;{mE7W(LG zlB?stb`53SBnQ9-j`Q>L=?DRf5Q+$qfOK%qSD37?uP0ZpUdgFJu@|^0Rx}^@~!zTQtH2T4x z8)^&cBmaQ=`d(`@??3W|@?_s2&Fv94xG$kH z=(XGJ)HydiK?eDJm`u){JD2$Xg5)1dOFvtfoqf|;`^&`Ir_5%6F~4%Exdngu0(akd zW9a#es;M04RN0rFu?KXvLYNBtN2A$O%|PKkEsYEG#S}rw$%m+A%%-M>8Qvw{KSoxNFz0NWg{z z1hmD(FY%McQZr;3^pFjNY!!ZIj91gqFUwrXJa{ADr7uv1X&&>~kA8O@W zm(1Pn5YhbJCHAM{9B=~QF!y`ni6@drI-O%yoA-qv=Y?`umHKsU2ZmX7xGrq@TMt7+ zE#`k9;Le>pO+>Tdu=0P!{kkb@UmV1WviVyGWy3QOr)q9kWsma7P9cLKm=h55KM*j^ z|C*0{AMot)<1eVYp@5f{78Z`EVN>8`j@)d&Pfht4>K8Z3rzRVF((j zWWKDA`z7S1?;s#nz>$E>hfCAcI&1d@FIAm+TUC?`5lQBkku7kZb-R&(6AbsamtTG= zv3B%ROYd^mrJz8``)LIewuP16n8 z9LHWA*>-y*3!Bh8{MJlF^Wj`*0Rm`?kgEA2*Q={5=Z$}5P-JAJTVG$#^I`;SKAgV; zG8zF1n~j88c_=d0(Jhg&$`IV|_u~*eAxKJz#Yt0@)@)EZO~dxMY@K0SoMRhiq*0N4 z69ea0kx$klVcm47tnM6eOcH7|!yIt?_U$I3`EcsWQ`=6dg0=?;l&zBM*e|m~Ps504 zM^D1UDA<2|xYAo<<6gk3TXmtbvc*XqIf3{n*5ttDmzW+~(ju3&^)``tK7Y)f(wYvJ zmo})JpDW)>(SBd4>c@&AnggdszB=j9-H^~x(;3%x$c6w`!I6ZM0hd+n^=Xli&SiN> zUfUO}8cwyS8}Ln%4Fv4JJ@6g$y?}CI@o7#dv%1Bg2psI))vc;pK66x?T0{tRtM6==g#$2%YJ_v0D*CmBU zkWj>{xq1z5-^j%X$KAUlSyNL}k$e*Z5b(SFn@L-o_-~4QR91JvqSTj}(K(=VE+2*? z37dZpm-YL%(jW8NV^w>ATeO8mlq4F+ck9-zNWcj|vX-XbnQ>9)7TQ)2y8WiX6HNj` za7y=|BN`32o~GyXOC^WO&|;t}ug>;L)sS3Pk5n;cglrgs@A|o6Bw_QBoL^o2DxXIc zTN;B;ahD-qO&W9mDAO`e+L7`hn_QRMD64-Lgk4@9X;i!2Hmj?vCZhRpzxm*U3;#QI zY}wLJ@!FDGVWB5gw3RDCi>j2aii9=p5rc#>(t&`;ixIH-aF;J%&hGX5|DI~KUdeML zNkSM`Zrpie73m4ehBM}X_!aqx=EKd+&1HAj*Z<{+fP|`BVO4X+vOPUnJ`SYb+M0hF z0Wk!}2-ti$ysKelW8=$hp=hKEu{7Qc~ot+&N<8gcpzZix)osNlUF5H0w2eOM7FQzwp zy;HlLJ8m8nLictJ>mzE-$1BbUJo;h-YsPmdh= z*jf9+$W}~~^>IqNj)-7w*0H-b;U9dg z{`~pu%IfOx9-o;xJ#@i2Bq>9YX`JnwvemW*zOpT3Q}IX^eiZ?Pym8}(*|TSliD)kJ z2Vw9&+{MMk{;%GD|D#V{d+p#{7 z#g+@^fmjL0t(a!R6)!2oFpPiq#PC=Du z`=LX2*130$_Txomi;57k8Y|v1l z`7c1VxfLe~~Y_(c84kG!3Q?F@g1HeR;*v3Aj^7E;_ku_A$q+Yh-!ElB1JuAVW4uj%3IWUN5hU>R4D+1bn)0Y4Oz0qe<_ zQba^W7@`poPo6w!@RCCgO!j>xc{$DxA3mHFZ{i%3%QV@UpPx6(t|QlPe$_84yqqI)L&>ft{LUQ2HMJP@oNJ8qOWkox#j+m9PAa>HMfVp zflcJmbzpU*=tHWDa|B0I1r`l$k+wXIBhM!t(#yVIIPfTIxlM5#sh8Q7J{YO1_-7RP z5n17r(b`F)w82#QAlq27Py4fTt{0qHBXOZKBtt~J*k f8f_yYeiHm2Ma8T;`(*fH00000NkvXXu0mjf6^yu2 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/eraser/eraser.imageset/eraser@2x.png b/Memola/Resources/Assets/Assets.xcassets/graphics/eraser/eraser.imageset/eraser@2x.png index 5820ca5e69b0f3123343d6a72118507612245ff2..560f6ae5aae618e23188d25238916e8ba86b4eb4 100644 GIT binary patch literal 11366 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 literal 10666 zcmX|nbyQUU^Zu?Niz2LG&y~T5B9lxqnl;6#S0JC zJmMsmayH8*<%ZN&%qN=u(fP0Icz{K|odkKMb27sM<{B>p#~r5%1}*A0TBeNHPV-*f z_hBCUl!Bj>Mt?#+%GiF^D0o-&Ntj}DrjmUdOckMA95c`c7SoTZ$4W~Ce$u5G#DXpY z9-R~N>A$rzo~n_=W^9ZjsXoFR6!a{q?~MmQmDFrlh!08SByG`~GP_^kei&x?-AwqyUHM^h6&DR7 zE4r+x3v@o*yg03bOLk3Z79i07iq1s&>5Qs(!@jo_^&HX)9?uxjybnpcNyA#ug~i%Nl$H}yoOhnms$8~`q23t z4{Z%*Nu5k&`}nQu3vBkf?Z~?pH2S@@<*g>NwPv*bgEAF;ucF76DU&WZCLuR+|01&_ z`Hhx3^yB;p{7bdFX>k^3bntS_^w+86h%!=$%MRR2!`}Aq{+r;liJG&XYtX{=4wdBC zoe=e&F0YX1v4zL^{vv?DkMD8&Rq}c1uYYXGS3G%mDjCAAKW3VIywX6M7Jh!N3lOY2 zNrMF>cX&k|X<^DnPi{wgTE^t$L85}K;t`|b50>59jt)l8k2ignoB zv0a?0b7tlOT|@wt*rE&d_>+8oV=)Js0SYF4$;rQ7P$F{hFH%bxPC2qCN=RGpsmM2mF_y{oj0n zVHa6XSbrg`@IYzxd7sXb?U#B7u0DnyrET+)=C?!Fa$@gAcF}lfFS(!b0P&wxT(9?z_Px_g%0L}>-tGdOj2@qw(iNh3 zbZ=d5LvBTL5>p(bfp>_2ZbELo#6`l^=)SdDOD8_H#}Xu%$7vtQP&?d8cWMsjSiJC< zbJLC5ve+!$&~Z?o)KG1`qFII0F(4q3ls{O;6{xi0#qtyV;H4HF@l0{OO9FY$64dLa z`ZaLBXVLrAo_`4d~iX)1XcL|FS`@Z$%M0{mV_m)LOVWM!XND_bp&)Jo^siPYwP%*7tHCKTYGCXB}bzA z65g=(y`8~Q4J$469)*4mf0JT7C!b`R(F?t!_Qn4Qq%GS3v~4UuDEBb(Ka%PMExvr} zw|-ykQHE@tm4`>&a|%l-efQcYBt39Q@wT3jLzJI)ARC2H}oR@M-;W2-DsWsQWG58_meo!k*HJ@ni$LdE(Wh-S8VC!_vxAS@es_=Ih=$)U77oHJhbq|cu} zB$~fodmDDNK0r=)IT##z_3u|%S6A0YFmQk#1leWiB;smNUzA{FqPIam)5N%XYYJU z3=a<{4Hp!5LG}UV{Cnrtq;suK0Yw>e&I9RSBd^`4rM^DKC%T~vh(FSs(%!p3LVziWq^O~}f^U0{TIp}-L8(_x^aR=ni!E-^6LgNfBJNggJ z7fa;!b0Q-6(){h+kFVD-CE;0(*`JNs{pABGCU5m5#ozr^S z_;q_Et=gaNnpd(W09!GY&_O}8=NKfdCNa1?8>&$1*7JIIJ@;IP)QkiffvO{|?oCf{H5R+5&w z$pp{gbZ2r5Xg6E$8jcDaYj5hXKUM#T`MZ>JaD-Jyz7uHHoYh=7L7&Qt7N*Cl8n_Ie zTh^=!RJ#28WZyGyMdT$F@uPMmBb8+}rswQ9j^8lXO;KR*c;y5{?Lqz8SoGWi;$E28 z)EsezbPj9{{3MNG*!-04wp1vixr~akJ2N;?JxqR5Jnd_U% zDnBnjkBgL;H$wZ5(do+jQxx9-DfXW6oe;#rKT7?}7lRtcy03p}M!(=rS7Q`09B<-Aia?~nc(?OxCMoXuJ}B5$p!!?Zw!C?1kOdixzp|XJoDxdbs z{Y$NFynu|<$K~smvz% zLWkJ*DuUUA%itW&{2pXRAxLC;;oCVoL0|_ncj`SQ7lW4p>r8`Q^NC|x&DM1?>(Is> zr^BSB#e_|XL;=^u^~Is!4(lq*V~-yLOc1?*T!;F z`Rm5Z}0ZzG+hf-oyxgtpOb+y?(HSg`6RNM3@LCeINZ zoeofnRCkUfgC+)^rH(B-Fnb~sHtO^hGC0jxXB#ea5f=4`a~<1746C7Tx*1(mpO&zK zb`+Fj+H33CmohHRh6P?fI)<+qp@GBms}~m{*RvKax&lV5nXtqFBvr!~ZIc6%V8X{V zndXOHAkD3&u(+WOsOn(0l8R}`-`LeruJ$&)F`0~~Y56nT`kDfJTli4d#*-3Hg9~el zmbYTbWlafHfvv#b4A4R-pTXA0ezIP)kBDww_mb*ly;TEKQz~jr$G7dvmoV|M2|_LFcXMqK3P z=HPH>J%fzlNC-Ncvm{)E0zWGHCp^w&i9{*v13xWua7QmfFSmZAP$AR%XO)Yz3j%O2 zgXX{30}A|nS2n@J>+Ec)Vi!81`5kL%77unuqXMOc72a}`9K>(%Lr`;b1@B|1Q|IqV zBztrsO=M+dsdlNeYTu2jFftc*@Asd)1jFdi`P;Z1Gxt@-|Y0t?gU0bz- z@tw>p5>`}=-7Ig7J2Nf2e!PHZu4M_y>gxl=gxvFwm%8Pt?=n0gBHYQ97Z7e2s$KD9 z9LLD|WAuNG_Y`}Ff%BJL*>4*0_}YVe$EQATzMl2k&g~Jcw{9rD9p2Cs^_a?$Q)KBw z>1ODhh%Uc=zg7)O2yxwF-v2!_(+5{plsjfzRX9OE(eYg6snbG}NU_CPXp&ln*2>Il zLqOOnLUqMusX@QoT;`Y$MMblE7tb>|FUF)dgejp7jn@sXnl1)5gYP?GK0?G$Q8?Qw ze&Y#7^!0q~{C!t(AWMth{)N~>j)0idL4sPBKV93_iox{b3Fichq|ZZ)*d*hp(3>cy zsnn>a2E%%%{DL1FugQYK!!6MlRj>?aR>-ng!2784Wm2Kwms0;Pxgq+js{ucYAqQ4C39{0!xRQ_!>f zj>0`Dy{oFB+eI8Ab*h*q7qufHF@>+EYLa2}ArP||H@o%zv?9iqkDax$JUl$!6yBzt zkwbK1vDjlny>!n*%r~X%Ws>;u;T}HuTql8yQp_w`*3Vlx2vG|Cch5lf8o&KWM}7}Xl|*fW+ZV2-d`@suCDKp zA9a;8%Xz1=HgU2J2IrPuNCSk5o)MSuNZ_8e)KkH|Z_jbu?Om|+U|-U!Gx4)w{)=7b zkC7pC1nN^Gb2MdbX4dtNLYPRG1cbu{Ha$J~ZQ_s#m|M>Gzjw++5~xoT9i{te%I8-V z$_HmKIa6MfKG_{2E6sT~fE9BMU{5p6w}A^u6z{qC{RDr<*^&0q=g?14y2(!Z>B73w zqwR&B*%-?)rGv!_9|^iI3W5SU_tsx=Gs5frqCdf(pC-+uHwvjGjklr^r=#mmEx#Hw z0nJ1W8{QVejEsyC5rom4dmD!_b6WCBik^Fgue+BnbPW{bHm6@a=PFdb{0v%C>b2^# zLqR>JHVF@`9dL#kmbwx6?k23*tNCCq_eX6h^LTHs7T2ncD2Y&Y@#)SRC&4qoCO?k< zoG|u5Zd~0648JY<+=%UBuE3G(mTFS&^@2*Y(4lq-~=q9z-mcg(-btTAVeM#&>Q$*`VIV>3ACy;X+)*5S9>2)uLJJW7H#+Jem30NI7I^MkkEK z^uOxEC%m+%UifQoh{ExPp8Hg9|AQ$2b=`S4&Mip@7^<17P-RnL-KTXk+>HTxKe1A7|AO}&XEbGerU=MJ9bXMk#+)IlFq#Mq(6l-lvW{DI1>m&@>$ z#Tk`RF9TKAkP+@XhU_E89S_~syb2R%wLL%1OWisM?yTZNkK@ajq?Sz%n&SH}o$eTa zlHGaVa$Q$#^V%^@DOrX|nEJd>?VSB$&dSa~DFn@Ls~iboD}xU?2u(pjhp{drrb~?@ z5Zw-skEf;==_CZ8pBg7vK?&8ww1tGkq%>n+PcDM(gMmj84L|8Ev*EDZ_1;f?-H6kP zR~+s(so(@9%epx1R93gb=A0`fXEkx$UPIiqL3G3atn{eEiK#Pt$XHjTI2ub8A)Bbn z>6xaf2r7$w&S!3W;4eG`d`<%Teg@>_$qTch`2C;)-TP-x(o4v(?qrK`;3Mb^S7Gtw zfe?>%(?4LH1n(EB(!r>VkSAj~XMPID6{l}3)3sH##8zh(&iodGWBN11GH6X?JL1(# zh=W;VQT5obVjMYiB!+U+Uc*~@3s(`}6SLR70>*d}#;Qy8zs4uVO6@E=nlAua4;t}$ zS8*g-2vGGO2n9XBW&yaCuf7oOiu>oY7DIVTGx8y$Nn7Z&dwLov(gUl`>&2U`+b%dr zn>omKxByA^l^0Z1QcOjYm(ISQ3KG3uT2WPSs!s*4XC-K{$Xk{ODE5a13@eZr{TN?K zFkimQWWGAvJYtZ?{n|Hz&Gnw2w*Q9H<|=4pxp1{Qd9voWS~90uB+DV@EO?n9)r*5K zOdyV$5LwK+qs>oz7_Opr3!tRb`c3~2m`+?6Vo2p>ociJQnJ}YL)KmMA(y+L(Oqm!1 z(_EVbfM81lJ}zP5{PA{t%urM5m$IhqWUoYGhJnXf*7k`;4f z+C{8(&#x}0>$xS9A$iZPzQGF}x>CmVRo3CD!c_%fYbQ~j;(Ao-J0pujA$uizE?*V* zFheV~&^$GtG6QA!mykR`$?r{VTLG5cwdaIG@K>QLeyJ%b zMU3KzN3z**Tb8R-CGKQ-hmD?tUe?jNe9!Hp8r~VwAwM)R=a=1-R2Uy56)F4LPC^Aw){K6t zqx}Yezt;l-VK~Mo{sw6CO@rOcocwZg4YPvN~ESzzS`s0H8v@>1#s*3#^?RhW3|GVf#FTd7~{y!i*E%2%hg9O)+li!~%;LW*(-aVn@4>i>{K5Ok7J(9mNWmNN&sy5#X_jG=L3QV7mD8VYB1 ztn`r}sGCy$8snu>BinX_xqe5rZQ(YE+DGN6Ob%@VEb+h7;y8ANVrTYOt&V{KG5Ofo zEjO=-mob`;znh7rP$ok6=Bd51-cU*>r2{RCf)Z)^GoL(~Y`9vKte?k&)c=C!3rQEh z_LQQc=9zl4UOX9XotTKX%|v@mmH7|K3=Kta5Nl(R!xhED60SQF6)zw`Pou={uDPaX zn&P$--$K0dEttRq6Mr zUvjT7%o!hEa`@*$F_sb{Cab~>C9W-S4qL7K*qN77Nq#VPRhg>Onsz=N`tT z8FzR+8@;``GNGmU{Q2|mt;>|A-4u*Rie?66mZlVLo|dS|Z(ZHXwM zJwsMy?&+ZS97Khntmt5=27Rc2)YyolJR;8t3_7N^Z_tnjOAU*rkDXh4q&8cOXEv`& zy&m5v_Es@h5G$mG+%W&LC_d?Y$SUQlH*6WqJ~)d#q9F63i1JZ5(@1cviLoj?aD!BY%#}i=hl}BB+1y^75#_mbG%@&YX`@FGj)e6-Eo;Ru1AN5A=G8R z{)NR@HI0+K3F@o(qq3;EwYk`5@pZbEysgozkF6pql-$U>LUrD$m!lf*FHXXZ0@C== z2stqo7Z*QL%YYdmm))C1j^6J1-ocN?q=vAXs(QB?R3x_)4+oCohnzyV#wp9p3KMfz zf-||=ss#=TFf?}p@>|VwSghui(Fv}*R+{(+$8w~d*bopM3rJGI@< ztp9}OC?LB(qw$)_2HEZ9L8tG*)qwA9B93NT!Xt~nbvu8H?m3hF@Zss${lZrmwUMrq zcQ~HWOFwuVB=#^aCT0j6D46v-ODedB;=Uvk1(=cR(emLBQTN5)@UWvJ>R^WSuI`jF zj<8(sdgb_y+yW(CySx{2+v-8TdlFaVg9Sp_>rIM*s1^z!HV&tph9e7>Oxa8*Y19Jo zM4$TLNJ9Pn`|~3?x*OoN4w>?sgD1jBy_}zd-JM(e-e9$o@S}jTh};_ZIg^ntkX2$h&VHB{2fFZ@AB$*Z+U87^(%@~Ao=r$#QQ$R=Piuf z7bY7xJxas(NswSGK-FQs$!Fi;cz+?v_d1X<<7x))y~d2FW|%MstC1vOPUMSf`_Bm< zBUP{^Md@>LI*1g(hz@XiOq^+pbw!QsYj!`ppeGCe3+y!2ctOxy1cjzA%lSfU;E9vq zXV7^oT6-YlZi`s27H0C#Q9*u4DJJ>@h(RXg1K+FeF$>MB2z|A}bOQ5ZN@Ggzo0FiE zbG+VheP@;3Yt;-G^uySR-m|g5A<;ceSkj)%4`M(m@7&qVT3Eim=g(Rq(VMaM+w|KV z-R9SPkPjI;J_Xew!+Mp>k6t)t5=4?bCM$mmX*wCxYwvMyz6v96I!y3QEBOKHw9=Eb zh|dv%pkrRJDSUm_?U5EOn=fOgx}MvkEE5;RS#DM`5<=8R^aQ6PjBaXDu6;E7aMK&1 zFf}N1_q4<;1?F~mJdM6otGbEXFSp^}q)=H^D)6OfoY@a>mBn=jM3hhZMzxKgGu77G zg4fqa^N_C&*~0{IjV{ZO4yo4(9^0;?<8gbdn}zd(EfVq%9Uk8crr#f6{m(1kP&$Ci zElL+-t zsETxE`$C!?9i<(Tn4~GyZ4Zgv=4do^-ZI0tV_MyZ-p?Ncy!^{qa3$gp_$P?4smun| zda`4M`rRhD*wg5BhRX2SsUXj&JDXGcXQ1z$eS7hDL5J!qy%E1BScOpdjb^y$JwpBEIK^OaCZuxLfcAC4Ocz{?{?~Y34{*ga|pAQluHXp5YLAMd!Wr zBx9zkd|z7QeV77EtZ@9q6Eu0w+X+hUjSm@C7ODXiWTWS}1%TfsuDt&0?NgBSswxh=5TlwYK+RnF~28Zmdp! z_(l|D+#1rKReY>$AY~fuV;kQY8X=CPlgs9k_8a~WrneOPk3=O2*2%?AYNbD&?(Z+Q zo$LjRU(zA3rpdLnwZ+a?(%g|gcHBQjIykAt(D6=>pB9>-Wy@yujtwldTzme&x#mvg z9d>}&jLslv%Tpg&*{_lQ@gZITGF5aFHY6mALJ~ir$ZJ9A$hMpLi~d?%0(eo9G2_?? z-AhTT%PIab3kR#{^)@-S!a8#}7^-=q8h8$7K3R&Mr#gkA^hpFC2>fSRzjNE@|LJoC zC$FBK-D7wdbhTFUhWX~tlcmFn3ixWN!LOb~BV-*%RPSd*-Mt;gn(On%cu?7D{q5y; z*ngcx)Ewg~RkQ5CWrE>P`w+8OWq|j%kgRHMmRyQz_xL|cq>a`C+W;^5Wn|GiZL9${ z_{iRdTT{CV@34)hKe1<7Kz!d#=X8OGPcNpvrS=$e-+x(rfq#r7L^e*Mlaemcn?}P^ zSxe;2uQA|PQ(k0(sgiBn&fnFcir?G1K0TfIWx>lSYxXr4;G6r+NFfmsJ+2gEy#ep% zXd&BT%L3k@PWZw@``E}B`84vJwotpSvXYX~iv)J-8q8yt+y*rBPWu^w0CHz(xz($VKRI^dY>{fIp5iT+K$C) zr46MI=37`>f!TXFAP$TT@I zbvlnls6MXi$JS+JUn&(16lEZ8D5u#rhKzl=Bj|dv#m>n&<{CrrPlKgkexrhfhn{$K z=wN(R9lR|IEkI6`qPRxnMCfVv!}1%f<-rXVk9MV9<-8ccnr5(O8uxt6Gj`n=$Jb%I^Frc97`H2LV0jjXbi z(=jvk+6jb9(XMlYq}bb&DFNdQaic7f=nl8&nvt6J3V%$2wQ?Ch+$*i-*;UF^SnZQi z3ouQF%6#~-w$%73N1FD&geQ&EM6-88=G>qFjgbWl&A>a7H0qJtS7GDpN6uA$eJ!+) z)lQ~MTg3e51L%UBMTxyhAKU#7#Dby6k73-iV^P6Ow!*?~!o>GJVRSmKP@olw6^b+# zL9D>+2wuLfy5~c54%;(R%7JYLE@Z;F2@IQ={(anAuD(gGQOM^}-RpDnmQ`oNcP~*I zzbxuK4;LTW9|NI+90{${t-G?e%2#n)ikm`QQ)ikPhp_xpiyi&mXP4eV&#@zRLB4uM zRCuvaRxvguE3VO$ZRYAHyTcgpKOzh`lb&B3vW0(Uyi*`{4PuQ3^?Y$_Rbujk zZ2A9FncmKz6mJxNKJma+%Fu#*kaR16w&I45Zd-zu4R3Q1avW`;0Uo40_gA(7RntyA zu~^`@?84i^qeE~*EAat{rMHGzJ@zy;O1AhhPcC@s-pN$)Q8Ohk_grXx2C`lczf0nbkl}?*s%a*O<@`jLORZp-<|pRtSn(+4 ztu(rCyP;?8qWuj7F+VuwDFu=c6)<_YjMjyVIy{+NU2hC_n2#*=u`rXX-gBI8hV_LApILEPrtB|qw0=HdR>yLQ2+ zT$|r68a0>m#LR<(D>vLu)oNA8JqTR)T%QG5-D5c&KgE5p+FM^2u0ViTscVV=(?WpQK3fL82z;~1<5?5cv(3#jRWQFevM zZIQ^|X32N$%#zw2jK^po=Ov7XlR02njA&2V-}IBuGpJ@|o)wEk@Y6e3eZg}3FgdiP z^R-%{X!GE-=IKbqj(pCfylpT3xi9n%rx^UdCBS=29*(kK+LZrhcJqK{V@r6PGw zVfyDwX#-}8xZ^SX5iC1nQ|zD>OJ`|0xI$H z)R^C1aYs*{xXW?Yh`CN)9SyIEocsZ6jri_t_JWd$sviwaYi0L>;dwUeuq$}@9Q89n z8YJjz7St(sAsV6cDX=(zzqN^VX|luMk`!d+QMwXIafbzHdZFq}t8FZ30yT-SA7OrB zrC=0ZpU(OElEf$iZT7>AKbq&lr*oG(|02dJ%c|5UoPa5KBWuv>g6MsH72tRiPz~K` zBAk3!$eqSBvLbo{W}OnPe=9TAKJrn^#o^MaL0wY~=uK}wI!L(@9vJyZ%DJc$PGd+P zdw|}PAo2qq8Pc6aI;+WYMOw@9qtfXX2X^aG!W3?}5ys0(`(O7x(P~5CMxL2Vo@Qsb z!YZa4Vuf+QGbzdaTtABACeEDuYZ52wjt=hEeJ}T|%g;Lw6fI@?O8o9q_O37e5hE}3 z`|5?2*1un9dG*BpS?4))$+5k+=Ll#4fk?g`C(i>YdrGM*2Y%9=hreT^4KharvLxG} z4OiY5L^Id!t`{aW8RDPKK2m?63}7|xp(YEhTGfEE81IKcJ@h$cx*kK{<3)6b?}Hr& z`YU(Q(Vt0mdssKgu7Z7Z3{^q`H`4yTpzMIzJ%Elk#Ze+h-$KHXacrioy(L2TB^!1dYo8Qt|f-CgSx&*eBIp-z7} z1O{WQ$}C#oDu=Ff`RxTINj?Dit;PD~E+Tl}C>p4FE#aQ|({y6nUuuy&Fw##pq79=P zjBarbpy><}W{tr0o~Pt7OLg-q_hJ2g;Nvh%Q4YGm}@7Su{N8lj?Di_BjP=(!)PZ6%2FPa~gm6$QhTb zyhY2ny-CjGxV8JqaT9DSMVhO&T30&B&sB(QS2-+BFiL{*`8P-3W&&M<4zT?J@aGu5`&|D) z0P9+|tg#X4<39g|S+Ar7&if@u7@|*NZL2bvezEeVZw_(!V>eZ$oNaR!O?}DYD2rf2 z;~t0JJUi#^%<_(sDF6z5jnfF>OS5|)HWgwy;hyvSnfrG{4l@p4^%)8BZJrWkWO;q6 zkEFG)aYNso(B<@{jOcwRNi}>&&rLSC{+C-nrQ5e77S#?C`{|p=2ONDkgA6If9IFyO z=2%>p*k2!2E#m4M_w7F3lCV^S;0)4_hX3^Gq%E1jkta$x;1?%?w1|FTcxJyeG6FKp zWq1*J?*Rj_vjwbF-Q?(yPI~PWx2WL{+)1|O{G27a`U>)NNs1Rn*HH7qOVL-nodEu< zXe|{%yYAU|x)Ah8WHEX5p=0COd-&Y1kAbI7`U^61KH-6bE~1HaC~@6xqBZP+rzUCh zef!B93gu)Vi#;FLtCuQ?M48zz;hn_5$?ucOi>M*siQ}MTB-<8~z14W|hIl0+$>2{^ zS$o1d?m&lkTpBB*y;pg{dqmGWD6x}-lFft1+un)l-G zel-SEs`?pN^}=1GsM*X{oGX-NvPrgebaWE5_hy9J59)Rr@u@7bnurpja~A`+6*@W- z@R}4sjNJ0Y?GM-cG7m_==+z=)NZrG@&d1pGlkg6M%SxkOZ%t1^tgXq4|CNL75( z2MM_q0HW}9&AC1r9;8^1_pY7GnkR)(kx^YBeL-Lg7N@_MzZ*{+@5S+!t+mwhKDwK9 z5m%IS!LzzOXhU)yMz{6C6DQYP?pm<#Ge>wV%hG(@e#e?61%Q4PE0A9AHO)kop5C- zyzO8!*H!BcAzMxPlhq4xLK3|3uZBxjSE(yQNM`O!vj`F|L#(QjS&{OeXX9R5 z#e45GRINz9i^g_^JpL+}2a^g~5sW3>4c@IZyPrnyJIURz#nD6HnD>hj2eu~~#>qja zo=Z>37`h~x^&pOGFtqKX%AD}q8B+!iBwr?aUsv>ko4;xd5%~zkZzxmB65B2A#^Bw4 z5vhX9b!R0Kz-0smlp+cT6lMyH?TMxIyfDQGlP10|nuId1WLAn?m*z=Ih(laD z(!P2l7WsCMo=P!*@C@T{wBIfUrpttC!;J)ni$AQv^pixq$(--#V4Zvp2??>Ww9HJs za9!!8Z)_H6nOF(Tz7xtIgM>i^AGJ8$2kkM|ggZ(?oSvL9#&(%Y9&Unsv! zj^xI30x;GSD!mdIcEtX}vL<~&2!il}7Ib0ddym84AU+qvNs~01F{eNoq_NRFJn!gd z4OQ&#GBU(A!u5FY_<_~EH6{+2_tnu@Lfv+4{(-NoNv%w+w(?t_uZ_{64^$UtA|54^ z^tG<(Wrg#`_m*%ACB1ai*LU#l3Sx>xsQG;b1gcEsk=hR|*l2%_zg-TUwJimET=N=r z>_)B025PlWH4e_i6HbZ#2 zoh%9@q1#}EA7Jb{J9z`Ya(I6sGu;`bCk7mBuM7{s&-@8HJ2cc5zB*9 zY&}j6lC2sF>p}z%buoTqYud#(J-aXDHci1|ADqtG`)0}2l_5oUk?rOZkz`@f-U5oj=7dIy_YHowK znpywME;Ibnl7?sn^m0d7W1fmDWXJ7SSI`TSiEznf$@M>;Q8Cmy^FQlaRO|QJsjqxD zI1oZR^{)kK2odHr?;vE(>*)sN#ABMUdFOTPDpGq&dl}ZdU{dE))uSe0Ym6TNeXA8E z4tzcmt_L#6YwgY~v54xbJaxd4_pm)*8H}FzL6V>Ef5OvR@1`Lz;@oQhwk?GF*pcZYcI2$EhF=a1%Mh4$v2F7#dgIbS3a-mMskj-CyMt_}H> zrCg^AUN6oIhmf{=LUlHc>8WbDl=>{Qtks1JFAaoUTsS5YIo8PC4;TS^hjIGM6!pqf zID7kClKafs&$*A`K|Z2?xQO{~<;RZSSo zv;IXn(Q5{>%~rEVzM2FYw3kvnWPCIPioj*B%FW@tLq<#dbusr&!plsR5M}l!;6|Rt zpFlU6UY192CS_1!@8Bp8()7=QQv8F|NF(2WUu0*lHdh-E+pqq4w~9|Rl}fB^B1z+; zYqLrcL~F6LuVZX1C2!-rRwI0pQv8Hwf)JlAIr+>N*9D|0??~&oSC(b3?pd0pQ0@U9 z33ts=cZ+hds876}JLFMhODJB`CAbfeIUF<4Hjn9GjMh<_=E{C5u3P@|uAt|>MXLYYCp9q-}WqY2z_2NqH7m4r`~@1JE>k!H2o`nV)DqTlUa z9uOM3?K7QKCPLPvWRnzNV>B_uK>}+|>{J!Iui0<&53=S&9K1Q+3!Me5;YaSRX{r;=D}$lYaE5S~;)0byUZ#5Xi4u)h^1ATV{&yE<^DipD zJCq*gKE4ep?f!+H<+bdTZRK$b=V_6~B0|J-KhcU>uOpkQ)QXDi3E&)Y-sT-$`i1-R zVH%3WK3aFzdLY|E4>(7|l+lHZD%zr~=4#Mr-Dgmve4Fna>_V|iOz^&zc(>nXFN-~1 zONoBqnt@^HDEhaQqW@fK`>}dK{*TveGkzCaRLJ|HapwXm!h1_LMq+VE>S4tTE|U}$ z<=Rx>^1h)M2fk>Z^75La=MhbbjbWv{#)g$K`~s}0dljR$5}lX&#nNiu9n4jxm#lP8 zzXV|7h@Hzi}W+g8^ao_*M9jskYSU7@nyy@As`Hpu9QZVe~*Y&Zu#RXIm z$wf>Cbb>`-FN5zi3bcZ7P3qU21Zldz`i0z|HU9RLf00DiT88bMDCnxl4PNCruhTX#R<;#ef0HS7;S`1Hr=@E3p56d{?9KUuQdYo)K_S@;2(QU|=#<%y1iBAZ`j;U5UMW*Q7>Ca90OZq9F?~(f8 z!)5!I=0ikE0@8#g{yZ;?pr>w_qXGZl*{1%wuvUzut*;Aj+1QD$H<~uNi#x=24Zg=PNZNl!G-LHG&R90CD1Qx|=yU%!9RaG308aQr= z2KenQw4LLmTy18b?2I2+IIU8w8*;GW?ZdYi=qP>mUr4hzUTrzb5NmnNUd)iw`s_B( zVS)yUZoOyAHWB_UjuxAavXvD1);pKb%>Mq})5#jX(7pkS<$VQlA6Ek|4O=nwHN<*^ zzNA@UVgD(hdq~EG>KnAQn_=uD;bJf`3ZQ&tCXO&Sogvbo7d68m0Ge*xL_M_%4Z7)p z>2m8x+dv9v^##nEfSN5qIbu_HhdEPY)6wcMHzDR zfpvpeYc}b71G0(;hF00FAWihV!hP=&**ovKQ-chdYiCCiqBuy+2pg20xnJp z3)tV=w}mOEv}g#)vWuES7`xS|1_ua3%2orrXySJa!36Mr-Kp>C^>-3uU6Pd0R=T$? ze3CBq3?IkLl*+=_7i6G_joi5=cb|qYWHkz$8*GGh2=k{LI2CNL22UcFZyl5n+FSCA zS5~+sq2JeT^H;J++0Zi|d7uTa%DVkoTTrO=l0{#7O2*g{ay~MRl9fTm3Y`+Fp0O(5 zKd3?uOFWrxMf?ZIo<^P;Jx(+l0Ih@^k=|zW^+ku6-)zQD6`1CwD$}QtdHuTQ7R>F7 zOcpD70SZawNYx=ZS7~);9>vIfQ$-wmRK(dpG6zCjIXWW?fCwhl_pMC_3n>x(qQXz^ z6?=1g+U_7Z7^^j!Ml=M;P~WOD<=nB%EBiBYr9biES>ncAL2sCtZK*~53x=_Q7`N*9 zbh812O9j~Cd<;XRs~x*%1mced-l+9JCo%pe-aPX6`nnC~ql6tUW}l#seP9GuI`4ej zqSGw22AW{K%w}Ee$A(2CQe3WYH#UCO{8it`i%VcB2I(S@h%zC!a6_RyIKs zI&`S$+nO%br#YV4HM|i0sp>{=v;0`Bd7Sk7-8g77Z=d5o?-g0hE^tz zHfc0E;a<5&SAyAy-3TA_Dw}zf*_WO?iIqY|-(KR#H|VF)cE zzsmM_l)87El2tdb1?(>bak*`_(L_!2+U5dGc4;SMVkw?&NLv$i4*VB&68(0Y%AQO{nY7UUCP>t&`J* zIu?d=HAqKw-cc>(hl(7(Ga5UIODY(-bI_Z2FJeZ1mcoFGZ(80$|L_2Skg^zLcp!WH z(cHZ44q@$okJQwAna;5oq}i?WSuzh)vV{J9)0KU6Ou*eA^TiHA+Ns*c=VNOJy}c4B z1D7t(ms`Aw2k1jLw^lQ*|gyNPDConaa57J}gFb zBEhGNC6zaZP#+RUB-i1Ym6#iKKyS|m&w|A>q@%-UZ7YM<+I`rh{Kki~Z)=%(%|M9m zJ1PrEQlQ)Kw0OlA2@GVTtNxn==uuhQdp}tIHs*iwp1dR8K}Lm<%IP{L50@QJuL5bfAk~E75~@ z)4XG$D(q)Cjv=a@$}A(V_AiF5-=Yq`qL)+?m-12bI&$Vf&aGYKL9fpW zfB}VZ7C#o_h`!G72cF1V5F;2v9ckWy25zB)O1#gz1e|9NTyItI3yi0noe zLk8#_uj6U*%@yD+JViXc3n}YT95}6|34BzHNqn3Fu_uGv&DmfNrzroqNhJ`*6z-|i zB^WHT%Qv)se03qFpE>ib;^;wqB+$HAkb56hwPY`RA1oj4;+GLTMIye&tK54>4nC2a zOVsTkoW#HW9LhUgQ2eU5|Dj>MhjV-QZd<}_ubBFdsUsLwq&C?~MN6bQAPpvKJebv@ z&O7?@LvYp1Zv`O*+a*g`NQidpx z{+NolUQtm|Y=z;@DB=ff!3+WjF|P6|IOn9xU6&+_uZ^yaNqxH%>p!C0cK2&|`*K+d zo|Gfoo|8GA^M1L-TLQJj_=^6QXlBv9cPCuF$-t)MtQ#MJoH;ye!WHTErG84E_>l`^ zRt9z-n4X2Q22KG6z}Qzw;PIb4&(y5kyVUJNPv)x zODRP&UeklKk+G*ACOlJWYh!9{^DPJ3WzAP7XYBeR#q`c8CvJrztSF5o~b4 zL-UHXWlX0Z!}$J-vk=sHnN9frdN%k~YTS22=AQuyRE5}!=~#)#p;*|iut=L;I=gW4lB@{(bv$9B z%(oe;SH=5K_$gDmRA%oFGJvaYQ(!A#5OM-ty*AF&}cb0Nnxn{QrwtlPQ zzv^)N!eq+RP~q09&m2B9*_FQO!*NE%Zp2IJBA*vkq?nEx*!;0qe8}I@;lq=ZeZcph zBXXRhPOe8rdVKvd5BB#%43KZEL2*9*qb)4R77fS#%priAtN}*Ci};Li)weB|RA3v@ zE3HXRR7NgkNPn#M$<3!3AJ}IPcTvosMGzrUKbVW#vT?i2Yur}ylFRRjLhhVXC62R4 z(8q=8OxBJi5u#(bwjg+yTxWya(r%hE&Tsrsgy*kmv2szicMBc^(XHEQ9*)D@)0JYC@%FTYAF zqaD9t*>++)ns#u2uelGWZ$TsIWLH z(jo-XSq>JlysnOC$a>}T+pNUt!oFo|&V$R0dE^2$F+o)sZ){>N-oNddP6@U$UEQr2 z1^2ch-1BlTqnE|AV*6s!f9z57+@-f%N)!z-_Sd@3K(yNu_EX`10zUk?Ep&8|z`;r% zf^;iCi^>Ir4m*t?#t+hg)+S;AjyKW28 z-A%;%5itLcapS zOnh>*MAzV@D~RJFi|l>YVacefY)3YUe*AqO=6hm*`#)xX_6l6>zB8Kpc$~PqFpjEW zw5A&wbD*3VxyO`FudUw$md~s>jO}-8je>BFZc}k^S~-R&ml=GO)P0id>hxf)M_`r! zbBFoAM&CDcH!kv`%&}CNGaIh5X67^qKaN7PA!~-&Rv|w-^O?9ZQ(y(pfq&>@APv>sVz;{-Y|FIc$(#>X(!geQ@bP+?SMhI`ooUYGrZu&9a@`L9dnb(gNHFWE=ZD*F3(hJtZ6u2#I&03RltWIYq{M{T;{fEPc zWvhkUg^??6ebI5lCO@b92W53Pq<>e$Ey_Cnr;^m+N7h35Ll2ihQ> z6CQ3j?^oUw^s5B42W9%fqV+;}OnGaI3Iz@$-@T6(7$s zGL6@__7YyaS}}kh#~dP>Sp_Hx-F0j@(*B{6Ri|+qsC77z+eIVI1HRjjjN7vzuW{FY zL@D2~_R@!{^Qa@=bfLofrXH{u3G&wIDXS|he@(6_j^YH~W2M`z8DH|svHJpI zJ7q&){S9vgLJ2|~2plQ1;Qf-)p6v1JIO0LEwbss(iFx7AtXhC3yW7@Whw~I3^)CD4 zj-g(qz~nH=Z{^|(UFL70*TL+OER_%p1V@SWZMXU}q&*U3(y(b)~mJy-)w{f!lp|Sn$%OvwEnnxkp-pZ(w zQ$kOLQHUYH(z?EDSv~T#8%~rMjA}sti9j)T}oOecDtcP;&kOEim$&%u( z_diujpleiDHh67GAu&qRFwdM#uk2mJNHz`KmgvgM=-+ZUmS4)W(t^lRT#y!*s?27e zHJs*t-En_$dj;}^TJvyf=o|&lb7uzb_7ciGVCAn`1U+v|Yw^pa)6i%k9*{fx6zVoo zr$5$SxnJA3S4|T(3rnsEwCaUZ?2C}%o6{hsWdA&WRUS+cf@bXWz7B3nAbF83&3lev z14A*Z^k|#Qa^4su+3c_@XJMxIx^Z`qWr`t$O;I7XEI+0wQG}yLva6D}u)S3R8VBg| z@ES4gB#Q8zM-)e0YwIf&y+xHQ#Y9C%S4xFO8EL>L2TRIl(AMf_ql2B^99%KJE^7tc z9H13}W-Jf#u9YDsb!Rdon@8ffTp=ruKtAgHBuqxG`+PQ1@#hNoa|^F0G0hu4<`60OFCySHfdd)M}`@1cO{6DpX4t_Cv70vxXdnF}3)r7TC^M#Df zXGY8nPi}%l9r+PhiXBw&M`u`jb*V+u6h&#I4Xki?$YO_R{-@|}(hd)0#qCsRNZRCm zG;#d=XG^5;@&(^@4(1wWI3Z=o+*sz&n7d9SuM|T3DoGH z<(H7+d-@_}Ue~bErv`t~xdwKrkQ1dH={R63>`BqIu9qC0yT|o0DmINpi5Wh6SavwF zn$e(cTH}I>E*Z{dRBpG0pw}}As`f1dpiqsMgZ*lML7$5awX?%G|dj#Rc`Uegi6cu0CrMj?&n~8-L8yZFYbqb~+ zk+R+r!2Q5S=b?%1?a`3vwxy|PHpk0*+b)umqY1SSfU_4|v%!3{OwOg)qcq<%X$y#B zH7BNCersnV*M3sQ(o ztGQ>&*ehMNHh~%Y+UPM|;jPoAKRSf8ttrGdx}VrrO(!B9llcgkg2WZhxNJDuyzjRd z_XzEL#tfgi?=9(uY3vbtRQunWRw3kkbG&SR$+gd3IRIlHc+iQmAfwI0BuP*+W!Y;f z2=NYb3aI=)^+SmCiT+AjJbzCY0Sy>bm+g}%_g%E949=*%d;Y||VE$$g=g5)4HN zQwg}e2WRU&2C`ojAt5_kaf*RpvfLec>%Tt<1>nNfOeX1apfipgj^G}1D6NY#3;TXQ zm)vVJD*r}e3A$&k;WOLs{)IL+P$xk}69MP=tYc*+f89*9=Am9Evb?33_xnUleyFo} zN;xc|n*OX5DXuaQlO`29thPFNFId;^o6V;b)7x9tVMk(CVgw8uyeev7TN5YR%#jdsyer9Ma^=HY*XVbbkp5_wcDoMYdGdE}2%j6ZftAEW)^~q8p2&V;*aUeza-jlv% zLAQERxwU@B^Ln4X1$_6p59xy}cL{CX12@B5Y`NrTbrsh5teRa6c||JBfAJwc`|oG0 zwLp2V-TpxuQPm5Dig9n=57=`>%XcJ)b%g9`CQ7Rxnz$iKn__m0#A2Fe1zVY z&a_J%$g4p^GYq~{Scc{Fe+uGs8lE8O7EIRH6LK|qr3Jq-w}{sWr*4l;N?C4$f^uMnd0pF= z8X(}OPs~}d^{Ljz4?f!5`XyN9Dj$yWe!qv!SwS!q)Gb%O8MQ#U*nx3*>GTw(#OXk& z9|<9yD9t~AC4Q&DYm*)?Wh3@ELp?cnyHfuM-iZeEJJ|`%mDmV-__=n6KC7*@ zj9x@X#IE{;re4N=@}iamvxNXd6Dd&YzBAKlR;_WXry`RO4k7p50%^c5jF%}vzS2J)$?0qW)EG#Ngcpk`ry4$5XKFsVz@$g(~@-9HwI zZePNP?L8&t9W52MWAP&1$BMHJUPq3{!$*DYB@-=jpDL;csW|CMHRvney>4T;&(=d> zENStF!Tn(qO)&5_whgM#^2(;f(S+hIW?0kVbwRFttJv14i5>P!>ehdaET!@Z-kdUU zwEtNa1_Bc)Z2j#|&K&xcO?;}7H8N=17vsYg+>uEZvpg8coqwa6EzvEoVn046&wLba zO2);O)MiqLBOT1&S;p?uor@`z>;mg&6`BKyooJ0=u%eaQg{)Y zxi-N_Sf0n4Bt4@Ohh4)vzNZr+I66u0csr5UZppanm@%w&O3lJ5sHlb{iPly9O!-3? zXX^-D>`!4!pr~K3s)fdrMQK(^1j;6=j^KB5P@=;mU#+ zcB8?%ziPOYlT;xoc+R&yRl17p-UhoO=4znS* z-e=;qHr^+Es9H_m8S;%lNrwn~wm z7n-_V#!P3!WPfZlm}oGwm*RFa4W|EP+IJ!`viNei3~ij~&E)}G2NINk+3K$2%aY_Y zYP=lrzc@}>%_*;O!(-m{us2TGd6` z7RZ&r3(gp&tdSDB==F7P};4#jW<_2Iyi(h zIgQTCf6yj3y9kwX*}n|U5Z6OCvo6YDu2JnLZ2#1>Bg zY$!bos^}unx2+6^E#+crCGU0!0o+`#*UesWir&=%340WKZB>l5_@7K20Ad~;pqs`m zDeWFUT%N=q^#k$vY!wxhJRzga&<%E8>so`g!U~ea*oqiN#{Cy)y;=hZ$|E-@c<9X` zm^Sx_hLVzc%eqx{&Z)A@s_(cDz!(>&)yRFC^k4k>eBVVNXuTdDO!nMvfgiD|_#PyX z`(1YcmjThWes(WN;gC{|Qiv+0V>4Civn4W18)b2MoH*^p=s`UQNz8Rb(+iV9c`AjJ z#GWrr?FQ*|8q)U)LVo46{n`oGl`Qr7eG8Fes2j{bu7!=3ta<^})gQ`QMu*0@jLuua zCmp>1EO9%^Xvs&WE3CaLFQa*_#jRa6e5I-jRoE(iIL98;;Elr+Zl!m*ix4AdeEs|O zYfs@A?2_!cOlb#xRNi}+j>*8pWaql>6d6;RhvCkfFeO<}k zW}z1Rxwq5Pu=s?I>vn!lnD{R? zOq#Br_dagCN%h`7tBCP?<&9PGHpyHlB8nl>;LrDknuil5`;HIDQf<4l-F7IE^r*M2M6Jh)8w|STmADoT} zXeFL)^0+)DKgKMZXi|I|&cQZ?fM!cFN121++JPDAZ{ul5Ynpdxs+}6;HV!Lyj3Btccy5tz%Zj9JrYVA>`9$%Aczk$Ve0MX}%xT&7O}^r})f$VDUdGNe zQ#@p!%h>sBSPO%a5Zy{mQ$C9NCTW=0I1sX{sE5*=y(waJGd>4O!AfJ1aw~vh(|H%0 z$!Qyr&)krG{6+0>X3}fK+gOE^4ZDi9s3^(T_rT-ebDAWyU{nU^+gta)5wl`fLlTL1 z1u32Q|D~H@4lt?wW24!6IIY2cf;h;*{o#kcTyt^e-SHwHbjuB}l63PoTN#X-+p8PY z-QXLGRMr)im3CmHkJjEt4M2qzHhEx&&$G=VDZ^1~=4iRdSNpm<-rF_IyF}rp!~fAy zgv0N6ll=M920rSbI_XIHlnFCPlu0i%osFw#E2-QN0FF1SB zcyj;NXzb**Z3(&t#6_>eZEbC*J5b6=kdZmw-Ujaz<#|J&i;6M7h9r-_hMkoBLU)e< zo2&Rw_YpO`lAgRhf;E!+(L=5UmnBV}`@-5L!Mec|6~FE(H|h?HC2jwQjP~vUt#;W` z62iRs&GdR-+6AN*aucUh^={U7uD1^lQZAQ(nI`w0o!e%LdK^@`u*w?A5;ze&}mDFm>_dLQECX`)-X#qz4$(TGu-3 zfoZ||3finDF|=e2zbP8zVUhgudyO8i)<|{*YqN(0)^IwWM+d4TVE8Q{4u!BZNoCUz zvH2-Z&{I6OvZHmKA1%|?Y42pqM8m_xLg)EnjMv{~Dy*f*$3`SXntV&$5`!1Dd0xzp zZ>0d!BvD$zSH-hlc=cz?38aKQpIn{6gszL&mL?*;=T&qDCV*3B9_`d1F4~PRIJH3! z%2XH=vu{$GVE(0d>L*}+0J*0K$E=Z@xzM36!Gl&43`YP5n5t7A5V{BnHqrq}kS!CZWU?ad!dF2-vmi2;p^Z|GRC zxo!4tqc{Y|???wgpKetFg`o3lE*>gB?Uu*-w))TDDUlk$bCW@9kROUy21U~MScI{F zg~8<^X3fVI{D`GPZJ(;-Lu8gj4(++-zX3b5&EC|m(evtNw;>r?PYWtB^}w4$qrVvJ zo2BcxM|ZtmWPG-5TO1reEU64R=v<)Fq*q6su>uN$dRKHmkfdDT`#@vOS~>K zxkdw58t$`K74d|95p#|;`^i57?(K?B6$j^~`q8Rm@_WgHVG4V9JrzGvvz zjaXwZ+!cd40ed0;bMl+hP?NKLRAi{%YO?orS_)ZsX9I4m8zZ>(mE#uJw_N$Jd;%5a zOI&J*nQDZ|M&oZno@{j!0W3>A#Qt{|l+xBgZ0D++k1 zjP}`UBQLpM0fw#im-}{ax_#^CAEvu$n7u%;4Xu&af}fuAwRcp;|L&-vT3pmoT1eL= zYl44S1bi9-z>`qoeoe6pW?+93xL!@~oAI5rZ!#HJeTzzP;uP&* z5J;kLC64hE|ZCUtY2fdcy~<2`B4SS!6nk z=~w;!LI+<#Sbza}w2Zu;_g$E=8{&UbhLdvQDHlRS(ag?`9wm#qJ`NUT=P%@vWN2Eyz!V{v=?@mxeiqy7(DAKg!$K9cvS4}|;4OLF7!BAM3~3WN&e4(`1vEgnW@XqxICV$$yS zS;2sZ9{#m2r7C2X;p*8_%nPc+KU>YGe^$Hqwbah`>+vt#y^1e2>j_?R<<>rk|2`HN z+f<%^uPRg9-DAd+*3y_gjN^G|qaC}@Zl!`-*s3NePCioI7F^b>Sh$d4~a8RAfuNnRE zLFpIrwpZiR(T5*7U-hYXP(nDk3~7NZ*k;Wbcmn$V-Zxfh*eUB)+@#Dp{TAv}pv4am zpAcCtQ&F+(wC~$u>lQB)7-wZdv{d)t4mgPaW#28$_Q>DMQmWOr{N{m*-Qe87VOym1l#hmNh4`v4&pus!qzyCKXTW75J|qN-+E6Pwy? zqjfdiQZVGH+TVz8Y-H|$nE`8ZiR(QBjXg=j{KsV8&o!nUA`BcG;1lod@X&h(Mn*{s zKEW}5*e3&6nD@#gp(fo$7as#Xq(;1wrBtAM*j$FTmtV*S-s&|ZODRAqVMaa$G)amJO6N~FV0Rv|;-Nu6UldWls($}M@=A(F zI3XsXUKsFO&^g>tjID%hN_aWxMXhuKk}-G2Ph(cavV;RJuz;f>B6^Z%`c`v+$%+WgkKu8ACt)UJ;P5hI4U;7%aGZ-?_l?bHai>uC` zviMX>(USx^U0iG8{8>&5l9p{}8fWc1Ow=lIm%rf52G7DQRA<7AtWN?HG22+7OGjr} z^%0L&an1=UOYBq|a|-4>H7KPc)x=4Go1DG$(gny{176LQoS(br@?OtqjuN8Hb!5!r zj`llgt3wZcMRTTP2~l^&Rw>q2-+s7WJ33yjRXuxbGU&e&xgrp=r>Iv}{@-)?+4-#$ zq9<>x2xxzce||s>nYacZe@h-)FLiV~1*rw+@VW)PyMrgq^~?v)Y7v|6^cO%P|0ZsA zUa{sAZ1%l{{48^7An{M{x6|8Ce|J3iE5!b#gJ@5Xg+z=uYE>)siK2Pi>Jq(Z@c`NG zJ&rYm$KWIA^Q))@sAk~4RIR!oD$OT+`$wur7kkjX&Ffv?P%*BrLV`3s2Vn1n~q8`$9&iBk4!> zqx@4{LK+H}HWBrf%Av2MspdQrXLLpn6Tbh<|@9 z(?E5B>`wV%ZMWAs>fK+dT#26B(%Zkce{cWG(f)}it25mU1^W6}_rtu7MOS!qr4tk3 zU@+&Ri^nJie%M9A(_%dawyV-V3z|ZS>oj`aa7to)cZG9;ALwFO@32q?DNVfZ|KWtq z3K!TF=#7l@;KhwaTWh1v-93%Skbka}7o?@mk{R zct@KDst>gFnq+`4m49@ssZRDE^`kmT^_t3>@=EdGM`al6!jz?HczF?DDtpp7(oCuT z5IxtK+Clt>(_bkKl{d8q3VVcYJqIo6O?8po55T#ILngfk+dg+cD99QW=%yH2i3;OL@y`1q2L)l# zXdQ2sX%u2t0N}wZSu`a7huG2bdm3>G*BcCs-RVL1pdoooUtS4&8T6xkBMysQqdjox z3k}cl5VBq;Ve;N-BN}RC(GKKI_y2TQ1Dg^(h4DkrxGofid&q;$Nq;ZW9f)Pt-;@4G zhw`D*TB)4kKh(hgX-C>7+IY(N_vMUoWcO5m`d@Thg9I-pR<4~MG;POhMgRP|I!5VY zJ!^;;4JAe%Q=+Fg72FeT?1;z?f$B7sE6Jw%0y>tLzKp;xwi8Y7My_*;I)&K2`n)qe z`hUiO{ez%RgYrpf$$uW4hUGml-THjRf3DQV8?p_fBOCQPdi(eG@9lqQwtvbupd}GuyAVe&s<@M+yS74W{!I7uLp-N#?`ulK)8oo{Q97chXGzETNgDnv=~(<0 z8ZML3Y~d~9W^|CeC`{Udr;|2O@>Wavl2&_`dMJ6QG}~x4;eR?w8CrQ#o++==ZrU@q zDLs=sX){e%uA3sGlKfe{-4d>qtJGa9OU-^Hhx6rSF3U!iyJipyzH9bMJ#+oF zwy4=&=;`g>+rPK}o!|adeOO!De$W(2yf>W+Ej)$=8E4V*E2rcCgt%d>^jxl#$9al^ zs$@aQdo8_{AAgIVvjZOIdtCuPb!7-bnm#pd-XXz7%H zULCD$99ntEJX`gP(_8t=lxLE+RhCM5t2WTCvRo`%SoKuXSqTp^+-m3E{=NNs`(OI@ zPx5b&XCcsRuEVG{Z~L<`nwZf(4ENRb?@v@sGyCn5NPkZ!%EjA?Z-;HzGttsB9V19# zB&*_jhU;@y6~C7!-WmEz88cHw;+~Ojvb#0HVq-`de~aGw$#OH>v8;(TSplQ-u}a`YX7qg9FgG~88{qC{4vxb-K* z91U%^Z;rX$&-o~Xre9!5m=L;=eQ}~q=bW6@)U|9q27HqZkYf2@Pp6?T0yBq2TMx0a znCj?7p|ZGNoYBZ~j@OWsYf?UetZ&(DfXQ`x(dtRduywe&sYO zZ6+^+{M83s;*9(yQEz2NT8Dhq?|R4F(+tymdjW}{ZsYNsBYC4qXmY!?_&G%6H8-|v zA%O1uX|?1Yz`Bqbsn0SHX%#Ia)tWWu7URad@rbFuJ9+W(5-zzQDSV@|h@kIrm-4LJ zy$PD5_fSUaXypTR$(6b^mn@}df;+qp_m0L*K>K3BEvGDNU8~XWzNwQ#&O?g>g?|JO z0^)7C))UMKq=%ImftSuUMbibMqA#9oN}yvV_=8TT04uf+4}*9(s^s%+-y^;ax}O~# z(rZ*-4BBRpC2GD$Iy`4J8l~$Gr@lY`0`3@UZdxQQQjG!{t)8|6^;Jv zfpR?S*tdz`5#ut&$2y!mI{H=LFAZ7~xqdMIhBM>j5B%5LQxs6~Wj~^e)PMs|LI5@(1|G zY>H-kDNJ?SiDuin4M*jKpdtCZ2V&c(!H!H2A)|`A1MH1Wo7kjMo(m3PNN`}mURAkL^wsj)OgJP3iU(1 zuk?FgUn3+3ib{Y4+nrn#18sOL>!_4aw&eY?Rq)b7+chu!Ofsj%nO&a^5=w4Iw>cr? z-c5=9?0vpIJrO~l(SD0xtnFf}1M!xc+&{vWFbNE+p}g7Bw2{V$=5`V*!qoQ$xmxMB zrv79Vo+VS6xk*OSo%mZzQ_kDbx@P#cCCjuuE=Q%!Js%I~Omrm6h88gDokU7}sRzZ< z31O}M9R0l>$h;bF&(9YViAFz<>AJ%RG+J$@FMg$Kh@^YeF4KEokMs@=c8fc2J%Z#u zTfdv9sM-8u*Yvs39kG7ZV*-$PKhATvg_5SW6*BN}+I_unZT9b1(%rf8=7>Kh&q zo+47wUrXZYF@%|{4R6rJOOTNSGcM8g`IF_-k7*+G^2)2O(-6`szN*yLm|W&*ARED= zIj%6?TShhV)e0n5mB?lqCOq^wGXl%cLykqpu7-v|lw$>V7s}6{wm3Rt_v5*0dR#Bc zH%#KH%Im+N-~FaUXb3Z3sZs4#{<)dVNEUet_cE$m5_Q8vQ{QTQ-bGbIvG2BJG0k2? z7Hx@L!v*-Y=eI2itLARaSo2IEEMQn-puD%H>wfRi_RLH<)oOaB-Nm%Ww(s5V8+};= zV){hC9YawavU={(H!qth-?5(P(hcm|dG{>tpI2BytEi}VvPIZJ))ne$gJnmKVqb*r zbz8qJe^_nqyldoP^EeOw##B?0byPgwvRDdxlgda(pF0{fScguO06$TpV=7uo5&bN7|ojr+hVyQRqXjxGr^)-=`ILa@UUPoVq-wBYUjM z76z3#5257I2xUE13&PG(^Av#s2Hnb&7iqJ@nNJqPA6LH7&xu4>cGBl27yz+ty3?V1 zYfk6~PpsrC702G^gKq53);dgO(=sVj<*dSPnV&tPLlv31e=<&EA5jxkGVF*siE@is zEr53@W6Va7<=2%w6SPUc)Jo5}B7NgW+R+C>l=WLm6t8=I3em!nz#=+*_#=Z{jq8-U z(YaE(YY9en!)M)Y_NX1@+;mXP?%hx(fi%^jW|T zr35)kOXc8{zU@b0jwq2b)>C$kS-XwV(qBdEf$YzCQlgEEmYL*gejpb=9HN9W=agvJv-n^ zZ}RdCLF|tsBo zwk`qD*THx0awJpJt_xwyhZDBjX%A&#qB6A_N^d=b8{#6qsVq!JlcqiCL$7M*L-H` zQ!Xf$D$D(~m0nQjRbcF#Z4B2Um$gJ6cXbhQOobQ4IurH1&8{1W>_mhPb~5=YH13cX zoceYmw06O6h-Xk-?;7%$b3c5*>N(m?vR*&(s{!A@0^`TJb4a5j+ZQS5)$fs z6$I@SDO^#{ti;l^pR^KRtpQi##nzDNTFHlj&z;a!;8&e|ix@3{U*1^9)8!U3O7H@{ zDsTPa+r=4S@y=I*zy)MfypBx`vznN>0s=i(9iC`3e|8jRR+OOsavoRz^qY-Gy`X!2 z<57n)-HGtgByO>x_OgeI?42?{TSb|NeVHZ;TBW{E*If~$@J>mYizf-Cwyj1&FIJvL z!cj`7EK`0i8Yl=L$if^_q)rDSOfdD^UfXcO4g7~tR8Tzic&0eX>uxe=E&^-Fd$;cS zHw)eXJN=$M=DI)a(bxc3Zwj0LUM&)PFLU}4e6?$r)_QLNRnDkk`Is~{AqUH^D!`Ve zamhsosiCm$jo%N+ABhpF+K9v`vrY7i&hoh)O}W%Dx&l8~J=Y7X?&7~tOXH`+tj#CQ z{U-ab+ctn!!DVKPhSux)($ay=!r+l_m+QfgkIw(4x?H|Z-rxH1l2nefHdmGOsW+{B zmFlWXG`3~S&&hU6nh0Ff) z2(Vv+>+YBItv|j5S*{{rvNoH)l?-P4-X|_J=2@ioC9<#~L%ps;L?MOTdbMg&XU&gk zK$X2Ng_|cy=<4wuW8Odw=-&@!M8=*KcHY(qj*c~W%<&nFi;X+4kQL*UEr2J=5Y`?}6 zon6PCK847-sNDVKT?#47YVkN$%S7#v1ZZ~+VMHt~5=_N|NQKnjAM9kYg3M<8xmD0W zNb7kyg0D&`QNnKF$sca88#6qM^{`XG?pDe+Nrc4VcdwWZ+g`f`VXxI2oUCRC1?|My z$68A4cdV6OBCE)AS}Z*sdIubu#jhp@}qZP({yM0N7u!COg&^rb{0LUTX#OBxBT zvzOKjBy#9pmtmT86o4buQT3X7NAuLZb^YDd=Hv8g?9SyyBMn7>icF${lm;+d@n%iB zxt3c|wW%wUR_u0>zd8a0s^p>gJU5iZ6)$;v6MrIoIZ?jbT3&9gUa^+0ixNE~Jl*&g zH>^PyaP_+AI9ztEhWV?qh4{Xf+{Q7QkxcYl);5wldkN@PmH5_>u3^lwdkrHiloe+FrBt9e1rT2b7X1Dyr`Sc-8nH;wbR;U1jm5ZX{;t|554L1zx zp=JBjs4Ds=n~Y_^5;!SGQ|Vo}Cbw=D+tSA`>!qipY%*kpx+@G@J9E5uN0n2=bYcEW z*8#r(^8%YhV)`u^*#1NBGZ5!_G3+Fcb*Evwk}hZHYc`yiE9~wj3oN?mHj>P=;62CG zbKK|MX*nt;pzU5doRYJFsOuU)sZt4A6+yiTl_|~rFNG#w{cCN#EBQj#g{1g!)8kPx zcVhURAIEB-;ctEQ2>G^HTouN?#Lh47v)YaOYK0ln}b;cQjo5ko2}AX+#4W8Pl>* zh*P1$En0?(bC5k%RYF#3tLdfY>V@@S`vur&12G$KPD`!J!h2nGu2oF`!muD zlTFrBXMQE6ij_w?G-!)syUaO7B@t|^1&-qtv2pPCY^mj*c6x=LTJB~-oTU*?OrI1D zvFX6G&Ezi27dk#IGe>vKC^-xKS_i1Tx$|amqOql`h#VS5L|;^doF;X{KsrMp8DtYW#{|^cL0(+s_6rd{>BE+_VevC z7*%CHgK0{h4*V4}$RIr5v<1Yz{cJj$xw^Ewx;P@dhIy0syhjsEG@c zlsD{djBq1eoveXJZ4OU92*k$(kC=SExR&7<`-L#>2fdW_GtOJWUl{Kbqau7G*Hwi5ze==DUZP5U->Uee#IY~o7dlii({ zSWMY)+mG2#n&k6T5r7&mt`wZ(^liTt-R8P*l%DuN2XSD!Zii)tkB+=r>l&woV)yIu zw;rrKDUrASn3jA7<@*`JVo6?t8pF8~ulkqU<;5)X3IM4BxvAe`43cz74Z+`;6_#b{ zD#7{SOeIo2xTss&U>#Le9jOoGb6T%d^DO?GZpN&5n%}uE2?;7>MJrFbuMh9Qd#N1E zdNuU1VBaNy;|dmqR!e>dvb=wM=44ZuRmTY{t!OSpy2p)@ML9ZtWj3uW5TnN*tvfxm zTbCDSz<*p(jOD3!Ya8Xx7SA%kgYVm^5O_|l`AkD$i)K<*mR+$cGVVyD4#J!76pEiM9qun-hj(!O5-`Ebb63ISiDI^} z&;%^ov^I+QD`IKSY?aGk?DYb(+w$RY98fvrn(dmqm&z_oRXkvJb}x6YIIh?Pp;jG7 z$pPc1RZgE68T&=RHdP?hwjdy(>LHM@@}0d-?YlNgMJxVL>Tg}+Q}?@Dwd+OP`|IhK z`w|yBI0~nBEk>`e#dk%co;dU}V2KcWT*N#bn&A!n?)6YB4RXoF*z7)u64@W~!N9wZ z4&1bMs~ob??-qC>G_*Oq*sa4|l-?1`?{mu~$m={xE0ZCPh@H-J7{n}Zz#hfNe0r1y zHLpzxlV3Y|I?f;f-3O0fs-gn>H-->;6C3sZdP2{=#g2Qp#;4wwG7=5ejfnw;Xh4XI_v~yB|$uUF>|EIqKO5NI5|>Nc`S2;&+;=BbGES7 z7;g&YRV`Oh1^PnMM2G3vR*bX)D~@4Rr0*Y8rc+K~LOzu(b$O>kd=K6e&o`A=|6?g3 z(vxU>&aU8IEgf%QdhVdPna7_YBmS|qn>zKMRs|M0UTQ>?0c@^?Z{bPeMNFYxal18i zXAfjp26aFW`8kna-{p2FFa2(Iv+M_px*X=w*;gDe1oA=KHru=2i=qfOp#KA`zvnzk zJG%kfo`=7WMik*rVp-8N8AA(k!rQR~bJ)CT+m4co1KwBm(ZwtXdgidD^1=+u?=s)2 z_6HVYC4oQfmSOsxO1lcX(Vp)Pb(cK;kl}d>dm>oM8|C}B^;Q9tkZf|WEmnl25Rre7 zBoC&~U2uSKn!e0t&Fd(|Pf?#bP@N(nKXuFv!%UIvu$`o&bnk=oG3#0z=E zYi4V9&bNjK?8c~}-yBZt8p__XqG1~72U7+5E=t@kW!fMuXi=5Uye_5q?Rwkh*8ul5 z@`fe8!Rizj7b7GrE$I~wwF-H|C&3G-es@5(a)}e(oBd`6;^Fa9JWzB`Mdn4Z0xl&< z^o8`g4`nG)7a|?sq<{TbziD`U!XtIkaaN}@BQE?Wqn?!%iqTS%sp}mei%LlD8h+++ z$Q;g%El}lmz%@f41e=4Q=T86zmuiH}p51kQ5$*fb#h^Woru7_SlmZk8)uUP3qzFS2 za+KK>*~KYg(I#f1bhcxH6@NGc1!e?{%af*;^^P&BaT#?&Jzkk?ygUe=fW2fbl(I{Mo;i3h6 zn~jyjTm=MzI`LGz1ksne;>*396zNIZam^`d1>OIQ-psFmI6a845QfvW*aPDmt`ml(A_?+*C$4`|; zt1=w%_Z~0-=;-KX;x9a9>bAMWixF+CV}6Yq#}*E$!Z6^VFK zKSWTmXAWtN{)oUJSh(~9%_}<${Bg|*k+Yt}z$MxBpvvs%A$`>+Ls!$-C;_S;%cW2Y za{@CP@Yf4gS@kR|?^o`PB+NBKA@?6AGu?pxN5T10{4@kC|8uQ_D*y*uoTl$fY&IyoiV{-SGCs{Q*Dt3)8K}7mS!Nup@?0(7 z{BdxPWnos>!yMc7a@LLLUEWJMW7_eL`;sPqbB`&CBbV-z53DMcDuYX(hgEkI{EM8f#8I*Bnb zqMi_?Ree!8>uk3{@qTz@WcMCs2=dv_Ic=R5o3hq#pwJWCjYf#2t6j?Do(*K{24a)M2eqIEJ}W*=N~@_>uvyY2ZsDMZ!aTDGvecOm7G4q&q?)hI9%3 zIwkiV*Zy=>WU0!>Yo#9#?T=W1Q@E6ii`MOOeKom03s(EWB^Zg@_~hP!v+hu}HIp&* zOgQHH57#_E^bH;i&|3I?gWj-zyj5?7;{kTvUO=&L0$skGhwRQkQG}Wpff5@DLeu|u zm>gp9xm2YDjLiEDw-ry9@pnozLBi`IS$j7 zv=9d(LiS@g@!jow@|u*ZH!VJBAmC)6jrTN`$r?%d;V7Hp!k!w+v#O_KUV#V#)U*`< zV(SB!ysuRnF_!ia4@<|SDS5gS`6f8%7QxQ2j_ox!)lz?d`0rp!z0>!WIp|$uDH?X*I~FL*(!SeQi$3abJDwTUO;ye7Q|OS`nDZNrevfv&};B?GkJ<{ z*7y>3dOPvq7Blo$O>(7UJhMb6xbffXLcVA9@`0gTSlcDVONaB58bRe0j)Z7SMOI7S zgjPesS02)J*BmK7NDi2Y!KJ>kV0aSHVQEcXyvSy|H}1zqI{v!g-#k-D!yAw_w+L$; zKgBn}*7J&1O@P~bzE&-md`!IlEsVTiYj}S!oWy6_4?osxP{r`3(h)mZi-CKhV)r)! zImtQ?W>r>I>t(w5bUeBARC~1-40n~03J{NzSD#m-2J_y`Fr4EF;HK}3R!)Hek-lS|!cvS}663#wqd%zh!O-(zx0G2f(Di4f}=_rJR1#mOX3Jj^oHU*irE`8h_#-A#+aw z;-67J{zNYrhvePNkZsig(X-J40-Vnys3Hds=&swq+kY>GwIvsS2H>hEQTY_Dh!U>L zr2C{4srQvvb7;A~r_gU3XhY|bwK{VUS|k}o{V+|u8)ik-y{nvY2fqX$JbjWO2E!-j zw?xOQc*Y+%-G~pZxi+VdFi{C)^%m~h<|_OuWG|OOmjtV%Lz2a6Iypx4dz>Sysii zU=;Dsfo1QV#O)N|>Zy$28xxC_I-?3l_H=DsHa$7i@@=?~a$NCZvS{u|WYhVM{&j2w zSKxnMt%83nMG9(fiZZv&i)D`>AuMcYhfw}W2WJQU_(2C#<5gRTp(u8ajhYKc`aR^T za8Zu9s~8dGgJ#a{>bsuY)jtRka`LrO#f#w7bUSYXvE6yv_09hX@G$T3<3(^xxMw?5 zE|^=}bB*D3E6AymF$MegE8%|`9oMQ(n6h5uaDR19pCr`n#?xQeQT?L_)Lo_A_aK*s zOX2U^XiLNl@!_}lIWaMvKQ*Q#*6S9?TZ~Xmcv=Rl4B#UZ8u<-l3XFf4Rhp6~jvdkR z2i_Vu$ZBUPL(IQdz5%gmF61Ih9m|h%is0s4Q>s{Pea^E*%qIiw+7!JC&!r9X4qBB; zq`4p+g?v|YbjB*X8+IdaAi*EGUxl%7=aLU+uF5VbC}(!h-bng25g(2`2!}0r{L#tq zY*2nqZaRQm7Ey3D7f1BRuB9xnA;uvpEa7Y~NnSN=88_B^x~_3l|^PIYe3o8T7(sQM1F z)?;zy_^Vn%{Z#iE2XhA~Ou14krY%Ozb2tqzeiAi9Wqaqrdxb@3GiJ$a7VqM*3Ebu1 zVd6oemz6)6N$1U-IyOoJsPi^kbd;P6(SZOpkfIu3O0-y2-sX~;pDpJ(VsXnAQ zOEy1Trip8gKQSFhBsf|}2 zq&1^|Ssfk%sCbGLTM{d3ey@6B&DO`TpVy+wEXwsOWlsET@LkYPlcq&M@J>qzWgRbF zfuQ7{qQ?+R~@*)K`yW-Pn>ajw+^#QVOszrEw1Oc#Z^JDg`h3c_UPg zYLR}Y9S021NQ@T>z?^0dl}5XNQZeDzUyCk_Vo}W*ag7~bQn$E@QAkcM-qO>lbB9(w zRb#Z7SNvkbA6N9R#*S5sjV!7!BHrK969Onr2#E6Jg)l>Nl$X>8tK_<@GkTfw-Bj{~$qwZZ zL_TuP9#dm(pc3fFubw&bt0R;5yQUIPsw3}S;aDIpuD0FNjGu|eZE?TGQAJbHwl{y# z0C+~AZ$B3_=kq^ofK_TpTh>>{5@5jme;vU5@26+k3UeZswFFq37X;dhmfrdy;8;#K zd&zioj3-x}IlsV}tUlzEMs+L~y*Lvnzktxk{f__$PsYLd{vAjT&0fK?qg)S*Cq+}u zNP>YBaOApE{Qh0lGUVkjfq(W0u-|cT>6#|s7T=pkR~8WamBYz<7#(nM<8xfbB7~K9 z62;t`W^0cJPvf^2XcEeztviK~4_&2pvbn|wpDXl}7i0W}&N%I#F^6|Ms11MhA0ml6 zR}oirhGnZp?-_xFg}YPxb1kqwZ9c_*%kaO~tmR%J%6k=)Eam%qG7`uf!VNz22rSD* z?p~vxJRFrLt|f7-Hm+N&yAVgh5v+4t{#Y~48yv(3ZI?xBGB=zoCr_E)yN(z62jG-u zrh1%!yFPds95#Fw$6u}w3r5Ah{I~baSWCiTbq5aJd&D;Jss3{~UwCmj>Ya!TyxraR z2g3^2aL5wAi34C^Q5Ms_G}2^6oQ0mc3lB=hXB4!sHO-*Ua4dNcK5u(q(H9!Vos+aNd@oGcJrwCujPTwWZU#CuQ)f2-=7;2^*^hN1T2@p#djRgL(ESxgW#;LgUTbn#XcOr zsMHZ%DZcBFeZJ+|djf{n&~}5oboxVh>|D zF3v7%mYVaD?RCtUXBN{`WcAd&&cR!O8GT`%sn^4(Gvk_JTeu)4H*8v)*o#pl=q3;X zd=vhis2RZk&lrK9*4`6L`lk`MH`#=@ zzAQ6PCNw=4ri>E64_4+Nv(pCzm6?t**F)+ZtvgenUxsrqphO?50uGE|hp$S7HfcvW zI?RVI+=`572aa@w`M|}l@rIXgb-q24P|c(vban+X;yolIKbyR z9#bNcP@7lon9VA(YC>xP1yy5W|r?;&#n*Au#6cxR;RhclnX2x zXn$*|C4WL5&R92>R#py+A9lYiR!UyhC19~0?T%;y?7qIIMQ_-Bc}$)(2OZhd?TkJb z@H(!DMXshUDBH(NCS5Y=v?@@=PscZ;G%gNyZ)J$L>$B;Ym9tS(AZ%}e3O&ySna<6~ z_YY9t`+mQ$QcsN(gAtbe6#6Z{*(ixO#|_KrRjnp#KF=Ma4=}HP?Y$T&!PNV;7s=_y z<&hf=1RgaMOlJvvYlXFT@OtZy)5N)JyA4|@{)}}q@aFcI5a&kPBDzIk_2~G= zbOcF+cX$3jdbM&eks0TwwGASvmz%!7YEM7j?KxQvR7S@1r`;2fVWjm`A5-FAN?fey zM!ZEwBry)UX75E0j%AL}IWmF5a^w4e&ZkOMbUB=2NY~b5K8abbN*#_2;%h%bQxv0& z-?foLjHNAt-c~71Jh;vbM@R9cungNjn1-kfx3juu*CQYquYnn8Z3e1g)-%h4$` zDVVDoM|FCHYZ9kMPK8dAP|w_+{=zruCU(89e_GjFrC ziL*?7s9`o&Fj5~ngmZwzHb2N)SIJ7SdqimpI#A|coE;Hb)8Ug3FDOkt*k2vYO&%sz zmb$>-=4E4__o1#wvIMy34#ix5F|)k;)X2RNsEs^}q>RYxTquI<0NSthHb^sShj-)GaK#RL3*#M*o~Qayqi#kQqDF9N zi)xFxLel`rbQRD2n;O!%%@-FTvj34_shvLrTK)mF0EF5zcJ82RW;%&5o-6`^)OcYz zf~nb?)47Z>uh<{2V4k_RV4rvAOHDaL_nOqd6N{5&6xW&dYPKYQ_q;Lk_pv4RPtbI} zC*>&Y?SGnRE$v?Z7T))IcbkA-%(=kr*b;W8FUII%V=_oM{v?x6$jdBg{~bs}Ja>+t zx)k_(C!u9<+0l$TS%y)l&g`BrrFpF4J9cBn2j*3=soDDR@3|EQE99(FKB|j`i5K(J z0A^(i#nh#=$p2}u-{d?9ta?+$G*xdb`|&8}_H7idvz9^Qw6{Mt2+O}%^|epaR^}Yi z>Dg5rh~MGxy2J4{W?sfV{z8CSu_(3}sORYJlcQA3Ib>IDGU*8l&^nus6hz|wr$DY~ zNE^~Um9c8~b(^i?(Q}`Rzc@=@d7+~81}=n~7RNdz8XColSSvVpK&6ApYIZUNsI5C{ z;w#mr@du4MeihTTYR0DwINzrOKSbCct=Fj~Cnpc3H|}FzrhCo$+9?8&>&75OF;F9e zgX`o6{Z|$r$CVZhUcd@-QwQOAH70lWzrm1vAKI5l*!qy(HtS^pF^^zJmV1 zJT!OAv*fV0F-UAlURU!gl^FenK>%*rmaf`qxlJmE>>at4JBl=!%TEUgTERQ<^8c;c z3n*CD*VlWXAV5OE>+%FU5>78A>9t*dWN{w~t9ISBL>z944SY0*`#w>c-5p0U!lV`L z^UC>q?+vEJSL`LumwPU{d&cAB#-JEE+T?C9pK=1tTJM2|aY|fcY(uohmtLOdbLvd@ zr9J-R$+y;ioAzN+D<;B;iW%pQH$dJyG9qJ@uSI|gi<*xbY=gyo8V`kAEsW&R5&Q+_ z8_HNgMcE>=_}UK3y!5#AC-fZj5FPW=T*vZ_fu|gKg@&CrD%%!kxlh_`WP)9M|59!f zoXP(u8f%F;t*JRpSXT|Th10IzYPh=C*4#wd9ZaqcQUVu@^pF8}tcM?(A!ENRxuT*3 zIEjkz&p7UNX?Q&CeYV+NNeq%a{wyW%pT6+ThU~b75@t0Hqb$L@kO~7^PsBEP9Umq{ zGobm<--aJ-+E8bLf8~Rds^*ua!$=D;Dt7*Mta6OrRiUKH^<9CBtKfR5sFJO>onDj><6FMz={m@31v-Zp z0zlV1uRC!kgpkhl2F|wU+V4E&m43b~+;?#vadk{$>2%Tlp1l?VbR}0UnHiz(TO+--XXjR4K)>1w;V5EAl<>Yv5?D_@B16fz`@yExlnNGVfaIz` zKlgF*J=&s;1>Q7}oTKS4d5{0QzKx#~3@bbPgUSo)*{^Vajzyqil#^38uZA=m_L|~W z_XEC@7fXL)5L+HG(qNsDZA|U&)3#2@Ow}AF%cc4KD9IVU_g}p*zn}Hl^}r{#80#cm zDVvPzDl*|$-Bv9LO!nS3-Yx@IRZnfVd2lluSZ1oIQKl;*wFZ3`R;oAEQ8%Z{%UWbT z(S~*;>8sFl=znES!2Mp-B$zhu?TOKGUl?LSk)Rsr0(~UgU+qklTq_@+H*2tI=(|MZ zVB3lH!jfmp;bL1q$6;Ts*(T=xo>o3+xSA8&KCg)P=GzW53;EqTZKp~mRrP|c1^y5y zH(Y{&IA4#%w>cUzmXn*wvU`Szdg792HiYJV7Vw^eSH~+dQq*94q`wdJ+^mwAy_=sg z@c8adK(@0;t*H08>yiCkE5(zLqp7170*^y+s=((%Ag+G5 z;U6ZIM#6NA$@vTW*v+o!i6JT- z5I8LQ!=ytO*9EthPv3tk@T(Dm%O=W(4-yCeR7nFfbyz34I$yg^5EKEk{-u0v+urLs zw%%)aU!m(~{DSfhc3C$#kY3fkX2ezn7t2p7?QtPPqHs_dTB9Urt5TJ6Uvk81x4cMo zUqiCGJELUpc_-4PnZP$ds~of+KtlO$7mvB&Q~q-6@H#QQb)T~gvwi=*Gzl8Kft@Rq zcsNE5o0|*sSc>Dh1m+2)j=u}_OzEwuu(lcuEMc%I(L$lA4(E6$P-<4+z$dawrp*tW z|{jgKeELEQX8Du`bhY zrnB@$uXz4r8dQ3qr^4a|ufpm-`)9F&$>_vK9~$scX#AqPZmhFMz*T@IuwGRnHawhr zPZgR!+#^xNs2cp3t`kaT0CH+VI*zZajn}lWF5M7JQak;ZF9SVUqO(~E3KLN&yT8*T zV%H43E;wquy7-@cb?P~1_eJZ%d!`2R&>qOR+w9#s!_BEWmwT+|n8VA})Gju%)M&gyNZ$p#fT+0|`JheoMhAR@{%M7rUiihi{2$i>v%S*LrC#!f5wOZ&QR zgm8r%A|SRwMJS+)v8BT>uRyJ#Jixl9#RhD+&px2IUay1l5|hX82ipDI|6HV!;r{GP z+PxVhdn@e9MT}h`PQP9t?&bogEnS1F^wuAPXqeOK7tt|$x@1n;&^$c50c1$390wd1 z${fTU%H#3pb4qZ!2lKhdt*}_f&U;;YV%+vbM02M~RtO1G7~>)QDohKq5SJ<;~!wjF8(9;Xrvavv{_cl31dwDcdQi;m34BQJ2p z3=HbzE{tn1xm(xIDS&&)@IS<`P;|)g2lR+i>glG8kkA$^|JPa7Q~^BSwXI*jxI9`z zLE(hwQ@!{bQ=5@eH`-eqws|#H1~gVORFXTs(qSd31Hh{HW2%Hl<-$99%NzY9 zmy?=}r_1$?r}>QzGh9`k^_%iDv{aV z?mu1!VNM@?Xw&~}0^Nz(&v$Kj!$(uHoEoMGX-b}PSdnTH492i352w4IuBrluU5)3( zz*@LigZ>~3?IT5#r;q!am>ft71gHy-gpHzrgq&iE+z!lsB!7N$X36A-s-dhn6tkXE zC39aV2s@*s8oFAaNqMfnA#rB&pI0_Rbhi3MNM-KE45=j(>}c>9A|UFP*qQZR+ysD_W4zONv{2 za7}fZxl63J0ozC3dl<*l7Mp@3@37qgUzXh{zt&@-S24#TJ}o@VXw1h!Sm(09aIsoo zY|H|33I9$@17(~XjbgM}1jJB#dY`Xe;B8P^CW+AgeBs{wc?y8E<0Ur1jkLqhlk%AUYM0(im=h15<+8muaq4-1y}E!G7h69e&8+_f z-L8P>4B4^gT;o}*@TCbHj$=*t+8^kf6#p*Hmr=-p@Bs&q=LXp4nhYTEy9wMr+l9)i zp#H1Xswl)>)v~h!=2p##Ro+nzJOkqR;{Hv^hCj3=hwRbUQzS_=S>lnOugSX2XmcS) zel2fxP?#e*NeI=g1%#R&0^s(5Pwu!5u5&U92O+= z-SpmXBj6RGo6=skRZp43?D}_O6V&tw6uT|aU9fR=zX_FmG4XBj2!0-l zc8Vw&m{2^e>jbly>>2Obq4VDL)5?S@K;MQGI1#nd54d>wYWlR*4*!xb$L{`bnYU<+ zWAh|$3RkRY{p?!9*%qTrXdH$-g||p2V^q1;bX0U%lGOWn6e{MZC;jQ$AE)&nXQ-wq z0=s4Fg~9IMpO~T=uWUL@S}4G{L76>eD0#N87C3o0*-!=+@Q5i? zad;6rk@8@Z!oTMhkH@!MQQ6wa!iP$=vg2lry+YYyBMC)rA`4j+L(|jQ`RX}A37$1u zW!@$HX;Ctcj{o*3Ou8zfDlr>!4){k$z!|6xbwRMAmN^(~x96f&0G8UE*hKn9%}bLd zN^o_HeD?oKY-p1>O?h|z+>X4eWMgH#W`65{`GykJy*cw6*bk9SbBQ(c*#r=WONP7-*xJ9e5a^8E4o0oC{UtZ&?uA%As(~ zP~_C4Rep!LZfH<=%5ku~=g*UG3nT2pEoUuU7c9Mof%xaOFX$TMVMhd{yFtGW#Dmi? z^Mv{$eq{F5IRZooB_dng(5jCiO=GaD|6`DDOjW$fg9*e`h`OF2qz3T} zePn0FBqR_FLFZ)-nUaBM&$5~Vv4RvD3l1ZKvAeR8eS~pTy9;|iJ?+V8;F4;0W9jGr zuGf@X$5zRCO3Sz%Ue`|WIB;Z%&MoDn5rK*5A45H7i5l_wlEQoOg0ms#U$fy68`K|7 zyzsQDgz3GxaN*%7#Q47I0$AxgSg=?6O)vGXL4NYgU~_ITzztWs@uPmTazaR2`Fks9 zu6lXZ?zSFk3y35h`w{T>0lkw|5bLTx{rs0vwUrq=S~;m~-v$v@{cM8XhlK7=o_J@o z_PLyks<*M~ADza8$Hq_4i8_4WXRLe9WfrMv^AgO~m`ymA*c1$kBgZN)(R9UHi5u?` zjHFumzKWK117sR9r)b=NhR~C&;uPJOY5GC?)&%3(o*zFA46&fPin@JUz7 z3)0ec*ea+Hf4yGN2kD_Ze(c86t>BBi8>WBvK@19yG6LyGdf=Mf7&?0JBO7yD(=lvK z8Fc*O!&1ZZLE*TLs}&ov4fLWg(wk_bEy=c2hCF|)U;PMqh^O)(9-xgCwzn;k6h&QkPNNK3NsXb8GL+q7A z(2{@NR2NBawvyP}zqkLTZvXt(hEH1`*ta|Q!$mk?8kP?9qd8)lAO7-}zdWUL08SXj zi$m4jlLVB*4^Ep^zFz6*z_Ar(_w+`NoH9h;E@n3e6hMei8Z(8#3Xg6a9W6hn9(=f3 zvAU;M=t1Y8A$d$+URb>h`cb|Shed1A9)W)<4}Q3go1OGJ36u8^H$+2~G1`Hi&icm5 zD&myrDU5Hf!gZlAoI@ULPI{5dUokHvlS8?TZcWf1?`8A!> z5AmF~J+CPZPmd$#Md^s1t|cAkCux89wWMS5+i18-RFF*`mWh4b$)A?%QF)YY9ipTq%$9lm?d#L!N8tt^8R0q&-A|C-bh^La7u) z8?>~tG8tvIEl*sYlqvIIlx5(w+zzpRZA+&#@{X3*0joS@o~`=D>8<=_$}`E^Dodrj zRU2qWSuU0>ta_^Htb_*{Znb}NZ~xx@SE&7mc&)zNzvF1O=83DV)0v%FX2Nh@UEN=} zYMR--sRLzVYv-1DTJhJU8g@;zbWPj(P#DRoxSrwa_UGlONO^(H_sKRP>w4H;x3<;AYWp^_LDnrLpQf(D zmW*VU2Z;-!y^y&|e-Noj zL_t(|0qtE~Y*ob;p4q#FTA_ae0#b_q2Cz3b{>0dth#F&iL!u8rdxIvvpyG=r*O%*q z8l$F(@eOlL%)KGGArXu|kQhx!Bzlc8N~)+N3PD7zL0bAFAT8(2-1W_wwV6HLhn`dD z;cU-d$?p8m?4J4dnl)?9j}#fDf10$`(hbrh9XE=XM3h&MgEHE>9FCPKWaT0{v7Q;) zGxgf{bIba1QF|QEc{rWlH7U-0$2yTw)sYLH1TZBMckBxR93s~`E6QYf4d(Jr^#s_ zgUF~Vh`AyF#U1Q*xB(u30~fS<^=i3s<3@4!-FHiR#L&=?{N$5QOqmTEHmKdZcN_ni zGiM~_6^9QW*0Pt}Z<~Ix1URTTNU0_U((_1^E{*Uaa=+-HUql@4x>Z;RNNs z|Ni?Z4q=qN=9+6H>R-5Uf1yc3{PN|?wfj!?oul^vp)R~TwI!%cy=&L5X}=BqFOlC* zM;gWH49J&|JWdNxN_5PgJ$nKM761ZwaBxswfBp61;K74Y0ffK)`fI~U+uGWKW5zZGlNtchHXqYpyUZ$e0)5}<#O`Kks~1h z#sDFZ%J07WPLgW?f6~&@A`cxpgm_ag|OJq9CG}G-_Ab{82lOjI9tpdGe$}{ahdX^nak7 zc^`}l^v*e?;bXx64zS}RK^#6hH_rVK=FOX@==V|?kmry*e_7Yad^8LO7#?YO4Zv;5 zA0nB!R!E%`5D>$M9(t(tzWeT5!({3pkcwk^4Sh8eEK*M=R!)O4JfIu4d_xHCw{P4s5#I1S=uy;;QPL|vrxUo00 zuQ|$qe38kUe`y=Jm$+{TnU6$=kU$rH_St9Pr1hIOZ*K1G?fnbMhW{YhbS(|HO->yp zwMViihW-r5BBKi?SA+o9g%$z8>gnkTKmYu5`NtoBgallO4k1mX!uQ^LubU=aeT|Kc zJq%v2zLJ57e06no8IVOrvnB>G)MPY+mNc7|n7Gj_e>x-$064D!FXZ0s+qZYojK7!s zeM#VT37{+o$V-6X`;`=Fgvhr(+h(uThtYi%0-6>x=z~pF2t*p5$=oqy=d}L@iSqMGMob05NghIx>lxVI9^k4DIOX ze**^&s09la1Z45ieqjv7R5lnI8d3y8{mnPu1h8C@^+{NZ7tFv|GXPP-xMZe%EgcmMu`15s>D@2;qtrzR2K*As^$x|5eMBIv``g47f3I$hr?c_~5TsuUa(# z0NN*(HDI*Gx1s{whIwve_>P8nsO#>7eeL8$n?=>lRc3#!b&jcYDr#& zjCwV3#%{#B%m0!nNjDqCIp8i<4uApYs|1xZ*~5AT8i_I>i@8Gl$`-(0K%lj4hkIF`SNoLot;l*9d@ zro(d149F=Y=y(SQ2Lmz$H1p7}*|mAx1+}g$9OYw?!sd^abL3{uTWKJds)c}>4l;74 zwMY^1b|BId8!ZJ*^cG40Oq>I*f8U)f-_vbtiG09+Ax}UB4abt5ItKAZHvoWk7~$e;T`bvEmDs zwt4mSD`WzAWrBZNM>|~lT;>9|4xBJ^>}nM)PM<8XIZG^s`) zljbG^vPdD2ad-#LIQZd*A0(`8I>C71Pwt|4QCy^$iK^8^%^W!sEz(6eRR-&WasGpJ z!R4EzUC0$PO`o?RzrHG#ku#1w-F{HjgmckwL=tw}+prAn)9{ zQ{Q^)ts491umx#aXZwrf-6YRtjYSe%{CbUUxr~qILdiXXbtb}E3jn#+!JIl7dHwqJ zdfT>b;Ep<<%S{y9f3aaWXh}6D1I9f8kn5`yl>=nv$d!D*YNXU@E%@Y0?6ac|oWQ<0 zcjX!=;=b+*HsJwN*tHoVzVc0Yd17@{h-Sl)Ga#pouswg-vSpgoZ;+93rfLLM_FD0sEYMnHGI9z+I?>ZhK1f2wd~zf$9*!f5wFDP1d{ zzkMkQ9Kt(H*!JM#-h__@zweG$N< zdwzRg0B0&VB0=1+pw(VpaO7$SFc*N%JkaQu`89e<0j?L=zmWd?QAbAJeuI4Ht!< z!|r3_86ccjaT;@IjdN z3t=UJe^O3cnGU%?sXUEy_3G967`0#5FcHNOtS2Qi06!amJC; ze@BIJo+JU>_kl~sckS9`dXX>OCXOv}5cqZ1T^BT&XD*Uujgf!gGwNvFh>ybwcfyz#~yaq7Bff1iE! zAc1fjf$?8EcI;S7qe4H$_ml(bayT;bfg@K^HCT<5-LqE)xgU-$T*@Q9_~MJR*h>gd zll-g*xZu_~T$=OfqmS+*(c?=JQ~vqxyYJpb7RgN{3Utw=^Sq$;f$W~&9GTs%zqPd$ zccRohkW(#MR1=XLZDeS^0o7g)e<4Y;f~(C!nn0S%(}`1uWX$O%Q1_AMqv#dBQ&UqV zwTru`Uw!pe^VBkBK)%T2=(El3sC)M832-_RWNK0k)Aa`!-fq;1R*zoTurjGAg&DKPROc6 zE`v)kM@B|WnDS@<8P-ZNfBeY8_C*C?8%rj)fr%g<7>2N`#_G^b9Q(a@GE29Gqt-+| zu7|_y(x_stIp+7oJL4268g-0|_k(rSwjJA1W)Ip?cu0+@a3d`eU~S=3hgXJ?)bpUY4kNB~%F@>v;Va>D_(Wo98O$4bL zO<8OL-oJl;R43O17v%}OA-93Dzy0=`Nyj_l9&o%9j8gcYs4dO^A6&Ep!Wky;!{vDR zaRwmf9`sw`gjQ9Ve;W`pDoRk{efZ&r=7JyUAPs9J0Y~rLxie2(TG3=teEjjpIhrV{ z&dyGScmlSfyb6GTOP#7nu2wI-^wQa{zWNHBPpwR;!pM27|qOh(;(eHqZ?Xf!u|F7|PcXw-C)lBmPO}}4l>mExa>8!4kZrC06 z%OP8q^~JIJV4XBM(*u>C^}`JicH;c^4g9ihemCrwgWs*!eOKT0{WcsVyz{i*)%|_k zdYw4oEoN79VQtPVj{Ca|XKq1Gq$x-n593WB>pF07*qoM6N<$ Eg8Ls`cmMzZ delta 4096 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 QZwP2|(#qf}(5ImP19!Nhm;e9( literal 11965 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 BTL1t6 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base@3x.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-base.imageset/marker-base@3x.png index 7348f5e2a1df9c154d6bd5e8dd185fd0c2a00d2f..902a9b5bef8a2fc69266927aa2d4e60bf915c29f 100644 GIT binary patch literal 25886 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 E0OMaT{Qv*} literal 23702 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 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip.png index 2c63030b85e3b78e4ec1fcd29d690137adef58e4..d0dbe86f4c199c1ef1ee626424bfd4b9d5759751 100644 GIT binary patch delta 342 zcmey%)WEFR8Q|y6%O%Cdz`(%k>ERLtq&ESv4F?;LJY?|Tz(hsUdQndo$B+ufx3>d* zSqw#3FR(i@@U37jaFA_iDP__)z~mRkBs8IcCF5q|P5B=UoF}WR{fdnL8=L!nzSRjd z1_@j%5PF@dTw58}6Vp3KUZvagKIi`@I(7MCTl?=E3C~n)wfki8$?8*>iHK?Vt=%hP z<6QOD^w;MohjWU~+`IGsUAJ|gG>xi@xedSXpXs&yM9q&mQCn`TJ*2C!F!G7nCz)gE zDrW8f^%GU?o;av1yu3ju_<+tQX9vOW6SFrZWF6cd_2%2@NUr54{$vOrkIm@1d8ANm z)}mi0f_Ip>C~gnje?{fX^oRBFMY3D!A;8Q|y6%O%Cdz`(%k>ERLtq!$3O4F?;Le3-pabfThZy^yDiV@L(#+gpLY zEQTVi7q}f6_*O6%9I#;Ee9aQjz&d9Qi;4mx=Y_QC8|qayoblQHT*dtJ{W~SMrmF!> zfrBs4bdCpSE&Ka@)w5;KJ}K-b z_rzMU#w=W!HoJb`sl^S<8P9j-{?h7Y;#=@H>-Nue%QtBxJl~ghP<40gdX}^+ToGAu z$vuadZe94QTei=c?V_<&|J;7otxR^TV&7)$%UhLqkXh^IT=r_sE+)RL$(Qw%v^Sp2 z6q`78W>(xILniHl`5#Z8==o<d)S*PoFJ20+FFDk+2DWU|C+pJY1x7DXZ~%IsUf!J?>qZ)?EHaVD{d` z=~<1rO6j8%?L`2bxz>f8i?&a>j%^VuUtp116mlP>fcr53M4dv;6K|e;*D3G91Pt(? zV->Oz2H4Zoh1{pyqzs{i0roOQA?M;9q7-o-0375cg`A7{eaeS04FkN`A%)z3N7)Sz z0l;MTDdaBYHmoH8j^gz*{wA*@zNXxTG6rZS?}-1V{FB87sN}JgMSh0(cDw>m!9y#H zJQe>6WeiZ&?u4AD;voR2Zd1tl#+|7cprOsm!oC=wv0TVQlotR2&`|z7&t3TZ5s&i; zC#WPJHqV;!6om|xlT*zMnfaW$6^2Y$6sm)_=-$E$^G_`xfCO?b(Gdy*{ zmYaG|$?m%>{-nH3`4IqA_0;q;q$mnbSd9sUN2Uc zX#!NT@AT6}S!Jxl#Jm(HWSD^=%6l;8Fy+bN0V0w zppc=G)`zW&veL)}eHGRlr$`|~C8u`S@&vsa)5W%=FM?JSGE_2`!?r2vZp>wD*B!f8 xrlpVp00000000000001ytRj)H2^fH*_z!-soB?T55Cs4L002ovPDHLkV1k&^HBtZo delta 639 zcmV-_0)YLK27(45iBL{Q4GJ0x0000DNk~Le0003%0001Z2nGNE0E5me-jN|SN0&)N zK~#7F?cL#R(?A#o;19$A-Jsr}*`Q{EvO&E8FaaFFyR3!@mvL{ z^nlfyy8!!?tCS&>9HAeona!8>qsp89@- z@&hV&I05FVZwP<}>?&nB+s+AYF zcfELs0;F1b3;Z(x8k7rv@KXRZXg>kI4}iw(UxWD)N)Tww;SKKmF5vg@RG5i}AXMw{ zyTHFvUZ;EufXY4e={}@<2-9HeOn_ADF^l_Slq2xFphXIh=5;AwV_OG#$~=K;9sB9t zMcEo(hl#KiCP28u5aoNsTbN?x>49p^@#)^jG!;@G6Cl-^b8&ZWG5uz6AJjqtQmyA& z++CD226GuYXm#5ZAk{j>;_jl9;Z>Lnw@3j}ty3@V{M#daltR1=Pm;Gl0aC4{7k3wB zi<}GbB5aq}NC8rF_q$3uoMMIwYIXj_r=(aIge@ke0XJE3J{T@F&JP0 Ze*qexoB?>YBD4Si002ovPDHLkV1jEFD=Yv2 diff --git a/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip@3x.png b/Memola/Resources/Assets/Assets.xcassets/graphics/pens/marker-tip.imageset/marker-tip@3x.png index 0efd8aad31a67d968125dd423815a0a670eb4032..1132ea19b8656e027004e442305638ac18654a85 100644 GIT binary patch delta 917 zcmV;G18V&J2&D-jiBL{Q4GJ0x0000DNk~Le0006O0002A2nGNE0LTnwACVz7M>wBs@@rg+RK< z){80fd4L}Xzx?aN$9EK&k)dmmun~VO*D6%M_fxi}eto;Sjz1ffuw?#b02+SFa*Tnn z?&sa+>vf((0suJDT*G3FhA|?#*l7TOvztp;lnn7OM#MS*z{Oo_SkxVfhkov2Hv#}A z<66REJleR=5ELZ+@$i`Em;eB-$P~gtOaOntOuS`S zbp3pcV-5hAjZ23`4Tu^OpCTpzV0JDQ7F|D|9|VRr%m7UmpbAt(S~p-veV zCBt#YV*r3fIz?EN2nqlo$Av{b=BPpODF6U@U0Aq>0sz?QrD4(a^H;nC3;@{S(6A^O zf}#rmz#caT{7yag_%EUY0Qi4}){aHJf8tvN1psiMeLEKG*rfmfUT9ZXyzl3qxIq&D zc%h%eqCS`6YkZ6p0C(`gwAx&|496cp+bRI;Rd*~(hG$d&034-;#Y5bv z2>_fx4U6{y062kqUi>}4q1{LWK`-HQ+LluiJk;idn5m43d& zi_2IpI~D*9uU#Zd1O|W0BrE_Lj$I^61P03@EC3o#wMdo-43kt`Vk<37X7 z&0ubX1wg~O7Rl02*U#tpm@4xkEC3oVu}F6PeC+2TaQ%b@K*J>$$r8I5Tt8s}(C}7^ zWY^DQKX(xsTo+*h&@hEX@?kS>_~aT03xI~HEs|qo*vVk3gav;M~k zVXlj0-NC4V(e?8#Lujl6#}gI+4NF=i$JnUXuAkcs!BOHUg~JI8fCh`?U^_a>=6bui rZcpNvW$FCQ005DrX_2rJ7qHV0#1lQ^HL=CC00000NkvXXu0mjfK;eyj delta 896 zcmV-`1AqLb3H=BmiBL{Q4GJ0x0000DNk~Le0005t0002A2nGNE08G69z>y&}ND@gz zK~#7F?cMKD+(sP7;V(=INC#{xFdd){pabIy><;Wy5~qTckaUn1C?OpryU}U5@c=%2 zdqO%r&&+Q${CUfM*wx)B0g<6@e}Hwn2+hxR%HFiEuXfkzXOj}P%-;;q#ZTFeDWunR z-tE4=&SP)^U^eF(;3=+CY=_vn0Xm*xdrKLTd@| zbfkQnF}x)JuwqLN@U+Wq(H-K2QUIKhr3JV}_CAl%1%R`(gaC^!0Gsoce*qrqe2n8| z05)ju0JqS#=zfam0-FSG)HlleBl?R~vp z1}H^8CX0|vTiJK%=^0JCZV{yhM|tlDu}`_PT{v6Cgh_c($Ef4XQp;D73T2mmmf z>65VjiUTECSuIG2r$sa z5*CxY-FV>^YaqZt7fV}ArWo59vs3~Mbg|^cWXR*rxCE9#Z-9X=*0PwCj6uHLT^&{P zRshklR&|nTr4eU7X8eGGq+#&F)$Pry;;V7w5W|v>kB^@lfYo#voq@ zjwirC7h76PrYN`TQ0FRRm`faCb2tG8y0Dmx_TyZ3*Q?!ie-g*rTjy^Ek)d!Gs{a5* W@jc^hHSjzD0000 Date: Sat, 18 May 2024 17:54:18 +0700 Subject: [PATCH 09/17] feat: add color picker --- Memola.xcodeproj/project.pbxproj | 24 +++ Memola/Canvas/Contexts/GraphicContext.swift | 2 +- Memola/Canvas/Tool/Core/Tool.swift | 2 + Memola/Canvas/Tool/Pen/Core/Pen.swift | 12 +- Memola/Components/Shapes/Triangle.swift | 20 ++ Memola/Extensions/Color++.swift | 12 ++ .../Memo/ColorPicker/ColorPicker.swift | 184 ++++++++++++++++++ .../Features/Memo/PenDock/PenDockView.swift | 104 +++++++--- .../Assets.xcassets/backgrounds/Contents.json | 6 + .../Contents.json | 23 +++ .../transparency_grid 1.png | Bin 0 -> 4196 bytes .../transparency_grid 1@2x.png | Bin 0 -> 10400 bytes .../transparency_grid 1@3x.png | Bin 0 -> 19039 bytes .../Contents.json | 23 +++ .../transparency_grid 1.png | Bin 0 -> 2324 bytes .../transparency_grid 1@2x.png | Bin 0 -> 5593 bytes .../transparency_grid 1@3x.png | Bin 0 -> 10060 bytes 17 files changed, 378 insertions(+), 34 deletions(-) create mode 100644 Memola/Components/Shapes/Triangle.swift create mode 100644 Memola/Features/Memo/ColorPicker/ColorPicker.swift create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/Contents.json create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/Contents.json create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/transparency_grid 1.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/transparency_grid 1@2x.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/transparency_grid 1@3x.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/Contents.json create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/transparency_grid 1.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/transparency_grid 1@2x.png create mode 100644 Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/transparency_grid 1@3x.png diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index e6dc41e..5e08e45 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -81,6 +81,8 @@ ECFA15242BEF223300455818 /* GraphicContextObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFA15232BEF223300455818 /* GraphicContextObject.swift */; }; ECFA15262BEF224900455818 /* StrokeObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFA15252BEF224900455818 /* StrokeObject.swift */; }; ECFA15282BEF225000455818 /* QuadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFA15272BEF225000455818 /* QuadObject.swift */; }; + ECFC51272BF8885700D0D051 /* ColorPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFC51262BF8885700D0D051 /* ColorPicker.swift */; }; + ECFC512A2BF8BBD800D0D051 /* Triangle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFC51292BF8BBD800D0D051 /* Triangle.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -160,6 +162,8 @@ ECFA15232BEF223300455818 /* GraphicContextObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphicContextObject.swift; sourceTree = ""; }; ECFA15252BEF224900455818 /* StrokeObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StrokeObject.swift; sourceTree = ""; }; ECFA15272BEF225000455818 /* QuadObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuadObject.swift; sourceTree = ""; }; + ECFC51262BF8885700D0D051 /* ColorPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPicker.swift; sourceTree = ""; }; + ECFC51292BF8BBD800D0D051 /* Triangle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Triangle.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -225,6 +229,7 @@ EC50500A2BF6672000B4D86E /* Components */ = { isa = PBXGroup; children = ( + ECFC51282BF8BBD000D0D051 /* Shapes */, EC50500B2BF6673300B4D86E /* ViewModifiers */, ); path = Components; @@ -315,6 +320,7 @@ ECA7387B2BE5EF3500A4542E /* Memo */ = { isa = PBXGroup; children = ( + ECFC51252BF8885000D0D051 /* ColorPicker */, EC5050082BF65D0500B4D86E /* Memo */, EC5050052BF65CCD00B4D86E /* PenDock */, ); @@ -599,6 +605,22 @@ path = Objects; sourceTree = ""; }; + ECFC51252BF8885000D0D051 /* ColorPicker */ = { + isa = PBXGroup; + children = ( + ECFC51262BF8885700D0D051 /* ColorPicker.swift */, + ); + path = ColorPicker; + sourceTree = ""; + }; + ECFC51282BF8BBD000D0D051 /* Shapes */ = { + isa = PBXGroup; + children = ( + ECFC51292BF8BBD800D0D051 /* Triangle.swift */, + ); + path = Shapes; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -672,6 +694,7 @@ ECA738B02BE60D0B00A4542E /* CanvasViewController.swift in Sources */, ECA738E42BE6110800A4542E /* Drawable.swift in Sources */, ECA738AD2BE60CC600A4542E /* DrawingView.swift in Sources */, + ECFC512A2BF8BBD800D0D051 /* Triangle.swift in Sources */, ECA738E02BE610B900A4542E /* EraserRenderPass.swift in Sources */, EC35655A2BF060D900A4E0BF /* Quad.metal in Sources */, ECA738912BE600F500A4542E /* Cache.metal in Sources */, @@ -704,6 +727,7 @@ ECA738CB2BE60F1900A4542E /* ViewPortContext.swift in Sources */, ECA738EE2BE6125D00A4542E /* simd_float4x4++.swift in Sources */, ECA7388C2BE6009600A4542E /* Textures.swift in Sources */, + ECFC51272BF8885700D0D051 /* ColorPicker.swift in Sources */, ECA738B82BE60DDC00A4542E /* HistoryEvent.swift in Sources */, EC0D14262BF7A8C9009BFE5F /* PenObject.swift in Sources */, ECA738952BE6012D00A4542E /* ViewPort.metal in Sources */, diff --git a/Memola/Canvas/Contexts/GraphicContext.swift b/Memola/Canvas/Contexts/GraphicContext.swift index cf6f565..fa6b910 100644 --- a/Memola/Canvas/Contexts/GraphicContext.swift +++ b/Memola/Canvas/Contexts/GraphicContext.swift @@ -117,7 +117,7 @@ extension GraphicContext { func beginStroke(at point: CGPoint, pen: Pen) -> Stroke { let stroke = Stroke( bounds: [point.x - pen.thickness, point.y - pen.thickness, point.x + pen.thickness, point.y + pen.thickness], - color: pen.color, + color: pen.rgba, style: pen.strokeStyle.rawValue, createdAt: .now, thickness: pen.thickness diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 609530a..1e0377d 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -16,6 +16,7 @@ public class Tool: NSObject, ObservableObject { @Published var pens: [Pen] = [] @Published var selectedPen: Pen? @Published var draggedPen: Pen? + @Published var opensColorPicker: Bool = false let scrollPublisher = PassthroughSubject() @@ -32,6 +33,7 @@ public class Tool: NSObject, ObservableObject { } if let selectedPen = pens.first(where: { $0.isSelected }) { selectPen(selectedPen) + scrollPublisher.send(selectedPen.id) } } } diff --git a/Memola/Canvas/Tool/Pen/Core/Pen.swift b/Memola/Canvas/Tool/Pen/Core/Pen.swift index 01a6b8a..4b453cf 100644 --- a/Memola/Canvas/Tool/Pen/Core/Pen.swift +++ b/Memola/Canvas/Tool/Pen/Core/Pen.swift @@ -18,9 +18,9 @@ class Pen: NSObject, ObservableObject, Identifiable { object?.style = strokeStyle.rawValue } } - @Published var color: [CGFloat] { + @Published var rgba: [CGFloat] { didSet { - object?.color = color + object?.color = rgba } } @Published var thickness: CGFloat { @@ -33,12 +33,18 @@ class Pen: NSObject, ObservableObject, Identifiable { object?.isSelected = isSelected } } + var color: Color { + get { Color.rgba(from: rgba) } + set { + rgba = newValue.components + } + } init(object: PenObject) { self.object = object self.id = object.objectID.uriRepresentation().absoluteString self.style = (Stroke.Style(rawValue: object.style) ?? .marker).anyPenStyle - self.color = object.color + self.rgba = object.color self.thickness = object.thickness self.isSelected = object.isSelected super.init() diff --git a/Memola/Components/Shapes/Triangle.swift b/Memola/Components/Shapes/Triangle.swift new file mode 100644 index 0000000..d9ce850 --- /dev/null +++ b/Memola/Components/Shapes/Triangle.swift @@ -0,0 +1,20 @@ +// +// Triangle.swift +// Memola +// +// Created by Dscyre Scotti on 5/18/24. +// + +import SwiftUI +import Foundation + +struct Triangle: Shape { + func path(in rect: CGRect) -> Path { + var path = Path() + path.move(to: CGPoint(x: rect.maxX, y: rect.minY)) + path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY)) + path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY)) + path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY)) + return path + } +} diff --git a/Memola/Extensions/Color++.swift b/Memola/Extensions/Color++.swift index b0e9aa6..332db55 100644 --- a/Memola/Extensions/Color++.swift +++ b/Memola/Extensions/Color++.swift @@ -18,6 +18,18 @@ extension Color { } } +extension Color { + var hsba: (hue: Double, saturation: Double, brightness: Double, alpha: Double) { + let uiColor = UIColor(self) + var hue: CGFloat = 0 + var saturation: CGFloat = 0 + var brightness: CGFloat = 0 + var alpha: CGFloat = 0 + uiColor.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) + return (hue, saturation, brightness, alpha) + } +} + extension UIColor { var components: [CGFloat] { let uiColor: UIColor = self diff --git a/Memola/Features/Memo/ColorPicker/ColorPicker.swift b/Memola/Features/Memo/ColorPicker/ColorPicker.swift new file mode 100644 index 0000000..1bd4151 --- /dev/null +++ b/Memola/Features/Memo/ColorPicker/ColorPicker.swift @@ -0,0 +1,184 @@ +// +// ColorPicker.swift +// Memola +// +// Created by Dscyre Scotti on 5/18/24. +// + +import SwiftUI +import Foundation + +struct ColorPicker: View { + @ObservedObject var pen: Pen + + @State var hue: Double = 1 + @State var saturation: Double = 0 + @State var brightness: Double = 1 + @State var alpha: Double = 1 + + let size: CGFloat = 15 + + var body: some View { + VStack(spacing: 10) { + colorPicker + .frame(width: 180, height: 180) + HStack(spacing: 10) { + Color(hue: hue, saturation: saturation, brightness: brightness) + .overlay { + Image("transparent-grid-square") + .resizable() + .scaleEffect(1.8) + .aspectRatio(contentMode: .fill) + .opacity(0.5) + .overlay { + pen.color + } + .clipShape(Triangle()) + } + .frame(width: size * 2 + 10) + .cornerRadius(5) + VStack(spacing: 10) { + hueSlider + alphaSlider + } + } + } + .padding(10) + .background { + Rectangle() + .fill(.regularMaterial) + .ignoresSafeArea(.all) + } + .onAppear { + let hsba = pen.color.hsba + hue = hsba.hue + saturation = hsba.saturation + brightness = hsba.brightness + alpha = hsba.alpha * 1.43 - 0.43 + } + } + + @ViewBuilder + var colorPicker: some View { + GeometryReader { proxy in + ZStack { + Color(hue: hue, saturation: 1, brightness: 1) + LinearGradient( + colors: [.white, .clear], + startPoint: .leading, + endPoint: .trailing + ) + LinearGradient( + colors: [.black, .clear], + startPoint: .bottom, + endPoint: .top + ) + } + .cornerRadius(5) + .drawingGroup() + .overlay(alignment: .bottomLeading) { + Color(hue: hue, saturation: saturation, brightness: brightness) + .frame(width: size, height: size) + .clipShape(Circle()) + .overlay { + Circle() + .strokeBorder(.white, lineWidth: 2) + } + .offset(x: -size + 5, y: size - 5) + .offset(x: max(proxy.size.width * saturation, size - 10), y: min(proxy.size.height * -brightness, -size + 10)) + } + .gesture( + DragGesture(minimumDistance: 0) + .onChanged { value in + saturation = min(1, max(value.location.x / proxy.size.width, 0)) + brightness = 1 - min(1, max(value.location.y / proxy.size.height, 0)) + updateBaseColor() + } + ) + } + } + + @ViewBuilder + var hueSlider: some View { + GeometryReader { proxy in + ZStack(alignment: .leading) { + LinearGradient( + colors: (0...10).map { Color(hue: Double($0) * 0.1, saturation: 1, brightness: 1) }, + startPoint: .leading, + endPoint: .trailing + ) + Color(hue: hue, saturation: 1, brightness: 1) + .frame(width: size, height: size) + .overlay { + Circle() + .strokeBorder(.white, lineWidth: 2) + } + .clipShape(Circle()) + .offset(x: -size) + .offset(x: max(size, proxy.size.width * hue)) + } + .frame(width: proxy.size.width, height: proxy.size.height) + .clipShape(Capsule()) + .gesture( + DragGesture(minimumDistance: 0) + .onChanged { value in + hue = min(1, max(value.location.x / proxy.size.width, 0)) + updateBaseColor() + } + .onEnded { value in + hue = min(1, max(value.location.x / proxy.size.width, 0)) + updateBaseColor() + } + ) + } + .frame(height: size) + } + + @ViewBuilder + var alphaSlider: some View { + GeometryReader { proxy in + let color = Color(hue: hue, saturation: saturation, brightness: brightness) + ZStack(alignment: .leading) { + LinearGradient( + colors: (3...10).map { color.opacity(0.1 * CGFloat($0)) }, + startPoint: .leading, + endPoint: .trailing + ) + .background { + Image("transparent-grid-rect") + .resizable() + .aspectRatio(contentMode: .fill) + .opacity(0.5) + .background(.white) + } + color + .frame(width: size, height: size) + .overlay { + Circle() + .strokeBorder(.white, lineWidth: 2) + } + .clipShape(Circle()) + .offset(x: -size) + .offset(x: max(size, proxy.size.width * alpha)) + } + .frame(width: proxy.size.width, height: proxy.size.height) + .clipShape(Capsule()) + .gesture( + DragGesture(minimumDistance: 0) + .onChanged { value in + alpha = min(1, max(value.location.x / proxy.size.width, 0)) + updateBaseColor() + } + .onEnded { value in + alpha = min(1, max(value.location.x / proxy.size.width, 0)) + updateBaseColor() + } + ) + } + .frame(height: size) + } + + func updateBaseColor() { + pen.color = Color(hue: hue, saturation: saturation, brightness: brightness).opacity(0.7 * alpha + 0.3) + } +} diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index 4b9140c..ee376c9 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -15,41 +15,85 @@ struct PenDockView: View { let factor: CGFloat = 0.95 var body: some View { - ScrollViewReader { proxy in - ScrollView(.vertical, showsIndicators: false) { - LazyVStack(spacing: 0) { - ForEach(tool.pens) { pen in - penView(pen) - .id(pen.id) - .scrollTransition { content, phase in - content - .scaleEffect(phase.isIdentity ? 1 : 0.04, anchor: .trailing) + VStack(alignment: .trailing) { + if let pen = tool.selectedPen { + VStack(spacing: 10) { + Button { + tool.opensColorPicker = true + } label: { + let hsba = pen.color.hsba + Color(hue: hsba.hue, saturation: hsba.saturation, brightness: hsba.brightness) + .overlay { + Image("transparent-grid-square") + .resizable() + .scaleEffect(1.8) + .aspectRatio(contentMode: .fill) + .opacity(0.5) + .overlay { + pen.color + } + .clipShape(Triangle()) } + .clipShape(Capsule()) + .frame(height: 20) + .drawingGroup() } + .hoverEffect(.lift) + .popover(isPresented: $tool.opensColorPicker) { + ColorPicker(pen: pen) + .presentationCompactAdaptation(.popover) + } + Capsule() + .frame(height: 20) } - .padding(.vertical, 10) - .padding(.leading, 40) + .padding() + .frame(width: width * factor - 18) + .background { + RoundedRectangle(cornerRadius: 20) + .fill(.regularMaterial) + } + .transition(.move(edge: .trailing).combined(with: .opacity)) + } else { + Color.clear + .frame(width: width * factor - 18, height: 50) } - .onReceive(tool.scrollPublisher) { id in - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - withAnimation { - proxy.scrollTo(id) + ScrollViewReader { proxy in + ScrollView(.vertical, showsIndicators: false) { + LazyVStack(spacing: 0) { + ForEach(tool.pens) { pen in + penView(pen) + .id(pen.id) + .scrollTransition { content, phase in + content + .scaleEffect(phase.isIdentity ? 1 : 0.04, anchor: .trailing) + } + } + } + .padding(.vertical, 10) + .padding(.leading, 40) + } + .onReceive(tool.scrollPublisher) { id in + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + withAnimation { + proxy.scrollTo(id) + } } } } + .frame(maxHeight:( (height * factor + 10) * 6) + 20) + .fixedSize() + .background(alignment: .trailing) { + RoundedRectangle(cornerRadius: 20) + .fill(.regularMaterial) + .frame(width: width * factor - 18) + } + .clipShape(.rect(cornerRadii: .init(bottomTrailing: 20, topTrailing: 20))) + .overlay(alignment: .bottomLeading) { + newPenButton + .offset(x: 60, y: 10) + } } - .frame(maxHeight:( (height * factor + 10) * 7) + 20) .fixedSize() - .background(alignment: .trailing) { - RoundedRectangle(cornerRadius: 20) - .fill(.regularMaterial) - .frame(width: width * factor - 15) - } - .clipShape(.rect(cornerRadii: .init(bottomTrailing: 20, topTrailing: 20))) - .overlay(alignment: .bottomLeading) { - newPenButton - .offset(x: 60, y: 10) - } } @ViewBuilder @@ -59,7 +103,7 @@ struct PenDockView: View { Image(tip) .resizable() .renderingMode(.template) - .foregroundStyle(Color.rgba(from: pen.color)) + .foregroundStyle(Color.rgba(from: pen.rgba)) } Image(pen.style.icon.base) .resizable() @@ -74,12 +118,13 @@ struct PenDockView: View { tool.selectPen(pen) } } + .padding(.leading, 10) .contextMenu(if: pen.strokeStyle != .eraser) { ControlGroup { Button { let originalPen = pen let pen = PenObject.createObject(\.viewContext, penStyle: originalPen.style) - pen.color = originalPen.color + pen.color = originalPen.rgba pen.isSelected = true pen.tool = tool.object let _pen = Pen(object: pen) @@ -109,7 +154,6 @@ struct PenDockView: View { .contentShape(.dragPreview, .rect(cornerRadius: 10)) } .onDrop(of: [.item], delegate: PenDropDelegate(id: pen.id, tool: tool)) - .padding(.leading, 10) .offset(x: tool.selectedPen === pen ? 0 : 25) } @@ -142,7 +186,7 @@ struct PenDockView: View { Image(tip) .resizable() .renderingMode(.template) - .foregroundStyle(Color.rgba(from: pen.color)) + .foregroundStyle(Color.rgba(from: pen.rgba)) } Image(pen.style.icon.base) .resizable() diff --git a/Memola/Resources/Assets/Assets.xcassets/backgrounds/Contents.json b/Memola/Resources/Assets/Assets.xcassets/backgrounds/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Memola/Resources/Assets/Assets.xcassets/backgrounds/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/Contents.json b/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/Contents.json new file mode 100644 index 0000000..a8d92bf --- /dev/null +++ b/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "transparency_grid 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "transparency_grid 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "transparency_grid 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/transparency_grid 1.png b/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-rect.imageset/transparency_grid 1.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e41498c29a1d563b4bbb52d53a078862441de6 GIT binary patch literal 4196 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 X&*)Qh(p4yc00000NkvXXu0mjfZw;xx literal 0 HcmV?d00001 diff --git a/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/Contents.json b/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/Contents.json new file mode 100644 index 0000000..a8d92bf --- /dev/null +++ b/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "transparency_grid 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "transparency_grid 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "transparency_grid 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/transparency_grid 1.png b/Memola/Resources/Assets/Assets.xcassets/backgrounds/transparent-grid-square.imageset/transparency_grid 1.png new file mode 100644 index 0000000000000000000000000000000000000000..b340c389cfd9cb9d94d3073c50bfa243db491859 GIT binary patch literal 2324 zcmV+v3G4QWP)PDkcw|e#J?)dTJo%G_xi|*dNdwmgv|y?WK%y?eLt?%cVv+r4{t6B{~w_;9yj!-mp+`SRuN z`}gnt`_iRLyRjXq;7L+wU7tLyI{0iG;;sAFau<_Xk8Sk%^XJKU{O5c=efrehxpSv5 ztzEme+rNK*|IV(lLeHN+FYT=0#*G_$P}*5xFcfg&#EDMqFJHcNH*el70|0y9zI~+( zuGsF-mMvRKnH_rn{(YGQJH#&Y{^Q4wZp^kUEG(1`r~-`CEm^Xpe<1t7q;P(-9bP8H z10_EbQqAOdk`mZrB{t&$6aM6--Q61}u$1K-bZbkqpX%v*&6DpAHnFl_tFD%-?e-JV zV4St9U`N_>p!F)binO~*xxxw-+ksIQTYh;Rpx9Dkvpcr;JEhlx@LETY9_?3)0la+q zve!)qvwi#a8Lx#$!}~ZmJYIUO^XJbOHAA2AYO3h#*RN;namS7wO|K>Pp+kp?*MhEG zxzgJmRJ>NIKyG=eh`+hj**8}*+Z`D1wK}!>rtEpx@`$sL%r#I7Tg;6PQL0u_OZQtg zvKX#3Mis0?$3J}dFr&w)TQboup|h$IeQ>=QKWNj-v3egrew@KhH5A(gq`&RjD*O_v zs?GH~J?$`Y+X1?M{d!^Ev}scxM~o9spFZs$SNFhy1I5=<2k$g4mDN3c`gE_qyra)V zW8~16_;c{!!BPhI@#Dv3qI>u5?K26nv8Q+M-jzinOIWsSSv2ufmm#pem%Cn z&$DOGCh51)b5|<$6ehNiM?z28UWK7n>HAl#SW%)kgG(K!|C%*xN*P>Z8hznSY{q3~ zpnZu={rJ(NM?)2!MqT6&$UI8<(_*6*Y~^YE=3a>akMk*rAF&9=0KOyX*R^^@f8v<4PLin0uwnR+dr9Q{fXC zh$A;{+$iA05n_cPQ^zo46X-N?MBuAeul5En|Cuvq%EZ2Y{aWG(WE^pz;1WwD@-A%B z_FK1Zl{f+sN3c5xCoxXdNEK+g(%hLL_bPu~Su z2~HXFY_T=5)&$F#rpM1o=32No8BmkVtyZpFIph1;YE(wrym|9X27rqd8yA`GGqI6J zT*%ytHgh*H*R5Mu;tIR@=FOYpAZQ;m7=;l7&|L}Ref#!pnHUqvn+(9(>`-@-i23<`!i!T1-7!?L+>*=AGAf9)4nsTZ2hk z7-DQCdbMyf+t$E_63Tp^XA_19Wsj!$&qPr4mXyT~Y&GuH383?Axk7M{TxVzqpF%v3Exfj&nusjJ{l# z3V%8e9{JU2`H`ImDbL`h_+mq1D+^rtdB%Aj$t|tVA!Q2(@}>Gb;^2mOYPmID%hhLm z%gEkOgk3QErK8(rXI3EtVz%dXkSm;Jc-;|X$g3>XP;C2JPAtm0Ux+prsy|MjJ9lo9 zF7U{aBV~2Dj(Pa-VG)c??Ao=ffT8nT>nP~hv17f9Rye7)YRVu;^W6pPfh$&5m}4zA zqbzI{yK&;!8?i)ej@2{QL8%Uq2l~9M%WclO*0$Gb+QLrE^g?+-SM%COp3J0sHBK-= z@^`UVFpuW7{}bL;3RTyQIa0csY*F5(qkF1~WZIx0_$|BD5^Y`wq5rsdv5~1qbYRL( zeu@6JYs>CXZ(CD??9=$xbr61>v|{MWh7_Ot%I$?W2g7xcE|U6d*RGXG6Qel3s>U@o zSF@(^wBNpcyQD)r9GeXtxb=m+mT7HaUPM@D-_+xbw6^ELD-Uayhq8lFbzG?3cq_YD zs0UtCeO9O`!H42cja9$bq^h^ZGgLozyAX^H>*DlKWWRpIp^lU!Ggz}{>hk&rf>*U= z`^{d}0yArmxwPkk<;^0v%I4u}$w=SFy82@%vB0e*j*yC5_UhlVpA{rNwdFn7#fuk< zv3nilK!_0;N5CdVi9PRQD8#YZbf`D{*4DM&TXl8JX!Wb{>J+2Z_B-@9_v?UK`Aq97 zHLqgovwh2s(s0v&TLa56$eZOlkIV9CsvZ*~u6ChtKb>WyM^`hl=G~UMuaLjoV&V7G zoc!iXE=V3_$-{CHGE;`YPJ8^<*Flssj==N3UkBCO-MY@H-S9m7nRgx3YOC|6-?5cC zmW+q=I$dmi)~JJ`{aS6g0ML*}cxJCi;3@BrZ_BL`}R7VzT5$JP>ubXYwDx;Wcfb9T#d`0bAEC zwpXkzZ1OHtNo>^6e+N+qwtw2`KfPgKdA!Z@MBc~3j2|~nP{v;J;Kg7uQiWp|ex7E) uc`t=ruq})2M2ItBX8_E0uswLOcz*!6MguFdXJlvq0000dpHK~#7F?VSg+ z8%5KFSJxuvoWZ0b|Nmb>xlCb#!DKKPOwPgj{45-OM@QYO)xCzgZ`JK8m86~N>7LYc zx@UHGapugK)s-t(20n|$VsN_q?z@L4o_J!s?rE#lYW#fg!3V?FUw^&D2Q8P&;l&qU z9Im_Wx}l=WmoJa}@TxqO!|!LFd1kot&O1w9($AhfJN)(6UmJX)JMOq+c@<3- z5qyB|gt|9x@TW|fl0jykg;AfwGHvInk?;HHoiFEAzz4zX`(N#xI-21QT`pl~w${PWM{;)sGQ*j|&^Z_)w$nL%QZbB2Cv)H?Oac_=+Tl_N(f>R3?o!XVgd2H5&-w$;bb+<6dT^teYFi zE7f%ldDQtiLv+mtf)hGsgQO0XDXmPL>yvBIDxkc|aNca6gDN4ZOPd2bcP*+@e7WGe zT>n(Oo_8PGwWwF=yJU3rsLDBky~m7}yE3G0g%Z{1n*QfVN~r7QbmZkF-@a6>VHNqh z(#^~+ZAx~+;527WOJJI8Y9bQW4xy1G6bFqEN~jh&U?V6Bv{fmIOk`K<7G;A#Iur&E za)nZ|fj~&0FzK1Rq^E4xK?p91_5md!y8|Wg3%OPU5Y*bOZ?x4yv8<}n_z90Z^2kxemE)(Co z07o$?fYFJ9Y7{3Fqa&2ZNi$C)H)X0~LU0|af%vW>0uZylat@gx(z8Nv@TF|Qd<_7X zssEbY;?04gbVs3H|50{AwX9SJ&y-&^NuTPl)lpCO)xPTmon?v*)H z!&LG$FcVf+{zr#iohNl)qpV%9ZK`3qYn8xViq3_HqRtz3)7Uj?#aB6*N!6&IOU~Qr zZ~}Xe8Lc~H*DP_Gn|I&Qlhb!DU-iEmfxFCMSMJ<=a~;5n7aIK#E#A4nXJ{aWR+Y;I ztBTa}-_1jX?|oY!sah!gf5y{1%@@|HGqpI+i7+g7_*$KL^L5PYKI(ln)V!+fy&|@` zXiJczkZREsPeSSh0~L}I5}WD}P>(8{i?jPaT?1wvHX6kSj7X?cJUIwdAN0;3q{>m; zPXjy$1n6&Z)wx@#Gd$o1(^p@8HGJ~PCnK|0Qo>K4K0W#h9$*v<<@5I2Z?7Sy6qG{u z+;h*!UyU-p!Rv&wD}v|cmtS5tiaJNU>_@Qg4fOVomHbB^eRTA(1hd75GfP=-yz$29 z^g2-%b-`D_Pw}?WAVU^=DeMDvj^T69JvWviAIUrR`|rR1+hk2)ehN%qBVn(nspmDq z5(!aOHsCH)Q>_Prp4CWGT6G9QqqBCiQFty z&{BvbA+w{bEK}wRa_H$c*5Pm${!k1n<3f_J{O+-fa%(r&0exq=&c`~)BAVET zcP9Hl3ttzYOYEGBUKfH8M9dCSeh^K?=aqBb{7BzwJ)*%JTDp7EUgqfxp)8Jaa-7u3XC%jb zbfP5*-8hCS^yj+s8$Lqd9(8rykP9?UhgUNX*@W=DaTVzWZ2@hw;Z+WMIQQRwf4S#D z8HE0|pOPKTKFktqUBN?sQ(^53q*)Mb%aQJ8Na6R&+>ypHqYeeZlY0_g26A=kB?kl* z(*{*#F5vBCiyyuHn2tICneZlpQU`FZn8DbgRAkfUqZ1ewW{t8s#YCCz@U?=O-8!Ij z4`X+5v9qz2eqCC1N~D9eUauD=C`>8@FUCS7g%E*PdqlDvXq�`I@9j^^)%%|WYsoz%GcVPI_tCE!mS#9 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 HuOj~!kp6g! literal 0 HcmV?d00001 From 23ce30731cc8c50555a1470c1be7bc47af254a39 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 21:36:21 +0700 Subject: [PATCH 10/17] feat: add tiny border to color preview --- .../Memo/ColorPicker/ColorPicker.swift | 43 ++++++++++++++++--- .../Features/Memo/PenDock/PenDockView.swift | 4 ++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Memola/Features/Memo/ColorPicker/ColorPicker.swift b/Memola/Features/Memo/ColorPicker/ColorPicker.swift index 1bd4151..aec9e83 100644 --- a/Memola/Features/Memo/ColorPicker/ColorPicker.swift +++ b/Memola/Features/Memo/ColorPicker/ColorPicker.swift @@ -16,7 +16,7 @@ struct ColorPicker: View { @State var brightness: Double = 1 @State var alpha: Double = 1 - let size: CGFloat = 15 + let size: CGFloat = 18 var body: some View { VStack(spacing: 10) { @@ -37,7 +37,11 @@ struct ColorPicker: View { } .frame(width: size * 2 + 10) .cornerRadius(5) - VStack(spacing: 10) { + .overlay { + RoundedRectangle(cornerRadius: 5) + .stroke(Color.gray, lineWidth: 0.2) + } + VStack(spacing: 15) { hueSlider alphaSlider } @@ -76,14 +80,23 @@ struct ColorPicker: View { } .cornerRadius(5) .drawingGroup() + .overlay { + RoundedRectangle(cornerRadius: 5) + .stroke(Color.gray, lineWidth: 0.2) + } .overlay(alignment: .bottomLeading) { Color(hue: hue, saturation: saturation, brightness: brightness) .frame(width: size, height: size) .clipShape(Circle()) + .padding(1) .overlay { Circle() .strokeBorder(.white, lineWidth: 2) } + .overlay { + Circle() + .stroke(Color.gray, lineWidth: 0.2) + } .offset(x: -size + 5, y: size - 5) .offset(x: max(proxy.size.width * saturation, size - 10), y: min(proxy.size.height * -brightness, -size + 10)) } @@ -109,16 +122,25 @@ struct ColorPicker: View { ) Color(hue: hue, saturation: 1, brightness: 1) .frame(width: size, height: size) + .clipShape(Circle()) + .padding(1) .overlay { Circle() .strokeBorder(.white, lineWidth: 2) } - .clipShape(Circle()) + .overlay { + Circle() + .stroke(Color.gray, lineWidth: 0.2) + } .offset(x: -size) - .offset(x: max(size, proxy.size.width * hue)) + .offset(x: max(size, proxy.size.width * hue - 2)) } .frame(width: proxy.size.width, height: proxy.size.height) .clipShape(Capsule()) + .overlay { + Capsule() + .stroke(Color.gray, lineWidth: 0.2) + } .gesture( DragGesture(minimumDistance: 0) .onChanged { value in @@ -153,16 +175,25 @@ struct ColorPicker: View { } color .frame(width: size, height: size) + .clipShape(Circle()) + .padding(1) .overlay { Circle() .strokeBorder(.white, lineWidth: 2) } - .clipShape(Circle()) + .overlay { + Circle() + .stroke(Color.gray, lineWidth: 0.2) + } .offset(x: -size) - .offset(x: max(size, proxy.size.width * alpha)) + .offset(x: max(size, proxy.size.width * alpha - 2)) } .frame(width: proxy.size.width, height: proxy.size.height) .clipShape(Capsule()) + .overlay { + Capsule() + .stroke(Color.gray, lineWidth: 0.2) + } .gesture( DragGesture(minimumDistance: 0) .onChanged { value in diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index ee376c9..f28977a 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -35,6 +35,10 @@ struct PenDockView: View { .clipShape(Triangle()) } .clipShape(Capsule()) + .overlay { + Capsule() + .stroke(Color.gray, lineWidth: 0.2) + } .frame(height: 20) .drawingGroup() } From 9058815b0a2f76b26ab134eddd9a25e5d79f62f7 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 22:51:44 +0700 Subject: [PATCH 11/17] feat: add shadow for pens --- .../Memo/ColorPicker/ColorPicker.swift | 7 +- .../Features/Memo/PenDock/PenDockView.swift | 163 +++++++++++------- 2 files changed, 100 insertions(+), 70 deletions(-) diff --git a/Memola/Features/Memo/ColorPicker/ColorPicker.swift b/Memola/Features/Memo/ColorPicker/ColorPicker.swift index aec9e83..a3a197a 100644 --- a/Memola/Features/Memo/ColorPicker/ColorPicker.swift +++ b/Memola/Features/Memo/ColorPicker/ColorPicker.swift @@ -29,10 +29,8 @@ struct ColorPicker: View { .resizable() .scaleEffect(1.8) .aspectRatio(contentMode: .fill) - .opacity(0.5) - .overlay { - pen.color - } + .clipShape(Triangle()) + pen.color .clipShape(Triangle()) } .frame(width: size * 2 + 10) @@ -170,7 +168,6 @@ struct ColorPicker: View { Image("transparent-grid-rect") .resizable() .aspectRatio(contentMode: .fill) - .opacity(0.5) .background(.white) } color diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index f28977a..b1caf1f 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -18,35 +18,7 @@ struct PenDockView: View { VStack(alignment: .trailing) { if let pen = tool.selectedPen { VStack(spacing: 10) { - Button { - tool.opensColorPicker = true - } label: { - let hsba = pen.color.hsba - Color(hue: hsba.hue, saturation: hsba.saturation, brightness: hsba.brightness) - .overlay { - Image("transparent-grid-square") - .resizable() - .scaleEffect(1.8) - .aspectRatio(contentMode: .fill) - .opacity(0.5) - .overlay { - pen.color - } - .clipShape(Triangle()) - } - .clipShape(Capsule()) - .overlay { - Capsule() - .stroke(Color.gray, lineWidth: 0.2) - } - .frame(height: 20) - .drawingGroup() - } - .hoverEffect(.lift) - .popover(isPresented: $tool.opensColorPicker) { - ColorPicker(pen: pen) - .presentationCompactAdaptation(.popover) - } + penColorButton(pen) Capsule() .frame(height: 20) } @@ -61,48 +33,52 @@ struct PenDockView: View { Color.clear .frame(width: width * factor - 18, height: 50) } - ScrollViewReader { proxy in - ScrollView(.vertical, showsIndicators: false) { - LazyVStack(spacing: 0) { - ForEach(tool.pens) { pen in - penView(pen) - .id(pen.id) - .scrollTransition { content, phase in - content - .scaleEffect(phase.isIdentity ? 1 : 0.04, anchor: .trailing) - } - } - } - .padding(.vertical, 10) - .padding(.leading, 40) - } - .onReceive(tool.scrollPublisher) { id in - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - withAnimation { - proxy.scrollTo(id) - } - } - } - } - .frame(maxHeight:( (height * factor + 10) * 6) + 20) - .fixedSize() - .background(alignment: .trailing) { - RoundedRectangle(cornerRadius: 20) - .fill(.regularMaterial) - .frame(width: width * factor - 18) - } - .clipShape(.rect(cornerRadii: .init(bottomTrailing: 20, topTrailing: 20))) - .overlay(alignment: .bottomLeading) { - newPenButton - .offset(x: 60, y: 10) - } + penScrollView } .fixedSize() } - @ViewBuilder + var penScrollView: some View { + ScrollViewReader { proxy in + ScrollView(.vertical, showsIndicators: false) { + LazyVStack(spacing: 0) { + ForEach(tool.pens) { pen in + penView(pen) + .id(pen.id) + .scrollTransition { content, phase in + content + .scaleEffect(phase.isIdentity ? 1 : 0.04, anchor: .trailing) + } + } + } + .padding(.vertical, 10) + .padding(.leading, 40) + } + .onReceive(tool.scrollPublisher) { id in + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + withAnimation { + proxy.scrollTo(id) + } + } + } + } + .frame(maxHeight:( (height * factor + 10) * 6) + 20) + .fixedSize() + .background(alignment: .trailing) { + RoundedRectangle(cornerRadius: 20) + .fill(.regularMaterial) + .frame(width: width * factor - 18) + } + .clipShape(.rect(cornerRadii: .init(bottomTrailing: 20, topTrailing: 20))) + .overlay(alignment: .bottomLeading) { + newPenButton + .offset(x: 60, y: 10) + } + } + func penView(_ pen: Pen) -> some View { ZStack { + penShadow(pen) if let tip = pen.style.icon.tip { Image(tip) .resizable() @@ -161,6 +137,38 @@ struct PenDockView: View { .offset(x: tool.selectedPen === pen ? 0 : 25) } + func penColorButton(_ pen: Pen) -> some View { + Button { + tool.opensColorPicker = true + } label: { + let hsba = pen.color.hsba + Color(hue: hsba.hue, saturation: hsba.saturation, brightness: hsba.brightness) + .overlay { + Image("transparent-grid-square") + .resizable() + .scaleEffect(1.8) + .aspectRatio(contentMode: .fill) + .clipShape(Triangle()) + pen.color + .clipShape(Triangle()) + } + .background(.white) + .clipShape(Capsule()) + .frame(height: 20) + .overlay { + Capsule() + .stroke(Color.gray, lineWidth: 0.4) + } + .padding(0.2) + .drawingGroup() + } + .hoverEffect(.lift) + .popover(isPresented: $tool.opensColorPicker) { + ColorPicker(pen: pen) + .presentationCompactAdaptation(.popover) + } + } + var newPenButton: some View { Button { let pen = PenObject.createObject(\.viewContext, penStyle: .marker) @@ -199,4 +207,29 @@ struct PenDockView: View { .padding(.vertical, 5) .padding(.leading, 10) } + + func penShadow(_ pen: Pen) -> some View { + ZStack { + Group { + if let tip = pen.style.icon.tip { + Image(tip) + .resizable() + .renderingMode(.template) + } + Image(pen.style.icon.base) + .resizable() + .renderingMode(.template) + } + .drawingGroup() + .foregroundStyle(.black.opacity(0.2)) + .blur(radius: 3) + if let tip = pen.style.icon.tip { + Image(tip) + .resizable() + .renderingMode(.template) + .foregroundStyle(Color(red: pen.rgba[0], green: pen.rgba[1], blue: pen.rgba[2])) + .blur(radius: 0.5) + } + } + } } From af7343c05c90f09653c1457a85932b6b7a05da9e Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sun, 19 May 2024 10:55:31 +0700 Subject: [PATCH 12/17] feat: add thickness picker --- Memola/Canvas/Tool/Pen/Core/PenStyle.swift | 3 +- .../Tool/Pen/PenStyles/EraserPenStyle.swift | 4 +- .../Tool/Pen/PenStyles/MarkerPenStyle.swift | 4 +- .../Memo/ColorPicker/ColorPicker.swift | 1 + .../Features/Memo/PenDock/PenDockView.swift | 44 ++++++++++++++++--- Memola/Persistence/Objects/PenObject.swift | 2 +- 6 files changed, 47 insertions(+), 11 deletions(-) diff --git a/Memola/Canvas/Tool/Pen/Core/PenStyle.swift b/Memola/Canvas/Tool/Pen/Core/PenStyle.swift index a2a63ea..85b1a05 100644 --- a/Memola/Canvas/Tool/Pen/Core/PenStyle.swift +++ b/Memola/Canvas/Tool/Pen/Core/PenStyle.swift @@ -11,7 +11,8 @@ import Foundation protocol PenStyle { var icon: (base: String, tip: String?) { get } var textureName: String { get } - var thinkness: (min: CGFloat, max: CGFloat) { get } + var thickness: (min: CGFloat, max: CGFloat) { get } + var thicknessSteps: [CGFloat] { get } var color: [CGFloat] { get } var stepRate: CGFloat { get } var generator: any StrokeGenerator { get } diff --git a/Memola/Canvas/Tool/Pen/PenStyles/EraserPenStyle.swift b/Memola/Canvas/Tool/Pen/PenStyles/EraserPenStyle.swift index a18d8df..8e08423 100644 --- a/Memola/Canvas/Tool/Pen/PenStyles/EraserPenStyle.swift +++ b/Memola/Canvas/Tool/Pen/PenStyles/EraserPenStyle.swift @@ -12,7 +12,9 @@ struct EraserPenStyle: PenStyle { var textureName: String = "point-texture" - var thinkness: (min: CGFloat, max: CGFloat) = (0.5, 120) + var thickness: (min: CGFloat, max: CGFloat) = (0.5, 120) + + var thicknessSteps: [CGFloat] = [0.5, 1, 2, 5, 10, 20, 50, 75, 100, 120] var color: [CGFloat] = [1, 1, 1, 0] diff --git a/Memola/Canvas/Tool/Pen/PenStyles/MarkerPenStyle.swift b/Memola/Canvas/Tool/Pen/PenStyles/MarkerPenStyle.swift index ed82047..16f3924 100644 --- a/Memola/Canvas/Tool/Pen/PenStyles/MarkerPenStyle.swift +++ b/Memola/Canvas/Tool/Pen/PenStyles/MarkerPenStyle.swift @@ -12,7 +12,9 @@ struct MarkerPenStyle: PenStyle { var textureName: String = "point-texture" - var thinkness: (min: CGFloat, max: CGFloat) = (0.5, 120) + var thickness: (min: CGFloat, max: CGFloat) = (0.5, 125) + + var thicknessSteps: [CGFloat] = [0.5, 1, 2, 5, 10, 20, 50, 75, 100, 120] var color: [CGFloat] = [1, 0.38, 0.38, 1] diff --git a/Memola/Features/Memo/ColorPicker/ColorPicker.swift b/Memola/Features/Memo/ColorPicker/ColorPicker.swift index a3a197a..ff8604b 100644 --- a/Memola/Features/Memo/ColorPicker/ColorPicker.swift +++ b/Memola/Features/Memo/ColorPicker/ColorPicker.swift @@ -35,6 +35,7 @@ struct ColorPicker: View { } .frame(width: size * 2 + 10) .cornerRadius(5) + .drawingGroup() .overlay { RoundedRectangle(cornerRadius: 5) .stroke(Color.gray, lineWidth: 0.2) diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index b1caf1f..801f3ec 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -17,12 +17,11 @@ struct PenDockView: View { var body: some View { VStack(alignment: .trailing) { if let pen = tool.selectedPen { - VStack(spacing: 10) { - penColorButton(pen) - Capsule() - .frame(height: 20) + VStack(spacing: 15) { + penColorView(pen) + penThicknessView(pen) } - .padding() + .padding(10) .frame(width: width * factor - 18) .background { RoundedRectangle(cornerRadius: 20) @@ -137,7 +136,7 @@ struct PenDockView: View { .offset(x: tool.selectedPen === pen ? 0 : 25) } - func penColorButton(_ pen: Pen) -> some View { + func penColorView(_ pen: Pen) -> some View { Button { tool.opensColorPicker = true } label: { @@ -154,7 +153,7 @@ struct PenDockView: View { } .background(.white) .clipShape(Capsule()) - .frame(height: 20) + .frame(height: 25) .overlay { Capsule() .stroke(Color.gray, lineWidth: 0.4) @@ -169,6 +168,37 @@ struct PenDockView: View { } } + @ViewBuilder + func penThicknessView(_ pen: Pen) -> some View { + let minimum: CGFloat = pen.style.thickness.min + let maximum: CGFloat = pen.style.thickness.max + let start: CGFloat = 5 + let end: CGFloat = 15 + let selection = Binding( + get: { pen.thickness }, + set: { + pen.thickness = $0 + tool.objectWillChange.send() + } + ) + Picker("", selection: selection) { + ForEach(pen.style.thicknessSteps, id: \.self) { step in + let size = ((step - minimum) * (end - start) / (maximum - minimum)) + start - (1 / step) + if pen.thickness == step { + Circle() + .fill(.black) + .frame(width: size, height: size) + } else { + Circle() + .stroke(Color.black, lineWidth: 1) + .frame(width: size, height: size) + } + } + } + .pickerStyle(.wheel) + .frame(width: width * factor - 18, height: 40) + } + var newPenButton: some View { Button { let pen = PenObject.createObject(\.viewContext, penStyle: .marker) diff --git a/Memola/Persistence/Objects/PenObject.swift b/Memola/Persistence/Objects/PenObject.swift index 52380ec..054edf4 100644 --- a/Memola/Persistence/Objects/PenObject.swift +++ b/Memola/Persistence/Objects/PenObject.swift @@ -24,7 +24,7 @@ extension PenObject { object.color = penStyle.color object.style = penStyle.strokeStyle.rawValue object.isSelected = false - object.thickness = penStyle.thinkness.min + object.thickness = penStyle.thickness.min return object } } From 42b1d4d588cf324348da6d66b143ea8628b926af Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sun, 19 May 2024 12:13:35 +0700 Subject: [PATCH 13/17] feat: update color picker --- .../Memo/ColorPicker/ColorPicker.swift | 51 +++++++------------ .../Features/Memo/PenDock/PenDockView.swift | 37 ++++++++------ 2 files changed, 39 insertions(+), 49 deletions(-) diff --git a/Memola/Features/Memo/ColorPicker/ColorPicker.swift b/Memola/Features/Memo/ColorPicker/ColorPicker.swift index ff8604b..fede27b 100644 --- a/Memola/Features/Memo/ColorPicker/ColorPicker.swift +++ b/Memola/Features/Memo/ColorPicker/ColorPicker.swift @@ -10,40 +10,22 @@ import Foundation struct ColorPicker: View { @ObservedObject var pen: Pen + @EnvironmentObject var tool: Tool @State var hue: Double = 1 @State var saturation: Double = 0 @State var brightness: Double = 1 @State var alpha: Double = 1 - let size: CGFloat = 18 + let size: CGFloat = 20 var body: some View { VStack(spacing: 10) { colorPicker - .frame(width: 180, height: 180) + .frame(width: 200, height: 200) HStack(spacing: 10) { - Color(hue: hue, saturation: saturation, brightness: brightness) - .overlay { - Image("transparent-grid-square") - .resizable() - .scaleEffect(1.8) - .aspectRatio(contentMode: .fill) - .clipShape(Triangle()) - pen.color - .clipShape(Triangle()) - } - .frame(width: size * 2 + 10) - .cornerRadius(5) - .drawingGroup() - .overlay { - RoundedRectangle(cornerRadius: 5) - .stroke(Color.gray, lineWidth: 0.2) - } - VStack(spacing: 15) { - hueSlider - alphaSlider - } + hueSlider + alphaSlider } } .padding(10) @@ -135,11 +117,6 @@ struct ColorPicker: View { .offset(x: max(size, proxy.size.width * hue - 2)) } .frame(width: proxy.size.width, height: proxy.size.height) - .clipShape(Capsule()) - .overlay { - Capsule() - .stroke(Color.gray, lineWidth: 0.2) - } .gesture( DragGesture(minimumDistance: 0) .onChanged { value in @@ -151,6 +128,12 @@ struct ColorPicker: View { updateBaseColor() } ) + .clipShape(Capsule()) + .overlay { + Capsule() + .stroke(Color.gray, lineWidth: 0.2) + } + .frame(height: proxy.size.height) } .frame(height: size) } @@ -187,11 +170,6 @@ struct ColorPicker: View { .offset(x: max(size, proxy.size.width * alpha - 2)) } .frame(width: proxy.size.width, height: proxy.size.height) - .clipShape(Capsule()) - .overlay { - Capsule() - .stroke(Color.gray, lineWidth: 0.2) - } .gesture( DragGesture(minimumDistance: 0) .onChanged { value in @@ -203,11 +181,18 @@ struct ColorPicker: View { updateBaseColor() } ) + .clipShape(Capsule()) + .overlay { + Capsule() + .stroke(Color.gray, lineWidth: 0.2) + } + .frame(height: proxy.size.height) } .frame(height: size) } func updateBaseColor() { pen.color = Color(hue: hue, saturation: saturation, brightness: brightness).opacity(0.7 * alpha + 0.3) + tool.objectWillChange.send() } } diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index 801f3ec..2db5934 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -17,7 +17,7 @@ struct PenDockView: View { var body: some View { VStack(alignment: .trailing) { if let pen = tool.selectedPen { - VStack(spacing: 15) { + VStack(spacing: 5) { penColorView(pen) penThicknessView(pen) } @@ -141,25 +141,30 @@ struct PenDockView: View { tool.opensColorPicker = true } label: { let hsba = pen.color.hsba - Color(hue: hsba.hue, saturation: hsba.saturation, brightness: hsba.brightness) - .overlay { + let baseColor = Color(hue: hsba.hue, saturation: hsba.saturation, brightness: hsba.brightness) + GeometryReader { proxy in + HStack(spacing: 0) { + baseColor + .frame(width: proxy.size.width / 2) Image("transparent-grid-square") .resizable() - .scaleEffect(1.8) + .scaleEffect(3) .aspectRatio(contentMode: .fill) - .clipShape(Triangle()) - pen.color - .clipShape(Triangle()) + .opacity(1 - hsba.alpha) + .frame(width: proxy.size.width / 2) + .clipped() } - .background(.white) - .clipShape(Capsule()) - .frame(height: 25) - .overlay { - Capsule() - .stroke(Color.gray, lineWidth: 0.4) - } - .padding(0.2) - .drawingGroup() + } + .background(baseColor) + .clipShape(RoundedRectangle(cornerRadius: 10)) + .frame(height: 28) + .overlay { + RoundedRectangle(cornerRadius: 10) + .stroke(Color.gray, lineWidth: 0.4) + } + .padding(0.2) + .padding(.top, 4) + .drawingGroup() } .hoverEffect(.lift) .popover(isPresented: $tool.opensColorPicker) { From ec64fabf1455751265bf35703e1026a9f5613937 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sun, 19 May 2024 12:32:34 +0700 Subject: [PATCH 14/17] feat: fix preview offset mismatch in pen drag and drop --- Memola.xcodeproj/project.pbxproj | 12 ----------- Memola/Canvas/Tool/Core/Tool.swift | 1 - Memola/Components/Shapes/Triangle.swift | 20 ------------------- .../Features/Memo/PenDock/PenDockView.swift | 18 ++++++++++------- .../Memo/PenDock/PenDropDelegate.swift | 2 ++ 5 files changed, 13 insertions(+), 40 deletions(-) delete mode 100644 Memola/Components/Shapes/Triangle.swift diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index 5e08e45..f5e3c10 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -82,7 +82,6 @@ ECFA15262BEF224900455818 /* StrokeObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFA15252BEF224900455818 /* StrokeObject.swift */; }; ECFA15282BEF225000455818 /* QuadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFA15272BEF225000455818 /* QuadObject.swift */; }; ECFC51272BF8885700D0D051 /* ColorPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFC51262BF8885700D0D051 /* ColorPicker.swift */; }; - ECFC512A2BF8BBD800D0D051 /* Triangle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFC51292BF8BBD800D0D051 /* Triangle.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -163,7 +162,6 @@ ECFA15252BEF224900455818 /* StrokeObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StrokeObject.swift; sourceTree = ""; }; ECFA15272BEF225000455818 /* QuadObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuadObject.swift; sourceTree = ""; }; ECFC51262BF8885700D0D051 /* ColorPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPicker.swift; sourceTree = ""; }; - ECFC51292BF8BBD800D0D051 /* Triangle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Triangle.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -229,7 +227,6 @@ EC50500A2BF6672000B4D86E /* Components */ = { isa = PBXGroup; children = ( - ECFC51282BF8BBD000D0D051 /* Shapes */, EC50500B2BF6673300B4D86E /* ViewModifiers */, ); path = Components; @@ -613,14 +610,6 @@ path = ColorPicker; sourceTree = ""; }; - ECFC51282BF8BBD000D0D051 /* Shapes */ = { - isa = PBXGroup; - children = ( - ECFC51292BF8BBD800D0D051 /* Triangle.swift */, - ); - path = Shapes; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -694,7 +683,6 @@ ECA738B02BE60D0B00A4542E /* CanvasViewController.swift in Sources */, ECA738E42BE6110800A4542E /* Drawable.swift in Sources */, ECA738AD2BE60CC600A4542E /* DrawingView.swift in Sources */, - ECFC512A2BF8BBD800D0D051 /* Triangle.swift in Sources */, ECA738E02BE610B900A4542E /* EraserRenderPass.swift in Sources */, EC35655A2BF060D900A4E0BF /* Quad.metal in Sources */, ECA738912BE600F500A4542E /* Cache.metal in Sources */, diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 1e0377d..1988068 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -16,7 +16,6 @@ public class Tool: NSObject, ObservableObject { @Published var pens: [Pen] = [] @Published var selectedPen: Pen? @Published var draggedPen: Pen? - @Published var opensColorPicker: Bool = false let scrollPublisher = PassthroughSubject() diff --git a/Memola/Components/Shapes/Triangle.swift b/Memola/Components/Shapes/Triangle.swift deleted file mode 100644 index d9ce850..0000000 --- a/Memola/Components/Shapes/Triangle.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// Triangle.swift -// Memola -// -// Created by Dscyre Scotti on 5/18/24. -// - -import SwiftUI -import Foundation - -struct Triangle: Shape { - func path(in rect: CGRect) -> Path { - var path = Path() - path.move(to: CGPoint(x: rect.maxX, y: rect.minY)) - path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY)) - path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY)) - path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY)) - return path - } -} diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index 2db5934..86c2209 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -14,6 +14,9 @@ struct PenDockView: View { let height: CGFloat = 30 let factor: CGFloat = 0.95 + @State var refreshScrollId: UUID = UUID() + @State var opensColorPicker: Bool = false + var body: some View { VStack(alignment: .trailing) { if let pen = tool.selectedPen { @@ -52,6 +55,7 @@ struct PenDockView: View { } .padding(.vertical, 10) .padding(.leading, 40) + .id(refreshScrollId) } .onReceive(tool.scrollPublisher) { id in DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { @@ -77,7 +81,7 @@ struct PenDockView: View { func penView(_ pen: Pen) -> some View { ZStack { - penShadow(pen) + penShadowView(pen) if let tip = pen.style.icon.tip { Image(tip) .resizable() @@ -129,16 +133,16 @@ struct PenDockView: View { tool.draggedPen = pen return NSItemProvider(contentsOf: URL(string: pen.id)) ?? NSItemProvider() } preview: { - penPreview(pen) + penPreviewView(pen) .contentShape(.dragPreview, .rect(cornerRadius: 10)) } - .onDrop(of: [.item], delegate: PenDropDelegate(id: pen.id, tool: tool)) + .onDrop(of: [.item], delegate: PenDropDelegate(id: pen.id, tool: tool, action: { refreshScrollId = UUID() })) .offset(x: tool.selectedPen === pen ? 0 : 25) } func penColorView(_ pen: Pen) -> some View { Button { - tool.opensColorPicker = true + opensColorPicker = true } label: { let hsba = pen.color.hsba let baseColor = Color(hue: hsba.hue, saturation: hsba.saturation, brightness: hsba.brightness) @@ -167,7 +171,7 @@ struct PenDockView: View { .drawingGroup() } .hoverEffect(.lift) - .popover(isPresented: $tool.opensColorPicker) { + .popover(isPresented: $opensColorPicker) { ColorPicker(pen: pen) .presentationCompactAdaptation(.popover) } @@ -227,7 +231,7 @@ struct PenDockView: View { .hoverEffect(.lift) } - func penPreview(_ pen: Pen) -> some View { + func penPreviewView(_ pen: Pen) -> some View { ZStack { if let tip = pen.style.icon.tip { Image(tip) @@ -243,7 +247,7 @@ struct PenDockView: View { .padding(.leading, 10) } - func penShadow(_ pen: Pen) -> some View { + func penShadowView(_ pen: Pen) -> some View { ZStack { Group { if let tip = pen.style.icon.tip { diff --git a/Memola/Features/Memo/PenDock/PenDropDelegate.swift b/Memola/Features/Memo/PenDock/PenDropDelegate.swift index d784d1d..7d91630 100644 --- a/Memola/Features/Memo/PenDock/PenDropDelegate.swift +++ b/Memola/Features/Memo/PenDock/PenDropDelegate.swift @@ -11,9 +11,11 @@ import Foundation struct PenDropDelegate: DropDelegate { let id: String @ObservedObject var tool: Tool + let action: () -> Void func performDrop(info: DropInfo) -> Bool { tool.draggedPen = nil + action() return true } From cfa9f1485676d13912865c959040954d3e4f901e Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sun, 19 May 2024 13:05:47 +0700 Subject: [PATCH 15/17] feat: move color picker to components --- Memola.xcodeproj/project.pbxproj | 10 ++++++++- .../Tool/Pen/PenStyles/EraserPenStyle.swift | 4 ++-- .../Tool/Pen/PenStyles/MarkerPenStyle.swift | 4 ++-- .../Views}/ColorPicker/ColorPicker.swift | 22 +++++++++---------- .../Features/Memo/PenDock/PenDockView.swift | 13 +++++++++-- 5 files changed, 34 insertions(+), 19 deletions(-) rename Memola/{Features/Memo => Components/Views}/ColorPicker/ColorPicker.swift (92%) diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index f5e3c10..6f98d97 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -191,6 +191,14 @@ path = ViewController; sourceTree = ""; }; + EC1B783A2BF9C68C005A34E2 /* Views */ = { + isa = PBXGroup; + children = ( + ECFC51252BF8885000D0D051 /* ColorPicker */, + ); + path = Views; + sourceTree = ""; + }; EC5050042BF65CBC00B4D86E /* Core */ = { isa = PBXGroup; children = ( @@ -227,6 +235,7 @@ EC50500A2BF6672000B4D86E /* Components */ = { isa = PBXGroup; children = ( + EC1B783A2BF9C68C005A34E2 /* Views */, EC50500B2BF6673300B4D86E /* ViewModifiers */, ); path = Components; @@ -317,7 +326,6 @@ ECA7387B2BE5EF3500A4542E /* Memo */ = { isa = PBXGroup; children = ( - ECFC51252BF8885000D0D051 /* ColorPicker */, EC5050082BF65D0500B4D86E /* Memo */, EC5050052BF65CCD00B4D86E /* PenDock */, ); diff --git a/Memola/Canvas/Tool/Pen/PenStyles/EraserPenStyle.swift b/Memola/Canvas/Tool/Pen/PenStyles/EraserPenStyle.swift index 8e08423..930b1c7 100644 --- a/Memola/Canvas/Tool/Pen/PenStyles/EraserPenStyle.swift +++ b/Memola/Canvas/Tool/Pen/PenStyles/EraserPenStyle.swift @@ -12,9 +12,9 @@ struct EraserPenStyle: PenStyle { var textureName: String = "point-texture" - var thickness: (min: CGFloat, max: CGFloat) = (0.5, 120) + var thickness: (min: CGFloat, max: CGFloat) = (0.5, 40) - var thicknessSteps: [CGFloat] = [0.5, 1, 2, 5, 10, 20, 50, 75, 100, 120] + var thicknessSteps: [CGFloat] = [0.5, 1, 2, 5, 7.5, 10, 15, 20, 25, 30, 35, 40] var color: [CGFloat] = [1, 1, 1, 0] diff --git a/Memola/Canvas/Tool/Pen/PenStyles/MarkerPenStyle.swift b/Memola/Canvas/Tool/Pen/PenStyles/MarkerPenStyle.swift index 16f3924..9c25a7b 100644 --- a/Memola/Canvas/Tool/Pen/PenStyles/MarkerPenStyle.swift +++ b/Memola/Canvas/Tool/Pen/PenStyles/MarkerPenStyle.swift @@ -12,9 +12,9 @@ struct MarkerPenStyle: PenStyle { var textureName: String = "point-texture" - var thickness: (min: CGFloat, max: CGFloat) = (0.5, 125) + var thickness: (min: CGFloat, max: CGFloat) = (0.5, 40) - var thicknessSteps: [CGFloat] = [0.5, 1, 2, 5, 10, 20, 50, 75, 100, 120] + var thicknessSteps: [CGFloat] = [0.5, 1, 2, 5, 7.5, 10, 15, 20, 25, 30, 35, 40] var color: [CGFloat] = [1, 0.38, 0.38, 1] diff --git a/Memola/Features/Memo/ColorPicker/ColorPicker.swift b/Memola/Components/Views/ColorPicker/ColorPicker.swift similarity index 92% rename from Memola/Features/Memo/ColorPicker/ColorPicker.swift rename to Memola/Components/Views/ColorPicker/ColorPicker.swift index fede27b..fe29a9e 100644 --- a/Memola/Features/Memo/ColorPicker/ColorPicker.swift +++ b/Memola/Components/Views/ColorPicker/ColorPicker.swift @@ -9,14 +9,13 @@ import SwiftUI import Foundation struct ColorPicker: View { - @ObservedObject var pen: Pen - @EnvironmentObject var tool: Tool - @State var hue: Double = 1 @State var saturation: Double = 0 @State var brightness: Double = 1 @State var alpha: Double = 1 + @Binding var color: Color + let size: CGFloat = 20 var body: some View { @@ -35,7 +34,7 @@ struct ColorPicker: View { .ignoresSafeArea(.all) } .onAppear { - let hsba = pen.color.hsba + let hsba = color.hsba hue = hsba.hue saturation = hsba.saturation brightness = hsba.brightness @@ -86,7 +85,7 @@ struct ColorPicker: View { .onChanged { value in saturation = min(1, max(value.location.x / proxy.size.width, 0)) brightness = 1 - min(1, max(value.location.y / proxy.size.height, 0)) - updateBaseColor() + updateColor() } ) } @@ -121,11 +120,11 @@ struct ColorPicker: View { DragGesture(minimumDistance: 0) .onChanged { value in hue = min(1, max(value.location.x / proxy.size.width, 0)) - updateBaseColor() + updateColor() } .onEnded { value in hue = min(1, max(value.location.x / proxy.size.width, 0)) - updateBaseColor() + updateColor() } ) .clipShape(Capsule()) @@ -174,11 +173,11 @@ struct ColorPicker: View { DragGesture(minimumDistance: 0) .onChanged { value in alpha = min(1, max(value.location.x / proxy.size.width, 0)) - updateBaseColor() + updateColor() } .onEnded { value in alpha = min(1, max(value.location.x / proxy.size.width, 0)) - updateBaseColor() + updateColor() } ) .clipShape(Capsule()) @@ -191,8 +190,7 @@ struct ColorPicker: View { .frame(height: size) } - func updateBaseColor() { - pen.color = Color(hue: hue, saturation: saturation, brightness: brightness).opacity(0.7 * alpha + 0.3) - tool.objectWillChange.send() + func updateColor() { + color = Color(hue: hue, saturation: saturation, brightness: brightness).opacity(0.7 * alpha + 0.3) } } diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index 86c2209..cfa81de 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -172,7 +172,14 @@ struct PenDockView: View { } .hoverEffect(.lift) .popover(isPresented: $opensColorPicker) { - ColorPicker(pen: pen) + let color = Binding( + get: { pen.color }, + set: { + pen.color = $0 + tool.objectWillChange.send() + } + ) + ColorPicker(color: color) .presentationCompactAdaptation(.popover) } } @@ -211,7 +218,9 @@ struct PenDockView: View { var newPenButton: some View { Button { let pen = PenObject.createObject(\.viewContext, penStyle: .marker) - pen.color = [Color.red, Color.blue, Color.green, Color.black, Color.orange].randomElement()!.components + if let color = (tool.selectedPen ?? tool.pens.last)?.rgba { + pen.color = color + } pen.isSelected = true pen.tool = tool.object pen.orderIndex = Int16(tool.pens.count) From 78ac70e4cbc5378447fddbcf7ecdbfa5248627f9 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sun, 19 May 2024 13:49:09 +0700 Subject: [PATCH 16/17] feat: add context menu preview --- Memola/Canvas/Tool/Core/Tool.swift | 11 ++++++++--- .../ViewModifiers/ContextMenuViewModifier.swift | 9 +++++---- Memola/Features/Memo/PenDock/PenDockView.swift | 13 +++++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 1988068..5d05c80 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -18,6 +18,9 @@ public class Tool: NSObject, ObservableObject { @Published var draggedPen: Pen? let scrollPublisher = PassthroughSubject() + var markers: [Pen] { + pens.filter { $0.strokeStyle == .marker } + } init(object: ToolObject) { self.object = object @@ -93,12 +96,14 @@ public class Tool: NSObject, ObservableObject { let deletedPen = withAnimation { pens.remove(at: index) } + unselectPen(deletedPen) if let _pen = deletedPen.object { _pen.tool = nil object.pens.remove(_pen) - } - withPersistence(\.viewContext) { context in - try context.saveIfNeeded() + withPersistence(\.viewContext) { context in + context.delete(_pen) + try context.saveIfNeeded() + } } } } diff --git a/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift b/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift index 9c7a335..ee1a3f2 100644 --- a/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift +++ b/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift @@ -8,14 +8,15 @@ import SwiftUI import Foundation -struct ContextMenuViewModifier: ViewModifier { +struct ContextMenuViewModifier: ViewModifier { let condition: Bool let menuItems: () -> MenuContent + let preview: () -> Preview @ViewBuilder func body(content: Content) -> some View { if condition { - content.contextMenu(menuItems: menuItems) + content.contextMenu(menuItems: menuItems, preview: preview) } else { content } @@ -23,7 +24,7 @@ struct ContextMenuViewModifier: ViewModifier { } public extension View { - func contextMenu(if condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent) -> some View { - modifier(ContextMenuViewModifier(condition: condition, menuItems: menuItems)) + func contextMenu(if condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent, @ViewBuilder preview: @escaping () -> Preview) -> some View { + modifier(ContextMenuViewModifier(condition: condition, menuItems: menuItems, preview: preview)) } } diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index cfa81de..4d4cbf3 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -104,6 +104,14 @@ struct PenDockView: View { .padding(.leading, 10) .contextMenu(if: pen.strokeStyle != .eraser) { ControlGroup { + Button { + tool.selectPen(pen) + } label: { + Label( + title: { Text("Select") }, + icon: { Image(systemName: "pencil.tip.crop.circle") } + ) + } Button { let originalPen = pen let pen = PenObject.createObject(\.viewContext, penStyle: originalPen.style) @@ -126,8 +134,13 @@ struct PenDockView: View { icon: { Image(systemName: "trash") } ) } + .disabled(tool.markers.count <= 1) } .controlGroupStyle(.menu) + } preview: { + penPreviewView(pen) + .drawingGroup() + .contentShape(.contextMenuPreview, .rect(cornerRadius: 10)) } .onDrag(if: pen.strokeStyle != .eraser) { tool.draggedPen = pen From 3fd91a1e575f30f69aa2af5af0bab2e11968818d Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sun, 19 May 2024 14:22:44 +0700 Subject: [PATCH 17/17] feat: copy thickness --- Memola/Features/Memo/PenDock/PenDockView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index 4d4cbf3..eeace76 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -116,6 +116,7 @@ struct PenDockView: View { let originalPen = pen let pen = PenObject.createObject(\.viewContext, penStyle: originalPen.style) pen.color = originalPen.rgba + pen.thickness = originalPen.thickness pen.isSelected = true pen.tool = tool.object let _pen = Pen(object: pen)