├── .gitattributes ├── .gitignore ├── LICENSE ├── Package.swift ├── README.md ├── Sources ├── .swiftlint.yml ├── Abra │ ├── .swiftlint.yml │ ├── Abra.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Abra iOS (debug.optimized).xcscheme │ │ │ ├── Abra iOS.xcscheme │ │ │ ├── Abra macOS (debug.optimized).xcscheme │ │ │ └── Abra macOS.xcscheme │ ├── Abra │ │ ├── Shared │ │ │ ├── AbraApp.swift │ │ │ ├── AbraCaptureMediaProvider.swift │ │ │ ├── AbraClientPeer.swift │ │ │ ├── AbraLogDevice.swift │ │ │ ├── AbraServerPeer.swift │ │ │ ├── ActionButton.swift │ │ │ ├── Assets.xcassets │ │ │ │ ├── AppIcon.appiconset │ │ │ │ │ ├── AppIcon-1024.png │ │ │ │ │ ├── AppIcon-1025.png │ │ │ │ │ ├── AppIcon-120.png │ │ │ │ │ ├── AppIcon-121.png │ │ │ │ │ ├── AppIcon-128.png │ │ │ │ │ ├── AppIcon-152.png │ │ │ │ │ ├── AppIcon-16.png │ │ │ │ │ ├── AppIcon-167.png │ │ │ │ │ ├── AppIcon-180.png │ │ │ │ │ ├── AppIcon-20.png │ │ │ │ │ ├── AppIcon-256.png │ │ │ │ │ ├── AppIcon-257.png │ │ │ │ │ ├── AppIcon-29.png │ │ │ │ │ ├── AppIcon-32.png │ │ │ │ │ ├── AppIcon-33.png │ │ │ │ │ ├── AppIcon-40.png │ │ │ │ │ ├── AppIcon-41.png │ │ │ │ │ ├── AppIcon-42.png │ │ │ │ │ ├── AppIcon-512.png │ │ │ │ │ ├── AppIcon-513.png │ │ │ │ │ ├── AppIcon-58.png │ │ │ │ │ ├── AppIcon-59.png │ │ │ │ │ ├── AppIcon-60.png │ │ │ │ │ ├── AppIcon-64.png │ │ │ │ │ ├── AppIcon-80.png │ │ │ │ │ ├── AppIcon-81.png │ │ │ │ │ ├── AppIcon-87.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ └── Launch.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Launch.png │ │ │ ├── BouncingTapGesture.swift │ │ │ ├── CameraListView.swift │ │ │ ├── Card.swift │ │ │ ├── Card.xcassets │ │ │ │ ├── AccentColor.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── black10.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black10.png │ │ │ │ │ ├── black10@2x.png │ │ │ │ │ └── black10@3x.png │ │ │ │ ├── black2.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black2.png │ │ │ │ │ ├── black2@2x.png │ │ │ │ │ └── black2@3x.png │ │ │ │ ├── black3.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black3.png │ │ │ │ │ ├── black3@2x.png │ │ │ │ │ └── black3@3x.png │ │ │ │ ├── black4.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black4.png │ │ │ │ │ ├── black4@2x.png │ │ │ │ │ └── black4@3x.png │ │ │ │ ├── black5.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black5.png │ │ │ │ │ ├── black5@2x.png │ │ │ │ │ └── black5@3x.png │ │ │ │ ├── black6.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black6.png │ │ │ │ │ ├── black6@2x.png │ │ │ │ │ └── black6@3x.png │ │ │ │ ├── black7.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black7.png │ │ │ │ │ ├── black7@2x.png │ │ │ │ │ └── black7@3x.png │ │ │ │ ├── black8.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black8.png │ │ │ │ │ ├── black8@2x.png │ │ │ │ │ └── black8@3x.png │ │ │ │ ├── black9.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── black9.png │ │ │ │ │ ├── black9@2x.png │ │ │ │ │ └── black9@3x.png │ │ │ │ ├── blackace.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── blackace.png │ │ │ │ │ ├── blackace@2x.png │ │ │ │ │ └── blackace@3x.png │ │ │ │ ├── blackjack.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── blackjack.png │ │ │ │ │ ├── blackjack@2x.png │ │ │ │ │ └── blackjack@3x.png │ │ │ │ ├── blackking.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── blackking.png │ │ │ │ │ ├── blackking@2x.png │ │ │ │ │ └── blackking@3x.png │ │ │ │ ├── blackqueen.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── blackqueen.png │ │ │ │ │ ├── blackqueen@2x.png │ │ │ │ │ └── blackqueen@3x.png │ │ │ │ ├── cardad1.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── cardad1.png │ │ │ │ │ ├── cardad1@2x.png │ │ │ │ │ └── cardad1@3x.png │ │ │ │ ├── cardad2.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── cardad2.png │ │ │ │ │ ├── cardad2@2x.png │ │ │ │ │ └── cardad2@3x.png │ │ │ │ ├── cardjokerbw.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── cardjokerbw.png │ │ │ │ │ ├── cardjokerbw@2x.png │ │ │ │ │ └── cardjokerbw@3x.png │ │ │ │ ├── cardjokercolor.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── cardjokercolor.png │ │ │ │ │ ├── cardjokercolor@2x.png │ │ │ │ │ └── cardjokercolor@3x.png │ │ │ │ ├── club.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── club.png │ │ │ │ │ ├── club@2x.png │ │ │ │ │ └── club@3x.png │ │ │ │ ├── diamond.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── diamond.png │ │ │ │ │ ├── diamond@2x.png │ │ │ │ │ └── diamond@3x.png │ │ │ │ ├── facejackclub.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facejackclub.png │ │ │ │ │ ├── facejackclub@2x.png │ │ │ │ │ └── facejackclub@3x.png │ │ │ │ ├── facejackdiamond.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facejackdiamond.png │ │ │ │ │ ├── facejackdiamond@2x.png │ │ │ │ │ └── facejackdiamond@3x.png │ │ │ │ ├── facejackheart.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facejackheart.png │ │ │ │ │ ├── facejackheart@2x.png │ │ │ │ │ └── facejackheart@3x.png │ │ │ │ ├── facejackspade.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facejackspade.png │ │ │ │ │ ├── facejackspade@2x.png │ │ │ │ │ └── facejackspade@3x.png │ │ │ │ ├── facekingclub.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facekingclub.png │ │ │ │ │ ├── facekingclub@2x.png │ │ │ │ │ └── facekingclub@3x.png │ │ │ │ ├── facekingdiamond.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facekingdiamond.png │ │ │ │ │ ├── facekingdiamond@2x.png │ │ │ │ │ └── facekingdiamond@3x.png │ │ │ │ ├── facekingheart.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facekingheart.png │ │ │ │ │ ├── facekingheart@2x.png │ │ │ │ │ └── facekingheart@3x.png │ │ │ │ ├── facekingspade.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facekingspade.png │ │ │ │ │ ├── facekingspade@2x.png │ │ │ │ │ └── facekingspade@3x.png │ │ │ │ ├── facequeenclub.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facequeenclub.png │ │ │ │ │ ├── facequeenclub@2x.png │ │ │ │ │ └── facequeenclub@3x.png │ │ │ │ ├── facequeendiamond.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facequeendiamond.png │ │ │ │ │ ├── facequeendiamond@2x.png │ │ │ │ │ └── facequeendiamond@3x.png │ │ │ │ ├── facequeenheart.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facequeenheart.png │ │ │ │ │ ├── facequeenheart@2x.png │ │ │ │ │ └── facequeenheart@3x.png │ │ │ │ ├── facequeenspade.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── facequeenspade.png │ │ │ │ │ ├── facequeenspade@2x.png │ │ │ │ │ └── facequeenspade@3x.png │ │ │ │ ├── heart.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── heart.png │ │ │ │ │ ├── heart@2x.png │ │ │ │ │ └── heart@3x.png │ │ │ │ ├── red10.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red10.png │ │ │ │ │ ├── red10@2x.png │ │ │ │ │ └── red10@3x.png │ │ │ │ ├── red2.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red2.png │ │ │ │ │ ├── red2@2x.png │ │ │ │ │ └── red2@3x.png │ │ │ │ ├── red3.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red3.png │ │ │ │ │ ├── red3@2x.png │ │ │ │ │ └── red3@3x.png │ │ │ │ ├── red4.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red4.png │ │ │ │ │ ├── red4@2x.png │ │ │ │ │ └── red4@3x.png │ │ │ │ ├── red5.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red5.png │ │ │ │ │ ├── red5@2x.png │ │ │ │ │ └── red5@3x.png │ │ │ │ ├── red6.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red6.png │ │ │ │ │ ├── red6@2x.png │ │ │ │ │ └── red6@3x.png │ │ │ │ ├── red7.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red7.png │ │ │ │ │ ├── red7@2x.png │ │ │ │ │ └── red7@3x.png │ │ │ │ ├── red8.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red8.png │ │ │ │ │ ├── red8@2x.png │ │ │ │ │ └── red8@3x.png │ │ │ │ ├── red9.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── red9.png │ │ │ │ │ ├── red9@2x.png │ │ │ │ │ └── red9@3x.png │ │ │ │ ├── redace.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── redace.png │ │ │ │ │ ├── redace@2x.png │ │ │ │ │ └── redace@3x.png │ │ │ │ ├── redjack.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── redjack.png │ │ │ │ │ ├── redjack@2x.png │ │ │ │ │ └── redjack@3x.png │ │ │ │ ├── redking.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── redking.png │ │ │ │ │ ├── redking@2x.png │ │ │ │ │ └── redking@3x.png │ │ │ │ ├── redqueen.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── redqueen.png │ │ │ │ │ ├── redqueen@2x.png │ │ │ │ │ └── redqueen@3x.png │ │ │ │ └── spade.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── spade.png │ │ │ │ │ ├── spade@2x.png │ │ │ │ │ └── spade@3x.png │ │ │ ├── CardTestData.swift │ │ │ ├── CardView.swift │ │ │ ├── ColorExtensions.swift │ │ │ ├── ConfidenceGaugeView.swift │ │ │ ├── DeckView.swift │ │ │ ├── FannedDeck.swift │ │ │ ├── FormatListView.swift │ │ │ ├── InfoView.swift │ │ │ ├── LogView.swift │ │ │ ├── MenuView.swift │ │ │ ├── PlatformBackgroundView.swift │ │ │ ├── Preferences.swift │ │ │ ├── ScanResultsView.swift │ │ │ ├── ScannerView.swift │ │ │ ├── ServerConfig.swift │ │ │ ├── SettingsView.swift │ │ │ ├── UIState.swift │ │ │ ├── ViewExtensions.swift │ │ │ └── ViewportView.swift │ │ ├── iOS │ │ │ ├── Abra--iOS--Info.plist │ │ │ ├── ServerConfigView.swift │ │ │ └── iOS.entitlements │ │ └── macOS │ │ │ ├── ServerConfigView.swift │ │ │ └── macOS.entitlements │ ├── Art │ │ └── icon │ │ │ ├── AppIcon-iOS.psd │ │ │ ├── AppIcon-macOS.psd │ │ │ ├── Launch.psd │ │ │ ├── generate-iOS.sh │ │ │ └── generate-macOS.sh │ └── Reference │ │ ├── abra-design.txt │ │ └── abra-screen.txt ├── CardBars │ ├── .swiftlint.yml │ ├── CardBars.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── CardBars.xcscheme │ └── CardBars │ │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ ├── CardBars-icon.png │ │ │ └── Contents.json │ │ ├── BarView.swift │ │ ├── Base.lproj │ │ └── Main.storyboard │ │ ├── CardBars.entitlements │ │ ├── CardBarsAppDelegate.swift │ │ ├── CardBarsViewController.swift │ │ └── Info.plist ├── Minion │ ├── .swiftlint.yml │ ├── Minion.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Minion.xcscheme │ │ │ └── MinionIOS.xcscheme │ └── Minion │ │ ├── Array.swift │ │ ├── Atomic.swift │ │ ├── CGFloat.swift │ │ ├── CGPoint.swift │ │ ├── Codable.swift │ │ ├── CodecFactory.swift │ │ ├── Data.swift │ │ ├── Decodable.swift │ │ ├── Dictionary.swift │ │ ├── DiscoveryAdvertiser.swift │ │ ├── DiscoveryListener.swift │ │ ├── Encodable.swift │ │ ├── EntropyCodec.swift │ │ ├── ImageError.swift │ │ ├── Info.plist │ │ ├── Int.swift │ │ ├── Ipv4Address.swift │ │ ├── Ipv4Interface.swift │ │ ├── Ipv4SocketAddress.swift │ │ ├── LogDevice.swift │ │ ├── LogDeviceConsole.swift │ │ ├── LogDeviceFile.swift │ │ ├── LogDeviceGeneric.swift │ │ ├── LogLevel.swift │ │ ├── Logger.swift │ │ ├── Messages.swift │ │ ├── Minion.h │ │ ├── NSBitmapImageRep.swift │ │ ├── NSImage.swift │ │ ├── PThreadMutex.swift │ │ ├── Packet.swift │ │ ├── PathString.swift │ │ ├── Peer.swift │ │ ├── Random.swift │ │ ├── Server.swift │ │ ├── Sha256.swift │ │ ├── Socket.swift │ │ ├── String.swift │ │ ├── UInt32.swift │ │ ├── UdpListener.swift │ │ ├── UnsafeMutablePointer.swift │ │ ├── UnsafePointer.swift │ │ ├── UnsafeRawPointer.swift │ │ ├── WaitWorker.swift │ │ ├── sockaddr.swift │ │ └── sockaddr_in.swift ├── NativeTasks │ ├── NativeTasks.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── NativeTasks.xcscheme │ │ │ └── NativeTasksIOS.xcscheme │ └── NativeTasks │ │ ├── CircularImageBuffer.h │ │ ├── FastImage.cpp │ │ ├── FastImage.h │ │ ├── Logger.cpp │ │ ├── Logger.h │ │ ├── Mutex.h │ │ ├── NativeInterface.cpp │ │ ├── SecDescriptor.cpp │ │ ├── SecDescriptor.h │ │ ├── VcosException.h │ │ ├── VideoCapture.cpp │ │ ├── VideoCapture.h │ │ ├── VideoException.h │ │ ├── VideoParameters.cpp │ │ ├── VideoParameters.h │ │ ├── include │ │ ├── NativeInterface.h │ │ ├── NativeTaskTypes.h │ │ ├── NativeTasks.h │ │ └── NativeTasksIOS.h │ │ └── info.plist ├── Seer │ ├── .swiftlint.yml │ ├── Seer.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Seer (debug.optimized).xcscheme │ │ │ ├── Seer.xcscheme │ │ │ ├── SeerIOS (debug.optimized).xcscheme │ │ │ └── SeerIOS.xcscheme │ ├── Seer │ │ ├── AnalysisResult.swift │ │ ├── Arithmeticable.swift │ │ ├── CodeDefinition.swift │ │ ├── Config.swift │ │ ├── Debug.swift │ │ ├── Deck.swift │ │ ├── DeckFormat.swift │ │ ├── DeckLocation.swift │ │ ├── DeckMatchResult.swift │ │ ├── DeckSearch.swift │ │ ├── DecodeResult.swift │ │ ├── Decoder.swift │ │ ├── Double.swift │ │ ├── Edge.swift │ │ ├── EdgeDetection.swift │ │ ├── FixedPoint.swift │ │ ├── Float.swift │ │ ├── HammingDistance.swift │ │ ├── History.swift │ │ ├── IVector-Imaging.swift │ │ ├── IVector.swift │ │ ├── ImageBuffer-Copy.swift │ │ ├── ImageBuffer-Files.swift │ │ ├── ImageBuffer-ImageProcessing.swift │ │ ├── ImageBuffer.swift │ │ ├── Info.plist │ │ ├── Int.swift │ │ ├── Int64.swift │ │ ├── Line.swift │ │ ├── MarkDefinition.swift │ │ ├── MarkLine.swift │ │ ├── MarkLines.swift │ │ ├── MarkLocation.swift │ │ ├── MarkType.swift │ │ ├── MediaConsumer.swift │ │ ├── MediaProvider.swift │ │ ├── MediaViewportProvider.swift │ │ ├── MinMax.swift │ │ ├── Numeric.swift │ │ ├── PausableTime.swift │ │ ├── Peak.swift │ │ ├── PerfTimer.swift │ │ ├── Rect-Imaging.swift │ │ ├── Rect.swift │ │ ├── RenderView.swift │ │ ├── ResultStats.swift │ │ ├── ResultValidator.swift │ │ ├── RollingValues.swift │ │ ├── SampleLine.swift │ │ ├── ScanManager.swift │ │ ├── ScannedCard.swift │ │ ├── SearchLines.swift │ │ ├── SearchResult.swift │ │ ├── Seer.h │ │ ├── SeerMessages.swift │ │ ├── SeerServerPeer.swift │ │ ├── StaticMatrix.swift │ │ ├── UnsafeBidirectionalArray.swift │ │ ├── UnsafeMutableArray.swift │ │ ├── ValidationResult.swift │ │ └── Vector.swift │ └── SystemModules │ │ └── C_libpng.build │ │ ├── cheader.h │ │ └── module.modulemap ├── Steve │ ├── .swiftlint.yml │ ├── Steve.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Steve (debug.optimized).xcscheme │ │ │ └── Steve.xcscheme │ └── Steve │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── icon-1024.png │ │ │ ├── icon-128.png │ │ │ ├── icon-16.png │ │ │ ├── icon-256.png │ │ │ ├── icon-257.png │ │ │ ├── icon-32.png │ │ │ ├── icon-33.png │ │ │ ├── icon-512.png │ │ │ ├── icon-513.png │ │ │ └── icon-64.png │ │ └── Contents.json │ │ ├── Base.lproj │ │ └── Main.storyboard │ │ ├── Info.plist │ │ ├── Menus.swift │ │ ├── Reference │ │ ├── inter6.quick-random-movements.mp4 │ │ ├── inter6.slow-in-out.mp4 │ │ └── mds12-56b.mp4 │ │ ├── Steve.entitlements │ │ ├── SteveAppDelegate.swift │ │ ├── SteveFrameView.swift │ │ ├── SteveMediaProvider.swift │ │ ├── SteveMediaViewportProvider.swift │ │ ├── SteveServerPeer.swift │ │ ├── SteveViewController.swift │ │ └── SteveWindow.swift ├── magic.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── mdscodes │ ├── .swiftlint.yml │ ├── mdscodes.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── mdscodes (debug.optimized).xcscheme │ │ │ └── mdscodes.xcscheme │ └── mdscodes │ │ ├── MDSCodes.swift │ │ ├── main.swift │ │ └── mdscodes.entitlements └── whisper │ ├── .swiftlint.yml │ ├── SystemModules │ ├── C_AAlib.build │ │ ├── cheader.h │ │ └── module.modulemap │ ├── C_Libav.build │ │ ├── cheader.h │ │ └── module.modulemap │ └── C_ncurses.build │ │ ├── cheader.h │ │ └── module.modulemap │ ├── whisper.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ ├── whisper (debug.optimized).xcscheme │ │ └── whisper.xcscheme │ └── whisper │ ├── CommandLineParser.swift │ ├── KeyInput.swift │ ├── LogDeviceTextUi.swift │ ├── Signals.swift │ ├── TextUi.swift │ ├── VideoDecode.swift │ ├── VideoDecodeError.swift │ ├── Whisper.swift │ ├── WhisperCaptureMediaProvider.swift │ ├── WhisperMediaViewportProvider.swift │ ├── WhisperServerPeer.swift │ ├── WhisperVideoMediaProvider.swift │ ├── main.swift │ └── whisper.entitlements ├── build ├── decks.json ├── docs ├── DEPS.linux ├── _img-master │ ├── intro-stages.psd │ ├── shuffle.psd │ ├── stamp-generation.psd │ └── temporal_grid.psd ├── img │ ├── abra_ipad.png │ ├── contour-landmarks.png │ ├── contour-mark-lines.png │ ├── deck-locations.png │ ├── deck_extents.png │ ├── deck_under_ir.jpg │ ├── device.png │ ├── error-correction-viz.png │ ├── ink_comparison.jpg │ ├── intro-stages.png │ ├── manual-marks.jpg │ ├── manual-process.jpg │ ├── marking-r&d.jpg │ ├── mds18-54-rubberstamp.png │ ├── search_grid.png │ ├── search_line_edge_detect.png │ ├── sharpness-graphs.png │ ├── shuffle.png │ ├── stamp-generation.png │ ├── stamp-rig.jpg │ ├── stamped-deck.jpg │ ├── steve.png │ ├── temporal_grid.png │ ├── uv-ink.jpg │ └── whisper.png ├── index.html └── markdeep.min.js ├── todo.txt ├── tools ├── slint └── swiftrevision └── whisper.conf /.gitattributes: -------------------------------------------------------------------------------- 1 | *.ttf filter=lfs diff=lfs merge=lfs -text 2 | *.zip filter=lfs diff=lfs merge=lfs -text 3 | *.mp4 filter=lfs diff=lfs merge=lfs -text 4 | *.psd filter=lfs diff=lfs merge=lfs -text 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2022 Paul Nettle. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are 5 | met: 6 | 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in 12 | the documentation and/or other materials provided with the 13 | distribution. 14 | 15 | * Neither the name of Google nor the names of its contributors may 16 | be used to endorse or promote products derived from this software 17 | without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /Sources/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - for_where 3 | - opening_brace 4 | - identifier_name 5 | - line_length 6 | - file_length 7 | - function_body_length 8 | - cyclomatic_complexity 9 | - type_body_length 10 | - statement_position 11 | - function_parameter_count 12 | - large_tuple 13 | - trailing_comma 14 | - switch_case_alignment 15 | - closure_parameter_position 16 | - nesting 17 | - legacy_hashing 18 | - unused_setter_value 19 | - comment_spacing 20 | -------------------------------------------------------------------------------- /Sources/Abra/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - for_where 3 | - opening_brace 4 | - identifier_name 5 | - line_length 6 | - file_length 7 | - function_body_length 8 | - cyclomatic_complexity 9 | - type_body_length 10 | - statement_position 11 | - function_parameter_count 12 | - large_tuple 13 | - trailing_comma 14 | - switch_case_alignment 15 | - closure_parameter_position 16 | - nesting 17 | - legacy_hashing 18 | - unused_setter_value 19 | - comment_spacing 20 | -------------------------------------------------------------------------------- /Sources/Abra/Abra.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/Abra/Abra.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Abra/Abra.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-1025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-1025.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-120.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-121.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-121.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-128.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-152.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-16.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-167.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-180.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-20.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-256.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-257.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-32.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-33.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-40.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-41.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-42.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-512.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-513.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-513.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-58.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-59.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-60.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-64.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-80.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-81.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/AppIcon.appiconset/AppIcon-87.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/Launch.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "filename" : "Launch.png", 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | }, 21 | "properties" : { 22 | "auto-scaling" : "auto" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Assets.xcassets/Launch.imageset/Launch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Assets.xcassets/Launch.imageset/Launch.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/BouncingTapGesture.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BouncingGapGesture.swift 3 | // Abra 4 | // 5 | // Created by Paul Nettle on 10/3/21. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import SwiftUI 14 | 15 | // swiftlint:disable type_name 16 | 17 | /// A modified version of `.onTapGesture` that applies a quick scaling "bouncing" spring animation, applied to the scale of the view. 18 | /// 19 | /// Use it like so: 20 | /// 21 | /// @State var scale: CGFloat = 1 22 | /// SomeView() 23 | /// .modifier(bouncingTapGesture(scale: $scale, bounceScale: 1.3) { 24 | /// // your code here to manage the tap gesture 25 | /// }) 26 | /// 27 | /// Note that the provided block is executed at the peak of the bounce animation. If, for example the block alters an icon image, 28 | /// that transition will happen at the peak of the initial bounce before returning to the original size. 29 | struct bouncingTapGesture: ViewModifier { 30 | @State private var scale: CGFloat = 1 31 | var count: Int = 1 32 | var bounceScale: CGFloat 33 | var action: () -> Void = {} 34 | 35 | func body(content: Content) -> some View { 36 | content 37 | .scaleEffect(scale) 38 | .animation(.interpolatingSpring(mass: 1.0, stiffness: 500.0, damping: 10, initialVelocity: 10), value: scale) 39 | .onTapGesture(count: count) { 40 | scale = bounceScale 41 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.09) { 42 | scale = 1 43 | action() 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.125", 9 | "green" : "0.478", 10 | "red" : "0.859" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "display-p3", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.125", 27 | "green" : "0.478", 28 | "red" : "0.859" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "display-p3", 42 | "components" : { 43 | "alpha" : "1.000", 44 | "blue" : "0.125", 45 | "green" : "0.478", 46 | "red" : "0.859" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black10.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black10@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black10@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black10.imageset/black10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black10.imageset/black10.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black10.imageset/black10@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black10.imageset/black10@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black10.imageset/black10@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black10.imageset/black10@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black2@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black2@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black2.imageset/black2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black2.imageset/black2.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black2.imageset/black2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black2.imageset/black2@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black2.imageset/black2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black2.imageset/black2@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black3@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black3@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black3.imageset/black3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black3.imageset/black3.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black3.imageset/black3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black3.imageset/black3@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black3.imageset/black3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black3.imageset/black3@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black4.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black4@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black4@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black4.imageset/black4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black4.imageset/black4.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black4.imageset/black4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black4.imageset/black4@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black4.imageset/black4@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black4.imageset/black4@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black5.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black5@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black5@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black5.imageset/black5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black5.imageset/black5.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black5.imageset/black5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black5.imageset/black5@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black5.imageset/black5@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black5.imageset/black5@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black6.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black6@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black6@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black6.imageset/black6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black6.imageset/black6.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black6.imageset/black6@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black6.imageset/black6@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black6.imageset/black6@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black6.imageset/black6@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black7.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black7@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black7@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black7.imageset/black7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black7.imageset/black7.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black7.imageset/black7@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black7.imageset/black7@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black7.imageset/black7@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black7.imageset/black7@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black8.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black8@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black8@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black8.imageset/black8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black8.imageset/black8.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black8.imageset/black8@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black8.imageset/black8@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black8.imageset/black8@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black8.imageset/black8@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "black9.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "black9@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "black9@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black9.imageset/black9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black9.imageset/black9.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black9.imageset/black9@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black9.imageset/black9@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/black9.imageset/black9@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/black9.imageset/black9@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackace.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "blackace.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "blackace@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "blackace@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackace.imageset/blackace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackace.imageset/blackace.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackace.imageset/blackace@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackace.imageset/blackace@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackace.imageset/blackace@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackace.imageset/blackace@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackjack.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "blackjack.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "blackjack@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "blackjack@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackjack.imageset/blackjack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackjack.imageset/blackjack.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackjack.imageset/blackjack@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackjack.imageset/blackjack@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackjack.imageset/blackjack@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackjack.imageset/blackjack@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackking.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "blackking.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "blackking@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "blackking@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackking.imageset/blackking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackking.imageset/blackking.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackking.imageset/blackking@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackking.imageset/blackking@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackking.imageset/blackking@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackking.imageset/blackking@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackqueen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "blackqueen.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "blackqueen@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "blackqueen@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackqueen.imageset/blackqueen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackqueen.imageset/blackqueen.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackqueen.imageset/blackqueen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackqueen.imageset/blackqueen@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/blackqueen.imageset/blackqueen@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/blackqueen.imageset/blackqueen@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardad1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cardad1.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "cardad1@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "cardad1@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardad1.imageset/cardad1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardad1.imageset/cardad1.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardad1.imageset/cardad1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardad1.imageset/cardad1@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardad1.imageset/cardad1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardad1.imageset/cardad1@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardad2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cardad2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "cardad2@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "cardad2@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardad2.imageset/cardad2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardad2.imageset/cardad2.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardad2.imageset/cardad2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardad2.imageset/cardad2@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardad2.imageset/cardad2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardad2.imageset/cardad2@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardjokerbw.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cardjokerbw.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "cardjokerbw@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "cardjokerbw@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardjokerbw.imageset/cardjokerbw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardjokerbw.imageset/cardjokerbw.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardjokerbw.imageset/cardjokerbw@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardjokerbw.imageset/cardjokerbw@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardjokerbw.imageset/cardjokerbw@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardjokerbw.imageset/cardjokerbw@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardjokercolor.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cardjokercolor.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "cardjokercolor@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "cardjokercolor@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardjokercolor.imageset/cardjokercolor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardjokercolor.imageset/cardjokercolor.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardjokercolor.imageset/cardjokercolor@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardjokercolor.imageset/cardjokercolor@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/cardjokercolor.imageset/cardjokercolor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/cardjokercolor.imageset/cardjokercolor@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/club.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "club.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "club@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "club@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/club.imageset/club.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/club.imageset/club.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/club.imageset/club@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/club.imageset/club@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/club.imageset/club@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/club.imageset/club@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/diamond.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "diamond.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "diamond@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "diamond@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/diamond.imageset/diamond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/diamond.imageset/diamond.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/diamond.imageset/diamond@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/diamond.imageset/diamond@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/diamond.imageset/diamond@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/diamond.imageset/diamond@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackclub.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facejackclub.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facejackclub@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facejackclub@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackclub.imageset/facejackclub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackclub.imageset/facejackclub.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackclub.imageset/facejackclub@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackclub.imageset/facejackclub@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackclub.imageset/facejackclub@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackclub.imageset/facejackclub@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackdiamond.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facejackdiamond.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facejackdiamond@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facejackdiamond@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackdiamond.imageset/facejackdiamond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackdiamond.imageset/facejackdiamond.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackdiamond.imageset/facejackdiamond@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackdiamond.imageset/facejackdiamond@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackdiamond.imageset/facejackdiamond@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackdiamond.imageset/facejackdiamond@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackheart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facejackheart.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facejackheart@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facejackheart@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackheart.imageset/facejackheart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackheart.imageset/facejackheart.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackheart.imageset/facejackheart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackheart.imageset/facejackheart@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackheart.imageset/facejackheart@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackheart.imageset/facejackheart@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackspade.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facejackspade.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facejackspade@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facejackspade@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackspade.imageset/facejackspade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackspade.imageset/facejackspade.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackspade.imageset/facejackspade@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackspade.imageset/facejackspade@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facejackspade.imageset/facejackspade@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facejackspade.imageset/facejackspade@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingclub.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facekingclub.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facekingclub@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facekingclub@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingclub.imageset/facekingclub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingclub.imageset/facekingclub.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingclub.imageset/facekingclub@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingclub.imageset/facekingclub@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingclub.imageset/facekingclub@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingclub.imageset/facekingclub@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingdiamond.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facekingdiamond.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facekingdiamond@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facekingdiamond@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingdiamond.imageset/facekingdiamond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingdiamond.imageset/facekingdiamond.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingdiamond.imageset/facekingdiamond@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingdiamond.imageset/facekingdiamond@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingdiamond.imageset/facekingdiamond@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingdiamond.imageset/facekingdiamond@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingheart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facekingheart.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facekingheart@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facekingheart@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingheart.imageset/facekingheart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingheart.imageset/facekingheart.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingheart.imageset/facekingheart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingheart.imageset/facekingheart@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingheart.imageset/facekingheart@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingheart.imageset/facekingheart@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingspade.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facekingspade.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facekingspade@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facekingspade@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingspade.imageset/facekingspade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingspade.imageset/facekingspade.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingspade.imageset/facekingspade@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingspade.imageset/facekingspade@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facekingspade.imageset/facekingspade@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facekingspade.imageset/facekingspade@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenclub.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facequeenclub.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facequeenclub@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facequeenclub@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenclub.imageset/facequeenclub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenclub.imageset/facequeenclub.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenclub.imageset/facequeenclub@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenclub.imageset/facequeenclub@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenclub.imageset/facequeenclub@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenclub.imageset/facequeenclub@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeendiamond.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facequeendiamond.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facequeendiamond@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facequeendiamond@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeendiamond.imageset/facequeendiamond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeendiamond.imageset/facequeendiamond.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeendiamond.imageset/facequeendiamond@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeendiamond.imageset/facequeendiamond@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeendiamond.imageset/facequeendiamond@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeendiamond.imageset/facequeendiamond@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenheart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facequeenheart.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facequeenheart@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facequeenheart@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenheart.imageset/facequeenheart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenheart.imageset/facequeenheart.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenheart.imageset/facequeenheart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenheart.imageset/facequeenheart@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenheart.imageset/facequeenheart@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenheart.imageset/facequeenheart@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenspade.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facequeenspade.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "facequeenspade@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "facequeenspade@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenspade.imageset/facequeenspade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenspade.imageset/facequeenspade.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenspade.imageset/facequeenspade@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenspade.imageset/facequeenspade@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/facequeenspade.imageset/facequeenspade@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/facequeenspade.imageset/facequeenspade@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/heart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "heart.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "heart@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "heart@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/heart.imageset/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/heart.imageset/heart.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/heart.imageset/heart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/heart.imageset/heart@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/heart.imageset/heart@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/heart.imageset/heart@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red10.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red10@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red10@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red10.imageset/red10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red10.imageset/red10.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red10.imageset/red10@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red10.imageset/red10@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red10.imageset/red10@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red10.imageset/red10@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red2@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red2@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red2.imageset/red2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red2.imageset/red2.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red2.imageset/red2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red2.imageset/red2@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red2.imageset/red2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red2.imageset/red2@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red3@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red3@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red3.imageset/red3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red3.imageset/red3.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red3.imageset/red3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red3.imageset/red3@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red3.imageset/red3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red3.imageset/red3@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red4.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red4@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red4@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red4.imageset/red4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red4.imageset/red4.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red4.imageset/red4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red4.imageset/red4@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red4.imageset/red4@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red4.imageset/red4@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red5.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red5@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red5@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red5.imageset/red5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red5.imageset/red5.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red5.imageset/red5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red5.imageset/red5@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red5.imageset/red5@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red5.imageset/red5@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red6.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red6@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red6@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red6.imageset/red6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red6.imageset/red6.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red6.imageset/red6@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red6.imageset/red6@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red6.imageset/red6@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red6.imageset/red6@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red7.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red7@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red7@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red7.imageset/red7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red7.imageset/red7.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red7.imageset/red7@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red7.imageset/red7@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red7.imageset/red7@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red7.imageset/red7@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red8.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red8@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red8@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red8.imageset/red8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red8.imageset/red8.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red8.imageset/red8@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red8.imageset/red8@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red8.imageset/red8@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red8.imageset/red8@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "red9.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "red9@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "red9@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red9.imageset/red9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red9.imageset/red9.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red9.imageset/red9@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red9.imageset/red9@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/red9.imageset/red9@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/red9.imageset/red9@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redace.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "redace.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "redace@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "redace@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redace.imageset/redace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redace.imageset/redace.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redace.imageset/redace@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redace.imageset/redace@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redace.imageset/redace@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redace.imageset/redace@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redjack.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "redjack.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "redjack@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "redjack@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redjack.imageset/redjack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redjack.imageset/redjack.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redjack.imageset/redjack@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redjack.imageset/redjack@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redjack.imageset/redjack@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redjack.imageset/redjack@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redking.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "redking.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "redking@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "redking@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redking.imageset/redking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redking.imageset/redking.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redking.imageset/redking@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redking.imageset/redking@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redking.imageset/redking@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redking.imageset/redking@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redqueen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "redqueen.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "redqueen@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "redqueen@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redqueen.imageset/redqueen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redqueen.imageset/redqueen.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redqueen.imageset/redqueen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redqueen.imageset/redqueen@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/redqueen.imageset/redqueen@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/redqueen.imageset/redqueen@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/spade.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "spade.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "spade@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "spade@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/spade.imageset/spade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/spade.imageset/spade.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/spade.imageset/spade@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/spade.imageset/spade@2x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Card.xcassets/spade.imageset/spade@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Abra/Abra/Shared/Card.xcassets/spade.imageset/spade@3x.png -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/CardTestData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CardTestData.swift 3 | // Abra 4 | // 5 | // Created by Paul Nettle on 9/15/21. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | import SwiftUI 15 | 16 | struct CardTestData { 17 | static let kFaceCodes = 18 | ["AH", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "TH", "JH", "QH", "KH", 19 | "AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "TC", "JC", "QC", "KC", 20 | "KD", "QD", "JD", "TD", "9D", "8D", "7D", "6D", "5D", "4D", "3D", "2D", "AD", 21 | "KS", "QS", "JS", "TS", "9S", "8S", "7S", "6S", "5S", "4S", "3S", "2S", "AS", 22 | "X1", "X2", "Z1", "Z2"] 23 | 24 | static private var _cards = [Card]() 25 | static var cards: [Card] 26 | { 27 | if _cards.count == 0 28 | { 29 | for faceCode in CardTestData.kFaceCodes 30 | { 31 | var state: Card.State = [] 32 | if faceCode == "JH" { state.insert(.missing) } 33 | if faceCode.prefix(1) == "5" { state.insert(.reversed) } 34 | if faceCode.prefix(1) == "T" || faceCode.prefix(1) == "3" { state.insert(.fragile) } 35 | _cards.append(Card(faceCode: faceCode, state: state)!) 36 | } 37 | } 38 | 39 | return _cards 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/ColorExtensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ColorExtensions.swift 3 | // Abra 4 | // 5 | // Created by Paul Nettle on 10/7/21. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import SwiftUI 14 | 15 | extension Color { 16 | static let brightRed: Color = Color(red: 1, green: 0, blue: 0) 17 | static let brightGreen: Color = Color(red: 0, green: 1, blue: 0) 18 | static let brightBlue: Color = Color(red: 0, green: 0, blue: 1) 19 | 20 | static let highlightedButtonColor: Color = Color(red: 0.6459, green: 0.7832, blue: 0.9358) 21 | 22 | static let darkGray: Color = Color(white: 0.2) 23 | static let mediumGray: Color = Color(white: 0.5) 24 | static let lightGray: Color = Color(white: 0.8) 25 | } 26 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/PlatformBackgroundView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlatformBackgroundView.swift 3 | // Abra 4 | // 5 | // Created by Paul Nettle on 9/30/21. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import SwiftUI 14 | 15 | struct PlatformBackgroundView: View { 16 | @Environment(\.colorScheme) var colorScheme 17 | var content: () -> Content 18 | 19 | var body: some View { 20 | RoundedRectangle(cornerRadius: 8) 21 | .fill(colorScheme == .dark ? Color.darkGray : Color.lightGray) 22 | .shadow(color: .black.opacity(0.3), radius: 5, x: 8, y: 8) 23 | content() 24 | } 25 | } 26 | 27 | struct PlatformBackgroundView_Previews: PreviewProvider { 28 | static var previews: some View { 29 | PlatformBackgroundView { 30 | RoundedRectangle(cornerRadius: 8) 31 | .fill(Color.green) 32 | .padding() 33 | } 34 | PlatformBackgroundView { 35 | RoundedRectangle(cornerRadius: 8) 36 | .fill(Color.green) 37 | .padding() 38 | } 39 | .preferredColorScheme(.dark) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/Preferences.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Preferences.swift 3 | // Abra 4 | // 5 | // Created by Paul Nettle on 10/5/21. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import SwiftUI 14 | 15 | internal class Preferences { 16 | // ----------------------------------------------------------------------------------------------------------------------------- 17 | // Provide a singleton-like interface 18 | // ----------------------------------------------------------------------------------------------------------------------------- 19 | 20 | private static var _shared: Preferences? 21 | internal static var shared: Preferences 22 | { 23 | get 24 | { 25 | if _shared == nil 26 | { 27 | _shared = Preferences() 28 | } 29 | 30 | return _shared! 31 | } 32 | set 33 | { 34 | assert(_shared != nil) 35 | } 36 | } 37 | 38 | var isLocalLoopback: Bool 39 | { 40 | return localServerEnabled && !advertiseServer 41 | } 42 | 43 | // ----------------------------------------------------------------------------------------------------------------------------- 44 | // Properties 45 | // ----------------------------------------------------------------------------------------------------------------------------- 46 | 47 | @AppStorage("freeze") var freeze: Bool = false 48 | @AppStorage("localServerEnabled") var localServerEnabled: Bool = false 49 | @AppStorage("advertiseServer") var advertiseServer: Bool = true 50 | @AppStorage("errorCorrectionDisplay") var errorCorrectionDisplay: Bool = false 51 | @AppStorage("deckFormatName") var deckFormatName: String? 52 | @AppStorage("activeCameraDeviceName") var activeCameraDeviceName: String? 53 | } 54 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/ScanResultsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScanResultsView.swift 3 | // Abra 4 | // 5 | // Created by Paul Nettle on 9/29/21. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import SwiftUI 14 | 15 | struct ScanResultsView: View { 16 | @EnvironmentObject var uiState: UIState 17 | 18 | var body: some View { 19 | ZStack { 20 | PlatformBackgroundView { 21 | VStack(spacing: 0) { 22 | if uiState.cards.count > 0 { 23 | DeckView(cards: $uiState.cards) 24 | } else { 25 | Text("No cards found, waiting for scan") 26 | .padding() 27 | .padding(.bottom, 5) 28 | .minimumScaleFactor(0.01) 29 | } 30 | } 31 | } 32 | .padding() 33 | .padding(.bottom, 5) 34 | 35 | VStack { 36 | Spacer() 37 | HStack { 38 | Text("\(uiState.cardCount) card\(uiState.cardCount == 1 ? "":"s")") 39 | .font(.subheadline) 40 | .lineLimit(1) 41 | .minimumScaleFactor(0.01) 42 | Spacer() 43 | } 44 | } 45 | .padding(.leading) 46 | .opacity(uiState.cardCount > 0 ? 1 : 0) 47 | } 48 | } 49 | } 50 | 51 | struct ScanResultsView_Previews: PreviewProvider { 52 | static var previews: some View { 53 | ScanResultsView() 54 | .padding() 55 | .background(Color.black) 56 | .preferredColorScheme(.dark) 57 | .environmentObject(UIState.shared) 58 | #if os(iOS) 59 | ScanResultsView() 60 | .padding() 61 | .background(Color.white) 62 | .preferredColorScheme(.light) 63 | .previewInterfaceOrientation(.landscapeLeft) 64 | .environmentObject(UIState.shared) 65 | #endif 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/Shared/ViewExtensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewExtensions.swift 3 | // Abra 4 | // 5 | // Created by Paul Nettle on 10/1/21. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import SwiftUI 14 | 15 | extension View { 16 | @ViewBuilder 17 | func `if`(_ conditional: Bool, content: (Self) -> Content) -> some View { 18 | if conditional { 19 | content(self) 20 | } else { 21 | self 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/iOS/Abra--iOS--Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UILaunchScreen 6 | 7 | UIImageName 8 | Launch 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/iOS/iOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.networking.multicast 6 | 7 | com.apple.security.app-sandbox 8 | 9 | com.apple.security.device.audio-input 10 | 11 | com.apple.security.device.camera 12 | 13 | com.apple.security.files.user-selected.read-only 14 | 15 | com.apple.security.network.client 16 | 17 | com.apple.security.network.server 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sources/Abra/Abra/macOS/macOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.disable-library-validation 6 | 7 | com.apple.security.app-sandbox 8 | 9 | com.apple.security.device.audio-input 10 | 11 | com.apple.security.device.camera 12 | 13 | com.apple.security.files.user-selected.read-only 14 | 15 | com.apple.security.network.client 16 | 17 | com.apple.security.network.server 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sources/Abra/Art/icon/AppIcon-iOS.psd: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ad3921f0834fe5d92a4eddd482642eef8f40b336a75bc0692f507df4da87ee2c 3 | size 7605182 4 | -------------------------------------------------------------------------------- /Sources/Abra/Art/icon/AppIcon-macOS.psd: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:722bf69bf9a7b559a71cd1629c6e3a17abe4ed9473ace1990ae861a23d02e4cc 3 | size 7784324 4 | -------------------------------------------------------------------------------- /Sources/Abra/Art/icon/Launch.psd: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2ef50f28b564e3bddc4c2c8fb42d31ad5453dab2f5ce85309c055641e9cb6178 3 | size 6430041 4 | -------------------------------------------------------------------------------- /Sources/Abra/Art/icon/generate-iOS.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | directory=AppIcon-iOS 4 | sizes=(20 29 40 58 60 76 80 87 120 152 167 180) 5 | 6 | if [[ -d ${directory} ]]; then 7 | echo "Deleting ${directory} directory" 8 | rm -rf ${directory} 9 | fi 10 | 11 | mkdir ${directory} 12 | 13 | # Flatten it into a single 1024x1024 14 | echo "Creating AppIcon-1024.png" 15 | magick convert -alpha on -background none -layers flatten AppIcon-iOS.psd ${directory}/AppIcon-1024.png 16 | 17 | # Generate sizes for each 18 | for i in ${sizes[@]}; do 19 | echo "Creating AppIcon-$i.png" 20 | magick convert -resize $ix$i ${directory}/AppIcon-1024.png ${directory}/AppIcon-$i.png 21 | done -------------------------------------------------------------------------------- /Sources/Abra/Art/icon/generate-macOS.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | directory=AppIcon-macOS 4 | sizes=(16 32 64 128 256 512) 5 | 6 | if [[ -d ${directory} ]]; then 7 | echo "Deleting ${directory} directory" 8 | rm -rf ${directory} 9 | fi 10 | 11 | mkdir ${directory} 12 | 13 | # Flatten it into a single 1024x1024 14 | echo "Creating AppIcon-1024.png" 15 | magick convert -alpha on -background none -layers flatten AppIcon-macOS.psd ${directory}/AppIcon-1024.png 16 | 17 | # Generate sizes for each 18 | for i in ${sizes[@]}; do 19 | echo "Creating AppIcon-$i.png" 20 | magick convert -resize $ix$i ${directory}/AppIcon-1024.png ${directory}/AppIcon-$i.png 21 | done -------------------------------------------------------------------------------- /Sources/CardBars/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - for_where 3 | - opening_brace 4 | - identifier_name 5 | - line_length 6 | - file_length 7 | - function_body_length 8 | - cyclomatic_complexity 9 | - type_body_length 10 | - statement_position 11 | - function_parameter_count 12 | - large_tuple 13 | - trailing_comma 14 | - switch_case_alignment 15 | - closure_parameter_position 16 | - nesting 17 | - legacy_hashing 18 | - unused_setter_value 19 | - comment_spacing 20 | -------------------------------------------------------------------------------- /Sources/CardBars/CardBars.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/CardBars/CardBars.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/CardBars/CardBars.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/CardBars/CardBars/Assets.xcassets/AppIcon.appiconset/CardBars-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/CardBars/CardBars/Assets.xcassets/AppIcon.appiconset/CardBars-icon.png -------------------------------------------------------------------------------- /Sources/CardBars/CardBars/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "size" : "256x256", 40 | "idiom" : "mac", 41 | "filename" : "CardBars-icon.png", 42 | "scale" : "2x" 43 | }, 44 | { 45 | "idiom" : "mac", 46 | "size" : "512x512", 47 | "scale" : "1x" 48 | }, 49 | { 50 | "idiom" : "mac", 51 | "size" : "512x512", 52 | "scale" : "2x" 53 | } 54 | ], 55 | "info" : { 56 | "version" : 1, 57 | "author" : "xcode" 58 | } 59 | } -------------------------------------------------------------------------------- /Sources/CardBars/CardBars/CardBars.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.disable-library-validation 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/CardBars/CardBars/CardBarsAppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CardBarsAppDelegate.swift 3 | // CardBars 4 | // 5 | // Created by Paul Nettle on 11/6/16. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Cocoa 14 | 15 | @NSApplicationMain 16 | class CardBarsAppDelegate: NSObject, NSApplicationDelegate 17 | { 18 | @IBAction func copy(_ sender: Any) 19 | { 20 | } 21 | 22 | func applicationDidFinishLaunching(_ aNotification: Notification) 23 | { 24 | // Insert code here to initialize your application 25 | } 26 | 27 | func applicationWillTerminate(_ aNotification: Notification) 28 | { 29 | // Insert code here to tear down your application 30 | } 31 | 32 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool 33 | { 34 | return true 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Sources/CardBars/CardBars/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | public.app-category.entertainment 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2022 Paul Nettle. All rights reserved. 29 | NSMainStoryboardFile 30 | Main 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /Sources/Minion/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - for_where 3 | - opening_brace 4 | - identifier_name 5 | - line_length 6 | - file_length 7 | - function_body_length 8 | - cyclomatic_complexity 9 | - type_body_length 10 | - statement_position 11 | - function_parameter_count 12 | - large_tuple 13 | - trailing_comma 14 | - switch_case_alignment 15 | - closure_parameter_position 16 | - nesting 17 | - legacy_hashing 18 | - unused_setter_value 19 | - comment_spacing 20 | - legacy_random 21 | -------------------------------------------------------------------------------- /Sources/Minion/Minion.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/Minion/Minion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Minion/Minion.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Minion/Minion.xcodeproj/xcshareddata/xcschemes/Minion.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Sources/Minion/Minion.xcodeproj/xcshareddata/xcschemes/MinionIOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/Atomic.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Atomic.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 8/22/00. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | // Stolen from: https://www.objc.io/blog/2018/12/18/atomic-variables 16 | public final class Atomic 17 | { 18 | private let queue = DispatchQueue(label: "Atomic serial queue") 19 | private var value_: A 20 | 21 | public init(_ value: A) 22 | { 23 | self.value_ = value 24 | } 25 | 26 | public var value: A 27 | { 28 | get 29 | { 30 | return queue.sync { self.value_ } 31 | } 32 | set 33 | { 34 | return queue.sync { self.value_ = newValue } 35 | } 36 | } 37 | 38 | public func mutate(_ transform: (inout A) -> Void) 39 | { 40 | queue.sync { transform(&self.value_) } 41 | } 42 | } 43 | 44 | public final class AtomicFlag 45 | { 46 | private let queue = DispatchQueue(label: "Atomic flag serial queue") 47 | private var value_: Bool 48 | 49 | public init(_ value: Bool = false) 50 | { 51 | self.value_ = value 52 | } 53 | 54 | public var value: Bool 55 | { 56 | get 57 | { 58 | return queue.sync { self.value_ } 59 | } 60 | set 61 | { 62 | return queue.sync { self.value_ = newValue } 63 | } 64 | } 65 | 66 | public func mutate(_ transform: (inout Bool) -> Void) 67 | { 68 | queue.sync { transform(&self.value_) } 69 | } 70 | 71 | public func toggle() 72 | { 73 | queue.sync { self.value_ = !self.value_ } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/CGFloat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGFloat.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 3/2/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | // --------------------------------------------------------------------------------------------------------------------------------- 16 | // Extension: CGFloat -> Integer support 17 | // --------------------------------------------------------------------------------------------------------------------------------- 18 | 19 | #if !os(iOS) 20 | extension CGFloat 21 | { 22 | /// Returns the nearest integer value 23 | @inline(__always) public func roundToNearest() -> Int 24 | { 25 | return Int(self < 0.0 ? self - 0.5 : self + 0.5) 26 | } 27 | 28 | /// Returns the nearest integer toward zero 29 | @inline(__always) public func roundTowardZero() -> Int 30 | { 31 | return Int(self) 32 | } 33 | 34 | /// Returns the nearest integer away from zero 35 | @inline(__always) public func roundAwayFromZero() -> Int 36 | { 37 | return self > 0 ? Int(ceil()) : Int(floor()) 38 | } 39 | 40 | /// Returns integer value toward negative infinity 41 | @inline(__always) public func floor() -> Int 42 | { 43 | #if os(Linux) 44 | return Int(Glibc.floor(self)) 45 | #else 46 | return Int(Darwin.floor(self)) 47 | #endif 48 | } 49 | 50 | /// Returns integer value toward positive infinity 51 | @inline(__always) public func ceil() -> Int 52 | { 53 | #if os(Linux) 54 | return Int(Glibc.ceil(self)) 55 | #else 56 | return Int(Darwin.ceil(self)) 57 | #endif 58 | } 59 | } 60 | #endif 61 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/Codable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Codable.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 2/4/18. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | /// A combination of Decodable and Encodable 16 | public typealias Codable = Encodable & Decodable 17 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/Dictionary.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Dictionary.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 3/24/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | /// General utilitarian extensions for Dictionary collections 16 | public extension Dictionary where Key: ExpressibleByStringLiteral 17 | { 18 | /// Returns a copy of the dictionary in which every key has been converted to lower-case 19 | /// 20 | /// Be aware that as Dictionaries are case-sensitive by default, that it is possible for this process to cause key collisions. 21 | /// In those cases, the return value will be nil. 22 | func lowercasedKeys() -> [String: Value]? 23 | { 24 | var result = [String: Value]() 25 | for (key, value) in self 26 | { 27 | let lowerKey = String(describing: key).lowercased() 28 | if result[lowerKey] == nil 29 | { 30 | result[lowerKey] = value 31 | } 32 | else 33 | { 34 | return nil 35 | } 36 | } 37 | 38 | return result 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/ImageError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageError.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 3/31/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | public enum ImageError: Error 16 | { 17 | case Conversion(String) 18 | case DimensionMismatch 19 | case FileDimensionMismatch 20 | case WriteFailure(String) 21 | } 22 | 23 | extension ImageError: LocalizedError 24 | { 25 | public var errorDescription: String? 26 | { 27 | switch self 28 | { 29 | case .Conversion(let str): 30 | return "ImageError.Conversion: \(str)" 31 | case .DimensionMismatch: 32 | return "ImageError.DimensionMismatch: Mismatching image dimensions" 33 | case .FileDimensionMismatch: 34 | return "ImageError.FileDimensionMismatch: Mismatching image file dimension with file data size" 35 | case .WriteFailure(let str): 36 | return "ImageError.WriteFailure: \(str)" 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2022 Paul Nettle. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/Ipv4Address.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Ipv4Address.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 1/28/18. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | /// Set of common IP address (v4) 16 | public struct Ipv4Address 17 | { 18 | /// Returns an address set to INADDR_LOOPBACK 19 | public static let kLoopback = UInt32(INADDR_LOOPBACK) 20 | 21 | /// Returns an address set to INADDR_ANY 22 | public static let kAny = UInt32(INADDR_ANY) 23 | 24 | /// Returns an address set to INADDR_BROADCAST 25 | public static let kBroadcast = UInt32(INADDR_BROADCAST) 26 | } 27 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/Ipv4SocketAddress.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Ipv4SocketAddress.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 1/28/18. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | /// A representation of a socket address (`sockaddr_in`), which, for AF_INET sockets is generally an IP/Port address pair 16 | /// 17 | /// The internal representation for the address and port is in host byte order. 18 | public struct Ipv4SocketAddress 19 | { 20 | /// The IP address 21 | public let address: UInt32 22 | 23 | /// The port address 24 | public let port: UInt16 25 | 26 | /// Initialize from the base types, both of which are in host byte format 27 | public init(address: UInt32, port: UInt16) 28 | { 29 | self.address = address 30 | self.port = port 31 | } 32 | 33 | /// Initialize from a `sockaddr_in` 34 | public init(_ addr: sockaddr_in) 35 | { 36 | address = in_addr_t(bigEndian: addr.sin_addr.s_addr) 37 | port = in_port_t(bigEndian: addr.sin_port) 38 | } 39 | 40 | /// Returns a string representation of this socket address 41 | public func toString() -> String 42 | { 43 | return "\(address.toIPAddress()):\(port)" 44 | } 45 | } 46 | 47 | extension Ipv4SocketAddress: CustomStringConvertible, CustomDebugStringConvertible 48 | { 49 | public var debugDescription: String 50 | { 51 | return description 52 | } 53 | 54 | public var description: String 55 | { 56 | return toString() 57 | } 58 | } 59 | 60 | extension Ipv4SocketAddress: Equatable 61 | { 62 | public static func == (lhs: Ipv4SocketAddress, rhs: Ipv4SocketAddress) -> Bool 63 | { 64 | return lhs.address == rhs.address 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/LogDevice.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogDevice.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 3/24/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | /// Defines a device that receives the output from the logger. 16 | /// 17 | /// Devices may be defined for various media, such as a standard log file, a system log, a cloud-based log tracking service, etc. 18 | /// 19 | /// These devices are then added to the logging service via RegisterDevice() and UnregisterDevice() methods in the Logger class. 20 | /// 21 | /// Note that if a device fails to open, it will not be registered. 22 | public protocol LogDevice 23 | { 24 | /// The mask set for this device 25 | var mask: Int { get set } 26 | 27 | /// The name of this device 28 | var name: String { get } 29 | 30 | /// Opens the target output device. 31 | /// 32 | /// If this function fails, it will not get registered. 33 | /// 34 | /// Returns true on success, otherwise false 35 | func open() -> Bool 36 | 37 | /// Writes a log entry to the output device 38 | func write(level: LogLevel, indent: Int, date: String, text: String) 39 | 40 | /// Closes the target output device 41 | func close() 42 | } 43 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/LogDeviceConsole.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogDeviceConsole.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 3/24/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | public final class LogDeviceConsole: LogDevice 16 | { 17 | /// The mask set for this device 18 | public var mask: Int = 0 19 | 20 | /// Returns the name of this device 21 | public var name: String { return "Console" } 22 | 23 | /// Default initializer - we need this here so we can declare it as public 24 | public init() 25 | { 26 | 27 | } 28 | 29 | /// Opens the target output device 30 | public func open() -> Bool 31 | { 32 | // Noting to do here 33 | return true 34 | } 35 | 36 | /// Writes a log entry to the output device 37 | public func write(level: LogLevel, indent: Int, date: String, text: String) 38 | { 39 | let indentString = String(repeating: " ", count: indent) 40 | let prefix = "\(date) [\(level)] \(indentString)" 41 | 42 | // A simple print is all we need for the console 43 | print(prefix + text) 44 | } 45 | 46 | /// Closes the target output device 47 | public func close() 48 | { 49 | // Nothing to do here 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/Minion.h: -------------------------------------------------------------------------------- 1 | // 2 | // Minion.h 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 9/25/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #import 14 | 15 | // In this header, you should import all the public headers of your framework using statements like #import 16 | 17 | 18 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/NSBitmapImageRep.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSBitmapImageRep.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 3/20/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #if os(macOS) 14 | 15 | import Foundation 16 | import AppKit 17 | 18 | public extension NSBitmapImageRep 19 | { 20 | var png: Data? 21 | { 22 | return representation(using: .png, properties: [:]) 23 | } 24 | } 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/NSImage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSImage.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 3/20/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #if os(macOS) 14 | 15 | import Foundation 16 | import AppKit 17 | 18 | public extension NSImage 19 | { 20 | var png: Data? 21 | { 22 | return tiffRepresentation?.bitmap?.png 23 | } 24 | 25 | /// Saves an NSImage as a PNG file to `url` 26 | /// 27 | /// Returns error string on error, otherwise nil 28 | /// 29 | /// Throws: 30 | /// * An error in the Cocoa domain, if there is an error writing to the `URL`. 31 | /// * An ImageError.ConversionError if a PNG representation cannot be created 32 | func savePng(to url: URL) throws 33 | { 34 | if let png = self.png 35 | { 36 | try png.write(to: url) 37 | } 38 | else 39 | { 40 | throw ImageError.Conversion("Unable to create PNG representation of image for writing to URL: \(url)") 41 | } 42 | } 43 | } 44 | 45 | #endif 46 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/UnsafeMutablePointer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UnsafeMutablePointer.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 3/31/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | #if os(macOS) 15 | import AppKit 16 | #endif 17 | #if os(iOS) 18 | import UIKit 19 | #endif 20 | 21 | public extension UnsafeMutablePointer 22 | { 23 | func toData(count: Int) -> Data? 24 | { 25 | let elementSize = MemoryLayout.size 26 | return Data(bytes: self, count: count * elementSize) 27 | } 28 | } 29 | 30 | public extension UnsafeMutablePointer 31 | { 32 | #if os(macOS) || os(iOS) 33 | func toCGImage(width: Int, height: Int) -> CGImage? 34 | { 35 | let elementSize = MemoryLayout.size 36 | return toData(count: width * height)?.toCGImage(width: width, height: height, bytesPerPixel: elementSize) 37 | } 38 | #endif 39 | 40 | #if os(macOS) 41 | func toNSImage(width: Int, height: Int) -> NSImage? 42 | { 43 | let elementSize = MemoryLayout.size 44 | return toData(count: width * height)?.toNSImage(width: width, height: height, bytesPerPixel: elementSize) 45 | } 46 | #endif 47 | } 48 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/UnsafePointer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UnsafePointer.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 3/31/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | #if os(macOS) 15 | import AppKit 16 | #endif 17 | #if os(iOS) 18 | import UIKit 19 | #endif 20 | 21 | public extension UnsafePointer 22 | { 23 | func toData(count: Int) -> Data? 24 | { 25 | let elementSize = MemoryLayout.size 26 | return Data(bytes: self, count: count * elementSize) 27 | } 28 | } 29 | 30 | #if os(macOS) || os(iOS) 31 | public extension UnsafePointer 32 | { 33 | func toCGImage(width: Int, height: Int) -> CGImage? 34 | { 35 | let elementSize = MemoryLayout.size 36 | return toData(count: width * height)?.toCGImage(width: width, height: height, bytesPerPixel: elementSize) 37 | } 38 | 39 | #if os(macOS) 40 | func toNSImage(width: Int, height: Int) -> NSImage? 41 | { 42 | let elementSize = MemoryLayout.size 43 | return toData(count: width * height)?.toNSImage(width: width, height: height, bytesPerPixel: elementSize) 44 | } 45 | #endif 46 | } 47 | #endif 48 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/UnsafeRawPointer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UnsafeRawPointer.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 3/31/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | #if os(macOS) 15 | import AppKit 16 | #endif 17 | 18 | public extension UnsafeRawPointer 19 | { 20 | func toData(count: Int, elementSize: Int) -> Data? 21 | { 22 | return Data(bytes: self, count: count * elementSize) 23 | } 24 | } 25 | 26 | #if os(macOS) 27 | public extension UnsafeRawPointer 28 | { 29 | func toCGImage(width: Int, height: Int, elementSize: Int) -> CGImage? 30 | { 31 | return toData(count: width * height, elementSize: elementSize)?.toCGImage(width: width, height: height, bytesPerPixel: elementSize) 32 | } 33 | 34 | func toNSImage(width: Int, height: Int, elementSize: Int) -> NSImage? 35 | { 36 | return toData(count: width * height, elementSize: elementSize)?.toNSImage(width: width, height: height, bytesPerPixel: elementSize) 37 | } 38 | } 39 | #endif 40 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/sockaddr.swift: -------------------------------------------------------------------------------- 1 | // 2 | // sockaddr.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 1/28/18. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | /// Convenience extensions for conversion from `sockaddr_in` to `sockaddr` 16 | public extension sockaddr 17 | { 18 | /// Coversion from `sockaddr_in` to `sockaddr` 19 | init(_ addr: sockaddr_in) 20 | { 21 | var tmp = addr 22 | self = withUnsafePointer(to: &tmp) { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { $0.pointee } } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Sources/Minion/Minion/sockaddr_in.swift: -------------------------------------------------------------------------------- 1 | // 2 | // sockaddr_in.swift 3 | // Minion 4 | // 5 | // Created by Paul Nettle on 1/28/18. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | /// Convenience extensions for conversion from `sockaddr` to `sockaddr_in` 16 | public extension sockaddr_in 17 | { 18 | /// Coversion from `sockaddr_in` to `sockaddr` 19 | init(_ addr: sockaddr) 20 | { 21 | var tmp = addr 22 | self = withUnsafePointer(to: &tmp) { $0.withMemoryRebound(to: sockaddr_in.self, capacity: 1) { $0.pointee } } 23 | } 24 | 25 | /// Initialize a `sockaddr_in` from a `Ipv4SocketAddress` 26 | /// 27 | /// Endian conversion is part of this process 28 | init(_ socketAddress: Ipv4SocketAddress) 29 | { 30 | #if os(Linux) 31 | self.init(sin_family: sa_family_t(AF_INET), 32 | sin_port: in_port_t(socketAddress.port.bigEndian), 33 | sin_addr: in_addr(s_addr: socketAddress.address.bigEndian), 34 | sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) 35 | #else 36 | self.init(sin_len: __uint8_t(MemoryLayout.size), 37 | sin_family: sa_family_t(AF_INET), 38 | sin_port: in_port_t(socketAddress.port.bigEndian), 39 | sin_addr: in_addr(s_addr: socketAddress.address.bigEndian), 40 | sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) 41 | #endif 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks.xcodeproj/xcshareddata/xcschemes/NativeTasks.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks.xcodeproj/xcshareddata/xcschemes/NativeTasksIOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks/Logger.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Logger.cpp 3 | // NativeTasks 4 | // 5 | // Created by Paul Nettle on 5/22/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #include "Logger.h" 14 | 15 | NativeLogReceiver Logger::logReceiverDebug = nullptr; 16 | NativeLogReceiver Logger::logReceiverInfo = nullptr; 17 | NativeLogReceiver Logger::logReceiverWarn = nullptr; 18 | NativeLogReceiver Logger::logReceiverError = nullptr; 19 | NativeLogReceiver Logger::logReceiverSevere = nullptr; 20 | NativeLogReceiver Logger::logReceiverFatal = nullptr; 21 | NativeLogReceiver Logger::logReceiverTrace = nullptr; 22 | NativeLogReceiver Logger::logReceiverPerf = nullptr; 23 | NativeLogReceiver Logger::logReceiverStatus = nullptr; 24 | NativeLogReceiver Logger::logReceiverFrame = nullptr; 25 | NativeLogReceiver Logger::logReceiverSearch = nullptr; 26 | NativeLogReceiver Logger::logReceiverDecode = nullptr; 27 | NativeLogReceiver Logger::logReceiverResolve = nullptr; 28 | NativeLogReceiver Logger::logReceiverCorrect = nullptr; 29 | NativeLogReceiver Logger::logReceiverIncorrect = nullptr; 30 | NativeLogReceiver Logger::logReceiverResult = nullptr; 31 | NativeLogReceiver Logger::logReceiverBadReport = nullptr; 32 | NativeLogReceiver Logger::logReceiverNetwork = nullptr; 33 | NativeLogReceiver Logger::logReceiverNetworkData = nullptr; 34 | NativeLogReceiver Logger::logReceiverVideo = nullptr; 35 | NativeLogReceiver Logger::logReceiverAlways = nullptr; 36 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks/SecDescriptor.h: -------------------------------------------------------------------------------- 1 | // 2 | // SecDescriptor.h 3 | // NativeTasks 4 | // 5 | // Created by Paul Nettle on 5/25/19. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #pragma once 14 | 15 | #if defined(__linux__) 16 | 17 | /// Returns a string with the permanent ethernet MAC addresses 18 | const char *secDescriptor(const char *name); 19 | 20 | #endif // defined(__linux__) 21 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks/VideoException.h: -------------------------------------------------------------------------------- 1 | // 2 | // VideoException.h 3 | // NativeTasks 4 | // 5 | // Created by Paul Nettle on 5/13/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #if defined(USE_MMAL) 14 | 15 | #pragma once 16 | 17 | #include 18 | #include 19 | #include "include/NativeTaskTypes.h" 20 | 21 | /// Manages general video-related exceptions 22 | /// 23 | /// For specific types of video exceptions (for example, those from camera captures) this method should be subclassed. 24 | struct VideoException : public std::exception 25 | { 26 | /// Construct a VideoException with a C-style string message 27 | /// 28 | /// Also available: construction via std::string and std::ostream (via std::stringstream) 29 | public: VideoException(const char *message) : mMessage(nullptr == message ? "- unspecified -" : message) { } 30 | 31 | /// Construct a VideoException with a std::string message 32 | /// 33 | /// Also available: construction via C-style string and std::ostream (via std::stringstream) 34 | public: VideoException(const std::string &message) : mMessage(message) { } 35 | 36 | /// Construct a VideoException with a std::ostream (via std::stringstream) 37 | /// 38 | /// The convention for using this includes the use of the `SSTR` typedef, which works as follows: 39 | /// 40 | /// throw VideoException(SSTR << "Decoding complete. " << frameCount << " frames decoded in " << perf.ms << "ms."); 41 | /// 42 | /// Also available: construction via C-style strings and std::string 43 | public: VideoException(const std::ostream &message) : mMessage(static_cast(message).str()) { } 44 | 45 | /// We'll need a virtual destructor so we can override 46 | public: virtual ~VideoException() { } 47 | 48 | /// Returns explanatory information 49 | /// 50 | /// Guaranteed to be a valid pointer. 51 | public: virtual const char* what() const noexcept { return mMessage.c_str(); } 52 | 53 | /// Our stored message 54 | protected: std::string mMessage; 55 | }; 56 | 57 | #endif // defined(USE_MMAL) 58 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks/include/NativeTaskTypes.h: -------------------------------------------------------------------------------- 1 | // 2 | // NativeTaskTypes.h 3 | // NativeTasks 4 | // 5 | // Created by Paul Nettle on 5/22/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #pragma once 14 | 15 | #include 16 | 17 | /// Type used to represent an 8-bit Luma image sample 18 | typedef uint8_t LumaSample; 19 | 20 | /// Type used to represent an 8-bit Luma image buffer 21 | typedef LumaSample * NativeLumaBuffer; 22 | 23 | /// Type used to represent an 8-bit Luma image sample 24 | typedef uint32_t ColorSample; 25 | 26 | /// Type used to represent an 8-bit Luma image buffer 27 | typedef ColorSample * NativeColorBuffer; 28 | 29 | /// This little ditty is to simplify the use of stringstream being passed into the logging methods. This allows us to do something 30 | /// similar to the following: 31 | /// 32 | /// Logger::info(SSTR << "There were " << count << " entries in the list"); 33 | #define SSTR std::ostringstream().flush() 34 | 35 | // --------------------------------------------------------------------------------------------------------------------------------- 36 | // ____ _ 37 | // | _ \ ___ ___ ___(_)_ _____ _ __ ___ 38 | // | |_) / _ \/ __/ _ \ \ \ / / _ \ '__/ __| 39 | // | _ < __/ (_| __/ |\ V / __/ | \__ \ 40 | // |_| \_\___|\___\___|_| \_/ \___|_| |___/ 41 | // 42 | // --------------------------------------------------------------------------------------------------------------------------------- 43 | 44 | /// Type definition for a callback that receives images from NativeTasks 45 | typedef void (* NativeCaptureFrameReceiver)(LumaSample *sampleData, uint32_t width, uint32_t height); 46 | 47 | /// Type definition for a callback that receives log messages 48 | typedef void (* NativeLogReceiver)(const char *message); 49 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks/include/NativeTasks.h: -------------------------------------------------------------------------------- 1 | // 2 | // NativeTasks.h 3 | // NativeTasks 4 | // 5 | // Created by Paul Nettle on 3/18/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #pragma once 14 | 15 | #include "NativeInterface.h" 16 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks/include/NativeTasksIOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // NativeTasksIOS.h 3 | // NativeTasks 4 | // 5 | // Created by Paul Nettle on 3/18/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #pragma once 14 | 15 | #include "NativeInterface.h" 16 | -------------------------------------------------------------------------------- /Sources/NativeTasks/NativeTasks/info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2022 Paul Nettle. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Sources/Seer/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - for_where 3 | - opening_brace 4 | - identifier_name 5 | - line_length 6 | - file_length 7 | - function_body_length 8 | - cyclomatic_complexity 9 | - type_body_length 10 | - statement_position 11 | - function_parameter_count 12 | - large_tuple 13 | - trailing_comma 14 | - switch_case_alignment 15 | - closure_parameter_position 16 | - nesting 17 | - legacy_hashing 18 | - unused_setter_value 19 | - comment_spacing 20 | -------------------------------------------------------------------------------- /Sources/Seer/Seer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/Seer/Seer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Seer/Seer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Seer/Seer.xcodeproj/xcshareddata/xcschemes/Seer (debug.optimized).xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Sources/Seer/Seer.xcodeproj/xcshareddata/xcschemes/Seer.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Sources/Seer/Seer.xcodeproj/xcshareddata/xcschemes/SeerIOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/Arithmeticable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Math.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 12/28/16. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | // --------------------------------------------------------------------------------------------------------------------------------- 16 | // Arithmeticable - a protocol with support for basic arithmetic operations 17 | // --------------------------------------------------------------------------------------------------------------------------------- 18 | 19 | /// Basic protocol that specifies a type supports arithmetic operations 20 | /// 21 | /// Operations: +, -, *, / 22 | public protocol Arithmeticable: ExpressibleByIntegerLiteral 23 | { 24 | static func + (lhs: Self, rhs: Self) -> Self 25 | static func += (lhs: inout Self, rhs: Self) 26 | 27 | static func - (lhs: Self, rhs: Self) -> Self 28 | static func -= (lhs: inout Self, rhs: Self) 29 | 30 | static func * (lhs: Self, rhs: Self) -> Self 31 | static func *= (lhs: inout Self, rhs: Self) 32 | 33 | static func / (lhs: Self, rhs: Self) -> Self 34 | static func /= (lhs: inout Self, rhs: Self) 35 | } 36 | 37 | /// Declare that Int supports Arithmeticable 38 | extension Int: Arithmeticable {} 39 | 40 | /// Declare that Int8 supports Arithmeticable 41 | extension Int8: Arithmeticable {} 42 | 43 | /// Declare that Int32 supports Arithmeticable 44 | extension Int32: Arithmeticable {} 45 | 46 | /// Declare that Int64 supports Arithmeticable 47 | extension Int64: Arithmeticable {} 48 | 49 | /// Declare that UInt supports Arithmeticable 50 | extension UInt: Arithmeticable {} 51 | 52 | /// Declare that UInt8 supports Arithmeticable 53 | extension UInt8: Arithmeticable {} 54 | 55 | /// Declare that UInt32 supports Arithmeticable 56 | extension UInt32: Arithmeticable {} 57 | 58 | /// Declare that UInt64 supports Arithmeticable 59 | extension UInt64: Arithmeticable {} 60 | 61 | /// Declare that Float supports Arithmeticable 62 | extension Float: Arithmeticable {} 63 | 64 | /// Declare that Double supports Arithmeticable 65 | extension Double: Arithmeticable {} 66 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/Double.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Double.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 3/2/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | // --------------------------------------------------------------------------------------------------------------------------------- 16 | // Extension: Double -> Integer support 17 | // --------------------------------------------------------------------------------------------------------------------------------- 18 | 19 | public extension Double 20 | { 21 | /// Returns the nearest integer value 22 | @inline(__always) func roundToNearest() -> Int 23 | { 24 | return Int(self < 0.0 ? self - 0.5 : self + 0.5) 25 | } 26 | 27 | /// Returns the nearest integer toward zero 28 | @inline(__always) func roundTowardZero() -> Int 29 | { 30 | return Int(self) 31 | } 32 | 33 | /// Returns the nearest integer away from zero 34 | @inline(__always) func roundAwayFromZero() -> Int 35 | { 36 | return self > 0 ? Int(ceil()) : Int(floor()) 37 | } 38 | 39 | /// Returns integer value toward negative infinity 40 | @inline(__always) func floor() -> Int 41 | { 42 | #if os(Linux) 43 | return Int(Glibc.floor(self)) 44 | #else 45 | return Int(Darwin.floor(self)) 46 | #endif 47 | } 48 | 49 | /// Returns integer value toward positive infinity 50 | @inline(__always) func ceil() -> Int 51 | { 52 | #if os(Linux) 53 | return Int(Glibc.ceil(self)) 54 | #else 55 | return Int(Darwin.ceil(self)) 56 | #endif 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/Float.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Float.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 2/3/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | // --------------------------------------------------------------------------------------------------------------------------------- 16 | // Extension: Float -> Integer support 17 | // --------------------------------------------------------------------------------------------------------------------------------- 18 | 19 | public extension Float 20 | { 21 | /// Returns the nearest integer value 22 | @inline(__always) func roundToNearest() -> Int 23 | { 24 | return Int(self < 0.0 ? self - 0.5 : self + 0.5) 25 | } 26 | 27 | /// Returns the nearest integer toward zero 28 | @inline(__always) func roundTowardZero() -> Int 29 | { 30 | return Int(self) 31 | } 32 | 33 | /// Returns the nearest integer away from zero 34 | @inline(__always) func roundAwayFromZero() -> Int 35 | { 36 | return self > 0 ? Int(ceil()) : Int(floor()) 37 | } 38 | 39 | /// Returns integer value toward negative infinity 40 | @inline(__always) func floor() -> Int 41 | { 42 | #if os(Linux) 43 | return Int(Glibc.floor(self)) 44 | #else 45 | return Int(Darwin.floor(self)) 46 | #endif 47 | } 48 | 49 | /// Returns integer value toward positive infinity 50 | @inline(__always) func ceil() -> Int 51 | { 52 | #if os(Linux) 53 | return Int(Glibc.ceil(self)) 54 | #else 55 | return Int(Darwin.ceil(self)) 56 | #endif 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/IVector-Imaging.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IVector-Imaging.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 3/31/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | /// Extensions for drawing points via an IVector 16 | extension IVector 17 | { 18 | /// Sets the color of the sample to `color` a point at the position represented by the (x, y) 19 | public func draw(to image: DebugBuffer?, color: Color) 20 | { 21 | if let samples = image?.buffer 22 | { 23 | if !image!.rect.contains(point: self) { return } 24 | 25 | samples[y * image!.width + x] = alphaBlend(src: color, dst: samples[y * image!.width + x]) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2022 Paul Nettle. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/Int.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Int.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 2/3/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | // --------------------------------------------------------------------------------------------------------------------------------- 16 | // Extension: Printing helper for binary values 17 | // --------------------------------------------------------------------------------------------------------------------------------- 18 | 19 | public extension Int 20 | { 21 | /// Returns a value from the set [-1, 0, +1] representing the sign of the value 22 | @inline(__always) func sign() -> Int 23 | { 24 | // An efficient C++ implementation would look like this, due to the way it converts boolean results to 0/1. This uses 25 | // compares, but avoids branches (so it's very fast.) See http://stackoverflow.com/a/14612943/2203321. 26 | // 27 | // return (self > 0) - (self < 0) 28 | return self < 0 ? -1 : (self > 0 ? 1 : 0) 29 | } 30 | 31 | /// Returns the number of leading bits with the same value (either 0 or 1). 32 | /// 33 | /// Examples displayed in LSB->MSB order: 34 | /// 35 | /// 01000011 -> Two leading bits (both are 1s) 36 | /// 11000000 -> Six leading bits (all are 0s) 37 | /// 38 | /// This function will always return a number >= 1 39 | func countLeadingBits(maxBits: Int = MemoryLayout.size * 8) -> Int 40 | { 41 | assert(maxBits >= 0 && maxBits <= MemoryLayout.size * 8) 42 | let match = self & 1 43 | var count = 1 44 | for i in 1..> i) & 1 != match { break } 47 | count += 1 48 | } 49 | 50 | return count 51 | } 52 | 53 | // Returns the number of bits that are set 54 | // 55 | // IMPORTANT: This method only works for positive values 56 | func countSetBits() -> Int 57 | { 58 | var value = self 59 | var count = 0 60 | while value > 0 61 | { 62 | if (value & 1) == 1 { count += 1} 63 | value = value >> 1 64 | } 65 | return count 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/MediaViewportProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MediaViewportProvider.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 04/18/18. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | /// The Media Viewport Provider is responsible for displaying the the `DebugBuffer` view of the scanning and decoding process. This 14 | /// includes the display of a block of scanning statistics (a `ResultStats` instance). 15 | public protocol MediaViewportProvider 16 | { 17 | /// Displays the debug buffer image 18 | /// 19 | /// Implementors should copy the image buffer and not rely on its memory beyond the extend of this call. In addition, it should 20 | /// check for changes in the image's dimensions (as the media may have changed since the last call) and react accordingly. 21 | func updateLocalViewport(debugBuffer: DebugBuffer?) 22 | 23 | /// Receives a `ResultsStats` display updates to the user 24 | func updateStats(analysisResult: AnalysisResult, stats: ResultStats) 25 | 26 | /// Provides a mechanism for saving the `DebugBuffer` as a color image (such as PNG or JPG.) 27 | /// 28 | /// This method is similar to `MediaProvider.archiveFrame()` except that this method stores the debug buffer, which may have 29 | /// color debug information drawn within that can be useful for, well, debugging. 30 | func writeViewport() 31 | } 32 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/Numeric.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Numeric.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 3/31/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | // --------------------------------------------------------------------------------------------------------------------------------- 16 | // Numeric types 17 | // --------------------------------------------------------------------------------------------------------------------------------- 18 | 19 | /// Our real number type 20 | public typealias Real = Float 21 | 22 | // --------------------------------------------------------------------------------------------------------------------------------- 23 | // Range clamping 24 | // --------------------------------------------------------------------------------------------------------------------------------- 25 | 26 | /// Clamp: "combining min & max since 1026" 27 | @inline(__always) public func clamp(_ x: T, _ min: T, _ max: T) -> T 28 | { 29 | return Swift.min(max, Swift.max(min, x)) 30 | } 31 | -------------------------------------------------------------------------------- /Sources/Seer/Seer/Seer.h: -------------------------------------------------------------------------------- 1 | // 2 | // Seer.h 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 4/1/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #import 14 | 15 | // In this header, you should import all the public headers of your framework using statements like #import 16 | -------------------------------------------------------------------------------- /Sources/Seer/SystemModules/C_libpng.build/cheader.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | -------------------------------------------------------------------------------- /Sources/Seer/SystemModules/C_libpng.build/module.modulemap: -------------------------------------------------------------------------------- 1 | module C_libpng [system] 2 | { 3 | header "cheader.h" 4 | link "png" 5 | export * 6 | } 7 | -------------------------------------------------------------------------------- /Sources/Steve/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - for_where 3 | - opening_brace 4 | - identifier_name 5 | - line_length 6 | - file_length 7 | - function_body_length 8 | - cyclomatic_complexity 9 | - type_body_length 10 | - statement_position 11 | - function_parameter_count 12 | - large_tuple 13 | - trailing_comma 14 | - switch_case_alignment 15 | - closure_parameter_position 16 | - nesting 17 | - legacy_hashing 18 | - unused_setter_value 19 | - comment_spacing 20 | -------------------------------------------------------------------------------- /Sources/Steve/Steve.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/Steve/Steve.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Steve/Steve.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "icon-16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "icon-33.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "icon-32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "icon-64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "icon-128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "icon-257.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "icon-256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "icon-513.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "icon-512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "icon-1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-1024.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-128.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-16.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-256.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-257.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-32.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-33.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-512.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-513.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-513.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/Sources/Steve/Steve/Assets.xcassets/AppIcon.appiconset/icon-64.png -------------------------------------------------------------------------------- /Sources/Steve/Steve/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Sources/Steve/Steve/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | public.app-category.entertainment 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2022 Paul Nettle. All rights reserved. 29 | NSMainStoryboardFile 30 | Main 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /Sources/Steve/Steve/Reference/inter6.quick-random-movements.mp4: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:249987100529d8494e6e3662ef9a77d7e2c5807dd56f95545ea8ea79b2ace1fc 3 | size 30049781 4 | -------------------------------------------------------------------------------- /Sources/Steve/Steve/Reference/inter6.slow-in-out.mp4: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e6ba644f2cf3f5b05a8337f24235c75a828de76520931f1ac297d805bdb26438 3 | size 54727584 4 | -------------------------------------------------------------------------------- /Sources/Steve/Steve/Reference/mds12-56b.mp4: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e7985e85ac45f9a61c11eef7a9466759babdce1f43c78c49680fc0d05511095d 3 | size 10747441 4 | -------------------------------------------------------------------------------- /Sources/Steve/Steve/Steve.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.disable-library-validation 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Steve/Steve/SteveAppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SteveAppDelegate.swift 3 | // Steve 4 | // 5 | // Created by Paul Nettle on 11/7/16. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Cocoa 14 | import Seer 15 | 16 | @NSApplicationMain 17 | class SteveAppDelegate: NSObject, NSApplicationDelegate 18 | { 19 | func applicationDidFinishLaunching(_ aNotification: Notification) 20 | { 21 | } 22 | 23 | func applicationWillTerminate(_ aNotification: Notification) 24 | { 25 | // _ = Config.write() 26 | } 27 | 28 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool 29 | { 30 | return true 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Sources/Steve/Steve/SteveWindow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SteveWindow.swift 3 | // Steve 4 | // 5 | // Created by Paul Nettle on 3/24/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | import Seer 15 | import AppKit 16 | import Minion 17 | 18 | final class SteveWindow: NSWindow 19 | { 20 | override func close() 21 | { 22 | gLogger.stop(broadcastMessage: ">>> Session ended") 23 | super.close() 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/magic.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18 | 19 | 21 | 22 | 24 | 25 | 27 | 28 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Sources/magic.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/mdscodes/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - for_where 3 | - opening_brace 4 | - identifier_name 5 | - line_length 6 | - file_length 7 | - function_body_length 8 | - cyclomatic_complexity 9 | - type_body_length 10 | - statement_position 11 | - function_parameter_count 12 | - large_tuple 13 | - trailing_comma 14 | - switch_case_alignment 15 | - closure_parameter_position 16 | - nesting 17 | - legacy_hashing 18 | - unused_setter_value 19 | - comment_spacing 20 | -------------------------------------------------------------------------------- /Sources/mdscodes/mdscodes.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/mdscodes/mdscodes.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/mdscodes/mdscodes.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/mdscodes/mdscodes/mdscodes.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.disable-library-validation 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/whisper/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - for_where 3 | - opening_brace 4 | - identifier_name 5 | - line_length 6 | - file_length 7 | - function_body_length 8 | - cyclomatic_complexity 9 | - type_body_length 10 | - statement_position 11 | - function_parameter_count 12 | - large_tuple 13 | - trailing_comma 14 | - switch_case_alignment 15 | - closure_parameter_position 16 | - nesting 17 | - legacy_hashing 18 | - unused_setter_value 19 | - comment_spacing 20 | -------------------------------------------------------------------------------- /Sources/whisper/SystemModules/C_AAlib.build/cheader.h: -------------------------------------------------------------------------------- 1 | #include 2 | -------------------------------------------------------------------------------- /Sources/whisper/SystemModules/C_AAlib.build/module.modulemap: -------------------------------------------------------------------------------- 1 | module C_AAlib [system] 2 | { 3 | header "cheader.h" 4 | link "aa" 5 | export * 6 | } 7 | -------------------------------------------------------------------------------- /Sources/whisper/SystemModules/C_Libav.build/cheader.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | -------------------------------------------------------------------------------- /Sources/whisper/SystemModules/C_Libav.build/module.modulemap: -------------------------------------------------------------------------------- 1 | module C_Libav [system] 2 | { 3 | header "cheader.h" 4 | link "avcodec" 5 | link "avutil" 6 | link "avformat" 7 | export * 8 | } 9 | -------------------------------------------------------------------------------- /Sources/whisper/SystemModules/C_ncurses.build/cheader.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include -------------------------------------------------------------------------------- /Sources/whisper/SystemModules/C_ncurses.build/module.modulemap: -------------------------------------------------------------------------------- 1 | module C_ncurses [system] 2 | { 3 | header "cheader.h" 4 | link "ncurses" 5 | export * 6 | } 7 | -------------------------------------------------------------------------------- /Sources/whisper/whisper.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/whisper/whisper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/whisper/whisper.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/whisper/whisper/Signals.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Signals.swift 3 | // Whisper 4 | // 5 | // Created by Paul Nettle on 4/2/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | #if os(Linux) 14 | import Glibc 15 | #elseif os(macOS) 16 | import Darwin 17 | #endif 18 | 19 | internal enum Signal: Int32 20 | { 21 | case HUP = 1 22 | case INT = 2 23 | case QUIT = 3 24 | case ILL = 4 25 | case TRAP = 5 26 | case ABRT = 6 27 | case EMT = 7 28 | case FPE = 8 29 | case KILL = 9 30 | case BUS = 10 31 | case SEGV = 11 32 | case SYS = 12 33 | case PIPE = 13 34 | case ALRM = 14 35 | case TERM = 15 36 | case URG = 16 37 | case STOP = 17 38 | case TSTP = 18 39 | case CONT = 19 40 | case CHLD = 20 41 | case TTIN = 21 42 | case TTOU = 22 43 | case IO = 23 44 | case XCPU = 24 45 | case XFSZ = 25 46 | case VTALRM = 26 47 | case PROF = 27 48 | case WINCH = 28 49 | case INFO = 29 50 | case USR1 = 30 51 | case USR2 = 31 52 | } 53 | 54 | typealias SigactionHandler = @convention(c)(Int32) -> Void 55 | 56 | internal func trap(signum: Signal, action: @escaping SigactionHandler) 57 | { 58 | #if os(Linux) 59 | var sigAction = sigaction() 60 | sigAction.__sigaction_handler = unsafeBitCast(action, to: sigaction.__Unnamed_union___sigaction_handler.self) 61 | sigaction(signum.rawValue, &sigAction, nil) 62 | #elseif os(macOS) 63 | // From Swift, sigaction.init() collides with the Darwin.sigaction() function. 64 | // This local typealias allows us to disambiguate them. 65 | typealias SignalAction = sigaction 66 | 67 | var signalAction = SignalAction(__sigaction_u: unsafeBitCast(action, to: __sigaction_u.self), sa_mask: 0, sa_flags: 0) 68 | 69 | withUnsafePointer(to: &signalAction) 70 | { actionPointer -> Void in 71 | sigaction(signum.rawValue, actionPointer, nil) 72 | } 73 | #endif 74 | } 75 | -------------------------------------------------------------------------------- /Sources/whisper/whisper/VideoDecodeError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VideoDecodeError.swift 3 | // Seer 4 | // 5 | // Created by Paul Nettle on 3/31/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | 15 | enum VideoDecodeError: Error 16 | { 17 | case Frame(String) 18 | case IO(String) 19 | case Stream(String) 20 | case Codec(String) 21 | 22 | var localizedDescription: String 23 | { 24 | switch self 25 | { 26 | case .Frame(let str): 27 | return "VideoDecodeError.Frame: \(str)" 28 | case .IO(let str): 29 | return "VideoDecodeError.IO: \(str)" 30 | case .Stream(let str): 31 | return "VideoDecodeError.Stream: \(str)" 32 | case .Codec(let str): 33 | return "VideoDecodeError.Codec: \(str)" 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Sources/whisper/whisper/WhisperServerPeer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WhisperServerPeer.swift 3 | // Whisper 4 | // 5 | // Created by Paul Nettle on 2/23/18. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | import Foundation 14 | import Minion 15 | import Seer 16 | 17 | /// Our application-specific `ServerPeer` implementation, handling payloads specific to Whisper 18 | public class WhisperServerPeer: SeerServerPeer 19 | { 20 | /// A factory for creating `WhisperServerPeer` instances 21 | /// 22 | /// This is used when starting an instance of `Server` (via `Server`'s `start` method) 23 | public static func createWhisperServerPeer(socketAddress: Ipv4SocketAddress, server: Server) -> WhisperServerPeer? 24 | { 25 | return WhisperServerPeer(socketAddress: socketAddress, server: server) 26 | } 27 | 28 | /// Custom code to send information to clients when they connect 29 | public override func onServerConnect(from socketAddress: Ipv4SocketAddress) 30 | { 31 | super.onServerConnect(from: socketAddress) 32 | 33 | guard let socket = self.socket else 34 | { 35 | gLogger.error("WhisperServerPeer.onServerConnect: Server connection received ping, but does not appear to be connected (no socket)") 36 | return 37 | } 38 | 39 | let connMessage = ServerConnectMessage(versions: ["Whisper": whisperVersion, "Minion": MinionVersion, "Seer": SeerVersion]) 40 | if !(connMessage.getPayload()?.send(to: socketAddress, over: socket) ?? false) 41 | { 42 | gLogger.warn("WhisperServerPeer.onServerConnect: Failed to send ServerConnect message") 43 | } 44 | } 45 | 46 | /// Provides access to the active `MediaProvider` 47 | public override func getMediaProvider() -> MediaProvider? 48 | { 49 | return Whisper.instance.mediaProvider 50 | } 51 | 52 | public override func onSystemShutdown() 53 | { 54 | Whisper.systemShutdown() 55 | } 56 | 57 | public override func onSystemReboot() 58 | { 59 | Whisper.systemReboot() 60 | } 61 | 62 | public override func onCheckForUpdates() 63 | { 64 | Whisper.checkForUpdates() 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Sources/whisper/whisper/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // Whisper 4 | // 5 | // Created by Paul Nettle on 8/31/17. 6 | // 7 | // This file is part of The Nettle Magic Project. 8 | // Copyright © 2022 Paul Nettle. All rights reserved. 9 | // 10 | // Use of this source code is governed by a BSD-style license that can be found 11 | // in the LICENSE file in the root of the source tree. 12 | 13 | Whisper.instance.run() 14 | -------------------------------------------------------------------------------- /Sources/whisper/whisper/whisper.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.disable-library-validation 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /docs/DEPS.linux: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------------------------------------------------------------------------ 2 | LINUX DEPENDENCIES 3 | ------------------------------------------------------------------------------------------------------------------------------------ 4 | 5 | SDK: 6 | 7 | clang libpng-dev libncurses5-dev libaa1-dev libavcodec-dev libavformat-dev 8 | 9 | Auto-update support: 10 | 11 | curl 12 | 13 | Quality of life: 14 | 15 | tmux 16 | -------------------------------------------------------------------------------- /docs/_img-master/intro-stages.psd: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ebff9079c6e0ef116effb5918a342ca8a9f91c5d7e075bb21cd7efa166c4a792 3 | size 48499009 4 | -------------------------------------------------------------------------------- /docs/_img-master/shuffle.psd: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5cbc025b8f6447feb71a0d7949afb4bff620b7954da6f194696c5cedaf8808de 3 | size 162198 4 | -------------------------------------------------------------------------------- /docs/_img-master/stamp-generation.psd: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ab8a103af5c81a621f235a12243c4d83c27b1ece2171f5b1d1e5ec228ed0dc9e 3 | size 39051974 4 | -------------------------------------------------------------------------------- /docs/_img-master/temporal_grid.psd: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f1f148165d73bfe4832aebbe329a5b13f2a544773a6973cde42447be687a2b9a 3 | size 18798722 4 | -------------------------------------------------------------------------------- /docs/img/abra_ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/abra_ipad.png -------------------------------------------------------------------------------- /docs/img/contour-landmarks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/contour-landmarks.png -------------------------------------------------------------------------------- /docs/img/contour-mark-lines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/contour-mark-lines.png -------------------------------------------------------------------------------- /docs/img/deck-locations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/deck-locations.png -------------------------------------------------------------------------------- /docs/img/deck_extents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/deck_extents.png -------------------------------------------------------------------------------- /docs/img/deck_under_ir.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/deck_under_ir.jpg -------------------------------------------------------------------------------- /docs/img/device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/device.png -------------------------------------------------------------------------------- /docs/img/error-correction-viz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/error-correction-viz.png -------------------------------------------------------------------------------- /docs/img/ink_comparison.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/ink_comparison.jpg -------------------------------------------------------------------------------- /docs/img/intro-stages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/intro-stages.png -------------------------------------------------------------------------------- /docs/img/manual-marks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/manual-marks.jpg -------------------------------------------------------------------------------- /docs/img/manual-process.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/manual-process.jpg -------------------------------------------------------------------------------- /docs/img/marking-r&d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/marking-r&d.jpg -------------------------------------------------------------------------------- /docs/img/mds18-54-rubberstamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/mds18-54-rubberstamp.png -------------------------------------------------------------------------------- /docs/img/search_grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/search_grid.png -------------------------------------------------------------------------------- /docs/img/search_line_edge_detect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/search_line_edge_detect.png -------------------------------------------------------------------------------- /docs/img/sharpness-graphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/sharpness-graphs.png -------------------------------------------------------------------------------- /docs/img/shuffle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/shuffle.png -------------------------------------------------------------------------------- /docs/img/stamp-generation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/stamp-generation.png -------------------------------------------------------------------------------- /docs/img/stamp-rig.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/stamp-rig.jpg -------------------------------------------------------------------------------- /docs/img/stamped-deck.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/stamped-deck.jpg -------------------------------------------------------------------------------- /docs/img/steve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/steve.png -------------------------------------------------------------------------------- /docs/img/temporal_grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/temporal_grid.png -------------------------------------------------------------------------------- /docs/img/uv-ink.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/uv-ink.jpg -------------------------------------------------------------------------------- /docs/img/whisper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nettlep/magic/2642ecc54b26b8f2173fbd16f730c92d6cbc072f/docs/img/whisper.png -------------------------------------------------------------------------------- /tools/slint: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ ! -z $1 ]]; then 4 | pathOpt="--path $1" 5 | fi 6 | 7 | if which swiftlint >/dev/null; then 8 | swiftlint lint --quiet $pathOpt 9 | else 10 | echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" 11 | fi --------------------------------------------------------------------------------