# Project export: LingoSnap

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: Cal Hacks 11.0
- Tagline: Capture the world in any language! With Snapchat Spectacles, LingoSnap detects objects and instantly translates them into any language, making communication easier than ever. It all clicks!
- Devpost: https://devpost.com/software/lingosnap
- GitHub: https://github.com/b-jonathan/lingosnap
- Team: 3 GitHub contributor(s) — shannonaurl (2 commits), Brandon G Jonathan (1 commits), arthurlw (1 commits)

## Devpost submission (written by the team)

### Inspiration

There was a story about a Grandpa who learnt how to speak English by placing Post-it notes on everything he could get his hands on, just to converse with his grandsons and grand-daughters that lived far away. This let him actively remember the words because he was always looking at the words. With the invention of the Spectacle, we figured we could utilize this method and make this accessible to everyone so that everyone can actively learn while going through their daily life.

### What it does

Using the power of the Spectacles, we created an application that uses a ML model that can detect common objects and classify it under its name and also a translation in the chosen language. This would work as a flashcard so that users can gamify their learning experience. Furthermore, users can screenshot the object which will save it on their phone so that they can access the word and translation anywhere they want.

### How we built it

For the Spectacles, we used Snapchat's propietary Lens Studio to create the interface for our application. By integrating our app with SnapML and the object detection models in its asset library, we were able to create a model that could detect objects and shoot a flashcard on top of it. We also utilized PocketBase and Swift for the application part of our project which integrated quite well with the Spectacles.

### Challenges we ran into

Lens Studio recently got a major update to allow for easier development for Spectacle apps but its recency caused there to be limited documentation of what we could achieve. Alongside the fact that it was our first time working with anything similar to Lens Studio, a lot of our time was committed to learning how it worked.

### Accomplishments we're proud of

We managed to create an Object Detection Model that successfully tracks the objects around us. Created a cohesive Spectacle application that was able to integrate with mobile devices.

### What we learned

This was all of out first times learning how to develop for a tool like the Spectacle. It gave us a new angle to approach any future problems and give us first-hand experience to the workflow of someone developing on AR and ML. We also learnt a lot from conversing with the Snapchat team and their struggles and successes with Lens Studio.

### What's next

While the app is cohesive, it is still currently in need of more features. We are planning to add voice recognition so that users will be able to practice their pronunciation as well. Furthermore, it would be nice to gamify the app to allow users to continue learning while also having fun. Also, the final goal would be to have the application fully on spectacle and this includes features such as viewing past images and conversations.

## README (from the GitHub repository)

# lingosnap

## Detected evidence (automated analysis)

Indexed codebase: 63 recognized source files, 844 KB.
- C (language) — detected in the code
- JavaScript (language) — detected in the code
- Swift (language) — detected in the code
- TypeScript (language) — detected in the code

## Codebase structure (from repository index)

### Files (120 of 138)

```
.DS_Store
calhackstry.esproj
README.md
Swift_PocketBase/.DS_Store
Swift_PocketBase/pb_data/data.db
Swift_PocketBase/pb_data/logs.db
Swift_PocketBase/pb_data/storage/caaaobw450vplmg/5sed1ljwre8v51q/thumbs_whats_app_image_2024_10_20_at_09_52_gpKMvz5ePr.21.jpeg/100x100_whats_app_image_2024_10_20_at_09_52_gpKMvz5ePr.21.jpeg.attrs
Swift_PocketBase/pb_data/storage/caaaobw450vplmg/5sed1ljwre8v51q/whats_app_image_2024_10_20_at_09_52_gpKMvz5ePr.21.jpeg.attrs
Swift_PocketBase/pb_data/storage/caaaobw450vplmg/frenuhcgn4kq9ld/thumbs_whats_app_image_2024_10_20_at_9_52_utmdByUJe0.31AM.jpeg/100x100_whats_app_image_2024_10_20_at_9_52_utmdByUJe0.31AM.jpeg.attrs
Swift_PocketBase/pb_data/storage/caaaobw450vplmg/frenuhcgn4kq9ld/whats_app_image_2024_10_20_at_9_52_utmdByUJe0.31AM.jpeg.attrs
Swift_PocketBase/pb_data/storage/caaaobw450vplmg/z9ckn6t6vfo8twj/thumbs_whats_app_image_2024_10_20_at_9_52_FbkkJVFOjv.28AM.jpeg/100x100_whats_app_image_2024_10_20_at_9_52_FbkkJVFOjv.28AM.jpeg.attrs
Swift_PocketBase/pb_data/storage/caaaobw450vplmg/z9ckn6t6vfo8twj/whats_app_image_2024_10_20_at_9_52_FbkkJVFOjv.28AM.jpeg.attrs
Swift_PocketBase/pb_data/types.d.ts
Swift_PocketBase/pb_migrations/1729368541_created_images.js
Swift_PocketBase/pb_migrations/1729368740_updated_images.js
Swift_PocketBase/pb_migrations/1729373962_updated_images.js
Swift_PocketBase/pb_migrations/1729373992_updated_users.js
Swift_PocketBase/pocketbase
Swift_PocketBase/Podfile
Swift_PocketBase/Podfile.lock
Swift_PocketBase/Pods/Manifest.lock
Swift_PocketBase/Pods/Pods.xcodeproj/project.pbxproj
Swift_PocketBase/Pods/Pods.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/Pods-uikitpager-uikitpagerUITests.xcscheme
Swift_PocketBase/Pods/Pods.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/Pods-uikitpager.xcscheme
Swift_PocketBase/Pods/Pods.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/Pods-uikitpagerTests.xcscheme
Swift_PocketBase/Pods/Pods.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/SnapKit-SnapKit_Privacy.xcscheme
Swift_PocketBase/Pods/Pods.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/SnapKit.xcscheme
Swift_PocketBase/Pods/Pods.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist
Swift_PocketBase/Pods/SnapKit/LICENSE
Swift_PocketBase/Pods/SnapKit/README.md
Swift_PocketBase/Pods/SnapKit/Sources/Constraint.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintAttributes.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintConfig.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintConstantTarget.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintDescription.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintDirectionalInsets.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintDirectionalInsetTarget.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintDSL.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintInsets.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintInsetTarget.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintItem.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintLayoutGuide.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintLayoutGuide+Extensions.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintLayoutGuideDSL.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintLayoutSupport.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintLayoutSupportDSL.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintMaker.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintMakerEditable.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintMakerExtendable.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintMakerFinalizable.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintMakerPrioritizable.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintMakerRelatable.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintMakerRelatable+Extensions.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintMultiplierTarget.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintOffsetTarget.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintPriority.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintPriorityTarget.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintRelatableTarget.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintRelation.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintView.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintView+Extensions.swift
Swift_PocketBase/Pods/SnapKit/Sources/ConstraintViewDSL.swift
Swift_PocketBase/Pods/SnapKit/Sources/Debugging.swift
Swift_PocketBase/Pods/SnapKit/Sources/LayoutConstraint.swift
Swift_PocketBase/Pods/SnapKit/Sources/LayoutConstraintItem.swift
Swift_PocketBase/Pods/SnapKit/Sources/PrivacyInfo.xcprivacy
Swift_PocketBase/Pods/SnapKit/Sources/Typealiases.swift
Swift_PocketBase/Pods/SnapKit/Sources/UILayoutSupport+Extensions.swift
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-acknowledgements.markdown
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-acknowledgements.plist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-dummy.m
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-frameworks-Debug-input-files.xcfilelist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-frameworks-Debug-output-files.xcfilelist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-frameworks-Release-input-files.xcfilelist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-frameworks-Release-output-files.xcfilelist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-frameworks.sh
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-Info.plist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests-umbrella.h
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests.debug.xcconfig
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests.modulemap
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager-uikitpagerUITests/Pods-uikitpager-uikitpagerUITests.release.xcconfig
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-acknowledgements.markdown
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-acknowledgements.plist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-dummy.m
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-frameworks-Debug-input-files.xcfilelist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-frameworks-Debug-output-files.xcfilelist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-frameworks-Release-input-files.xcfilelist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-frameworks-Release-output-files.xcfilelist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-frameworks.sh
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-Info.plist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager-umbrella.h
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager.debug.xcconfig
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager.modulemap
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpager/Pods-uikitpager.release.xcconfig
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpagerTests/Pods-uikitpagerTests-acknowledgements.markdown
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpagerTests/Pods-uikitpagerTests-acknowledgements.plist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpagerTests/Pods-uikitpagerTests-dummy.m
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpagerTests/Pods-uikitpagerTests-Info.plist
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpagerTests/Pods-uikitpagerTests-umbrella.h
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpagerTests/Pods-uikitpagerTests.debug.xcconfig
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpagerTests/Pods-uikitpagerTests.modulemap
Swift_PocketBase/Pods/Target Support Files/Pods-uikitpagerTests/Pods-uikitpagerTests.release.xcconfig
Swift_PocketBase/Pods/Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist
Swift_PocketBase/Pods/Target Support Files/SnapKit/SnapKit-dummy.m
Swift_PocketBase/Pods/Target Support Files/SnapKit/SnapKit-Info.plist
Swift_PocketBase/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch
Swift_PocketBase/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h
Swift_PocketBase/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig
Swift_PocketBase/Pods/Target Support Files/SnapKit/SnapKit.modulemap
Swift_PocketBase/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig
Swift_PocketBase/README.md
Swift_PocketBase/uikitpager.xcodeproj/project.pbxproj
Swift_PocketBase/uikitpager.xcodeproj/project.xcworkspace/contents.xcworkspacedata
Swift_PocketBase/uikitpager.xcodeproj/project.xcworkspace/xcuserdata/user.xcuserdatad/UserInterfaceState.xcuserstate
Swift_PocketBase/uikitpager.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist
Swift_PocketBase/uikitpager.xcworkspace/contents.xcworkspacedata
Swift_PocketBase/uikitpager.xcworkspace/xcuserdata/user.xcuserdatad/UserInterfaceState.xcuserstate
Swift_PocketBase/uikitpager/AppDelegate.swift
Swift_PocketBase/uikitpager/Assets.xcassets/AccentColor.colorset/Contents.json
Swift_PocketBase/uikitpager/Assets.xcassets/AppIcon.appiconset/Contents.json
[18 more files omitted for size]
```

### Dependencies

No dependency index available.

### Recent commits (newest first)

- swift and pocketbase implementation
- Add files via upload
- Lens Studio
- Initial commit

## Key source files (fetched from GitHub, selected and truncated for size)

### Window Popup 2.js

```javascript
//@input SceneObjec window

function toggle(){
    for (var i =0; i < script.windows.length; i++){
        script.windows.enabled[i] = !script.windows.enabled[i];
    }
    
}

script.toggle = toggle;
```

### Window Popup.js

```javascript
//@input SceneObject[] windows
//@input SceneObject[] windows2
// @input SceneObject windowParent
// @input SceneObject windowParent2

var count = 0;
var count2 = 0;

function toggleOG(){   
    if(count > 0){
        var i = count - 1;
        script.windows[i].enabled = false;
    } 
    
    for (let i = 0; i < script.windows.length; i++){
        script.windows[count].enabled = true;       
    }

    count++;
    print(count);
}

function toggleOG2(){   
    if(count2 > 0){
        var i = count2 - 1;
        script.windows2[i].enabled = false;
    } 
    
    for (let i = 0; i < script.windows2.length; i++){
        script.windows2[count2].enabled = true;       
    }

    count2++;
    print(count2);
}

function toggleWindow() {
    for (i = 0; i < script.windows.length; i++){
        script.windows[currentWindowIndex].enabled = true; 
    }
    script.windowParent.enabled = !script.windowParent.enabled;
}

function toggleWindow2() {
    for (i = 0; i < script.windows2.length; i++){
        script.windows2[currentWindowIndex2].enabled = true; 
    }
    script.windowParent2.enabled = !script.windowParent2.enabled;
}

var currentWindowIndex = 0;
var currentWindowIndex2 = 0;

function nextWindow() {
    // hide all windows
    for (i = 0; i < script.windows.length; i++){
        script.windows[currentWindowIndex].enabled = false; 
    }
    
    
    // increment window index
    currentWindowIndex++;
    print(currentWindowIndex);
    
    if (currentWindowIndex < script.windows.length) {
        script.windows[currentWindowIndex].enabled = true;
    }
    
    // if index > array legnth, close everything
    if (currentWindowIndex == script.windows.length) {
        currentWindowIndex = 0;  
        for (i = 0; i < script.windows.length; i++){
            script.windows[i].enabled = false;       
        }
        script.windowParent.enabled = false;
        print("done");
    }
    
    
    // if index < array length, enable window based on index
    
}

function nextWindow2() {
    // hide all windows
    for (i = 0; i < script.windows2.length; i++){
        script.windows2[currentWindowIndex2].enabled = false; 
    }
    
    
    // increment window index
    currentWindowIndex2++;
    print(currentWindowIndex2);
    
    if (currentWindowIndex2 < script.windows2.length) {
        script.windows2[currentWindowIndex2].enabled = true;
    }
    
    // if index > array legnth, close everything
    if (currentWindowIndex2 == script.windows2.length) {
        currentWindowIndex2 = 0;  
        for (i = 0; i < script.windows2.length; i++){
            script.windows2[i].enabled = false;       
        }
        script.windowParent2.enabled = false;
        print("done");
    }
    
    
    // if index < array length, enable window based on index
    
}
function onStart() {
    print("starting up")
    script.windowParent.enabled = false;
    script.windowParent2.enabled = false;
    script.windows[currentWindowIndex].enabled = true;
    script.windows2[currentWindowIndex2].enabled = true;
    print("started up")
}


// script.toggle = toggleOG;
script.toggleWindow = toggleWindow;
script.toggleWindow2 = toggleWindow2;
script.nextWindow = nextWindow;
script.nextWindow2 = nextWindow2;


onStart();
```

### Swift_PocketBase/uikitpager/ViewController.swift

```swift
//
//  ViewController.swift
//  uikitpager
//
//  Created by User on 10/19/24.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}


```

### Swift_PocketBase/uikitpagerTests/uikitpagerTests.swift

```swift
//
//  uikitpagerTests.swift
//  uikitpagerTests
//
//  Created by User on 10/19/24.
//

import Testing
@testable import uikitpager

struct uikitpagerTests {

    @Test func example() async throws {
        // Write your test here and use APIs like `#expect(...)` to check expected conditions.
    }

}

```

### Swift_PocketBase/pb_migrations/1729373962_updated_images.js

```javascript
/// <reference path="../pb_data/types.d.ts" />
migrate((db) => {
  const dao = new Dao(db)
  const collection = dao.findCollectionByNameOrId("caaaobw450vplmg")

  collection.listRule = ""
  collection.viewRule = ""
  collection.createRule = ""
  collection.updateRule = ""
  collection.deleteRule = ""

  return dao.saveCollection(collection)
}, (db) => {
  const dao = new Dao(db)
  const collection = dao.findCollectionByNameOrId("caaaobw450vplmg")

  collection.listRule = null
  collection.viewRule = null
  collection.createRule = null
  collection.updateRule = null
  collection.deleteRule = null

  return dao.saveCollection(collection)
})

```

### Swift_PocketBase/pb_migrations/1729373992_updated_users.js

```javascript
/// <reference path="../pb_data/types.d.ts" />
migrate((db) => {
  const dao = new Dao(db)
  const collection = dao.findCollectionByNameOrId("_pb_users_auth_")

  collection.listRule = ""
  collection.viewRule = ""
  collection.updateRule = ""
  collection.deleteRule = ""

  return dao.saveCollection(collection)
}, (db) => {
  const dao = new Dao(db)
  const collection = dao.findCollectionByNameOrId("_pb_users_auth_")

  collection.listRule = "id = @request.auth.id"
  collection.viewRule = "id = @request.auth.id"
  collection.updateRule = "id = @request.auth.id"
  collection.deleteRule = "id = @request.auth.id"

  return dao.saveCollection(collection)
})

```

### Swift_PocketBase/uikitpagerUITests/uikitpagerUITestsLaunchTests.swift

```swift
//
//  uikitpagerUITestsLaunchTests.swift
//  uikitpagerUITests
//
//  Created by User on 10/19/24.
//

import XCTest

final class uikitpagerUITestsLaunchTests: XCTestCase {

    override class var runsForEachTargetApplicationUIConfiguration: Bool {
        true
    }

    override func setUpWithError() throws {
        continueAfterFailure = false
    }

    @MainActor
    func testLaunch() throws {
        let app = XCUIApplication()
        app.launch()

        // Insert steps here to perform after app launch but before taking a screenshot,
        // such as logging into a test account or navigating somewhere in the app

        let attachment = XCTAttachment(screenshot: app.screenshot())
        attachment.name = "Launch Screen"
        attachment.lifetime = .keepAlways
        add(attachment)
    }
}

```

### Swift_PocketBase/pb_migrations/1729368740_updated_images.js

```javascript
/// <reference path="../pb_data/types.d.ts" />
migrate((db) => {
  const dao = new Dao(db)
  const collection = dao.findCollectionByNameOrId("caaaobw450vplmg")

  // update
  collection.schema.addField(new SchemaField({
    "system": false,
    "id": "r6bblldm",
    "name": "image",
    "type": "file",
    "required": false,
    "presentable": false,
    "unique": false,
    "options": {
      "mimeTypes": [],
      "thumbs": [],
      "maxSelect": 1,
      "maxSize": 5242880,
      "protected": false
    }
  }))

  return dao.saveCollection(collection)
}, (db) => {
  const dao = new Dao(db)
  const collection = dao.findCollectionByNameOrId("caaaobw450vplmg")

  // update
  collection.schema.addField(new SchemaField({
    "system": false,
    "id": "r6bblldm",
    "name": "field",
    "type": "file",
    "required": false,
    "presentable": false,
    "unique": false,
    "options": {
      "mimeTypes": [],
      "thumbs": [],
      "maxSelect": 1,
      "maxSize": 5242880,
      "protected": false
    }
  }))

  return dao.saveCollection(collection)
})

```

### Swift_PocketBase/uikitpager/AppDelegate.swift

```swift
//
//  AppDelegate.swift
//  uikitpager
//
//  Created by User on 10/19/24.
//

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }


}


```

### Swift_PocketBase/uikitpagerUITests/uikitpagerUITests.swift

```swift
//
//  uikitpagerUITests.swift
//  uikitpagerUITests
//
//  Created by User on 10/19/24.
//

import XCTest

final class uikitpagerUITests: XCTestCase {

    override func setUpWithError() throws {
        // Put setup code here. This method is called before the invocation of each test method in the class.

        // In UI tests it is usually best to stop immediately when a failure occurs.
        continueAfterFailure = false

        // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
    }

    override func tearDownWithError() throws {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
    }

    @MainActor
    func testExample() throws {
        // UI tests must launch the application that they test.
        let app = XCUIApplication()
        app.launch()

        // Use XCTAssert and related functions to verify your tests produce the correct results.
    }

    @MainActor
    func testLaunchPerformance() throws {
        if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
            // This measures how long it takes to launch your application.
            measure(metrics: [XCTApplicationLaunchMetric()]) {
                XCUIApplication().launch()
            }
        }
    }
}

```

[49 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]