diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000..4157440bf2
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+CHANGELOG.md merge=union
\ No newline at end of file
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 0e7f66d918..97184c5c62 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,8 +1,8 @@
# Global code owners - RUM Mobile Team
-* @DataDog/rum-mobile
+* @DataDog/rum-mobile @DataDog/rum-mobile-ios
## Docs
-/docs/ @DataDog/documentation @DataDog/rum-mobile
-*README.md @DataDog/documentation @DataDog/rum-mobile
\ No newline at end of file
+/docs/ @DataDog/documentation @DataDog/rum-mobile
+*README.md @DataDog/documentation @DataDog/rum-mobile
diff --git a/.github/ISSUE_TEMPLATE/BugReport.yml b/.github/ISSUE_TEMPLATE/BugReport.yml
new file mode 100644
index 0000000000..c03c6f1a6d
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/BugReport.yml
@@ -0,0 +1,111 @@
+name: Bug Report
+description: Is the SDK not working as expected? Help us improve by submitting a bug report.
+labels: ["bug"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Ensure you go through our [troubleshooting](https://docs.datadoghq.com/real_user_monitoring/mobile_and_tv_monitoring/troubleshooting/#debugging-1) page before creating a new issue.
+ Before getting started, if the problem is urgent or easier to investigate with access to your organization's data please use our [official support channel](https://www.datadoghq.com/support/).
+ - type: textarea
+ id: description
+ attributes:
+ label: Describe the bug
+ description: Provide a clear and concise description of what the bug is.
+ validations:
+ required: true
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: Reproduction steps
+ description: |
+ Provide a self-contained piece of code demonstrating the bug.
+ For a more complex setup consider creating a small app that showcases the problem.
+ **Note** - Avoid sharing any business logic, credentials or tokens.
+ validations:
+ required: true
+ - type: textarea
+ id: logs
+ attributes:
+ label: SDK logs
+ description: |
+ Please provide console logs before, during and after the bug occurs.
+ validations:
+ required: false
+ - type: textarea
+ id: expected_behavior
+ attributes:
+ label: Expected behavior
+ description: Provide a clear and concise description of what you expected the SDK to do.
+ validations:
+ required: false
+ - type: input
+ id: affected_sdk_versions
+ attributes:
+ label: Affected SDK versions
+ description: What are the SDK versions you're seeing this bug in?
+ validations:
+ required: true
+ - type: input
+ id: last_working_sdk_version
+ attributes:
+ label: Latest working SDK version
+ description: What was the last SDK version that was working as expected?
+ validations:
+ required: true
+ - type: dropdown
+ id: checked_lastest_sdk
+ attributes:
+ label: Did you confirm if the latest SDK version fixes the bug?
+ options:
+ - 'Yes'
+ - 'No'
+ validations:
+ required: true
+ - type: dropdown
+ id: integration_method
+ attributes:
+ label: Integration Methods
+ options:
+ - SPM
+ - Cocoapods
+ - Carthage
+ - XCFramework
+ - Source
+ validations:
+ required: true
+ - type: input
+ id: xcode_version
+ attributes:
+ label: Xcode Version
+ description: e.g. Xcode 11.5 (15C500b), obtained with **xcodebuild -version**
+ - type: input
+ id: swift_version
+ attributes:
+ label: Swift Version
+ description: e.g. Swift 5.9 , obtained with **swift —version**
+ - type: input
+ id: mac_version
+ attributes:
+ label: MacOS Version
+ description: e.g. macOS Catalina 10.15.5 (19F96), obtained with **sw_vers**
+ - type: input
+ id: deployment_targe
+ attributes:
+ label: Deployment Target
+ description: |
+ What is the Deployment Target of your app? e.g. *iOS 12*, *iPhone* + *iPad*
+ - type: textarea
+ id: device_info
+ attributes:
+ label: Device Information
+ description: |
+ What are the common characteristics of devices you're seeing this bug in.
+ Specific models, OS versions, network state (wifi / cellular / offline), power state (plugged in / battery), etc.
+ - type: textarea
+ id: other_info
+ attributes:
+ label: Other relevant information
+ description: |
+ Other relevant information such as additional tooling in place, proxies, etc.
+ Anything that might be relevant for troubleshooting this bug.
diff --git a/.github/ISSUE_TEMPLATE/CrashReport.yml b/.github/ISSUE_TEMPLATE/CrashReport.yml
new file mode 100644
index 0000000000..74204d28b5
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/CrashReport.yml
@@ -0,0 +1,76 @@
+name: Crash Report
+description: Report crashes caused by the SDK.
+labels: ["crash"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Report crashes caused by the SDK. Please try to be as detailed as possible.
+ Before getting started, if the problem is urgent please use our [official support channel](https://www.datadoghq.com/support/).
+ - type: textarea
+ id: stacktrace
+ attributes:
+ label: Stack trace
+ description: Please provide us with the stack trace of the crash or a crash report.
+ validations:
+ required: true
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: Reproduction steps
+ description: |
+ Provide a self-contained piece of code demonstrating the crash if you can.
+ For a more complex setup consider creating a small app that showcases the problem.
+ **Note** - Avoid sharing any business logic, credentials or tokens.
+ validations:
+ required: false
+ - type: input
+ id: volume
+ attributes:
+ label: Volume
+ description: What percentage of your app sessions are impacted with this crash?
+ validations:
+ required: true
+ - type: input
+ id: affected_sdk_versions
+ attributes:
+ label: Affected SDK versions
+ description: What are the SDK versions you're seeing this crash in?
+ validations:
+ required: true
+ - type: input
+ id: last_working_sdk_version
+ attributes:
+ label: Latest working SDK version
+ description: If you know, what was the last SDK version where the crash did manifest itself?
+ validations:
+ required: true
+ - type: dropdown
+ id: checked_lastest_sdk
+ attributes:
+ label: Does the crash manifest in the latest SDK version?
+ options:
+ - 'Yes'
+ - 'No'
+ validations:
+ required: true
+ - type: input
+ id: deployment_targe
+ attributes:
+ label: Deployment Target
+ description: |
+ What is the Deployment Target of your app? e.g. *iOS 12*, *iPhone* + *iPad*
+ - type: textarea
+ id: device_info
+ attributes:
+ label: Device Information
+ description: |
+ What are the common characteristics of devices you're seeing this crash in?
+ Specific models, OS versions, etc.
+ validations:
+ required: false
+ - type: textarea
+ id: other_info
+ attributes:
+ label: Other relevant information
+ description: Anything that might be relevant to pinpoint the source of the crash.
diff --git a/.github/ISSUE_TEMPLATE/FeatureRequest.yml b/.github/ISSUE_TEMPLATE/FeatureRequest.yml
new file mode 100644
index 0000000000..7e7324be4f
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/FeatureRequest.yml
@@ -0,0 +1,32 @@
+name: Feature Request
+description: Have an idea or need a new feature? Request it here.
+labels: ["feature"]
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: Feature description
+ description: |
+ Provide a description for the feature request. Please include:
+ 1. Use case
+ 2. How the SDK currently delivers (or doesn't)
+ 3. What would you like to see
+ validations:
+ required: true
+ - type: textarea
+ id: proposed_solution
+ attributes:
+ label: Proposed solution
+ description: |
+ How would you implement this?
+ Propose an idea, solution or reference implementation.
+ validations:
+ required: false
+ - type: textarea
+ id: other_info
+ attributes:
+ label: Other relevant information
+ description: Any other relevant information you'd like we take into consideration.
+ validations:
+ required: false
+
diff --git a/.github/ISSUE_TEMPLATE/Question.yml b/.github/ISSUE_TEMPLATE/Question.yml
new file mode 100644
index 0000000000..0f286a3568
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Question.yml
@@ -0,0 +1,10 @@
+name: Question
+description: Do you just have a question about the SDK or a product? Ask here.
+labels: ["question"]
+body:
+ - type: textarea
+ id: question
+ attributes:
+ label: Question
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/SetupIssue.yml b/.github/ISSUE_TEMPLATE/SetupIssue.yml
new file mode 100644
index 0000000000..4812eeb0a8
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/SetupIssue.yml
@@ -0,0 +1,81 @@
+name: Setup Issue
+description: Having a hard time setting up the SDK for the first time? Maybe a compilation issue or just nothing seems to be happening. Seek help with this.
+labels: ["compilation issue"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Before creating an issue, please ensure you go through the [troubleshooting page](https://docs.datadoghq.com/real_user_monitoring/mobile_and_tv_monitoring/troubleshooting/#debugging-1).
+ - type: textarea
+ id: issue
+ attributes:
+ label: Describe the issue
+ description: Provide a clear and concise description of the issue. Include compilation logs and SDK debug logs if relevant.
+ validations:
+ required: true
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: Reproduction steps
+ description: |
+ Provide a self-contained piece of code demonstrating the issue.
+ For a more complex setup consider creating a small app that showcases the problem.
+ **Note** - Avoid sharing any business logic, credentials or tokens.
+ validations:
+ required: true
+ - type: textarea
+ id: device_info
+ attributes:
+ label: Device Information
+ description: |
+ What are the common characteristics of devices you're seeing this issue in?
+ Simulators, specific models, OS versions, network state (wifi / cellular / offline), power state (plugged in / battery), etc.
+ validations:
+ required: false
+ - type: input
+ id: sdk_version
+ attributes:
+ label: SDK version
+ description: Which SDK version are you trying to use?
+ validations:
+ required: true
+ - type: dropdown
+ id: integration_method
+ attributes:
+ label: Integration Methods
+ options:
+ - SPM
+ - Cocoapods
+ - Carthage
+ - XCFramework
+ - Source
+ validations:
+ required: true
+ - type: input
+ id: xcode_version
+ attributes:
+ label: Xcode Version
+ description: e.g. Xcode 11.5 (15C500b), obtained with **xcodebuild -version**
+ - type: input
+ id: swift_version
+ attributes:
+ label: Swift Version
+ description: e.g. Swift 5.9 , obtained with **swift —version**
+ - type: input
+ id: mac_version
+ attributes:
+ label: MacOS Version
+ description: e.g. macOS Catalina 10.15.5 (19F96), obtained with **sw_vers**
+ - type: input
+ id: deployment_targe
+ attributes:
+ label: Deployment Target
+ description: |
+ What is the Deployment Target of your app? e.g. *iOS 12*, *iPhone* + *iPad*
+ - type: textarea
+ id: other_info
+ attributes:
+ label: Other relevant information
+ description: |
+ Other relevant information such as additional tooling in place, proxies, etc.
+ Anything that might be relevant for troubleshooting your setup.
diff --git a/.github/ISSUE_TEMPLATE/compilation_issue.md b/.github/ISSUE_TEMPLATE/compilation_issue.md
deleted file mode 100644
index 840e566a2b..0000000000
--- a/.github/ISSUE_TEMPLATE/compilation_issue.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-name: Compilation Issue
-about: Having a Cocoapods / Carthage / SPM problem when linking the SDK?
-title: ''
-labels: compilation issue
-assignees: ''
-
----
-
-### The issue
-
-📝 Give us the error message you receive, describe the problem and answer the questions.
-
----
-
-#### Datadog SDK version:
-
-_Which version of the Datadog SDK causes this problem? e.g. `1.2.0`_
-
-#### Last working Datadog SDK version:
-
-_What is the last Datadog SDK version where this problem didn't occur? e.g. `1.1.0`_
-
-#### Dependency Manager:
-
-_Which dependency manager do you use? e.g. Cocoapods / Carthage / SPM / ..._
-
-#### Other toolset:
-
-_Do you use additional tools with your dependency manager? e.g. [CarthageCache](https://github.com/Wolox/carthage_cache)_
-
-#### Xcode version:
-
-_e.g. `Xcode 11.5 (11E608c)`_
-
-#### Swift version:
-
-_e.g. `5.1`_
-
-#### Deployment Target:
-
-_What is the Deployment Target of your app? e.g. `iOS 12`, `iPhone` + `iPad`_
-
-#### macOS version:
-
-_e.g. `macOS Catalina 10.15.5 (19F96)`_
diff --git a/.github/ISSUE_TEMPLATE/crash_report.md b/.github/ISSUE_TEMPLATE/crash_report.md
deleted file mode 100644
index f32d11f9a0..0000000000
--- a/.github/ISSUE_TEMPLATE/crash_report.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-name: Crash
-about: Noticed the SDK crash?
-title: ''
-labels: crash
-assignees: ''
-
----
-
-### The crash
-
-📝 Give us the crash report or stack trace, describe the problem in details and answer the questions.
-
----
-
-#### Datadog SDK versions:
-
-_Which version(s) of the Datadog SDK you see this crash happening in?_
-
-#### Last stable Datadog SDK version:
-
-_What is the last Datadog SDK version where this crash doesn't happen?_
-
-#### Volume:
-
-_What % of your app sessions is impacted with this crash?_
-
-#### OS version:
-
-_Which iOS versions does this crash happen on?_
-
-#### Deployment Target:
-
-_What is the Deployment Target of your app? e.g. `iOS 12`, `iPhone` + `iPad`_
-
-#### Device version:
-
-_Which devices does this crash happen on? e.g. `iPhone X` only or various iPads_
-
-#### Environment:
-
-_Do you notice any environment correlation in crash reports? e.g. low battery, no internet connection, memory pressure_
diff --git a/.github/ISSUE_TEMPLATE/other.md b/.github/ISSUE_TEMPLATE/other.md
deleted file mode 100644
index 951afbf02c..0000000000
--- a/.github/ISSUE_TEMPLATE/other.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-name: Other
-about: Noticed a bug, having a question or a feature request?
-title: ''
-assignees: ''
-
----
-
-### The thing
-
-Tell us the thing 🙂
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 046e8937a3..2f187a2865 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -7,6 +7,7 @@ A short description of what changes this PR introduces and why.
A brief description of implementation details of this PR.
### Review checklist
-
- [ ] Feature or bugfix MUST have appropriate tests (unit, integration)
-- [ ] Make sure each commit and the PR mention the Issue number or JIRA reference
+- [ ] Make sure each commit and the PR mention the Issue number or JIRA reference
+- [ ] Add CHANGELOG entry for user facing changes
+- [ ] Add Objective-C interface for public APIs (see our [guidelines](https://datadoghq.atlassian.net/wiki/spaces/RUMP/pages/3157787243/RFC+-+Modular+Objective-C+Interface#Recommended-solution) [internal]) and run `make api-surface`)
diff --git a/.gitignore b/.gitignore
index 0ecf54e6db..896abc144a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,25 @@
.DS_Store
/build
-/.build
-/.swiftpm
-xcuserdata/
+.build
+.swiftpm
+Package.resolved
+Carthage/Build
+Carthage/Checkouts
+xcuserdata/
*.local.xcconfig
+E2ETests/code-signing
+tools/dogfooding/repos
+
+# Ignore files for Python tools:
+.idea
+venv
+*.pyc
+__pycache__
+*.swp
+.venv
+.vscode
+*.pytest_cache
+
+# CI job artifacts
+artifacts/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000..17427b4de0
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,391 @@
+stages:
+ - pre
+ - lint
+ - test
+ - ui-test
+ - smoke-test
+ - e2e-test
+ - benchmark-test
+ - dogfood
+ - release-build
+ - release-publish
+ - post
+
+variables:
+ MAIN_BRANCH: "master"
+ DEVELOP_BRANCH: "develop"
+ # Default Xcode and runtime versions for all jobs:
+ DEFAULT_XCODE: "15.4.0"
+ DEFAULT_IOS_OS: "17.5"
+ DEFAULT_TVOS_OS: "17.5"
+ # Prefilled variables for running a pipeline manually:
+ # Ref.: https://docs.gitlab.com/ee/ci/pipelines/index.html#prefill-variables-in-manual-pipelines
+ RELEASE_GIT_TAG:
+ description: "The Git tag for the release pipeline. If set, release pipeline will be triggered for the given tag."
+ RELEASE_DRY_RUN:
+ value: "1"
+ description: "Controls the dry run mode for the release pipeline. If set to '1', the pipeline will execute all steps but will not publish artifacts. If set to '0', the pipeline will run fully."
+
+default:
+ tags:
+ - macos:sonoma
+ - specific:true
+
+# ┌───────────────┐
+# │ Utility jobs: │
+# └───────────────┘
+
+# Utility jobs define rules for including or excluding dependent jobs from the pipeline.
+#
+# Ref.: https://docs.gitlab.com/ee/ci/jobs/job_rules.html
+# > Rules are evaluated in order until the first match. When a match is found, the job is either included or excluded
+# > from the pipeline, depending on the configuration.
+
+.test-pipeline-job:
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $DEVELOP_BRANCH || $CI_COMMIT_BRANCH == $MAIN_BRANCH' # always on main branches
+ - if: '$CI_COMMIT_BRANCH' # when on other branch with following changes compared to develop
+ changes:
+ paths:
+ - "Datadog*/**/*"
+ - "IntegrationTests/**/*"
+ - "SmokeTests/**/*"
+ - "TestUtilities/**/*"
+ - "*" # match any file in the root directory
+ compare_to: 'develop' # cannot use $DEVELOP_BRANCH var due to: https://gitlab.com/gitlab-org/gitlab/-/issues/369916
+
+.release-pipeline-job:
+ rules:
+ - if: '$CI_COMMIT_TAG || $RELEASE_GIT_TAG'
+
+.release-pipeline-20m-delayed-job:
+ rules:
+ - if: '$CI_COMMIT_TAG || $RELEASE_GIT_TAG'
+ when: delayed
+ start_in: 20 minutes
+
+.release-pipeline-40m-delayed-job:
+ rules:
+ - if: '$CI_COMMIT_TAG || $RELEASE_GIT_TAG'
+ when: delayed
+ start_in: 40 minutes
+
+ENV check:
+ stage: pre
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ script:
+ - ./tools/runner-setup.sh --datadog-ci
+ - make env-check
+
+# ┌──────────────────────────┐
+# │ SDK changes integration: │
+# └──────────────────────────┘
+
+Lint:
+ stage: lint
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ script:
+ - make clean repo-setup ENV=ci
+ - make lint license-check
+ - make rum-models-verify sr-models-verify
+
+Unit Tests (iOS):
+ stage: test
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ variables:
+ PLATFORM: "iOS Simulator"
+ DEVICE: "iPhone 15 Pro"
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE"
+ - make clean repo-setup ENV=ci
+ - make test-ios-all OS="$DEFAULT_IOS_OS" PLATFORM="$PLATFORM" DEVICE="$DEVICE" USE_TEST_VISIBILITY=1
+
+Unit Tests (tvOS):
+ stage: test
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ variables:
+ PLATFORM: "tvOS Simulator"
+ DEVICE: "Apple TV"
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE"
+ - make clean repo-setup ENV=ci
+ - make test-tvos-all OS="$DEFAULT_TVOS_OS" PLATFORM="$PLATFORM" DEVICE="$DEVICE" USE_TEST_VISIBILITY=1
+
+UI Tests:
+ stage: ui-test
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ variables:
+ PLATFORM: "iOS Simulator"
+ DEVICE: "iPhone 15 Pro"
+ parallel:
+ matrix:
+ - TEST_PLAN:
+ - Default
+ - RUM
+ - CrashReporting
+ - NetworkInstrumentation
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE"
+ - make clean repo-setup ENV=ci
+ - make ui-test TEST_PLAN="$TEST_PLAN" OS="$DEFAULT_IOS_OS" PLATFORM="$PLATFORM" DEVICE="$DEVICE"
+
+SR Snapshot Tests:
+ stage: ui-test
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ variables:
+ PLATFORM: "iOS Simulator"
+ DEVICE: "iPhone 15"
+ ARTIFACTS_PATH: "artifacts"
+ artifacts:
+ paths:
+ - artifacts
+ expire_in: 1 week
+ when: on_failure
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE" --ssh
+ - make clean repo-setup ENV=ci
+ - make sr-snapshots-pull sr-snapshot-test OS="$DEFAULT_IOS_OS" PLATFORM="$PLATFORM" DEVICE="$DEVICE" ARTIFACTS_PATH="$ARTIFACTS_PATH"
+
+Tools Tests:
+ stage: test
+ rules:
+ - if: '$CI_COMMIT_BRANCH' # when on branch with following changes compared to develop
+ changes:
+ paths:
+ - "tools/**/*"
+ - "Makefile"
+ - ".gitlab-ci.yml"
+ compare_to: 'develop'
+ script:
+ - make clean repo-setup ENV=ci
+ - make tools-test
+
+Benchmark Build:
+ stage: smoke-test
+ rules:
+ - if: '$CI_COMMIT_BRANCH' # when on branch with following changes compared to develop
+ changes:
+ paths:
+ - "BenchmarkTests/**/*"
+ compare_to: 'develop'
+ script:
+ - make benchmark-build
+
+Smoke Tests (iOS):
+ stage: smoke-test
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ variables:
+ PLATFORM: "iOS Simulator"
+ DEVICE: "iPhone 15 Pro"
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE" --ssh
+ - make clean repo-setup ENV=ci
+ - make smoke-test-ios-all OS="$DEFAULT_IOS_OS" PLATFORM="$PLATFORM" DEVICE="$DEVICE"
+
+Smoke Tests (tvOS):
+ stage: smoke-test
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ variables:
+ PLATFORM: "tvOS Simulator"
+ DEVICE: "Apple TV"
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE" --ssh
+ - make clean repo-setup ENV=ci
+ - make smoke-test-tvos-all OS="$DEFAULT_IOS_OS" PLATFORM="$PLATFORM" DEVICE="$DEVICE"
+
+SPM Build (Swift 5.10):
+ stage: smoke-test
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE" --iOS --tvOS --visionOS --watchOS
+ - make clean repo-setup ENV=ci
+ - make spm-build-ios
+ - make spm-build-tvos
+ - make spm-build-visionos
+ - make spm-build-macos
+ - make spm-build-watchos
+
+SPM Build (Swift 5.9):
+ stage: smoke-test
+ rules:
+ - !reference [.test-pipeline-job, rules]
+ - !reference [.release-pipeline-job, rules]
+ tags:
+ - macos:ventura
+ - specific:true
+ variables:
+ XCODE: "15.2.0"
+ script:
+ - ./tools/runner-setup.sh --xcode "$XCODE" --iOS --tvOS --visionOS --watchOS
+ - make clean repo-setup ENV=ci
+ - make spm-build-ios
+ - make spm-build-tvos
+ - make spm-build-visionos
+ - make spm-build-macos
+ - make spm-build-watchos
+
+# ┌──────────────────────┐
+# │ E2E Test app upload: │
+# └──────────────────────┘
+
+E2E Test (upload to s8s):
+ stage: e2e-test
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $DEVELOP_BRANCH'
+ artifacts:
+ paths:
+ - artifacts
+ expire_in: 2 weeks
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE" --datadog-ci
+ - make clean
+ - export DRY_RUN=${DRY_RUN:-0} # default to 0 if not specified
+ - make e2e-upload ARTIFACTS_PATH="artifacts/e2e"
+
+# ┌────────────────────────────┐
+# │ Benchmark Test app upload: │
+# └────────────────────────────┘
+
+Benchmark Test (upload to s8s):
+ stage: benchmark-test
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $DEVELOP_BRANCH'
+ allow_failure: true
+ artifacts:
+ paths:
+ - artifacts
+ expire_in: 2 weeks
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE" --datadog-ci
+ - make clean
+ - export DRY_RUN=${DRY_RUN:-0} # default to 0 if not specified
+ - make benchmark-upload ARTIFACTS_PATH="artifacts/benchmark"
+
+# ┌─────────────────┐
+# │ SDK dogfooding: │
+# └─────────────────┘
+
+Dogfood (Shopist):
+ stage: dogfood
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $DEVELOP_BRANCH'
+ when: manual
+ allow_failure: true
+ script:
+ - ./tools/runner-setup.sh --ssh
+ - DRY_RUN=0 make dogfood-shopist
+
+Dogfood (Datadog app):
+ stage: dogfood
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $DEVELOP_BRANCH'
+ when: manual
+ allow_failure: true
+ script:
+ - ./tools/runner-setup.sh --ssh
+ - DRY_RUN=0 make dogfood-datadog-app
+
+# ┌──────────────┐
+# │ SDK release: │
+# └──────────────┘
+
+.release-before-script: &export_MAKE_release_params
+ - export GIT_TAG=${RELEASE_GIT_TAG:-$CI_COMMIT_TAG} # CI_COMMIT_TAG if set, otherwise default to RELEASE_GIT_TAG
+ - if [ -z "$GIT_TAG" ]; then echo "GIT_TAG is not set"; exit 1; fi # sanity check
+ - export ARTIFACTS_PATH="artifacts/$GIT_TAG"
+ - export DRY_RUN=${CI_COMMIT_TAG:+0} # 0 if CI_COMMIT_TAG is set
+ - export DRY_RUN=${DRY_RUN:-$RELEASE_DRY_RUN} # otherwise default to RELEASE_DRY_RUN
+
+Build Artifacts:
+ stage: release-build
+ rules:
+ - !reference [.release-pipeline-job, rules]
+ artifacts:
+ paths:
+ - artifacts
+ expire_in: 4 weeks
+ before_script:
+ - *export_MAKE_release_params
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE" --ssh
+ - make env-check
+ - make clean
+ - make release-build release-validate
+
+Publish GH Asset:
+ stage: release-publish
+ rules:
+ - !reference [.release-pipeline-job, rules]
+ before_script:
+ - *export_MAKE_release_params
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE"
+ - make env-check
+ - make clean
+ - make release-publish-github
+
+Publish CP podspecs (internal):
+ stage: release-publish
+ rules:
+ - !reference [.release-pipeline-job, rules]
+ before_script:
+ - *export_MAKE_release_params
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE"
+ - make env-check
+ - make clean
+ - make release-publish-internal-podspecs
+
+Publish CP podspecs (dependent):
+ stage: release-publish
+ rules:
+ - !reference [.release-pipeline-20m-delayed-job, rules]
+ before_script:
+ - *export_MAKE_release_params
+ needs: ["Build Artifacts", "Publish CP podspecs (internal)"]
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE"
+ - make env-check
+ - make clean
+ - make release-publish-dependent-podspecs
+
+Publish CP podspecs (legacy):
+ stage: release-publish
+ rules:
+ - !reference [.release-pipeline-40m-delayed-job, rules]
+ before_script:
+ - *export_MAKE_release_params
+ needs: ["Build Artifacts", "Publish CP podspecs (dependent)"]
+ script:
+ - ./tools/runner-setup.sh --xcode "$DEFAULT_XCODE"
+ - make env-check
+ - make clean
+ - make release-publish-legacy-podspecs
+
+# ┌────────────────┐
+# │ Notifications: │
+# └────────────────┘
+
+# This job runs at the end of every successful pipeline.
+# It syncs the GitLab pipeline status with GitHub status checks.
+Sync GH Checks:
+ stage: post
+ script:
+ - echo "All good"
diff --git a/.spi.yml b/.spi.yml
new file mode 100644
index 0000000000..5d317a7c02
--- /dev/null
+++ b/.spi.yml
@@ -0,0 +1,5 @@
+version: 1
+builder:
+ configs:
+ - platform: ios
+ documentation_targets: ["DatadogInternal", "DatadogCore", "DatadogObjc", "DatadogLogs", "DatadogTrace", "DatadogRUM", "DatadogSessionReplay", "DatadogCrashReporting", "DatadogWebViewTracking"]
diff --git a/BenchmarkTests/BenchmarkTests.xcodeproj/.xcodesamplecode.plist b/BenchmarkTests/BenchmarkTests.xcodeproj/.xcodesamplecode.plist
new file mode 100644
index 0000000000..4bc741ca64
--- /dev/null
+++ b/BenchmarkTests/BenchmarkTests.xcodeproj/.xcodesamplecode.plist
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/BenchmarkTests/BenchmarkTests.xcodeproj/project.pbxproj b/BenchmarkTests/BenchmarkTests.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..70b3105e82
--- /dev/null
+++ b/BenchmarkTests/BenchmarkTests.xcodeproj/project.pbxproj
@@ -0,0 +1,1277 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D231DC372C73355800F3F66C /* UIKitCatalog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D231DC312C73355800F3F66C /* UIKitCatalog.framework */; };
+ D231DC382C73355800F3F66C /* UIKitCatalog.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D231DC312C73355800F3F66C /* UIKitCatalog.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D231DCAF2C73356E00F3F66C /* ActivityIndicatorViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC412C73356D00F3F66C /* ActivityIndicatorViewController.storyboard */; };
+ D231DCB02C73356E00F3F66C /* ActivityIndicatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC422C73356D00F3F66C /* ActivityIndicatorViewController.swift */; };
+ D231DCB12C73356E00F3F66C /* AlertControllerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC442C73356D00F3F66C /* AlertControllerViewController.storyboard */; };
+ D231DCB22C73356E00F3F66C /* AlertControllerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC452C73356D00F3F66C /* AlertControllerViewController.swift */; };
+ D231DCB42C73356E00F3F66C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D231DC472C73356D00F3F66C /* Assets.xcassets */; };
+ D231DCB52C73356E00F3F66C /* BaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC482C73356D00F3F66C /* BaseTableViewController.swift */; };
+ D231DCB62C73356E00F3F66C /* ButtonViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC4A2C73356D00F3F66C /* ButtonViewController.storyboard */; };
+ D231DCB72C73356E00F3F66C /* ButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC4B2C73356D00F3F66C /* ButtonViewController.swift */; };
+ D231DCB82C73356E00F3F66C /* ButtonViewController+Configs.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC4C2C73356D00F3F66C /* ButtonViewController+Configs.swift */; };
+ D231DCB92C73356E00F3F66C /* CaseElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC4D2C73356D00F3F66C /* CaseElement.swift */; };
+ D231DCBA2C73356E00F3F66C /* ColorPickerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC4F2C73356D00F3F66C /* ColorPickerViewController.storyboard */; };
+ D231DCBB2C73356E00F3F66C /* ColorPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC502C73356D00F3F66C /* ColorPickerViewController.swift */; };
+ D231DCBC2C73356E00F3F66C /* content.html in Resources */ = {isa = PBXBuildFile; fileRef = D231DC522C73356D00F3F66C /* content.html */; };
+ D231DCBD2C73356E00F3F66C /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = D231DC542C73356D00F3F66C /* Credits.rtf */; };
+ D231DCBE2C73356E00F3F66C /* CustomPageControlViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC562C73356D00F3F66C /* CustomPageControlViewController.storyboard */; };
+ D231DCBF2C73356E00F3F66C /* CustomPageControlViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC572C73356D00F3F66C /* CustomPageControlViewController.swift */; };
+ D231DCC02C73356E00F3F66C /* CustomSearchBarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC592C73356D00F3F66C /* CustomSearchBarViewController.storyboard */; };
+ D231DCC12C73356E00F3F66C /* CustomSearchBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC5A2C73356D00F3F66C /* CustomSearchBarViewController.swift */; };
+ D231DCC22C73356E00F3F66C /* CustomToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC5C2C73356D00F3F66C /* CustomToolbarViewController.storyboard */; };
+ D231DCC32C73356E00F3F66C /* CustomToolbarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC5D2C73356D00F3F66C /* CustomToolbarViewController.swift */; };
+ D231DCC42C73356E00F3F66C /* DatePickerController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC5F2C73356D00F3F66C /* DatePickerController.storyboard */; };
+ D231DCC52C73356E00F3F66C /* DatePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC602C73356D00F3F66C /* DatePickerController.swift */; };
+ D231DCC62C73356E00F3F66C /* DefaultPageControlViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC622C73356D00F3F66C /* DefaultPageControlViewController.storyboard */; };
+ D231DCC72C73356E00F3F66C /* DefaultPageControlViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC632C73356D00F3F66C /* DefaultPageControlViewController.swift */; };
+ D231DCC82C73356E00F3F66C /* DefaultSearchBarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC652C73356D00F3F66C /* DefaultSearchBarViewController.storyboard */; };
+ D231DCC92C73356E00F3F66C /* DefaultSearchBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC662C73356D00F3F66C /* DefaultSearchBarViewController.swift */; };
+ D231DCCA2C73356E00F3F66C /* DefaultToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC682C73356D00F3F66C /* DefaultToolbarViewController.storyboard */; };
+ D231DCCB2C73356E00F3F66C /* DefaultToolbarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC692C73356D00F3F66C /* DefaultToolbarViewController.swift */; };
+ D231DCCC2C73356E00F3F66C /* FontPickerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC6B2C73356D00F3F66C /* FontPickerViewController.storyboard */; };
+ D231DCCD2C73356E00F3F66C /* FontPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC6C2C73356D00F3F66C /* FontPickerViewController.swift */; };
+ D231DCCE2C73356E00F3F66C /* ImagePickerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC6E2C73356D00F3F66C /* ImagePickerViewController.storyboard */; };
+ D231DCCF2C73356E00F3F66C /* ImagePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC6F2C73356D00F3F66C /* ImagePickerViewController.swift */; };
+ D231DCD02C73356E00F3F66C /* ImageViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC712C73356D00F3F66C /* ImageViewController.storyboard */; };
+ D231DCD12C73356E00F3F66C /* ImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC722C73356D00F3F66C /* ImageViewController.swift */; };
+ D231DCD42C73356E00F3F66C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D231DC782C73356D00F3F66C /* Localizable.strings */; };
+ D231DCD52C73356E00F3F66C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC7A2C73356D00F3F66C /* Main.storyboard */; };
+ D231DCD62C73356E00F3F66C /* MenuButtonViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC7C2C73356D00F3F66C /* MenuButtonViewController.storyboard */; };
+ D231DCD72C73356E00F3F66C /* MenuButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC7D2C73356D00F3F66C /* MenuButtonViewController.swift */; };
+ D231DCD82C73356E00F3F66C /* OutlineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC7E2C73356D00F3F66C /* OutlineViewController.swift */; };
+ D231DCD92C73356E00F3F66C /* PickerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC802C73356D00F3F66C /* PickerViewController.storyboard */; };
+ D231DCDA2C73356E00F3F66C /* PickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC812C73356D00F3F66C /* PickerViewController.swift */; };
+ D231DCDB2C73356E00F3F66C /* PointerInteractionButtonViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC832C73356D00F3F66C /* PointerInteractionButtonViewController.storyboard */; };
+ D231DCDC2C73356E00F3F66C /* PointerInteractionButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC842C73356D00F3F66C /* PointerInteractionButtonViewController.swift */; };
+ D231DCDD2C73356E00F3F66C /* ProgressViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC862C73356D00F3F66C /* ProgressViewController.storyboard */; };
+ D231DCDE2C73356E00F3F66C /* ProgressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC872C73356D00F3F66C /* ProgressViewController.swift */; };
+ D231DCE02C73356E00F3F66C /* SegmentedControlViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC8A2C73356D00F3F66C /* SegmentedControlViewController.storyboard */; };
+ D231DCE12C73356E00F3F66C /* SegmentedControlViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC8B2C73356D00F3F66C /* SegmentedControlViewController.swift */; };
+ D231DCE22C73356E00F3F66C /* SliderViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC8D2C73356D00F3F66C /* SliderViewController.storyboard */; };
+ D231DCE32C73356E00F3F66C /* SliderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC8E2C73356D00F3F66C /* SliderViewController.swift */; };
+ D231DCE42C73356E00F3F66C /* StackViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC902C73356D00F3F66C /* StackViewController.storyboard */; };
+ D231DCE52C73356E00F3F66C /* StackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC912C73356D00F3F66C /* StackViewController.swift */; };
+ D231DCE62C73356E00F3F66C /* StepperViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC932C73356D00F3F66C /* StepperViewController.storyboard */; };
+ D231DCE72C73356E00F3F66C /* StepperViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC942C73356D00F3F66C /* StepperViewController.swift */; };
+ D231DCE82C73356E00F3F66C /* SwitchViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC962C73356D00F3F66C /* SwitchViewController.storyboard */; };
+ D231DCE92C73356E00F3F66C /* SwitchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC972C73356D00F3F66C /* SwitchViewController.swift */; };
+ D231DCEA2C73356E00F3F66C /* SymbolViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC992C73356D00F3F66C /* SymbolViewController.storyboard */; };
+ D231DCEB2C73356E00F3F66C /* SymbolViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC9A2C73356D00F3F66C /* SymbolViewController.swift */; };
+ D231DCEC2C73356E00F3F66C /* TextFieldViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC9C2C73356D00F3F66C /* TextFieldViewController.storyboard */; };
+ D231DCED2C73356E00F3F66C /* TextFieldViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DC9D2C73356D00F3F66C /* TextFieldViewController.swift */; };
+ D231DCEE2C73356E00F3F66C /* TextViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DC9F2C73356D00F3F66C /* TextViewController.storyboard */; };
+ D231DCEF2C73356E00F3F66C /* TextViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DCA02C73356D00F3F66C /* TextViewController.swift */; };
+ D231DCF02C73356E00F3F66C /* TintedToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DCA22C73356D00F3F66C /* TintedToolbarViewController.storyboard */; };
+ D231DCF12C73356E00F3F66C /* TintedToolbarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DCA32C73356D00F3F66C /* TintedToolbarViewController.swift */; };
+ D231DCF32C73356E00F3F66C /* VisualEffectViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DCA72C73356D00F3F66C /* VisualEffectViewController.storyboard */; };
+ D231DCF42C73356E00F3F66C /* VisualEffectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DCA82C73356D00F3F66C /* VisualEffectViewController.swift */; };
+ D231DCF52C73356E00F3F66C /* WebViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D231DCAA2C73356D00F3F66C /* WebViewController.storyboard */; };
+ D231DCF62C73356E00F3F66C /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DCAB2C73356D00F3F66C /* WebViewController.swift */; };
+ D231DCF92C7342D500F3F66C /* ModuleBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D231DCF82C7342D500F3F66C /* ModuleBundle.swift */; };
+ D23DD32D2C58D80C00B90C4C /* DatadogBenchmarks in Frameworks */ = {isa = PBXBuildFile; productRef = D23DD32C2C58D80C00B90C4C /* DatadogBenchmarks */; };
+ D24BFD472C6B916B00AB9604 /* SyntheticScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24BFD462C6B916B00AB9604 /* SyntheticScenario.swift */; };
+ D24E15F32C776956005AE4E8 /* BenchmarkProfiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24E15F22C776956005AE4E8 /* BenchmarkProfiler.swift */; };
+ D27606A12C514F37002D2A14 /* SessionReplayScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27606982C514F37002D2A14 /* SessionReplayScenario.swift */; };
+ D27606A32C514F37002D2A14 /* Scenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = D276069B2C514F37002D2A14 /* Scenario.swift */; };
+ D27606A42C514F37002D2A14 /* AppConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D276069D2C514F37002D2A14 /* AppConfiguration.swift */; };
+ D27606A72C514F77002D2A14 /* DatadogCore in Frameworks */ = {isa = PBXBuildFile; productRef = D27606A62C514F77002D2A14 /* DatadogCore */; };
+ D27606A92C514F77002D2A14 /* DatadogLogs in Frameworks */ = {isa = PBXBuildFile; productRef = D27606A82C514F77002D2A14 /* DatadogLogs */; };
+ D27606AB2C514F77002D2A14 /* DatadogRUM in Frameworks */ = {isa = PBXBuildFile; productRef = D27606AA2C514F77002D2A14 /* DatadogRUM */; };
+ D27606AD2C514F77002D2A14 /* DatadogSessionReplay in Frameworks */ = {isa = PBXBuildFile; productRef = D27606AC2C514F77002D2A14 /* DatadogSessionReplay */; };
+ D27606AF2C514F77002D2A14 /* DatadogTrace in Frameworks */ = {isa = PBXBuildFile; productRef = D27606AE2C514F77002D2A14 /* DatadogTrace */; };
+ D29F75502C4AA07E00288638 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29F754F2C4AA07E00288638 /* AppDelegate.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ D231DC352C73355800F3F66C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = D29F75282C4A9EFA00288638 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D231DC302C73355800F3F66C;
+ remoteInfo = UIKitCatalog;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ D29F75872C4AA98F00288638 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ D231DC382C73355800F3F66C /* UIKitCatalog.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ D231DC312C73355800F3F66C /* UIKitCatalog.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UIKitCatalog.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D231DC402C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ActivityIndicatorViewController.storyboard; sourceTree = ""; };
+ D231DC422C73356D00F3F66C /* ActivityIndicatorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityIndicatorViewController.swift; sourceTree = ""; };
+ D231DC432C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/AlertControllerViewController.storyboard; sourceTree = ""; };
+ D231DC452C73356D00F3F66C /* AlertControllerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlertControllerViewController.swift; sourceTree = ""; };
+ D231DC472C73356D00F3F66C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ D231DC482C73356D00F3F66C /* BaseTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseTableViewController.swift; sourceTree = ""; };
+ D231DC492C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ButtonViewController.storyboard; sourceTree = ""; };
+ D231DC4B2C73356D00F3F66C /* ButtonViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonViewController.swift; sourceTree = ""; };
+ D231DC4C2C73356D00F3F66C /* ButtonViewController+Configs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ButtonViewController+Configs.swift"; sourceTree = ""; };
+ D231DC4D2C73356D00F3F66C /* CaseElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaseElement.swift; sourceTree = ""; };
+ D231DC4E2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ColorPickerViewController.storyboard; sourceTree = ""; };
+ D231DC502C73356D00F3F66C /* ColorPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorPickerViewController.swift; sourceTree = ""; };
+ D231DC512C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = Base; path = Base.lproj/content.html; sourceTree = ""; };
+ D231DC532C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Base; path = Base.lproj/Credits.rtf; sourceTree = ""; };
+ D231DC552C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CustomPageControlViewController.storyboard; sourceTree = ""; };
+ D231DC572C73356D00F3F66C /* CustomPageControlViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomPageControlViewController.swift; sourceTree = ""; };
+ D231DC582C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CustomSearchBarViewController.storyboard; sourceTree = ""; };
+ D231DC5A2C73356D00F3F66C /* CustomSearchBarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomSearchBarViewController.swift; sourceTree = ""; };
+ D231DC5B2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CustomToolbarViewController.storyboard; sourceTree = ""; };
+ D231DC5D2C73356D00F3F66C /* CustomToolbarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomToolbarViewController.swift; sourceTree = ""; };
+ D231DC5E2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DatePickerController.storyboard; sourceTree = ""; };
+ D231DC602C73356D00F3F66C /* DatePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatePickerController.swift; sourceTree = ""; };
+ D231DC612C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DefaultPageControlViewController.storyboard; sourceTree = ""; };
+ D231DC632C73356D00F3F66C /* DefaultPageControlViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultPageControlViewController.swift; sourceTree = ""; };
+ D231DC642C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DefaultSearchBarViewController.storyboard; sourceTree = ""; };
+ D231DC662C73356D00F3F66C /* DefaultSearchBarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultSearchBarViewController.swift; sourceTree = ""; };
+ D231DC672C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DefaultToolbarViewController.storyboard; sourceTree = ""; };
+ D231DC692C73356D00F3F66C /* DefaultToolbarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultToolbarViewController.swift; sourceTree = ""; };
+ D231DC6A2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/FontPickerViewController.storyboard; sourceTree = ""; };
+ D231DC6C2C73356D00F3F66C /* FontPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FontPickerViewController.swift; sourceTree = ""; };
+ D231DC6D2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ImagePickerViewController.storyboard; sourceTree = ""; };
+ D231DC6F2C73356D00F3F66C /* ImagePickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImagePickerViewController.swift; sourceTree = ""; };
+ D231DC702C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ImageViewController.storyboard; sourceTree = ""; };
+ D231DC722C73356D00F3F66C /* ImageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageViewController.swift; sourceTree = ""; };
+ D231DC772C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; };
+ D231DC792C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ D231DC7B2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MenuButtonViewController.storyboard; sourceTree = ""; };
+ D231DC7D2C73356D00F3F66C /* MenuButtonViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuButtonViewController.swift; sourceTree = ""; };
+ D231DC7E2C73356D00F3F66C /* OutlineViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutlineViewController.swift; sourceTree = ""; };
+ D231DC7F2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/PickerViewController.storyboard; sourceTree = ""; };
+ D231DC812C73356D00F3F66C /* PickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PickerViewController.swift; sourceTree = ""; };
+ D231DC822C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/PointerInteractionButtonViewController.storyboard; sourceTree = ""; };
+ D231DC842C73356D00F3F66C /* PointerInteractionButtonViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PointerInteractionButtonViewController.swift; sourceTree = ""; };
+ D231DC852C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ProgressViewController.storyboard; sourceTree = ""; };
+ D231DC872C73356D00F3F66C /* ProgressViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressViewController.swift; sourceTree = ""; };
+ D231DC892C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SegmentedControlViewController.storyboard; sourceTree = ""; };
+ D231DC8B2C73356D00F3F66C /* SegmentedControlViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SegmentedControlViewController.swift; sourceTree = ""; };
+ D231DC8C2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SliderViewController.storyboard; sourceTree = ""; };
+ D231DC8E2C73356D00F3F66C /* SliderViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SliderViewController.swift; sourceTree = ""; };
+ D231DC8F2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/StackViewController.storyboard; sourceTree = ""; };
+ D231DC912C73356D00F3F66C /* StackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackViewController.swift; sourceTree = ""; };
+ D231DC922C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/StepperViewController.storyboard; sourceTree = ""; };
+ D231DC942C73356D00F3F66C /* StepperViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StepperViewController.swift; sourceTree = ""; };
+ D231DC952C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SwitchViewController.storyboard; sourceTree = ""; };
+ D231DC972C73356D00F3F66C /* SwitchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwitchViewController.swift; sourceTree = ""; };
+ D231DC982C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SymbolViewController.storyboard; sourceTree = ""; };
+ D231DC9A2C73356D00F3F66C /* SymbolViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SymbolViewController.swift; sourceTree = ""; };
+ D231DC9B2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TextFieldViewController.storyboard; sourceTree = ""; };
+ D231DC9D2C73356D00F3F66C /* TextFieldViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldViewController.swift; sourceTree = ""; };
+ D231DC9E2C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TextViewController.storyboard; sourceTree = ""; };
+ D231DCA02C73356D00F3F66C /* TextViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextViewController.swift; sourceTree = ""; };
+ D231DCA12C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TintedToolbarViewController.storyboard; sourceTree = ""; };
+ D231DCA32C73356D00F3F66C /* TintedToolbarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TintedToolbarViewController.swift; sourceTree = ""; };
+ D231DCA62C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/VisualEffectViewController.storyboard; sourceTree = ""; };
+ D231DCA82C73356D00F3F66C /* VisualEffectViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualEffectViewController.swift; sourceTree = ""; };
+ D231DCA92C73356D00F3F66C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/WebViewController.storyboard; sourceTree = ""; };
+ D231DCAB2C73356D00F3F66C /* WebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; };
+ D231DCF82C7342D500F3F66C /* ModuleBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleBundle.swift; sourceTree = ""; };
+ D231DCFA2C735FC200F3F66C /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; };
+ D24BFD462C6B916B00AB9604 /* SyntheticScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyntheticScenario.swift; sourceTree = ""; };
+ D24E15F22C776956005AE4E8 /* BenchmarkProfiler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BenchmarkProfiler.swift; sourceTree = ""; };
+ D27606982C514F37002D2A14 /* SessionReplayScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionReplayScenario.swift; sourceTree = ""; };
+ D276069B2C514F37002D2A14 /* Scenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; };
+ D276069D2C514F37002D2A14 /* AppConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppConfiguration.swift; sourceTree = ""; };
+ D27606B22C526908002D2A14 /* Benchmarks.local.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Benchmarks.local.xcconfig; sourceTree = ""; };
+ D27606B32C526908002D2A14 /* Runner.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Runner.xcconfig; sourceTree = ""; };
+ D27606B42C526908002D2A14 /* Synthetics.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Synthetics.xcconfig; sourceTree = ""; };
+ D277C84A2C58D3210072343C /* Benchmarks */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Benchmarks; sourceTree = ""; };
+ D29F754D2C4AA07E00288638 /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ D29F754F2C4AA07E00288638 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ D29F755D2C4AA08000288638 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D2CA7E862C57F9B800AAB380 /* dd-sdk-ios */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "dd-sdk-ios"; path = ..; sourceTree = ""; };
+ D2E60B9F2C732FBB00A18F1C /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D231DC2E2C73355800F3F66C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ D29F754A2C4AA07E00288638 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D27606A92C514F77002D2A14 /* DatadogLogs in Frameworks */,
+ D27606AF2C514F77002D2A14 /* DatadogTrace in Frameworks */,
+ D27606AD2C514F77002D2A14 /* DatadogSessionReplay in Frameworks */,
+ D23DD32D2C58D80C00B90C4C /* DatadogBenchmarks in Frameworks */,
+ D231DC372C73355800F3F66C /* UIKitCatalog.framework in Frameworks */,
+ D27606AB2C514F77002D2A14 /* DatadogRUM in Frameworks */,
+ D27606A72C514F77002D2A14 /* DatadogCore in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ D231DC322C73355800F3F66C /* UIKitCatalog */ = {
+ isa = PBXGroup;
+ children = (
+ D256FB522C737F5800377260 /* LICENSE */,
+ D231DC412C73356D00F3F66C /* ActivityIndicatorViewController.storyboard */,
+ D231DC422C73356D00F3F66C /* ActivityIndicatorViewController.swift */,
+ D231DC442C73356D00F3F66C /* AlertControllerViewController.storyboard */,
+ D231DC452C73356D00F3F66C /* AlertControllerViewController.swift */,
+ D231DC472C73356D00F3F66C /* Assets.xcassets */,
+ D231DC482C73356D00F3F66C /* BaseTableViewController.swift */,
+ D231DC4A2C73356D00F3F66C /* ButtonViewController.storyboard */,
+ D231DC4B2C73356D00F3F66C /* ButtonViewController.swift */,
+ D231DC4C2C73356D00F3F66C /* ButtonViewController+Configs.swift */,
+ D231DC4D2C73356D00F3F66C /* CaseElement.swift */,
+ D231DC4F2C73356D00F3F66C /* ColorPickerViewController.storyboard */,
+ D231DC502C73356D00F3F66C /* ColorPickerViewController.swift */,
+ D231DC522C73356D00F3F66C /* content.html */,
+ D231DC542C73356D00F3F66C /* Credits.rtf */,
+ D231DC562C73356D00F3F66C /* CustomPageControlViewController.storyboard */,
+ D231DC572C73356D00F3F66C /* CustomPageControlViewController.swift */,
+ D231DC592C73356D00F3F66C /* CustomSearchBarViewController.storyboard */,
+ D231DC5A2C73356D00F3F66C /* CustomSearchBarViewController.swift */,
+ D231DC5C2C73356D00F3F66C /* CustomToolbarViewController.storyboard */,
+ D231DC5D2C73356D00F3F66C /* CustomToolbarViewController.swift */,
+ D231DC5F2C73356D00F3F66C /* DatePickerController.storyboard */,
+ D231DC602C73356D00F3F66C /* DatePickerController.swift */,
+ D231DC622C73356D00F3F66C /* DefaultPageControlViewController.storyboard */,
+ D231DC632C73356D00F3F66C /* DefaultPageControlViewController.swift */,
+ D231DC652C73356D00F3F66C /* DefaultSearchBarViewController.storyboard */,
+ D231DC662C73356D00F3F66C /* DefaultSearchBarViewController.swift */,
+ D231DC682C73356D00F3F66C /* DefaultToolbarViewController.storyboard */,
+ D231DC692C73356D00F3F66C /* DefaultToolbarViewController.swift */,
+ D231DC6B2C73356D00F3F66C /* FontPickerViewController.storyboard */,
+ D231DC6C2C73356D00F3F66C /* FontPickerViewController.swift */,
+ D231DC6E2C73356D00F3F66C /* ImagePickerViewController.storyboard */,
+ D231DC6F2C73356D00F3F66C /* ImagePickerViewController.swift */,
+ D231DC712C73356D00F3F66C /* ImageViewController.storyboard */,
+ D231DC722C73356D00F3F66C /* ImageViewController.swift */,
+ D231DC782C73356D00F3F66C /* Localizable.strings */,
+ D231DC7A2C73356D00F3F66C /* Main.storyboard */,
+ D231DC7C2C73356D00F3F66C /* MenuButtonViewController.storyboard */,
+ D231DC7D2C73356D00F3F66C /* MenuButtonViewController.swift */,
+ D231DC7E2C73356D00F3F66C /* OutlineViewController.swift */,
+ D231DC802C73356D00F3F66C /* PickerViewController.storyboard */,
+ D231DC812C73356D00F3F66C /* PickerViewController.swift */,
+ D231DC832C73356D00F3F66C /* PointerInteractionButtonViewController.storyboard */,
+ D231DC842C73356D00F3F66C /* PointerInteractionButtonViewController.swift */,
+ D231DC862C73356D00F3F66C /* ProgressViewController.storyboard */,
+ D231DC872C73356D00F3F66C /* ProgressViewController.swift */,
+ D231DC8A2C73356D00F3F66C /* SegmentedControlViewController.storyboard */,
+ D231DC8B2C73356D00F3F66C /* SegmentedControlViewController.swift */,
+ D231DC8D2C73356D00F3F66C /* SliderViewController.storyboard */,
+ D231DC8E2C73356D00F3F66C /* SliderViewController.swift */,
+ D231DC902C73356D00F3F66C /* StackViewController.storyboard */,
+ D231DC912C73356D00F3F66C /* StackViewController.swift */,
+ D231DC932C73356D00F3F66C /* StepperViewController.storyboard */,
+ D231DC942C73356D00F3F66C /* StepperViewController.swift */,
+ D231DC962C73356D00F3F66C /* SwitchViewController.storyboard */,
+ D231DC972C73356D00F3F66C /* SwitchViewController.swift */,
+ D231DC992C73356D00F3F66C /* SymbolViewController.storyboard */,
+ D231DC9A2C73356D00F3F66C /* SymbolViewController.swift */,
+ D231DC9C2C73356D00F3F66C /* TextFieldViewController.storyboard */,
+ D231DC9D2C73356D00F3F66C /* TextFieldViewController.swift */,
+ D231DC9F2C73356D00F3F66C /* TextViewController.storyboard */,
+ D231DCA02C73356D00F3F66C /* TextViewController.swift */,
+ D231DCA22C73356D00F3F66C /* TintedToolbarViewController.storyboard */,
+ D231DCA32C73356D00F3F66C /* TintedToolbarViewController.swift */,
+ D231DCA72C73356D00F3F66C /* VisualEffectViewController.storyboard */,
+ D231DCA82C73356D00F3F66C /* VisualEffectViewController.swift */,
+ D231DCAA2C73356D00F3F66C /* WebViewController.storyboard */,
+ D231DCAB2C73356D00F3F66C /* WebViewController.swift */,
+ D231DCF82C7342D500F3F66C /* ModuleBundle.swift */,
+ );
+ path = UIKitCatalog;
+ sourceTree = "";
+ };
+ D256FB522C737F5800377260 /* LICENSE */ = {
+ isa = PBXGroup;
+ children = (
+ D231DCFA2C735FC200F3F66C /* LICENSE.txt */,
+ );
+ path = LICENSE;
+ sourceTree = "";
+ };
+ D27606992C514F37002D2A14 /* SessionReplay */ = {
+ isa = PBXGroup;
+ children = (
+ D27606982C514F37002D2A14 /* SessionReplayScenario.swift */,
+ );
+ path = SessionReplay;
+ sourceTree = "";
+ };
+ D276069C2C514F37002D2A14 /* Scenarios */ = {
+ isa = PBXGroup;
+ children = (
+ D276069B2C514F37002D2A14 /* Scenario.swift */,
+ D24BFD462C6B916B00AB9604 /* SyntheticScenario.swift */,
+ D27606992C514F37002D2A14 /* SessionReplay */,
+ );
+ path = Scenarios;
+ sourceTree = "";
+ };
+ D27606B52C526908002D2A14 /* xcconfigs */ = {
+ isa = PBXGroup;
+ children = (
+ D27606B22C526908002D2A14 /* Benchmarks.local.xcconfig */,
+ D27606B32C526908002D2A14 /* Runner.xcconfig */,
+ D27606B42C526908002D2A14 /* Synthetics.xcconfig */,
+ );
+ path = xcconfigs;
+ sourceTree = "";
+ };
+ D29F75272C4A9EFA00288638 = {
+ isa = PBXGroup;
+ children = (
+ D2E60B9F2C732FBB00A18F1C /* README.md */,
+ D27606B52C526908002D2A14 /* xcconfigs */,
+ D29F754E2C4AA07E00288638 /* Runner */,
+ D231DC322C73355800F3F66C /* UIKitCatalog */,
+ D29F75482C4A9F9500288638 /* Frameworks */,
+ D29F75312C4A9EFA00288638 /* Products */,
+ );
+ sourceTree = "";
+ };
+ D29F75312C4A9EFA00288638 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D29F754D2C4AA07E00288638 /* Runner.app */,
+ D231DC312C73355800F3F66C /* UIKitCatalog.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ D29F75482C4A9F9500288638 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D277C84A2C58D3210072343C /* Benchmarks */,
+ D2CA7E862C57F9B800AAB380 /* dd-sdk-ios */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ D29F754E2C4AA07E00288638 /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ D29F754F2C4AA07E00288638 /* AppDelegate.swift */,
+ D276069D2C514F37002D2A14 /* AppConfiguration.swift */,
+ D24E15F22C776956005AE4E8 /* BenchmarkProfiler.swift */,
+ D276069C2C514F37002D2A14 /* Scenarios */,
+ D29F755D2C4AA08000288638 /* Info.plist */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D231DC2C2C73355800F3F66C /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D231DC302C73355800F3F66C /* UIKitCatalog */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D231DC3C2C73355800F3F66C /* Build configuration list for PBXNativeTarget "UIKitCatalog" */;
+ buildPhases = (
+ D231DC2C2C73355800F3F66C /* Headers */,
+ D231DC2D2C73355800F3F66C /* Sources */,
+ D231DC2E2C73355800F3F66C /* Frameworks */,
+ D231DC2F2C73355800F3F66C /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = UIKitCatalog;
+ productName = UIKitCatalog;
+ productReference = D231DC312C73355800F3F66C /* UIKitCatalog.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ D29F754C2C4AA07E00288638 /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D29F75602C4AA08000288638 /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ D29F75492C4AA07E00288638 /* Sources */,
+ D29F754A2C4AA07E00288638 /* Frameworks */,
+ D29F754B2C4AA07E00288638 /* Resources */,
+ D29F75872C4AA98F00288638 /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ D231DC362C73355800F3F66C /* PBXTargetDependency */,
+ );
+ name = Runner;
+ packageProductDependencies = (
+ D27606A62C514F77002D2A14 /* DatadogCore */,
+ D27606A82C514F77002D2A14 /* DatadogLogs */,
+ D27606AA2C514F77002D2A14 /* DatadogRUM */,
+ D27606AC2C514F77002D2A14 /* DatadogSessionReplay */,
+ D27606AE2C514F77002D2A14 /* DatadogTrace */,
+ D23DD32C2C58D80C00B90C4C /* DatadogBenchmarks */,
+ );
+ productName = Runner;
+ productReference = D29F754D2C4AA07E00288638 /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ D29F75282C4A9EFA00288638 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1540;
+ LastUpgradeCheck = 1540;
+ TargetAttributes = {
+ D231DC302C73355800F3F66C = {
+ CreatedOnToolsVersion = 15.4;
+ };
+ D29F754C2C4AA07E00288638 = {
+ CreatedOnToolsVersion = 15.4;
+ };
+ };
+ };
+ buildConfigurationList = D29F752B2C4A9EFA00288638 /* Build configuration list for PBXProject "BenchmarkTests" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = D29F75272C4A9EFA00288638;
+ packageReferences = (
+ );
+ productRefGroup = D29F75312C4A9EFA00288638 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D29F754C2C4AA07E00288638 /* Runner */,
+ D231DC302C73355800F3F66C /* UIKitCatalog */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ D231DC2F2C73355800F3F66C /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D231DCD62C73356E00F3F66C /* MenuButtonViewController.storyboard in Resources */,
+ D231DCAF2C73356E00F3F66C /* ActivityIndicatorViewController.storyboard in Resources */,
+ D231DCDB2C73356E00F3F66C /* PointerInteractionButtonViewController.storyboard in Resources */,
+ D231DCBE2C73356E00F3F66C /* CustomPageControlViewController.storyboard in Resources */,
+ D231DCD92C73356E00F3F66C /* PickerViewController.storyboard in Resources */,
+ D231DCF32C73356E00F3F66C /* VisualEffectViewController.storyboard in Resources */,
+ D231DCC42C73356E00F3F66C /* DatePickerController.storyboard in Resources */,
+ D231DCE62C73356E00F3F66C /* StepperViewController.storyboard in Resources */,
+ D231DCBC2C73356E00F3F66C /* content.html in Resources */,
+ D231DCD52C73356E00F3F66C /* Main.storyboard in Resources */,
+ D231DCC62C73356E00F3F66C /* DefaultPageControlViewController.storyboard in Resources */,
+ D231DCEA2C73356E00F3F66C /* SymbolViewController.storyboard in Resources */,
+ D231DCEC2C73356E00F3F66C /* TextFieldViewController.storyboard in Resources */,
+ D231DCCE2C73356E00F3F66C /* ImagePickerViewController.storyboard in Resources */,
+ D231DCC22C73356E00F3F66C /* CustomToolbarViewController.storyboard in Resources */,
+ D231DCC02C73356E00F3F66C /* CustomSearchBarViewController.storyboard in Resources */,
+ D231DCBD2C73356E00F3F66C /* Credits.rtf in Resources */,
+ D231DCD42C73356E00F3F66C /* Localizable.strings in Resources */,
+ D231DCE02C73356E00F3F66C /* SegmentedControlViewController.storyboard in Resources */,
+ D231DCF02C73356E00F3F66C /* TintedToolbarViewController.storyboard in Resources */,
+ D231DCDD2C73356E00F3F66C /* ProgressViewController.storyboard in Resources */,
+ D231DCB42C73356E00F3F66C /* Assets.xcassets in Resources */,
+ D231DCE82C73356E00F3F66C /* SwitchViewController.storyboard in Resources */,
+ D231DCB12C73356E00F3F66C /* AlertControllerViewController.storyboard in Resources */,
+ D231DCEE2C73356E00F3F66C /* TextViewController.storyboard in Resources */,
+ D231DCB62C73356E00F3F66C /* ButtonViewController.storyboard in Resources */,
+ D231DCBA2C73356E00F3F66C /* ColorPickerViewController.storyboard in Resources */,
+ D231DCE42C73356E00F3F66C /* StackViewController.storyboard in Resources */,
+ D231DCCA2C73356E00F3F66C /* DefaultToolbarViewController.storyboard in Resources */,
+ D231DCE22C73356E00F3F66C /* SliderViewController.storyboard in Resources */,
+ D231DCCC2C73356E00F3F66C /* FontPickerViewController.storyboard in Resources */,
+ D231DCC82C73356E00F3F66C /* DefaultSearchBarViewController.storyboard in Resources */,
+ D231DCF52C73356E00F3F66C /* WebViewController.storyboard in Resources */,
+ D231DCD02C73356E00F3F66C /* ImageViewController.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ D29F754B2C4AA07E00288638 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D231DC2D2C73355800F3F66C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D231DCDE2C73356E00F3F66C /* ProgressViewController.swift in Sources */,
+ D231DCF42C73356E00F3F66C /* VisualEffectViewController.swift in Sources */,
+ D231DCB02C73356E00F3F66C /* ActivityIndicatorViewController.swift in Sources */,
+ D231DCE12C73356E00F3F66C /* SegmentedControlViewController.swift in Sources */,
+ D231DCE72C73356E00F3F66C /* StepperViewController.swift in Sources */,
+ D231DCC32C73356E00F3F66C /* CustomToolbarViewController.swift in Sources */,
+ D231DCCF2C73356E00F3F66C /* ImagePickerViewController.swift in Sources */,
+ D231DCB82C73356E00F3F66C /* ButtonViewController+Configs.swift in Sources */,
+ D231DCB52C73356E00F3F66C /* BaseTableViewController.swift in Sources */,
+ D231DCB72C73356E00F3F66C /* ButtonViewController.swift in Sources */,
+ D231DCF12C73356E00F3F66C /* TintedToolbarViewController.swift in Sources */,
+ D231DCD72C73356E00F3F66C /* MenuButtonViewController.swift in Sources */,
+ D231DCB92C73356E00F3F66C /* CaseElement.swift in Sources */,
+ D231DCF92C7342D500F3F66C /* ModuleBundle.swift in Sources */,
+ D231DCDC2C73356E00F3F66C /* PointerInteractionButtonViewController.swift in Sources */,
+ D231DCBB2C73356E00F3F66C /* ColorPickerViewController.swift in Sources */,
+ D231DCBF2C73356E00F3F66C /* CustomPageControlViewController.swift in Sources */,
+ D231DCD12C73356E00F3F66C /* ImageViewController.swift in Sources */,
+ D231DCF62C73356E00F3F66C /* WebViewController.swift in Sources */,
+ D231DCE32C73356E00F3F66C /* SliderViewController.swift in Sources */,
+ D231DCE92C73356E00F3F66C /* SwitchViewController.swift in Sources */,
+ D231DCED2C73356E00F3F66C /* TextFieldViewController.swift in Sources */,
+ D231DCDA2C73356E00F3F66C /* PickerViewController.swift in Sources */,
+ D231DCC52C73356E00F3F66C /* DatePickerController.swift in Sources */,
+ D231DCD82C73356E00F3F66C /* OutlineViewController.swift in Sources */,
+ D231DCC92C73356E00F3F66C /* DefaultSearchBarViewController.swift in Sources */,
+ D231DCEF2C73356E00F3F66C /* TextViewController.swift in Sources */,
+ D231DCC72C73356E00F3F66C /* DefaultPageControlViewController.swift in Sources */,
+ D231DCB22C73356E00F3F66C /* AlertControllerViewController.swift in Sources */,
+ D231DCCD2C73356E00F3F66C /* FontPickerViewController.swift in Sources */,
+ D231DCC12C73356E00F3F66C /* CustomSearchBarViewController.swift in Sources */,
+ D231DCEB2C73356E00F3F66C /* SymbolViewController.swift in Sources */,
+ D231DCE52C73356E00F3F66C /* StackViewController.swift in Sources */,
+ D231DCCB2C73356E00F3F66C /* DefaultToolbarViewController.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ D29F75492C4AA07E00288638 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D27606A42C514F37002D2A14 /* AppConfiguration.swift in Sources */,
+ D29F75502C4AA07E00288638 /* AppDelegate.swift in Sources */,
+ D27606A12C514F37002D2A14 /* SessionReplayScenario.swift in Sources */,
+ D24E15F32C776956005AE4E8 /* BenchmarkProfiler.swift in Sources */,
+ D24BFD472C6B916B00AB9604 /* SyntheticScenario.swift in Sources */,
+ D27606A32C514F37002D2A14 /* Scenario.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ D231DC362C73355800F3F66C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = D231DC302C73355800F3F66C /* UIKitCatalog */;
+ targetProxy = D231DC352C73355800F3F66C /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ D231DC412C73356D00F3F66C /* ActivityIndicatorViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC402C73356D00F3F66C /* Base */,
+ );
+ name = ActivityIndicatorViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC442C73356D00F3F66C /* AlertControllerViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC432C73356D00F3F66C /* Base */,
+ );
+ name = AlertControllerViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC4A2C73356D00F3F66C /* ButtonViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC492C73356D00F3F66C /* Base */,
+ );
+ name = ButtonViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC4F2C73356D00F3F66C /* ColorPickerViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC4E2C73356D00F3F66C /* Base */,
+ );
+ name = ColorPickerViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC522C73356D00F3F66C /* content.html */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC512C73356D00F3F66C /* Base */,
+ );
+ name = content.html;
+ sourceTree = "";
+ };
+ D231DC542C73356D00F3F66C /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC532C73356D00F3F66C /* Base */,
+ );
+ name = Credits.rtf;
+ sourceTree = "";
+ };
+ D231DC562C73356D00F3F66C /* CustomPageControlViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC552C73356D00F3F66C /* Base */,
+ );
+ name = CustomPageControlViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC592C73356D00F3F66C /* CustomSearchBarViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC582C73356D00F3F66C /* Base */,
+ );
+ name = CustomSearchBarViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC5C2C73356D00F3F66C /* CustomToolbarViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC5B2C73356D00F3F66C /* Base */,
+ );
+ name = CustomToolbarViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC5F2C73356D00F3F66C /* DatePickerController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC5E2C73356D00F3F66C /* Base */,
+ );
+ name = DatePickerController.storyboard;
+ sourceTree = "";
+ };
+ D231DC622C73356D00F3F66C /* DefaultPageControlViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC612C73356D00F3F66C /* Base */,
+ );
+ name = DefaultPageControlViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC652C73356D00F3F66C /* DefaultSearchBarViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC642C73356D00F3F66C /* Base */,
+ );
+ name = DefaultSearchBarViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC682C73356D00F3F66C /* DefaultToolbarViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC672C73356D00F3F66C /* Base */,
+ );
+ name = DefaultToolbarViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC6B2C73356D00F3F66C /* FontPickerViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC6A2C73356D00F3F66C /* Base */,
+ );
+ name = FontPickerViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC6E2C73356D00F3F66C /* ImagePickerViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC6D2C73356D00F3F66C /* Base */,
+ );
+ name = ImagePickerViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC712C73356D00F3F66C /* ImageViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC702C73356D00F3F66C /* Base */,
+ );
+ name = ImageViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC782C73356D00F3F66C /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC772C73356D00F3F66C /* Base */,
+ );
+ name = Localizable.strings;
+ sourceTree = "";
+ };
+ D231DC7A2C73356D00F3F66C /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC792C73356D00F3F66C /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ D231DC7C2C73356D00F3F66C /* MenuButtonViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC7B2C73356D00F3F66C /* Base */,
+ );
+ name = MenuButtonViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC802C73356D00F3F66C /* PickerViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC7F2C73356D00F3F66C /* Base */,
+ );
+ name = PickerViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC832C73356D00F3F66C /* PointerInteractionButtonViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC822C73356D00F3F66C /* Base */,
+ );
+ name = PointerInteractionButtonViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC862C73356D00F3F66C /* ProgressViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC852C73356D00F3F66C /* Base */,
+ );
+ name = ProgressViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC8A2C73356D00F3F66C /* SegmentedControlViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC892C73356D00F3F66C /* Base */,
+ );
+ name = SegmentedControlViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC8D2C73356D00F3F66C /* SliderViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC8C2C73356D00F3F66C /* Base */,
+ );
+ name = SliderViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC902C73356D00F3F66C /* StackViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC8F2C73356D00F3F66C /* Base */,
+ );
+ name = StackViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC932C73356D00F3F66C /* StepperViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC922C73356D00F3F66C /* Base */,
+ );
+ name = StepperViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC962C73356D00F3F66C /* SwitchViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC952C73356D00F3F66C /* Base */,
+ );
+ name = SwitchViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC992C73356D00F3F66C /* SymbolViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC982C73356D00F3F66C /* Base */,
+ );
+ name = SymbolViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC9C2C73356D00F3F66C /* TextFieldViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC9B2C73356D00F3F66C /* Base */,
+ );
+ name = TextFieldViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DC9F2C73356D00F3F66C /* TextViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DC9E2C73356D00F3F66C /* Base */,
+ );
+ name = TextViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DCA22C73356D00F3F66C /* TintedToolbarViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DCA12C73356D00F3F66C /* Base */,
+ );
+ name = TintedToolbarViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DCA72C73356D00F3F66C /* VisualEffectViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DCA62C73356D00F3F66C /* Base */,
+ );
+ name = VisualEffectViewController.storyboard;
+ sourceTree = "";
+ };
+ D231DCAA2C73356D00F3F66C /* WebViewController.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D231DCA92C73356D00F3F66C /* Base */,
+ );
+ name = WebViewController.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ D231DC392C73355800F3F66C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+ CODE_SIGN_STYLE = Automatic;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.datadoghq.benchmarks.UIKitCatalog;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ D231DC3A2C73355800F3F66C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+ CODE_SIGN_STYLE = Automatic;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.datadoghq.benchmarks.UIKitCatalog;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+ D231DC3B2C73355800F3F66C /* Synthetics */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+ CODE_SIGN_STYLE = Automatic;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.datadoghq.benchmarks.UIKitCatalog;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Synthetics;
+ };
+ D27606B62C526925002D2A14 /* Synthetics */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.5;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Synthetics;
+ };
+ D27606B72C526925002D2A14 /* Synthetics */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = D27606B42C526908002D2A14 /* Synthetics.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "Datadog Benchmark Runner";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.datadoghq.benchmarks.Runner;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Synthetics;
+ };
+ D29F75422C4A9EFB00288638 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.5;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ D29F75432C4A9EFB00288638 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.5;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ D29F755E2C4AA08000288638 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = D27606B32C526908002D2A14 /* Runner.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "Datadog Benchmark Runner";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.datadoghq.benchmarks.Runner;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ D29F755F2C4AA08000288638 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = D27606B32C526908002D2A14 /* Runner.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "Datadog Benchmark Runner";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.datadoghq.benchmarks.Runner;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ D231DC3C2C73355800F3F66C /* Build configuration list for PBXNativeTarget "UIKitCatalog" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D231DC392C73355800F3F66C /* Debug */,
+ D231DC3A2C73355800F3F66C /* Release */,
+ D231DC3B2C73355800F3F66C /* Synthetics */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ D29F752B2C4A9EFA00288638 /* Build configuration list for PBXProject "BenchmarkTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D29F75422C4A9EFB00288638 /* Debug */,
+ D29F75432C4A9EFB00288638 /* Release */,
+ D27606B62C526925002D2A14 /* Synthetics */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ D29F75602C4AA08000288638 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D29F755E2C4AA08000288638 /* Debug */,
+ D29F755F2C4AA08000288638 /* Release */,
+ D27606B72C526925002D2A14 /* Synthetics */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ D23DD32C2C58D80C00B90C4C /* DatadogBenchmarks */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = DatadogBenchmarks;
+ };
+ D27606A62C514F77002D2A14 /* DatadogCore */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = DatadogCore;
+ };
+ D27606A82C514F77002D2A14 /* DatadogLogs */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = DatadogLogs;
+ };
+ D27606AA2C514F77002D2A14 /* DatadogRUM */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = DatadogRUM;
+ };
+ D27606AC2C514F77002D2A14 /* DatadogSessionReplay */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = DatadogSessionReplay;
+ };
+ D27606AE2C514F77002D2A14 /* DatadogTrace */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = DatadogTrace;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = D29F75282C4A9EFA00288638 /* Project object */;
+}
diff --git a/dependency-manager-tests/spm/SPMProject.xcodeproj.src/project.xcworkspace/contents.xcworkspacedata b/BenchmarkTests/BenchmarkTests.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from dependency-manager-tests/spm/SPMProject.xcodeproj.src/project.xcworkspace/contents.xcworkspacedata
rename to BenchmarkTests/BenchmarkTests.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/Shopist/Shopist.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/BenchmarkTests/BenchmarkTests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from Shopist/Shopist.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to BenchmarkTests/BenchmarkTests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/BenchmarkTests/BenchmarkTests.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/BenchmarkTests/BenchmarkTests.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000000..73079a7d00
--- /dev/null
+++ b/BenchmarkTests/BenchmarkTests.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/Benchmarks/Package.swift b/BenchmarkTests/Benchmarks/Package.swift
new file mode 100644
index 0000000000..7484f7b117
--- /dev/null
+++ b/BenchmarkTests/Benchmarks/Package.swift
@@ -0,0 +1,57 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+import Foundation
+
+let package = Package(
+ name: "DatadogBenchmarks",
+ products: [
+ .library(
+ name: "DatadogBenchmarks",
+ targets: ["DatadogBenchmarks"]
+ )
+ ]
+)
+
+func addOpenTelemetryDependency(_ version: Version) {
+ // The project must be open with the 'OTEL_SWIFT' env variable.
+ // Please run 'make benchmark-tests-open' from the root directory.
+ //
+ // Note: Carthage will still try to resolve dependencies of Xcode projects in
+ // sub directories, in this case the project will depend on the default
+ // 'DataDog/opentelemetry-swift-packages' depedency.
+ if ProcessInfo.processInfo.environment["OTEL_SWIFT"] != nil {
+ package.dependencies = [
+ .package(url: "https://github.com/open-telemetry/opentelemetry-swift", exact: version)
+ ]
+
+ package.targets = [
+ .target(
+ name: "DatadogBenchmarks",
+ dependencies: [
+ .product(name: "OpenTelemetryApi", package: "opentelemetry-swift"),
+ .product(name: "OpenTelemetrySdk", package: "opentelemetry-swift"),
+ .product(name: "DatadogExporter", package: "opentelemetry-swift")
+ ],
+ swiftSettings: [.define("OTEL_SWIFT")]
+ )
+ ]
+ } else {
+ package.dependencies = [
+ .package(url: "https://github.com/DataDog/opentelemetry-swift-packages", exact: version)
+ ]
+
+ package.targets = [
+ .target(
+ name: "DatadogBenchmarks",
+ dependencies: [
+ .product(name: "OpenTelemetryApi", package: "opentelemetry-swift-packages")
+ ],
+ swiftSettings: [.define("OTEL_API")]
+ )
+ ]
+ }
+}
+
+addOpenTelemetryDependency("1.6.0")
diff --git a/BenchmarkTests/Benchmarks/Sources/Benchmarks.swift b/BenchmarkTests/Benchmarks/Sources/Benchmarks.swift
new file mode 100644
index 0000000000..2a45d5ebb2
--- /dev/null
+++ b/BenchmarkTests/Benchmarks/Sources/Benchmarks.swift
@@ -0,0 +1,171 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+#if OTEL_API
+#error("Benchmarks depends on opentelemetry-swift. Please open the project with 'make benchmark-tests-open'.")
+#endif
+
+import Foundation
+import OpenTelemetryApi
+import OpenTelemetrySdk
+import DatadogExporter
+
+let instrumentationName = "benchmarks"
+let instrumentationVersion = "1.0.0"
+
+/// Benchmark entrypoint to configure opentelemetry with metrics meters
+/// and tracer.
+public enum Benchmarks {
+ /// Configuration of the Benchmarks library.
+ public struct Configuration {
+ /// Context of Benchmarks measures.
+ /// The context properties will be added to metrics as tags.
+ public struct Context {
+ var applicationIdentifier: String
+ var applicationName: String
+ var applicationVersion: String
+ var sdkVersion: String
+ var deviceModel: String
+ var osName: String
+ var osVersion: String
+ var run: String
+ var scenario: String
+ var branch: String
+
+ public init(
+ applicationIdentifier: String,
+ applicationName: String,
+ applicationVersion: String,
+ sdkVersion: String,
+ deviceModel: String,
+ osName: String,
+ osVersion: String,
+ run: String,
+ scenario: String,
+ branch: String
+ ) {
+ self.applicationIdentifier = applicationIdentifier
+ self.applicationName = applicationName
+ self.applicationVersion = applicationVersion
+ self.sdkVersion = sdkVersion
+ self.deviceModel = deviceModel
+ self.osName = osName
+ self.osVersion = osVersion
+ self.run = run
+ self.scenario = scenario
+ self.branch = branch
+ }
+ }
+
+ var clientToken: String
+ var apiKey: String
+ var context: Context
+
+ public init(
+ clientToken: String,
+ apiKey: String,
+ context: Context
+ ) {
+ self.clientToken = clientToken
+ self.apiKey = apiKey
+ self.context = context
+ }
+ }
+
+ /// Configure OpenTelemetry metrics meter and start measuring Memory.
+ ///
+ /// - Parameter configuration: The Benchmark configuration.
+ public static func enableMetrics(with configuration: Configuration) {
+ let metricExporter = MetricExporter(
+ configuration: MetricExporter.Configuration(
+ apiKey: configuration.apiKey,
+ version: instrumentationVersion
+ )
+ )
+
+ let meterProvider = MeterProviderBuilder()
+ .with(pushInterval: 10)
+ .with(processor: MetricProcessorSdk())
+ .with(exporter: metricExporter)
+ .with(resource: Resource())
+ .build()
+
+ let meter = meterProvider.get(
+ instrumentationName: instrumentationName,
+ instrumentationVersion: instrumentationVersion
+ )
+
+ let labels = [
+ "device_model": configuration.context.deviceModel,
+ "os": configuration.context.osName,
+ "os_version": configuration.context.osVersion,
+ "run": configuration.context.run,
+ "scenario": configuration.context.scenario,
+ "application_id": configuration.context.applicationIdentifier,
+ "sdk_version": configuration.context.sdkVersion,
+ "branch": configuration.context.branch,
+ ]
+
+ let queue = DispatchQueue(label: "com.datadoghq.benchmarks.metrics", qos: .utility)
+
+ let memory = Memory(queue: queue)
+ _ = meter.createDoubleObservableGauge(name: "ios.benchmark.memory") { metric in
+ // report the maximum memory footprint that was recorded during push interval
+ if let value = memory.aggregation?.max {
+ metric.observe(value: value, labels: labels)
+ }
+
+ memory.reset()
+ }
+
+ let cpu = CPU(queue: queue)
+ _ = meter.createDoubleObservableGauge(name: "ios.benchmark.cpu") { metric in
+ // report the average cpu usage that was recorded during push interval
+ if let value = cpu.aggregation?.avg {
+ metric.observe(value: value, labels: labels)
+ }
+
+ cpu.reset()
+ }
+
+ let fps = FPS()
+ _ = meter.createIntObservableGauge(name: "ios.benchmark.fps.min") { metric in
+ // report the minimum frame rate that was recorded during push interval
+ if let value = fps.aggregation?.min {
+ metric.observe(value: value, labels: labels)
+ }
+
+ fps.reset()
+ }
+
+ OpenTelemetry.registerMeterProvider(meterProvider: meterProvider)
+ }
+
+ /// Configure and register a OpenTelemetry Tracer.
+ ///
+ /// - Parameter configuration: The Benchmark configuration.
+ public static func enableTracer(with configuration: Configuration) {
+ let exporterConfiguration = ExporterConfiguration(
+ serviceName: configuration.context.applicationIdentifier,
+ resource: "Benchmark Tracer",
+ applicationName: configuration.context.applicationName,
+ applicationVersion: configuration.context.applicationVersion,
+ environment: "benchmarks",
+ apiKey: configuration.apiKey,
+ endpoint: .us1,
+ uploadCondition: { true }
+ )
+
+ let exporter = try! DatadogExporter(config: exporterConfiguration)
+ let processor = SimpleSpanProcessor(spanExporter: exporter)
+
+ let provider = TracerProviderBuilder()
+ .add(spanProcessor: processor)
+ .build()
+
+ OpenTelemetry.registerTracerProvider(tracerProvider: provider)
+ }
+}
diff --git a/BenchmarkTests/Benchmarks/Sources/MetricExporter.swift b/BenchmarkTests/Benchmarks/Sources/MetricExporter.swift
new file mode 100644
index 0000000000..98429b227d
--- /dev/null
+++ b/BenchmarkTests/Benchmarks/Sources/MetricExporter.swift
@@ -0,0 +1,162 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import Foundation
+import OpenTelemetrySdk
+
+enum MetricExporterError: Error {
+ case unsupportedMetric(aggregation: AggregationType, dataType: Any.Type)
+}
+
+/// Replacement of otel `DatadogExporter` for metrics.
+///
+/// This version does not store data to disk, it uploads to the intake directly.
+/// Additionally, it does not crash.
+final class MetricExporter: OpenTelemetrySdk.MetricExporter {
+ struct Configuration {
+ let apiKey: String
+ let version: String
+ }
+
+ /// The type of metric. The available types are 0 (unspecified), 1 (count), 2 (rate), and 3 (gauge). Allowed enum values: 0,1,2,3
+ enum MetricType: Int, Codable {
+ case unspecified = 0
+ case count = 1
+ case rate = 2
+ case gauge = 3
+ }
+
+ /// https://docs.datadoghq.com/api/latest/metrics/#submit-metrics
+ internal struct Serie: Codable {
+ struct Point: Codable {
+ let timestamp: Int64
+ let value: Double
+ }
+
+ struct Resource: Codable {
+ let name: String
+ let type: String
+ }
+
+ let type: MetricType
+ let interval: Int64?
+ let metric: String
+ let unit: String?
+ let points: [Point]
+ let resources: [Resource]
+ let tags: [String]
+ }
+
+ let session: URLSession
+ let encoder = JSONEncoder()
+ let configuration: Configuration
+
+ // swiftlint:disable force_unwrapping
+ let intake = URL(string: "https://api.datadoghq.com/api/v2/series")!
+ let prefix = "{ \"series\": [".data(using: .utf8)!
+ let separator = ",".data(using: .utf8)!
+ let suffix = "]}".data(using: .utf8)!
+ // swiftlint:enable force_unwrapping
+
+ required init(configuration: Configuration) {
+ let sessionConfiguration: URLSessionConfiguration = .ephemeral
+ sessionConfiguration.urlCache = nil
+ self.session = URLSession(configuration: sessionConfiguration)
+ self.configuration = configuration
+ }
+
+ func export(metrics: [Metric], shouldCancel: (() -> Bool)?) -> MetricExporterResultCode {
+ do {
+ let series = try metrics.map(transform)
+ try submit(series: series)
+ return.success
+ } catch {
+ return .failureNotRetryable
+ }
+ }
+
+ /// Transforms otel `Metric` to Datadog `serie`.
+ ///
+ /// - Parameter metric: The otel metric
+ /// - Returns: The timeserie.
+ func transform(_ metric: Metric) throws -> Serie {
+ var tags: Set = []
+
+ let points: [Serie.Point] = try metric.data.map { data in
+ let timestamp = Int64(data.timestamp.timeIntervalSince1970)
+
+ data.labels.forEach { tags.insert("\($0):\($1)") }
+
+ switch data {
+ case let data as SumData:
+ return Serie.Point(timestamp: timestamp, value: data.sum)
+ case let data as SumData:
+ return Serie.Point(timestamp: timestamp, value: Double(data.sum))
+ case let data as SummaryData:
+ return Serie.Point(timestamp: timestamp, value: data.sum)
+ case let data as SummaryData:
+ return Serie.Point(timestamp: timestamp, value: Double(data.sum))
+// case let data as HistogramData:
+// return Serie.Point(timestamp: timestamp, value: Double(data.sum))
+// case let data as HistogramData:
+// return Serie.Point(timestamp: timestamp, value: data.sum)
+ default:
+ throw MetricExporterError.unsupportedMetric(
+ aggregation: metric.aggregationType,
+ dataType: type(of: data)
+ )
+ }
+ }
+
+ return Serie(
+ type: MetricType(metric.aggregationType),
+ interval: nil,
+ metric: metric.name,
+ unit: nil,
+ points: points,
+ resources: [],
+ tags: Array(tags)
+ )
+ }
+
+ /// Submit timeseries to the Metrics intake.
+ ///
+ /// - Parameter series: The timeseries.
+ func submit(series: [Serie]) throws {
+ var data = try series.reduce(Data()) { data, serie in
+ try data + encoder.encode(serie) + separator
+ }
+
+ // remove last separator
+ data.removeLast(separator.count)
+
+ var request = URLRequest(url: intake)
+ request.httpMethod = "POST"
+ request.allHTTPHeaderFields = [
+ "Content-Type": "application/json",
+ "DD-API-KEY": configuration.apiKey,
+ "DD-EVP-ORIGIN": "ios",
+ "DD-EVP-ORIGIN-VERSION": configuration.version,
+ "DD-REQUEST-ID": UUID().uuidString,
+ ]
+
+ request.httpBody = prefix + data + suffix
+ session.dataTask(with: request).resume()
+ }
+}
+
+private extension MetricExporter.MetricType {
+ init(_ type: OpenTelemetrySdk.AggregationType) {
+ switch type {
+ case .doubleSum, .intSum:
+ self = .count
+ case .intGauge, .doubleGauge:
+ self = .gauge
+ case .doubleSummary, .intSummary, .doubleHistogram, .intHistogram:
+ self = .unspecified
+ }
+ }
+}
diff --git a/BenchmarkTests/Benchmarks/Sources/Metrics.swift b/BenchmarkTests/Benchmarks/Sources/Metrics.swift
new file mode 100644
index 0000000000..9c6666546c
--- /dev/null
+++ b/BenchmarkTests/Benchmarks/Sources/Metrics.swift
@@ -0,0 +1,275 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import Foundation
+import QuartzCore
+
+// The `TASK_VM_INFO_COUNT` and `TASK_VM_INFO_REV1_COUNT` macros are too
+// complex for the Swift C importer, so we have to define them ourselves.
+let TASK_VM_INFO_COUNT = mach_msg_type_number_t(MemoryLayout.size / MemoryLayout.size)
+let TASK_VM_INFO_REV1_COUNT = mach_msg_type_number_t(MemoryLayout.offset(of: \task_vm_info_data_t.min_address)! / MemoryLayout.size)
+
+internal enum MachError: Error {
+ case task_info(return: kern_return_t)
+ case task_threads(return: kern_return_t)
+ case thread_info(return: kern_return_t)
+}
+
+/// Aggregate metric values and compute `min`, `max`, `sum`, `avg`, and `count`.
+internal class MetricAggregator where T: Numeric {
+ internal struct Aggregation {
+ let min: T
+ let max: T
+ let sum: T
+ let count: Int
+ let avg: Double
+ }
+
+ private var mutex = pthread_mutex_t()
+ private var _aggregation: Aggregation?
+
+ var aggregation: Aggregation? {
+ pthread_mutex_lock(&mutex)
+ defer { pthread_mutex_unlock(&mutex) }
+ return _aggregation
+ }
+
+ /// Resets the minimum frame rate to `nil`.
+ func reset() {
+ pthread_mutex_lock(&mutex)
+ _aggregation = nil
+ pthread_mutex_unlock(&mutex)
+ }
+
+ deinit {
+ pthread_mutex_destroy(&mutex)
+ }
+}
+
+extension MetricAggregator where T: BinaryInteger {
+ /// Records a `BinaryInteger` value.
+ ///
+ /// - Parameter value: The value to record.
+ func record(value: T) {
+ pthread_mutex_lock(&mutex)
+ _aggregation = _aggregation.map {
+ let sum = $0.sum + value
+ let count = $0.count + 1
+ return Aggregation(
+ min: Swift.min($0.min, value),
+ max: Swift.max($0.max, value),
+ sum: sum,
+ count: count,
+ avg: Double(sum) / Double(count)
+ )
+ } ?? Aggregation(min: value, max: value, sum: value, count: 1, avg: Double(value))
+ pthread_mutex_unlock(&mutex)
+ }
+}
+
+extension MetricAggregator where T: BinaryFloatingPoint {
+ /// Records a `BinaryFloatingPoint` value.
+ ///
+ /// - Parameter value: The value to record.
+ func record(value: T) {
+ pthread_mutex_lock(&mutex)
+ _aggregation = _aggregation.map {
+ let sum = $0.sum + value
+ let count = $0.count + 1
+ return Aggregation(
+ min: Swift.min($0.min, value),
+ max: Swift.max($0.max, value),
+ sum: sum,
+ count: count,
+ avg: Double(sum) / Double(count)
+ )
+ } ?? Aggregation(min: value, max: value, sum: value, count: 1, avg: Double(value))
+ pthread_mutex_unlock(&mutex)
+ }
+}
+
+/// Collect Memory footprint metric.
+///
+/// Based on a timer, the `Memory` aggregator will periodically record the memory footprint.
+internal final class Memory: MetricAggregator {
+ /// Dispatch source object for monitoring timer events.
+ private let timer: DispatchSourceTimer
+
+ /// Create a `Memory` aggregator to periodically record the memory footprint on the
+ /// provided queue.
+ ///
+ /// By default, the timer is scheduled with 100 ms interval with 10 ms leeway.
+ ///
+ /// - Parameters:
+ /// - queue: The queue on which to execute the timer handler.
+ /// - interval: The timer interval, default to 100 ms.
+ /// - leeway: The timer leeway, default to 10 ms.
+ required init(
+ queue: DispatchQueue,
+ every interval: DispatchTimeInterval = .milliseconds(100),
+ leeway: DispatchTimeInterval = .milliseconds(10)
+ ) {
+ timer = DispatchSource.makeTimerSource(queue: queue)
+ super.init()
+
+ timer.setEventHandler { [weak self] in
+ guard let self, let footprint = try? self.footprint() else {
+ return
+ }
+
+ self.record(value: footprint)
+ }
+
+ timer.schedule(deadline: .now(), repeating: interval, leeway: leeway)
+ timer.activate()
+ }
+
+ deinit {
+ timer.cancel()
+ }
+
+ /// Collects single sample of current memory footprint.
+ ///
+ /// The computation is based on https://developer.apple.com/forums/thread/105088
+ /// It leverages recommended `phys_footprint` value, which returns values that are close to Xcode's _Memory Use_
+ /// gauge and _Allocations Instrument_.
+ ///
+ /// - Returns: Current memory footprint in bytes, `throws` if failed to read.
+ private func footprint() throws -> Double {
+ var info = task_vm_info_data_t()
+ var count = TASK_VM_INFO_COUNT
+ let kr = withUnsafeMutablePointer(to: &info) {
+ $0.withMemoryRebound(to: integer_t.self, capacity: Int(count)) {
+ task_info(mach_task_self_, task_flavor_t(TASK_VM_INFO), $0, &count)
+ }
+ }
+
+ guard kr == KERN_SUCCESS, count >= TASK_VM_INFO_REV1_COUNT else {
+ throw MachError.task_info(return: kr)
+ }
+
+ return Double(info.phys_footprint)
+ }
+}
+
+/// Collect CPU usage metric.
+///
+/// Based on a timer, the `CPU` aggregator will periodically record the CPU usage.
+internal final class CPU: MetricAggregator {
+ /// Dispatch source object for monitoring timer events.
+ private let timer: DispatchSourceTimer
+
+ /// Create a `CPU` aggregator to periodically record the CPU usage on the
+ /// provided queue.
+ ///
+ /// By default, the timer is scheduled with 100 ms interval with 10 ms leeway.
+ ///
+ /// - Parameters:
+ /// - queue: The queue on which to execute the timer handler.
+ /// - interval: The timer interval, default to 100 ms.
+ /// - leeway: The timer leeway, default to 10 ms.
+ init(
+ queue: DispatchQueue,
+ every interval: DispatchTimeInterval = .milliseconds(100),
+ leeway: DispatchTimeInterval = .milliseconds(10)
+ ) {
+ self.timer = DispatchSource.makeTimerSource(queue: queue)
+ super.init()
+
+ timer.setEventHandler { [weak self] in
+ guard let self, let usage = try? self.usage() else {
+ return
+ }
+
+ self.record(value: usage)
+ }
+
+ timer.schedule(deadline: .now(), repeating: interval, leeway: leeway)
+ timer.activate()
+ }
+
+ deinit {
+ timer.cancel()
+ }
+
+ /// Collect single sample of current cpu usage.
+ ///
+ /// The computation is based on https://gist.github.com/hisui/10004131#file-cpu-usage-cpp
+ /// It reads the `cpu_usage` from all thread to compute the application usage percentage.
+ ///
+ /// - Returns: The cpu usage of all threads.
+ private func usage() throws -> Double {
+ var threads_list: thread_act_array_t?
+ var threads_count = mach_msg_type_number_t()
+ let kr = withUnsafeMutablePointer(to: &threads_list) {
+ $0.withMemoryRebound(to: thread_act_array_t?.self, capacity: 1) {
+ task_threads(mach_task_self_, $0, &threads_count)
+ }
+ }
+
+ guard kr == KERN_SUCCESS, let threads_list = threads_list else {
+ throw MachError.task_threads(return: kr)
+ }
+
+ defer {
+ vm_deallocate(mach_task_self_, vm_address_t(bitPattern: threads_list), vm_size_t(Int(threads_count) * MemoryLayout.stride))
+ }
+
+ return try (0.. {
+ private class CADisplayLinker {
+ weak var fps: FPS?
+
+ init() { }
+
+ @objc
+ func tick(link: CADisplayLink) {
+ guard let fps else {
+ return
+ }
+
+ let rate = 1 / (link.targetTimestamp - link.timestamp)
+ fps.record(value: lround(rate))
+ }
+ }
+
+ private var displayLink: CADisplayLink
+
+ override init() {
+ let linker = CADisplayLinker()
+ displayLink = CADisplayLink(target: linker, selector: #selector(CADisplayLinker.tick(link:)))
+ super.init()
+
+ linker.fps = self
+ displayLink.add(to: RunLoop.main, forMode: .common)
+ }
+
+ deinit {
+ displayLink.invalidate()
+ }
+}
diff --git a/BenchmarkTests/Makefile b/BenchmarkTests/Makefile
new file mode 100644
index 0000000000..e0478c0f52
--- /dev/null
+++ b/BenchmarkTests/Makefile
@@ -0,0 +1,73 @@
+.PHONY: clean archive export upload
+
+REPO_ROOT := ../
+include ../tools/utils/common.mk
+
+BUILD_DIR := .build
+ARCHIVE_PATH := $(BUILD_DIR)/Runner.xcarchive
+IPA_PATH := $(ARTIFACTS_PATH)/Runner.ipa
+
+clean:
+ @$(ECHO_SUBTITLE2) "make clean"
+ rm -rf "$(BUILD_DIR)"
+ifdef ARTIFACTS_PATH
+ rm -rf "$(IPA_PATH)"
+endif
+
+build:
+ @$(ECHO_SUBTITLE2) "make build"
+ set -eo pipefail; \
+ DD_BENCHMARK=1 OTEL_SWIFT=1 xcodebuild \
+ -project BenchmarkTests.xcodeproj \
+ -scheme Runner \
+ -sdk iphonesimulator \
+ -configuration Release \
+ -destination generic/platform=iOS\ Simulator \
+ | xcbeautify
+ @$(ECHO_SUCCESS) "BenchmarkTests compiles"
+
+archive:
+ @:$(eval VERSION ?= $(CURRENT_GIT_COMMIT_SHORT))
+ @$(ECHO_SUBTITLE2) "make archive VERSION='$(VERSION)'"
+ @xcrun agvtool new-version "$(VERSION)"
+ set -eo pipefail; \
+ DD_BENCHMARK=1 OTEL_SWIFT=1 xcodebuild \
+ -project BenchmarkTests.xcodeproj \
+ -scheme Runner \
+ -sdk iphoneos \
+ -configuration Synthetics \
+ -destination generic/platform=iOS \
+ -archivePath $(ARCHIVE_PATH) \
+ archive | xcbeautify
+ @$(ECHO_SUCCESS) "Archive ready in '$(ARCHIVE_PATH)'"
+
+export:
+ @$(call require_param,ARTIFACTS_PATH)
+ @:$(eval VERSION ?= $(CURRENT_GIT_COMMIT_SHORT))
+ @$(ECHO_SUBTITLE2) "make export VERSION='$(VERSION)' ARTIFACTS_PATH='$(ARTIFACTS_PATH)'"
+ set -o pipefaill; \
+ xcodebuild -exportArchive \
+ -archivePath $(ARCHIVE_PATH) \
+ -exportOptionsPlist exportOptions.plist \
+ -exportPath $(BUILD_DIR) \
+ | xcbeautify
+ mkdir -p "$(ARTIFACTS_PATH)"
+ cp -v "$(BUILD_DIR)/Runner.ipa" "$(IPA_PATH)"
+ @$(ECHO_SUCCESS) "IPA exported to '$(IPA_PATH)'"
+
+upload:
+ @$(call require_param,ARTIFACTS_PATH)
+ @$(call require_param,DATADOG_API_KEY)
+ @$(call require_param,DATADOG_APP_KEY)
+ @$(call require_param,S8S_APPLICATION_ID)
+ @:$(eval VERSION ?= $(CURRENT_GIT_COMMIT_SHORT))
+ @$(ECHO_SUBTITLE2) "make upload VERSION='$(VERSION)' ARTIFACTS_PATH='$(ARTIFACTS_PATH)'"
+ datadog-ci synthetics upload-application \
+ --mobileApp "$(IPA_PATH)" \
+ --mobileApplicationId "${S8S_APPLICATION_ID}" \
+ --versionName "$(VERSION)" \
+ --latest
+
+open:
+ @$(ECHO_SUBTITLE2) "make open"
+ @open --env DD_BENCHMARK --env OTEL_SWIFT --new BenchmarkTests.xcodeproj
diff --git a/BenchmarkTests/README.md b/BenchmarkTests/README.md
new file mode 100644
index 0000000000..38c1e6fcbc
--- /dev/null
+++ b/BenchmarkTests/README.md
@@ -0,0 +1,79 @@
+# Benchmark Tests
+
+[Synthetics for Mobile](https://docs.datadoghq.com/mobile_app_testing/) runs Benchmark test scenarios to collect metrics of the SDK performances.
+
+
+## CI
+
+CI continuously builds, signs, and uploads a runner application to Synthetics, which runs predefined tests.
+
+### Build
+
+Before building the application, make sure the `BenchmarkTests/xcconfigs/Benchmark.local.xcconfig` configuration file is present and contains the `Mobile - Integration Org` client token, RUM application ID, and API Key. These values are sensitive and must be securely stored.
+
+```ini
+CLIENT_TOKEN=
+RUM_APPLICATION_ID=
+API_KEY=
+```
+
+### Sign
+
+To sign the runner application, the certificate and provision profile defined in [Synthetics.xcconfig](xcconfigs/Synthetics.xcconfig) and in [exportOptions.plist](exportOptions.plist) needs to be installed on the build machine. The certificate and profile are sensitive files and must be securely stored. Make sure to update both files when updating the certificate and provisioning profile, otherwise signing fails.
+
+> [!NOTE]
+> Certificate & Provisioning Profile are also available through the [App Store Connect API](https://developer.apple.com/documentation/appstoreconnectapi). But we don't have the tooling in place.
+
+### Upload
+
+The application version (build number) is set to the commit SHA of the current job, and the build is uploaded to Synthetics using the [datadog-ci](https://github.com/DataDog/datadog-ci) CLI. This step expects environment variables to authenticate with the `Mobile - Integration Org`:
+
+```bash
+export DATADOG_API_KEY=
+export DATADOG_APP_KEY=
+export S8S_APPLICATION_ID=
+```
+
+## Development
+
+Each scenario is independent and can be considered as an app within the runner.
+
+### Create a scenario
+
+A scenario must comply with the [`Scenario`](Runner/Scenarios/Scenario.swift) protocol. Upon start, a scenario initializes the SDK, enables features, and returns a root view-controller.
+
+Here is a simple example of a scenario using Logs:
+```swift
+import Foundation
+import UIKit
+
+import DatadogCore
+import DatadogLogs
+
+struct LogsScenario: Scenario {
+
+ /// The initial view-controller of the scenario
+ let initialViewController: UIViewController = LoggerViewController()
+
+ /// Start instrumenting the application by enabling the Datadog SDK and
+ /// its Features.
+ ///
+ /// - Parameter info: The application information to use during SDK
+ /// initialisation.
+ func instrument(with info: AppInfo) {
+
+ Datadog.initialize(
+ with: .benchmark(info: info), // SDK init with the benchmark configuration
+ trackingConsent: .granted
+ )
+
+ Logs.enable()
+ }
+}
+```
+
+Add the test to the [`SyntheticScenario`](Runner/Scenarios/SyntheticScenario.swift#L12) object so it can be selected by setting the `BENCHMARK_SCENARIO` environment variable.
+
+### Synthetics Configuration
+
+Please refer to [Confluence page (internal)](https://datadoghq.atlassian.net/wiki/spaces/RUMP/pages/3981476482/Benchmarks+iOS)
\ No newline at end of file
diff --git a/BenchmarkTests/Runner/AppConfiguration.swift b/BenchmarkTests/Runner/AppConfiguration.swift
new file mode 100644
index 0000000000..be251360c6
--- /dev/null
+++ b/BenchmarkTests/Runner/AppConfiguration.swift
@@ -0,0 +1,76 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import Foundation
+import DatadogInternal
+import DatadogCore
+
+/// Application info reads configuration from `Info.plist`.
+///
+/// The expected format is as follow:
+///
+///
+/// DatadogConfiguration
+///
+/// ClientToken
+/// $(CLIENT_TOKEN)
+/// ApplicationID
+/// $(RUM_APPLICATION_ID)
+/// ApiKey
+/// $(API_KEY)
+/// Environment
+/// $(DD_ENV)
+/// Site
+/// $(DD_SITE)
+///
+///
+struct AppInfo: Decodable {
+ let clientToken: String
+ let applicationID: String
+ let apiKey: String
+ let site: DatadogSite
+ let env: String
+
+ enum CodingKeys: String, CodingKey {
+ case clientToken = "ClientToken"
+ case applicationID = "ApplicationID"
+ case apiKey = "ApiKey"
+ case site = "Site"
+ case env = "Environment"
+ }
+}
+
+extension AppInfo {
+ init(bundle: Bundle = .main) throws {
+ let decoder = AnyDecoder()
+ let obj = bundle.object(forInfoDictionaryKey: "DatadogConfiguration")
+ self = try decoder.decode(from: obj)
+ }
+}
+
+extension AppInfo {
+ static var empty: Self {
+ .init(
+ clientToken: "",
+ applicationID: "",
+ apiKey: "",
+ site: .us1,
+ env: "benchmarks"
+ )
+ }
+}
+
+extension DatadogSite: Decodable {}
+
+extension Datadog.Configuration {
+ static func benchmark(info: AppInfo) -> Self {
+ .init(
+ clientToken: info.clientToken,
+ env: info.env,
+ site: info.site
+ )
+ }
+}
diff --git a/BenchmarkTests/Runner/AppDelegate.swift b/BenchmarkTests/Runner/AppDelegate.swift
new file mode 100644
index 0000000000..4ba37aa573
--- /dev/null
+++ b/BenchmarkTests/Runner/AppDelegate.swift
@@ -0,0 +1,88 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import UIKit
+import DatadogInternal
+import DatadogBenchmarks
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+ var window: UIWindow?
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ guard let scenario = SyntheticScenario() else {
+ return false
+ }
+
+ let run = SyntheticRun()
+ let applicationInfo = try! AppInfo() // crash if info are missing or malformed
+
+ switch run {
+ case .baseline, .instrumented:
+ // measure metrics during baseline and metrics runs
+ Benchmarks.enableMetrics(
+ with: Benchmarks.Configuration(
+ info: applicationInfo,
+ scenario: scenario,
+ run: run
+ )
+ )
+ case .profiling:
+ // Collect traces during profiling run
+ Benchmarks.enableTracer(
+ with: Benchmarks.Configuration(
+ info: applicationInfo,
+ scenario: scenario,
+ run: run
+ )
+ )
+
+ DatadogInternal.profiler = Profiler()
+ case .none:
+ break
+ }
+
+ if run != .baseline {
+ // instrument the application with Datadog SDK
+ // when not in baseline run
+ scenario.instrument(with: applicationInfo)
+ }
+
+ window = UIWindow(frame: UIScreen.main.bounds)
+ window?.rootViewController = scenario.initialViewController
+ window?.makeKeyAndVisible()
+
+ return true
+ }
+}
+
+extension Benchmarks.Configuration {
+ init(
+ info: AppInfo,
+ scenario: SyntheticScenario,
+ run: SyntheticRun,
+ bundle: Bundle = .main,
+ sysctl: SysctlProviding = Sysctl(),
+ device: UIDevice = .current
+ ) {
+ self.init(
+ clientToken: info.clientToken,
+ apiKey: info.apiKey,
+ context: Benchmarks.Configuration.Context(
+ applicationIdentifier: bundle.bundleIdentifier!,
+ applicationName: bundle.object(forInfoDictionaryKey: "CFBundleExecutable") as! String,
+ applicationVersion: bundle.object(forInfoDictionaryKey: "CFBundleVersion") as! String,
+ sdkVersion: "",
+ deviceModel: try! sysctl.model(),
+ osName: device.systemName,
+ osVersion: device.systemVersion,
+ run: run.rawValue,
+ scenario: scenario.name.rawValue,
+ branch: ""
+ )
+ )
+ }
+}
diff --git a/BenchmarkTests/Runner/BenchmarkProfiler.swift b/BenchmarkTests/Runner/BenchmarkProfiler.swift
new file mode 100644
index 0000000000..8030f5b506
--- /dev/null
+++ b/BenchmarkTests/Runner/BenchmarkProfiler.swift
@@ -0,0 +1,26 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import Foundation
+
+import DatadogInternal
+import DatadogBenchmarks
+
+internal final class Profiler: DatadogInternal.BenchmarkProfiler {
+ func tracer(operation: @autoclosure () -> String) -> any DatadogInternal.BenchmarkTracer {
+ DummyTracer()
+ }
+}
+
+internal final class DummyTracer: DatadogInternal.BenchmarkTracer {
+ func startSpan(named: @autoclosure () -> String) -> any DatadogInternal.BenchmarkSpan {
+ DummySpan()
+ }
+}
+
+internal final class DummySpan: DatadogInternal.BenchmarkSpan {
+ func stop() { }
+}
diff --git a/BenchmarkTests/Runner/Info.plist b/BenchmarkTests/Runner/Info.plist
new file mode 100644
index 0000000000..1c5a6ca83d
--- /dev/null
+++ b/BenchmarkTests/Runner/Info.plist
@@ -0,0 +1,19 @@
+
+
+
+
+ DatadogConfiguration
+
+ ApiKey
+ $(API_KEY)
+ ApplicationID
+ $(RUM_APPLICATION_ID)
+ ClientToken
+ $(CLIENT_TOKEN)
+ Environment
+ $(DD_ENV)
+ Site
+ $(DD_SITE)
+
+
+
diff --git a/BenchmarkTests/Runner/Scenarios/Scenario.swift b/BenchmarkTests/Runner/Scenarios/Scenario.swift
new file mode 100644
index 0000000000..b844e8ce07
--- /dev/null
+++ b/BenchmarkTests/Runner/Scenarios/Scenario.swift
@@ -0,0 +1,24 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import Foundation
+import UIKit
+
+/// A `Scenario` is the entry-point of the Benchmark Runner Application.
+///
+/// The compliant objects are responsible for initializing the SDK, enabling
+/// Features, and create the initial view-controller.
+protocol Scenario {
+ /// The initial view-controller of the scenario
+ var initialViewController: UIViewController { get }
+
+ /// Start instrumenting the application by enabling the Datadog SDK and
+ /// its Features.
+ ///
+ /// - Parameter info: The application information to use during SDK
+ /// initialisation.
+ func instrument(with info: AppInfo)
+}
diff --git a/BenchmarkTests/Runner/Scenarios/SessionReplay/SessionReplayScenario.swift b/BenchmarkTests/Runner/Scenarios/SessionReplay/SessionReplayScenario.swift
new file mode 100644
index 0000000000..65d116c8ff
--- /dev/null
+++ b/BenchmarkTests/Runner/Scenarios/SessionReplay/SessionReplayScenario.swift
@@ -0,0 +1,45 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import Foundation
+import UIKit
+
+import DatadogCore
+import DatadogRUM
+import DatadogSessionReplay
+
+import UIKitCatalog
+
+struct SessionReplayScenario: Scenario {
+ var initialViewController: UIViewController {
+ let storyboard = UIStoryboard(name: "Main", bundle: UIKitCatalog.bundle)
+ return storyboard.instantiateInitialViewController()!
+ }
+
+ func instrument(with info: AppInfo) {
+ Datadog.initialize(
+ with: .benchmark(info: info),
+ trackingConsent: .granted
+ )
+
+ RUM.enable(
+ with: RUM.Configuration(
+ applicationID: info.applicationID,
+ uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(),
+ uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate()
+ )
+ )
+
+ SessionReplay.enable(
+ with: SessionReplay.Configuration(
+ replaySampleRate: 100,
+ defaultPrivacyLevel: .allow
+ )
+ )
+
+ RUMMonitor.shared().addAttribute(forKey: "scenario", value: "SessionReplay")
+ }
+}
diff --git a/BenchmarkTests/Runner/Scenarios/SyntheticScenario.swift b/BenchmarkTests/Runner/Scenarios/SyntheticScenario.swift
new file mode 100644
index 0000000000..4ec483d60e
--- /dev/null
+++ b/BenchmarkTests/Runner/Scenarios/SyntheticScenario.swift
@@ -0,0 +1,80 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import Foundation
+import UIKit
+
+/// The Synthetics Scenario reads the `BENCHMARK_SCENARIO` environment
+/// variable to instantiate a `Scenario` compliant object.
+internal struct SyntheticScenario: Scenario {
+ /// The Synthetics benchmark scenario value.
+ internal enum Name: String {
+ case sessionReplay
+ }
+ /// The scenario's name.
+ let name: Name
+
+ /// The underlying scenario.
+ private let _scenario: Scenario
+
+ /// Creates the scenario by reading the `BENCHMARK_SCENARIO` value from the
+ /// environment variables.
+ ///
+ /// - Parameter processInfo: The `ProcessInfo` with environment variables
+ /// configured
+ init?(processInfo: ProcessInfo = .processInfo) {
+ guard
+ let rawValue = processInfo.environment["BENCHMARK_SCENARIO"],
+ let name = Name(rawValue: rawValue)
+ else {
+ return nil
+ }
+
+ switch name {
+ case .sessionReplay:
+ _scenario = SessionReplayScenario()
+ }
+
+ self.name = name
+ }
+
+ var initialViewController: UIViewController {
+ _scenario.initialViewController
+ }
+
+ func instrument(with info: AppInfo) {
+ _scenario.instrument(with: info)
+ }
+}
+
+/// The Synthetics benchmark run.
+///
+/// The run specifies the execution context of a benchmark scenrio.
+/// Each execution will collect different type of benchmarking data:
+/// - The `baseline` run collects various metrics during the scenario execution **without**
+/// the Datadog SDK being initialised.
+/// - The `instrumented` run collects the same metrics as `baseline` but **with** the
+/// Datadog SDK initialised. Comparing the `baseline` and `instrumented` runs will provide
+/// the overhead of the SDK for each metric.
+/// - The `profiling` run will only collect traces of the SDK internal processes.
+internal enum SyntheticRun: String {
+ case baseline
+ case instrumented
+ case profiling
+ case none
+
+ /// Creates the scenario by reading the `BENCHMARK_RUN` value from the
+ /// environment variables.
+ ///
+ /// - Parameter processInfo: The `ProcessInfo` with environment variables
+ /// configured
+ init(processInfo: ProcessInfo = .processInfo) {
+ self = processInfo
+ .environment["BENCHMARK_RUN"]
+ .flatMap(Self.init(rawValue:))
+ ?? .none
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/ActivityIndicatorViewController.swift b/BenchmarkTests/UIKitCatalog/ActivityIndicatorViewController.swift
new file mode 100755
index 0000000000..dfa876cbc1
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/ActivityIndicatorViewController.swift
@@ -0,0 +1,81 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIActivityIndicatorView`.
+*/
+
+import UIKit
+
+class ActivityIndicatorViewController: BaseTableViewController {
+
+ // Cell identifier for each activity indicator table view cell.
+ enum ActivityIndicatorKind: String, CaseIterable {
+ case mediumIndicator
+ case largeIndicator
+ case mediumTintedIndicator
+ case largeTintedIndicator
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("MediumIndicatorTitle", bundle: .module, comment: ""),
+ cellID: ActivityIndicatorKind.mediumIndicator.rawValue,
+ configHandler: configureMediumActivityIndicatorView),
+ CaseElement(title: NSLocalizedString("LargeIndicatorTitle", bundle: .module, comment: ""),
+ cellID: ActivityIndicatorKind.largeIndicator.rawValue,
+ configHandler: configureLargeActivityIndicatorView)
+ ])
+
+ if traitCollection.userInterfaceIdiom != .mac {
+ // Tinted activity indicators available only on iOS.
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("MediumTintedIndicatorTitle", bundle: .module, comment: ""),
+ cellID: ActivityIndicatorKind.mediumTintedIndicator.rawValue,
+ configHandler: configureMediumTintedActivityIndicatorView),
+ CaseElement(title: NSLocalizedString("LargeTintedIndicatorTitle", bundle: .module, comment: ""),
+ cellID: ActivityIndicatorKind.largeTintedIndicator.rawValue,
+ configHandler: configureLargeTintedActivityIndicatorView)
+ ])
+ }
+ }
+
+ // MARK: - Configuration
+
+ func configureMediumActivityIndicatorView(_ activityIndicator: UIActivityIndicatorView) {
+ activityIndicator.style = UIActivityIndicatorView.Style.medium
+ activityIndicator.hidesWhenStopped = true
+
+ activityIndicator.startAnimating()
+ // When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
+ }
+
+ func configureLargeActivityIndicatorView(_ activityIndicator: UIActivityIndicatorView) {
+ activityIndicator.style = UIActivityIndicatorView.Style.large
+ activityIndicator.hidesWhenStopped = true
+
+ activityIndicator.startAnimating()
+ // When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
+ }
+
+ func configureMediumTintedActivityIndicatorView(_ activityIndicator: UIActivityIndicatorView) {
+ activityIndicator.style = UIActivityIndicatorView.Style.medium
+ activityIndicator.hidesWhenStopped = true
+ activityIndicator.color = UIColor.systemPurple
+
+ activityIndicator.startAnimating()
+ // When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
+ }
+
+ func configureLargeTintedActivityIndicatorView(_ activityIndicator: UIActivityIndicatorView) {
+ activityIndicator.style = UIActivityIndicatorView.Style.large
+ activityIndicator.hidesWhenStopped = true
+ activityIndicator.color = UIColor.systemPurple
+
+ activityIndicator.startAnimating()
+ // When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/AlertControllerViewController.swift b/BenchmarkTests/UIKitCatalog/AlertControllerViewController.swift
new file mode 100755
index 0000000000..40ae167374
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/AlertControllerViewController.swift
@@ -0,0 +1,317 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+The view controller that demonstrates how to use `UIAlertController`.
+*/
+
+import UIKit
+
+class AlertControllerViewController: UITableViewController {
+ // MARK: - Properties
+
+ weak var secureTextAlertAction: UIAlertAction?
+
+ private enum StyleSections: Int {
+ case alertStyleSection = 0
+ case actionStyleSection
+ }
+
+ private enum AlertStyleTest: Int {
+ // Alert style alerts.
+ case showSimpleAlert = 0
+ case showOkayCancelAlert
+ case showOtherAlert
+ case showTextEntryAlert
+ case showSecureTextEntryAlert
+ }
+
+ private enum ActionSheetStyleTest: Int {
+ // Action sheet style alerts.
+ case showOkayCancelActionSheet = 0
+ case howOtherActionSheet
+ }
+
+ private var textDidChangeObserver: Any? = nil
+
+ // MARK: - UIAlertControllerStyleAlert Style Alerts
+
+ /// Show an alert with an "OK" button.
+ func showSimpleAlert() {
+ let title = NSLocalizedString("A Short Title is Best", bundle: .module, comment: "")
+ let message = NSLocalizedString("A message needs to be a short, complete sentence.", bundle: .module, comment: "")
+ let cancelButtonTitle = NSLocalizedString("OK", bundle: .module, comment: "")
+
+ let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
+
+ // Create the action.
+ let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
+ Swift.debugPrint("The simple alert's cancel action occurred.")
+ }
+
+ // Add the action.
+ alertController.addAction(cancelAction)
+
+ present(alertController, animated: true, completion: nil)
+ }
+
+ /// Show an alert with an "OK" and "Cancel" button.
+ func showOkayCancelAlert() {
+ let title = NSLocalizedString("A Short Title is Best", bundle: .module, comment: "")
+ let message = NSLocalizedString("A message needs to be a short, complete sentence.", bundle: .module, comment: "")
+ let cancelButtonTitle = NSLocalizedString("Cancel", bundle: .module, comment: "")
+ let otherButtonTitle = NSLocalizedString("OK", bundle: .module, comment: "")
+
+ let alertCotroller = UIAlertController(title: title, message: message, preferredStyle: .alert)
+
+ // Create the actions.
+ let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
+ Swift.debugPrint("The \"OK/Cancel\" alert's cancel action occurred.")
+ }
+
+ let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
+ Swift.debugPrint("The \"OK/Cancel\" alert's other action occurred.")
+ }
+
+ // Add the actions.
+ alertCotroller.addAction(cancelAction)
+ alertCotroller.addAction(otherAction)
+
+ present(alertCotroller, animated: true, completion: nil)
+ }
+
+ /// Show an alert with two custom buttons.
+ func showOtherAlert() {
+ let title = NSLocalizedString("A Short Title is Best", bundle: .module, comment: "")
+ let message = NSLocalizedString("A message needs to be a short, complete sentence.", bundle: .module, comment: "")
+ let cancelButtonTitle = NSLocalizedString("Cancel", bundle: .module, comment: "")
+ let otherButtonTitleOne = NSLocalizedString("Choice One", bundle: .module, comment: "")
+ let otherButtonTitleTwo = NSLocalizedString("Choice Two", bundle: .module, comment: "")
+
+ let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
+
+ // Create the actions.
+ let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
+ Swift.debugPrint("The \"Other\" alert's cancel action occurred.")
+ }
+
+ let otherButtonOneAction = UIAlertAction(title: otherButtonTitleOne, style: .default) { _ in
+ Swift.debugPrint("The \"Other\" alert's other button one action occurred.")
+ }
+
+ let otherButtonTwoAction = UIAlertAction(title: otherButtonTitleTwo, style: .default) { _ in
+ Swift.debugPrint("The \"Other\" alert's other button two action occurred.")
+ }
+
+ // Add the actions.
+ alertController.addAction(cancelAction)
+ alertController.addAction(otherButtonOneAction)
+ alertController.addAction(otherButtonTwoAction)
+
+ present(alertController, animated: true, completion: nil)
+ }
+
+ /// Show a text entry alert with two custom buttons.
+ func showTextEntryAlert() {
+ let title = NSLocalizedString("A Short Title is Best", bundle: .module, comment: "")
+ let message = NSLocalizedString("A message needs to be a short, complete sentence.", bundle: .module, comment: "")
+
+ let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
+
+ // Add the text field for text entry.
+ alertController.addTextField { _ in
+ // If you need to customize the text field, you can do so here.
+ }
+
+ // Create the actions.
+ let cancelButtonTitle = NSLocalizedString("Cancel", bundle: .module, comment: "")
+ let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
+ Swift.debugPrint("The \"Text Entry\" alert's cancel action occurred.")
+ }
+
+ let otherButtonTitle = NSLocalizedString("OK", bundle: .module, comment: "")
+ let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
+ Swift.debugPrint("The \"Text Entry\" alert's other action occurred.")
+ }
+
+ // Add the actions.
+ alertController.addAction(cancelAction)
+ alertController.addAction(otherAction)
+
+ present(alertController, animated: true, completion: nil)
+ }
+
+ /// Show a secure text entry alert with two custom buttons.
+ func showSecureTextEntryAlert() {
+ let title = NSLocalizedString("A Short Title is Best", bundle: .module, comment: "")
+ let message = NSLocalizedString("A message needs to be a short, complete sentence.", bundle: .module, comment: "")
+ let cancelButtonTitle = NSLocalizedString("Cancel", bundle: .module, comment: "")
+ let otherButtonTitle = NSLocalizedString("OK", bundle: .module, comment: "")
+
+ let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
+
+ // Add the text field for the secure text entry.
+ alertController.addTextField { textField in
+ if let observer = self.textDidChangeObserver {
+ NotificationCenter.default.removeObserver(observer)
+ }
+ /** Listen for changes to the text field's text so that we can toggle the current
+ action's enabled property based on whether the user has entered a sufficiently
+ secure entry.
+ */
+ self.textDidChangeObserver =
+ NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification,
+ object: textField,
+ queue: OperationQueue.main,
+ using: { (notification) in
+ if let textField = notification.object as? UITextField {
+ // Enforce a minimum length of >= 5 characters for secure text alerts.
+ if let alertAction = self.secureTextAlertAction {
+ if let text = textField.text {
+ alertAction.isEnabled = text.count >= 5
+ } else {
+ alertAction.isEnabled = false
+ }
+ }
+ }
+ })
+
+ textField.isSecureTextEntry = true
+ }
+
+ // Create the actions.
+ let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
+ Swift.debugPrint("The \"Secure Text Entry\" alert's cancel action occurred.")
+ }
+
+ let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
+ Swift.debugPrint("The \"Secure Text Entry\" alert's other action occurred.")
+ }
+
+ /** The text field initially has no text in the text field, so we'll disable it for now.
+ It will be re-enabled when the first character is typed.
+ */
+ otherAction.isEnabled = false
+
+ /** Hold onto the secure text alert action to toggle the enabled / disabled
+ state when the text changed.
+ */
+ secureTextAlertAction = otherAction
+
+ // Add the actions.
+ alertController.addAction(cancelAction)
+ alertController.addAction(otherAction)
+
+ present(alertController, animated: true, completion: nil)
+ }
+
+ // MARK: - UIAlertControllerStyleActionSheet Style Alerts
+
+ // Show a dialog with an "OK" and "Cancel" button.
+ func showOkayCancelActionSheet(_ selectedIndexPath: IndexPath) {
+ let message = NSLocalizedString("A message needs to be a short, complete sentence.", bundle: .module, comment: "")
+ let cancelButtonTitle = NSLocalizedString("Cancel", bundle: .module, comment: "")
+ let destructiveButtonTitle = NSLocalizedString("Confirm", bundle: .module, comment: "")
+
+ let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
+
+ // Create the actions.
+ let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
+ Swift.debugPrint("The \"OK/Cancel\" alert action sheet's cancel action occurred.")
+ }
+
+ let destructiveAction = UIAlertAction(title: destructiveButtonTitle, style: .default) { _ in
+ Swift.debugPrint("The \"Confirm\" alert action sheet's destructive action occurred.")
+ }
+
+ // Add the actions.
+ alertController.addAction(cancelAction)
+ alertController.addAction(destructiveAction)
+
+ // Configure the alert controller's popover presentation controller if it has one.
+ if let popoverPresentationController = alertController.popoverPresentationController {
+ // Note for popovers the Cancel button is hidden automatically.
+
+ // This method expects a valid cell to display from.
+ let selectedCell = tableView.cellForRow(at: selectedIndexPath)!
+ popoverPresentationController.sourceRect = selectedCell.frame
+ popoverPresentationController.sourceView = view
+ popoverPresentationController.permittedArrowDirections = .up
+ }
+
+ present(alertController, animated: true, completion: nil)
+ }
+
+ // Show a dialog with two custom buttons.
+ func showOtherActionSheet(_ selectedIndexPath: IndexPath) {
+ let message = NSLocalizedString("A message needs to be a short, complete sentence.", bundle: .module, comment: "")
+ let destructiveButtonTitle = NSLocalizedString("Destructive Choice", bundle: .module, comment: "")
+ let otherButtonTitle = NSLocalizedString("Safe Choice", bundle: .module, comment: "")
+
+ let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
+
+ // Create the actions.
+ let destructiveAction = UIAlertAction(title: destructiveButtonTitle, style: .destructive) { _ in
+ Swift.debugPrint("The \"Other\" alert action sheet's destructive action occurred.")
+ }
+ let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
+ Swift.debugPrint("The \"Other\" alert action sheet's other action occurred.")
+ }
+
+ // Add the actions.
+ alertController.addAction(destructiveAction)
+ alertController.addAction(otherAction)
+
+ // Configure the alert controller's popover presentation controller if it has one.
+ if let popoverPresentationController = alertController.popoverPresentationController {
+ // Note for popovers the Cancel button is hidden automatically.
+
+ // This method expects a valid cell to display from.
+ let selectedCell = tableView.cellForRow(at: selectedIndexPath)!
+ popoverPresentationController.sourceRect = selectedCell.frame
+ popoverPresentationController.sourceView = view
+ popoverPresentationController.permittedArrowDirections = .up
+ }
+
+ present(alertController, animated: true, completion: nil)
+ }
+
+}
+
+// MARK: - UITableViewDelegate
+
+extension AlertControllerViewController {
+
+ override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+ switch indexPath.section {
+ case StyleSections.alertStyleSection.rawValue:
+ // Alert style.
+ switch indexPath.row {
+ case AlertStyleTest.showSimpleAlert.rawValue:
+ showSimpleAlert()
+ case AlertStyleTest.showOkayCancelAlert.rawValue:
+ showOkayCancelAlert()
+ case AlertStyleTest.showOtherAlert.rawValue:
+ showOtherAlert()
+ case AlertStyleTest.showTextEntryAlert.rawValue:
+ showTextEntryAlert()
+ case AlertStyleTest.showSecureTextEntryAlert.rawValue:
+ showSecureTextEntryAlert()
+ default: break
+ }
+ case StyleSections.actionStyleSection.rawValue:
+ switch indexPath.row {
+ // Action sheet style.
+ case ActionSheetStyleTest.showOkayCancelActionSheet.rawValue:
+ showOkayCancelActionSheet(indexPath)
+ case ActionSheetStyleTest.howOtherActionSheet.rawValue:
+ showOtherActionSheet(indexPath)
+ default: break
+ }
+ default: break
+ }
+
+ tableView.deselectRow(at: indexPath, animated: true)
+ }
+
+}
diff --git a/Shopist/Shopist/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/AppIcon.appiconset/Contents.json
old mode 100644
new mode 100755
similarity index 100%
rename from Shopist/Shopist/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to BenchmarkTests/UIKitCatalog/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Contents.json
new file mode 100755
index 0000000000..73c00596a7
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_1.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_1.imageset/Contents.json
new file mode 100755
index 0000000000..4e892e1870
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_1.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Flowers_1.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_1.imageset/Flowers_1.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_1.imageset/Flowers_1.png
new file mode 100755
index 0000000000..b4b3b382c4
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_1.imageset/Flowers_1.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_2.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_2.imageset/Contents.json
new file mode 100755
index 0000000000..f58b0f113b
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_2.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Flowers_2.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_2.imageset/Flowers_2.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_2.imageset/Flowers_2.png
new file mode 100755
index 0000000000..149520fb4d
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/Flowers_2.imageset/Flowers_2.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/Contents.json
new file mode 100755
index 0000000000..5e6240639e
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_1x.png
new file mode 100755
index 0000000000..c65e3961d8
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_2x.png
new file mode 100755
index 0000000000..6e68c5bd05
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_3x.png
new file mode 100755
index 0000000000..be149037da
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background.imageset/stepper_and_segment_background_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/Contents.json
new file mode 100755
index 0000000000..fdb1b66722
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_disabled_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_disabled_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_disabled_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_1x.png
new file mode 100755
index 0000000000..7abdc2bcb4
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_2x.png
new file mode 100755
index 0000000000..0580445308
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_3x.png
new file mode 100755
index 0000000000..29805f326e
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_disabled.imageset/stepper_and_segment_background_disabled_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/Contents.json
new file mode 100755
index 0000000000..bca57e87be
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_highlighted_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_highlighted_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "stepper_and_segment_background_highlighted_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_1x.png
new file mode 100755
index 0000000000..c623650ddc
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_2x.png
new file mode 100755
index 0000000000..2a9ee5c1c4
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_3x.png
new file mode 100755
index 0000000000..cf0a17a548
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/background_highlighted.imageset/stepper_and_segment_background_highlighted_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/Contents.json
new file mode 100755
index 0000000000..68464e93ab
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "search_bar_bg_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "search_bar_bg_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "search_bar_background_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_background_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_background_3x.png
new file mode 100755
index 0000000000..486f5413bb
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_background_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_bg_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_bg_1x.png
new file mode 100755
index 0000000000..d20a0bb6e7
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_bg_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_bg_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_bg_2x.png
new file mode 100755
index 0000000000..88ecb2f12d
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/search_bar_background.imageset/search_bar_bg_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/Contents.json
new file mode 100755
index 0000000000..ea6fe64740
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "slider_blue_track_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "slider_blue_track_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "slider_blue_track_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_1x.png
new file mode 100755
index 0000000000..3f10475947
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_2x.png
new file mode 100755
index 0000000000..7ba3616579
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_3x.png
new file mode 100755
index 0000000000..7f47c6e305
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_blue_track.imageset/slider_blue_track_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/Contents.json
new file mode 100755
index 0000000000..bad86401df
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "slider_green_track_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "slider_green_track_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "slider_green_track_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_1x.png
new file mode 100755
index 0000000000..dd6087d24a
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_2x.png
new file mode 100755
index 0000000000..5c6cd69e86
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_3x.png
new file mode 100755
index 0000000000..75a6915a89
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/slider_green_track.imageset/slider_green_track_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/Contents.json
new file mode 100644
index 0000000000..86976ae85a
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "stepper_and_segment_segment_divider_1x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "stepper_and_segment_segment_divider_2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "stepper_and_segment_divider_3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_divider_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_divider_3x.png
new file mode 100644
index 0000000000..1aabd6a584
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_divider_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_segment_divider_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_segment_divider_1x.png
new file mode 100644
index 0000000000..2d092bd7a4
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_segment_divider_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_segment_divider_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_segment_divider_2x.png
new file mode 100644
index 0000000000..168bdfd472
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/stepper_and_segment_divider.imageset/stepper_and_segment_segment_divider_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/Contents.json
new file mode 100755
index 0000000000..7162851034
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/Contents.json
@@ -0,0 +1,45 @@
+{
+ "images" : [
+ {
+ "resizing" : {
+ "mode" : "3-part-horizontal",
+ "center" : {
+ "mode" : "stretch",
+ "width" : 0
+ },
+ "cap-insets" : {
+ "right" : 1,
+ "left" : 1
+ }
+ },
+ "idiom" : "universal",
+ "filename" : "text_field_background_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "resizing" : {
+ "mode" : "3-part-horizontal",
+ "center" : {
+ "mode" : "stretch",
+ "width" : 0
+ },
+ "cap-insets" : {
+ "right" : 1,
+ "left" : 1
+ }
+ },
+ "idiom" : "universal",
+ "filename" : "text_field_background_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "text_field_background_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_1x.png
new file mode 100755
index 0000000000..5c3c3cf6a5
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_2x.png
new file mode 100755
index 0000000000..abf9f0a012
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_3x.png
new file mode 100755
index 0000000000..b121f9db65
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_background.imageset/text_field_background_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/Contents.json
new file mode 100755
index 0000000000..64a5b15a81
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "text_field_purple_right_view_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "text_field_purple_right_view_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "text_field_purple_right_view_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_1x.png
new file mode 100755
index 0000000000..c450af9689
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_2x.png
new file mode 100755
index 0000000000..e81719e878
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_3x.png
new file mode 100755
index 0000000000..2957cbb6d3
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_field_purple_right_view.imageset/text_field_purple_right_view_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_attachment.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_attachment.imageset/Contents.json
new file mode 100755
index 0000000000..fb8876d7a1
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_attachment.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Sunset_5.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_attachment.imageset/Sunset_5.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_attachment.imageset/Sunset_5.png
new file mode 100755
index 0000000000..3ce67dff32
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_attachment.imageset/Sunset_5.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_background.colorset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_background.colorset/Contents.json
new file mode 100755
index 0000000000..e36b88e424
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/text_view_background.colorset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "colors" : [
+ {
+ "idiom" : "universal",
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "1.000",
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000"
+ }
+ }
+ },
+ {
+ "idiom" : "universal",
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "light"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "1.000",
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000"
+ }
+ }
+ },
+ {
+ "idiom" : "universal",
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.000",
+ "alpha" : "0.000",
+ "blue" : "0.000",
+ "green" : "0.000"
+ }
+ }
+ },
+ {
+ "idiom" : "ipad",
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "1.000",
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000"
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/tinted_segmented_control.colorset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/tinted_segmented_control.colorset/Contents.json
new file mode 100755
index 0000000000..479569c484
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/tinted_segmented_control.colorset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "colors" : [
+ {
+ "idiom" : "universal",
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.031",
+ "alpha" : "1.000",
+ "blue" : "0.500",
+ "green" : "0.702"
+ }
+ }
+ },
+ {
+ "idiom" : "universal",
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "light"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.031",
+ "alpha" : "1.000",
+ "blue" : "0.500",
+ "green" : "0.702"
+ }
+ }
+ },
+ {
+ "idiom" : "universal",
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.209",
+ "alpha" : "1.000",
+ "blue" : "0.500",
+ "green" : "0.938"
+ }
+ }
+ },
+ {
+ "idiom" : "ipad",
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.031",
+ "alpha" : "1.000",
+ "blue" : "0.500",
+ "green" : "0.702"
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/tinted_stepper_control.colorset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/tinted_stepper_control.colorset/Contents.json
new file mode 100755
index 0000000000..479569c484
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/tinted_stepper_control.colorset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ },
+ "colors" : [
+ {
+ "idiom" : "universal",
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.031",
+ "alpha" : "1.000",
+ "blue" : "0.500",
+ "green" : "0.702"
+ }
+ }
+ },
+ {
+ "idiom" : "universal",
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "light"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.031",
+ "alpha" : "1.000",
+ "blue" : "0.500",
+ "green" : "0.702"
+ }
+ }
+ },
+ {
+ "idiom" : "universal",
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.209",
+ "alpha" : "1.000",
+ "blue" : "0.500",
+ "green" : "0.938"
+ }
+ }
+ },
+ {
+ "idiom" : "ipad",
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.031",
+ "alpha" : "1.000",
+ "blue" : "0.500",
+ "green" : "0.702"
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/Contents.json b/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/Contents.json
new file mode 100755
index 0000000000..1756a035cc
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "toolbar_background_1x.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "toolbar_background_2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "toolbar_background_3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_1x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_1x.png
new file mode 100755
index 0000000000..f37907ff93
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_1x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_2x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_2x.png
new file mode 100755
index 0000000000..a271d28de7
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_2x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_3x.png b/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_3x.png
new file mode 100755
index 0000000000..486f5413bb
Binary files /dev/null and b/BenchmarkTests/UIKitCatalog/Assets.xcassets/toolbar_background.imageset/toolbar_background_3x.png differ
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/ActivityIndicatorViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/ActivityIndicatorViewController.storyboard
new file mode 100755
index 0000000000..40c0d74348
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/ActivityIndicatorViewController.storyboard
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/AlertControllerViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/AlertControllerViewController.storyboard
new file mode 100755
index 0000000000..e52293c5a6
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/AlertControllerViewController.storyboard
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/ButtonViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/ButtonViewController.storyboard
new file mode 100755
index 0000000000..0076e70c5c
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/ButtonViewController.storyboard
@@ -0,0 +1,454 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/ColorPickerViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/ColorPickerViewController.storyboard
new file mode 100755
index 0000000000..55e9ee6d73
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/ColorPickerViewController.storyboard
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/Credits.rtf b/BenchmarkTests/UIKitCatalog/Base.lproj/Credits.rtf
new file mode 100755
index 0000000000..c9f3ebb74f
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/Credits.rtf
@@ -0,0 +1,10 @@
+{\rtf1\ansi\ansicpg1252\cocoartf2617
+\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+{\*\expandedcolortbl;;\cssrgb\c0\c0\c0\cname textColor;}
+\vieww9000\viewh8400\viewkind0
+\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\qc\partightenfactor0
+
+\f0\fs20 \cf2 Demonstrates how to use {\field{\*\fldinst{HYPERLINK "https://developer.apple.com/documentation/uikit"}}{\fldrslt UIKit}}\
+views, controls and pickers.\
+}
\ No newline at end of file
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/CustomPageControlViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/CustomPageControlViewController.storyboard
new file mode 100755
index 0000000000..6b60d8eb4b
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/CustomPageControlViewController.storyboard
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/CustomSearchBarViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/CustomSearchBarViewController.storyboard
new file mode 100755
index 0000000000..bd83634c34
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/CustomSearchBarViewController.storyboard
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/CustomToolbarViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/CustomToolbarViewController.storyboard
new file mode 100755
index 0000000000..80366b55e4
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/CustomToolbarViewController.storyboard
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/DatePickerController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/DatePickerController.storyboard
new file mode 100755
index 0000000000..2d752ae3c4
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/DatePickerController.storyboard
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultPageControlViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultPageControlViewController.storyboard
new file mode 100755
index 0000000000..aac4dffef5
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultPageControlViewController.storyboard
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultSearchBarViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultSearchBarViewController.storyboard
new file mode 100755
index 0000000000..3053676020
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultSearchBarViewController.storyboard
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Title
+ Title
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultToolbarViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultToolbarViewController.storyboard
new file mode 100755
index 0000000000..248ff5042a
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/DefaultToolbarViewController.storyboard
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/FontPickerViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/FontPickerViewController.storyboard
new file mode 100755
index 0000000000..b28c89f0a7
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/FontPickerViewController.storyboard
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/ImagePickerViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/ImagePickerViewController.storyboard
new file mode 100755
index 0000000000..c0c74769df
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/ImagePickerViewController.storyboard
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/ImageViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/ImageViewController.storyboard
new file mode 100755
index 0000000000..886c071308
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/ImageViewController.storyboard
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/Localizable.strings b/BenchmarkTests/UIKitCatalog/Base.lproj/Localizable.strings
new file mode 100755
index 0000000000..78c04666cf
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/Localizable.strings
@@ -0,0 +1,173 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+Strings used across the application via the NSLocalizedString API.
+*/
+
+"OK" = "OK";
+"Cancel" = "Cancel";
+"Confirm" = "Confirm";
+"Destructive Choice" = "Destructive Choice";
+"Safe Choice" = "Safe Choice";
+"A Short Title Is Best" = "A Short Title Is Best";
+"A message needs to be a short, complete sentence." = "A message needs to be a short, complete sentence.";
+"Choice One" = "Choice One";
+"Choice Two" = "Choice Two";
+"Button" = "Button";
+"Pressed" = "Pressed";
+"X Button" = "X Button";
+"Image" = "Image";
+"bold" = "bold";
+"highlighted" = "highlighted";
+"underlined" = "underlined";
+"tinted" = "tinted";
+"Placeholder text" = "Placeholder text";
+"Enter search text" = "Enter search text";
+"Red color component value" = "Red color component value";
+"Green color component value" = "Green color component value";
+"Blue color component value" = "Blue color component value";
+"Animated" = "A slide show of images";
+
+"Airplane" = "Airplane";
+"Gift" = "Gift";
+"Burst" = "Burst";
+
+"An error occurred:" = "An error occurred:";
+
+"ButtonsTitle" = "Buttons";
+"MenuButtonsTitle" = "Menu Buttons";
+"PointerInteractionButtonsTitle" = "Pointer Interaction";
+"PageControlTitle" = "Page Controls";
+"SearchBarsTitle" = "Search Bars";
+"SegmentedControlsTitle" = "Segmented Controls";
+"SlidersTitle" = "Sliders";
+"SteppersTitle" = "Steppers";
+"SwitchesTitle" = "Switches";
+"TextFieldsTitle" = "Text Fields";
+
+"ActivityIndicatorsTitle" = "Activity Indicators";
+"AlertControllersTitle" = "Alert Controllers";
+
+"ImagesTitle" = "Image Views";
+"ImageViewTitle" = "Image View";
+"SymbolsTitle" = "SF Symbol";
+
+"ProgressViewsTitle" = "Progress Views";
+"StackViewsTitle" = "Stack Views";
+"TextViewTitle" = "Text View";
+"ToolbarsTitle" = "Toolbars";
+"VisualEffectTitle" = "Visual Effect";
+"WebViewTitle" = "Web View";
+
+"DatePickerTitle" = "Date Picker";
+"PickerViewTitle" = "Picker View";
+"ColorPickerTitle" = "Color Picker";
+"FontPickerTitle" = "Font Picker";
+"ImagePickerTitle" = "Image Picker";
+
+"DefaultSearchBarTitle" = "Default Search Bar";
+"CustomSearchBarTitle" = "Custom Search Bar";
+
+"DefaultToolBarTitle" = "Default Toolbar";
+"TintedToolbarTitle" = "Tinted Toolbar";
+"CustomToolbarBarTitle" = "Custom Toolbar";
+
+"ChooseItemTitle" = "Choose an item:";
+"ItemTitle" = "Item %@";
+
+"SampleFontTitle" = "Sample Font";
+
+"CheckTitle" = "Check";
+"SearchTitle" = "Search";
+"ToolsTitle" = "Tools";
+
+"DefaultPageControlTitle" = "Page Control";
+"CustomPageControlTitle" = "Custom Page Control";
+
+"SwitchTitle" = "Title";
+
+"DefaultSwitchTitle" = "Default";
+"CheckboxSwitchTitle" = "Checkbox";
+"TintedSwitchTitle" = "Tinted";
+
+"ImageToolTipTitle" = "This is a list of flower photos obtained from the sample's asset library.";
+"GrayStyleButtonToolTipTitle" = "This is a gray-style system button.";
+"TintedStyleButtonToolTipTitle" = "This is a tinted-style system button.";
+"FilledStyleButtonToolTipTitle" = "This is a filled-style system button.";
+"CapsuleStyleButtonToolTipTitle" = "This is a capsule-style system button.";
+"CartFilledButtonToolTipTitle" = "Button cart is filled";
+"CartEmptyButtonToolTipTitle" = "Button cart is empty";
+"XButtonToolTipTitle" = "X Button";
+"PersonButtonToolTipTitle" = "Person Button";
+"VisualEffectToolTipTitle" = "This demonstrates how to use a UIVisualEffectView on top of an UIImageView and underneath a UITextView.";
+
+"VisualEffectTextContent" = "This is a UITextView with text content placed inside a UIVisualEffectView. This is a UITextView with text content placed inside a UIVisualEffectView. This is a UITextView with text content placed inside a UIVisualEffectView.";
+
+"DefaultTitle" = "Default";
+"DetailDisclosureTitle" = "Detail Disclosure";
+"AddContactTitle" = "Add Contact";
+"CloseTitle" = "Close";
+"GrayTitle" = "Gray";
+"TintedTitle" = "Tinted";
+"FilledTitle" = "Filled";
+"CornerStyleTitle" = "Corner Style";
+"ToggleTitle" = "Toggle";
+"ButtonColorTitle" = "Colored Title";
+
+"ImageTitle" = "Image";
+"AttributedStringTitle" = "Attributed String";
+"SymbolTitle" = "Symbol";
+
+"LargeSymbolTitle" = "Large Symbol";
+"SymbolStringTitle" = "Symbol + String";
+"StringSymbolTitle" = "String + Symbol";
+"MultiTitleTitle" = "Multi-Title";
+"BackgroundTitle" = "Background";
+
+"UpdateActivityHandlerTitle" = "Update Activity Handler";
+"UpdateHandlerTitle" = "Update Handler";
+"UpdateImageHandlerTitle" = "Update Handler (Button Image)";
+
+"AddToCartTitle" = "Add to Cart";
+
+"DropDownTitle" = "Drop Down";
+"DropDownProgTitle" = "Drop Down Programmatic";
+"DropDownMultiActionTitle" = "Drop Down Multi-Action";
+"DropDownButtonSubMenuTitle" = "Drop Down Submenu";
+"PopupSelection" = "Popup Selection";
+"PopupMenuTitle" = "Popup Menu";
+
+"CustomSegmentsTitle" = "Custom Segments";
+"CustomBackgroundTitle" = "Custom Background";
+"ActionBasedTitle" = "Action Based";
+
+"CustomTitle" = "Custom";
+"MinMaxImagesTitle" = "Min and Max Images";
+
+"DefaultStepperTitle" = "Default Stepper";
+"TintedStepperTitle" = "Tinted Stepper";
+"CustomStepperTitle" = "Custom Stepper";
+
+"PlainSymbolTitle" = "Default";
+"TintedSymbolTitle" = "Tinted";
+"LargeSymbolTitle" = "Large";
+"HierarchicalSymbolTitle" = "Hierarchical Color";
+"PaletteSymbolTitle" = "Palette Color";
+"PreferringMultiColorSymbolTitle" = "Preferring Multi-Color";
+
+"DefaultTextFieldTitle" = "Default";
+"TintedTextFieldTitle" = "Tinted";
+"SecuretTextFieldTitle" = "Secure";
+"SpecificKeyboardTextFieldTitle" = "Specific Keyboard";
+"CustomTextFieldTitle" = "Custom";
+"SearchTextFieldTitle" = "Search";
+
+"MediumIndicatorTitle" = "Medium";
+"LargeIndicatorTitle" = "Large";
+"MediumTintedIndicatorTitle" = "Medium Tinted";
+"LargeTintedIndicatorTitle" = "Large Tinted";
+
+"ProgressDefaultTitle" = "Default";
+"ProgressBarTitle" = "Bar";
+"ProgressTintedTitle" = "Tinted";
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/Main.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/Main.storyboard
new file mode 100755
index 0000000000..afda7f7f21
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/Main.storyboard
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/MenuButtonViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/MenuButtonViewController.storyboard
new file mode 100755
index 0000000000..6e7ecf37c8
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/MenuButtonViewController.storyboard
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/PickerViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/PickerViewController.storyboard
new file mode 100755
index 0000000000..f5209519a6
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/PickerViewController.storyboard
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/PointerInteractionButtonViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/PointerInteractionButtonViewController.storyboard
new file mode 100755
index 0000000000..664719dc74
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/PointerInteractionButtonViewController.storyboard
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/ProgressViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/ProgressViewController.storyboard
new file mode 100755
index 0000000000..efc642095c
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/ProgressViewController.storyboard
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/SegmentedControlViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/SegmentedControlViewController.storyboard
new file mode 100755
index 0000000000..4166c5b05e
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/SegmentedControlViewController.storyboard
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/SliderViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/SliderViewController.storyboard
new file mode 100755
index 0000000000..4420a0f00a
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/SliderViewController.storyboard
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/StackViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/StackViewController.storyboard
new file mode 100755
index 0000000000..a3b3d88723
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/StackViewController.storyboard
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/StepperViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/StepperViewController.storyboard
new file mode 100755
index 0000000000..a28bc8f7d3
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/StepperViewController.storyboard
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/SwitchViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/SwitchViewController.storyboard
new file mode 100755
index 0000000000..69655b053b
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/SwitchViewController.storyboard
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/SymbolViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/SymbolViewController.storyboard
new file mode 100755
index 0000000000..cecdae8104
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/SymbolViewController.storyboard
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/TextFieldViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/TextFieldViewController.storyboard
new file mode 100755
index 0000000000..3e2676b938
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/TextFieldViewController.storyboard
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/TextViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/TextViewController.storyboard
new file mode 100755
index 0000000000..1161aae7b8
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/TextViewController.storyboard
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is a UITextView that uses attributed text. You can programmatically modify the display of the text by making it bold, highlighted, underlined, tinted, symbols, and more. These attributes are defined in NSAttributedString.h. You can even embed attachments in an NSAttributedString!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/TintedToolbarViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/TintedToolbarViewController.storyboard
new file mode 100755
index 0000000000..b5b460b356
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/TintedToolbarViewController.storyboard
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/VisualEffectViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/VisualEffectViewController.storyboard
new file mode 100755
index 0000000000..12d43a517f
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/VisualEffectViewController.storyboard
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/WebViewController.storyboard b/BenchmarkTests/UIKitCatalog/Base.lproj/WebViewController.storyboard
new file mode 100755
index 0000000000..d335aaaa16
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/WebViewController.storyboard
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/Base.lproj/content.html b/BenchmarkTests/UIKitCatalog/Base.lproj/content.html
new file mode 100755
index 0000000000..c2dc89958f
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/Base.lproj/content.html
@@ -0,0 +1,16 @@
+
+
+
+ WKWebView
+
+
+
+
+ This is HTML content inside a WKWebView.
+ For more information refer to developer.apple.com
+
+
diff --git a/BenchmarkTests/UIKitCatalog/BaseTableViewController.swift b/BenchmarkTests/UIKitCatalog/BaseTableViewController.swift
new file mode 100644
index 0000000000..9320cdd193
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/BaseTableViewController.swift
@@ -0,0 +1,52 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A base class used for all UITableViewControllers in this sample app.
+*/
+
+import UIKit
+
+class BaseTableViewController: UITableViewController {
+ // List of table view cell test cases.
+ var testCells = [CaseElement]()
+
+ func centeredHeaderView(_ title: String) -> UITableViewHeaderFooterView {
+ // Set the header title and make it centered.
+ let headerView: UITableViewHeaderFooterView = UITableViewHeaderFooterView()
+ var content = UIListContentConfiguration.groupedHeader()
+ content.text = title
+ content.textProperties.alignment = .center
+ headerView.contentConfiguration = content
+ return headerView
+ }
+
+ // MARK: - UITableViewDataSource
+
+ override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
+ return centeredHeaderView(testCells[section].title)
+ }
+
+ override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
+ return testCells[section].title
+ }
+
+ override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+ return 1
+ }
+
+ override func numberOfSections(in tableView: UITableView) -> Int {
+ return testCells.count
+ }
+
+ override func tableView(_ tableView: UITableView,
+ cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+ let cellTest = testCells[indexPath.section]
+ let cell = tableView.dequeueReusableCell(withIdentifier: cellTest.cellID, for: indexPath)
+ if let view = cellTest.targetView(cell) {
+ cellTest.configHandler(view)
+ }
+ return cell
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/ButtonViewController+Configs.swift b/BenchmarkTests/UIKitCatalog/ButtonViewController+Configs.swift
new file mode 100755
index 0000000000..2de5fb0d6c
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/ButtonViewController+Configs.swift
@@ -0,0 +1,470 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+Configuration functions for all the UIButtons found in ButtonViewController.
+*/
+
+import UIKit
+
+extension ButtonViewController: UIToolTipInteractionDelegate {
+
+ func configureSystemTextButton(_ button: UIButton) {
+ button.setTitle(NSLocalizedString("Button", bundle: .module, comment: ""), for: [])
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+ func configureSystemDetailDisclosureButton(_ button: UIButton) {
+ // Nothing particular to set here, it's all been done in the storyboard.
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+ func configureSystemContactAddButton(_ button: UIButton) {
+ // Nothing particular to set here, it's all been done in the storyboard.
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ func configureCloseButton(_ button: UIButton) {
+ // Nothing particular to set here, it's all been done in the storyboard.
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ @available(iOS 15.0, *)
+ func configureStyleGrayButton(_ button: UIButton) {
+ // Note this can be also be done in the storyboard for this button.
+ let config = UIButton.Configuration.gray()
+ button.configuration = config
+
+ button.setTitle(NSLocalizedString("Button", bundle: .module, comment: ""), for: .normal)
+ button.toolTip = NSLocalizedString("GrayStyleButtonToolTipTitle", bundle: .module, comment: "")
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ @available(iOS 15.0, *)
+ func configureStyleTintedButton(_ button: UIButton) {
+ // Note this can be also be done in the storyboard for this button.
+
+ var config = UIButton.Configuration.tinted()
+
+ /** To keep the look the same betwen iOS and macOS:
+ For tinted color to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
+ Available in macOS 12 or later (Mac Catalyst 15.0 or later).
+ Use this for controls that need to look the same between iOS and macOS.
+ */
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+
+ // The following will make the button title red and background a lighter red.
+ config.baseBackgroundColor = .systemRed
+ config.baseForegroundColor = .systemRed
+
+ button.setTitle(NSLocalizedString("Button", bundle: .module, comment: ""), for: .normal)
+ button.toolTip = NSLocalizedString("TintedStyleButtonToolTipTitle", bundle: .module, comment: "")
+
+ button.configuration = config
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ @available(iOS 15.0, *)
+ func configureStyleFilledButton(_ button: UIButton) {
+ // Note this can be also be done in the storyboard for this button.
+ var config = UIButton.Configuration.filled()
+ config.background.backgroundColor = .systemRed
+ button.configuration = config
+
+ button.setTitle(NSLocalizedString("Button", bundle: .module, comment: ""), for: .normal)
+ button.toolTip = NSLocalizedString("FilledStyleButtonToolTipTitle", bundle: .module, comment: "")
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ @available(iOS 15.0, *)
+ func configureCornerStyleButton(_ button: UIButton) {
+ /** To keep the look the same betwen iOS and macOS:
+ For cornerStyle to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
+ Available in macOS 12 or later (Mac Catalyst 15.0 or later).
+ Use this for controls that need to look the same between iOS and macOS.
+ */
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+
+ var config = UIButton.Configuration.gray()
+ config.cornerStyle = .capsule
+ button.configuration = config
+
+ button.setTitle(NSLocalizedString("Button", bundle: .module, comment: ""), for: .normal)
+ button.toolTip = NSLocalizedString("CapsuleStyleButtonToolTipTitle", bundle: .module, comment: "")
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ func configureImageButton(_ button: UIButton) {
+ // To create this button in code you can use `UIButton.init(type: .system)`.
+
+ // Set the tint color to the button's image.
+ if let image = UIImage(systemName: "xmark") {
+ let imageButtonNormalImage = image.withTintColor(.systemPurple)
+ button.setImage(imageButtonNormalImage, for: .normal)
+ }
+
+ // Since this button title is just an image, add an accessibility label.
+ button.accessibilityLabel = NSLocalizedString("X", bundle: .module, comment: "")
+
+ if #available(iOS 15, *) {
+ button.toolTip = NSLocalizedString("XButtonToolTipTitle", bundle: .module, comment: "")
+ }
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ func configureAttributedTextSystemButton(_ button: UIButton) {
+ let buttonTitle = NSLocalizedString("Button", bundle: .module, comment: "")
+
+ // Set the button's title for normal state.
+ let normalTitleAttributes: [NSAttributedString.Key: Any] = [
+ NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.single.rawValue
+ ]
+
+ let normalAttributedTitle = NSAttributedString(string: buttonTitle, attributes: normalTitleAttributes)
+ button.setAttributedTitle(normalAttributedTitle, for: .normal)
+
+ // Set the button's title for highlighted state (note this is not supported in Mac Catalyst).
+ let highlightedTitleAttributes: [NSAttributedString.Key: Any] = [
+ NSAttributedString.Key.foregroundColor: UIColor.systemGreen,
+ NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.thick.rawValue
+ ]
+ let highlightedAttributedTitle = NSAttributedString(string: buttonTitle, attributes: highlightedTitleAttributes)
+ button.setAttributedTitle(highlightedAttributedTitle, for: .highlighted)
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ func configureSymbolButton(_ button: UIButton) {
+ let buttonImage = UIImage(systemName: "person")
+
+ if #available(iOS 15, *) {
+ // For iOS 15 use the UIButtonConfiguration to set the image.
+ var buttonConfig = UIButton.Configuration.plain()
+ buttonConfig.image = buttonImage
+ button.configuration = buttonConfig
+
+ button.toolTip = NSLocalizedString("PersonButtonToolTipTitle", bundle: .module, comment: "")
+ } else {
+ button.setImage(buttonImage, for: .normal)
+ }
+
+ let config = UIImage.SymbolConfiguration(textStyle: .body, scale: .large)
+ button.setPreferredSymbolConfiguration(config, forImageIn: .normal)
+
+ // Since this button title is just an image, add an accessibility label.
+ button.accessibilityLabel = NSLocalizedString("Person", bundle: .module, comment: "")
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ func configureLargeSymbolButton(_ button: UIButton) {
+ let buttonImage = UIImage(systemName: "person")
+
+ if #available(iOS 15, *) {
+ // For iOS 15 use the UIButtonConfiguration to change the size.
+ var buttonConfig = UIButton.Configuration.plain()
+ buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .largeTitle)
+ buttonConfig.image = buttonImage
+ button.configuration = buttonConfig
+ } else {
+ button.setImage(buttonImage, for: .normal)
+ }
+
+ // Since this button title is just an image, add an accessibility label.
+ button.accessibilityLabel = NSLocalizedString("Person", bundle: .module, comment: "")
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ func configureSymbolTextButton(_ button: UIButton) {
+ // Button with image to the left of the title.
+
+ let buttonImage = UIImage(systemName: "person")
+
+ if #available(iOS 15, *) {
+ // Use UIButtonConfiguration to set the image.
+ var buttonConfig = UIButton.Configuration.plain()
+
+ // Set up the symbol image size to match that of the title font size.
+ buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .body)
+ buttonConfig.image = buttonImage
+
+ button.configuration = buttonConfig
+ } else {
+ button.setImage(buttonImage, for: .normal)
+
+ // Set up the symbol image size to match that of the title font size.
+ let config = UIImage.SymbolConfiguration(textStyle: .body, scale: .small)
+ button.setPreferredSymbolConfiguration(config, forImageIn: .normal)
+ }
+
+ // Set the button's title and font.
+ button.setTitle(NSLocalizedString("Person", bundle: .module, comment: ""), for: [])
+ button.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body)
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ func configureTextSymbolButton(_ button: UIButton) {
+ // Button with image to the right of the title.
+
+ let buttonImage = UIImage(systemName: "person")
+
+ if #available(iOS 15, *) {
+ // Use UIButtonConfiguration to set the image.
+ var buttonConfig = UIButton.Configuration.plain()
+
+ // Set up the symbol image size to match that of the title font size.
+ buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .body)
+
+ buttonConfig.image = buttonImage
+
+ // Set the image placement to the right of the title.
+ /** For image placement to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
+ Available in macOS 12 or later (Mac Catalyst 15.0 or later).
+ Use this for controls that need to look the same between iOS and macOS.
+ */
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+ buttonConfig.imagePlacement = .trailing
+
+ button.configuration = buttonConfig
+ }
+
+ // Set the button's title and font.
+ button.setTitle(NSLocalizedString("Person", bundle: .module, comment: ""), for: [])
+ button.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body)
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ @available(iOS 15.0, *)
+ func configureMultiTitleButton(_ button: UIButton) {
+ /** To keep the look the same betwen iOS and macOS:
+ For setTitle(.highlighted) to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
+ Available in macOS 12 or later (Mac Catalyst 15.0 or later).
+ Use this for controls that need to look the same between iOS and macOS.
+ */
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+
+ button.setTitle(NSLocalizedString("Button", bundle: .module, comment: ""), for: .normal)
+ button.setTitle(NSLocalizedString("Pressed", bundle: .module, comment: ""), for: .highlighted)
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ @available(iOS 15.0, *)
+ func configureToggleButton(button: UIButton) {
+ button.changesSelectionAsPrimaryAction = true // This makes the button style a "toggle button".
+ }
+
+ func configureTitleTextButton(_ button: UIButton) {
+ // Note: Only for iOS the title's color can be changed.
+ button.setTitleColor(UIColor.systemGreen, for: [.normal])
+ button.setTitleColor(UIColor.systemRed, for: [.highlighted])
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ func configureBackgroundButton(_ button: UIButton) {
+ if #available(iOS 15, *) {
+ /** To keep the look the same betwen iOS and macOS:
+ For setBackgroundImage to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
+ Available in macOS 12 or later (Mac Catalyst 15.0 or later).
+ Use this for controls that need to look the same between iOS and macOS.
+ */
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+ }
+
+ button.setBackgroundImage(UIImage(named: "background", in: .module, compatibleWith: nil), for: .normal)
+ button.setBackgroundImage(UIImage(named: "background_highlighted", in: .module, compatibleWith: nil), for: .highlighted)
+ button.setBackgroundImage(UIImage(named: "background_disabled", in: .module, compatibleWith: nil), for: .disabled)
+
+ button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
+ }
+
+ // This handler is called when this button needs updating.
+ @available(iOS 15.0, *)
+ func configureUpdateActivityHandlerButton(_ button: UIButton) {
+ let activityUpdateHandler: (UIButton) -> Void = { button in
+ /// Shows an activity indicator in place of an image. Its placement is controlled by the `imagePlacement` property.
+
+ // Start with the current button's configuration.
+ var config = button.configuration
+ config?.showsActivityIndicator = button.isSelected ? false : true
+ button.configuration = config
+ }
+
+ var buttonConfig = UIButton.Configuration.plain()
+ buttonConfig.image = UIImage(systemName: "tray")
+ buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .body)
+ button.configuration = buttonConfig
+
+ // Set the button's title and font.
+ button.setTitle(NSLocalizedString("Button", bundle: .module, comment: ""), for: [])
+ button.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body)
+
+ button.changesSelectionAsPrimaryAction = true // This turns on the toggle behavior.
+ button.configurationUpdateHandler = activityUpdateHandler
+
+ // For this button to include an activity indicator next to the title, keep the iPad behavior.
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+
+ button.addTarget(self, action: #selector(ButtonViewController.toggleButtonClicked(_:)), for: .touchUpInside)
+ }
+
+ @available(iOS 15.0, *)
+ func configureUpdateHandlerButton(_ button: UIButton) {
+ // This is called when a button needs an update.
+ let colorUpdateHandler: (UIButton) -> Void = { button in
+ button.configuration?.baseBackgroundColor = button.isSelected
+ ? UIColor.systemPink.withAlphaComponent(0.4)
+ : UIColor.systemPink
+ }
+
+ let buttonConfig = UIButton.Configuration.filled()
+ button.configuration = buttonConfig
+
+ button.changesSelectionAsPrimaryAction = true // This turns on the toggle behavior.
+ button.configurationUpdateHandler = colorUpdateHandler
+
+ // For this button to use baseBackgroundColor for the visual toggle state, keep the iPad behavior.
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+
+ button.addTarget(self, action: #selector(ButtonViewController.toggleButtonClicked(_:)), for: .touchUpInside)
+ }
+
+ @available(iOS 15.0, *)
+ func configureUpdateImageHandlerButton(_ button: UIButton) {
+ // This is called when a button needs an update.
+ let colorUpdateHandler: (UIButton) -> Void = { button in
+ button.configuration?.image =
+ button.isSelected ? UIImage(systemName: "cart.fill") : UIImage(systemName: "cart")
+ button.toolTip =
+ button.isSelected ?
+ NSLocalizedString("CartFilledButtonToolTipTitle", bundle: .module, comment: "") :
+ NSLocalizedString("CartEmptyButtonToolTipTitle", bundle: .module, comment: "")
+ }
+
+ var buttonConfig = UIButton.Configuration.plain()
+ buttonConfig.image = UIImage(systemName: "cart")
+ buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .largeTitle)
+ button.configuration = buttonConfig
+
+ button.changesSelectionAsPrimaryAction = true // This turns on the toggle behavior.
+ button.configurationUpdateHandler = colorUpdateHandler
+
+ // For this button to use the updateHandler to change it's icon for the visual toggle state, keep the iPad behavior.
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+
+ button.setTitle("", for: []) // No title, just an image.
+ button.isSelected = false
+
+ button.addTarget(self, action: #selector(ButtonViewController.toggleButtonClicked(_:)), for: .touchUpInside)
+ }
+
+ // MARK: - Add To Cart Button
+
+ @available(iOS 15.0, *)
+ func toolTipInteraction(_ interaction: UIToolTipInteraction, configurationAt point: CGPoint) -> UIToolTipConfiguration? {
+ let formatString = NSLocalizedString("Cart Tooltip String",
+ bundle: .module,
+ comment: "Cart Tooltip String format to be found in Localizable.stringsdict")
+ let resultString = String.localizedStringWithFormat(formatString, cartItemCount)
+ return UIToolTipConfiguration(toolTip: resultString)
+ }
+
+ @available(iOS 15.0, *)
+ func addToCart(action: UIAction) {
+ cartItemCount = cartItemCount > 0 ? 0 : 12
+ if let button = action.sender as? UIButton {
+ button.setNeedsUpdateConfiguration()
+ }
+ }
+
+ @available(iOS 15.0, *)
+ func configureAddToCartButton(_ button: UIButton) {
+ var config = UIButton.Configuration.filled()
+ config.buttonSize = .large
+ config.image = UIImage(systemName: "cart.fill")
+ config.title = "Add to Cart"
+ config.cornerStyle = .capsule
+ config.baseBackgroundColor = UIColor.systemTeal
+ button.configuration = config
+
+ button.toolTip = "" // The value will be determined in its delegate.
+ button.toolTipInteraction?.delegate = self
+
+ button.addAction(UIAction(handler: addToCart(action:)), for: .touchUpInside)
+
+ // For this button to include subtitle and larger size, the behavioral style needs to be set to ".pad".
+ if traitCollection.userInterfaceIdiom == .mac {
+ button.preferredBehavioralStyle = .pad
+ }
+
+ button.changesSelectionAsPrimaryAction = true // This turns on the toggle behavior.
+
+ // This handler is called when this button needs updating.
+ button.configurationUpdateHandler = {
+ [unowned self] button in
+
+ // Start with the current button's configuration.
+ var newConfig = button.configuration
+
+ if button.isSelected {
+ // The button was clicked or tapped.
+ newConfig?.image = cartItemCount > 0
+ ? UIImage(systemName: "cart.fill.badge.plus")
+ : UIImage(systemName: "cart.badge.plus")
+
+ let formatString = NSLocalizedString("Cart Items String",
+ bundle: .module,
+ comment: "Cart Items String format to be found in Localizable.stringsdict")
+ let resultString = String.localizedStringWithFormat(formatString, cartItemCount)
+ newConfig?.subtitle = resultString
+ } else {
+ // As the button is highlighted (pressed), apply a temporary image and subtitle.
+ newConfig?.image = UIImage(systemName: "cart.fill")
+ newConfig?.subtitle = ""
+ }
+
+ newConfig?.imagePadding = 8 // Add a litle more space between the icon and button title.
+
+ // Note: To change the padding between the title and subtitle, set "titlePadding".
+ // Note: To change the padding around the perimeter of the button, set "contentInsets".
+
+ button.configuration = newConfig
+ }
+ }
+
+ // MARK: - Button Actions
+
+ @objc
+ func buttonClicked(_ sender: UIButton) {
+ Swift.debugPrint("Button was clicked.")
+ }
+
+ @objc
+ func toggleButtonClicked(_ sender: UIButton) {
+ Swift.debugPrint("Toggle action: \(sender)")
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/ButtonViewController.swift b/BenchmarkTests/UIKitCatalog/ButtonViewController.swift
new file mode 100755
index 0000000000..0c9f0e1e48
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/ButtonViewController.swift
@@ -0,0 +1,156 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIButton`.
+ The buttons are created using storyboards, but each of the system buttons can be created in code by
+ using the UIButton.init(type buttonType: UIButtonType) initializer.
+
+ See the UIButton interface for a comprehensive list of the various UIButtonType values.
+*/
+
+import UIKit
+
+class ButtonViewController: BaseTableViewController {
+
+ // Cell identifier for each button table view cell.
+ enum ButtonKind: String, CaseIterable {
+ case buttonSystem
+ case buttonDetailDisclosure
+ case buttonSystemAddContact
+ case buttonClose
+ case buttonStyleGray
+ case buttonStyleTinted
+ case buttonStyleFilled
+ case buttonCornerStyle
+ case buttonToggle
+ case buttonTitleColor
+ case buttonImage
+ case buttonAttrText
+ case buttonSymbol
+ case buttonLargeSymbol
+ case buttonTextSymbol
+ case buttonSymbolText
+ case buttonMultiTitle
+ case buttonBackground
+ case addToCartButton
+ case buttonUpdateActivityHandler
+ case buttonUpdateHandler
+ case buttonImageUpdateHandler
+ }
+
+ // MARK: - Properties
+
+ // "Add to Cart" Button
+ var cartItemCount: Int = 0
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("DefaultTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonSystem.rawValue,
+ configHandler: configureSystemTextButton),
+ CaseElement(title: NSLocalizedString("DetailDisclosureTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonDetailDisclosure.rawValue,
+ configHandler: configureSystemDetailDisclosureButton),
+ CaseElement(title: NSLocalizedString("AddContactTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonSystemAddContact.rawValue,
+ configHandler: configureSystemContactAddButton),
+ CaseElement(title: NSLocalizedString("CloseTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonClose.rawValue,
+ configHandler: configureCloseButton)
+ ])
+
+ if #available(iOS 15, *) {
+ // These button styles are available on iOS 15 or later.
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("GrayTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonStyleGray.rawValue,
+ configHandler: configureStyleGrayButton),
+ CaseElement(title: NSLocalizedString("TintedTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonStyleTinted.rawValue,
+ configHandler: configureStyleTintedButton),
+ CaseElement(title: NSLocalizedString("FilledTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonStyleFilled.rawValue,
+ configHandler: configureStyleFilledButton),
+ CaseElement(title: NSLocalizedString("CornerStyleTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonCornerStyle.rawValue,
+ configHandler: configureCornerStyleButton),
+ CaseElement(title: NSLocalizedString("ToggleTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonToggle.rawValue,
+ configHandler: configureToggleButton)
+ ])
+ }
+
+ if traitCollection.userInterfaceIdiom != .mac {
+ // Colored button titles only on iOS.
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("ButtonColorTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonTitleColor.rawValue,
+ configHandler: configureTitleTextButton)
+ ])
+ }
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("ImageTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonImage.rawValue,
+ configHandler: configureImageButton),
+ CaseElement(title: NSLocalizedString("AttributedStringTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonAttrText.rawValue,
+ configHandler: configureAttributedTextSystemButton),
+ CaseElement(title: NSLocalizedString("SymbolTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonSymbol.rawValue,
+ configHandler: configureSymbolButton)
+ ])
+
+ if #available(iOS 15, *) {
+ // This case uses UIButtonConfiguration which is available on iOS 15 or later.
+ if traitCollection.userInterfaceIdiom != .mac {
+ // UIButtonConfiguration for large images available only on iOS.
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("LargeSymbolTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonLargeSymbol.rawValue,
+ configHandler: configureLargeSymbolButton)
+ ])
+ }
+ }
+
+ if #available(iOS 15, *) {
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("StringSymbolTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonTextSymbol.rawValue,
+ configHandler: configureTextSymbolButton),
+ CaseElement(title: NSLocalizedString("SymbolStringTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonSymbolText.rawValue,
+ configHandler: configureSymbolTextButton),
+
+ CaseElement(title: NSLocalizedString("BackgroundTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonBackground.rawValue,
+ configHandler: configureBackgroundButton),
+
+ // Multi-title button: title for normal and highlight state, setTitle(.highlighted) is for iOS 15 and later.
+ CaseElement(title: NSLocalizedString("MultiTitleTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonMultiTitle.rawValue,
+ configHandler: configureMultiTitleButton),
+
+ // Various button effects done to the addToCartButton are available only on iOS 15 or later.
+ CaseElement(title: NSLocalizedString("AddToCartTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.addToCartButton.rawValue,
+ configHandler: configureAddToCartButton),
+
+ // UIButtonConfiguration with updateHandlers is available only on iOS 15 or later.
+ CaseElement(title: NSLocalizedString("UpdateActivityHandlerTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonUpdateActivityHandler.rawValue,
+ configHandler: configureUpdateActivityHandlerButton),
+ CaseElement(title: NSLocalizedString("UpdateHandlerTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonUpdateHandler.rawValue,
+ configHandler: configureUpdateHandlerButton),
+ CaseElement(title: NSLocalizedString("UpdateImageHandlerTitle", bundle: .module, comment: ""),
+ cellID: ButtonKind.buttonImageUpdateHandler.rawValue,
+ configHandler: configureUpdateImageHandlerButton)
+ ])
+ }
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/CaseElement.swift b/BenchmarkTests/UIKitCatalog/CaseElement.swift
new file mode 100644
index 0000000000..54f0ebdf74
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/CaseElement.swift
@@ -0,0 +1,29 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+Test case element that serves our UITableViewCells.
+*/
+
+import UIKit
+
+struct CaseElement {
+ var title: String // Visual title of the cell (table section header title)
+ var cellID: String // Table view cell's identifier for searching for the cell within the nib file.
+
+ typealias ConfigurationClosure = (UIView) -> Void
+ var configHandler: ConfigurationClosure // Configuration handler for setting up the cell's subview.
+
+ init(title: String, cellID: String, configHandler: @escaping (V) -> Void) {
+ self.title = title
+ self.cellID = cellID
+ self.configHandler = { view in
+ guard let view = view as? V else { fatalError("Impossible") }
+ configHandler(view)
+ }
+ }
+
+ func targetView(_ cell: UITableViewCell?) -> UIView? {
+ return cell != nil ? cell!.contentView.subviews[0] : nil
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/ColorPickerViewController.swift b/BenchmarkTests/UIKitCatalog/ColorPickerViewController.swift
new file mode 100755
index 0000000000..77838319a0
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/ColorPickerViewController.swift
@@ -0,0 +1,144 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIColorPickerViewController`.
+*/
+
+import UIKit
+
+class ColorPickerViewController: UIViewController, UIColorPickerViewControllerDelegate {
+
+ // MARK: - Properties
+
+ var colorWell: UIColorWell!
+ var colorPicker: UIColorPickerViewController!
+
+ @IBOutlet var pickerButton: UIButton! // UIButton to present the picker.
+ @IBOutlet var pickerWellView: UIView! // UIView placeholder to hold the UIColorWell.
+
+ @IBOutlet var colorView: UIView!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configureColorPicker()
+ configureColorWell()
+
+ // For iOS, the picker button in the main view is not used, the color picker is presented from the navigation bar.
+ if navigationController?.traitCollection.userInterfaceIdiom != .mac {
+ pickerButton.isHidden = true
+ }
+ }
+
+ // MARK: - UIColorWell
+
+ // Update the color view from the color well chosen action.
+ func colorWellHandler(action: UIAction) {
+ if let colorWell = action.sender as? UIColorWell {
+ colorView.backgroundColor = colorWell.selectedColor
+ }
+ }
+
+ func configureColorWell() {
+
+ /** Note: Both color well and picker buttons achieve the same thing, presenting the color picker.
+ But one presents it with a color well control, the other by a bar button item.
+ */
+ let colorWellAction = UIAction(title: "", handler: colorWellHandler)
+ colorWell =
+ UIColorWell(frame: CGRect(x: 0, y: 0, width: 32, height: 32), primaryAction: colorWellAction)
+
+ // For Mac Catalyst, the UIColorWell is placed in the main view.
+ if navigationController?.traitCollection.userInterfaceIdiom == .mac {
+ pickerWellView.addSubview(colorWell)
+ } else {
+ // For iOS, the UIColorWell is placed inside the navigation bar as a UIBarButtonItem.
+ let colorWellBarItem = UIBarButtonItem(customView: colorWell)
+ let fixedBarItem = UIBarButtonItem.fixedSpace(20.0)
+ navigationItem.rightBarButtonItems!.append(fixedBarItem)
+ navigationItem.rightBarButtonItems!.append(colorWellBarItem)
+ }
+ }
+
+ // MARK: - UIColorPickerViewController
+
+ func configureColorPicker() {
+ colorPicker = UIColorPickerViewController()
+ colorPicker.supportsAlpha = true
+ colorPicker.selectedColor = UIColor.blue
+ colorPicker.delegate = self
+ }
+
+ // Present the color picker from the UIBarButtonItem, iOS only.
+ // This will present it as a popover (preferred), or for compact mode as a modal sheet.
+ @IBAction func presentColorPickerByBarButton(_ sender: UIBarButtonItem) {
+ colorPicker.modalPresentationStyle = UIModalPresentationStyle.popover // will display as popover for iPad or sheet for compact screens.
+ let popover: UIPopoverPresentationController = colorPicker.popoverPresentationController!
+ popover.barButtonItem = sender
+ present(colorPicker, animated: true, completion: nil)
+ }
+
+ // Present the color picker from the UIButton, Mac Catalyst only.
+ // This will present it as a popover (preferred), or for compact mode as a modal sheet.
+ @IBAction func presentColorPickerByButton(_ sender: UIButton) {
+ colorPicker.modalPresentationStyle = UIModalPresentationStyle.popover
+ if let popover = colorPicker.popoverPresentationController {
+ popover.sourceView = sender
+ present(colorPicker, animated: true, completion: nil)
+ }
+ }
+
+ // MARK: - UIColorPickerViewControllerDelegate
+
+ // Color returned from the color picker via UIBarButtonItem - iOS 15.0
+ @available(iOS 15.0, *)
+ func colorPickerViewController(_ viewController: UIColorPickerViewController, didSelect color: UIColor, continuously: Bool) {
+ // User has chosen a color.
+ let chosenColor = viewController.selectedColor
+ colorView.backgroundColor = chosenColor
+
+ // Dismiss the color picker if the conditions are right:
+ // 1) User is not doing a continous pick (tap and drag across multiple colors).
+ // 2) Picker is presented on a non-compact device.
+ //
+ // Use the following check to determine how the color picker was presented (modal or popover).
+ // For popover, we want to dismiss it when a color is locked.
+ // For modal, the picker has a close button.
+ //
+ if !continuously {
+ if traitCollection.horizontalSizeClass != .compact {
+ viewController.dismiss(animated: true, completion: {
+ Swift.debugPrint("\(chosenColor)")
+ })
+ }
+ }
+ }
+
+ // Color returned from the color picker - iOS 14.x and earlier.
+ func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) {
+ // User has chosen a color.
+ let chosenColor = viewController.selectedColor
+ colorView.backgroundColor = chosenColor
+
+ // Use the following check to determine how the color picker was presented (modal or popover).
+ // For popover, we want to dismiss it when a color is locked.
+ // For modal, the picker has a close button.
+ //
+ if traitCollection.horizontalSizeClass != .compact {
+ viewController.dismiss(animated: true, completion: {
+ Swift.debugPrint("\(chosenColor)")
+ })
+ }
+ }
+
+ func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
+ /** In presentations (except popovers) the color picker shows a close button. If the close button is tapped,
+ the view controller is dismissed and `colorPickerViewControllerDidFinish:` is called. Can be used to
+ animate alongside the dismissal.
+ */
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/CustomPageControlViewController.swift b/BenchmarkTests/UIKitCatalog/CustomPageControlViewController.swift
new file mode 100755
index 0000000000..8111b05dea
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/CustomPageControlViewController.swift
@@ -0,0 +1,92 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use a customized `UIPageControl`.
+*/
+
+import UIKit
+
+class CustomPageControlViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var pageControl: UIPageControl!
+
+ @IBOutlet weak var colorView: UIView!
+
+ // Colors that correspond to the selected page. Used as the background color for `colorView`.
+ let colors = [
+ UIColor.black,
+ UIColor.systemGray,
+ UIColor.systemRed,
+ UIColor.systemGreen,
+ UIColor.systemBlue,
+ UIColor.systemPink,
+ UIColor.systemYellow,
+ UIColor.systemIndigo,
+ UIColor.systemOrange,
+ UIColor.systemPurple,
+ UIColor.systemGray2,
+ UIColor.systemGray3,
+ UIColor.systemGray4,
+ UIColor.systemGray5
+ ]
+
+ let images = [
+ UIImage(systemName: "square.fill"),
+ UIImage(systemName: "square"),
+ UIImage(systemName: "triangle.fill"),
+ UIImage(systemName: "triangle"),
+ UIImage(systemName: "circle.fill"),
+ UIImage(systemName: "circle"),
+ UIImage(systemName: "star.fill"),
+ UIImage(systemName: "star"),
+ UIImage(systemName: "staroflife"),
+ UIImage(systemName: "staroflife.fill"),
+ UIImage(systemName: "heart.fill"),
+ UIImage(systemName: "heart"),
+ UIImage(systemName: "moon"),
+ UIImage(systemName: "moon.fill")
+ ]
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configurePageControl()
+ pageControlValueDidChange()
+ }
+
+ // MARK: - Configuration
+
+ func configurePageControl() {
+ // The total number of available pages is based on the number of available colors.
+ pageControl.numberOfPages = colors.count
+ pageControl.currentPage = 2
+
+ pageControl.currentPageIndicatorTintColor = UIColor.systemPurple
+
+ // Prominent background style.
+ pageControl.backgroundStyle = .prominent
+
+ // Set custom indicator images.
+ for (index, image) in images.enumerated() {
+ pageControl.setIndicatorImage(image, forPage: index)
+ }
+
+ pageControl.addTarget(self,
+ action: #selector(PageControlViewController.pageControlValueDidChange),
+ for: .valueChanged)
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func pageControlValueDidChange() {
+ // Note: gesture swiping between pages is provided by `UIPageViewController` and not `UIPageControl`.
+ Swift.debugPrint("The page control changed its current page to \(pageControl.currentPage).")
+
+ colorView.backgroundColor = colors[pageControl.currentPage]
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/CustomSearchBarViewController.swift b/BenchmarkTests/UIKitCatalog/CustomSearchBarViewController.swift
new file mode 100755
index 0000000000..bfd7738144
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/CustomSearchBarViewController.swift
@@ -0,0 +1,61 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to customize a `UISearchBar`.
+*/
+
+import UIKit
+
+class CustomSearchBarViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var searchBar: UISearchBar!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configureSearchBar()
+ }
+
+ // MARK: - Configuration
+
+ func configureSearchBar() {
+ searchBar.showsCancelButton = true
+ searchBar.showsBookmarkButton = true
+
+ searchBar.tintColor = UIColor.systemPurple
+
+ searchBar.backgroundImage = UIImage(named: "search_bar_background", in: .module, compatibleWith: nil)
+
+ // Set the bookmark image for both normal and highlighted states.
+ let bookImage = UIImage(systemName: "bookmark")
+ searchBar.setImage(bookImage, for: .bookmark, state: .normal)
+
+ let bookFillImage = UIImage(systemName: "bookmark.fill")
+ searchBar.setImage(bookFillImage, for: .bookmark, state: .highlighted)
+ }
+}
+
+// MARK: - UISearchBarDelegate
+
+extension CustomSearchBarViewController: UISearchBarDelegate {
+ func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
+ Swift.debugPrint("The custom search bar keyboard \"Search\" button was tapped.")
+
+ searchBar.resignFirstResponder()
+ }
+
+ func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
+ Swift.debugPrint("The custom search bar \"Cancel\" button was tapped.")
+
+ searchBar.resignFirstResponder()
+ }
+
+ func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {
+ Swift.debugPrint("The custom \"bookmark button\" inside the search bar was tapped.")
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/CustomToolbarViewController.swift b/BenchmarkTests/UIKitCatalog/CustomToolbarViewController.swift
new file mode 100755
index 0000000000..df91bffc4d
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/CustomToolbarViewController.swift
@@ -0,0 +1,72 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to customize a `UIToolbar`.
+*/
+
+import UIKit
+
+class CustomToolbarViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var toolbar: UIToolbar!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ let toolbarBackgroundImage = UIImage(named: "toolbar_background", in: .module, compatibleWith: nil)
+ toolbar.setBackgroundImage(toolbarBackgroundImage, forToolbarPosition: .bottom, barMetrics: .default)
+
+ let toolbarButtonItems = [
+ customImageBarButtonItem,
+ flexibleSpaceBarButtonItem,
+ customBarButtonItem
+ ]
+ toolbar.setItems(toolbarButtonItems, animated: true)
+ }
+
+ // MARK: - UIBarButtonItem Creation and Configuration
+
+ var customImageBarButtonItem: UIBarButtonItem {
+ let customBarButtonItemImage = UIImage(systemName: "exclamationmark.triangle")
+
+ let customImageBarButtonItem = UIBarButtonItem(image: customBarButtonItemImage,
+ style: .plain,
+ target: self,
+ action: #selector(CustomToolbarViewController.barButtonItemClicked(_:)))
+
+ customImageBarButtonItem.tintColor = UIColor.systemPurple
+
+ return customImageBarButtonItem
+ }
+
+ var flexibleSpaceBarButtonItem: UIBarButtonItem {
+ // Note that there's no target/action since this represents empty space.
+ return UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
+ }
+
+ var customBarButtonItem: UIBarButtonItem {
+ let barButtonItem = UIBarButtonItem(title: NSLocalizedString("Button", bundle: .module, comment: ""),
+ style: .plain,
+ target: self,
+ action: #selector(CustomToolbarViewController.barButtonItemClicked))
+
+ let attributes = [
+ NSAttributedString.Key.foregroundColor: UIColor.systemPurple
+ ]
+ barButtonItem.setTitleTextAttributes(attributes, for: [])
+
+ return barButtonItem
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func barButtonItemClicked(_ barButtonItem: UIBarButtonItem) {
+ Swift.debugPrint("A bar button item on the custom toolbar was clicked: \(barButtonItem).")
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/DatePickerController.swift b/BenchmarkTests/UIKitCatalog/DatePickerController.swift
new file mode 100755
index 0000000000..464e479a83
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/DatePickerController.swift
@@ -0,0 +1,82 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIDatePicker`.
+*/
+
+import UIKit
+
+class DatePickerController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var datePicker: UIDatePicker!
+
+ @IBOutlet weak var dateLabel: UILabel!
+
+ // A date formatter to format the `date` property of `datePicker`.
+ lazy var dateFormatter: DateFormatter = {
+ let dateFormatter = DateFormatter()
+
+ dateFormatter.dateStyle = .medium
+ dateFormatter.timeStyle = .short
+
+ return dateFormatter
+ }()
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ if #available(iOS 15, *) {
+ // In case the label's content is too large to fit inside the label (causing truncation),
+ // use this to reveal the label's full text drawn as a tool tip.
+ dateLabel.showsExpansionTextWhenTruncated = true
+ }
+
+ configureDatePicker()
+ }
+
+ // MARK: - Configuration
+
+ func configureDatePicker() {
+ datePicker.datePickerMode = .dateAndTime
+
+ /** Set min/max date for the date picker. As an example we will limit the date between
+ now and 7 days from now.
+ */
+ let now = Date()
+ datePicker.minimumDate = now
+
+ // Decide the best date picker style based on the trait collection's vertical size.
+ datePicker.preferredDatePickerStyle = traitCollection.verticalSizeClass == .compact ? .compact : .inline
+
+ var dateComponents = DateComponents()
+ dateComponents.day = 7
+
+ let sevenDaysFromNow = Calendar.current.date(byAdding: .day, value: 7, to: now)
+ datePicker.maximumDate = sevenDaysFromNow
+
+ datePicker.minuteInterval = 2
+
+ datePicker.addTarget(self, action: #selector(DatePickerController.updateDatePickerLabel), for: .valueChanged)
+
+ updateDatePickerLabel()
+ }
+
+ override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
+ // Adjust the date picker style due to the trait collection's vertical size.
+ super.traitCollectionDidChange(previousTraitCollection)
+ datePicker.preferredDatePickerStyle = traitCollection.verticalSizeClass == .compact ? .compact : .inline
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func updateDatePickerLabel() {
+ dateLabel.text = dateFormatter.string(from: datePicker.date)
+
+ Swift.debugPrint("Chosen date: \(dateFormatter.string(from: datePicker.date))")
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/DefaultPageControlViewController.swift b/BenchmarkTests/UIKitCatalog/DefaultPageControlViewController.swift
new file mode 100755
index 0000000000..42f66cf414
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/DefaultPageControlViewController.swift
@@ -0,0 +1,62 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIPageControl`.
+*/
+
+import UIKit
+
+class PageControlViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var pageControl: UIPageControl!
+
+ @IBOutlet weak var colorView: UIView!
+
+ // Colors that correspond to the selected page. Used as the background color for `colorView`.
+ let colors = [
+ UIColor.black,
+ UIColor.systemGray,
+ UIColor.systemRed,
+ UIColor.systemGreen,
+ UIColor.systemBlue,
+ UIColor.systemPink,
+ UIColor.systemYellow,
+ UIColor.systemIndigo,
+ UIColor.systemOrange,
+ UIColor.systemPurple
+ ]
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configurePageControl()
+ pageControlValueDidChange()
+ }
+
+ // MARK: - Configuration
+
+ func configurePageControl() {
+ // The total number of available pages is based on the number of available colors.
+ pageControl.numberOfPages = colors.count
+ pageControl.currentPage = 2
+
+ pageControl.pageIndicatorTintColor = UIColor.systemGreen
+ pageControl.currentPageIndicatorTintColor = UIColor.systemPurple
+
+ pageControl.addTarget(self, action: #selector(PageControlViewController.pageControlValueDidChange), for: .valueChanged)
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func pageControlValueDidChange() {
+ // Note: gesture swiping between pages is provided by `UIPageViewController` and not `UIPageControl`.
+ Swift.debugPrint("The page control changed its current page to \(pageControl.currentPage).")
+
+ colorView.backgroundColor = colors[pageControl.currentPage]
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/DefaultSearchBarViewController.swift b/BenchmarkTests/UIKitCatalog/DefaultSearchBarViewController.swift
new file mode 100755
index 0000000000..cd0d9be1c1
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/DefaultSearchBarViewController.swift
@@ -0,0 +1,56 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use a default `UISearchBar`.
+*/
+
+import UIKit
+
+class DefaultSearchBarViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var searchBar: UISearchBar!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configureSearchBar()
+ }
+
+ // MARK: - Configuration
+
+ func configureSearchBar() {
+ searchBar.showsCancelButton = true
+ searchBar.showsScopeBar = true
+
+ searchBar.scopeButtonTitles = [
+ NSLocalizedString("Scope One", bundle: .module, comment: ""),
+ NSLocalizedString("Scope Two", bundle: .module, comment: "")
+ ]
+ }
+
+}
+
+// MARK: - UISearchBarDelegate
+
+extension DefaultSearchBarViewController: UISearchBarDelegate {
+ func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
+ Swift.debugPrint("The default search selected scope button index changed to \(selectedScope).")
+ }
+
+ func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
+ Swift.debugPrint("The default search bar keyboard search button was tapped: \(String(describing: searchBar.text)).")
+
+ searchBar.resignFirstResponder()
+ }
+
+ func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
+ Swift.debugPrint("The default search bar cancel button was tapped.")
+
+ searchBar.resignFirstResponder()
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/DefaultToolbarViewController.swift b/BenchmarkTests/UIKitCatalog/DefaultToolbarViewController.swift
new file mode 100755
index 0000000000..5b8717f57a
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/DefaultToolbarViewController.swift
@@ -0,0 +1,60 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use a default `UIToolbar`.
+*/
+
+import UIKit
+
+class DefaultToolbarViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var toolbar: UIToolbar!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ let toolbarButtonItems = [
+ trashBarButtonItem,
+ flexibleSpaceBarButtonItem,
+ customTitleBarButtonItem
+ ]
+ toolbar.setItems(toolbarButtonItems, animated: true)
+ }
+
+ // MARK: - UIBarButtonItem Creation and Configuration
+
+ var trashBarButtonItem: UIBarButtonItem {
+ return UIBarButtonItem(barButtonSystemItem: .trash,
+ target: self,
+ action: #selector(DefaultToolbarViewController.barButtonItemClicked(_:)))
+ }
+
+ var flexibleSpaceBarButtonItem: UIBarButtonItem {
+ return UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
+ target: nil,
+ action: nil)
+ }
+
+ func menuHandler(action: UIAction) {
+ Swift.debugPrint("Menu Action '\(action.title)'")
+ }
+
+ var customTitleBarButtonItem: UIBarButtonItem {
+ let buttonMenu = UIMenu(title: "",
+ children: (1...5).map {
+ UIAction(title: "Option \($0)", handler: menuHandler)
+ })
+ return UIBarButtonItem(image: UIImage(systemName: "list.number"), menu: buttonMenu)
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func barButtonItemClicked(_ barButtonItem: UIBarButtonItem) {
+ Swift.debugPrint("A bar button item on the default toolbar was clicked: \(barButtonItem).")
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/FontPickerViewController.swift b/BenchmarkTests/UIKitCatalog/FontPickerViewController.swift
new file mode 100755
index 0000000000..8294fe784d
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/FontPickerViewController.swift
@@ -0,0 +1,108 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIFontPickerViewController`.
+*/
+
+import UIKit
+
+class FontPickerViewController: UIViewController {
+
+ // MARK: - Properties
+
+ var fontPicker: UIFontPickerViewController!
+ var textFormatter: UITextFormattingCoordinator!
+
+ @IBOutlet var fontLabel: UILabel!
+ @IBOutlet var textFormatterButton: UIButton!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ fontLabel.text = NSLocalizedString("SampleFontTitle", bundle: .module, comment: "")
+
+ configureFontPicker()
+
+ if traitCollection.userInterfaceIdiom != .mac {
+ // UITextFormattingCoordinator's toggleFontPanel is available only for macOS.
+ textFormatterButton.isHidden = true
+ }
+ }
+
+ override func viewDidAppear(_ animated: Bool) {
+ super.viewDidAppear(animated)
+
+ configureTextFormatter()
+ }
+
+ func configureFontPicker() {
+ let configuration = UIFontPickerViewController.Configuration()
+ configuration.includeFaces = true
+ configuration.displayUsingSystemFont = false
+ configuration.filteredTraits = [.classModernSerifs]
+
+ fontPicker = UIFontPickerViewController(configuration: configuration)
+ fontPicker.delegate = self
+ fontPicker.modalPresentationStyle = UIModalPresentationStyle.popover
+ }
+
+ func configureTextFormatter() {
+ if textFormatter == nil {
+ guard let scene = self.view.window?.windowScene else { return }
+ let attributes: [NSAttributedString.Key: Any] = [NSAttributedString.Key.font: fontLabel.font as Any]
+ textFormatter = UITextFormattingCoordinator(for: scene)
+ textFormatter.delegate = self
+ textFormatter.setSelectedAttributes(attributes, isMultiple: true)
+ }
+ }
+
+ @IBAction func presentFontPicker(_ sender: Any) {
+ if let button = sender as? UIButton {
+ let popover: UIPopoverPresentationController = fontPicker.popoverPresentationController!
+ popover.sourceView = button
+ present(fontPicker, animated: true, completion: nil)
+ }
+ }
+
+ @IBAction func presentTextFormattingCoordinator(_ sender: Any) {
+ if !UITextFormattingCoordinator.isFontPanelVisible {
+ UITextFormattingCoordinator.toggleFontPanel(sender)
+ }
+ }
+
+}
+
+// MARK: - UIFontPickerViewControllerDelegate
+
+extension FontPickerViewController: UIFontPickerViewControllerDelegate {
+
+ func fontPickerViewControllerDidCancel(_ viewController: UIFontPickerViewController) {
+ //..
+ }
+
+ func fontPickerViewControllerDidPickFont(_ viewController: UIFontPickerViewController) {
+ guard let fontDescriptor = viewController.selectedFontDescriptor else { return }
+ let font = UIFont(descriptor: fontDescriptor, size: 28.0)
+ fontLabel.font = font
+ }
+
+}
+
+// MARK: - UITextFormattingCoordinatorDelegate
+
+extension FontPickerViewController: UITextFormattingCoordinatorDelegate {
+
+ override func updateTextAttributes(conversionHandler: ([NSAttributedString.Key: Any]) -> [NSAttributedString.Key: Any]) {
+ guard let oldLabelText = fontLabel.attributedText else { return }
+ let newString = NSMutableAttributedString(string: oldLabelText.string)
+ oldLabelText.enumerateAttributes(in: NSRange(location: 0, length: oldLabelText.length),
+ options: []) { (attributeDictionary, range, stop) in
+ newString.setAttributes(conversionHandler(attributeDictionary), range: range)
+ }
+ fontLabel.attributedText = newString
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/ImagePickerViewController.swift b/BenchmarkTests/UIKitCatalog/ImagePickerViewController.swift
new file mode 100755
index 0000000000..b2bb197f23
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/ImagePickerViewController.swift
@@ -0,0 +1,45 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIFontPickerViewController`.
+*/
+
+import UIKit
+
+class ImagePickerViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
+
+ // MARK: - Properties
+ var imagePicker: UIImagePickerController!
+ @IBOutlet var imageView: UIImageView!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configureImagePicker()
+ }
+
+ func configureImagePicker() {
+ imagePicker = UIImagePickerController()
+ imagePicker.delegate = self
+ imagePicker.mediaTypes = ["public.image"]
+ imagePicker.sourceType = .photoLibrary
+ }
+
+ @IBAction func presentImagePicker(_: AnyObject) {
+ present(imagePicker, animated: true)
+ }
+
+ // MARK: - UIImagePickerControllerDelegate
+
+ func imagePickerController(_ picker: UIImagePickerController,
+ didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
+ if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
+ imageView.image = image
+ }
+ picker.dismiss(animated: true, completion: nil)
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/ImageViewController.swift b/BenchmarkTests/UIKitCatalog/ImageViewController.swift
new file mode 100755
index 0000000000..4abc247509
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/ImageViewController.swift
@@ -0,0 +1,44 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIImageView`.
+*/
+
+import UIKit
+
+class ImageViewController: UIViewController {
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configureImageView()
+ }
+
+ // MARK: - Configuration
+
+ func configureImageView() {
+ // The root view of the view controller is set in Interface Builder and is an UIImageView.
+ if let imageView = view as? UIImageView {
+ // Fetch the images (each image is of the format Flowers_number).
+ imageView.animationImages = (1...2).map { UIImage(named: "Flowers_\($0)", in: .module, compatibleWith: nil)! }
+
+ // We want the image to be scaled to the correct aspect ratio within imageView's bounds.
+ imageView.contentMode = .scaleAspectFit
+
+ imageView.animationDuration = 5
+ imageView.startAnimating()
+
+ imageView.isAccessibilityElement = true
+ imageView.accessibilityLabel = NSLocalizedString("Animated", bundle: .module, comment: "")
+
+ if #available(iOS 15, *) {
+ // This case uses UIToolTipInteraction which is available on iOS 15 or later.
+ let interaction =
+ UIToolTipInteraction(defaultToolTip: NSLocalizedString("ImageToolTipTitle", bundle: .module, comment: ""))
+ imageView.addInteraction(interaction)
+ }
+ }
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/LICENSE/LICENSE.txt b/BenchmarkTests/UIKitCatalog/LICENSE/LICENSE.txt
new file mode 100755
index 0000000000..1f0d0578f9
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/LICENSE/LICENSE.txt
@@ -0,0 +1,8 @@
+Copyright © 2021 Apple Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/BenchmarkTests/UIKitCatalog/MenuButtonViewController.swift b/BenchmarkTests/UIKitCatalog/MenuButtonViewController.swift
new file mode 100755
index 0000000000..35c3b10e37
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/MenuButtonViewController.swift
@@ -0,0 +1,184 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to attach menus to `UIButton`.
+*/
+
+import UIKit
+
+class MenuButtonViewController: BaseTableViewController {
+
+ // Cell identifier for each menu button table view cell.
+ enum MenuButtonKind: String, CaseIterable {
+ case buttonMenuProgrammatic
+ case buttonMenuMultiAction
+ case buttonSubMenu
+ case buttonMenuSelection
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("DropDownProgTitle", bundle: .module, comment: ""),
+ cellID: MenuButtonKind.buttonMenuProgrammatic.rawValue,
+ configHandler: configureDropDownProgrammaticButton),
+ CaseElement(title: NSLocalizedString("DropDownMultiActionTitle", bundle: .module, comment: ""),
+ cellID: MenuButtonKind.buttonMenuMultiAction.rawValue,
+ configHandler: configureDropdownMultiActionButton),
+ CaseElement(title: NSLocalizedString("DropDownButtonSubMenuTitle", bundle: .module, comment: ""),
+ cellID: MenuButtonKind.buttonSubMenu.rawValue,
+ configHandler: configureDropdownSubMenuButton),
+ CaseElement(title: NSLocalizedString("PopupSelection", bundle: .module, comment: ""),
+ cellID: MenuButtonKind.buttonMenuSelection.rawValue,
+ configHandler: configureSelectionPopupButton)
+ ])
+ }
+
+ // MARK: - Handlers
+
+ enum ButtonMenuActionIdentifiers: String {
+ case item1
+ case item2
+ case item3
+ }
+ func menuHandler(action: UIAction) {
+ switch action.identifier.rawValue {
+ case ButtonMenuActionIdentifiers.item1.rawValue:
+ Swift.debugPrint("Menu Action: item 1")
+ case ButtonMenuActionIdentifiers.item2.rawValue:
+ Swift.debugPrint("Menu Action: item 2")
+ case ButtonMenuActionIdentifiers.item3.rawValue:
+ Swift.debugPrint("Menu Action: item 3")
+ default: break
+ }
+ }
+
+ func item4Handler(action: UIAction) {
+ Swift.debugPrint("Menu Action: \(action.title)")
+ }
+
+ // MARK: - Drop Down Menu Buttons
+
+ func configureDropDownProgrammaticButton(button: UIButton) {
+ button.menu = UIMenu(children: [
+ UIAction(title: String(format: NSLocalizedString("ItemTitle", bundle: .module, comment: ""), "1"),
+ identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item1.rawValue),
+ handler: menuHandler),
+ UIAction(title: String(format: NSLocalizedString("ItemTitle", bundle: .module, comment: ""), "2"),
+ identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item2.rawValue),
+ handler: menuHandler)
+ ])
+
+ button.showsMenuAsPrimaryAction = true
+ }
+
+ func configureDropdownMultiActionButton(button: UIButton) {
+ let buttonMenu = UIMenu(children: [
+ // Share a single handler for the first 3 actions.
+ UIAction(title: String(format: NSLocalizedString("ItemTitle", bundle: .module, comment: ""), "1"),
+ image: UIImage(systemName: "1.circle"),
+ identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item1.rawValue),
+ attributes: [],
+ handler: menuHandler),
+ UIAction(title: String(format: NSLocalizedString("ItemTitle", bundle: .module, comment: ""), "2"),
+ image: UIImage(systemName: "2.circle"),
+ identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item2.rawValue),
+ handler: menuHandler),
+ UIAction(title: String(format: NSLocalizedString("ItemTitle", bundle: .module, comment: ""), "3"),
+ image: UIImage(systemName: "3.circle"),
+ identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item3.rawValue),
+ handler: menuHandler),
+
+ // Use a separate handler for this 4th action.
+ UIAction(title: String(format: NSLocalizedString("ItemTitle", bundle: .module, comment: ""), "4"),
+ image: UIImage(systemName: "4.circle"),
+ identifier: nil,
+ handler: item4Handler(action:)),
+
+ // Use a closure for the 5th action.
+ UIAction(title: String(format: NSLocalizedString("ItemTitle", bundle: .module, comment: ""), "5"),
+ image: UIImage(systemName: "5.circle"),
+ identifier: nil) { action in
+ Swift.debugPrint("Menu Action: \(action.title)")
+ },
+
+ // Use attributes to make the 6th action disabled.
+ UIAction(title: String(format: NSLocalizedString("ItemTitle", bundle: .module, comment: ""), "6"),
+ image: UIImage(systemName: "6.circle"),
+ identifier: nil,
+ attributes: [UIMenuElement.Attributes.disabled]) { action in
+ Swift.debugPrint("Menu Action: \(action.title)")
+ }
+ ])
+ button.menu = buttonMenu
+
+ // This makes the button behave like a drop down menu.
+ button.showsMenuAsPrimaryAction = true
+ }
+
+ func configureDropdownSubMenuButton(button: UIButton) {
+ let sortClosure = { (action: UIAction) in
+ Swift.debugPrint("Sort by: \(action.title)")
+ }
+ let refreshClosure = { (action: UIAction) in
+ Swift.debugPrint("Refresh handler")
+ }
+ let accountHandler = { (action: UIAction) in
+ Swift.debugPrint("Account handler")
+ }
+
+ var sortMenu: UIMenu
+ if #available(iOS 15, *) { // .singleSelection option only on iOS 15 or later
+ // The sort sub menu supports a selection.
+ sortMenu = UIMenu(title: "Sort By", options: .singleSelection, children: [
+ UIAction(title: "Date", state: .on, handler: sortClosure),
+ UIAction(title: "Size", handler: sortClosure)
+ ])
+ } else {
+ sortMenu = UIMenu(title: "Sort By", children: [
+ UIAction(title: "Date", handler: sortClosure),
+ UIAction(title: "Size", handler: sortClosure)
+ ])
+ }
+
+ let topMenu = UIMenu(children: [
+ UIAction(title: "Refresh", handler: refreshClosure),
+ UIAction(title: "Account", handler: accountHandler),
+ sortMenu
+ ])
+
+ // This makes the button behave like a drop down menu.
+ button.showsMenuAsPrimaryAction = true
+ button.menu = topMenu
+ }
+
+ // MARK: - Selection Popup Menu Button
+
+ func updateColor(_ title: String) {
+ Swift.debugPrint("Color selected: \(title)")
+ }
+
+ func configureSelectionPopupButton(button: UIButton) {
+ let colorClosure = { [unowned self] (action: UIAction) in
+ self.updateColor(action.title)
+ }
+
+ button.menu = UIMenu(children: [
+ UIAction(title: "Red", handler: colorClosure),
+ UIAction(title: "Green", state: .on, handler: colorClosure), // The default selected item (green).
+ UIAction(title: "Blue", handler: colorClosure)
+ ])
+
+ // This makes the button behave like a drop down menu.
+ button.showsMenuAsPrimaryAction = true
+
+ if #available(iOS 15, *) {
+ button.changesSelectionAsPrimaryAction = true
+ // Select the default menu item (green).
+ updateColor((button.menu?.selectedElements.first!.title)!)
+ }
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/ModuleBundle.swift b/BenchmarkTests/UIKitCatalog/ModuleBundle.swift
new file mode 100644
index 0000000000..9821bc2283
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/ModuleBundle.swift
@@ -0,0 +1,15 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+import Foundation
+
+private class ModuleClass { }
+
+extension Bundle {
+ static var module: Bundle { Bundle(for: ModuleClass.self) }
+}
+
+public let bundle: Bundle = .module
diff --git a/BenchmarkTests/UIKitCatalog/OutlineViewController.swift b/BenchmarkTests/UIKitCatalog/OutlineViewController.swift
new file mode 100755
index 0000000000..41801645e8
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/OutlineViewController.swift
@@ -0,0 +1,336 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A simple outline view for the sample app's main UI
+*/
+
+import UIKit
+
+class OutlineViewController: UIViewController {
+
+ enum Section {
+ case main
+ }
+
+ class OutlineItem: Identifiable, Hashable {
+ let title: String
+ let subitems: [OutlineItem]
+ let storyboardName: String?
+ let imageName: String?
+
+ init(title: String, imageName: String?, storyboardName: String? = nil, subitems: [OutlineItem] = []) {
+ self.title = title
+ self.subitems = subitems
+ self.storyboardName = storyboardName
+ self.imageName = imageName
+ }
+
+ func hash(into hasher: inout Hasher) {
+ hasher.combine(id)
+ }
+
+ static func == (lhs: OutlineItem, rhs: OutlineItem) -> Bool {
+ return lhs.id == rhs.id
+ }
+
+ }
+
+ var dataSource: UICollectionViewDiffableDataSource! = nil
+ var outlineCollectionView: UICollectionView! = nil
+
+ private var detailTargetChangeObserver: Any? = nil
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configureCollectionView()
+ configureDataSource()
+
+ // Add a translucent background to the primary view controller for the Mac.
+ splitViewController!.primaryBackgroundStyle = .sidebar
+ view.backgroundColor = UIColor.clear
+
+ // Listen for when the split view controller is expanded or collapsed for iPad multi-tasking,
+ // and on device rotate (iPhones that support regular size class).
+ detailTargetChangeObserver =
+ NotificationCenter.default.addObserver(forName: UIViewController.showDetailTargetDidChangeNotification,
+ object: nil,
+ queue: OperationQueue.main,
+ using: { _ in
+ // Posted when a split view controller is expanded or collapsed.
+
+ // Re-load the data source, the disclosure indicators need to change (push vs. present on a cell).
+ var snapshot = self.dataSource.snapshot()
+ snapshot.reloadItems(self.menuItems)
+ self.dataSource.apply(snapshot, animatingDifferences: false)
+ })
+
+ if navigationController!.traitCollection.userInterfaceIdiom == .mac {
+ navigationController!.navigationBar.isHidden = true
+ }
+ }
+
+ deinit {
+ if let observer = detailTargetChangeObserver {
+ NotificationCenter.default.removeObserver(observer)
+ }
+ }
+
+ lazy var controlsOutlineItem: OutlineItem = {
+
+ // Determine the content of the UIButton grouping.
+ var buttonItems = [
+ OutlineItem(title: NSLocalizedString("ButtonsTitle", bundle: .module, comment: ""), imageName: "rectangle",
+ storyboardName: "ButtonViewController"),
+ OutlineItem(title: NSLocalizedString("MenuButtonsTitle", bundle: .module, comment: ""), imageName: "list.bullet.rectangle",
+ storyboardName: "MenuButtonViewController")
+ ]
+ // UIPointerInteraction to UIButtons is applied for iPad.
+ if navigationController!.traitCollection.userInterfaceIdiom == .pad {
+ buttonItems.append(contentsOf:
+ [OutlineItem(title: NSLocalizedString("PointerInteractionButtonsTitle", bundle: .module, comment: ""),
+ imageName: "cursorarrow.rays",
+ storyboardName: "PointerInteractionButtonViewController") ])
+ }
+
+ var controlsSubItems = [
+ OutlineItem(title: NSLocalizedString("ButtonsTitle", bundle: .module, comment: ""), imageName: "rectangle.on.rectangle", subitems: buttonItems),
+
+ OutlineItem(title: NSLocalizedString("PageControlTitle", bundle: .module, comment: ""), imageName: "photo.on.rectangle", subitems: [
+ OutlineItem(title: NSLocalizedString("DefaultPageControlTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "DefaultPageControlViewController"),
+ OutlineItem(title: NSLocalizedString("CustomPageControlTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "CustomPageControlViewController")
+ ]),
+
+ OutlineItem(title: NSLocalizedString("SearchBarsTitle", bundle: .module, comment: ""), imageName: "magnifyingglass", subitems: [
+ OutlineItem(title: NSLocalizedString("DefaultSearchBarTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "DefaultSearchBarViewController"),
+ OutlineItem(title: NSLocalizedString("CustomSearchBarTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "CustomSearchBarViewController")
+ ]),
+
+ OutlineItem(title: NSLocalizedString("SegmentedControlsTitle", bundle: .module, comment: ""), imageName: "square.split.3x1",
+ storyboardName: "SegmentedControlViewController"),
+ OutlineItem(title: NSLocalizedString("SlidersTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "SliderViewController"),
+ OutlineItem(title: NSLocalizedString("SwitchesTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "SwitchViewController"),
+ OutlineItem(title: NSLocalizedString("TextFieldsTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "TextFieldViewController")
+ ]
+
+ if traitCollection.userInterfaceIdiom != .mac {
+ // UIStepper class is not supported when running Mac Catalyst apps in the Mac idiom.
+ let stepperItem =
+ OutlineItem(title: NSLocalizedString("SteppersTitle", bundle: .module, comment: ""), imageName: nil, storyboardName: "StepperViewController")
+ controlsSubItems.append(stepperItem)
+ }
+
+ return OutlineItem(title: "Controls", imageName: "slider.horizontal.3", subitems: controlsSubItems)
+ }()
+
+ lazy var pickersOutlineItem: OutlineItem = {
+ var pickerSubItems = [
+ OutlineItem(title: NSLocalizedString("DatePickerTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "DatePickerController"),
+ OutlineItem(title: NSLocalizedString("ColorPickerTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "ColorPickerViewController"),
+ OutlineItem(title: NSLocalizedString("FontPickerTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "FontPickerViewController"),
+ OutlineItem(title: NSLocalizedString("ImagePickerTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "ImagePickerViewController")
+ ]
+
+ if traitCollection.userInterfaceIdiom != .mac {
+ // UIPickerView class is not supported when running Mac Catalyst apps in the Mac idiom.
+ // To use a picker in macOS, use UIButton with changesSelectionAsPrimaryAction set to "true".
+ let pickerViewItem =
+ OutlineItem(title: NSLocalizedString("PickerViewTitle", bundle: .module, comment: ""), imageName: nil, storyboardName: "PickerViewController")
+ pickerSubItems.append(pickerViewItem)
+ }
+
+ return OutlineItem(title: "Pickers", imageName: "list.bullet", subitems: pickerSubItems)
+ }()
+
+ lazy var viewsOutlineItem: OutlineItem = {
+ OutlineItem(title: "Views", imageName: "rectangle.stack.person.crop", subitems: [
+ OutlineItem(title: NSLocalizedString("ActivityIndicatorsTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "ActivityIndicatorViewController"),
+ OutlineItem(title: NSLocalizedString("AlertControllersTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "AlertControllerViewController"),
+ OutlineItem(title: NSLocalizedString("TextViewTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "TextViewController"),
+
+ OutlineItem(title: NSLocalizedString("ImagesTitle", bundle: .module, comment: ""), imageName: "photo", subitems: [
+ OutlineItem(title: NSLocalizedString("ImageViewTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "ImageViewController"),
+ OutlineItem(title: NSLocalizedString("SymbolsTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "SymbolViewController")
+ ]),
+
+ OutlineItem(title: NSLocalizedString("ProgressViewsTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "ProgressViewController"),
+ OutlineItem(title: NSLocalizedString("StackViewsTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "StackViewController"),
+
+ OutlineItem(title: NSLocalizedString("ToolbarsTitle", bundle: .module, comment: ""), imageName: "hammer", subitems: [
+ OutlineItem(title: NSLocalizedString("DefaultToolBarTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "DefaultToolbarViewController"),
+ OutlineItem(title: NSLocalizedString("TintedToolbarTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "TintedToolbarViewController"),
+ OutlineItem(title: NSLocalizedString("CustomToolbarBarTitle", bundle: .module, comment: ""), imageName: nil,
+ storyboardName: "CustomToolbarViewController")
+ ]),
+
+ OutlineItem(title: NSLocalizedString("VisualEffectTitle", bundle: .module, comment: ""), imageName: nil, storyboardName: "VisualEffectViewController"),
+
+ OutlineItem(title: NSLocalizedString("WebViewTitle", bundle: .module, comment: ""), imageName: nil, storyboardName: "WebViewController")
+ ])
+ }()
+
+ private lazy var menuItems: [OutlineItem] = {
+ return [
+ controlsOutlineItem,
+ viewsOutlineItem,
+ pickersOutlineItem
+ ]
+ }()
+
+}
+
+// MARK: - UICollectionViewDiffableDataSource
+
+extension OutlineViewController {
+
+ private func configureCollectionView() {
+ let collectionView =
+ UICollectionView(frame: view.bounds, collectionViewLayout: generateLayout())
+ view.addSubview(collectionView)
+ collectionView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
+ self.outlineCollectionView = collectionView
+ collectionView.delegate = self
+ }
+
+ private func configureDataSource() {
+
+ let containerCellRegistration = UICollectionView.CellRegistration { (cell, indexPath, menuItem) in
+
+ var contentConfiguration = cell.defaultContentConfiguration()
+ contentConfiguration.text = menuItem.title
+
+ if let image = menuItem.imageName {
+ contentConfiguration.image = UIImage(systemName: image)
+ }
+
+ contentConfiguration.textProperties.font = .preferredFont(forTextStyle: .headline)
+ cell.contentConfiguration = contentConfiguration
+
+ let disclosureOptions = UICellAccessory.OutlineDisclosureOptions(style: .header)
+ cell.accessories = [.outlineDisclosure(options: disclosureOptions)]
+
+ let background = UIBackgroundConfiguration.clear()
+ cell.backgroundConfiguration = background
+ }
+
+ let cellRegistration = UICollectionView.CellRegistration { cell, indexPath, menuItem in
+ var contentConfiguration = cell.defaultContentConfiguration()
+ contentConfiguration.text = menuItem.title
+
+ if let image = menuItem.imageName {
+ contentConfiguration.image = UIImage(systemName: image)
+ }
+
+ cell.contentConfiguration = contentConfiguration
+
+ let background = UIBackgroundConfiguration.clear()
+ cell.backgroundConfiguration = background
+
+ cell.accessories = self.splitViewWantsToShowDetail() ? [] : [.disclosureIndicator()]
+ }
+
+ dataSource = UICollectionViewDiffableDataSource(collectionView: outlineCollectionView) {
+ (collectionView: UICollectionView, indexPath: IndexPath, item: OutlineItem) -> UICollectionViewCell? in
+ // Return the cell.
+ if item.subitems.isEmpty {
+ return collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: item)
+ } else {
+ return collectionView.dequeueConfiguredReusableCell(using: containerCellRegistration, for: indexPath, item: item)
+ }
+ }
+
+ // Load our initial data.
+ let snapshot = initialSnapshot()
+ self.dataSource.apply(snapshot, to: .main, animatingDifferences: false)
+ }
+
+ private func generateLayout() -> UICollectionViewLayout {
+ let listConfiguration = UICollectionLayoutListConfiguration(appearance: .sidebar)
+ let layout = UICollectionViewCompositionalLayout.list(using: listConfiguration)
+ return layout
+ }
+
+ private func initialSnapshot() -> NSDiffableDataSourceSectionSnapshot {
+ var snapshot = NSDiffableDataSourceSectionSnapshot()
+
+ func addItems(_ menuItems: [OutlineItem], to parent: OutlineItem?) {
+ snapshot.append(menuItems, to: parent)
+ for menuItem in menuItems where !menuItem.subitems.isEmpty {
+ addItems(menuItem.subitems, to: menuItem)
+ }
+ }
+
+ addItems(menuItems, to: nil)
+ return snapshot
+ }
+
+}
+
+// MARK: - UICollectionViewDelegate
+
+extension OutlineViewController: UICollectionViewDelegate {
+
+ private func splitViewWantsToShowDetail() -> Bool {
+ return splitViewController?.traitCollection.horizontalSizeClass == .regular
+ }
+
+ private func pushOrPresentViewController(viewController: UIViewController) {
+ if splitViewWantsToShowDetail() {
+ let navVC = UINavigationController(rootViewController: viewController)
+ splitViewController?.showDetailViewController(navVC, sender: navVC) // Replace the detail view controller.
+
+ if navigationController!.traitCollection.userInterfaceIdiom == .mac {
+ navVC.navigationBar.isHidden = true
+ }
+ } else {
+ navigationController?.pushViewController(viewController, animated: true) // Just push instead of replace.
+ }
+ }
+
+ private func pushOrPresentStoryboard(storyboardName: String) {
+ let exampleStoryboard = UIStoryboard(name: storyboardName, bundle: .module)
+ if let exampleViewController = exampleStoryboard.instantiateInitialViewController() {
+ pushOrPresentViewController(viewController: exampleViewController)
+ }
+ }
+
+ func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+ guard let menuItem = self.dataSource.itemIdentifier(for: indexPath) else { return }
+
+ collectionView.deselectItem(at: indexPath, animated: true)
+
+ if let storyboardName = menuItem.storyboardName {
+ pushOrPresentStoryboard(storyboardName: storyboardName)
+
+ if navigationController!.traitCollection.userInterfaceIdiom == .mac {
+ if let windowScene = view.window?.windowScene {
+ if #available(iOS 15, *) {
+ windowScene.subtitle = menuItem.title
+ }
+ }
+ }
+ }
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/PickerViewController.swift b/BenchmarkTests/UIKitCatalog/PickerViewController.swift
new file mode 100755
index 0000000000..a4bd6bffcd
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/PickerViewController.swift
@@ -0,0 +1,171 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIPickerView`.
+*/
+
+import UIKit
+
+class PickerViewController: UIViewController {
+ // MARK: - Types
+
+ enum ColorComponent: Int {
+ case red = 0, green, blue
+
+ static var count: Int {
+ return ColorComponent.blue.rawValue + 1
+ }
+ }
+
+ struct RGB {
+ static let max: CGFloat = 255.0
+ static let min: CGFloat = 0.0
+ static let offset: CGFloat = 5.0
+ }
+
+ // MARK: - Properties
+
+ @IBOutlet weak var pickerView: UIPickerView!
+ @IBOutlet weak var colorSwatchView: UIView!
+
+ lazy var numberOfColorValuesPerComponent: Int = (Int(RGB.max) / Int(RGB.offset)) + 1
+
+ var redColor: CGFloat = RGB.min {
+ didSet {
+ updateColorSwatchViewBackgroundColor()
+ }
+ }
+
+ var greenColor: CGFloat = RGB.min {
+ didSet {
+ updateColorSwatchViewBackgroundColor()
+ }
+ }
+
+ var blueColor: CGFloat = RGB.min {
+ didSet {
+ updateColorSwatchViewBackgroundColor()
+ }
+ }
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configurePickerView()
+ }
+
+ func updateColorSwatchViewBackgroundColor() {
+ colorSwatchView.backgroundColor = UIColor(red: redColor, green: greenColor, blue: blueColor, alpha: 1)
+ }
+
+ func configurePickerView() {
+ // Set the default selected rows (the desired rows to initially select will vary from app to app).
+ let selectedRows: [ColorComponent: Int] = [.red: 13, .green: 41, .blue: 24]
+
+ for (colorComponent, selectedRow) in selectedRows {
+ /** Note that the delegate method on `UIPickerViewDelegate` is not triggered
+ when manually calling `selectRow(_:inComponent:animated:)`. To do
+ this, we fire off delegate method manually.
+ */
+ pickerView.selectRow(selectedRow, inComponent: colorComponent.rawValue, animated: true)
+ pickerView(pickerView, didSelectRow: selectedRow, inComponent: colorComponent.rawValue)
+ }
+ }
+
+}
+
+// MARK: - UIPickerViewDataSource
+
+extension PickerViewController: UIPickerViewDataSource {
+ func numberOfComponents(in pickerView: UIPickerView) -> Int {
+ return ColorComponent.count
+ }
+
+ func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
+ return numberOfColorValuesPerComponent
+ }
+}
+
+// MARK: - UIPickerViewDelegate
+
+extension PickerViewController: UIPickerViewDelegate {
+ func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
+ let colorValue = CGFloat(row) * RGB.offset
+
+ // Set the initial colors for each picker segment.
+ let value = CGFloat(colorValue) / RGB.max
+ var redColorComponent = RGB.min
+ var greenColorComponent = RGB.min
+ var blueColorComponent = RGB.min
+
+ switch ColorComponent(rawValue: component)! {
+ case .red:
+ redColorComponent = value
+
+ case .green:
+ greenColorComponent = value
+
+ case .blue:
+ blueColorComponent = value
+ }
+
+ if redColorComponent < 0.5 {
+ redColorComponent = 0.5
+ }
+ if blueColorComponent < 0.5 {
+ blueColorComponent = 0.5
+ }
+ if greenColorComponent < 0.5 {
+ greenColorComponent = 0.5
+ }
+ let foregroundColor = UIColor(red: redColorComponent, green: greenColorComponent, blue: blueColorComponent, alpha: 1.0)
+
+ // Set the foreground color for the entire attributed string.
+ let attributes = [
+ NSAttributedString.Key.foregroundColor: foregroundColor
+ ]
+
+ let title = NSMutableAttributedString(string: "\(Int(colorValue))", attributes: attributes)
+
+ return title
+ }
+
+ func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
+ let colorComponentValue = RGB.offset * CGFloat(row) / RGB.max
+
+ switch ColorComponent(rawValue: component)! {
+ case .red:
+ redColor = colorComponentValue
+
+ case .green:
+ greenColor = colorComponentValue
+
+ case .blue:
+ blueColor = colorComponentValue
+ }
+ }
+
+}
+
+// MARK: - UIPickerViewAccessibilityDelegate
+
+extension PickerViewController: UIPickerViewAccessibilityDelegate {
+
+ func pickerView(_ pickerView: UIPickerView, accessibilityLabelForComponent component: Int) -> String? {
+
+ switch ColorComponent(rawValue: component)! {
+ case .red:
+ return NSLocalizedString("Red color component value", bundle: .module, comment: "")
+
+ case .green:
+ return NSLocalizedString("Green color component value", bundle: .module, comment: "")
+
+ case .blue:
+ return NSLocalizedString("Blue color component value", bundle: .module, comment: "")
+ }
+ }
+}
+
diff --git a/BenchmarkTests/UIKitCatalog/PointerInteractionButtonViewController.swift b/BenchmarkTests/UIKitCatalog/PointerInteractionButtonViewController.swift
new file mode 100755
index 0000000000..b9283464c0
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/PointerInteractionButtonViewController.swift
@@ -0,0 +1,168 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to intergrate pointer interactions to `UIButton`.
+*/
+
+import UIKit
+
+class PointerInteractionButtonViewController: BaseTableViewController {
+
+ // Cell identifier for each button pointer table view cell.
+ enum PointerButtonKind: String, CaseIterable {
+ case buttonPointer
+ case buttonHighlight
+ case buttonLift
+ case buttonHover
+ case buttonCustom
+ }
+
+ // The pointer effect kind to use for each button (corresponds to the button's view tag).
+ enum ButtonPointerEffectKind: Int {
+ case pointer = 1
+ case highlight
+ case lift
+ case hover
+ case custom
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: "UIPointerEffect.automatic",
+ cellID: PointerButtonKind.buttonPointer.rawValue,
+ configHandler: configurePointerButton),
+ CaseElement(title: "UIPointerEffect.highlight",
+ cellID: PointerButtonKind.buttonHighlight.rawValue,
+ configHandler: configureHighlightButton),
+ CaseElement(title: "UIPointerEffect.lift",
+ cellID: PointerButtonKind.buttonLift.rawValue,
+ configHandler: configureLiftButton),
+ CaseElement(title: "UIPointerEffect.hover",
+ cellID: PointerButtonKind.buttonHover.rawValue,
+ configHandler: configureHoverButton),
+ CaseElement(title: "UIPointerEffect (custom)",
+ cellID: PointerButtonKind.buttonCustom.rawValue,
+ configHandler: configureCustomButton)
+ ])
+ }
+
+ // MARK: - Configurations
+
+ func configurePointerButton(button: UIButton) {
+ button.pointerStyleProvider = defaultButtonProvider
+ }
+
+ func configureHighlightButton(button: UIButton) {
+ button.pointerStyleProvider = highlightButtonProvider
+ }
+
+ func configureLiftButton(button: UIButton) {
+ button.pointerStyleProvider = liftButtonProvider
+ }
+
+ func configureHoverButton(button: UIButton) {
+ button.pointerStyleProvider = hoverButtonProvider
+ }
+
+ func configureCustomButton(button: UIButton) {
+ button.pointerStyleProvider = customButtonProvider
+ }
+
+ // MARK: Button Pointer Providers
+
+ func defaultButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
+ var buttonPointerStyle: UIPointerStyle? = nil
+
+ // Use the pointer effect's preview that's passed in.
+ let targetedPreview = pointerEffect.preview
+
+ /** UIPointerEffect.automatic attempts to determine the appropriate effect for the given preview automatically.
+ The pointer effect has an automatic nature which adapts to the aspects of the button (background color, corner radius, size)
+ */
+ let buttonPointerEffect = UIPointerEffect.automatic(targetedPreview)
+ buttonPointerStyle = UIPointerStyle(effect: buttonPointerEffect, shape: pointerShape)
+ return buttonPointerStyle
+ }
+
+ func highlightButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
+ var buttonPointerStyle: UIPointerStyle? = nil
+
+ // Use the pointer effect's preview that's passed in.
+ let targetedPreview = pointerEffect.preview
+
+ // Pointer slides under the given view and morphs into the view's shape.
+ let buttonHighlightPointerEffect = UIPointerEffect.highlight(targetedPreview)
+ buttonPointerStyle = UIPointerStyle(effect: buttonHighlightPointerEffect, shape: pointerShape)
+
+ return buttonPointerStyle
+ }
+
+ func liftButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
+ var buttonPointerStyle: UIPointerStyle? = nil
+
+ // Use the pointer effect's preview that's passed in.
+ let targetedPreview = pointerEffect.preview
+
+ /** Pointer slides under the given view and disappears as the view scales up and gains a shadow.
+ Make the pointer shape’s bounds match the view’s frame so the highlight extends to the edges.
+ */
+ let buttonLiftPointerEffect = UIPointerEffect.lift(targetedPreview)
+ let customPointerShape = UIPointerShape.path(UIBezierPath(roundedRect: button.bounds, cornerRadius: 6.0))
+ buttonPointerStyle = UIPointerStyle(effect: buttonLiftPointerEffect, shape: customPointerShape)
+
+ return buttonPointerStyle
+ }
+
+ func hoverButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
+ var buttonPointerStyle: UIPointerStyle? = nil
+
+ // Use the pointer effect's preview that's passed in.
+ let targetedPreview = pointerEffect.preview
+
+ /** Pointer retains the system shape while over the given view.
+ Visual changes applied to the view are dictated by the effect's properties.
+ */
+ let buttonHoverPointerEffect =
+ UIPointerEffect.hover(targetedPreview, preferredTintMode: .none, prefersShadow: true)
+ buttonPointerStyle = UIPointerStyle(effect: buttonHoverPointerEffect, shape: nil)
+
+ return buttonPointerStyle
+ }
+
+ func customButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
+ var buttonPointerStyle: UIPointerStyle? = nil
+
+ /** Hover pointer with a custom triangle pointer shape.
+ Override the default UITargetedPreview with our own, make the visible path outset a little larger.
+ */
+ let parameters = UIPreviewParameters()
+ parameters.visiblePath = UIBezierPath(rect: button.bounds.insetBy(dx: -15.0, dy: -15.0))
+ let newTargetedPreview = UITargetedPreview(view: button, parameters: parameters)
+
+ let buttonPointerEffect =
+ UIPointerEffect.hover(newTargetedPreview, preferredTintMode: .overlay, prefersShadow: false, prefersScaledContent: false)
+
+ let customPointerShape = UIPointerShape.path(trianglePointerShape())
+ buttonPointerStyle = UIPointerStyle(effect: buttonPointerEffect, shape: customPointerShape)
+
+ return buttonPointerStyle
+ }
+
+ // Return a triangle bezier path for the pointer's shape.
+ func trianglePointerShape() -> UIBezierPath {
+ let width = 20.0
+ let height = 20.0
+ let offset = 10.0 // Coordinate location to match up with the coordinate of default pointer shape.
+
+ let pathView = UIBezierPath()
+ pathView.move(to: CGPoint(x: (width / 2) - offset, y: -offset))
+ pathView.addLine(to: CGPoint(x: -offset, y: height - offset))
+ pathView.addLine(to: CGPoint(x: width - offset, y: height - offset))
+ pathView.close()
+
+ return pathView
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/ProgressViewController.swift b/BenchmarkTests/UIKitCatalog/ProgressViewController.swift
new file mode 100755
index 0000000000..04b0b9dcbd
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/ProgressViewController.swift
@@ -0,0 +1,132 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIProgressView`.
+*/
+
+import UIKit
+
+class ProgressViewController: BaseTableViewController {
+ // Cell identifier for each progress view table view cell.
+ enum ProgressViewKind: String, CaseIterable {
+ case defaultProgress
+ case barProgress
+ case tintedProgress
+ }
+
+ // MARK: - Properties
+
+ var observer: NSKeyValueObservation?
+
+ // An `NSProgress` object whose `fractionCompleted` is observed using KVO to update the `UIProgressView`s' `progress` properties.
+ let progress = Progress(totalUnitCount: 10)
+
+ // A repeating timer that, when fired, updates the `NSProgress` object's `completedUnitCount` property.
+ var updateTimer: Timer?
+
+ var progressViews = [UIProgressView]() // Accumulated progress views from all table cells for progress updating.
+
+ // MARK: - Initialization
+
+ required init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+
+ // Register as an observer of the `NSProgress`'s `fractionCompleted` property.
+ observer = progress.observe(\.fractionCompleted, options: [.new]) { (_, _) in
+ // Update the progress views.
+ for progressView in self.progressViews {
+ progressView.setProgress(Float(self.progress.fractionCompleted), animated: true)
+ }
+ }
+ }
+
+ deinit {
+ // Unregister as an observer of the `NSProgress`'s `fractionCompleted` property.
+ observer?.invalidate()
+ }
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("ProgressDefaultTitle", bundle: .module, comment: ""),
+ cellID: ProgressViewKind.defaultProgress.rawValue,
+ configHandler: configureDefaultStyleProgressView),
+ CaseElement(title: NSLocalizedString("ProgressBarTitle", bundle: .module, comment: ""),
+ cellID: ProgressViewKind.barProgress.rawValue,
+ configHandler: configureBarStyleProgressView)
+ ])
+
+ if traitCollection.userInterfaceIdiom != .mac {
+ // Tinted progress views available only on iOS.
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("ProgressTintedTitle", bundle: .module, comment: ""),
+ cellID: ProgressViewKind.tintedProgress.rawValue,
+ configHandler: configureTintedProgressView)
+ ])
+ }
+ }
+
+ override func viewDidAppear(_ animated: Bool) {
+ super.viewDidAppear(animated)
+
+ /** Reset the `completedUnitCount` of the `NSProgress` object and create
+ a repeating timer to increment it over time.
+ */
+ progress.completedUnitCount = 0
+
+ updateTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (_) in
+ /** Update the `completedUnitCount` of the `NSProgress` object if it's
+ not completed. Otherwise, stop the timer.
+ */
+ if self.progress.completedUnitCount < self.progress.totalUnitCount {
+ self.progress.completedUnitCount += 1
+ } else {
+ self.updateTimer?.invalidate()
+ }
+ })
+ }
+
+ override func viewDidDisappear(_ animated: Bool) {
+ super.viewDidDisappear(animated)
+
+ // Stop the timer from firing.
+ updateTimer?.invalidate()
+ }
+
+ // MARK: - Configuration
+
+ func configureDefaultStyleProgressView(_ progressView: UIProgressView) {
+ progressView.progressViewStyle = .default
+
+ // Reset the completed progress of the `UIProgressView`s.
+ progressView.setProgress(0.0, animated: false)
+
+ progressViews.append(progressView)
+ }
+
+ func configureBarStyleProgressView(_ progressView: UIProgressView) {
+ progressView.progressViewStyle = .bar
+
+ // Reset the completed progress of the `UIProgressView`s.
+ progressView.setProgress(0.0, animated: false)
+
+ progressViews.append(progressView)
+ }
+
+ func configureTintedProgressView(_ progressView: UIProgressView) {
+ progressView.progressViewStyle = .default
+
+ progressView.trackTintColor = UIColor.systemBlue
+ progressView.progressTintColor = UIColor.systemPurple
+
+ // Reset the completed progress of the `UIProgressView`s.
+ progressView.setProgress(0.0, animated: false)
+
+ progressViews.append(progressView)
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/SegmentedControlViewController.swift b/BenchmarkTests/UIKitCatalog/SegmentedControlViewController.swift
new file mode 100755
index 0000000000..c4fe1334bd
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/SegmentedControlViewController.swift
@@ -0,0 +1,189 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UISegmentedControl`.
+*/
+
+import UIKit
+
+class SegmentedControlViewController: BaseTableViewController {
+
+ // Cell identifier for each segmented control table view cell.
+ enum SegmentKind: String, CaseIterable {
+ case segmentDefault
+ case segmentTinted
+ case segmentCustom
+ case segmentCustomBackground
+ case segmentAction
+ }
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("DefaultTitle", bundle: .module, comment: ""),
+ cellID: SegmentKind.segmentDefault.rawValue,
+ configHandler: configureDefaultSegmentedControl),
+ CaseElement(title: NSLocalizedString("CustomSegmentsTitle", bundle: .module, comment: ""),
+ cellID: SegmentKind.segmentCustom.rawValue,
+ configHandler: configureCustomSegmentsSegmentedControl),
+ CaseElement(title: NSLocalizedString("CustomBackgroundTitle", bundle: .module, comment: ""),
+ cellID: SegmentKind.segmentCustomBackground.rawValue,
+ configHandler: configureCustomBackgroundSegmentedControl),
+ CaseElement(title: NSLocalizedString("ActionBasedTitle", bundle: .module, comment: ""),
+ cellID: SegmentKind.segmentAction.rawValue,
+ configHandler: configureActionBasedSegmentedControl)
+ ])
+ if self.traitCollection.userInterfaceIdiom != .mac {
+ // Tinted segmented control is only available on iOS.
+ testCells.append(contentsOf: [
+ CaseElement(title: "Tinted",
+ cellID: SegmentKind.segmentTinted.rawValue,
+ configHandler: configureTintedSegmentedControl)
+ ])
+ }
+ }
+
+ // MARK: - Configuration
+
+ func configureDefaultSegmentedControl(_ segmentedControl: UISegmentedControl) {
+ // As a demonstration, disable the first segment.
+ segmentedControl.setEnabled(false, forSegmentAt: 0)
+
+ segmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged)
+ }
+
+ func configureTintedSegmentedControl(_ segmentedControl: UISegmentedControl) {
+ // Use a dynamic tinted "green" color (separate one for Light Appearance and separate one for Dark Appearance).
+ segmentedControl.selectedSegmentTintColor = UIColor(named: "tinted_segmented_control", in: .module, compatibleWith: nil)!
+ segmentedControl.selectedSegmentIndex = 1
+
+ segmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged)
+ }
+
+ func configureCustomSegmentsSegmentedControl(_ segmentedControl: UISegmentedControl) {
+ let airplaneImage = UIImage(systemName: "airplane")
+ airplaneImage?.accessibilityLabel = NSLocalizedString("Airplane", bundle: .module, comment: "")
+ segmentedControl.setImage(airplaneImage, forSegmentAt: 0)
+
+ let giftImage = UIImage(systemName: "gift")
+ giftImage?.accessibilityLabel = NSLocalizedString("Gift", bundle: .module, comment: "")
+ segmentedControl.setImage(giftImage, forSegmentAt: 1)
+
+ let burstImage = UIImage(systemName: "burst")
+ burstImage?.accessibilityLabel = NSLocalizedString("Burst", bundle: .module, comment: "")
+ segmentedControl.setImage(burstImage, forSegmentAt: 2)
+
+ segmentedControl.selectedSegmentIndex = 0
+
+ segmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged)
+ }
+
+ // Utility function to resize an image to a particular size.
+ func scaledImage(_ image: UIImage, scaledToSize newSize: CGSize) -> UIImage {
+ UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
+ image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
+ let newImage = UIGraphicsGetImageFromCurrentImageContext()!
+ UIGraphicsEndImageContext()
+ return newImage
+ }
+
+ // Configure the segmented control with a background image, dividers, and custom font.
+ // The background image first needs to be sized to match the control's size.
+ //
+ func configureCustomBackgroundSegmentedControl(_ placeHolderView: UIView) {
+ let customBackgroundSegmentedControl =
+ UISegmentedControl(items: [NSLocalizedString("CheckTitle", bundle: .module, comment: ""),
+ NSLocalizedString("SearchTitle", bundle: .module, comment: ""),
+ NSLocalizedString("ToolsTitle", bundle: .module, comment: "")])
+ customBackgroundSegmentedControl.selectedSegmentIndex = 2
+
+ // Place this custom segmented control within the placeholder view.
+ customBackgroundSegmentedControl.frame.size.width = placeHolderView.frame.size.width
+ customBackgroundSegmentedControl.frame.origin.y =
+ (placeHolderView.bounds.size.height - customBackgroundSegmentedControl.bounds.size.height) / 2
+ placeHolderView.addSubview(customBackgroundSegmentedControl)
+
+ // Set the background images for each control state.
+ let normalSegmentBackgroundImage = UIImage(named: "background", in: .module, compatibleWith: nil)
+ // Size the background image to match the bounds of the segmented control.
+ let backgroundImageSize = customBackgroundSegmentedControl.bounds.size
+ let newBackgroundImageSize = scaledImage(normalSegmentBackgroundImage!, scaledToSize: backgroundImageSize)
+ customBackgroundSegmentedControl.setBackgroundImage(newBackgroundImageSize, for: .normal, barMetrics: .default)
+
+ let disabledSegmentBackgroundImage = UIImage(named: "background_disabled", in: .module, compatibleWith: nil)
+ customBackgroundSegmentedControl.setBackgroundImage(disabledSegmentBackgroundImage, for: .disabled, barMetrics: .default)
+
+ let highlightedSegmentBackgroundImage = UIImage(named: "background_highlighted", in: .module, compatibleWith: nil)
+ customBackgroundSegmentedControl.setBackgroundImage(highlightedSegmentBackgroundImage, for: .highlighted, barMetrics: .default)
+
+ // Set the divider image.
+ let segmentDividerImage = UIImage(named: "stepper_and_segment_divider", in: .module, compatibleWith: nil)
+ customBackgroundSegmentedControl.setDividerImage(segmentDividerImage,
+ forLeftSegmentState: .normal,
+ rightSegmentState: .normal,
+ barMetrics: .default)
+
+ // Create a font to use for the attributed title, for both normal and highlighted states.
+ let font = UIFont(descriptor: UIFontDescriptor.preferredFontDescriptor(withTextStyle: .body), size: 0)
+ let normalTextAttributes = [
+ NSAttributedString.Key.foregroundColor: UIColor.systemPurple,
+ NSAttributedString.Key.font: font
+ ]
+ customBackgroundSegmentedControl.setTitleTextAttributes(normalTextAttributes, for: .normal)
+
+ let highlightedTextAttributes = [
+ NSAttributedString.Key.foregroundColor: UIColor.systemGreen,
+ NSAttributedString.Key.font: font
+ ]
+ customBackgroundSegmentedControl.setTitleTextAttributes(highlightedTextAttributes, for: .highlighted)
+
+ customBackgroundSegmentedControl.addTarget(self,
+ action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)),
+ for: .valueChanged)
+ }
+
+ func configureActionBasedSegmentedControl(_ segmentedControl: UISegmentedControl) {
+ segmentedControl.selectedSegmentIndex = 0
+ let firstAction =
+ UIAction(title: NSLocalizedString("CheckTitle", bundle: .module, comment: "")) { action in
+ Swift.debugPrint("Segment Action '\(action.title)'")
+ }
+ segmentedControl.setAction(firstAction, forSegmentAt: 0)
+ let secondAction =
+ UIAction(title: NSLocalizedString("SearchTitle", bundle: .module, comment: "")) { action in
+ Swift.debugPrint("Segment Action '\(action.title)'")
+ }
+ segmentedControl.setAction(secondAction, forSegmentAt: 1)
+ let thirdAction =
+ UIAction(title: NSLocalizedString("ToolsTitle", bundle: .module, comment: "")) { action in
+ Swift.debugPrint("Segment Action '\(action.title)'")
+ }
+ segmentedControl.setAction(thirdAction, forSegmentAt: 2)
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func selectedSegmentDidChange(_ segmentedControl: UISegmentedControl) {
+ Swift.debugPrint("The selected segment: \(segmentedControl.selectedSegmentIndex).")
+ }
+
+ // MARK: - UITableViewDataSource
+
+ override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+ let cellTest = testCells[indexPath.section]
+ let cell = tableView.dequeueReusableCell(withIdentifier: cellTest.cellID, for: indexPath)
+ if let segementedControl = cellTest.targetView(cell) as? UISegmentedControl {
+ cellTest.configHandler(segementedControl)
+ } else if let placeHolderView = cellTest.targetView(cell) {
+ // The only non-segmented control cell has a placeholder UIView (for adding one as a subview).
+ cellTest.configHandler(placeHolderView)
+ }
+ return cell
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/SliderViewController.swift b/BenchmarkTests/UIKitCatalog/SliderViewController.swift
new file mode 100755
index 0000000000..5e24fa16e2
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/SliderViewController.swift
@@ -0,0 +1,145 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UISlider`.
+*/
+
+import UIKit
+
+class SliderViewController: BaseTableViewController {
+ // Cell identifier for each slider table view cell.
+ enum SliderKind: String, CaseIterable {
+ case sliderDefault
+ case sliderTinted
+ case sliderCustom
+ case sliderMaxMinImage
+ }
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("DefaultTitle", bundle: .module, comment: ""),
+ cellID: SliderKind.sliderDefault.rawValue,
+ configHandler: configureDefaultSlider)
+ ])
+
+ if #available(iOS 15, *) {
+ // These cases require iOS 15 or later when running on Mac Catalyst.
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("CustomTitle", bundle: .module, comment: ""),
+ cellID: SliderKind.sliderCustom.rawValue,
+ configHandler: configureCustomSlider)
+ ])
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("MinMaxImagesTitle", bundle: .module, comment: ""),
+ cellID: SliderKind.sliderMaxMinImage.rawValue,
+ configHandler: configureMinMaxImageSlider)
+ ])
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("TintedTitle", bundle: .module, comment: ""),
+ cellID: SliderKind.sliderTinted.rawValue,
+ configHandler: configureTintedSlider)
+ ])
+ }
+ }
+
+ // MARK: - Configuration
+
+ func configureDefaultSlider(_ slider: UISlider) {
+ slider.minimumValue = 0
+ slider.maximumValue = 100
+ slider.value = 42
+ slider.isContinuous = true
+
+ slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
+ }
+
+ @available(iOS 15.0, *)
+ func configureTintedSlider(slider: UISlider) {
+ /** To keep the look the same betwen iOS and macOS:
+ For minimumTrackTintColor, maximumTrackTintColor to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
+ Available in macOS 12 or later (Mac Catalyst 15.0 or later).
+ Use this for controls that need to look the same between iOS and macOS.
+ */
+ if traitCollection.userInterfaceIdiom == .mac {
+ slider.preferredBehavioralStyle = .pad
+ }
+
+ slider.minimumTrackTintColor = UIColor.systemBlue
+ slider.maximumTrackTintColor = UIColor.systemPurple
+
+ slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
+ }
+
+ @available(iOS 15.0, *)
+ func configureCustomSlider(slider: UISlider) {
+ /** To keep the look the same betwen iOS and macOS:
+ For setMinimumTrackImage, setMaximumTrackImage, setThumbImage to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
+ Available in macOS 12 or later (Mac Catalyst 15.0 or later).
+ Use this for controls that need to look the same between iOS and macOS.
+ */
+ if traitCollection.userInterfaceIdiom == .mac {
+ slider.preferredBehavioralStyle = .pad
+ }
+
+ let leftTrackImage = UIImage(named: "slider_blue_track", in: .module, compatibleWith: nil)
+ slider.setMinimumTrackImage(leftTrackImage, for: .normal)
+
+ let rightTrackImage = UIImage(named: "slider_green_track", in: .module, compatibleWith: nil)
+ slider.setMaximumTrackImage(rightTrackImage, for: .normal)
+
+ // Set the sliding thumb image (normal and highlighted).
+ //
+ // For fun, choose a different image symbol configuraton for the thumb's image between macOS and iOS.
+ var thumbImageConfig: UIImage.SymbolConfiguration
+ if slider.traitCollection.userInterfaceIdiom == .mac {
+ thumbImageConfig = UIImage.SymbolConfiguration(scale: .large)
+ } else {
+ thumbImageConfig = UIImage.SymbolConfiguration(pointSize: 30, weight: .heavy, scale: .large)
+ }
+ let thumbImage = UIImage(systemName: "circle.fill", withConfiguration: thumbImageConfig)
+ slider.setThumbImage(thumbImage, for: .normal)
+
+ let thumbImageHighlighted = UIImage(systemName: "circle", withConfiguration: thumbImageConfig)
+ slider.setThumbImage(thumbImageHighlighted, for: .highlighted)
+
+ // Set the rest of the slider's attributes.
+ slider.minimumValue = 0
+ slider.maximumValue = 100
+ slider.isContinuous = false
+ slider.value = 84
+
+ slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
+ }
+
+ func configureMinMaxImageSlider(slider: UISlider) {
+ /** To keep the look the same betwen iOS and macOS:
+ For setMinimumValueImage, setMaximumValueImage to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
+ Available in macOS 12 or later (Mac Catalyst 15.0 or later).
+ Use this for controls that need to look the same between iOS and macOS.
+ */
+ if #available(iOS 15, *) {
+ if traitCollection.userInterfaceIdiom == .mac {
+ slider.preferredBehavioralStyle = .pad
+ }
+ }
+
+ slider.minimumValueImage = UIImage(systemName: "tortoise")
+ slider.maximumValueImage = UIImage(systemName: "hare")
+
+ slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func sliderValueDidChange(_ slider: UISlider) {
+ let formattedValue = String(format: "%.2f", slider.value)
+ Swift.debugPrint("Slider changed its value: \(formattedValue)")
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/StackViewController.swift b/BenchmarkTests/UIKitCatalog/StackViewController.swift
new file mode 100755
index 0000000000..b8859f258b
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/StackViewController.swift
@@ -0,0 +1,98 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates different options for manipulating `UIStackView` content.
+*/
+
+import UIKit
+
+class StackViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet var furtherDetailStackView: UIStackView!
+ @IBOutlet var plusButton: UIButton!
+ @IBOutlet var addRemoveExampleStackView: UIStackView!
+ @IBOutlet var addArrangedViewButton: UIButton!
+ @IBOutlet var removeArrangedViewButton: UIButton!
+
+ let maximumArrangedSubviewCount = 3
+
+ // MARK: - View Life Cycle
+
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+
+ furtherDetailStackView.isHidden = true
+ plusButton.isHidden = false
+ updateAddRemoveButtons()
+ }
+
+ // MARK: - Actions
+
+ @IBAction func showFurtherDetail(_: AnyObject) {
+ // Animate the changes by performing them in a `UIViewPropertyAnimator` animation block.
+ let showDetailAnimator = UIViewPropertyAnimator(duration: 0.25, curve: .easeIn, animations: { [weak self] in
+ // Reveal the further details stack view and hide the plus button.
+ self?.furtherDetailStackView.isHidden = false
+ self?.plusButton.isHidden = true
+ })
+ showDetailAnimator.startAnimation()
+ }
+
+ @IBAction func hideFurtherDetail(_: AnyObject) {
+ // Animate the changes by performing them in a `UIViewPropertyAnimator` animation block.
+ let hideDetailAnimator = UIViewPropertyAnimator(duration: 0.25, curve: .easeOut, animations: { [weak self] in
+ // Reveal the further details stack view and hide the plus button.
+ self?.furtherDetailStackView.isHidden = true
+ self?.plusButton.isHidden = false
+ })
+ hideDetailAnimator.startAnimation()
+ }
+
+ @IBAction func addArrangedSubviewToStack(_: AnyObject) {
+ // Create a simple, fixed-size, square view to add to the stack view.
+ let newViewSize = CGSize(width: 38, height: 38)
+ let newView = UIView(frame: CGRect(origin: CGPoint.zero, size: newViewSize))
+ newView.backgroundColor = randomColor()
+ newView.widthAnchor.constraint(equalToConstant: newViewSize.width).isActive = true
+ newView.heightAnchor.constraint(equalToConstant: newViewSize.height).isActive = true
+
+ // Adding an arranged subview automatically adds it as a child of the stack view.
+ addRemoveExampleStackView.addArrangedSubview(newView)
+
+ updateAddRemoveButtons()
+ }
+
+ @IBAction func removeArrangedSubviewFromStack(_: AnyObject) {
+ // Make sure there is an arranged view to remove.
+ guard let viewToRemove = addRemoveExampleStackView.arrangedSubviews.last else { return }
+
+ addRemoveExampleStackView.removeArrangedSubview(viewToRemove)
+
+ /** Calling `removeArrangedSubview` does not remove the provided view from
+ the stack view's `subviews` array. Since we no longer want the view
+ we removed to appear, we have to explicitly remove it from its superview.
+ */
+ viewToRemove.removeFromSuperview()
+
+ updateAddRemoveButtons()
+ }
+
+ // MARK: - Convenience
+
+ func updateAddRemoveButtons() {
+ let arrangedSubviewCount = addRemoveExampleStackView.arrangedSubviews.count
+
+ addArrangedViewButton.isEnabled = arrangedSubviewCount < maximumArrangedSubviewCount
+ removeArrangedViewButton.isEnabled = arrangedSubviewCount > 0
+ }
+
+ func randomColor() -> UIColor {
+ let red = CGFloat(arc4random_uniform(255)) / 255.0
+ let green = CGFloat(arc4random_uniform(255)) / 255.0
+ let blue = CGFloat(arc4random_uniform(255)) / 255.0
+
+ return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/StepperViewController.swift b/BenchmarkTests/UIKitCatalog/StepperViewController.swift
new file mode 100755
index 0000000000..216fc7e0cf
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/StepperViewController.swift
@@ -0,0 +1,97 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIStepper`.
+*/
+
+import UIKit
+
+class StepperViewController: BaseTableViewController {
+
+ // Cell identifier for each stepper table view cell.
+ enum StepperKind: String, CaseIterable {
+ case defaultStepper
+ case tintedStepper
+ case customStepper
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("DefaultStepperTitle", bundle: .module, comment: ""),
+ cellID: StepperKind.defaultStepper.rawValue,
+ configHandler: configureDefaultStepper),
+ CaseElement(title: NSLocalizedString("TintedStepperTitle", bundle: .module, comment: ""),
+ cellID: StepperKind.tintedStepper.rawValue,
+ configHandler: configureTintedStepper),
+ CaseElement(title: NSLocalizedString("CustomStepperTitle", bundle: .module, comment: ""),
+ cellID: StepperKind.customStepper.rawValue,
+ configHandler: configureCustomStepper)
+ ])
+ }
+
+ // MARK: - Configuration
+
+ func configureDefaultStepper(stepper: UIStepper) {
+ // Setup the stepper range 0 to 10, initial value 0, increment/decrement factor of 1.
+ stepper.value = 0
+ stepper.minimumValue = 0
+ stepper.maximumValue = 10
+ stepper.stepValue = 1
+
+ stepper.addTarget(self,
+ action: #selector(StepperViewController.stepperValueDidChange(_:)),
+ for: .valueChanged)
+ }
+
+ func configureTintedStepper(stepper: UIStepper) {
+ // Setup the stepper range 0 to 20, initial value 20, increment/decrement factor of 1.
+ stepper.value = 20
+ stepper.minimumValue = 0
+ stepper.maximumValue = 20
+ stepper.stepValue = 1
+
+ stepper.tintColor = UIColor(named: "tinted_stepper_control", in: .module, compatibleWith: nil)!
+ stepper.setDecrementImage(stepper.decrementImage(for: .normal), for: .normal)
+ stepper.setIncrementImage(stepper.incrementImage(for: .normal), for: .normal)
+
+ stepper.addTarget(self,
+ action: #selector(StepperViewController.stepperValueDidChange(_:)),
+ for: .valueChanged)
+ }
+
+ func configureCustomStepper(stepper: UIStepper) {
+ // Set the background image.
+ let stepperBackgroundImage = UIImage(named: "background", in: .module, compatibleWith: nil)
+ stepper.setBackgroundImage(stepperBackgroundImage, for: .normal)
+
+ let stepperHighlightedBackgroundImage = UIImage(named: "background_highlighted", in: .module, compatibleWith: nil)
+ stepper.setBackgroundImage(stepperHighlightedBackgroundImage, for: .highlighted)
+
+ let stepperDisabledBackgroundImage = UIImage(named: "background_disabled", in: .module, compatibleWith: nil)
+ stepper.setBackgroundImage(stepperDisabledBackgroundImage, for: .disabled)
+
+ // Set the image which will be painted in between the two stepper segments. It depends on the states of both segments.
+ let stepperSegmentDividerImage = UIImage(named: "stepper_and_segment_divider", in: .module, compatibleWith: nil)
+ stepper.setDividerImage(stepperSegmentDividerImage, forLeftSegmentState: .normal, rightSegmentState: .normal)
+
+ // Set the image for the + button.
+ let stepperIncrementImage = UIImage(systemName: "plus")
+ stepper.setIncrementImage(stepperIncrementImage, for: .normal)
+
+ // Set the image for the - button.
+ let stepperDecrementImage = UIImage(systemName: "minus")
+ stepper.setDecrementImage(stepperDecrementImage, for: .normal)
+
+ stepper.addTarget(self, action: #selector(StepperViewController.stepperValueDidChange(_:)), for: .valueChanged)
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func stepperValueDidChange(_ stepper: UIStepper) {
+ Swift.debugPrint("A stepper changed its value: \(stepper.value).")
+ }
+}
diff --git a/BenchmarkTests/UIKitCatalog/SwitchViewController.swift b/BenchmarkTests/UIKitCatalog/SwitchViewController.swift
new file mode 100755
index 0000000000..fddd6494f5
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/SwitchViewController.swift
@@ -0,0 +1,91 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UISwitch`.
+*/
+
+import UIKit
+
+class SwitchViewController: BaseTableViewController {
+
+ // Cell identifier for each switch table view cell.
+ enum SwitchKind: String, CaseIterable {
+ case defaultSwitch
+ case checkBoxSwitch
+ case tintedSwitch
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("DefaultSwitchTitle", bundle: .module, comment: ""),
+ cellID: SwitchKind.defaultSwitch.rawValue,
+ configHandler: configureDefaultSwitch)
+ ])
+
+ // Checkbox switch is available only when running on macOS.
+ if navigationController!.traitCollection.userInterfaceIdiom == .mac {
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("CheckboxSwitchTitle", bundle: .module, comment: ""),
+ cellID: SwitchKind.checkBoxSwitch.rawValue,
+ configHandler: configureCheckboxSwitch)
+ ])
+ }
+
+ // Tinted switch is available only when running on iOS.
+ if navigationController!.traitCollection.userInterfaceIdiom != .mac {
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("TintedSwitchTitle", bundle: .module, comment: ""),
+ cellID: SwitchKind.tintedSwitch.rawValue,
+ configHandler: configureTintedSwitch)
+ ])
+ }
+ }
+
+ // MARK: - Configuration
+
+ func configureDefaultSwitch(_ switchControl: UISwitch) {
+ switchControl.setOn(true, animated: false)
+ switchControl.preferredStyle = .sliding
+
+ switchControl.addTarget(self,
+ action: #selector(SwitchViewController.switchValueDidChange(_:)),
+ for: .valueChanged)
+ }
+
+ func configureCheckboxSwitch(_ switchControl: UISwitch) {
+ switchControl.setOn(true, animated: false)
+
+ switchControl.addTarget(self,
+ action: #selector(SwitchViewController.switchValueDidChange(_:)),
+ for: .valueChanged)
+
+ // On the Mac, make sure this control take on the apperance of a checkbox with a title.
+ if traitCollection.userInterfaceIdiom == .mac {
+ switchControl.preferredStyle = .checkbox
+
+ // Title on a UISwitch is only supported when running Catalyst apps in the Mac Idiom.
+ switchControl.title = NSLocalizedString("SwitchTitle", bundle: .module, comment: "")
+ }
+ }
+
+ func configureTintedSwitch(_ switchControl: UISwitch) {
+ switchControl.tintColor = UIColor.systemBlue
+ switchControl.onTintColor = UIColor.systemGreen
+ switchControl.thumbTintColor = UIColor.systemPurple
+
+ switchControl.addTarget(self,
+ action: #selector(SwitchViewController.switchValueDidChange(_:)),
+ for: .valueChanged)
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func switchValueDidChange(_ aSwitch: UISwitch) {
+ Swift.debugPrint("A switch changed its value: \(aSwitch.isOn).")
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/SymbolViewController.swift b/BenchmarkTests/UIKitCatalog/SymbolViewController.swift
new file mode 100755
index 0000000000..70c4ea030c
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/SymbolViewController.swift
@@ -0,0 +1,106 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use SF Symbols.
+*/
+
+import UIKit
+
+class SymbolViewController: BaseTableViewController {
+
+ // Cell identifier for each SF Symbol table view cell.
+ enum SymbolKind: String, CaseIterable {
+ case plainSymbol
+ case tintedSymbol
+ case largeSizeSymbol
+ case hierarchicalColorSymbol
+ case paletteColorsSymbol
+ case preferringMultiColorSymbol
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("PlainSymbolTitle", bundle: .module, comment: ""),
+ cellID: SymbolKind.plainSymbol.rawValue,
+ configHandler: configurePlainSymbol),
+ CaseElement(title: NSLocalizedString("TintedSymbolTitle", bundle: .module, comment: ""),
+ cellID: SymbolKind.tintedSymbol.rawValue,
+ configHandler: configureTintedSymbol),
+ CaseElement(title: NSLocalizedString("LargeSymbolTitle", bundle: .module, comment: ""),
+ cellID: SymbolKind.largeSizeSymbol.rawValue,
+ configHandler: configureLargeSizeSymbol)
+ ])
+
+ if #available(iOS 15, *) {
+ // These type SF Sybols, and variants are available on iOS 15, Mac Catalyst 15 or later.
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("HierarchicalSymbolTitle", bundle: .module, comment: ""),
+ cellID: SymbolKind.hierarchicalColorSymbol.rawValue,
+ configHandler: configureHierarchicalSymbol),
+ CaseElement(title: NSLocalizedString("PaletteSymbolTitle", bundle: .module, comment: ""),
+ cellID: SymbolKind.paletteColorsSymbol.rawValue,
+ configHandler: configurePaletteColorsSymbol),
+ CaseElement(title: NSLocalizedString("PreferringMultiColorSymbolTitle", bundle: .module, comment: ""),
+ cellID: SymbolKind.preferringMultiColorSymbol.rawValue,
+ configHandler: configurePreferringMultiColorSymbol)
+ ])
+ }
+ }
+
+ // MARK: - UITableViewDataSource
+
+ override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
+ let cellTest = testCells[indexPath.section]
+ let cell = tableView.dequeueReusableCell(withIdentifier: cellTest.cellID)
+ return cell!.contentView.bounds.size.height
+ }
+
+ // MARK: - Configuration
+
+ func configurePlainSymbol(_ imageView: UIImageView) {
+ let image = UIImage(systemName: "cloud.sun.rain.fill")
+ imageView.image = image
+ }
+
+ func configureTintedSymbol(_ imageView: UIImageView) {
+ let image = UIImage(systemName: "cloud.sun.rain.fill")
+ imageView.image = image
+ imageView.tintColor = .systemPurple
+ }
+
+ func configureLargeSizeSymbol(_ imageView: UIImageView) {
+ let image = UIImage(systemName: "cloud.sun.rain.fill")
+ imageView.image = image
+ let symbolConfig = UIImage.SymbolConfiguration(pointSize: 32, weight: .heavy, scale: .large)
+ imageView.preferredSymbolConfiguration = symbolConfig
+ }
+
+ @available(iOS 15.0, *)
+ func configureHierarchicalSymbol(_ imageView: UIImageView) {
+ let imageConfig = UIImage.SymbolConfiguration(hierarchicalColor: UIColor.systemRed)
+ let hierarchicalSymbol = UIImage(systemName: "cloud.sun.rain.fill")
+ imageView.image = hierarchicalSymbol
+ imageView.preferredSymbolConfiguration = imageConfig
+ }
+
+ @available(iOS 15.0, *)
+ func configurePaletteColorsSymbol(_ imageView: UIImageView) {
+ let palleteSymbolConfig = UIImage.SymbolConfiguration(paletteColors: [UIColor.systemRed, UIColor.systemOrange, UIColor.systemYellow])
+ let palleteSymbol = UIImage(systemName: "battery.100.bolt")
+ imageView.image = palleteSymbol
+ imageView.backgroundColor = UIColor.darkText
+ imageView.preferredSymbolConfiguration = palleteSymbolConfig
+ }
+
+ @available(iOS 15.0, *)
+ func configurePreferringMultiColorSymbol(_ imageView: UIImageView) {
+ let preferredSymbolConfig = UIImage.SymbolConfiguration.preferringMulticolor()
+ let preferredSymbol = UIImage(systemName: "circle.hexagongrid.fill")
+ imageView.image = preferredSymbol
+ imageView.preferredSymbolConfiguration = preferredSymbolConfig
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/TextFieldViewController.swift b/BenchmarkTests/UIKitCatalog/TextFieldViewController.swift
new file mode 100755
index 0000000000..23d2a4153d
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/TextFieldViewController.swift
@@ -0,0 +1,181 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UITextField`.
+*/
+
+import UIKit
+
+class TextFieldViewController: BaseTableViewController {
+
+ // Cell identifier for each text field table view cell.
+ enum TextFieldKind: String, CaseIterable {
+ case textField
+ case tintedTextField
+ case secureTextField
+ case specificKeyboardTextField
+ case customTextField
+ case searchTextField
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ testCells.append(contentsOf: [
+ CaseElement(title: NSLocalizedString("DefaultTextFieldTitle", bundle: .module, comment: ""),
+ cellID: TextFieldKind.textField.rawValue,
+ configHandler: configureTextField),
+ CaseElement(title: NSLocalizedString("TintedTextFieldTitle", bundle: .module, comment: ""),
+ cellID: TextFieldKind.tintedTextField.rawValue,
+ configHandler: configureTintedTextField),
+ CaseElement(title: NSLocalizedString("SecuretTextFieldTitle", bundle: .module, comment: ""),
+ cellID: TextFieldKind.secureTextField.rawValue,
+ configHandler: configureSecureTextField),
+ CaseElement(title: NSLocalizedString("SearchTextFieldTitle", bundle: .module, comment: ""),
+ cellID: TextFieldKind.searchTextField.rawValue,
+ configHandler: configureSearchTextField)
+ ])
+
+ if traitCollection.userInterfaceIdiom != .mac {
+ testCells.append(contentsOf: [
+ // Show text field with specific kind of keyboard for iOS only.
+ CaseElement(title: NSLocalizedString("SpecificKeyboardTextFieldTitle", bundle: .module, comment: ""),
+ cellID: TextFieldKind.specificKeyboardTextField.rawValue,
+ configHandler: configureSpecificKeyboardTextField),
+
+ // Show text field with custom background for iOS only.
+ CaseElement(title: NSLocalizedString("CustomTextFieldTitle", bundle: .module, comment: ""),
+ cellID: TextFieldKind.customTextField.rawValue,
+ configHandler: configureCustomTextField)
+ ])
+ }
+ }
+
+ // MARK: - Configuration
+
+ func configureTextField(_ textField: UITextField) {
+ textField.placeholder = NSLocalizedString("Placeholder text", bundle: .module, comment: "")
+ textField.autocorrectionType = .yes
+ textField.returnKeyType = .done
+ textField.clearButtonMode = .whileEditing
+ }
+
+ func configureTintedTextField(_ textField: UITextField) {
+ textField.tintColor = UIColor.systemBlue
+ textField.textColor = UIColor.systemGreen
+
+ textField.placeholder = NSLocalizedString("Placeholder text", bundle: .module, comment: "")
+ textField.returnKeyType = .done
+ textField.clearButtonMode = .never
+ }
+
+ func configureSecureTextField(_ textField: UITextField) {
+ textField.isSecureTextEntry = true
+
+ textField.placeholder = NSLocalizedString("Placeholder text", bundle: .module, comment: "")
+ textField.returnKeyType = .done
+ textField.clearButtonMode = .always
+ }
+
+ func configureSearchTextField(_ textField: UITextField) {
+ if let searchField = textField as? UISearchTextField {
+ searchField.placeholder = NSLocalizedString("Enter search text", bundle: .module, comment: "")
+ searchField.returnKeyType = .done
+ searchField.clearButtonMode = .always
+ searchField.allowsDeletingTokens = true
+
+ // Setup the left view as a symbol image view.
+ let searchIcon = UIImageView(image: UIImage(systemName: "magnifyingglass"))
+ searchIcon.tintColor = UIColor.systemGray
+ searchField.leftView = searchIcon
+ searchField.leftViewMode = .always
+
+ let secondToken = UISearchToken(icon: UIImage(systemName: "staroflife"), text: "Token 2")
+ searchField.insertToken(secondToken, at: 0)
+
+ let firstToken = UISearchToken(icon: UIImage(systemName: "staroflife.fill"), text: "Token 1")
+ searchField.insertToken(firstToken, at: 0)
+ }
+ }
+
+ /** There are many different types of keyboards that you may choose to use.
+ The different types of keyboards are defined in the `UITextInputTraits` interface.
+ This example shows how to display a keyboard to help enter email addresses.
+ */
+ func configureSpecificKeyboardTextField(_ textField: UITextField) {
+ textField.keyboardType = .emailAddress
+
+ textField.placeholder = NSLocalizedString("Placeholder text", bundle: .module, comment: "")
+ textField.returnKeyType = .done
+ }
+
+ func configureCustomTextField(_ textField: UITextField) {
+ // Text fields with custom image backgrounds must have no border.
+ textField.borderStyle = .none
+
+ textField.background = UIImage(named: "text_field_background", in: .module, compatibleWith: nil)
+
+ // Create a purple button to be used as the right view of the custom text field.
+ let purpleImage = UIImage(named: "text_field_purple_right_view", in: .module, compatibleWith: nil)!
+ let purpleImageButton = UIButton(type: .custom)
+ purpleImageButton.bounds = CGRect(x: 0, y: 0, width: purpleImage.size.width, height: purpleImage.size.height)
+ purpleImageButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 5)
+ purpleImageButton.setImage(purpleImage, for: .normal)
+ purpleImageButton.addTarget(self, action: #selector(TextFieldViewController.customTextFieldPurpleButtonClicked), for: .touchUpInside)
+ textField.rightView = purpleImageButton
+ textField.rightViewMode = .always
+
+ textField.placeholder = NSLocalizedString("Placeholder text", bundle: .module, comment: "")
+ textField.autocorrectionType = .no
+ textField.clearButtonMode = .never
+ textField.returnKeyType = .done
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func customTextFieldPurpleButtonClicked() {
+ Swift.debugPrint("The custom text field's purple right view button was clicked.")
+ }
+
+}
+
+// MARK: - UITextFieldDelegate
+
+extension TextFieldViewController: UITextFieldDelegate {
+ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
+ textField.resignFirstResponder()
+ return true
+ }
+
+ func textFieldDidChangeSelection(_ textField: UITextField) {
+ // User changed the text selection.
+ }
+
+ func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
+ // Return false to not change text.
+ return true
+ }
+}
+
+// Custom text field for controlling input text placement.
+class CustomTextField: UITextField {
+ let leftMarginPadding: CGFloat = 12
+ let rightMarginPadding: CGFloat = 36
+
+ override func textRect(forBounds bounds: CGRect) -> CGRect {
+ var rect = bounds
+ rect.origin.x += leftMarginPadding
+ rect.size.width -= rightMarginPadding
+ return rect
+ }
+
+ override func editingRect(forBounds bounds: CGRect) -> CGRect {
+ var rect = bounds
+ rect.origin.x += leftMarginPadding
+ rect.size.width -= rightMarginPadding
+ return rect
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/TextViewController.swift b/BenchmarkTests/UIKitCatalog/TextViewController.swift
new file mode 100755
index 0000000000..b1d71f03ef
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/TextViewController.swift
@@ -0,0 +1,237 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UITextView`.
+*/
+
+import UIKit
+
+class TextViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var textView: UITextView!
+
+ /// Used to adjust the text view's height when the keyboard hides and shows.
+ @IBOutlet weak var textViewBottomLayoutGuideConstraint: NSLayoutConstraint!
+
+ lazy var font = UIFont(
+ descriptor: UIFontDescriptor.preferredFontDescriptor(withTextStyle: UIFont.TextStyle.body),
+ size: 0)
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ configureTextView()
+ }
+
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+
+ // Listen for changes to keyboard visibility so that we can adjust the text view's height accordingly.
+ let notificationCenter = NotificationCenter.default
+
+ notificationCenter.addObserver(self,
+ selector: #selector(TextViewController.handleKeyboardNotification(_:)),
+ name: UIResponder.keyboardWillShowNotification,
+ object: nil)
+
+ notificationCenter.addObserver(self,
+ selector: #selector(TextViewController.handleKeyboardNotification(_:)),
+ name: UIResponder.keyboardWillHideNotification,
+ object: nil)
+ }
+
+ override func viewDidDisappear(_ animated: Bool) {
+ super.viewDidDisappear(animated)
+
+ let notificationCenter = NotificationCenter.default
+ notificationCenter.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
+ notificationCenter.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
+ }
+
+ // MARK: - Keyboard Event Notifications
+
+ @objc
+ func handleKeyboardNotification(_ notification: Notification) {
+ guard let userInfo = notification.userInfo else { return }
+
+ // Get the animation duration.
+ var animationDuration: TimeInterval = 0
+ if let value = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber {
+ animationDuration = value.doubleValue
+ }
+
+ // Convert the keyboard frame from screen to view coordinates.
+ var keyboardScreenBeginFrame = CGRect()
+ if let value = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue) {
+ keyboardScreenBeginFrame = value.cgRectValue
+ }
+
+ var keyboardScreenEndFrame = CGRect()
+ if let value = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue) {
+ keyboardScreenEndFrame = value.cgRectValue
+ }
+
+ let keyboardViewBeginFrame = view.convert(keyboardScreenBeginFrame, from: view.window)
+ let keyboardViewEndFrame = view.convert(keyboardScreenEndFrame, from: view.window)
+
+ let originDelta = keyboardViewEndFrame.origin.y - keyboardViewBeginFrame.origin.y
+
+ // The text view should be adjusted, update the constant for this constraint.
+ textViewBottomLayoutGuideConstraint.constant -= originDelta
+
+ // Inform the view that its autolayout constraints have changed and the layout should be updated.
+ view.setNeedsUpdateConstraints()
+
+ // Animate updating the view's layout by calling layoutIfNeeded inside a `UIViewPropertyAnimator` animation block.
+ let textViewAnimator = UIViewPropertyAnimator(duration: animationDuration, curve: .easeIn, animations: { [weak self] in
+ self?.view.layoutIfNeeded()
+ })
+ textViewAnimator.startAnimation()
+
+ // Scroll to the selected text once the keyboard frame changes.
+ let selectedRange = textView.selectedRange
+ textView.scrollRangeToVisible(selectedRange)
+ }
+
+ // MARK: - Configuration
+
+ func reflowTextAttributes() {
+ var entireTextColor = UIColor.black
+
+ // The text should be white in dark mode.
+ if self.view.traitCollection.userInterfaceStyle == .dark {
+ entireTextColor = UIColor.white
+ }
+ let entireAttributedText = NSMutableAttributedString(attributedString: textView.attributedText!)
+ let entireRange = NSRange(location: 0, length: entireAttributedText.length)
+ entireAttributedText.addAttribute(NSAttributedString.Key.foregroundColor, value: entireTextColor, range: entireRange)
+ textView.attributedText = entireAttributedText
+
+ /** Modify some of the attributes of the attributed string.
+ You can modify these attributes yourself to get a better feel for what they do.
+ Note that the initial text is visible in the storyboard.
+ */
+ let attributedText = NSMutableAttributedString(attributedString: textView.attributedText!)
+
+ /** Use NSString so the result of rangeOfString is an NSRange, not Range.
+ This will then be the correct type to then pass to the addAttribute method of NSMutableAttributedString.
+ */
+ let text = textView.text! as NSString
+
+ // Find the range of each element to modify.
+ let boldRange = text.range(of: NSLocalizedString("bold", bundle: .module, comment: ""))
+ let highlightedRange = text.range(of: NSLocalizedString("highlighted", bundle: .module, comment: ""))
+ let underlinedRange = text.range(of: NSLocalizedString("underlined", bundle: .module, comment: ""))
+ let tintedRange = text.range(of: NSLocalizedString("tinted", bundle: .module, comment: ""))
+
+ // Add bold attribute. Take the current font descriptor and create a new font descriptor with an additional bold trait.
+ let boldFontDescriptor = font.fontDescriptor.withSymbolicTraits(.traitBold)
+ let boldFont = UIFont(descriptor: boldFontDescriptor!, size: 0)
+ attributedText.addAttribute(NSAttributedString.Key.font, value: boldFont, range: boldRange)
+
+ // Add highlight attribute.
+ attributedText.addAttribute(NSAttributedString.Key.backgroundColor, value: UIColor.systemGreen, range: highlightedRange)
+
+ // Add underline attribute.
+ attributedText.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: underlinedRange)
+
+ // Add tint color.
+ attributedText.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.systemBlue, range: tintedRange)
+
+ textView.attributedText = attributedText
+ }
+
+ override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
+ // With the background change, we need to re-apply the text attributes.
+ reflowTextAttributes()
+ }
+
+ func symbolAttributedString(name: String) -> NSAttributedString {
+ let symbolAttachment = NSTextAttachment()
+ if let symbolImage = UIImage(systemName: name)?.withRenderingMode(.alwaysTemplate) {
+ symbolAttachment.image = symbolImage
+ }
+ return NSAttributedString(attachment: symbolAttachment)
+ }
+
+ @available(iOS 15.0, *)
+ func multiColorSymbolAttributedString(name: String) -> NSAttributedString {
+ let symbolAttachment = NSTextAttachment()
+ let palleteSymbolConfig = UIImage.SymbolConfiguration(paletteColors: [UIColor.systemOrange, UIColor.systemRed])
+ if let symbolImage = UIImage(systemName: name)?.withConfiguration(palleteSymbolConfig) {
+ symbolAttachment.image = symbolImage
+ }
+ return NSAttributedString(attachment: symbolAttachment)
+ }
+
+ func configureTextView() {
+ textView.font = font
+ textView.backgroundColor = UIColor(named: "text_view_background", in: .module, compatibleWith: nil)
+
+ textView.isScrollEnabled = true
+
+ // Apply different attributes to the text (bold, tinted, underline, etc.).
+ reflowTextAttributes()
+
+ // Insert symbols as image attachments.
+ let text = textView.text! as NSString
+ let attributedText = NSMutableAttributedString(attributedString: textView.attributedText!)
+ let symbolsSearchRange = text.range(of: NSLocalizedString("symbols", bundle: .module, comment: ""))
+ var insertPoint = symbolsSearchRange.location + symbolsSearchRange.length
+ attributedText.insert(symbolAttributedString(name: "heart"), at: insertPoint)
+ insertPoint += 1
+ attributedText.insert(symbolAttributedString(name: "heart.fill"), at: insertPoint)
+ insertPoint += 1
+ attributedText.insert(symbolAttributedString(name: "heart.slash"), at: insertPoint)
+
+ // Multi-color SF Symbols only in iOS 15 or later.
+ if #available(iOS 15, *) {
+ insertPoint += 1
+ attributedText.insert(multiColorSymbolAttributedString(name: "arrow.up.heart.fill"), at: insertPoint)
+ }
+
+ // Add the image as an attachment.
+ if let image = UIImage(named: "text_view_attachment", in: .module, compatibleWith: nil) {
+ let textAttachment = NSTextAttachment()
+ textAttachment.image = image
+ textAttachment.bounds = CGRect(origin: CGPoint.zero, size: image.size)
+ let textAttachmentString = NSAttributedString(attachment: textAttachment)
+ attributedText.append(textAttachmentString)
+ textView.attributedText = attributedText
+ }
+
+ /** When turned on, this changes the rendering scale of the text to match the standard text scaling
+ and preserves the original font point sizes when the contents of the text view are copied to the pasteboard.
+ Apps that show a lot of text content, such as a text viewer or editor, should turn this on and use the standard text scaling.
+ */
+ textView.usesStandardTextScaling = true
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func doneBarButtonItemClicked() {
+ // Dismiss the keyboard by removing it as the first responder.
+ textView.resignFirstResponder()
+
+ navigationItem.setRightBarButton(nil, animated: true)
+ }
+}
+
+// MARK: - UITextViewDelegate
+
+extension TextViewController: UITextViewDelegate {
+ func textViewDidBeginEditing(_ textView: UITextView) {
+ // Provide a "Done" button for the user to end text editing.
+ let doneBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done,
+ target: self,
+ action: #selector(TextViewController.doneBarButtonItemClicked))
+
+ navigationItem.setRightBarButton(doneBarButtonItem, animated: true)
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/TintedToolbarViewController.swift b/BenchmarkTests/UIKitCatalog/TintedToolbarViewController.swift
new file mode 100755
index 0000000000..430ac755ee
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/TintedToolbarViewController.swift
@@ -0,0 +1,76 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to customize a `UIToolbar`.
+*/
+
+import UIKit
+
+class TintedToolbarViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var toolbar: UIToolbar!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // See the `UIBarStyle` enum for more styles, including `.Default`.
+ toolbar.barStyle = .black
+ toolbar.isTranslucent = false
+
+ toolbar.tintColor = UIColor.systemGreen
+ toolbar.backgroundColor = UIColor.systemBlue
+
+ let toolbarButtonItems = [
+ refreshBarButtonItem,
+ flexibleSpaceBarButtonItem,
+ actionBarButtonItem
+ ]
+ toolbar.setItems(toolbarButtonItems, animated: true)
+ }
+
+ // MARK: - `UIBarButtonItem` Creation and Configuration
+
+ var refreshBarButtonItem: UIBarButtonItem {
+ return UIBarButtonItem(barButtonSystemItem: .refresh,
+ target: self,
+ action: #selector(TintedToolbarViewController.barButtonItemClicked(_:)))
+ }
+
+ var flexibleSpaceBarButtonItem: UIBarButtonItem {
+ // Note that there's no target/action since this represents empty space.
+ return UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
+ target: nil,
+ action: nil)
+ }
+
+ var actionBarButtonItem: UIBarButtonItem {
+ return UIBarButtonItem(barButtonSystemItem: .action,
+ target: self,
+ action: #selector(TintedToolbarViewController.actionBarButtonItemClicked(_:)))
+ }
+
+ // MARK: - Actions
+
+ @objc
+ func barButtonItemClicked(_ barButtonItem: UIBarButtonItem) {
+ Swift.debugPrint("A bar button item on the tinted toolbar was clicked: \(barButtonItem).")
+ }
+
+ @objc
+ func actionBarButtonItemClicked(_ barButtonItem: UIBarButtonItem) {
+ if let image = UIImage(named: "Flowers_1", in: .module, compatibleWith: nil) {
+ let activityItems = ["Shared piece of text", image] as [Any]
+
+ let activityViewController =
+ UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
+
+ activityViewController.popoverPresentationController?.barButtonItem = barButtonItem
+ present(activityViewController, animated: true, completion: nil)
+ }
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/UIKitCatalog.entitlements b/BenchmarkTests/UIKitCatalog/UIKitCatalog.entitlements
new file mode 100755
index 0000000000..ee95ab7e58
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/UIKitCatalog.entitlements
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.network.client
+
+
+
diff --git a/BenchmarkTests/UIKitCatalog/VisualEffectViewController.swift b/BenchmarkTests/UIKitCatalog/VisualEffectViewController.swift
new file mode 100755
index 0000000000..521604f4e0
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/VisualEffectViewController.swift
@@ -0,0 +1,68 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `UIVisualEffectView`.
+*/
+
+import UIKit
+
+class VisualEffectViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet var imageView: UIImageView!
+
+ private var visualEffect: UIVisualEffectView = {
+ let vev = UIVisualEffectView(effect: UIBlurEffect(style: .regular))
+ vev.translatesAutoresizingMaskIntoConstraints = false
+ return vev
+ }()
+
+ private var textView: UITextView = {
+ let textView = UITextView(frame: CGRect())
+ textView.font = UIFont.systemFont(ofSize: 14)
+ textView.text = NSLocalizedString("VisualEffectTextContent", bundle: .module, comment: "")
+
+ textView.translatesAutoresizingMaskIntoConstraints = false
+ textView.backgroundColor = UIColor.clear
+ if let fontDescriptor = UIFontDescriptor
+ .preferredFontDescriptor(withTextStyle: UIFont.TextStyle.body)
+ .withSymbolicTraits(UIFontDescriptor.SymbolicTraits.traitLooseLeading) {
+ let looseLeadingFont = UIFont(descriptor: fontDescriptor, size: 0)
+ textView.font = looseLeadingFont
+ }
+ return textView
+ }()
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // Add the visual effect view in the same area covering the image view.
+ view.addSubview(visualEffect)
+ NSLayoutConstraint.activate([
+ visualEffect.topAnchor.constraint(equalTo: imageView.topAnchor),
+ visualEffect.leadingAnchor.constraint(equalTo: imageView.leadingAnchor),
+ visualEffect.trailingAnchor.constraint(equalTo: imageView.trailingAnchor),
+ visualEffect.bottomAnchor.constraint(equalTo: imageView.bottomAnchor)
+ ])
+
+ // Add a text view as a subview to the visual effect view.
+ visualEffect.contentView.addSubview(textView)
+ NSLayoutConstraint.activate([
+ textView.topAnchor.constraint(equalTo: visualEffect.safeAreaLayoutGuide.topAnchor),
+ textView.leadingAnchor.constraint(equalTo: visualEffect.safeAreaLayoutGuide.leadingAnchor),
+ textView.trailingAnchor.constraint(equalTo: visualEffect.safeAreaLayoutGuide.trailingAnchor),
+ textView.bottomAnchor.constraint(equalTo: visualEffect.safeAreaLayoutGuide.bottomAnchor)
+ ])
+
+ if #available(iOS 15, *) {
+ // Use UIToolTipInteraction which is available on iOS 15 or later, add it to the image view.
+ let toolTipString = NSLocalizedString("VisualEffectToolTipTitle", bundle: .module, comment: "")
+ let interaction = UIToolTipInteraction(defaultToolTip: toolTipString)
+ imageView.addInteraction(interaction)
+ }
+ }
+
+}
diff --git a/BenchmarkTests/UIKitCatalog/WebViewController.swift b/BenchmarkTests/UIKitCatalog/WebViewController.swift
new file mode 100755
index 0000000000..2b462a81f6
--- /dev/null
+++ b/BenchmarkTests/UIKitCatalog/WebViewController.swift
@@ -0,0 +1,59 @@
+/*
+See LICENSE folder for this sample’s licensing information.
+
+Abstract:
+A view controller that demonstrates how to use `WKWebView`.
+*/
+
+import UIKit
+import WebKit
+
+/** NOTE:
+ If your app customizes, interacts with, or controls the display of web content, use the WKWebView class.
+ If you want to view a website from anywhere on the Internet, use the SFSafariViewController class.
+ */
+
+class WebViewController: UIViewController {
+ // MARK: - Properties
+
+ @IBOutlet weak var webView: WKWebView!
+
+ // MARK: - View Life Cycle
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // So we can capture failures in "didFailProvisionalNavigation".
+ webView.navigationDelegate = self
+ loadAddressURL()
+ }
+
+ // MARK: - Loading
+
+ func loadAddressURL() {
+ // Set the content to local html in our app bundle.
+ if let url = Bundle.module.url(forResource: "content", withExtension: "html") {
+ webView.loadFileURL(url, allowingReadAccessTo: url)
+ }
+ }
+
+}
+
+// MARK: - WKNavigationDelegate
+
+extension WebViewController: WKNavigationDelegate {
+ func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
+ let webKitError = error as NSError
+ if webKitError.code == NSURLErrorNotConnectedToInternet {
+ // Report the error inside the web view.
+ let localizedErrorMessage = NSLocalizedString("An error occurred:", bundle: .module, comment: "")
+
+ let message = "\(localizedErrorMessage) \(error.localizedDescription)"
+ let errorHTML =
+ "\(message)
"
+
+ webView.loadHTMLString(errorHTML, baseURL: nil)
+ }
+ }
+
+}
diff --git a/BenchmarkTests/exportOptions.plist b/BenchmarkTests/exportOptions.plist
new file mode 100644
index 0000000000..00cd98869b
--- /dev/null
+++ b/BenchmarkTests/exportOptions.plist
@@ -0,0 +1,19 @@
+
+
+
+
+ distributionBundleIdentifier
+ com.datadoghq.benchmarks.Runner
+ method
+ development
+ provisioningProfiles
+
+ com.datadoghq.benchmarks.Runner
+ Datadog Benchmark Runner
+
+ signingCertificate
+ Apple Development: Robot Bitrise (9HKDHCMCGH)
+ teamID
+ JKFCB4CN7C
+
+
diff --git a/BenchmarkTests/xcconfigs/Runner.xcconfig b/BenchmarkTests/xcconfigs/Runner.xcconfig
new file mode 100644
index 0000000000..251d60c004
--- /dev/null
+++ b/BenchmarkTests/xcconfigs/Runner.xcconfig
@@ -0,0 +1,9 @@
+CLIENT_TOKEN = // the Client Token on Mobile Integration Org
+RUM_APPLICATION_ID = // the RUM Application ID on Mobile Integration Org
+API_KEY = // the API Key on Mobile Integration Org
+
+DD_ENV[config=*] = benchmarks
+DD_ENV[config=Debug] = development
+DD_SITE = us1
+
+#include? "Benchmarks.local.xcconfig"
diff --git a/BenchmarkTests/xcconfigs/Synthetics.xcconfig b/BenchmarkTests/xcconfigs/Synthetics.xcconfig
new file mode 100644
index 0000000000..b7e14c3c51
--- /dev/null
+++ b/BenchmarkTests/xcconfigs/Synthetics.xcconfig
@@ -0,0 +1,6 @@
+#include "Runner.xcconfig"
+
+CODE_SIGN_STYLE = Manual
+CODE_SIGN_IDENTITY = Apple Development: Robot Bitrise (9HKDHCMCGH)
+DEVELOPMENT_TEAM = JKFCB4CN7C
+PROVISIONING_PROFILE_SPECIFIER = Datadog Benchmark Runner
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000..43672d77f8
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,846 @@
+# Unreleased
+
+- [IMPROVEMENT] Add Datadog Configuration `backgroundTasksEnabled` ObjC API. See [#2148][]
+- [FIX] Prevent Session Replay to create two full snapshots in a row. See [#2154][]
+
+# 2.21.0 / 11-12-2024
+
+- [FIX] Fix sporadic file overwrite during consent change, ensuring event data integrity. See [#2113][]
+- [FIX] Fix trace inconsistency when using `URLSessionInterceptor` or Alamofire extension. See [#2114][]
+- [IMPROVEMENT] Add Session Replay `startRecordingImmediately` ObjC API. See [#2120][]
+- [IMPROVEMENT] Expose Crash Reporter Plugin Publicly. See [#2116][] (Thanks [@naftaly][]) [#2126][]
+
+# 2.20.0 / 14-11-2024
+
+- [FIX] Fix race condition during consent change, preventing loss of events recorded on the current thread. See [#2063][]
+- [IMPROVEMENT] Support mutation of events' attributes. See [#2099][]
+- [IMPROVEMENT] Add 'os' and 'device' info to Span events. See [#2104][]
+- [FIX] Fix bug in SR that was enforcing full snapshot more often than needed. See [#2092][]
+
+# 2.19.0 / 28-10-2024
+
+- [FEATURE] Add Privacy Overrides in Session Replay. See [#2088][]
+- [IMPROVEMENT] Add ObjC API for the internal logging/telemetry. See [#2073][]
+- [IMPROVEMENT] Support `clipsToBounds` in Session Replay. See [#2083][]
+
+# 2.18.0 / 25-09-2024
+- [IMPROVEMENT] Add overwrite required (breaking) param to addViewLoadingTime & usage telemetry. See [#2040][]
+- [FEATURE] Prevent "show password" features from revealing sensitive texts in Session Replay. See [#2050][]
+- [FEATURE] Add Fine-Grained Masking configuration options to Session Replay. See [#2043][]
+
+# 2.17.0 / 11-09-2024
+
+- [FEATURE] Add support for view loading experimental API (addViewLoadingTime). See [#2026][]
+- [IMPROVEMENT] Drop support for deprecated cocoapod specs. See [#1998][]
+- [FIX] Propagate global Tracer tags to OpenTelemetry span attributes. See [#2000][]
+- [FEATURE] Add Logs event mapper to ObjC API. See [#2008][]
+- [IMPROVEMENT] Send retry information with network requests (eg. retry_count, last_failure_status and idempotency key). See [#1991][]
+- [IMPROVEMENT] Enable app launch time on mac, macCatalyst and visionOS. See [#1888][] (Thanks [@Hengyu][])
+- [FIX] Ignore network reachability on watchOS . See [#2005][] (Thanks [@jfiser-paylocity][])
+- [FEATURE] Add Start / Stop API to Session Replay (start/stopRecording). See [#1986][]
+
+# 2.16.0 / 20-08-2024
+
+- [IMPROVEMENT] Deprecate Alamofire extension pod. See [#1966][]
+- [FIX] Refresh rate vital for variable refresh rate displays when over performing. See [#1973][]
+- [FIX] Alamofire extension types are deprecated now. See [#1988][]
+
+# 2.14.2 / 26-07-2024
+
+- [FIX] Fix CPU spikes when Watchdog Terminations tracking is enabled. See #1968
+- [FIX] Fix CPU spike when recording UITabBar using SessionReplay. See #1967
+
+# 2.15.0 / 25-07-2024
+
+- [FEATURE] Enable DatadogCore, DatadogLogs and DatadogTrace to compile on watchOS platform. See [#1918][] (Thanks [@jfiser-paylocity][]) [#1946][]
+- [IMPROVEMENT] Ability to clear feature data storage using `clearAllData` API. See [#1940][]
+- [IMPROVEMENT] Send memory warning as RUM error. See [#1955][]
+- [IMPROVEMENT] Decorate network span kind as `client`. See [#1963][]
+- [FIX] Fix CPU spikes when Watchdog Terminations tracking is enabled. See [#1968][]
+- [FIX] Fix CPU spike when recording UITabBar using SessionReplay. See [#1967][]
+
+# 2.14.1 / 09-07-2024
+
+- [FIX] Objc attributes interop for KMP. See [#1947][]
+- [FIX] Inject backtrace reporter into Logs feature. See [#1948][]
+
+# 2.14.0 / 04-07-2024
+
+- [IMPROVEMENT] Use `#fileID` over `#filePath` as the default argument in errors. See [#1938][]
+- [FEATURE] Add support for Watchdog Terminations tracking in RUM. See [#1917][] [#1911][] [#1912][] [#1889][]
+- [IMPROVEMENT] Tabbar Icon Default Tint Color in Session Replay. See [#1906][]
+- [IMPROVEMENT] Improve Nav Bar Support in Session Replay. See [#1916][]
+- [IMPROVEMENT] Record Activity Indicator in Session Replay. See [#1934][]
+- [IMPROVEMENT] Allow disabling app hang monitoring in ObjC API. See [#1908][]
+- [IMPROVEMENT] Update RUM and Telemetry models with KMP source. See [#1925][]
+- [IMPROVEMENT] Use otel-swift fork that only has APIs. See [#1930][]
+
+# 2.11.1 / 01-07-2024
+
+- [FIX] Fix compilation issues on Xcode 16 beta. See [#1898][]
+
+# 2.13.0 / 13-06-2024
+
+- [IMPROVEMENT] Bump `IPHONEOS_DEPLOYMENT_TARGET` and `TVOS_DEPLOYMENT_TARGET` from 11 to 12. See [#1891][]
+- [IMPROVEMENT] Add `.connect`, `.trace`, `.options` values to `DDRUMMethod` type. See [#1886][]
+- [FIX] Fix compilation issues on Xcode 16 beta. See [#1898][]
+
+# 2.12.0 / 03-06-2024
+
+- [IMPROVEMENT] Crash errors now include up-to-date global RUM attributes. See [#1834][]
+- [FEATURE] `DatadogTrace` now supports OpenTelemetry. See [#1828][]
+- [FIX] Fix crash on accessing request.allHTTPHeaderFields. See [#1843][]
+- [FEATURE] Support for trace context injection configuration to allow selective injection. See [#1835][]
+- [FEATURE] `DatadogWebViewTracking` is now available for Obj-C. See [#1854][]
+- [FEATURE] RUM "stop session", "get session ID" and "evaluate feature flag" APIs are now available for Obj-C. See [#1853][]
+
+# 2.11.0 / 08-05-2024
+
+- [FEATURE] `DatadogTrace` now supports head-based sampling. See [#1794][]
+- [FEATURE] Support WebView recording in Session Replay. See [#1776][]
+- [IMPROVEMENT] Add `isInitialized` and `stopInstance` methods to ObjC API. See [#1800][]
+- [IMPROVEMENT] Add `addUserExtraInfo` method to ObjC API. See [#1799][]
+- [FIX] Add background upload capability to extensions. See [#1803][]
+- [IMPROVEMENT] Start sending data immediately after SDK is initialized. See [#1798][]
+- [IMPROVEMENT] Make the SDK compile on macOS 12+. See [#1711][]
+
+# 2.10.1 / 02-05-2024
+
+- [FIX] Use trace and span id as decimal. See [#1807][]
+
+# 2.10.0 / 23-04-2024
+
+- [IMPROVEMENT] Add image duplicate detection between sessions. See [#1747][]
+- [FEATURE] Add support for 128 bit trace IDs. See [#1721][]
+- [FEATURE] Fatal App Hangs are tracked in RUM. See [#1763][]
+- [FIX] Avoid name collision with Required Reason APIs. See [#1774][]
+
+# 2.9.0 / 11-04-2024
+
+- [FEATURE] Call RUM's `errorEventMapper` for crashes. See [#1742][]
+- [FEATURE] Support calling log event mapper for crashes. See [#1741][]
+- [FIX] Fix crash in `NetworkInstrumentationFeature`. See [#1767][]
+- [FIX] Remove modulemap. See [#1746][]
+- [FIX] Expose objc interfaces in Session Replay module. See [#1697][]
+
+# 2.8.1 / 20-03-2024
+
+- [FEATURE] App Hangs are tracked as RUM errors. See [#1685][]
+- [FIX] Propagate parent span in distributing tracing. See [#1627][]
+- [IMPROVEMENT] Add Device's Brand, Name, and Model in LogEvent. See [#1672][] (Thanks [@aldoKelvianto][])
+- [FEATURE] Improved image recording in Session Replay. See [#1592][]
+- [FEATURE] Allow custom error fingerprinting on logs with a special attribute. See [#1722][]
+- [FEATURE] Add global log attributes. See [#1707][]
+- [FEATURE] Privacy Manifest data usage description. See [#1724][]
+- [FIX] Pass through data when network request completes. See [#1696][]
+
+# 2.7.1 / 12-02-2024
+
+- [FIX] Privacy Report missing properties. See [#1656][]
+- [FIX] Privacy manifest collision in static framework. See [#1666][]
+
+# 2.7.0 / 25-01-2024
+
+- [FIX] RUM session not being linked to spans. See [#1615][]
+- [FIX] `URLSessionTask.resume()` swizzling in iOS 13 and 12. See [#1637][]
+- [FEATURE] Allow stopping a core instance. See [#1541][]
+- [FEATURE] Link crashes sent as Log events to RUM session. See [#1645][]
+- [IMPROVEMENT] Add extra HTTP codes to the list of retryable status codes. See [#1639][]
+- [FEATURE] Add privacy manifest to `DatadogCore`. See [#1644][]
+
+# 2.6.0 / 09-01-2024
+- [FEATURE] Add `currentSessionID(completion:)` accessor to access the current session ID.
+- [FEATURE] Add `BatchProcessingLevel` configuration allowing to process more batches within single read/upload cycle. See [#1531][]
+- [FIX] Use `currentRequest` instead `originalRequest` for URLSession request interception. See [#1609][]
+- [FIX] Remove weak `UIViewController` references. See [#1597][]
+
+# 2.5.1 / 20-12-2023
+
+- [BUGFIX] Fix `view.time_spent` in RUM view events. See [#1596][]
+
+- [FEATURE] Start RUM session on RUM init. See [#1594][]
+
+# 2.5.0 / 08-11-2023
+
+- [BUGFIX] Optimize Session Replay diffing algorithm. See [#1524][]
+- [FEATURE] Add network instrumentation for async/await URLSession APIs. See [#1394][]
+- [FEATURE] Change default tracing headers for first party hosts to use both Datadog headers and W3C `tracecontext` headers. See [#1529][]
+- [FEATURE] Add tracestate headers when using W3C tracecontext. See [#1536][]
+- [BUGFIX] Fix RUM ViewController leaks. See [#1533][]
+
+# 2.4.0 / 18-10-2023
+
+- [FEATURE] WebView Log events can be now sampled. See [#1515][]
+- [BUGFIX] WebView RUM events are now dropped if mobile RUM session is not sampled. See [#1502][]
+- [BUGFIX] Fix `os.name` in Log events. See [#1493][]
+
+# 2.3.0 / 02-10-2023
+
+- [IMPROVEMENT] Add UIBackgroundTask for uploading jobs. See [#1412][]
+- [IMPROVEMENT] Report Build Number in Logs and RUM. See [#1465][]
+- [BUGFIX] Fix wrong `view.name` reported in RUM crashes. See [#1488][]
+- [BUGFIX] Fix RUM sessions state propagation in Crash Reporting. See [#1498][]
+
+# 2.2.1 / 13-09-2023
+
+- [BUGFIX] Add default RUM views and actions predicates to DatadogObjc . See [#1464][].
+
+# 2.2.0 / 12-09-2023
+
+- [IMPROVEMENT] Enable cross-platform SDKs to change app `version`. See [#1447][]
+- [IMPROVEMENT] Enable cross-platform SDKs to edit more of telemetry configuration. See [#1456][]
+
+# 2.1.2 / 29-08-2023
+
+- [BUGFIX] Do not embed DatadogInternal while building Trace and RUM xcframeworks. See [#1444][].
+
+# 2.1.1 / 22-08-2023
+
+- [BUGFIX] `DatadogObjc` not fully available in `2.1.0`. See [#1428][].
+
+# 2.1.0 / 18-08-2023
+
+- [BUGFIX] Manual trace injection APIs are not available in DatadogTrace. See [#1415][].
+- [BUGFIX] Fix session replay uploads to AP1 site. See [#1418][].
+- [BUGFIX] Allow instantiating custom instance of the SDK after default one. See [#1413][].
+- [BUGFIX] Do not propagate attributes from Errors and LongTasks to Views.
+- [IMPROVEMENT] Upgrade to PLCrashReporter 1.11.1.
+- [FEATURE] Report session sample rate to the backend with RUM events. See [#1410][]
+- [IMPROVEMENT] Expose Session Replay to Objective-C. see [#1419][]
+
+# 2.0.0 / 31-07-2023
+
+Release `2.0` introduces breaking changes. Follow the [Migration Guide](MIGRATION.md) to upgrade from `1.x` versions.
+
+- [FEATURE] Session Replay.
+- [FEATURE] Support multiple SDK instances.
+- [IMPROVEMENT] All relevant products (RUM, Trace, Logs, etc.) are now extracted into different modules.
+- [BUGFIX] Module stability: fix name collision.
+
+# 1.22.0 / 21-07-2023
+- [BUGFIX] Fix APM local spans not correlating with RUM views. See [#1355][]
+- [IMPROVEMENT] Reduce number of view updates by filtering events from payload. See [#1328][]
+
+# 1.21.0 / 27-06-2023
+- [BUGFIX] Fix TracingUUID string format. See [#1311][] (Thanks [@changm4n][])
+- [BUGFIX] Rename _Datadog_Private to DatadogPrivate. See [#1331] (Thanks [@alexfanatics][])
+- [IMPROVEMENT] Add context to crash when there's an active view. See [#1315][]
+
+
+# 1.20.0 / 01-06-2023
+- [BUGFIX] Use targetTimestamp as reference to calculate FPS for variable refresh rate displays. See [#1272][]
+
+# 1.19.0 / 26-04-2023
+- [BUGFIX] Fix view attributes override by action attributes. See [#1250][]
+- [IMPROVEMENT] Add Tracer sampling rate. See [#1259][]
+- [BUGFIX] Fix RUM context not being attached to log when no user action exists. See [#1264][]
+
+# 1.18.0 / 19-04-2023
+- [IMPROVEMENT] Add start reason to the session. See [#1247][]
+- [IMPROVEMENT] Add ability to stop the session. See [#1219][]
+
+# 1.17.0 / 23-03-2023
+- [BUGFIX] Fix crash in `VitalInfoSampler`. See [#1216][] (Thanks [@cltnschlosser][])
+- [IMPROVEMENT] Fix Xcode analysis warning. See [#1220][]
+- [BUGFIX] Send crashes to both RUM and Logs. See [#1209][]
+
+# 1.16.0 / 02-03-2023
+- [IMPROVEMENT] Always create an ApplicationLaunch view on session initialization. See [#1160][]
+- [BUGFIX] Remove the data race caused by sampling on the RUM thread. See [#1177][] (Thanks [@cltnschlosser][])
+- [BUGFIX] Add ability to adjust configuration telemetry sampling rate. See [#1188][]
+
+# 1.15.0 / 23-01-2023
+
+- [BUGFIX] Fix 'Could not allocate memory' after corrupted TLV. See [#1089][] (Thanks [@cltnschlosser][])
+- [BUGFIX] Fix error count on the view update event following a crash. See [#1145][]
+
+# 1.14.0 / 20-12-2022
+
+- [IMPROVEMENT] Add a method for sending error attributes on logs as strings. See [#1051][].
+- [IMPROVEMENT] Add manual Open Telemetry b3 headers injection. See [#1057][]
+- [IMPROVEMENT] Add automatic Open Telemetry b3 headers injection. See [#1061][]
+- [IMPROVEMENT] Add manual and automatic W3C traceparent header injection. See [#1071][]
+
+# 1.13.0 / 08-11-2022
+
+- [IMPROVEMENT] Improve console logs when using `DDNoopRUMMonitor`. See [#1007][] (Thanks [@dfed][])
+- [IMPROVEMENT] Add public API to control tracking of frustrations signals. See [#1013][]
+- [IMPROVEMENT] Send trace sample rate (`dd.rulePsr`) for APM's traffic ingestion control page. See [#1029][]
+- [IMPROVEMENT] Add a method to add user info properties. See [#1031][]
+- [BUGFIX] Fix vitals default presets. See [#1043][]
+- [IMPROVEMENT] Add logging sampling. See [#1045][]
+
+
+# 1.12.1 / 18-10-2022
+
+- [IMPROVEMENT] Upgrade to PLCrashReporter 1.11.0 to fix Xcode 14 support.
+
+# 1.12.0 / 16-09-2022
+
+- [BUGFIX] Fix manual User Action dropped if a new view start. See [#997][]
+- [IMPROVEMENT] Enable cross-platform SDKs to change app `version`. See [#973][]
+- [IMPROVEMENT] Add internal APIs for cross-platform SDKs. See [#964][]
+- [IMPROVEMENT] Add mobile vitals frequency configuration. See [#876][]
+- [IMPROVEMENT] Include the exact model information in RUM `device.model`. See [#888][]
+- [FEATURE] Allow filtering outgoing logs with a status threshold. See [#867][]
+- [BUGFIX] Fix compilation issue in SwiftUI Previews. See [#949][]
+- [IMPROVEMENT] Expose server date provider for custom clock synchronization. See [#950][]
+
+# 1.11.1 / 20-06-2022
+
+### Changes
+
+- [BUGFIX] Fix Mac Catalyst builds compatibility. See [#894][]
+
+# 1.11.0 / 13-06-2022
+
+### Changes
+
+- [BUGFIX] Fix rare problem with bringing up the "Local Network Permission" alert. See [#830][]
+- [BUGFIX] Fix RUM event `source`. See [#832][]
+- [BUGFIX] Stop reporting pre-warmed application launch time. See [#789][]
+- [BUGFIX] Allow log event dropping. See [#795][]
+- [FEATURE] Integration with CI Visibility Tests. See[#761][]
+- [FEATURE] Add tvOS Support. See [#793][]
+- [FEATURE] Add data encryption interface on-disk data storage. See [#797][]
+- [IMPROVEMENT] Allow manually tracked resources in RUM Sessions to detect first party hosts. See [#837][]
+- [IMPROVEMENT] Add tracing sampling rate. See [#851][]
+- [IMPROVEMENT] Crash Reporting: Filter out unrecognized trailing `???` stack frame in `error.stack`. See [#794][]
+- [IMPROVEMENT] Reduce the number of intermediate view events sent in RUM payloads. See [#815][]
+- [IMPROVEMENT] Allow manually tracked resources in RUM Sessions to detect first party hosts. See [#837][]
+- [IMPROVEMENT] Add tracing sampling rate. See [#851][]
+- [BUGFIX] Fix rare problem with bringing up the "Local Network Permission" alert. See [#830][]
+- [BUGFIX] Fix RUM event `source`. See [#832][]
+- [FEATURE] Integration with CI Visibility Tests. See[#761][]
+- [FEATURE] Add tvOS Support. See [#793][]
+- [FEATURE] Add data encryption interface on-disk data storage. See [#797][]
+- [BUGFIX] Stop reporting pre-warmed application launch time. See [#789][]
+- [BUGFIX] Allow log event dropping. See [#795][]
+- [IMPROVEMENT] Crash Reporting: Filter out unrecognized trailing `???` stack frame in `error.stack`. See [#794][]
+- [IMPROVEMENT] Reduce the number of intermediate view events sent in RUM payloads. See [#815][]
+
+# 1.10.0 / 04-12-2022
+
+### Changes
+
+- [FEATURE] Web-view tracking. See [#729][]
+- [BUGFIX] Strip query parameters from span resource. See [#728][]
+
+# 1.9.0 / 01-26-2022
+
+### Changes
+
+- [BUGFIX] Report binary image with no UUID. See [#724][]
+- [FEATURE] Add Application Launch events tracking. See [#699][]
+- [FEATURE] Set `PLCrashReporter` custom path. See [#692][]
+- [FEATURE] `SwiftUI` Instrumentation. See [#676][]
+- [IMPROVEMENT] Embed Kronos. See [#708][]
+- [IMPROVEMENT] Add `@service` attribute to all RUM events. See [#725][]
+- [IMPROVEMENT] Adds support for flutter error source. See [#715][]
+- [IMPROVEMENT] Add crash reporting console logs. See [#712][]
+- [IMPROVEMENT] Keep view active until all resources are consumed. See [#702][]
+- [IMPROVEMENT] Allow passing in a type for errors sent with a message. See [#680][] (Thanks [@AvdLee][])
+- [IMPROVEMENT] Add config overrides for debug launch arguments. See [#679][]
+
+# 1.8.0 / 11-23-2021
+
+### Changes
+
+- [BUGFIX] Fix rare crash in `CarrierInfoProvider`. See [#627][] [#623][], [#619][] (Thanks [@safa-ads][], [@matcartmill][])
+- [BUGFIX] Crash Reporting: Fix issue with some truncated stack traces not being displayed. See [#641][]
+- [BUGFIX] Fix reading SDK attributes in Objective-C. See [#654][]
+- [FEATURE] RUM: Track slow UI renders with RUM Long Tasks. See [#567][]
+- [FEATURE] RUM: Add API to notify RUM session start: `.onRUMSessionStart(_: (String, Bool) -> Void)`. See [#590][]
+- [FEATURE] Logs: Add logs scrubbing API: `.setLogEventMapper(_: (LogEvent) -> LogEvent)`. See [#640][]
+- [FEATURE] Add `Datadog.isInitialized` API. See [#566][]
+- [FEATURE] Add API for clearing out all SDK data: `Datadog.clearAllData()`. See [#644][]
+- [FEATURE] Add support for `us5` site. See [#576][]
+- [FEATURE] Support `URLSession` proxy configuration with `.connectionProxyDictionary`. See [#582][]
+- [IMPROVEMENT] Compress HTTP body in SDK uploads. See [#626][]
+- [IMPROVEMENT] Change type of `.xhr` RUM Resources to `.native`. See [#605][]
+- [IMPROVEMENT] Link logs and traces to RUM Actions. See [#615][]
+- [IMPROVEMENT] Crash Reporting: Fix symbolication issue for iOS Simulator crashes. See [#563][]
+- [IMPROVEMENT] Fix various typos in docs. See [#569][] (Thanks [@michalsrutek][])
+- [IMPROVEMENT] Use Intake API V2 for SDK data uploads. See [#562][]
+
+# 1.7.2 / 11-8-2021
+
+### Changes
+
+- [BUGFIX] Fix iOS 15 crash related to `ProcessInfo.isLowPowerModeEnabled`. See [#609][] [#655][] (Thanks [@pingd][])
+
+# 1.7.1 / 10-4-2021
+
+### Changes
+
+- [BUGFIX] Fix iOS 15 crash in `MobileDevice.swift`. See [#609][] [#613][] (Thanks [@arnauddorgans][], [@earltedly][])
+- [BUGFIX] RUM: Fix bug with "Refresh Rate" Mobile Vital reporting very low values. [#608][]
+
+# 1.7.0 / 09-27-2021
+
+### Changes
+
+- [BUGFIX] RUM: Fix `DDRUMView` API visibility for Objective-C. See [#583][]
+- [FEATURE] Crash Reporting: Add `DatadogCrashReporting`
+- [FEATURE] RUM: Add Mobile Vitals. See [#493][] [#514][] [#522][] [#495][]
+- [FEATURE] RUM: Add option for renaming instrumented actions. See [#539][]
+- [FEATURE] RUM: Add option for tracking events when app is in background. See [#504][] [#537][]
+- [FEATURE] Add support for `us3` site. See [#523][]
+- [IMPROVEMENT] RUM: Improve RUM <> APM integration. See [#524][] [#575][] [#531][] (Thanks [@jracollins][], [@marcusway][])
+- [IMPROVEMENT] RUM: Improve naming for views started with `key:`. See [#534][]
+- [IMPROVEMENT] RUM: Improve actions instrumentation. See [#509][] [#545][] [#547][]
+- [IMPROVEMENT] RUM: Sanitize custom timings for views. See [#525][]
+- [IMPROVEMENT] Do not retry uploading events if Client Token is invalid. See [#535][]
+
+# 1.6.0 / 06-09-2021
+
+### Changes
+
+- [BUGFIX] Trace: Fix `[configuration trackUIKitRUMViews]` not working properly in Obj-c. See [#419][]
+- [BUGFIX] Trace: Make `tracePropagationHTTPHeaders` available in Obj-c. See [#421][] (Thanks [@ben-yolabs][])
+- [BUGFIX] RUM: Fix RUM Views auto-instrumentation issue on iOS 11. See [#474][]
+- [FEATURE] RUM: Support adding custom attributes for auto-instrumented RUM Resources. See [#473][]
+- [FEATURE] Trace: Add scrubbing APIs for redacting auto-instrumented spans. See [#481][]
+- [IMPROVEMENT] RUM: Add "VIEW NAME" attribute to RUM Views. See [#318][]
+- [IMPROVEMENT] RUM: Views cannot be now dropped using view event mapper. See [#415][]
+- [IMPROVEMENT] RUM: Improve presentation of errors sent with `Logger`. See [#423][]
+- [IMPROVEMENT] Trace: Improve presentation of errors sent with `span.log()`. See [#431][]
+- [IMPROVEMENT] Add support for extra user attributes in Obj-c. See [#444][]
+- [IMPROVEMENT] Trace: Add `foreground_duration` and `is_background` information to network spans. See [#436][]
+- [IMPROVEMENT] RUM: Views will now automatically stop when the app leaves foreground. See [#479][]
+- [IMPROVEMENT] `DDURLSessionDelegate` can now be initialized before starting SDK. See [#483][]
+
+# 1.5.2 / 04-13-2021
+
+### Changes
+
+- [BUGFIX] Add missing RUM Resource APIs to RUM for Objc. See [#447][] (Thanks [@sdejesusF][])
+- [BUGFIX] Fix eventual `swiftlint` error during `carthage` builds. See [#450][]
+- [IMPROVEMENT] Improve cocoapods installation by not requiring `!use_frameworks`. See [#451][]
+
+# 1.5.1 / 03-11-2021
+
+### Changes
+
+- [BUGFIX] Carthage XCFrameworks support. See [#439][]
+
+# 1.5.0 / 03-04-2021
+
+### Changes
+
+- [BUGFIX] Fix baggage items propagation issue for `Span`. See [#365][] (Thanks [@philtre][])
+- [FEATURE] Add set of scrubbing APIs for redacting and dropping particular RUM Events. See [#367][]
+- [FEATURE] Add support for GDPR compliance with new `Datadog.set(trackingConsent:)` API. See [#335][]
+- [FEATURE] Add `Global.rum.addTiming(name:)` API for marking custom tming events in RUM Views. See [#323][]
+- [FEATURE] Add support for Alamofire networking with `DatadogAlamofireExtension`. See [#340][]
+- [FEATURE] Add configuration of data upload frequency and paylaod size with `.set(batchSize:)` and `.set(uploadFrequency:)` APIs. See [#358][]
+- [FEATURE] Add convenient `.setError(_:)` API for setting `Error` on `Span`. See [#390][]
+- [IMPROVEMENT] Improve `DATE` accurracy (with NTP time sync) for all data send from the SDK. See [#327][]
+- [IMPROVEMENT] Improve App Launch Time metric accurracy. See [#381][]
+
+# 1.4.1 / 01-18-2021
+
+### Changes
+
+- [BUGFIX] Fix app extension compilation issue for `UIApplication.shared` symbol. See [#370][] (Thanks [@SimpleApp][])
+
+# 1.4.0 / 12-14-2020
+
+### Changes
+
+- [BUGFIX] Fix crash when `serviceName` contains space characters. See [#317][] (Thanks [@philtre][])
+- [BUGFIX] Fix issue with data uploads when battery status is `.unknown`. See [#320][]
+- [BUGFIX] Fix compilation issue for Mac Catalyst. See [#277][] (Thanks [@Hengyu][])
+- [FEATURE] RUM: Add RUM monitoring feature (manual and auto instrumentation)
+- [FEATURE] Add single `.set(endpoint:)` API to configure all Datadog endpoints. See [#322][]
+- [FEATURE] Add support for GovCloud endpoints. See [#235][]
+- [FEATURE] Add support for extra user attributes. See [#315][]
+- [FEATURE] Logs: Add `error: Error` attribute to logging APIs. See [#303][] (Thanks [@sdejesusF][])
+- [FEATURE] Trace: Add `span.setActive()` API for indirect referencing Spans. See [#187][]
+- [FEATURE] Trace: Add `Global.sharedTracer.startRootSpan(...)` API. See [#236][]
+- [IMPROVEMENT] Trace: Add auto instrumentation for `URLSessionTasks` created with no completion handler. See [#262][]
+- [IMPROVEMENT] Extend allowed characters set for the `environment` value. See [#246][] (Thanks [@sdejesusF][])
+- [IMPROVEMENT] Improve data upload performance. See [#249][]
+
+# 1.3.1 / 08-14-2020
+
+### Changes
+
+- [BUGFIX] Fix SPM compilation issue for DatadogObjC. See [#220][] (Thanks [@TsvetelinVladimirov][])
+- [BUGFIX] Fix compilation issue in Xcode 11.3.1. See [#217][] (Thanks [@provTheodoreNewell][])
+
+# 1.3.0 / 08-03-2020
+
+### Changes
+
+- [FEATURE] Trace: Add tracing feature following the Open Tracing spec
+
+# 1.2.4 / 07-17-2020
+
+### Changes
+
+- [BUGFIX] Logs: Fix out-of-memory crash on intensive logging. See [#185][] (Thanks [@hyling][])
+
+# 1.2.3 / 07-15-2020
+
+### Changes
+
+- [BUGFIX] Logs: Fix memory leaks in logs upload. See [#180][] (Thanks [@hyling][])
+- [BUGFIX] Fix App Store Connect validation issue for `DatadogObjC`. See [#182][] (Thanks [@hyling][])
+
+# 1.2.2 / 06-12-2020
+
+### Changes
+
+- [BUGFIX] Logs: Fix occasional logs malformation. See [#133][]
+
+# 1.2.1 / 06-09-2020
+
+### Changes
+
+- [BUGFIX] Fix `ISO8601DateFormatter` crash on iOS 11.0 and 11.1. See [#129][] (Thanks [@lgaches][], [@Britton-Earnin][])
+
+# 1.2.0 / 05-22-2020
+
+### Changes
+
+- [BUGFIX] Logs: Fixed family of `NWPathMonitor` crashes. See [#110][] (Thanks [@LeffelMania][], [@00FA9A][], [@jegnux][])
+- [FEATURE] Logs: Change default `serviceName` to app bundle identifier. See [#102][]
+- [IMPROVEMENT] Logs: Add milliseconds precision. See [#96][] (Thanks [@flobories][])
+- [IMPROVEMENT] Logs: Deliver logs faster in app extensions. See [#84][] (Thanks [@lmramirez][])
+- [OTHER] Logs: Change default `source` to `"ios"`. See [#111][]
+- [OTHER] Link SDK as dynamic framework in SPM. See [#82][]
+
+# 1.1.0 / 04-21-2020
+
+### Changes
+
+- [BUGFIX] Fix "Missing required module 'Datadog_Private'" Carthage error. See [#80][]
+- [IMPROVEMENT] Logs: Sync logs time with server. See [#65][]
+
+# 1.0.2 / 04-08-2020
+
+### Changes
+
+- [BUGFIX] Fix "'module.modulemap' should be inside the 'include' directory" Carthage error. See [#73][] (Thanks [@joeydong][])
+
+# 1.0.1 / 04-07-2020
+
+### Changes
+
+- [BUGFIX] Fix "out of memory" crash. See [#64][] (Thanks [@lmramirez][])
+
+# 1.0.0 / 03-31-2020
+
+### Changes
+
+- [FEATURE] Logs: Add logging feature
+
+
+
+[#64]: https://github.com/DataDog/dd-sdk-ios/issues/64
+[#65]: https://github.com/DataDog/dd-sdk-ios/issues/65
+[#73]: https://github.com/DataDog/dd-sdk-ios/issues/73
+[#80]: https://github.com/DataDog/dd-sdk-ios/issues/80
+[#82]: https://github.com/DataDog/dd-sdk-ios/issues/82
+[#84]: https://github.com/DataDog/dd-sdk-ios/issues/84
+[#96]: https://github.com/DataDog/dd-sdk-ios/issues/96
+[#102]: https://github.com/DataDog/dd-sdk-ios/issues/102
+[#110]: https://github.com/DataDog/dd-sdk-ios/issues/110
+[#111]: https://github.com/DataDog/dd-sdk-ios/issues/111
+[#129]: https://github.com/DataDog/dd-sdk-ios/issues/129
+[#133]: https://github.com/DataDog/dd-sdk-ios/issues/133
+[#180]: https://github.com/DataDog/dd-sdk-ios/issues/180
+[#182]: https://github.com/DataDog/dd-sdk-ios/issues/182
+[#185]: https://github.com/DataDog/dd-sdk-ios/issues/185
+[#187]: https://github.com/DataDog/dd-sdk-ios/issues/187
+[#217]: https://github.com/DataDog/dd-sdk-ios/issues/217
+[#220]: https://github.com/DataDog/dd-sdk-ios/issues/220
+[#235]: https://github.com/DataDog/dd-sdk-ios/issues/235
+[#236]: https://github.com/DataDog/dd-sdk-ios/issues/236
+[#246]: https://github.com/DataDog/dd-sdk-ios/issues/246
+[#249]: https://github.com/DataDog/dd-sdk-ios/issues/249
+[#262]: https://github.com/DataDog/dd-sdk-ios/issues/262
+[#277]: https://github.com/DataDog/dd-sdk-ios/issues/277
+[#303]: https://github.com/DataDog/dd-sdk-ios/issues/303
+[#315]: https://github.com/DataDog/dd-sdk-ios/issues/315
+[#317]: https://github.com/DataDog/dd-sdk-ios/issues/317
+[#318]: https://github.com/DataDog/dd-sdk-ios/issues/318
+[#320]: https://github.com/DataDog/dd-sdk-ios/issues/320
+[#322]: https://github.com/DataDog/dd-sdk-ios/issues/322
+[#323]: https://github.com/DataDog/dd-sdk-ios/issues/323
+[#327]: https://github.com/DataDog/dd-sdk-ios/issues/327
+[#335]: https://github.com/DataDog/dd-sdk-ios/issues/335
+[#340]: https://github.com/DataDog/dd-sdk-ios/issues/340
+[#358]: https://github.com/DataDog/dd-sdk-ios/issues/358
+[#365]: https://github.com/DataDog/dd-sdk-ios/issues/365
+[#367]: https://github.com/DataDog/dd-sdk-ios/issues/367
+[#370]: https://github.com/DataDog/dd-sdk-ios/issues/370
+[#381]: https://github.com/DataDog/dd-sdk-ios/issues/381
+[#390]: https://github.com/DataDog/dd-sdk-ios/issues/390
+[#415]: https://github.com/DataDog/dd-sdk-ios/issues/415
+[#419]: https://github.com/DataDog/dd-sdk-ios/issues/419
+[#421]: https://github.com/DataDog/dd-sdk-ios/issues/421
+[#423]: https://github.com/DataDog/dd-sdk-ios/issues/423
+[#431]: https://github.com/DataDog/dd-sdk-ios/issues/431
+[#436]: https://github.com/DataDog/dd-sdk-ios/issues/436
+[#439]: https://github.com/DataDog/dd-sdk-ios/issues/439
+[#444]: https://github.com/DataDog/dd-sdk-ios/issues/444
+[#447]: https://github.com/DataDog/dd-sdk-ios/issues/447
+[#450]: https://github.com/DataDog/dd-sdk-ios/issues/450
+[#451]: https://github.com/DataDog/dd-sdk-ios/issues/451
+[#473]: https://github.com/DataDog/dd-sdk-ios/issues/473
+[#474]: https://github.com/DataDog/dd-sdk-ios/issues/474
+[#479]: https://github.com/DataDog/dd-sdk-ios/issues/479
+[#481]: https://github.com/DataDog/dd-sdk-ios/issues/481
+[#483]: https://github.com/DataDog/dd-sdk-ios/issues/483
+[#493]: https://github.com/DataDog/dd-sdk-ios/issues/493
+[#495]: https://github.com/DataDog/dd-sdk-ios/issues/495
+[#504]: https://github.com/DataDog/dd-sdk-ios/issues/504
+[#509]: https://github.com/DataDog/dd-sdk-ios/issues/509
+[#514]: https://github.com/DataDog/dd-sdk-ios/issues/514
+[#522]: https://github.com/DataDog/dd-sdk-ios/issues/522
+[#523]: https://github.com/DataDog/dd-sdk-ios/issues/523
+[#524]: https://github.com/DataDog/dd-sdk-ios/issues/524
+[#525]: https://github.com/DataDog/dd-sdk-ios/issues/525
+[#531]: https://github.com/DataDog/dd-sdk-ios/issues/531
+[#534]: https://github.com/DataDog/dd-sdk-ios/issues/534
+[#535]: https://github.com/DataDog/dd-sdk-ios/issues/535
+[#537]: https://github.com/DataDog/dd-sdk-ios/issues/537
+[#539]: https://github.com/DataDog/dd-sdk-ios/issues/539
+[#545]: https://github.com/DataDog/dd-sdk-ios/issues/545
+[#547]: https://github.com/DataDog/dd-sdk-ios/issues/547
+[#562]: https://github.com/DataDog/dd-sdk-ios/issues/562
+[#563]: https://github.com/DataDog/dd-sdk-ios/issues/563
+[#566]: https://github.com/DataDog/dd-sdk-ios/issues/566
+[#567]: https://github.com/DataDog/dd-sdk-ios/issues/567
+[#569]: https://github.com/DataDog/dd-sdk-ios/issues/569
+[#575]: https://github.com/DataDog/dd-sdk-ios/issues/575
+[#576]: https://github.com/DataDog/dd-sdk-ios/issues/576
+[#582]: https://github.com/DataDog/dd-sdk-ios/issues/582
+[#583]: https://github.com/DataDog/dd-sdk-ios/issues/583
+[#590]: https://github.com/DataDog/dd-sdk-ios/issues/590
+[#605]: https://github.com/DataDog/dd-sdk-ios/issues/605
+[#608]: https://github.com/DataDog/dd-sdk-ios/issues/608
+[#609]: https://github.com/DataDog/dd-sdk-ios/issues/609
+[#613]: https://github.com/DataDog/dd-sdk-ios/issues/613
+[#615]: https://github.com/DataDog/dd-sdk-ios/issues/615
+[#619]: https://github.com/DataDog/dd-sdk-ios/issues/619
+[#623]: https://github.com/DataDog/dd-sdk-ios/issues/623
+[#626]: https://github.com/DataDog/dd-sdk-ios/issues/626
+[#627]: https://github.com/DataDog/dd-sdk-ios/issues/627
+[#640]: https://github.com/DataDog/dd-sdk-ios/issues/640
+[#641]: https://github.com/DataDog/dd-sdk-ios/issues/641
+[#644]: https://github.com/DataDog/dd-sdk-ios/issues/644
+[#654]: https://github.com/DataDog/dd-sdk-ios/issues/654
+[#655]: https://github.com/DataDog/dd-sdk-ios/issues/655
+[#676]: https://github.com/DataDog/dd-sdk-ios/issues/676
+[#679]: https://github.com/DataDog/dd-sdk-ios/issues/679
+[#680]: https://github.com/DataDog/dd-sdk-ios/issues/680
+[#692]: https://github.com/DataDog/dd-sdk-ios/issues/692
+[#699]: https://github.com/DataDog/dd-sdk-ios/issues/699
+[#702]: https://github.com/DataDog/dd-sdk-ios/issues/702
+[#708]: https://github.com/DataDog/dd-sdk-ios/issues/708
+[#712]: https://github.com/DataDog/dd-sdk-ios/issues/712
+[#715]: https://github.com/DataDog/dd-sdk-ios/issues/715
+[#724]: https://github.com/DataDog/dd-sdk-ios/issues/724
+[#725]: https://github.com/DataDog/dd-sdk-ios/issues/725
+[#728]: https://github.com/DataDog/dd-sdk-ios/issues/728
+[#729]: https://github.com/DataDog/dd-sdk-ios/issues/729
+[#761]: https://github.com/DataDog/dd-sdk-ios/issues/761
+[#789]: https://github.com/DataDog/dd-sdk-ios/issues/789
+[#793]: https://github.com/DataDog/dd-sdk-ios/issues/793
+[#794]: https://github.com/DataDog/dd-sdk-ios/issues/794
+[#795]: https://github.com/DataDog/dd-sdk-ios/issues/795
+[#797]: https://github.com/DataDog/dd-sdk-ios/issues/797
+[#815]: https://github.com/DataDog/dd-sdk-ios/issues/815
+[#830]: https://github.com/DataDog/dd-sdk-ios/issues/830
+[#832]: https://github.com/DataDog/dd-sdk-ios/issues/832
+[#837]: https://github.com/DataDog/dd-sdk-ios/issues/837
+[#851]: https://github.com/DataDog/dd-sdk-ios/issues/851
+[#867]: https://github.com/DataDog/dd-sdk-ios/issues/867
+[#876]: https://github.com/DataDog/dd-sdk-ios/issues/876
+[#888]: https://github.com/DataDog/dd-sdk-ios/issues/888
+[#894]: https://github.com/DataDog/dd-sdk-ios/issues/894
+[#949]: https://github.com/DataDog/dd-sdk-ios/issues/949
+[#950]: https://github.com/DataDog/dd-sdk-ios/issues/950
+[#964]: https://github.com/DataDog/dd-sdk-ios/issues/964
+[#973]: https://github.com/DataDog/dd-sdk-ios/issues/973
+[#997]: https://github.com/DataDog/dd-sdk-ios/issues/997
+[#1007]: https://github.com/DataDog/dd-sdk-ios/issues/1007
+[#1013]: https://github.com/DataDog/dd-sdk-ios/issues/1013
+[#1029]: https://github.com/DataDog/dd-sdk-ios/issues/1029
+[#1031]: https://github.com/DataDog/dd-sdk-ios/issues/1031
+[#1043]: https://github.com/DataDog/dd-sdk-ios/issues/1043
+[#1045]: https://github.com/DataDog/dd-sdk-ios/pull/1045
+[#1051]: https://github.com/DataDog/dd-sdk-ios/pull/1051
+[#1057]: https://github.com/DataDog/dd-sdk-ios/pull/1057
+[#1061]: https://github.com/DataDog/dd-sdk-ios/pull/1061
+[#1071]: https://github.com/DataDog/dd-sdk-ios/pull/1071
+[#1089]: https://github.com/DataDog/dd-sdk-ios/pull/1089
+[#1145]: https://github.com/DataDog/dd-sdk-ios/pull/1145
+[#1160]: https://github.com/DataDog/dd-sdk-ios/pull/1160
+[#1177]: https://github.com/DataDog/dd-sdk-ios/pull/1177
+[#1188]: https://github.com/DataDog/dd-sdk-ios/pull/1188
+[#1209]: https://github.com/DataDog/dd-sdk-ios/pull/1209
+[#1216]: https://github.com/DataDog/dd-sdk-ios/pull/1216
+[#1219]: https://github.com/DataDog/dd-sdk-ios/pull/1219
+[#1220]: https://github.com/DataDog/dd-sdk-ios/pull/1220
+[#1247]: https://github.com/DataDog/dd-sdk-ios/pull/1247
+[#1250]: https://github.com/DataDog/dd-sdk-ios/pull/1250
+[#1259]: https://github.com/DataDog/dd-sdk-ios/pull/1259
+[#1264]: https://github.com/DataDog/dd-sdk-ios/pull/1264
+[#1272]: https://github.com/DataDog/dd-sdk-ios/pull/1272
+[#1311]: https://github.com/DataDog/dd-sdk-ios/pull/1311
+[#1315]: https://github.com/DataDog/dd-sdk-ios/pull/1315
+[#1331]: https://github.com/DataDog/dd-sdk-ios/pull/1331
+[#1328]: https://github.com/DataDog/dd-sdk-ios/pull/1328
+[#1355]: https://github.com/DataDog/dd-sdk-ios/pull/1355
+[#1410]: https://github.com/DataDog/dd-sdk-ios/pull/1410
+[#1412]: https://github.com/DataDog/dd-sdk-ios/pull/1412
+[#1413]: https://github.com/DataDog/dd-sdk-ios/pull/1413
+[#1415]: https://github.com/DataDog/dd-sdk-ios/pull/1415
+[#1418]: https://github.com/DataDog/dd-sdk-ios/pull/1418
+[#1419]: https://github.com/DataDog/dd-sdk-ios/pull/1419
+[#1428]: https://github.com/DataDog/dd-sdk-ios/pull/1428
+[#1444]: https://github.com/DataDog/dd-sdk-ios/pull/1444
+[#1464]: https://github.com/DataDog/dd-sdk-ios/pull/1464
+[#1412]: https://github.com/DataDog/dd-sdk-ios/pull/1412
+[#1488]: https://github.com/DataDog/dd-sdk-ios/pull/1488
+[#1502]: https://github.com/DataDog/dd-sdk-ios/pull/1502
+[#1515]: https://github.com/DataDog/dd-sdk-ios/pull/1515
+[#1465]: https://github.com/DataDog/dd-sdk-ios/pull/1465
+[#1498]: https://github.com/DataDog/dd-sdk-ios/pull/1498
+[#1493]: https://github.com/DataDog/dd-sdk-ios/pull/1493
+[#1394]: https://github.com/DataDog/dd-sdk-ios/pull/1394
+[#1524]: https://github.com/DataDog/dd-sdk-ios/pull/1524
+[#1529]: https://github.com/DataDog/dd-sdk-ios/pull/1529
+[#1533]: https://github.com/DataDog/dd-sdk-ios/pull/1533
+[#1645]: https://github.com/DataDog/dd-sdk-ios/pull/1645
+[#1594]: https://github.com/DataDog/dd-sdk-ios/pull/1594
+[#1536]: https://github.com/DataDog/dd-sdk-ios/pull/1536
+[#1609]: https://github.com/DataDog/dd-sdk-ios/pull/1609
+[#1639]: https://github.com/DataDog/dd-sdk-ios/pull/1639
+[#1615]: https://github.com/DataDog/dd-sdk-ios/pull/1615
+[#1531]: https://github.com/DataDog/dd-sdk-ios/pull/1531
+[#1637]: https://github.com/DataDog/dd-sdk-ios/pull/1637
+[#1541]: https://github.com/DataDog/dd-sdk-ios/pull/1541
+[#1592]: https://github.com/DataDog/dd-sdk-ios/pull/1592
+[#1672]: https://github.com/DataDog/dd-sdk-ios/pull/1672
+[#1596]: https://github.com/DataDog/dd-sdk-ios/pull/1596
+[#1597]: https://github.com/DataDog/dd-sdk-ios/pull/1597
+[#1627]: https://github.com/DataDog/dd-sdk-ios/pull/1627
+[#1644]: https://github.com/DataDog/dd-sdk-ios/pull/1644
+[#1685]: https://github.com/DataDog/dd-sdk-ios/pull/1685
+[#1656]: https://github.com/DataDog/dd-sdk-ios/pull/1656
+[#1666]: https://github.com/DataDog/dd-sdk-ios/pull/1666
+[#1696]: https://github.com/DataDog/dd-sdk-ios/pull/1696
+[#1697]: https://github.com/DataDog/dd-sdk-ios/pull/1697
+[#1707]: https://github.com/DataDog/dd-sdk-ios/pull/1707
+[#1711]: https://github.com/DataDog/dd-sdk-ios/pull/1711
+[#1721]: https://github.com/DataDog/dd-sdk-ios/pull/1721
+[#1722]: https://github.com/DataDog/dd-sdk-ios/pull/1722
+[#1724]: https://github.com/DataDog/dd-sdk-ios/pull/1724
+[#1741]: https://github.com/DataDog/dd-sdk-ios/pull/1741
+[#1742]: https://github.com/DataDog/dd-sdk-ios/pull/1742
+[#1746]: https://github.com/DataDog/dd-sdk-ios/pull/1746
+[#1747]: https://github.com/DataDog/dd-sdk-ios/pull/1747
+[#1794]: https://github.com/DataDog/dd-sdk-ios/pull/1794
+[#1774]: https://github.com/DataDog/dd-sdk-ios/pull/1774
+[#1763]: https://github.com/DataDog/dd-sdk-ios/pull/1763
+[#1767]: https://github.com/DataDog/dd-sdk-ios/pull/1767
+[#1843]: https://github.com/DataDog/dd-sdk-ios/pull/1843
+[#1798]: https://github.com/DataDog/dd-sdk-ios/pull/1798
+[#1891]: https://github.com/DataDog/dd-sdk-ios/pull/1891
+[#1776]: https://github.com/DataDog/dd-sdk-ios/pull/1776
+[#1834]: https://github.com/DataDog/dd-sdk-ios/pull/1834
+[#1721]: https://github.com/DataDog/dd-sdk-ios/pull/1721
+[#1803]: https://github.com/DataDog/dd-sdk-ios/pull/1803
+[#1853]: https://github.com/DataDog/dd-sdk-ios/pull/1853
+[#1807]: https://github.com/DataDog/dd-sdk-ios/pull/1807
+[#1854]: https://github.com/DataDog/dd-sdk-ios/pull/1854
+[#1828]: https://github.com/DataDog/dd-sdk-ios/pull/1828
+[#1835]: https://github.com/DataDog/dd-sdk-ios/pull/1835
+[#1886]: https://github.com/DataDog/dd-sdk-ios/pull/1886
+[#1889]: https://github.com/DataDog/dd-sdk-ios/pull/1889
+[#1898]: https://github.com/DataDog/dd-sdk-ios/pull/1898
+[#1906]: https://github.com/DataDog/dd-sdk-ios/pull/1906
+[#1908]: https://github.com/DataDog/dd-sdk-ios/pull/1908
+[#1911]: https://github.com/DataDog/dd-sdk-ios/pull/1911
+[#1912]: https://github.com/DataDog/dd-sdk-ios/pull/1912
+[#1916]: https://github.com/DataDog/dd-sdk-ios/pull/1916
+[#1917]: https://github.com/DataDog/dd-sdk-ios/pull/1917
+[#1925]: https://github.com/DataDog/dd-sdk-ios/pull/1925
+[#1930]: https://github.com/DataDog/dd-sdk-ios/pull/1930
+[#1918]: https://github.com/DataDog/dd-sdk-ios/pull/1918
+[#1946]: https://github.com/DataDog/dd-sdk-ios/pull/1946
+[#1934]: https://github.com/DataDog/dd-sdk-ios/pull/1934
+[#1938]: https://github.com/DataDog/dd-sdk-ios/pull/1938
+[#1947]: https://github.com/DataDog/dd-sdk-ios/pull/1947
+[#1948]: https://github.com/DataDog/dd-sdk-ios/pull/1948
+[#1940]: https://github.com/DataDog/dd-sdk-ios/pull/1940
+[#1955]: https://github.com/DataDog/dd-sdk-ios/pull/1955
+[#1963]: https://github.com/DataDog/dd-sdk-ios/pull/1963
+[#1968]: https://github.com/DataDog/dd-sdk-ios/pull/1968
+[#1967]: https://github.com/DataDog/dd-sdk-ios/pull/1967
+[#1973]: https://github.com/DataDog/dd-sdk-ios/pull/1973
+[#1988]: https://github.com/DataDog/dd-sdk-ios/pull/1988
+[#2000]: https://github.com/DataDog/dd-sdk-ios/pull/2000
+[#1991]: https://github.com/DataDog/dd-sdk-ios/pull/1991
+[#1986]: https://github.com/DataDog/dd-sdk-ios/pull/1986
+[#1888]: https://github.com/DataDog/dd-sdk-ios/pull/1888
+[#2008]: https://github.com/DataDog/dd-sdk-ios/pull/2008
+[#2005]: https://github.com/DataDog/dd-sdk-ios/pull/2005
+[#1998]: https://github.com/DataDog/dd-sdk-ios/pull/1998
+[#1966]: https://github.com/DataDog/dd-sdk-ios/pull/1966
+[#2026]: https://github.com/DataDog/dd-sdk-ios/pull/2026
+[#2043]: https://github.com/DataDog/dd-sdk-ios/pull/2043
+[#2040]: https://github.com/DataDog/dd-sdk-ios/pull/2040
+[#2050]: https://github.com/DataDog/dd-sdk-ios/pull/2050
+[#2073]: https://github.com/DataDog/dd-sdk-ios/pull/2073
+[#2088]: https://github.com/DataDog/dd-sdk-ios/pull/2088
+[#2083]: https://github.com/DataDog/dd-sdk-ios/pull/2083
+[#2104]: https://github.com/DataDog/dd-sdk-ios/pull/2104
+[#2099]: https://github.com/DataDog/dd-sdk-ios/pull/2099
+[#2063]: https://github.com/DataDog/dd-sdk-ios/pull/2063
+[#2092]: https://github.com/DataDog/dd-sdk-ios/pull/2092
+[#2113]: https://github.com/DataDog/dd-sdk-ios/pull/2113
+[#2114]: https://github.com/DataDog/dd-sdk-ios/pull/2114
+[#2116]: https://github.com/DataDog/dd-sdk-ios/pull/2116
+[#2120]: https://github.com/DataDog/dd-sdk-ios/pull/2120
+[#2126]: https://github.com/DataDog/dd-sdk-ios/pull/2126
+[#2148]: https://github.com/DataDog/dd-sdk-ios/pull/2148
+[#2154]: https://github.com/DataDog/dd-sdk-ios/pull/2154
+[@00fa9a]: https://github.com/00FA9A
+[@britton-earnin]: https://github.com/Britton-Earnin
+[@hengyu]: https://github.com/Hengyu
+[@leffelmania]: https://github.com/LeffelMania
+[@simpleapp]: https://github.com/SimpleApp
+[@tsvetelinvladimirov]: https://github.com/TsvetelinVladimirov
+[@arnauddorgans]: https://github.com/arnauddorgans
+[@ben-yolabs]: https://github.com/ben-yolabs
+[@earltedly]: https://github.com/earltedly
+[@flobories]: https://github.com/flobories
+[@hyling]: https://github.com/hyling
+[@jegnux]: https://github.com/jegnux
+[@joeydong]: https://github.com/joeydong
+[@jracollins]: https://github.com/jracollins
+[@lgaches]: https://github.com/lgaches
+[@lmramirez]: https://github.com/lmramirez
+[@marcusway]: https://github.com/marcusway
+[@aldoKelvianto]: https://github.com/aldoKelvianto
+[@matcartmill]: https://github.com/matcartmill
+[@michalsrutek]: https://github.com/michalsrutek
+[@philtre]: https://github.com/philtre
+[@pingd]: https://github.com/pingd
+[@provtheodorenewell]: https://github.com/provTheodoreNewell
+[@safa-ads]: https://github.com/safa-ads
+[@sdejesusf]: https://github.com/sdejesusF
+[@avdlee]: https://github.com/AvdLee
+[@dfed]: https://github.com/dfed
+[@cltnschlosser]: https://github.com/cltnschlosser
+[@alexfanatics]: https://github.com/alexfanatics
+[@changm4n]: https://github.com/changm4n
+[@jfiser-paylocity]: https://github.com/jfiser-paylocity
+[@Hengyu]: https://github.com/Hengyu
+[@naftaly]: https://github.com/naftaly
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6959ee72ee..0caa069e9c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -5,6 +5,8 @@ First of all, thanks for contributing!
This document provides some basic guidelines for contributing to this repository.
To propose improvements, feel free to submit a PR or open an Issue.
+**Note:** Datadog requires that all commits within this repository must be signed, including those within external contribution PRs. Please ensure you have followed GitHub's [Signing Commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits) guide before proposing a contribution. PRs lacking signed commits will not be processed and may be rejected.
+
## Have a feature request or idea?
Many great ideas for new features come from the community, and we'd be happy to consider yours 👍.
@@ -50,7 +52,21 @@ The workspace for SDK development and integration (tests, benchmarks, example ap
#### Tests
-`DatadogTests` (unit tests), `DatadogIntegrationTests` (integration tests), and `DatadogBenchmarkTests` (benchmarks) source files
+`DatadogTests` (unit tests), `IntegrationTests`, and `DatadogBenchmarkTests` (benchmarks) source files
+
+#### Lint
+
+We're using `swiftlint` to ensure our codebase follows Swift standard syntax. You can run the lint with our custom rules with the following command line:
+
+```shell
+$ ./tools/lint/run-linter.sh
+```
+
+In order to apply automatic correction of violations use `--fix` flag:
+
+```shell
+$ ./tools/lint/run-linter.sh --fix
+```
#### Dependency manager tests
diff --git a/Cartfile b/Cartfile
new file mode 100644
index 0000000000..e3155c952c
--- /dev/null
+++ b/Cartfile
@@ -0,0 +1,2 @@
+github "microsoft/plcrashreporter" ~> 1.11.2
+binary "https://raw.githubusercontent.com/DataDog/opentelemetry-swift-packages/main/OpenTelemetryApi.json" == 1.6.0
diff --git a/Cartfile.resolved b/Cartfile.resolved
new file mode 100644
index 0000000000..613647a075
--- /dev/null
+++ b/Cartfile.resolved
@@ -0,0 +1,2 @@
+binary "https://raw.githubusercontent.com/DataDog/opentelemetry-swift-packages/main/OpenTelemetryApi.json" "1.6.0"
+github "microsoft/plcrashreporter" "1.11.2"
diff --git a/Datadog.xcworkspace/contents.xcworkspacedata b/Datadog.xcworkspace/contents.xcworkspacedata
index 6d86ab3776..d52e6b154b 100644
--- a/Datadog.xcworkspace/contents.xcworkspacedata
+++ b/Datadog.xcworkspace/contents.xcworkspacedata
@@ -4,7 +4,4 @@
-
-
diff --git a/Datadog/Datadog.xcodeproj/project.pbxproj b/Datadog/Datadog.xcodeproj/project.pbxproj
index 2cd18f157b..8c1db17e4b 100644
--- a/Datadog/Datadog.xcodeproj/project.pbxproj
+++ b/Datadog/Datadog.xcodeproj/project.pbxproj
@@ -3,59 +3,293 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 52;
+ objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
- 61133B8C242393DE00786299 /* Datadog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* Datadog.framework */; };
- 61133B93242393DE00786299 /* Datadog.h in Headers */ = {isa = PBXBuildFile; fileRef = 61133B85242393DE00786299 /* Datadog.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 61133BCA2423979B00786299 /* EncodableValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA02423979B00786299 /* EncodableValue.swift */; };
- 61133BCB2423979B00786299 /* CarrierInfoProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA22423979B00786299 /* CarrierInfoProvider.swift */; };
- 61133BCC2423979B00786299 /* MobileDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA32423979B00786299 /* MobileDevice.swift */; };
- 61133BCD2423979B00786299 /* NetworkConnectionInfoProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA42423979B00786299 /* NetworkConnectionInfoProvider.swift */; };
- 61133BCE2423979B00786299 /* BatteryStatusProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA52423979B00786299 /* BatteryStatusProvider.swift */; };
+ 116F84062CFDD06700705755 /* SampleRateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 116F84052CFDD06700705755 /* SampleRateTests.swift */; };
+ 116F84072CFDD06700705755 /* SampleRateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 116F84052CFDD06700705755 /* SampleRateTests.swift */; };
+ 1434A4612B7F73110072E3BB /* OpenTelemetryApi.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1F88222B767CE200821579 /* OpenTelemetryApi.xcframework */; };
+ 1434A4622B7F73110072E3BB /* OpenTelemetryApi.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1F88222B767CE200821579 /* OpenTelemetryApi.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 1434A4632B7F73170072E3BB /* OpenTelemetryApi.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1F88222B767CE200821579 /* OpenTelemetryApi.xcframework */; };
+ 1434A4642B7F73170072E3BB /* OpenTelemetryApi.xcframework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 3C1F88222B767CE200821579 /* OpenTelemetryApi.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 1434A4662B7F8D880072E3BB /* DebugOTelTracingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1434A4652B7F8D880072E3BB /* DebugOTelTracingViewController.swift */; };
+ 1434A4672B7F8D880072E3BB /* DebugOTelTracingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1434A4652B7F8D880072E3BB /* DebugOTelTracingViewController.swift */; };
+ 3C08F9D02C2D652D002B0FF2 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C08F9CF2C2D652D002B0FF2 /* Storage.swift */; };
+ 3C08F9D12C2D652D002B0FF2 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C08F9CF2C2D652D002B0FF2 /* Storage.swift */; };
+ 3C0CB3452C19A1ED003B0E9B /* WatchdogTerminationReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0CB3442C19A1ED003B0E9B /* WatchdogTerminationReporter.swift */; };
+ 3C0CB3462C19A1ED003B0E9B /* WatchdogTerminationReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0CB3442C19A1ED003B0E9B /* WatchdogTerminationReporter.swift */; };
+ 3C0D5DD72A543B3B00446CF9 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DD62A543B3B00446CF9 /* Event.swift */; };
+ 3C0D5DD82A543B3B00446CF9 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DD62A543B3B00446CF9 /* Event.swift */; };
+ 3C0D5DE22A543DC400446CF9 /* EventGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DDF2A543DAE00446CF9 /* EventGeneratorTests.swift */; };
+ 3C0D5DE32A543DC900446CF9 /* EventGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DDF2A543DAE00446CF9 /* EventGeneratorTests.swift */; };
+ 3C0D5DE42A543E3400446CF9 /* EventGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DDC2A543D5D00446CF9 /* EventGenerator.swift */; };
+ 3C0D5DE52A543E3500446CF9 /* EventGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DDC2A543D5D00446CF9 /* EventGenerator.swift */; };
+ 3C0D5DE92A543EA200446CF9 /* RUMViewEventsFilterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DE62A543E9700446CF9 /* RUMViewEventsFilterTests.swift */; };
+ 3C0D5DEA2A543EA300446CF9 /* RUMViewEventsFilterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DE62A543E9700446CF9 /* RUMViewEventsFilterTests.swift */; };
+ 3C0D5DEC2A54405A00446CF9 /* RUMViewEventsFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DEB2A54405A00446CF9 /* RUMViewEventsFilter.swift */; };
+ 3C0D5DED2A54405A00446CF9 /* RUMViewEventsFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DEB2A54405A00446CF9 /* RUMViewEventsFilter.swift */; };
+ 3C0D5DEF2A5442A900446CF9 /* EventMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DEE2A5442A900446CF9 /* EventMocks.swift */; };
+ 3C0D5DF02A5442A900446CF9 /* EventMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DEE2A5442A900446CF9 /* EventMocks.swift */; };
+ 3C0D5DF52A5443B100446CF9 /* DataFormatTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DF42A5443B100446CF9 /* DataFormatTests.swift */; };
+ 3C0D5DF62A5443B100446CF9 /* DataFormatTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0D5DF42A5443B100446CF9 /* DataFormatTests.swift */; };
+ 3C1890152ABDE9BF00CE9E73 /* DDURLSessionInstrumentationTests+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C1890132ABDE99200CE9E73 /* DDURLSessionInstrumentationTests+apiTests.m */; };
+ 3C1890162ABDE9C000CE9E73 /* DDURLSessionInstrumentationTests+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C1890132ABDE99200CE9E73 /* DDURLSessionInstrumentationTests+apiTests.m */; };
+ 3C2206F52AB9DB9000DE780C /* DatadogSessionReplay.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6133D1F52A6ED9E100384BEF /* DatadogSessionReplay.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 3C2206F62AB9DBA700DE780C /* DatadogRUM.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 3C2206F72AB9DBB600DE780C /* DatadogTrace.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D25EE93429C4C3C300CE3839 /* DatadogTrace.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 3C2206F82AB9DBC600DE780C /* DatadogInternal.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 3C32359D2B55386C000B4258 /* OTelSpanLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C32359C2B55386C000B4258 /* OTelSpanLink.swift */; };
+ 3C32359E2B55386C000B4258 /* OTelSpanLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C32359C2B55386C000B4258 /* OTelSpanLink.swift */; };
+ 3C3235A02B55387A000B4258 /* OTelSpanLinkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C32359F2B55387A000B4258 /* OTelSpanLinkTests.swift */; };
+ 3C3235A12B55387A000B4258 /* OTelSpanLinkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C32359F2B55387A000B4258 /* OTelSpanLinkTests.swift */; };
+ 3C33E4072BEE35A8003B2988 /* RUMContextMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C33E4062BEE35A7003B2988 /* RUMContextMocks.swift */; };
+ 3C3EF2B02C1AEBAB009E9E57 /* LaunchReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3EF2AF2C1AEBAB009E9E57 /* LaunchReport.swift */; };
+ 3C3EF2B12C1AEBAB009E9E57 /* LaunchReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3EF2AF2C1AEBAB009E9E57 /* LaunchReport.swift */; };
+ 3C41693C29FBF4D50042B9D2 /* DatadogWebViewTracking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CE119FE29F7BE0100202522 /* DatadogWebViewTracking.framework */; };
+ 3C43A3882C188974000BFB21 /* WatchdogTerminationMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C43A3862C188970000BFB21 /* WatchdogTerminationMonitorTests.swift */; };
+ 3C43A3892C188975000BFB21 /* WatchdogTerminationMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C43A3862C188970000BFB21 /* WatchdogTerminationMonitorTests.swift */; };
+ 3C4CF9912C47BE07006DE1C0 /* MemoryWarningMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5CD8C12C3EBA1700B12303 /* MemoryWarningMonitor.swift */; };
+ 3C4CF9922C47BE07006DE1C0 /* MemoryWarningMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5CD8C12C3EBA1700B12303 /* MemoryWarningMonitor.swift */; };
+ 3C4CF9942C47CAE9006DE1C0 /* MemoryWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5CD8C42C3EC61500B12303 /* MemoryWarning.swift */; };
+ 3C4CF9952C47CAEA006DE1C0 /* MemoryWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5CD8C42C3EC61500B12303 /* MemoryWarning.swift */; };
+ 3C4CF9982C47CC91006DE1C0 /* MemoryWarningMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4CF9972C47CC8C006DE1C0 /* MemoryWarningMonitorTests.swift */; };
+ 3C4CF9992C47CC92006DE1C0 /* MemoryWarningMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4CF9972C47CC8C006DE1C0 /* MemoryWarningMonitorTests.swift */; };
+ 3C4CF99B2C47DAA5006DE1C0 /* MemoryWarningMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4CF99A2C47DAA5006DE1C0 /* MemoryWarningMocks.swift */; };
+ 3C4CF99C2C47DAA5006DE1C0 /* MemoryWarningMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4CF99A2C47DAA5006DE1C0 /* MemoryWarningMocks.swift */; };
+ 3C5CD8CD2C3ECB9400B12303 /* MemoryWarningReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5CD8CA2C3ECB4800B12303 /* MemoryWarningReporter.swift */; };
+ 3C5CD8CE2C3ECB9400B12303 /* MemoryWarningReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5CD8CA2C3ECB4800B12303 /* MemoryWarningReporter.swift */; };
+ 3C5D63692B55512B00FEB4BA /* OTelTraceState+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5D63682B55512B00FEB4BA /* OTelTraceState+Datadog.swift */; };
+ 3C5D636A2B55512B00FEB4BA /* OTelTraceState+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5D63682B55512B00FEB4BA /* OTelTraceState+Datadog.swift */; };
+ 3C5D636C2B55513500FEB4BA /* OTelTraceState+DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5D636B2B55513500FEB4BA /* OTelTraceState+DatadogTests.swift */; };
+ 3C5D636D2B55513500FEB4BA /* OTelTraceState+DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5D636B2B55513500FEB4BA /* OTelTraceState+DatadogTests.swift */; };
+ 3C5D691F2B76825500C4E07E /* OpenTelemetryApi.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1F88222B767CE200821579 /* OpenTelemetryApi.xcframework */; };
+ 3C5D69222B76826000C4E07E /* OpenTelemetryApi.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1F88222B767CE200821579 /* OpenTelemetryApi.xcframework */; };
+ 3C62C3612C3E852F00C7E336 /* MultiSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C62C3602C3E852F00C7E336 /* MultiSelector.swift */; };
+ 3C6C7FE72B459AAA006F5CBC /* OTelSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FE02B459AAA006F5CBC /* OTelSpan.swift */; };
+ 3C6C7FE82B459AAA006F5CBC /* OTelSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FE02B459AAA006F5CBC /* OTelSpan.swift */; };
+ 3C6C7FE92B459AAA006F5CBC /* OTelSpanBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FE12B459AAA006F5CBC /* OTelSpanBuilder.swift */; };
+ 3C6C7FEA2B459AAA006F5CBC /* OTelSpanBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FE12B459AAA006F5CBC /* OTelSpanBuilder.swift */; };
+ 3C6C7FEB2B459AAA006F5CBC /* OTelTraceId+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FE22B459AAA006F5CBC /* OTelTraceId+Datadog.swift */; };
+ 3C6C7FEC2B459AAA006F5CBC /* OTelTraceId+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FE22B459AAA006F5CBC /* OTelTraceId+Datadog.swift */; };
+ 3C6C7FEF2B459AAA006F5CBC /* OTelSpanId+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FE42B459AAA006F5CBC /* OTelSpanId+Datadog.swift */; };
+ 3C6C7FF02B459AAA006F5CBC /* OTelSpanId+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FE42B459AAA006F5CBC /* OTelSpanId+Datadog.swift */; };
+ 3C6C7FFB2B459AF6006F5CBC /* OTelSpanId+DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FF22B459AB3006F5CBC /* OTelSpanId+DatadogTests.swift */; };
+ 3C6C7FFC2B459AF6006F5CBC /* OTelTraceId+DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FF32B459AB3006F5CBC /* OTelTraceId+DatadogTests.swift */; };
+ 3C6C7FFD2B459AF6006F5CBC /* OTelSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FF42B459AB3006F5CBC /* OTelSpanTests.swift */; };
+ 3C6C7FFE2B459AF6006F5CBC /* OTelSpanId+DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FF22B459AB3006F5CBC /* OTelSpanId+DatadogTests.swift */; };
+ 3C6C7FFF2B459AF6006F5CBC /* OTelTraceId+DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FF32B459AB3006F5CBC /* OTelTraceId+DatadogTests.swift */; };
+ 3C6C80002B459AF6006F5CBC /* OTelSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6C7FF42B459AB3006F5CBC /* OTelSpanTests.swift */; };
+ 3C74305C29FBC0480053B80F /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2DA2385298D57AA00C6C7E6 /* DatadogInternal.framework */; };
+ 3C85D42129F7C5C900AFF894 /* WebViewTracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C85D41429F7C59C00AFF894 /* WebViewTracking.swift */; };
+ 3C85D42A29F7C70300AFF894 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; };
+ 3C85D42C29F7C87D00AFF894 /* HostsSanitizerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C85D42B29F7C87D00AFF894 /* HostsSanitizerMock.swift */; };
+ 3C85D42D29F7C87D00AFF894 /* HostsSanitizerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C85D42B29F7C87D00AFF894 /* HostsSanitizerMock.swift */; };
+ 3C9B27252B9F174700569C07 /* SpanID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C9B27242B9F174700569C07 /* SpanID.swift */; };
+ 3C9B27262B9F174700569C07 /* SpanID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C9B27242B9F174700569C07 /* SpanID.swift */; };
+ 3C9C6BB429F7C0C000581C43 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ 3CA00B072C2AE52400E6FE01 /* WatchdogTerminationsMonitoringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA00B062C2AE52400E6FE01 /* WatchdogTerminationsMonitoringTests.swift */; };
+ 3CA00B082C2AE52400E6FE01 /* WatchdogTerminationsMonitoringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA00B062C2AE52400E6FE01 /* WatchdogTerminationsMonitoringTests.swift */; };
+ 3CA8525F2BF2073800B52CBA /* TraceContextInjection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA8525E2BF2073800B52CBA /* TraceContextInjection.swift */; };
+ 3CA852602BF2073800B52CBA /* TraceContextInjection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA8525E2BF2073800B52CBA /* TraceContextInjection.swift */; };
+ 3CA852642BF2148200B52CBA /* TraceContextInjection+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA852612BF2147600B52CBA /* TraceContextInjection+objc.swift */; };
+ 3CA852652BF2148400B52CBA /* TraceContextInjection+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA852612BF2147600B52CBA /* TraceContextInjection+objc.swift */; };
+ 3CB012DD2B482E0400557951 /* NOPOTelSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CB012DB2B482E0400557951 /* NOPOTelSpan.swift */; };
+ 3CB012DE2B482E0400557951 /* NOPOTelSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CB012DB2B482E0400557951 /* NOPOTelSpan.swift */; };
+ 3CB012DF2B482E0400557951 /* NOPOTelSpanBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CB012DC2B482E0400557951 /* NOPOTelSpanBuilder.swift */; };
+ 3CB012E02B482E0400557951 /* NOPOTelSpanBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CB012DC2B482E0400557951 /* NOPOTelSpanBuilder.swift */; };
+ 3CBDE6742AA08C2F00F6A7B6 /* URLSessionInstrumentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CBDE6732AA08C2F00F6A7B6 /* URLSessionInstrumentation.swift */; };
+ 3CBDE6752AA08C2F00F6A7B6 /* URLSessionInstrumentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CBDE6732AA08C2F00F6A7B6 /* URLSessionInstrumentation.swift */; };
+ 3CBDE68A2AA0C47300F6A7B6 /* URLSessionTask+Tracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CBDE6892AA0C47300F6A7B6 /* URLSessionTask+Tracking.swift */; };
+ 3CBDE68B2AA0C47300F6A7B6 /* URLSessionTask+Tracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CBDE6892AA0C47300F6A7B6 /* URLSessionTask+Tracking.swift */; };
+ 3CC6AD182B4F07DD00015B18 /* OTelAttributeValue+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC6AD172B4F07DC00015B18 /* OTelAttributeValue+Datadog.swift */; };
+ 3CC6AD192B4F07DD00015B18 /* OTelAttributeValue+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC6AD172B4F07DC00015B18 /* OTelAttributeValue+Datadog.swift */; };
+ 3CC6AD1D2B4F07FA00015B18 /* OTelAttributeValue+DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC6AD1A2B4F07E700015B18 /* OTelAttributeValue+DatadogTests.swift */; };
+ 3CC6AD1E2B4F07FB00015B18 /* OTelAttributeValue+DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC6AD1A2B4F07E700015B18 /* OTelAttributeValue+DatadogTests.swift */; };
+ 3CCCA5C42ABAF0F80029D7BD /* DDURLSessionInstrumentation+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCCA5C32ABAF0F80029D7BD /* DDURLSessionInstrumentation+objc.swift */; };
+ 3CCCA5C52ABAF0F80029D7BD /* DDURLSessionInstrumentation+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCCA5C32ABAF0F80029D7BD /* DDURLSessionInstrumentation+objc.swift */; };
+ 3CCCA5C72ABAF5230029D7BD /* DDURLSessionInstrumentationConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCCA5C62ABAF5230029D7BD /* DDURLSessionInstrumentationConfigurationTests.swift */; };
+ 3CCCA5C82ABAF5230029D7BD /* DDURLSessionInstrumentationConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCCA5C62ABAF5230029D7BD /* DDURLSessionInstrumentationConfigurationTests.swift */; };
+ 3CCECDAF2BC688120013C125 /* SpanIDGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCECDAE2BC688120013C125 /* SpanIDGeneratorTests.swift */; };
+ 3CCECDB02BC688120013C125 /* SpanIDGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCECDAE2BC688120013C125 /* SpanIDGeneratorTests.swift */; };
+ 3CCECDB22BC68A0A0013C125 /* SpanIDTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCECDB12BC68A0A0013C125 /* SpanIDTests.swift */; };
+ 3CCECDB32BC68A0A0013C125 /* SpanIDTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCECDB12BC68A0A0013C125 /* SpanIDTests.swift */; };
+ 3CD3A13A2C6C99ED00436A69 /* Data+Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3C9E2B2C64F3CA003AF22F /* Data+Crypto.swift */; };
+ 3CD3A13B2C6C99ED00436A69 /* Data+Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3C9E2B2C64F3CA003AF22F /* Data+Crypto.swift */; };
+ 3CD3A13C2C6C99FE00436A69 /* Data+CryptoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3C9E2E2C64F470003AF22F /* Data+CryptoTests.swift */; };
+ 3CD3A13D2C6C99FE00436A69 /* Data+CryptoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3C9E2E2C64F470003AF22F /* Data+CryptoTests.swift */; };
+ 3CDA3F7E2BCD866D005D2C13 /* DatadogSDKTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 3CDA3F7D2BCD866D005D2C13 /* DatadogSDKTesting */; };
+ 3CDA3F802BCD8687005D2C13 /* DatadogSDKTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 3CDA3F7F2BCD8687005D2C13 /* DatadogSDKTesting */; };
+ 3CE11A1129F7BE0900202522 /* DatadogWebViewTracking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CE119FE29F7BE0100202522 /* DatadogWebViewTracking.framework */; };
+ 3CE11A1229F7BE0900202522 /* DatadogWebViewTracking.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3CE119FE29F7BE0100202522 /* DatadogWebViewTracking.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 3CEC57732C16FD0B0042B5F2 /* WatchdogTerminationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CEC57702C16FD000042B5F2 /* WatchdogTerminationMocks.swift */; };
+ 3CEC57742C16FD0C0042B5F2 /* WatchdogTerminationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CEC57702C16FD000042B5F2 /* WatchdogTerminationMocks.swift */; };
+ 3CEC57772C16FDD70042B5F2 /* WatchdogTerminationAppStateManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CEC57752C16FDD30042B5F2 /* WatchdogTerminationAppStateManagerTests.swift */; };
+ 3CEC57782C16FDD80042B5F2 /* WatchdogTerminationAppStateManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CEC57752C16FDD30042B5F2 /* WatchdogTerminationAppStateManagerTests.swift */; };
+ 3CF673362B4807490016CE17 /* OTelSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CF673352B4807490016CE17 /* OTelSpanTests.swift */; };
+ 3CF673372B4807490016CE17 /* OTelSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CF673352B4807490016CE17 /* OTelSpanTests.swift */; };
+ 3CFF4F8B2C09E61A006F191D /* WatchdogTerminationAppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4F8A2C09E61A006F191D /* WatchdogTerminationAppState.swift */; };
+ 3CFF4F8C2C09E61A006F191D /* WatchdogTerminationAppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4F8A2C09E61A006F191D /* WatchdogTerminationAppState.swift */; };
+ 3CFF4F912C09E630006F191D /* WatchdogTerminationAppStateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4F902C09E630006F191D /* WatchdogTerminationAppStateManager.swift */; };
+ 3CFF4F922C09E630006F191D /* WatchdogTerminationAppStateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4F902C09E630006F191D /* WatchdogTerminationAppStateManager.swift */; };
+ 3CFF4F942C09E63C006F191D /* WatchdogTerminationChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4F932C09E63C006F191D /* WatchdogTerminationChecker.swift */; };
+ 3CFF4F952C09E63C006F191D /* WatchdogTerminationChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4F932C09E63C006F191D /* WatchdogTerminationChecker.swift */; };
+ 3CFF4F972C09E64C006F191D /* WatchdogTerminationMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4F962C09E64C006F191D /* WatchdogTerminationMonitor.swift */; };
+ 3CFF4F982C09E64C006F191D /* WatchdogTerminationMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4F962C09E64C006F191D /* WatchdogTerminationMonitor.swift */; };
+ 3CFF4FA42C0E0FE8006F191D /* WatchdogTerminationCheckerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4FA32C0E0FE5006F191D /* WatchdogTerminationCheckerTests.swift */; };
+ 3CFF4FA52C0E0FE9006F191D /* WatchdogTerminationCheckerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF4FA32C0E0FE5006F191D /* WatchdogTerminationCheckerTests.swift */; };
+ 3CFF5D492B555F4F00FC483A /* OTelTracerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF5D482B555F4F00FC483A /* OTelTracerProvider.swift */; };
+ 3CFF5D4A2B555F4F00FC483A /* OTelTracerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFF5D482B555F4F00FC483A /* OTelTracerProvider.swift */; };
+ 49274906288048B500ECD49B /* InternalProxyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49274903288048AA00ECD49B /* InternalProxyTests.swift */; };
+ 49274907288048B800ECD49B /* InternalProxyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49274903288048AA00ECD49B /* InternalProxyTests.swift */; };
+ 49D8C0B72AC5D2160075E427 /* RUM+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D8C0B62AC5D2160075E427 /* RUM+Internal.swift */; };
+ 49D8C0B82AC5D2160075E427 /* RUM+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D8C0B62AC5D2160075E427 /* RUM+Internal.swift */; };
+ 49D8C0BD2AC5F2BB0075E427 /* Logs+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D8C0B92AC5F21F0075E427 /* Logs+Internal.swift */; };
+ 49D8C0BE2AC5F2BC0075E427 /* Logs+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D8C0B92AC5F21F0075E427 /* Logs+Internal.swift */; };
+ 61020C2A2757AD91005EEAEA /* BackgroundLocationMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61020C292757AD91005EEAEA /* BackgroundLocationMonitor.swift */; };
+ 61020C2C2758E853005EEAEA /* DebugBackgroundEventsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61020C2B2758E853005EEAEA /* DebugBackgroundEventsViewController.swift */; };
+ 61054E612A6EE10A00AAA894 /* SRCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E082A6EE10A00AAA894 /* SRCompression.swift */; };
+ 61054E622A6EE10A00AAA894 /* RecordWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E092A6EE10A00AAA894 /* RecordWriter.swift */; };
+ 61054E632A6EE10A00AAA894 /* SessionReplayConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E0B2A6EE10A00AAA894 /* SessionReplayConfiguration.swift */; };
+ 61054E642A6EE10A00AAA894 /* SessionReplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E0C2A6EE10A00AAA894 /* SessionReplay.swift */; };
+ 61054E652A6EE10A00AAA894 /* AppWindowObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E0F2A6EE10A00AAA894 /* AppWindowObserver.swift */; };
+ 61054E662A6EE10A00AAA894 /* KeyWindowObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E102A6EE10A00AAA894 /* KeyWindowObserver.swift */; };
+ 61054E672A6EE10A00AAA894 /* Recorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E112A6EE10A00AAA894 /* Recorder.swift */; };
+ 61054E682A6EE10A00AAA894 /* PrivacyLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E122A6EE10A00AAA894 /* PrivacyLevel.swift */; };
+ 61054E692A6EE10A00AAA894 /* UIImage+SessionReplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E142A6EE10A00AAA894 /* UIImage+SessionReplay.swift */; };
+ 61054E6A2A6EE10A00AAA894 /* UIView+SessionReplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E152A6EE10A00AAA894 /* UIView+SessionReplay.swift */; };
+ 61054E6B2A6EE10A00AAA894 /* CFType+Safety.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E162A6EE10A00AAA894 /* CFType+Safety.swift */; };
+ 61054E6C2A6EE10A00AAA894 /* SystemColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E172A6EE10A00AAA894 /* SystemColors.swift */; };
+ 61054E6D2A6EE10A00AAA894 /* CGRect+SessionReplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E182A6EE10A00AAA894 /* CGRect+SessionReplay.swift */; };
+ 61054E6E2A6EE10A00AAA894 /* RecordingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E192A6EE10A00AAA894 /* RecordingCoordinator.swift */; };
+ 61054E6F2A6EE10A00AAA894 /* UIApplicationSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E1B2A6EE10A00AAA894 /* UIApplicationSwizzler.swift */; };
+ 61054E702A6EE10A00AAA894 /* TouchSnapshotProducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E1C2A6EE10A00AAA894 /* TouchSnapshotProducer.swift */; };
+ 61054E712A6EE10A00AAA894 /* TouchSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E1E2A6EE10A00AAA894 /* TouchSnapshot.swift */; };
+ 61054E722A6EE10A00AAA894 /* TouchIdentifierGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E1F2A6EE10A00AAA894 /* TouchIdentifierGenerator.swift */; };
+ 61054E732A6EE10A00AAA894 /* WindowTouchSnapshotProducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E202A6EE10A00AAA894 /* WindowTouchSnapshotProducer.swift */; };
+ 61054E742A6EE10A00AAA894 /* ViewTreeSnapshotProducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E222A6EE10A00AAA894 /* ViewTreeSnapshotProducer.swift */; };
+ 61054E752A6EE10A00AAA894 /* ViewTreeSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E242A6EE10A00AAA894 /* ViewTreeSnapshot.swift */; };
+ 61054E762A6EE10A00AAA894 /* ViewTreeSnapshotBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E252A6EE10A00AAA894 /* ViewTreeSnapshotBuilder.swift */; };
+ 61054E772A6EE10A00AAA894 /* ViewTreeRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E262A6EE10A00AAA894 /* ViewTreeRecorder.swift */; };
+ 61054E782A6EE10A00AAA894 /* UIDatePickerRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E282A6EE10A00AAA894 /* UIDatePickerRecorder.swift */; };
+ 61054E792A6EE10A00AAA894 /* UITextViewRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E292A6EE10A00AAA894 /* UITextViewRecorder.swift */; };
+ 61054E7A2A6EE10A00AAA894 /* UIImageViewRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E2A2A6EE10A00AAA894 /* UIImageViewRecorder.swift */; };
+ 61054E7B2A6EE10A00AAA894 /* UIViewRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E2B2A6EE10A00AAA894 /* UIViewRecorder.swift */; };
+ 61054E7C2A6EE10A00AAA894 /* UINavigationBarRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E2C2A6EE10A00AAA894 /* UINavigationBarRecorder.swift */; };
+ 61054E7D2A6EE10A00AAA894 /* UITextFieldRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E2D2A6EE10A00AAA894 /* UITextFieldRecorder.swift */; };
+ 61054E7E2A6EE10A00AAA894 /* NodeRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E2E2A6EE10A00AAA894 /* NodeRecorder.swift */; };
+ 61054E7F2A6EE10A00AAA894 /* UISliderRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E2F2A6EE10A00AAA894 /* UISliderRecorder.swift */; };
+ 61054E802A6EE10A00AAA894 /* UIPickerViewRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E302A6EE10A00AAA894 /* UIPickerViewRecorder.swift */; };
+ 61054E812A6EE10A00AAA894 /* UIStepperRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E312A6EE10A00AAA894 /* UIStepperRecorder.swift */; };
+ 61054E822A6EE10A00AAA894 /* UILabelRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E322A6EE10A00AAA894 /* UILabelRecorder.swift */; };
+ 61054E832A6EE10A00AAA894 /* UISwitchRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E332A6EE10A00AAA894 /* UISwitchRecorder.swift */; };
+ 61054E842A6EE10A00AAA894 /* UITabBarRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E342A6EE10A00AAA894 /* UITabBarRecorder.swift */; };
+ 61054E852A6EE10A00AAA894 /* UISegmentRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E352A6EE10A00AAA894 /* UISegmentRecorder.swift */; };
+ 61054E862A6EE10A00AAA894 /* UnsupportedViewRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E362A6EE10A00AAA894 /* UnsupportedViewRecorder.swift */; };
+ 61054E882A6EE10A00AAA894 /* ViewTreeRecordingContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E382A6EE10A00AAA894 /* ViewTreeRecordingContext.swift */; };
+ 61054E892A6EE10A00AAA894 /* NodeIDGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E392A6EE10A00AAA894 /* NodeIDGenerator.swift */; };
+ 61054E8A2A6EE10A00AAA894 /* WindowViewTreeSnapshotProducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E3A2A6EE10A00AAA894 /* WindowViewTreeSnapshotProducer.swift */; };
+ 61054E8B2A6EE10A00AAA894 /* SessionReplayFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E3C2A6EE10A00AAA894 /* SessionReplayFeature.swift */; };
+ 61054E8D2A6EE10A00AAA894 /* RUMContextReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E3E2A6EE10A00AAA894 /* RUMContextReceiver.swift */; };
+ 61054E8E2A6EE10A00AAA894 /* SRContextPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E3F2A6EE10A00AAA894 /* SRContextPublisher.swift */; };
+ 61054E8F2A6EE10A00AAA894 /* SegmentRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E412A6EE10A00AAA894 /* SegmentRequestBuilder.swift */; };
+ 61054E902A6EE10A00AAA894 /* SegmentJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E432A6EE10A00AAA894 /* SegmentJSON.swift */; };
+ 61054E932A6EE10A00AAA894 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E472A6EE10A00AAA894 /* MultipartFormData.swift */; };
+ 61054E942A6EE10A00AAA894 /* TextObfuscator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4A2A6EE10A00AAA894 /* TextObfuscator.swift */; };
+ 61054E952A6EE10A00AAA894 /* SnapshotProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4B2A6EE10A00AAA894 /* SnapshotProcessor.swift */; };
+ 61054E962A6EE10A00AAA894 /* Diff+SRWireframes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4D2A6EE10A00AAA894 /* Diff+SRWireframes.swift */; };
+ 61054E972A6EE10A00AAA894 /* Diff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4E2A6EE10A00AAA894 /* Diff.swift */; };
+ 61054E982A6EE10A00AAA894 /* RecordsBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E502A6EE10A00AAA894 /* RecordsBuilder.swift */; };
+ 61054E992A6EE10A00AAA894 /* WireframesBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E512A6EE10A00AAA894 /* WireframesBuilder.swift */; };
+ 61054E9A2A6EE10A00AAA894 /* NodesFlattener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E532A6EE10A00AAA894 /* NodesFlattener.swift */; };
+ 61054E9B2A6EE10B00AAA894 /* CGRectExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E552A6EE10A00AAA894 /* CGRectExtensions.swift */; };
+ 61054E9E2A6EE10B00AAA894 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E582A6EE10A00AAA894 /* Queue.swift */; };
+ 61054E9F2A6EE10B00AAA894 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E592A6EE10A00AAA894 /* Errors.swift */; };
+ 61054EA02A6EE10B00AAA894 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E5A2A6EE10A00AAA894 /* Colors.swift */; };
+ 61054EA12A6EE10B00AAA894 /* MainThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E5C2A6EE10A00AAA894 /* MainThreadScheduler.swift */; };
+ 61054EA22A6EE10B00AAA894 /* Scheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E5D2A6EE10A00AAA894 /* Scheduler.swift */; };
+ 61054F952A6EE1BA00AAA894 /* SessionReplayConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F3D2A6EE1B900AAA894 /* SessionReplayConfigurationTests.swift */; };
+ 61054F972A6EE1BA00AAA894 /* UIImage+SessionReplayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F402A6EE1B900AAA894 /* UIImage+SessionReplayTests.swift */; };
+ 61054F982A6EE1BA00AAA894 /* CGRectExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F412A6EE1B900AAA894 /* CGRectExtensionsTests.swift */; };
+ 61054F992A6EE1BA00AAA894 /* ColorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F422A6EE1B900AAA894 /* ColorsTests.swift */; };
+ 61054F9A2A6EE1BA00AAA894 /* CFType+SafetyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F432A6EE1B900AAA894 /* CFType+SafetyTests.swift */; };
+ 61054F9B2A6EE1BA00AAA894 /* QueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F442A6EE1B900AAA894 /* QueueTests.swift */; };
+ 61054F9C2A6EE1BA00AAA894 /* SwiftExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F452A6EE1B900AAA894 /* SwiftExtensionsTests.swift */; };
+ 61054F9D2A6EE1BA00AAA894 /* MainThreadSchedulerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F472A6EE1B900AAA894 /* MainThreadSchedulerTests.swift */; };
+ 61054F9E2A6EE1BA00AAA894 /* SessionReplayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F482A6EE1B900AAA894 /* SessionReplayTests.swift */; };
+ 61054F9F2A6EE1BA00AAA894 /* RecordsWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F4A2A6EE1BA00AAA894 /* RecordsWriterTests.swift */; };
+ 61054FA02A6EE1BA00AAA894 /* SRCompressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F4B2A6EE1BA00AAA894 /* SRCompressionTests.swift */; };
+ 61054FA22A6EE1BA00AAA894 /* TextObfuscatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F502A6EE1BA00AAA894 /* TextObfuscatorTests.swift */; };
+ 61054FA32A6EE1BA00AAA894 /* Diff+SRWireframesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F522A6EE1BA00AAA894 /* Diff+SRWireframesTests.swift */; };
+ 61054FA42A6EE1BA00AAA894 /* DiffTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F532A6EE1BA00AAA894 /* DiffTests.swift */; };
+ 61054FA52A6EE1BA00AAA894 /* RecordsBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F552A6EE1BA00AAA894 /* RecordsBuilderTests.swift */; };
+ 61054FA62A6EE1BA00AAA894 /* SnapshotProcessorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F562A6EE1BA00AAA894 /* SnapshotProcessorTests.swift */; };
+ 61054FA72A6EE1BA00AAA894 /* NodesFlattenerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F582A6EE1BA00AAA894 /* NodesFlattenerTests.swift */; };
+ 61054FA82A6EE1BA00AAA894 /* RecordingCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F5A2A6EE1BA00AAA894 /* RecordingCoordinatorTests.swift */; };
+ 61054FAA2A6EE1BA00AAA894 /* UIView+SessionReplayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F5D2A6EE1BA00AAA894 /* UIView+SessionReplayTests.swift */; };
+ 61054FAC2A6EE1BA00AAA894 /* CGRect+SessionReplayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F5F2A6EE1BA00AAA894 /* CGRect+SessionReplayTests.swift */; };
+ 61054FAD2A6EE1BA00AAA894 /* WindowTouchSnapshotProducerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F612A6EE1BA00AAA894 /* WindowTouchSnapshotProducerTests.swift */; };
+ 61054FAE2A6EE1BA00AAA894 /* TouchIdentifierGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F632A6EE1BA00AAA894 /* TouchIdentifierGeneratorTests.swift */; };
+ 61054FAF2A6EE1BA00AAA894 /* ViewTreeRecordingContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F662A6EE1BA00AAA894 /* ViewTreeRecordingContextTests.swift */; };
+ 61054FB02A6EE1BA00AAA894 /* ViewTreeSnapshotBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F672A6EE1BA00AAA894 /* ViewTreeSnapshotBuilderTests.swift */; };
+ 61054FB12A6EE1BA00AAA894 /* NodeIDGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F682A6EE1BA00AAA894 /* NodeIDGeneratorTests.swift */; };
+ 61054FB22A6EE1BA00AAA894 /* UILabelRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F6A2A6EE1BA00AAA894 /* UILabelRecorderTests.swift */; };
+ 61054FB32A6EE1BA00AAA894 /* UITextFieldRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F6B2A6EE1BA00AAA894 /* UITextFieldRecorderTests.swift */; };
+ 61054FB42A6EE1BA00AAA894 /* UITabBarRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F6C2A6EE1BA00AAA894 /* UITabBarRecorderTests.swift */; };
+ 61054FB52A6EE1BA00AAA894 /* UISliderRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F6D2A6EE1BA00AAA894 /* UISliderRecorderTests.swift */; };
+ 61054FB62A6EE1BA00AAA894 /* UnsupportedViewRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F6E2A6EE1BA00AAA894 /* UnsupportedViewRecorderTests.swift */; };
+ 61054FB72A6EE1BA00AAA894 /* UISegmentRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F6F2A6EE1BA00AAA894 /* UISegmentRecorderTests.swift */; };
+ 61054FB82A6EE1BA00AAA894 /* UIDatePickerRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F702A6EE1BA00AAA894 /* UIDatePickerRecorderTests.swift */; };
+ 61054FB92A6EE1BA00AAA894 /* UINavigationBarRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F712A6EE1BA00AAA894 /* UINavigationBarRecorderTests.swift */; };
+ 61054FBA2A6EE1BA00AAA894 /* UIImageViewRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F722A6EE1BA00AAA894 /* UIImageViewRecorderTests.swift */; };
+ 61054FBB2A6EE1BA00AAA894 /* UISwitchRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F732A6EE1BA00AAA894 /* UISwitchRecorderTests.swift */; };
+ 61054FBC2A6EE1BA00AAA894 /* UIStepperRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F742A6EE1BA00AAA894 /* UIStepperRecorderTests.swift */; };
+ 61054FBD2A6EE1BA00AAA894 /* UIViewRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F752A6EE1BA00AAA894 /* UIViewRecorderTests.swift */; };
+ 61054FBE2A6EE1BA00AAA894 /* UIImageViewWireframesBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F762A6EE1BA00AAA894 /* UIImageViewWireframesBuilderTests.swift */; };
+ 61054FBF2A6EE1BA00AAA894 /* UIPickerViewRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F772A6EE1BA00AAA894 /* UIPickerViewRecorderTests.swift */; };
+ 61054FC02A6EE1BA00AAA894 /* UITextViewRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F782A6EE1BA00AAA894 /* UITextViewRecorderTests.swift */; };
+ 61054FC12A6EE1BA00AAA894 /* ViewTreeRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F792A6EE1BA00AAA894 /* ViewTreeRecorderTests.swift */; };
+ 61054FC22A6EE1BA00AAA894 /* ViewTreeSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F7A2A6EE1BA00AAA894 /* ViewTreeSnapshotTests.swift */; };
+ 61054FC32A6EE1BA00AAA894 /* TextAndInputPrivacyLevelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F7B2A6EE1BA00AAA894 /* TextAndInputPrivacyLevelTests.swift */; };
+ 61054FC42A6EE1BA00AAA894 /* RecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F7C2A6EE1BA00AAA894 /* RecorderTests.swift */; };
+ 61054FC52A6EE1BA00AAA894 /* UIKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F7E2A6EE1BA00AAA894 /* UIKitMocks.swift */; };
+ 61054FC62A6EE1BA00AAA894 /* CoreGraphicsMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F7F2A6EE1BA00AAA894 /* CoreGraphicsMocks.swift */; };
+ 61054FC72A6EE1BA00AAA894 /* SRDataModelsMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F802A6EE1BA00AAA894 /* SRDataModelsMocks.swift */; };
+ 61054FC82A6EE1BA00AAA894 /* SnapshotProcessorSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F812A6EE1BA00AAA894 /* SnapshotProcessorSpy.swift */; };
+ 61054FC92A6EE1BA00AAA894 /* RecorderMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F822A6EE1BA00AAA894 /* RecorderMocks.swift */; };
+ 61054FCA2A6EE1BA00AAA894 /* TestScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F832A6EE1BA00AAA894 /* TestScheduler.swift */; };
+ 61054FCB2A6EE1BA00AAA894 /* QueueMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F842A6EE1BA00AAA894 /* QueueMocks.swift */; };
+ 61054FCD2A6EE1BA00AAA894 /* SnapshotProducerMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F862A6EE1BA00AAA894 /* SnapshotProducerMocks.swift */; };
+ 61054FCE2A6EE1BA00AAA894 /* RUMContextObserverMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F872A6EE1BA00AAA894 /* RUMContextObserverMock.swift */; };
+ 61054FCF2A6EE1BA00AAA894 /* RUMContextReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F892A6EE1BA00AAA894 /* RUMContextReceiverTests.swift */; };
+ 61054FD02A6EE1BA00AAA894 /* SRContextPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F8A2A6EE1BA00AAA894 /* SRContextPublisherTests.swift */; };
+ 61054FD32A6EE1BA00AAA894 /* MultipartFormDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F902A6EE1BA00AAA894 /* MultipartFormDataTests.swift */; };
+ 61054FD42A6EE1BA00AAA894 /* SegmentRequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F912A6EE1BA00AAA894 /* SegmentRequestBuilderTests.swift */; };
+ 61054FD52A6EE1BA00AAA894 /* XCTAssertRectsEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F932A6EE1BA00AAA894 /* XCTAssertRectsEqual.swift */; };
+ 610ABD4C2A6930CA00AFEA34 /* CoreTelemetryIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610ABD4B2A6930CA00AFEA34 /* CoreTelemetryIntegrationTests.swift */; };
+ 610ABD4D2A6930CA00AFEA34 /* CoreTelemetryIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610ABD4B2A6930CA00AFEA34 /* CoreTelemetryIntegrationTests.swift */; };
+ 61112F8E2A4417D6006FFCA6 /* DDRUM+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61112F8D2A4417D6006FFCA6 /* DDRUM+apiTests.m */; };
+ 61112F8F2A4417D6006FFCA6 /* DDRUM+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61112F8D2A4417D6006FFCA6 /* DDRUM+apiTests.m */; };
+ 6111C58225C0081F00F5C4A2 /* RUMDataModels+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6111C58125C0081F00F5C4A2 /* RUMDataModels+objc.swift */; };
+ 61133B8C242393DE00786299 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* DatadogCore.framework */; };
+ 61133B93242393DE00786299 /* DatadogCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 61133B85242393DE00786299 /* DatadogCore.h */; settings = {ATTRIBUTES = (Public, ); }; };
61133BCF2423979B00786299 /* FileWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA72423979B00786299 /* FileWriter.swift */; };
- 61133BD02423979B00786299 /* DateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA82423979B00786299 /* DateProvider.swift */; };
61133BD12423979B00786299 /* FilesOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA92423979B00786299 /* FilesOrchestrator.swift */; };
- 61133BD22423979B00786299 /* Directory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAB2423979B00786299 /* Directory.swift */; };
- 61133BD32423979B00786299 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAC2423979B00786299 /* File.swift */; };
61133BD42423979B00786299 /* FileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAD2423979B00786299 /* FileReader.swift */; };
61133BD52423979B00786299 /* DataUploadConditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAF2423979B00786299 /* DataUploadConditions.swift */; };
61133BD62423979B00786299 /* DataUploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB02423979B00786299 /* DataUploader.swift */; };
61133BD72423979B00786299 /* DataUploadWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB12423979B00786299 /* DataUploadWorker.swift */; };
- 61133BD82423979B00786299 /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB22423979B00786299 /* HTTPClient.swift */; };
+ 61133BD82423979B00786299 /* URLSessionClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB22423979B00786299 /* URLSessionClient.swift */; };
61133BD92423979B00786299 /* DataUploadDelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB32423979B00786299 /* DataUploadDelay.swift */; };
- 61133BDA2423979B00786299 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB42423979B00786299 /* HTTPHeaders.swift */; };
- 61133BDB2423979B00786299 /* DatadogConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB52423979B00786299 /* DatadogConfiguration.swift */; };
- 61133BDC2423979B00786299 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB62423979B00786299 /* Logger.swift */; };
- 61133BDD2423979B00786299 /* InternalLoggers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB82423979B00786299 /* InternalLoggers.swift */; };
- 61133BDE2423979B00786299 /* CompilationConditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB92423979B00786299 /* CompilationConditions.swift */; };
- 61133BDF2423979B00786299 /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BBA2423979B00786299 /* SwiftExtensions.swift */; };
- 61133BE02423979B00786299 /* Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BBB2423979B00786299 /* Datadog.swift */; };
- 61133BE32423979B00786299 /* UserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC02423979B00786299 /* UserInfo.swift */; };
- 61133BE42423979B00786299 /* LogEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC22423979B00786299 /* LogEncoder.swift */; };
- 61133BE52423979B00786299 /* LogBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC32423979B00786299 /* LogBuilder.swift */; };
- 61133BE62423979B00786299 /* LogSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC42423979B00786299 /* LogSanitizer.swift */; };
- 61133BE72423979B00786299 /* LogUtilityOutputs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC62423979B00786299 /* LogUtilityOutputs.swift */; };
- 61133BE82423979B00786299 /* LogFileOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC72423979B00786299 /* LogFileOutput.swift */; };
- 61133BE92423979B00786299 /* LogOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC82423979B00786299 /* LogOutput.swift */; };
- 61133BEA2423979B00786299 /* LogConsoleOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC92423979B00786299 /* LogConsoleOutput.swift */; };
61133C00242397DA00786299 /* DatadogObjc.h in Headers */ = {isa = PBXBuildFile; fileRef = 61133BF2242397DA00786299 /* DatadogObjc.h */; settings = {ATTRIBUTES = (Public, ); }; };
61133C0E2423983800786299 /* Datadog+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C092423983800786299 /* Datadog+objc.swift */; };
- 61133C0F2423983800786299 /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C0B2423983800786299 /* AnyEncodable.swift */; };
- 61133C102423983800786299 /* Logger+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C0C2423983800786299 /* Logger+objc.swift */; };
+ 61133C102423983800786299 /* Logs+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C0C2423983800786299 /* Logs+objc.swift */; };
61133C112423983800786299 /* DatadogConfiguration+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C0D2423983800786299 /* DatadogConfiguration+objc.swift */; };
61133C482423990D00786299 /* DDDatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C142423990D00786299 /* DDDatadogTests.swift */; };
- 61133C492423990D00786299 /* DDLoggerBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C152423990D00786299 /* DDLoggerBuilderTests.swift */; };
61133C4A2423990D00786299 /* DDConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C162423990D00786299 /* DDConfigurationTests.swift */; };
- 61133C4B2423990D00786299 /* DDLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C172423990D00786299 /* DDLoggerTests.swift */; };
+ 61133C4B2423990D00786299 /* DDLogsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C172423990D00786299 /* DDLogsTests.swift */; };
61133C4D2423990D00786299 /* CoreTelephonyMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C1B2423990D00786299 /* CoreTelephonyMocks.swift */; };
61133C4E2423990D00786299 /* UIKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C1C2423990D00786299 /* UIKitMocks.swift */; };
- 61133C522423990D00786299 /* FoundationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C202423990D00786299 /* FoundationMocks.swift */; };
- 61133C532423990D00786299 /* MobileDeviceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C232423990D00786299 /* MobileDeviceTests.swift */; };
- 61133C542423990D00786299 /* NetworkConnectionInfoProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C242423990D00786299 /* NetworkConnectionInfoProviderTests.swift */; };
- 61133C552423990D00786299 /* BatteryStatusProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C252423990D00786299 /* BatteryStatusProviderTests.swift */; };
- 61133C562423990D00786299 /* CarrierInfoProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C262423990D00786299 /* CarrierInfoProviderTests.swift */; };
61133C572423990D00786299 /* FileReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C282423990D00786299 /* FileReaderTests.swift */; };
61133C582423990D00786299 /* FileWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C292423990D00786299 /* FileWriterTests.swift */; };
61133C592423990D00786299 /* FilesOrchestratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C2A2423990D00786299 /* FilesOrchestratorTests.swift */; };
@@ -63,139 +297,1515 @@
61133C5B2423990D00786299 /* DirectoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C2D2423990D00786299 /* DirectoryTests.swift */; };
61133C5C2423990D00786299 /* DataUploadWorkerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C2F2423990D00786299 /* DataUploadWorkerTests.swift */; };
61133C5D2423990D00786299 /* DataUploadConditionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C302423990D00786299 /* DataUploadConditionsTests.swift */; };
- 61133C5E2423990D00786299 /* LogsUploadDelayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C312423990D00786299 /* LogsUploadDelayTests.swift */; };
+ 61133C5E2423990D00786299 /* DataUploadDelayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C312423990D00786299 /* DataUploadDelayTests.swift */; };
61133C5F2423990D00786299 /* DataUploaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C322423990D00786299 /* DataUploaderTests.swift */; };
- 61133C602423990D00786299 /* HTTPHeadersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C332423990D00786299 /* HTTPHeadersTests.swift */; };
- 61133C612423990D00786299 /* HTTPClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C342423990D00786299 /* HTTPClientTests.swift */; };
- 61133C622423990D00786299 /* InternalLoggersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C362423990D00786299 /* InternalLoggersTests.swift */; };
+ 61133C602423990D00786299 /* RequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C332423990D00786299 /* RequestBuilderTests.swift */; };
+ 61133C612423990D00786299 /* URLSessionClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C342423990D00786299 /* URLSessionClientTests.swift */; };
61133C642423990D00786299 /* LoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C382423990D00786299 /* LoggerTests.swift */; };
- 61133C652423990D00786299 /* LogBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3B2423990D00786299 /* LogBuilderTests.swift */; };
- 61133C662423990D00786299 /* LogSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3C2423990D00786299 /* LogSanitizerTests.swift */; };
- 61133C672423990D00786299 /* LogConsoleOutputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3E2423990D00786299 /* LogConsoleOutputTests.swift */; };
- 61133C682423990D00786299 /* LogUtilityOutputsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3F2423990D00786299 /* LogUtilityOutputsTests.swift */; };
- 61133C692423990D00786299 /* LogFileOutputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C402423990D00786299 /* LogFileOutputTests.swift */; };
61133C6A2423990D00786299 /* DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C412423990D00786299 /* DatadogTests.swift */; };
61133C6B2423990D00786299 /* LogMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C432423990D00786299 /* LogMatcher.swift */; };
- 61133C6C2423990D00786299 /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C452423990D00786299 /* SwiftExtensions.swift */; };
- 61133C6D2423990D00786299 /* TestsDirectory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C462423990D00786299 /* TestsDirectory.swift */; };
61133C6E2423990D00786299 /* DatadogExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C472423990D00786299 /* DatadogExtensions.swift */; };
- 61133C702423993200786299 /* Datadog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* Datadog.framework */; };
- 61133C712423993200786299 /* Datadog.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* Datadog.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 61216276247D1CD700AC5D67 /* LoggingForTracingAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216275247D1CD700AC5D67 /* LoggingForTracingAdapter.swift */; };
- 6121627C247D220500AC5D67 /* LoggingForTracingAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216279247D21FE00AC5D67 /* LoggingForTracingAdapterTests.swift */; };
- 612983CD2449E62E00D4424B /* LoggingFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612983CC2449E62E00D4424B /* LoggingFeature.swift */; };
+ 61133C702423993200786299 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* DatadogCore.framework */; };
+ 6115299725E3BEF9004F740E /* UIKitExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6115299625E3BEF9004F740E /* UIKitExtensionsTests.swift */; };
+ 611720D52524D9FB00634D9E /* DDURLSessionDelegate+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611720D42524D9FB00634D9E /* DDURLSessionDelegate+objc.swift */; };
+ 6117A4E42CCBB54500EBBB6F /* AppStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6117A4E32CCBB54500EBBB6F /* AppStateProvider.swift */; };
+ 6117A4E52CCBB54500EBBB6F /* AppStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6117A4E32CCBB54500EBBB6F /* AppStateProvider.swift */; };
+ 61181CDC2BF35BC000632A7A /* FatalErrorContextNotifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61181CDB2BF35BC000632A7A /* FatalErrorContextNotifierTests.swift */; };
+ 61181CDD2BF35BC000632A7A /* FatalErrorContextNotifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61181CDB2BF35BC000632A7A /* FatalErrorContextNotifierTests.swift */; };
+ 61193AAE2CB54C7300C3CDF5 /* RUMActionsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61193AAD2CB54C7300C3CDF5 /* RUMActionsHandler.swift */; };
+ 61193AAF2CB54C7300C3CDF5 /* RUMActionsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61193AAD2CB54C7300C3CDF5 /* RUMActionsHandler.swift */; };
+ 6121627C247D220500AC5D67 /* TracingWithLoggingIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216279247D21FE00AC5D67 /* TracingWithLoggingIntegrationTests.swift */; };
+ 61216B762666DDA10089DCD1 /* LoggerConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216B752666DDA10089DCD1 /* LoggerConfigurationTests.swift */; };
+ 61216B7B2667A9AE0089DCD1 /* LogsConfigurationE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216B7A2667A9AE0089DCD1 /* LogsConfigurationE2ETests.swift */; };
+ 61216B802667C79B0089DCD1 /* LogsTrackingConsentE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216B7F2667C79B0089DCD1 /* LogsTrackingConsentE2ETests.swift */; };
+ 61216B842667CFF70089DCD1 /* DatadogE2EHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216B7D2667BC220089DCD1 /* DatadogE2EHelpers.swift */; };
+ 61216B852667CFFE0089DCD1 /* RUME2EHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216B7826679DD20089DCD1 /* RUME2EHelpers.swift */; };
+ 612556B0268C8D31002BCE74 /* CrashReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612556AF268C8D31002BCE74 /* CrashReport.swift */; };
+ 612556BB268DD9BF002BCE74 /* DDCrashReportExporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612556BA268DD9BF002BCE74 /* DDCrashReportExporter.swift */; };
+ 6128F56A2BA2237300D35B08 /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5692BA2237300D35B08 /* DataStore.swift */; };
+ 6128F56B2BA2237300D35B08 /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5692BA2237300D35B08 /* DataStore.swift */; };
+ 6128F56E2BA223A100D35B08 /* FeatureDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F56D2BA223A100D35B08 /* FeatureDataStore.swift */; };
+ 6128F56F2BA223A100D35B08 /* FeatureDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F56D2BA223A100D35B08 /* FeatureDataStore.swift */; };
+ 6128F5712BA223D100D35B08 /* DataStore+TLV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5702BA223D100D35B08 /* DataStore+TLV.swift */; };
+ 6128F5722BA223D100D35B08 /* DataStore+TLV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5702BA223D100D35B08 /* DataStore+TLV.swift */; };
+ 6128F5742BA3280300D35B08 /* DataStoreFileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5732BA3280300D35B08 /* DataStoreFileReader.swift */; };
+ 6128F5752BA3280300D35B08 /* DataStoreFileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5732BA3280300D35B08 /* DataStoreFileReader.swift */; };
+ 6128F5772BA32DE500D35B08 /* DataStoreFileWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5762BA32DE500D35B08 /* DataStoreFileWriter.swift */; };
+ 6128F5782BA32DE500D35B08 /* DataStoreFileWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5762BA32DE500D35B08 /* DataStoreFileWriter.swift */; };
+ 6128F57B2BA35D6200D35B08 /* FeatureDataStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F57A2BA35D6200D35B08 /* FeatureDataStoreTests.swift */; };
+ 6128F57C2BA35D6200D35B08 /* FeatureDataStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F57A2BA35D6200D35B08 /* FeatureDataStoreTests.swift */; };
+ 6128F57E2BA8A3A000D35B08 /* DataStore+TLVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F57D2BA8A3A000D35B08 /* DataStore+TLVTests.swift */; };
+ 6128F57F2BA8A3A000D35B08 /* DataStore+TLVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F57D2BA8A3A000D35B08 /* DataStore+TLVTests.swift */; };
+ 6128F5842BA8CAAB00D35B08 /* DataStoreFileWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5832BA8CAAB00D35B08 /* DataStoreFileWriterTests.swift */; };
+ 6128F5852BA8CAAB00D35B08 /* DataStoreFileWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5832BA8CAAB00D35B08 /* DataStoreFileWriterTests.swift */; };
+ 6128F58A2BA9860B00D35B08 /* DataStoreFileReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5892BA9860B00D35B08 /* DataStoreFileReaderTests.swift */; };
+ 6128F58B2BA9860B00D35B08 /* DataStoreFileReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6128F5892BA9860B00D35B08 /* DataStoreFileReaderTests.swift */; };
+ 612C13D02AA772FA0086B5D1 /* SRRequestMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612C13CF2AA772FA0086B5D1 /* SRRequestMatcher.swift */; };
+ 612C13D12AA772FA0086B5D1 /* SRRequestMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612C13CF2AA772FA0086B5D1 /* SRRequestMatcher.swift */; };
+ 612C13D62AAB35EB0086B5D1 /* SRSegmentMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612C13D52AAB35EB0086B5D1 /* SRSegmentMatcher.swift */; };
+ 612C13D72AAB35EB0086B5D1 /* SRSegmentMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612C13D52AAB35EB0086B5D1 /* SRSegmentMatcher.swift */; };
6132BF4224A38D2400D7BD17 /* OTTracer+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4124A38D2400D7BD17 /* OTTracer+objc.swift */; };
- 6132BF4424A3AAD700D7BD17 /* OTGlobal+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4324A3AAD700D7BD17 /* OTGlobal+objc.swift */; };
6132BF4724A498D800D7BD17 /* DDSpan+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4624A498D800D7BD17 /* DDSpan+objc.swift */; };
6132BF4924A49B6800D7BD17 /* DDSpanContext+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4824A49B6800D7BD17 /* DDSpanContext+objc.swift */; };
6132BF4C24A49C8F00D7BD17 /* HTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4B24A49C8F00D7BD17 /* HTTPHeadersWriter+objc.swift */; };
- 6132BF4E24A49D5400D7BD17 /* OTNoop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4D24A49D5400D7BD17 /* OTNoop.swift */; };
6132BF5124A49F7400D7BD17 /* Casting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF5024A49F7400D7BD17 /* Casting.swift */; };
+ 6133D1EF2A6ED9E100384BEF /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ 6133D2012A6EDB7700384BEF /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; };
+ 6133D20B2A6EDBC100384BEF /* DatadogSessionReplay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6133D1F52A6ED9E100384BEF /* DatadogSessionReplay.framework */; };
61345613244756E300E7DA6B /* PerformancePresetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61345612244756E300E7DA6B /* PerformancePresetTests.swift */; };
- 61441C0524616DE9003D8BB8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C0424616DE9003D8BB8 /* AppDelegate.swift */; };
- 61441C0C24616DE9003D8BB8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61441C0A24616DE9003D8BB8 /* Main.storyboard */; };
+ 6134CDB12A691E850061CCD9 /* BatchMetricsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6134CDB02A691E850061CCD9 /* BatchMetricsTests.swift */; };
+ 6134CDB22A691E850061CCD9 /* BatchMetricsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6134CDB02A691E850061CCD9 /* BatchMetricsTests.swift */; };
+ 61363D9F24D99BAA0084CD6F /* DDErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61363D9E24D99BAA0084CD6F /* DDErrorTests.swift */; };
+ 6136CB4A2A69C29C00AC265D /* FilesOrchestrator+MetricsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6136CB492A69C29C00AC265D /* FilesOrchestrator+MetricsTests.swift */; };
+ 6136CB4B2A69C29C00AC265D /* FilesOrchestrator+MetricsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6136CB492A69C29C00AC265D /* FilesOrchestrator+MetricsTests.swift */; };
+ 6139CD712589FAFD007E8BB7 /* Retrying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6139CD702589FAFD007E8BB7 /* Retrying.swift */; };
+ 6139CD772589FEE3007E8BB7 /* RetryingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6139CD762589FEE3007E8BB7 /* RetryingTests.swift */; };
+ 613E792F2577B0F900DFCC17 /* Reader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E792E2577B0F900DFCC17 /* Reader.swift */; };
+ 613E793B2577B6EE00DFCC17 /* DataReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E793A2577B6EE00DFCC17 /* DataReader.swift */; };
+ 613F9C182BAC3527007C7606 /* DatadogCore+FeatureDataStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613F9C172BAC3527007C7606 /* DatadogCore+FeatureDataStoreTests.swift */; };
+ 613F9C192BAC3527007C7606 /* DatadogCore+FeatureDataStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613F9C172BAC3527007C7606 /* DatadogCore+FeatureDataStoreTests.swift */; };
+ 613F9C1B2BB03188007C7606 /* FeatureScopeMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613F9C1A2BB03188007C7606 /* FeatureScopeMock.swift */; };
+ 613F9C1C2BB03188007C7606 /* FeatureScopeMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613F9C1A2BB03188007C7606 /* FeatureScopeMock.swift */; };
+ 614396722A67D74F00197326 /* BatchMetrics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614396712A67D74F00197326 /* BatchMetrics.swift */; };
+ 614396732A67D74F00197326 /* BatchMetrics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614396712A67D74F00197326 /* BatchMetrics.swift */; };
+ 61441C0524616DE9003D8BB8 /* ExampleAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C0424616DE9003D8BB8 /* ExampleAppDelegate.swift */; };
+ 61441C0C24616DE9003D8BB8 /* Main iOS.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61441C0A24616DE9003D8BB8 /* Main iOS.storyboard */; };
61441C0E24616DEC003D8BB8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 61441C0D24616DEC003D8BB8 /* Assets.xcassets */; };
- 61441C1124616DEC003D8BB8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61441C0F24616DEC003D8BB8 /* LaunchScreen.storyboard */; };
- 61441C4024617013003D8BB8 /* IntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C3B24617013003D8BB8 /* IntegrationTests.swift */; };
- 61441C4124617013003D8BB8 /* LoggingIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C3C24617013003D8BB8 /* LoggingIntegrationTests.swift */; };
- 61441C44246174CE003D8BB8 /* HTTPServerMock in Frameworks */ = {isa = PBXBuildFile; productRef = 61441C43246174CE003D8BB8 /* HTTPServerMock */; };
- 61441C4924618052003D8BB8 /* JSONDataMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BE624519A3700F2C652 /* JSONDataMatcher.swift */; };
- 61441C4A24618052003D8BB8 /* LogMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C432423990D00786299 /* LogMatcher.swift */; };
- 61441C4B24618052003D8BB8 /* SpanMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45ED02451A8730061DAC7 /* SpanMatcher.swift */; };
- 61441C4E24619498003D8BB8 /* Datadog.framework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* Datadog.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 61441C6D24619FE4003D8BB8 /* Datadog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* Datadog.framework */; platformFilter = ios; };
- 61441C7A2461A204003D8BB8 /* LoggingBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C782461A204003D8BB8 /* LoggingBenchmarkTests.swift */; };
- 61441C7B2461A204003D8BB8 /* LoggingStorageBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C792461A204003D8BB8 /* LoggingStorageBenchmarkTests.swift */; };
- 61441C7C2461A244003D8BB8 /* TestsDirectory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C462423990D00786299 /* TestsDirectory.swift */; };
61441C952461A649003D8BB8 /* ConsoleOutputInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C902461A648003D8BB8 /* ConsoleOutputInterceptor.swift */; };
61441C962461A649003D8BB8 /* UIButton+Disabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C912461A648003D8BB8 /* UIButton+Disabling.swift */; };
- 61441C972461A649003D8BB8 /* UIViewController+KeyboardControlling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C922461A648003D8BB8 /* UIViewController+KeyboardControlling.swift */; };
61441C982461A649003D8BB8 /* DebugTracingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C932461A649003D8BB8 /* DebugTracingViewController.swift */; };
61441C992461A649003D8BB8 /* DebugLoggingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C942461A649003D8BB8 /* DebugLoggingViewController.swift */; };
- 61441C9D2461A796003D8BB8 /* AppConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C9C2461A796003D8BB8 /* AppConfig.swift */; };
- 614872772485067300E3EBDB /* SpanTagsReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614872762485067300E3EBDB /* SpanTagsReducer.swift */; };
- 614E9EB3244719FA007EE3E1 /* BundleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614E9EB2244719FA007EE3E1 /* BundleType.swift */; };
+ 614798962A459AA80095CB02 /* DDTraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614798952A459AA80095CB02 /* DDTraceTests.swift */; };
+ 614798972A459AA80095CB02 /* DDTraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614798952A459AA80095CB02 /* DDTraceTests.swift */; };
+ 614798992A459B2E0095CB02 /* DDTraceConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614798982A459B2E0095CB02 /* DDTraceConfigurationTests.swift */; };
+ 6147989A2A459B2E0095CB02 /* DDTraceConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614798982A459B2E0095CB02 /* DDTraceConfigurationTests.swift */; };
+ 6147989C2A459E2B0095CB02 /* DDTrace+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6147989B2A459E2B0095CB02 /* DDTrace+apiTests.m */; };
+ 6147989D2A459E2B0095CB02 /* DDTrace+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6147989B2A459E2B0095CB02 /* DDTrace+apiTests.m */; };
+ 6147989E2A45A42C0095CB02 /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25EE93429C4C3C300CE3839 /* DatadogTrace.framework */; };
+ 614798A02A45A46B0095CB02 /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2C1A55A29C4F2DF00946C31 /* DatadogTrace.framework */; };
+ 614798A22A45A48F0095CB02 /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2C1A55A29C4F2DF00946C31 /* DatadogTrace.framework */; };
+ 614798A32A45A4980095CB02 /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25EE93429C4C3C300CE3839 /* DatadogTrace.framework */; };
+ 6147E3B3270486920092BC9F /* TraceConfigurationE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6147E3B2270486920092BC9F /* TraceConfigurationE2ETests.swift */; };
+ 614A708E2BF754D800D9AF42 /* ImmutableRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614A708D2BF754D700D9AF42 /* ImmutableRequest.swift */; };
+ 614A708F2BF754D800D9AF42 /* ImmutableRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614A708D2BF754D700D9AF42 /* ImmutableRequest.swift */; };
+ 614B78F1296D7B63009C6B92 /* LowPowerModePublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B78EC296D7B63009C6B92 /* LowPowerModePublisherTests.swift */; };
+ 614B78F2296D7B63009C6B92 /* LowPowerModePublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B78EC296D7B63009C6B92 /* LowPowerModePublisherTests.swift */; };
+ 614CADD72510BAC000B93D2D /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614CADD62510BAC000B93D2D /* Environment.swift */; };
+ 614ED36C260352DC00C8C519 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; };
+ 615192CD2BD6948B0005A782 /* HTTPHeadersWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615192CC2BD6948B0005A782 /* HTTPHeadersWriterTests.swift */; };
+ 615192CE2BD6948B0005A782 /* HTTPHeadersWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615192CC2BD6948B0005A782 /* HTTPHeadersWriterTests.swift */; };
+ 615192D02BD6B7C90005A782 /* DatadogTracer+InjectAndExtract.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615192CF2BD6B7C90005A782 /* DatadogTracer+InjectAndExtract.swift */; };
+ 615192D12BD6B7C90005A782 /* DatadogTracer+InjectAndExtract.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615192CF2BD6B7C90005A782 /* DatadogTracer+InjectAndExtract.swift */; };
+ 6156A9072BF75A7C00DF66C3 /* ImmutableRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6156A9062BF75A7C00DF66C3 /* ImmutableRequestTests.swift */; };
+ 6156A9082BF75A7C00DF66C3 /* ImmutableRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6156A9062BF75A7C00DF66C3 /* ImmutableRequestTests.swift */; };
61570005246AADFA00E96950 /* DatadogObjc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133BF0242397DA00786299 /* DatadogObjc.framework */; };
- 61570006246AAE5E00E96950 /* DatadogObjc.framework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 61133BF0242397DA00786299 /* DatadogObjc.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 61570007246AAED100E96950 /* DatadogObjc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133BF0242397DA00786299 /* DatadogObjc.framework */; };
- 615A4A8324A3431600233986 /* Tracer+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8224A3431600233986 /* Tracer+objc.swift */; };
- 615A4A8524A3445700233986 /* TracerConfiguration+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8424A3445700233986 /* TracerConfiguration+objc.swift */; };
- 615A4A8724A3452800233986 /* DDTracerConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8624A3452800233986 /* DDTracerConfigurationTests.swift */; };
+ 615A4A8324A3431600233986 /* Trace+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8224A3431600233986 /* Trace+objc.swift */; };
615A4A8924A34FD700233986 /* DDTracerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8824A34FD700233986 /* DDTracerTests.swift */; };
615A4A8B24A3568900233986 /* OTSpan+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8A24A3568900233986 /* OTSpan+objc.swift */; };
615A4A8D24A356A000233986 /* OTSpanContext+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8C24A356A000233986 /* OTSpanContext+objc.swift */; };
- 617CEB392456BC3A00AD4669 /* TracingUUID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617CEB382456BC3A00AD4669 /* TracingUUID.swift */; };
+ 615B0F8B2BB33C2800E9ED6C /* AppHangsMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615B0F8A2BB33C2800E9ED6C /* AppHangsMonitorTests.swift */; };
+ 615B0F8C2BB33C2800E9ED6C /* AppHangsMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615B0F8A2BB33C2800E9ED6C /* AppHangsMonitorTests.swift */; };
+ 615B0F8E2BB33E0400E9ED6C /* DataStoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615B0F8D2BB33E0400E9ED6C /* DataStoreMock.swift */; };
+ 615B0F8F2BB33E0400E9ED6C /* DataStoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615B0F8D2BB33E0400E9ED6C /* DataStoreMock.swift */; };
+ 615CC40C2694A56D0005F08C /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615CC40B2694A56D0005F08C /* SwiftExtensions.swift */; };
+ 615CC4102694A64D0005F08C /* SwiftExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615CC40F2694A64D0005F08C /* SwiftExtensionTests.swift */; };
+ 615CC4132695957C0005F08C /* CrashReportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615CC4122695957C0005F08C /* CrashReportTests.swift */; };
+ 615D52B82C888C1F00F8B8FC /* SynchronizedAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615D52B72C888C1F00F8B8FC /* SynchronizedAttributes.swift */; };
+ 615D52B92C888C1F00F8B8FC /* SynchronizedAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615D52B72C888C1F00F8B8FC /* SynchronizedAttributes.swift */; };
+ 615D52BB2C88A83A00F8B8FC /* SynchronizedTags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615D52BA2C88A83A00F8B8FC /* SynchronizedTags.swift */; };
+ 615D52BC2C88A83A00F8B8FC /* SynchronizedTags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615D52BA2C88A83A00F8B8FC /* SynchronizedTags.swift */; };
+ 615D52BE2C88A98300F8B8FC /* SynchronizedTagsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615D52BD2C88A98300F8B8FC /* SynchronizedTagsTests.swift */; };
+ 615D52BF2C88A98300F8B8FC /* SynchronizedTagsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615D52BD2C88A98300F8B8FC /* SynchronizedTagsTests.swift */; };
+ 615D52C12C88AB1E00F8B8FC /* SynchronizedAttributesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615D52C02C88AB1E00F8B8FC /* SynchronizedAttributesTests.swift */; };
+ 615D52C22C88AB1E00F8B8FC /* SynchronizedAttributesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615D52C02C88AB1E00F8B8FC /* SynchronizedAttributesTests.swift */; };
+ 6167C79326665D6900D4CF07 /* E2EUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167C79226665D6900D4CF07 /* E2EUtils.swift */; };
+ 6167C7952666622800D4CF07 /* LoggingE2EHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167C7942666622800D4CF07 /* LoggingE2EHelpers.swift */; };
+ 6167E6D32B7F8B3300C3CA2D /* AppHangsMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6D22B7F8B3300C3CA2D /* AppHangsMonitor.swift */; };
+ 6167E6D42B7F8B3300C3CA2D /* AppHangsMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6D22B7F8B3300C3CA2D /* AppHangsMonitor.swift */; };
+ 6167E6D62B7F8C3400C3CA2D /* AppHangsWatchdogThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6D52B7F8C3400C3CA2D /* AppHangsWatchdogThread.swift */; };
+ 6167E6D72B7F8C3400C3CA2D /* AppHangsWatchdogThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6D52B7F8C3400C3CA2D /* AppHangsWatchdogThread.swift */; };
+ 6167E6DA2B8004A500C3CA2D /* AppHangsWatchdogThreadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6D92B8004A500C3CA2D /* AppHangsWatchdogThreadTests.swift */; };
+ 6167E6DB2B8004A500C3CA2D /* AppHangsWatchdogThreadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6D92B8004A500C3CA2D /* AppHangsWatchdogThreadTests.swift */; };
+ 6167E6DD2B811A8300C3CA2D /* AppHangsMonitoringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6DC2B811A8300C3CA2D /* AppHangsMonitoringTests.swift */; };
+ 6167E6DE2B811A8300C3CA2D /* AppHangsMonitoringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6DC2B811A8300C3CA2D /* AppHangsMonitoringTests.swift */; };
+ 6167E6E22B81207200C3CA2D /* DDCrashReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6E12B81207200C3CA2D /* DDCrashReport.swift */; };
+ 6167E6E32B81207200C3CA2D /* DDCrashReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6E12B81207200C3CA2D /* DDCrashReport.swift */; };
+ 6167E6E82B8122E900C3CA2D /* BacktraceReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6E72B8122E900C3CA2D /* BacktraceReport.swift */; };
+ 6167E6E92B8122E900C3CA2D /* BacktraceReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6E72B8122E900C3CA2D /* BacktraceReport.swift */; };
+ 6167E6F62B81E94C00C3CA2D /* DDThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6F52B81E94C00C3CA2D /* DDThread.swift */; };
+ 6167E6F72B81E94C00C3CA2D /* DDThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6F52B81E94C00C3CA2D /* DDThread.swift */; };
+ 6167E6F92B81E95900C3CA2D /* BinaryImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6F82B81E95900C3CA2D /* BinaryImage.swift */; };
+ 6167E6FA2B81E95900C3CA2D /* BinaryImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6F82B81E95900C3CA2D /* BinaryImage.swift */; };
+ 6167E6FD2B81EC0400C3CA2D /* BacktraceReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6FC2B81EC0400C3CA2D /* BacktraceReporter.swift */; };
+ 6167E6FE2B81EC0400C3CA2D /* BacktraceReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6FC2B81EC0400C3CA2D /* BacktraceReporter.swift */; };
+ 6167E7002B81EF7500C3CA2D /* BacktraceReportingFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6FF2B81EF7500C3CA2D /* BacktraceReportingFeature.swift */; };
+ 6167E7012B81EF7500C3CA2D /* BacktraceReportingFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E6FF2B81EF7500C3CA2D /* BacktraceReportingFeature.swift */; };
+ 6167E7032B81F2EB00C3CA2D /* BacktraceReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7022B81F2EB00C3CA2D /* BacktraceReporter.swift */; };
+ 6167E7042B81F2EB00C3CA2D /* BacktraceReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7022B81F2EB00C3CA2D /* BacktraceReporter.swift */; };
+ 6167E7062B82A9FD00C3CA2D /* GeneratingBacktraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7052B82A9FD00C3CA2D /* GeneratingBacktraceTests.swift */; };
+ 6167E7072B82A9FD00C3CA2D /* GeneratingBacktraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7052B82A9FD00C3CA2D /* GeneratingBacktraceTests.swift */; };
+ 6167E70E2B83502200C3CA2D /* DatadogCore+FeatureDirectoriesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E70D2B83502200C3CA2D /* DatadogCore+FeatureDirectoriesTests.swift */; };
+ 6167E70F2B83502200C3CA2D /* DatadogCore+FeatureDirectoriesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E70D2B83502200C3CA2D /* DatadogCore+FeatureDirectoriesTests.swift */; };
+ 6167E7142B837F0B00C3CA2D /* BacktraceReportingMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7112B837F0B00C3CA2D /* BacktraceReportingMocks.swift */; };
+ 6167E7152B837F0B00C3CA2D /* BacktraceReportingMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7112B837F0B00C3CA2D /* BacktraceReportingMocks.swift */; };
+ 6167E71B2B837F7A00C3CA2D /* BacktraceReportMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7182B837F7A00C3CA2D /* BacktraceReportMocks.swift */; };
+ 6167E71C2B837F7A00C3CA2D /* BacktraceReportMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7182B837F7A00C3CA2D /* BacktraceReportMocks.swift */; };
+ 6167E7202B837FB200C3CA2D /* DDThreadMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E71D2B837FB200C3CA2D /* DDThreadMocks.swift */; };
+ 6167E7212B837FB200C3CA2D /* DDThreadMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E71D2B837FB200C3CA2D /* DDThreadMocks.swift */; };
+ 6167E7252B837FF100C3CA2D /* BinaryImageMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7222B837FF100C3CA2D /* BinaryImageMocks.swift */; };
+ 6167E7262B837FF100C3CA2D /* BinaryImageMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7222B837FF100C3CA2D /* BinaryImageMocks.swift */; };
+ 6167E7292B84C11900C3CA2D /* DDCrashReportMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7282B84C11900C3CA2D /* DDCrashReportMocks.swift */; };
+ 6167E72A2B84C11900C3CA2D /* DDCrashReportMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E7282B84C11900C3CA2D /* DDCrashReportMocks.swift */; };
+ 6167E72C2B84C72B00C3CA2D /* UIKitHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E72B2B84C72B00C3CA2D /* UIKitHelpers.swift */; };
+ 6167E72D2B84C72B00C3CA2D /* UIKitHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6167E72B2B84C72B00C3CA2D /* UIKitHelpers.swift */; };
+ 616AAA6D2BDA674C00AB9DAD /* TraceSamplingStrategy+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616AAA6C2BDA674C00AB9DAD /* TraceSamplingStrategy+objc.swift */; };
+ 616AAA6E2BDA674C00AB9DAD /* TraceSamplingStrategy+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616AAA6C2BDA674C00AB9DAD /* TraceSamplingStrategy+objc.swift */; };
+ 616B668E259CC28E00968EE8 /* DDRUMMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616B668D259CC28E00968EE8 /* DDRUMMonitorTests.swift */; };
+ 616F8C272BB1CD990061EA53 /* ProcessIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616F8C262BB1CD990061EA53 /* ProcessIdentifier.swift */; };
+ 616F8C282BB1CD990061EA53 /* ProcessIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616F8C262BB1CD990061EA53 /* ProcessIdentifier.swift */; };
+ 6170DC1C25C18729003AED5C /* PLCrashReporterPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6170DC1B25C18729003AED5C /* PLCrashReporterPlugin.swift */; };
+ 6172472725D673D7007085B3 /* CrashContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6172472625D673D7007085B3 /* CrashContextTests.swift */; };
+ 617247AF25DA9BEA007085B3 /* CrashReportingObjcHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 617247AE25DA9BEA007085B3 /* CrashReportingObjcHelpers.m */; };
+ 617247B825DAB0E2007085B3 /* DDCrashReportBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617247B725DAB0E2007085B3 /* DDCrashReportBuilder.swift */; };
+ 6174D6042BFB9AB600EC7469 /* WebViewTracking+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D6032BFB9AB600EC7469 /* WebViewTracking+objc.swift */; };
+ 6174D6062BFB9D6400EC7469 /* DDWebViewTracking+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6174D6052BFB9D5500EC7469 /* DDWebViewTracking+apiTests.m */; };
+ 6174D60C2BFDDEDF00EC7469 /* SDKMetricFields.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D60B2BFDDEDF00EC7469 /* SDKMetricFields.swift */; };
+ 6174D60D2BFDDEDF00EC7469 /* SDKMetricFields.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D60B2BFDDEDF00EC7469 /* SDKMetricFields.swift */; };
+ 6174D6102BFDEA4600EC7469 /* SessionEndedMetric.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D60F2BFDEA4600EC7469 /* SessionEndedMetric.swift */; };
+ 6174D6112BFDEA4600EC7469 /* SessionEndedMetric.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D60F2BFDEA4600EC7469 /* SessionEndedMetric.swift */; };
+ 6174D6132BFDF16C00EC7469 /* BundleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D6122BFDF16C00EC7469 /* BundleType.swift */; };
+ 6174D6142BFDF16C00EC7469 /* BundleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D6122BFDF16C00EC7469 /* BundleType.swift */; };
+ 6174D6162BFDF29B00EC7469 /* BundleTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D6152BFDF29B00EC7469 /* BundleTypeTests.swift */; };
+ 6174D6172BFDF29B00EC7469 /* BundleTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D6152BFDF29B00EC7469 /* BundleTypeTests.swift */; };
+ 6174D61A2BFE449300EC7469 /* SessionEndedMetricTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D6192BFE449300EC7469 /* SessionEndedMetricTests.swift */; };
+ 6174D61B2BFE449300EC7469 /* SessionEndedMetricTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D6192BFE449300EC7469 /* SessionEndedMetricTests.swift */; };
+ 6174D61D2C007B3300EC7469 /* ModuleName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D61C2C007B3300EC7469 /* ModuleName.swift */; };
+ 6174D61E2C007B3300EC7469 /* ModuleName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D61C2C007B3300EC7469 /* ModuleName.swift */; };
+ 6174D6202C009C6300EC7469 /* SessionEndedMetricController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D61F2C009C6300EC7469 /* SessionEndedMetricController.swift */; };
+ 6174D6212C009C6300EC7469 /* SessionEndedMetricController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6174D61F2C009C6300EC7469 /* SessionEndedMetricController.swift */; };
+ 6175922B2A6FA8EE0073F431 /* DatadogSessionReplay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6133D1F52A6ED9E100384BEF /* DatadogSessionReplay.framework */; };
+ 6175922D2A6FADDD0073F431 /* DatadogSessionReplay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6133D1F52A6ED9E100384BEF /* DatadogSessionReplay.framework */; };
+ 6175C3512BCE66DB006FAAB0 /* TraceContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6175C3502BCE66DB006FAAB0 /* TraceContext.swift */; };
+ 6175C3522BCE66DB006FAAB0 /* TraceContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6175C3502BCE66DB006FAAB0 /* TraceContext.swift */; };
+ 617699182A860D9D0030022B /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617699172A860D9D0030022B /* HTTPClient.swift */; };
+ 617699192A860D9D0030022B /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617699172A860D9D0030022B /* HTTPClient.swift */; };
+ 6176991B2A86121B0030022B /* HTTPClientMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6176991A2A86121B0030022B /* HTTPClientMock.swift */; };
+ 6176991C2A86121B0030022B /* HTTPClientMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6176991A2A86121B0030022B /* HTTPClientMock.swift */; };
+ 6176991E2A8791880030022B /* Datadog+MultipleInstancesIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6176991D2A8791880030022B /* Datadog+MultipleInstancesIntegrationTests.swift */; };
+ 6176991F2A8791880030022B /* Datadog+MultipleInstancesIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6176991D2A8791880030022B /* Datadog+MultipleInstancesIntegrationTests.swift */; };
+ 617699212A8A7DF50030022B /* DebugManualTraceInjectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617699202A8A7DF50030022B /* DebugManualTraceInjectionViewController.swift */; };
+ 6176C1722ABDBA2E00131A70 /* MonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6176C1712ABDBA2E00131A70 /* MonitorTests.swift */; };
+ 6176C1732ABDBA2E00131A70 /* MonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6176C1712ABDBA2E00131A70 /* MonitorTests.swift */; };
+ 61776CED273BEA5500F93802 /* DebugRUMSessionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61776CEC273BEA5500F93802 /* DebugRUMSessionViewController.swift */; };
+ 61776D4E273E6D9F00F93802 /* SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61776D4D273E6D9F00F93802 /* SwiftUI.swift */; };
+ 6179DB562B6022EA00E9E04E /* SendingCrashReportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6179DB552B6022EA00E9E04E /* SendingCrashReportTests.swift */; };
+ 6179DB572B6022EA00E9E04E /* SendingCrashReportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6179DB552B6022EA00E9E04E /* SendingCrashReportTests.swift */; };
+ 6179FFD3254ADB1700556A0B /* ObjcAppLaunchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6179FFD2254ADB1100556A0B /* ObjcAppLaunchHandler.m */; };
+ 6179FFDE254ADBEF00556A0B /* ObjcAppLaunchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6179FFD1254ADB1100556A0B /* ObjcAppLaunchHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 617B953D24BF4D8F00E6F443 /* RUMMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617B953C24BF4D8F00E6F443 /* RUMMonitorTests.swift */; };
+ 617B954224BF4E7600E6F443 /* RUMMonitorConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617B954124BF4E7600E6F443 /* RUMMonitorConfigurationTests.swift */; };
+ 618236892710560900125326 /* DebugWebviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618236882710560900125326 /* DebugWebviewViewController.swift */; };
+ 618353BC2A69470A0085F84A /* CoreMetricsIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618353BB2A69470A0085F84A /* CoreMetricsIntegrationTests.swift */; };
+ 618353BD2A69470A0085F84A /* CoreMetricsIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618353BB2A69470A0085F84A /* CoreMetricsIntegrationTests.swift */; };
+ 6184751526EFCF1300C7C9C5 /* DatadogTestsObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6184751426EFCF1300C7C9C5 /* DatadogTestsObserver.swift */; };
+ 6184751826EFD03400C7C9C5 /* DatadogTestsObserverLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 6184751726EFD03400C7C9C5 /* DatadogTestsObserverLoader.m */; };
+ 6185F4AE26FE1956001A7641 /* SpanE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6185F4AD26FE1956001A7641 /* SpanE2ETests.swift */; };
+ 6187A53926FCBE240015D94A /* TracerE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6187A53826FCBE240015D94A /* TracerE2ETests.swift */; };
+ 6188697C2A4376F700E8996B /* RUMConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6188697B2A4376F700E8996B /* RUMConfigurationTests.swift */; };
+ 6188697D2A4376F700E8996B /* RUMConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6188697B2A4376F700E8996B /* RUMConfigurationTests.swift */; };
+ 6188900F2AC58B8C00D0B966 /* TelemetryReceiverMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6188900E2AC58B8C00D0B966 /* TelemetryReceiverMock.swift */; };
+ 618890102AC58B8C00D0B966 /* TelemetryReceiverMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6188900E2AC58B8C00D0B966 /* TelemetryReceiverMock.swift */; };
+ 618C0FC02B482F6800266B38 /* SpanWriteContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618C0FBF2B482F6800266B38 /* SpanWriteContextTests.swift */; };
+ 618C0FC12B482F6800266B38 /* SpanWriteContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618C0FBF2B482F6800266B38 /* SpanWriteContextTests.swift */; };
618C365F248E85B400520CDE /* DateFormattingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618C365E248E85B400520CDE /* DateFormattingTests.swift */; };
- 61AD4E182451C7FF006E34EA /* TracingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AD4E172451C7FF006E34EA /* TracingFeatureMocks.swift */; };
- 61AD4E3824531500006E34EA /* DataFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AD4E3724531500006E34EA /* DataFormat.swift */; };
- 61AD4E3A24534075006E34EA /* TracingFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AD4E3924534075006E34EA /* TracingFeatureTests.swift */; };
- 61B558CF2469561C001460D3 /* LoggerBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B558CE2469561C001460D3 /* LoggerBuilderTests.swift */; };
- 61B558D42469CDD8001460D3 /* TracingUUIDGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B558D32469CDD8001460D3 /* TracingUUIDGeneratorTests.swift */; };
- 61B9ED1C2461E12000C0DCFF /* SendLogsFixtureViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B9ED1A2461E12000C0DCFF /* SendLogsFixtureViewController.swift */; };
- 61B9ED1D2461E12000C0DCFF /* SendTracesFixtureViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B9ED1B2461E12000C0DCFF /* SendTracesFixtureViewController.swift */; };
- 61B9ED1F2461E57700C0DCFF /* UITestsHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B9ED1E2461E57700C0DCFF /* UITestsHelpers.swift */; };
- 61B9ED212462089600C0DCFF /* TracingIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B9ED202462089600C0DCFF /* TracingIntegrationTests.swift */; };
+ 618F9843265BC486009959F8 /* E2EInstrumentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618F9842265BC486009959F8 /* E2EInstrumentationTests.swift */; };
+ 618F984E265BC905009959F8 /* E2EConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618F984D265BC905009959F8 /* E2EConfig.swift */; };
+ 618F984F265BC905009959F8 /* E2EConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618F984D265BC905009959F8 /* E2EConfig.swift */; };
+ 6194B92A2BB4116A00179430 /* RUMDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194B9292BB4116A00179430 /* RUMDataStore.swift */; };
+ 6194B92B2BB4116A00179430 /* RUMDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194B9292BB4116A00179430 /* RUMDataStore.swift */; };
+ 6194B92D2BB43F9C00179430 /* FatalErrorContextNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194B92C2BB43F9C00179430 /* FatalErrorContextNotifier.swift */; };
+ 6194B92E2BB43F9C00179430 /* FatalErrorContextNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194B92C2BB43F9C00179430 /* FatalErrorContextNotifier.swift */; };
+ 6194B9302BB451C100179430 /* NonFatalAppHangsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194B92F2BB451C100179430 /* NonFatalAppHangsHandler.swift */; };
+ 6194B9312BB451C100179430 /* NonFatalAppHangsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194B92F2BB451C100179430 /* NonFatalAppHangsHandler.swift */; };
+ 6194B9332BB451DB00179430 /* FatalAppHangsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194B9322BB451DB00179430 /* FatalAppHangsHandler.swift */; };
+ 6194B9342BB451DB00179430 /* FatalAppHangsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194B9322BB451DB00179430 /* FatalAppHangsHandler.swift */; };
+ 6199362E265BA959009D7EA8 /* E2EAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6199362D265BA959009D7EA8 /* E2EAppDelegate.swift */; };
+ 61993637265BA95A009D7EA8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 61993636265BA95A009D7EA8 /* Assets.xcassets */; };
+ 6199363A265BA95A009D7EA8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61993638265BA95A009D7EA8 /* LaunchScreen.storyboard */; };
+ 61993657265BB6A6009D7EA8 /* DatadogCore.framework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* DatadogCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 6199365B265BB6A6009D7EA8 /* DatadogCrashReporting.framework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 61B7885425C180CB002675B5 /* DatadogCrashReporting.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 61993668265BBEDC009D7EA8 /* E2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61993667265BBEDC009D7EA8 /* E2ETests.swift */; };
+ 619A29F326E64910007D62A3 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; };
+ 619CE75E2A458CE1005588CB /* TraceConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619CE75D2A458CE1005588CB /* TraceConfigurationTests.swift */; };
+ 619CE75F2A458CE1005588CB /* TraceConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619CE75D2A458CE1005588CB /* TraceConfigurationTests.swift */; };
+ 619CE7612A458D66005588CB /* TraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619CE7602A458D66005588CB /* TraceTests.swift */; };
+ 619CE7622A458D66005588CB /* TraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619CE7602A458D66005588CB /* TraceTests.swift */; };
+ 619F5CEC2BF5089C004BFE70 /* GlobalRUMAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619F5CEA2BF5089B004BFE70 /* GlobalRUMAttributes.swift */; };
+ 619F5CED2BF508A4004BFE70 /* GlobalRUMAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619F5CEA2BF5089B004BFE70 /* GlobalRUMAttributes.swift */; };
+ 61A1A44929643254007909E7 /* DatadogCoreProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A1A44829643254007909E7 /* DatadogCoreProxy.swift */; };
+ 61A1A44A29643254007909E7 /* DatadogCoreProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A1A44829643254007909E7 /* DatadogCoreProxy.swift */; };
+ 61A2CC212A443D330000FF25 /* DDRUMConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC202A443D330000FF25 /* DDRUMConfigurationTests.swift */; };
+ 61A2CC222A443D330000FF25 /* DDRUMConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC202A443D330000FF25 /* DDRUMConfigurationTests.swift */; };
+ 61A2CC242A44454D0000FF25 /* DDRUMTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC232A44454D0000FF25 /* DDRUMTests.swift */; };
+ 61A2CC252A44454D0000FF25 /* DDRUMTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC232A44454D0000FF25 /* DDRUMTests.swift */; };
+ 61A2CC262A4449210000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; };
+ 61A2CC2B2A4449300000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23F8E9929DDCD28001CFAE8 /* DatadogRUM.framework */; };
+ 61A2CC302A4449CB0000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; };
+ 61A2CC312A4449D70000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23F8E9929DDCD28001CFAE8 /* DatadogRUM.framework */; };
+ 61A2CC332A44A5F60000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; };
+ 61A2CC342A44A6030000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23F8E9929DDCD28001CFAE8 /* DatadogRUM.framework */; };
+ 61A2CC362A44B0A20000FF25 /* TraceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC352A44B0A20000FF25 /* TraceConfiguration.swift */; };
+ 61A2CC372A44B0A20000FF25 /* TraceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC352A44B0A20000FF25 /* TraceConfiguration.swift */; };
+ 61A2CC392A44B0EA0000FF25 /* Trace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC382A44B0EA0000FF25 /* Trace.swift */; };
+ 61A2CC3A2A44B0EA0000FF25 /* Trace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC382A44B0EA0000FF25 /* Trace.swift */; };
+ 61A2CC3C2A44BED30000FF25 /* Tracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC3B2A44BED30000FF25 /* Tracer.swift */; };
+ 61A2CC3D2A44BED30000FF25 /* Tracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC3B2A44BED30000FF25 /* Tracer.swift */; };
+ 61A763DC252DB2B3005A23F2 /* NSURLSessionBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A763DB252DB2B3005A23F2 /* NSURLSessionBridge.m */; };
+ 61AE74142AD6EF55008DB9BB /* JSONObjectMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612C13D22AAA20660086B5D1 /* JSONObjectMatcher.swift */; };
+ 61AE74152AD6EF55008DB9BB /* JSONObjectMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612C13D22AAA20660086B5D1 /* JSONObjectMatcher.swift */; };
+ 61AE74172AD7DA9B008DB9BB /* FeatureMessageMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AE74162AD7DA9B008DB9BB /* FeatureMessageMocks.swift */; };
+ 61AE74182AD7DA9B008DB9BB /* FeatureMessageMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AE74162AD7DA9B008DB9BB /* FeatureMessageMocks.swift */; };
+ 61B3BD52266128D300A9BEF0 /* LoggerE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B3BD51266128D300A9BEF0 /* LoggerE2ETests.swift */; };
+ 61B5E42126DF85C7000B0A5F /* DDRUMMonitor+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5E42026DF85C7000B0A5F /* DDRUMMonitor+apiTests.m */; };
+ 61B5E42726DFB145000B0A5F /* DDDatadog+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5E42626DFB145000B0A5F /* DDDatadog+apiTests.m */; };
+ 61B5E42926DFB60A000B0A5F /* DDConfiguration+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5E42826DFB60A000B0A5F /* DDConfiguration+apiTests.m */; };
+ 61B5E42B26DFC433000B0A5F /* DDNSURLSessionDelegate+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5E42A26DFC433000B0A5F /* DDNSURLSessionDelegate+apiTests.m */; };
+ 61B7885D25C180CB002675B5 /* DatadogCrashReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7885425C180CB002675B5 /* DatadogCrashReporting.framework */; };
+ 61B7886225C180CB002675B5 /* CrashReportingPluginTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B7886125C180CB002675B5 /* CrashReportingPluginTests.swift */; };
+ 61B7886425C180CB002675B5 /* DatadogCrashReporting.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B7885625C180CB002675B5 /* DatadogCrashReporting.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 61B8BA91281812F60068AFF4 /* KronosInternetAddressTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B8BA90281812F60068AFF4 /* KronosInternetAddressTests.swift */; };
+ 61B8BA92281812F60068AFF4 /* KronosInternetAddressTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B8BA90281812F60068AFF4 /* KronosInternetAddressTests.swift */; };
+ 61BAD46A26415FCE001886CA /* OTSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BAD46926415FCE001886CA /* OTSpanTests.swift */; };
61BB2B1B244A185D009F3F56 /* PerformancePreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BB2B1A244A185D009F3F56 /* PerformancePreset.swift */; };
+ 61BBD19724ED50040023E65F /* DatadogConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BBD19624ED50040023E65F /* DatadogConfigurationTests.swift */; };
61C363802436164B00C4D4E6 /* ObjcExceptionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3637F2436164B00C4D4E6 /* ObjcExceptionHandlerTests.swift */; };
- 61C3638324361BE200C4D4E6 /* DatadogPrivateMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3638224361BE200C4D4E6 /* DatadogPrivateMocks.swift */; };
- 61C3638524361E9200C4D4E6 /* Globals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3638424361E9200C4D4E6 /* Globals.swift */; };
- 61C36470243B5C8300C4D4E6 /* ServerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3646F243B5C8300C4D4E6 /* ServerMock.swift */; };
- 61C5A88424509A0C00DA608C /* DDSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87824509A0C00DA608C /* DDSpan.swift */; };
- 61C5A88524509A0C00DA608C /* DDNoOps.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87924509A0C00DA608C /* DDNoOps.swift */; };
- 61C5A88624509A0C00DA608C /* TracingUUIDGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87B24509A0C00DA608C /* TracingUUIDGenerator.swift */; };
- 61C5A88724509A0C00DA608C /* Casting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87C24509A0C00DA608C /* Casting.swift */; };
- 61C5A88824509A0C00DA608C /* Warnings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87D24509A0C00DA608C /* Warnings.swift */; };
- 61C5A88924509A0C00DA608C /* DDSpanContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87E24509A0C00DA608C /* DDSpanContext.swift */; };
- 61C5A88A24509A0C00DA608C /* SpanFileOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A88024509A0C00DA608C /* SpanFileOutput.swift */; };
- 61C5A88B24509A0C00DA608C /* SpanOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A88124509A0C00DA608C /* SpanOutput.swift */; };
- 61C5A88C24509A0C00DA608C /* HTTPHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A88324509A0C00DA608C /* HTTPHeadersWriter.swift */; };
- 61C5A88E24509A1F00DA608C /* Tracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A88D24509A1F00DA608C /* Tracer.swift */; };
- 61C5A89024509AA700DA608C /* TracingFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A88F24509AA700DA608C /* TracingFeature.swift */; };
+ 61C4534A2C0A0BBF00CC4C17 /* TelemetryInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C453492C0A0BBF00CC4C17 /* TelemetryInterceptorTests.swift */; };
+ 61C4534B2C0A0BBF00CC4C17 /* TelemetryInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C453492C0A0BBF00CC4C17 /* TelemetryInterceptorTests.swift */; };
61C5A89624509BF600DA608C /* TracerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89524509BF600DA608C /* TracerTests.swift */; };
- 61C5A89D24509C1100DA608C /* DDSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89824509C1100DA608C /* DDSpanTests.swift */; };
- 61C5A89E24509C1100DA608C /* WarningsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89A24509C1100DA608C /* WarningsTests.swift */; };
- 61C5A89F24509C1100DA608C /* UUID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89B24509C1100DA608C /* UUID.swift */; };
- 61C5A8A024509C1100DA608C /* Casting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89C24509C1100DA608C /* Casting.swift */; };
- 61C5A8A624509FAA00DA608C /* SpanEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A8A424509FAA00DA608C /* SpanEncoder.swift */; };
- 61C5A8A724509FAA00DA608C /* SpanBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A8A524509FAA00DA608C /* SpanBuilder.swift */; };
- 61D447E224917F8F00649287 /* DateFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D447E124917F8F00649287 /* DateFormatting.swift */; };
- 61E45BCF2450A6EC00F2C652 /* TracingUUIDTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BCE2450A6EC00F2C652 /* TracingUUIDTests.swift */; };
- 61E45BD22450F65B00F2C652 /* SpanBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BD12450F65B00F2C652 /* SpanBuilderTests.swift */; };
- 61E45BE5245196EA00F2C652 /* SpanFileOutputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BE4245196EA00F2C652 /* SpanFileOutputTests.swift */; };
+ 61C713A32A3B78F900FA735A /* RUMMonitorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713A02A3B78F900FA735A /* RUMMonitorProtocol.swift */; };
+ 61C713A42A3B78F900FA735A /* RUMMonitorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713A02A3B78F900FA735A /* RUMMonitorProtocol.swift */; };
+ 61C713A52A3B78F900FA735A /* RUMMonitorProtocol+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713A12A3B78F900FA735A /* RUMMonitorProtocol+Internal.swift */; };
+ 61C713A62A3B78F900FA735A /* RUMMonitorProtocol+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713A12A3B78F900FA735A /* RUMMonitorProtocol+Internal.swift */; };
+ 61C713A72A3B78F900FA735A /* RUMMonitorProtocol+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713A22A3B78F900FA735A /* RUMMonitorProtocol+Convenience.swift */; };
+ 61C713A82A3B78F900FA735A /* RUMMonitorProtocol+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713A22A3B78F900FA735A /* RUMMonitorProtocol+Convenience.swift */; };
+ 61C713AA2A3B790B00FA735A /* Monitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713A92A3B790B00FA735A /* Monitor.swift */; };
+ 61C713AB2A3B790B00FA735A /* Monitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713A92A3B790B00FA735A /* Monitor.swift */; };
+ 61C713AD2A3B793E00FA735A /* RUMMonitorProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713AC2A3B793E00FA735A /* RUMMonitorProtocolTests.swift */; };
+ 61C713AE2A3B793E00FA735A /* RUMMonitorProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713AC2A3B793E00FA735A /* RUMMonitorProtocolTests.swift */; };
+ 61C713B32A3C3A0B00FA735A /* RUMMonitorProtocol+InternalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713B22A3C3A0B00FA735A /* RUMMonitorProtocol+InternalTests.swift */; };
+ 61C713B42A3C3A0B00FA735A /* RUMMonitorProtocol+InternalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713B22A3C3A0B00FA735A /* RUMMonitorProtocol+InternalTests.swift */; };
+ 61C713B62A3C600400FA735A /* RUMMonitorProtocol+ConvenienceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713B52A3C600400FA735A /* RUMMonitorProtocol+ConvenienceTests.swift */; };
+ 61C713B72A3C600400FA735A /* RUMMonitorProtocol+ConvenienceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713B52A3C600400FA735A /* RUMMonitorProtocol+ConvenienceTests.swift */; };
+ 61C713B92A3C935C00FA735A /* RUM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713B82A3C935C00FA735A /* RUM.swift */; };
+ 61C713BA2A3C935C00FA735A /* RUM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713B82A3C935C00FA735A /* RUM.swift */; };
+ 61C713BC2A3C95AD00FA735A /* RUMInstrumentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713BB2A3C95AD00FA735A /* RUMInstrumentationTests.swift */; };
+ 61C713BD2A3C95AD00FA735A /* RUMInstrumentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713BB2A3C95AD00FA735A /* RUMInstrumentationTests.swift */; };
+ 61C713C02A3C9DAD00FA735A /* RequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713BF2A3C9DAD00FA735A /* RequestBuilderTests.swift */; };
+ 61C713C12A3C9DAD00FA735A /* RequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713BF2A3C9DAD00FA735A /* RequestBuilderTests.swift */; };
+ 61C713CA2A3DC22700FA735A /* RUMTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713C92A3DC22700FA735A /* RUMTests.swift */; };
+ 61C713CB2A3DC22700FA735A /* RUMTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713C92A3DC22700FA735A /* RUMTests.swift */; };
+ 61C713D02A3DEFF900FA735A /* FeatureRegistrationCoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713CF2A3DEFF900FA735A /* FeatureRegistrationCoreMock.swift */; };
+ 61C713D12A3DEFF900FA735A /* FeatureRegistrationCoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713CF2A3DEFF900FA735A /* FeatureRegistrationCoreMock.swift */; };
+ 61C713D32A3DFB4900FA735A /* FuzzyHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713D22A3DFB4900FA735A /* FuzzyHelpers.swift */; };
+ 61C713D42A3DFB4900FA735A /* FuzzyHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713D22A3DFB4900FA735A /* FuzzyHelpers.swift */; };
+ 61CE2E5F2BF2177100EC7D42 /* Monitor+GlobalAttributesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61CE2E5E2BF2177100EC7D42 /* Monitor+GlobalAttributesTests.swift */; };
+ 61CE2E602BF2177100EC7D42 /* Monitor+GlobalAttributesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61CE2E5E2BF2177100EC7D42 /* Monitor+GlobalAttributesTests.swift */; };
+ 61CE585A2B48174D00479510 /* SpanWriteContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61CE58592B48174D00479510 /* SpanWriteContext.swift */; };
+ 61CE585B2B48174D00479510 /* SpanWriteContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61CE58592B48174D00479510 /* SpanWriteContext.swift */; };
+ 61D03BE0273404E700367DE0 /* RUMDataModels+objcTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D03BDF273404E700367DE0 /* RUMDataModels+objcTests.swift */; };
+ 61D3E0D2277B23F1008BE766 /* KronosInternetAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0C8277B23F0008BE766 /* KronosInternetAddress.swift */; };
+ 61D3E0D3277B23F1008BE766 /* KronosDNSResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0C9277B23F0008BE766 /* KronosDNSResolver.swift */; };
+ 61D3E0D4277B23F1008BE766 /* KronosTimeStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CA277B23F0008BE766 /* KronosTimeStorage.swift */; };
+ 61D3E0D5277B23F1008BE766 /* KronosNTPPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CB277B23F0008BE766 /* KronosNTPPacket.swift */; };
+ 61D3E0D6277B23F1008BE766 /* KronosClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CC277B23F0008BE766 /* KronosClock.swift */; };
+ 61D3E0D7277B23F1008BE766 /* KronosData+Bytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CD277B23F0008BE766 /* KronosData+Bytes.swift */; };
+ 61D3E0D8277B23F1008BE766 /* KronosNTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CE277B23F0008BE766 /* KronosNTPClient.swift */; };
+ 61D3E0D9277B23F1008BE766 /* KronosNTPProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CF277B23F0008BE766 /* KronosNTPProtocol.swift */; };
+ 61D3E0DA277B23F1008BE766 /* KronosTimeFreeze.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0D0277B23F1008BE766 /* KronosTimeFreeze.swift */; };
+ 61D3E0DB277B23F1008BE766 /* KronosNSTimer+ClosureKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0D1277B23F1008BE766 /* KronosNSTimer+ClosureKit.swift */; };
+ 61D3E0E4277B3D92008BE766 /* KronosNTPPacketTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0DF277B3D92008BE766 /* KronosNTPPacketTests.swift */; };
+ 61D3E0E7277B3D92008BE766 /* KronosTimeStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0E2277B3D92008BE766 /* KronosTimeStorageTests.swift */; };
+ 61D3E0EA277E0C58008BE766 /* KronosE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0E9277E0C58008BE766 /* KronosE2ETests.swift */; };
+ 61DA20F026C40121004AFE6D /* DataUploadStatusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA20EF26C40121004AFE6D /* DataUploadStatusTests.swift */; };
+ 61DA6F6C2BB57E32009537E5 /* FatalErrorBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA6F6B2BB57E32009537E5 /* FatalErrorBuilder.swift */; };
+ 61DA6F6D2BB57E32009537E5 /* FatalErrorBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA6F6B2BB57E32009537E5 /* FatalErrorBuilder.swift */; };
+ 61DA8CA928609C5B0074A606 /* Directories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CA828609C5B0074A606 /* Directories.swift */; };
+ 61DA8CAA28609C5B0074A606 /* Directories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CA828609C5B0074A606 /* Directories.swift */; };
+ 61DA8CAC2861C3720074A606 /* DirectoriesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CAB2861C3720074A606 /* DirectoriesTests.swift */; };
+ 61DA8CAD2861C3720074A606 /* DirectoriesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CAB2861C3720074A606 /* DirectoriesTests.swift */; };
+ 61DA8CAF28620C760074A606 /* Cryptography.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CAE28620C760074A606 /* Cryptography.swift */; };
+ 61DA8CB028620C760074A606 /* Cryptography.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CAE28620C760074A606 /* Cryptography.swift */; };
+ 61DA8CB2286215DE0074A606 /* CryptographyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CB1286215DE0074A606 /* CryptographyTests.swift */; };
+ 61DA8CB3286215DE0074A606 /* CryptographyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CB1286215DE0074A606 /* CryptographyTests.swift */; };
+ 61DA8CB828647A500074A606 /* InternalLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CB728647A500074A606 /* InternalLoggerTests.swift */; };
+ 61DA8CB928647A500074A606 /* InternalLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CB728647A500074A606 /* InternalLoggerTests.swift */; };
+ 61DB33B225DEDFC200F7EA71 /* CustomObjcViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61DB33B125DEDFC200F7EA71 /* CustomObjcViewController.m */; };
+ 61DCC8472C05CD0000CB59E5 /* SessionEndedMetricControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DCC8462C05CD0000CB59E5 /* SessionEndedMetricControllerTests.swift */; };
+ 61DCC8482C05CD0000CB59E5 /* SessionEndedMetricControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DCC8462C05CD0000CB59E5 /* SessionEndedMetricControllerTests.swift */; };
+ 61DCC84A2C05D4D600CB59E5 /* RUMSessionEndedMetricIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DCC8492C05D4D600CB59E5 /* RUMSessionEndedMetricIntegrationTests.swift */; };
+ 61DCC84B2C05D4D600CB59E5 /* RUMSessionEndedMetricIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DCC8492C05D4D600CB59E5 /* RUMSessionEndedMetricIntegrationTests.swift */; };
+ 61DCC84E2C071DCD00CB59E5 /* TelemetryInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DCC84D2C071DCD00CB59E5 /* TelemetryInterceptor.swift */; };
+ 61DCC84F2C071DCD00CB59E5 /* TelemetryInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DCC84D2C071DCD00CB59E5 /* TelemetryInterceptor.swift */; };
61E45BE724519A3700F2C652 /* JSONDataMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BE624519A3700F2C652 /* JSONDataMatcher.swift */; };
61E45ED12451A8730061DAC7 /* SpanMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45ED02451A8730061DAC7 /* SpanMatcher.swift */; };
- 61E909ED24A24DD3005EA2DE /* OTSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E624A24DD3005EA2DE /* OTSpan.swift */; };
- 61E909EE24A24DD3005EA2DE /* OTFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E724A24DD3005EA2DE /* OTFormat.swift */; };
- 61E909EF24A24DD3005EA2DE /* OTGlobal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E824A24DD3005EA2DE /* OTGlobal.swift */; };
- 61E909F024A24DD3005EA2DE /* OTTracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E924A24DD3005EA2DE /* OTTracer.swift */; };
- 61E909F124A24DD3005EA2DE /* OTReference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EA24A24DD3005EA2DE /* OTReference.swift */; };
- 61E909F224A24DD3005EA2DE /* OTConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EB24A24DD3005EA2DE /* OTConstants.swift */; };
- 61E909F324A24DD3005EA2DE /* OTSpanContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EC24A24DD3005EA2DE /* OTSpanContext.swift */; };
- 61E909F624A32D1C005EA2DE /* OTGlobalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909F524A32D1C005EA2DE /* OTGlobalTests.swift */; };
- 61E917CF2464270500E6C631 /* EncodableValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E917CE2464270500E6C631 /* EncodableValueTests.swift */; };
- 61E917D12465423600E6C631 /* TracerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E917D02465423600E6C631 /* TracerConfiguration.swift */; };
- 61E917D3246546BF00E6C631 /* TracerConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E917D2246546BF00E6C631 /* TracerConfigurationTests.swift */; };
+ 61E5333824B84EE2003D6C4E /* DebugRUMViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E5333724B84EE2003D6C4E /* DebugRUMViewController.swift */; };
+ 61E8C5082B28898800E709B4 /* StartingRUMSessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E8C5072B28898800E709B4 /* StartingRUMSessionTests.swift */; };
+ 61E8C5092B28898800E709B4 /* StartingRUMSessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E8C5072B28898800E709B4 /* StartingRUMSessionTests.swift */; };
+ 61E95D882695C00200EA3115 /* DDCrashReportExporterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E95D872695C00200EA3115 /* DDCrashReportExporterTests.swift */; };
+ 61ED39D426C2A36B002C0F26 /* DataUploadStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61ED39D326C2A36B002C0F26 /* DataUploadStatus.swift */; };
+ 61EF78C1257F842000EDCCB3 /* FeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61EF78C0257F842000EDCCB3 /* FeatureTests.swift */; };
61F1A61A2498A51700075390 /* CoreMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F1A6192498A51700075390 /* CoreMocks.swift */; };
- 61F1A621249A45E400075390 /* DDSpanContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F1A620249A45E400075390 /* DDSpanContextTests.swift */; };
- 61F1A623249B811200075390 /* Encoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F1A622249B811200075390 /* Encoding.swift */; };
- 61F8CC092469295500FE2908 /* DatadogConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F8CC082469295500FE2908 /* DatadogConfigurationTests.swift */; };
- 61FB222D244A21ED00902D19 /* LoggingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB222C244A21ED00902D19 /* LoggingFeatureMocks.swift */; };
- 61FB2230244E1BE900902D19 /* LoggingFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB222F244E1BE900902D19 /* LoggingFeatureTests.swift */; };
- 9E330A8E24ADE1250031408E /* NSURLSessionBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E330A8D24ADE1250031408E /* NSURLSessionBridge.m */; };
- 9E36D92224373EA700BFBDB7 /* SwiftExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E36D92124373EA700BFBDB7 /* SwiftExtensionsTests.swift */; };
- 9E493E1C249B7BAA005F95F5 /* TracingAutoInstrumentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E493E1B249B7BAA005F95F5 /* TracingAutoInstrumentationTests.swift */; };
- 9E544A4D24752A8900E83072 /* URLSessionSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E544A4C24752A8900E83072 /* URLSessionSwizzlerTests.swift */; };
- 9E544A4F24753C6E00E83072 /* MethodSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E544A4E24753C6E00E83072 /* MethodSwizzler.swift */; };
- 9E544A5124753DDE00E83072 /* MethodSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E544A5024753DDE00E83072 /* MethodSwizzlerTests.swift */; };
- 9E58E8E124615C75008E5063 /* JSONEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E58E8E024615C75008E5063 /* JSONEncoder.swift */; };
+ 61F2723F25C86DA400D54BF8 /* CrashReportingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2723E25C86DA400D54BF8 /* CrashReportingFeatureMocks.swift */; };
+ 61F2724925C943C500D54BF8 /* CrashReporterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2724825C943C500D54BF8 /* CrashReporterTests.swift */; };
+ 61F2727425C9509D00D54BF8 /* ThirdPartyCrashReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2727325C9509D00D54BF8 /* ThirdPartyCrashReporter.swift */; };
+ 61F2728B25C9561A00D54BF8 /* PLCrashReporterIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2728A25C9561A00D54BF8 /* PLCrashReporterIntegration.swift */; };
+ 61F272B125C95ED800D54BF8 /* Mocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2729A25C95EB200D54BF8 /* Mocks.swift */; };
+ 61F3E3632BC5556D00C7881E /* DatadogTracer+SamplingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3E3622BC5556D00C7881E /* DatadogTracer+SamplingTests.swift */; };
+ 61F3E3642BC5556D00C7881E /* DatadogTracer+SamplingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3E3622BC5556D00C7881E /* DatadogTracer+SamplingTests.swift */; };
+ 61F3E3662BC595F600C7881E /* HTTPHeadersReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3E3652BC595F600C7881E /* HTTPHeadersReaderTests.swift */; };
+ 61F3E3672BC595F600C7881E /* HTTPHeadersReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3E3652BC595F600C7881E /* HTTPHeadersReaderTests.swift */; };
+ 61F3E36D2BC7D66700C7881E /* HeadBasedSamplingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3E36C2BC7D66700C7881E /* HeadBasedSamplingTests.swift */; };
+ 61F3E36E2BC7D66700C7881E /* HeadBasedSamplingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3E36C2BC7D66700C7881E /* HeadBasedSamplingTests.swift */; };
+ 61F74AF426F20E4600E5F5ED /* DebugCrashReportingWithRUMViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F74AF326F20E4600E5F5ED /* DebugCrashReportingWithRUMViewController.swift */; };
+ 61F930BE2BA1ACAC005F0EE2 /* Storage+TLV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930BD2BA1ACAC005F0EE2 /* Storage+TLV.swift */; };
+ 61F930BF2BA1ACAC005F0EE2 /* Storage+TLV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930BD2BA1ACAC005F0EE2 /* Storage+TLV.swift */; };
+ 61F930C22BA1C41A005F0EE2 /* TLVBlockReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930C12BA1C41A005F0EE2 /* TLVBlockReader.swift */; };
+ 61F930C32BA1C41A005F0EE2 /* TLVBlockReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930C12BA1C41A005F0EE2 /* TLVBlockReader.swift */; };
+ 61F930C52BA1C4EB005F0EE2 /* TLVBlockReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930C42BA1C4EB005F0EE2 /* TLVBlockReaderTests.swift */; };
+ 61F930C62BA1C4EB005F0EE2 /* TLVBlockReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930C42BA1C4EB005F0EE2 /* TLVBlockReaderTests.swift */; };
+ 61F930C82BA1C51C005F0EE2 /* Storage+TLVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930C72BA1C51C005F0EE2 /* Storage+TLVTests.swift */; };
+ 61F930C92BA1C51C005F0EE2 /* Storage+TLVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930C72BA1C51C005F0EE2 /* Storage+TLVTests.swift */; };
+ 61F930CB2BA213AC005F0EE2 /* AppHang.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930CA2BA213AC005F0EE2 /* AppHang.swift */; };
+ 61F930CC2BA213AC005F0EE2 /* AppHang.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F930CA2BA213AC005F0EE2 /* AppHang.swift */; };
+ 61F9CABA2513A7F5000A5E61 /* RUMSessionMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F9CA982513977A000A5E61 /* RUMSessionMatcher.swift */; };
+ 61FC5F3525CC1898006BB4DE /* CrashContextProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FC5F3425CC1898006BB4DE /* CrashContextProviderTests.swift */; };
+ 61FDBA1326971953001D9D43 /* CrashReportMinifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FDBA1226971953001D9D43 /* CrashReportMinifier.swift */; };
+ 61FDBA15269722B4001D9D43 /* CrashReportMinifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FDBA14269722B4001D9D43 /* CrashReportMinifierTests.swift */; };
+ 61FDBA1726974CA9001D9D43 /* DDCrashReportBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FDBA1626974CA9001D9D43 /* DDCrashReportBuilderTests.swift */; };
+ 61FF282824B8A31E000B3D9B /* RUMEventMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF282724B8A31E000B3D9B /* RUMEventMatcher.swift */; };
+ 960B26C02D0360EE00D7196F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 960B26BF2D0360EE00D7196F /* Assets.xcassets */; };
+ 960B26C32D075BD200D7196F /* DisplayListReflectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 960B26C22D075BD200D7196F /* DisplayListReflectionTests.swift */; };
+ 962C41A72CA431370050B747 /* SessionReplayPrivacyOverrides.swift in Sources */ = {isa = PBXBuildFile; fileRef = 966253B52C98807400B90B63 /* SessionReplayPrivacyOverrides.swift */; };
+ 962C41A82CA431AA0050B747 /* DDSessionReplayOverridesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E863752C9C7E800023BF78 /* DDSessionReplayOverridesTests.swift */; };
+ 962C41A92CB00FD60050B747 /* DDSessionReplayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A434AD2A8E426C0028E329 /* DDSessionReplayTests.swift */; };
+ 962D72BC2CF6436700F86EF0 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 962D72BA2CF6436600F86EF0 /* Image.swift */; };
+ 962D72BD2CF6436700F86EF0 /* Image+Reflection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 962D72BB2CF6436600F86EF0 /* Image+Reflection.swift */; };
+ 962D72BF2CF7538800F86EF0 /* CGImage+SessionReplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 962D72BE2CF7538800F86EF0 /* CGImage+SessionReplay.swift */; };
+ 962D72C52CF7806300F86EF0 /* GraphicsImageReflectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 962D72C42CF7806300F86EF0 /* GraphicsImageReflectionTests.swift */; };
+ 962D72C72CF7815300F86EF0 /* ReflectionMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 962D72C62CF7815300F86EF0 /* ReflectionMocks.swift */; };
+ 96867B992D08826B004AE0BC /* TextReflectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96867B982D08826B004AE0BC /* TextReflectionTests.swift */; };
+ 96867B9B2D0883DD004AE0BC /* ColorReflectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96867B9A2D0883DD004AE0BC /* ColorReflectionTests.swift */; };
+ 969B3B212C33F80500D62400 /* UIActivityIndicatorRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969B3B202C33F80500D62400 /* UIActivityIndicatorRecorder.swift */; };
+ 969B3B232C33F81E00D62400 /* UIActivityIndicatorRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969B3B222C33F81E00D62400 /* UIActivityIndicatorRecorderTests.swift */; };
+ 96D331ED2CFF740700649EE8 /* GraphicImagePrivacyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96D331EC2CFF740700649EE8 /* GraphicImagePrivacyTests.swift */; };
+ 96E414142C2AF56F005A6119 /* UIProgressViewRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E414132C2AF56F005A6119 /* UIProgressViewRecorder.swift */; };
+ 96E414162C2AF5C1005A6119 /* UIProgressViewRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E414152C2AF5C1005A6119 /* UIProgressViewRecorderTests.swift */; };
+ 96E863722C9C547B0023BF78 /* SessionReplayOverrideTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E863712C9C547B0023BF78 /* SessionReplayOverrideTests.swift */; };
+ 96F25A822CC7EA4400459567 /* SessionReplayPrivacyOverrides+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F25A802CC7EA4300459567 /* SessionReplayPrivacyOverrides+objc.swift */; };
+ 96F25A832CC7EA4400459567 /* UIView+SessionReplayPrivacyOverrides+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F25A812CC7EA4300459567 /* UIView+SessionReplayPrivacyOverrides+objc.swift */; };
+ 96F25A852CC7EB3700459567 /* PrivacyOverridesMock+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F25A842CC7EB3700459567 /* PrivacyOverridesMock+objc.swift */; };
+ 96F69D6C2CBE94A800A6178B /* DatadogCoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B78EA296D7B63009C6B92 /* DatadogCoreTests.swift */; };
+ 96F69D6D2CBE94A900A6178B /* DatadogCoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B78EA296D7B63009C6B92 /* DatadogCoreTests.swift */; };
+ 96F69D6E2CBE94F500A6178B /* MockFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71265852B17980C007D63CE /* MockFeature.swift */; };
+ 96F69D6F2CBE94F600A6178B /* MockFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71265852B17980C007D63CE /* MockFeature.swift */; };
+ 9E55407C25812D1C00F6E3AD /* RUM+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E55407B25812D1C00F6E3AD /* RUM+objc.swift */; };
9E58E8E324615EDA008E5063 /* JSONEncoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E58E8E224615EDA008E5063 /* JSONEncoderTests.swift */; };
+ 9E5B6D2E270C84B4002499B8 /* RUMMonitorE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5B6D2D270C84B4002499B8 /* RUMMonitorE2ETests.swift */; };
+ 9E5B6D30270C85AB002499B8 /* RUMUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5B6D2F270C85AB002499B8 /* RUMUtils.swift */; };
+ 9E5B6D32270DE9E5002499B8 /* RUMTrackingConsentE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5B6D31270DE9E5002499B8 /* RUMTrackingConsentE2ETests.swift */; };
+ 9E5BD8042819742200CB568E /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B03ECC274FF00E00EB1AE1 /* SwiftUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
+ 9E5BD8062819742C00CB568E /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E5BD8052819742C00CB568E /* SwiftUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
+ 9E64849D27031071007CCD7B /* RUMGlobalE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E64849C27031071007CCD7B /* RUMGlobalE2ETests.swift */; };
9E68FB55244707FD0013A8AA /* ObjcExceptionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E68FB53244707FD0013A8AA /* ObjcExceptionHandler.m */; };
- 9E68FB56244707FD0013A8AA /* ObjcExceptionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E68FB54244707FD0013A8AA /* ObjcExceptionHandler.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 9EB47B92247443FA004F90BE /* URLSessionSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB47B91247443FA004F90BE /* URLSessionSwizzler.swift */; };
- 9ED583A32498C222004CFF2A /* TracingAutoInstrumentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ED583A22498C222004CFF2A /* TracingAutoInstrumentation.swift */; };
+ 9E68FB56244707FD0013A8AA /* ObjcExceptionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E68FB54244707FD0013A8AA /* ObjcExceptionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9EE5AD8226205B82001E699E /* DDNSURLSessionDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EE5AD8126205B82001E699E /* DDNSURLSessionDelegateTests.swift */; };
+ A70A82652A935F210072F5DC /* BackgroundTaskCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70A82642A935F210072F5DC /* BackgroundTaskCoordinator.swift */; };
+ A70A82662A935F210072F5DC /* BackgroundTaskCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70A82642A935F210072F5DC /* BackgroundTaskCoordinator.swift */; };
+ A70ADCD22B583B1300321BC9 /* UIImageResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70ADCD12B583B1300321BC9 /* UIImageResource.swift */; };
+ A71013D62B178FAD00101E60 /* ResourcesWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71013D52B178FAD00101E60 /* ResourcesWriterTests.swift */; };
+ A727C4BB2BADB3AB00707DFD /* DDSessionReplay+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A795069D2B974CAA00AC4814 /* DDSessionReplay+apiTests.m */; };
+ A728ADAB2934EA2100397996 /* W3CHTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADAA2934EA2100397996 /* W3CHTTPHeadersWriter+objc.swift */; };
+ A728ADAC2934EA2100397996 /* W3CHTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADAA2934EA2100397996 /* W3CHTTPHeadersWriter+objc.swift */; };
+ A728ADB02934EB0900397996 /* DDW3CHTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A728ADAD2934EB0300397996 /* DDW3CHTTPHeadersWriter+apiTests.m */; };
+ A728ADB12934EB0C00397996 /* DDW3CHTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A728ADAD2934EB0300397996 /* DDW3CHTTPHeadersWriter+apiTests.m */; };
+ A73A54982B16406900E1F7E3 /* ResourcesFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = A73A54972B16406900E1F7E3 /* ResourcesFeature.swift */; };
+ A74A72812B0CEE4900771FEB /* ResourceRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74A72802B0CEE4900771FEB /* ResourceRequestBuilder.swift */; };
+ A74A72852B10CC6700771FEB /* ResourceRequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74A72842B10CC6700771FEB /* ResourceRequestBuilderTests.swift */; };
+ A74A72872B10CE4100771FEB /* ResourceMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74A72862B10CE4100771FEB /* ResourceMocks.swift */; };
+ A74A72892B10D95D00771FEB /* MultipartBuilderSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74A72882B10D95D00771FEB /* MultipartBuilderSpy.swift */; };
+ A795069C2B974C8200AC4814 /* SessionReplay+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A795069B2B974C8100AC4814 /* SessionReplay+objc.swift */; };
+ A79B0F64292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F63292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m */; };
+ A79B0F65292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F63292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m */; };
+ A79B0F66292BD7CA008742B3 /* B3HTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F5E292BA435008742B3 /* B3HTTPHeadersWriter+objc.swift */; };
+ A79B0F67292BD7CC008742B3 /* B3HTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F5E292BA435008742B3 /* B3HTTPHeadersWriter+objc.swift */; };
+ A7B932F52B1F694000AE6477 /* ResourcesProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932F42B1F694000AE6477 /* ResourcesProcessor.swift */; };
+ A7B932FB2B1F6A0A00AE6477 /* EnrichedRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932F72B1F6A0A00AE6477 /* EnrichedRecord.swift */; };
+ A7B932FC2B1F6A0A00AE6477 /* SRDataModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932F82B1F6A0A00AE6477 /* SRDataModels.swift */; };
+ A7B932FD2B1F6A0A00AE6477 /* EnrichedResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932F92B1F6A0A00AE6477 /* EnrichedResource.swift */; };
+ A7B932FE2B1F6A0A00AE6477 /* SRDataModels+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932FA2B1F6A0A00AE6477 /* SRDataModels+UIKit.swift */; };
+ A7CA21802BEBB1E800732571 /* AppBackgroundTaskCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CA217F2BEBB1E800732571 /* AppBackgroundTaskCoordinatorTests.swift */; };
+ A7CA21812BEBB1E800732571 /* AppBackgroundTaskCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CA217F2BEBB1E800732571 /* AppBackgroundTaskCoordinatorTests.swift */; };
+ A7CA21832BEBB2E200732571 /* ExtensionBackgroundTaskCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CA21822BEBB2E200732571 /* ExtensionBackgroundTaskCoordinatorTests.swift */; };
+ A7CA21842BEBB2E200732571 /* ExtensionBackgroundTaskCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CA21822BEBB2E200732571 /* ExtensionBackgroundTaskCoordinatorTests.swift */; };
+ A7D9528A2B28BD94004C79B1 /* ResourceProcessorSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D952892B28BD94004C79B1 /* ResourceProcessorSpy.swift */; };
+ A7D9528C2B28C18D004C79B1 /* ResourceProcessorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D9528B2B28C18D004C79B1 /* ResourceProcessorTests.swift */; };
+ A7DA18042AB0C91200F76337 /* DDUIKitRUMViewsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18022AB0C8A700F76337 /* DDUIKitRUMViewsPredicateTests.swift */; };
+ A7DA18052AB0C91300F76337 /* DDUIKitRUMViewsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18022AB0C8A700F76337 /* DDUIKitRUMViewsPredicateTests.swift */; };
+ A7DA18072AB0CA5E00F76337 /* DDUIKitRUMActionsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18062AB0CA4700F76337 /* DDUIKitRUMActionsPredicateTests.swift */; };
+ A7EA11622AB0CE6C00C73970 /* DDUIKitRUMActionsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18062AB0CA4700F76337 /* DDUIKitRUMActionsPredicateTests.swift */; };
+ A7EA88562B17639A00FE2580 /* ResourcesWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7EA88552B17639A00FE2580 /* ResourcesWriter.swift */; };
+ A7F651302B7655DE004B0EDB /* UIImageResourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F6512F2B7655DE004B0EDB /* UIImageResourceTests.swift */; };
+ A7FA98CE2BA1A6930018D6B5 /* MethodCalledMetric.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7FA98CD2BA1A6930018D6B5 /* MethodCalledMetric.swift */; };
+ A7FA98CF2BA1A6930018D6B5 /* MethodCalledMetric.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7FA98CD2BA1A6930018D6B5 /* MethodCalledMetric.swift */; };
+ B3C27A082CE6342C006580F9 /* DeterministicSamplerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C27A072CE6342C006580F9 /* DeterministicSamplerTests.swift */; };
+ B3C27A092CE6342C006580F9 /* DeterministicSamplerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C27A072CE6342C006580F9 /* DeterministicSamplerTests.swift */; };
+ D2056C212BBFE05A0085BC76 /* WireframesBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2056C202BBFE05A0085BC76 /* WireframesBuilderTests.swift */; };
+ D20605A3287464F40047275C /* ContextValuePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605A2287464F40047275C /* ContextValuePublisher.swift */; };
+ D20605A4287464F40047275C /* ContextValuePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605A2287464F40047275C /* ContextValuePublisher.swift */; };
+ D20605A6287476230047275C /* ServerOffsetPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605A5287476230047275C /* ServerOffsetPublisher.swift */; };
+ D20605A7287476230047275C /* ServerOffsetPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605A5287476230047275C /* ServerOffsetPublisher.swift */; };
+ D20605A92874C1CD0047275C /* NetworkConnectionInfoPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605A82874C1CD0047275C /* NetworkConnectionInfoPublisher.swift */; };
+ D20605AA2874C1CD0047275C /* NetworkConnectionInfoPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605A82874C1CD0047275C /* NetworkConnectionInfoPublisher.swift */; };
+ D20605B22874E1660047275C /* CarrierInfoPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605B12874E1660047275C /* CarrierInfoPublisher.swift */; };
+ D20605B32874E1660047275C /* CarrierInfoPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605B12874E1660047275C /* CarrierInfoPublisher.swift */; };
+ D20605B6287572640047275C /* DatadogContextProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605B5287572640047275C /* DatadogContextProviderMock.swift */; };
+ D20605B7287572640047275C /* DatadogContextProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605B5287572640047275C /* DatadogContextProviderMock.swift */; };
+ D20605B92875729E0047275C /* ContextValuePublisherMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605B82875729E0047275C /* ContextValuePublisherMock.swift */; };
+ D20605BA2875729E0047275C /* ContextValuePublisherMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605B82875729E0047275C /* ContextValuePublisherMock.swift */; };
+ D20605C42875895C0047275C /* KronosClockMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605BB28757BFB0047275C /* KronosClockMock.swift */; };
+ D20605C52875895E0047275C /* KronosClockMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20605BB28757BFB0047275C /* KronosClockMock.swift */; };
+ D206BB852A41CA6800F43BA2 /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D207317C29A5226A00ECBF94 /* DatadogLogs.framework */; };
+ D206BB8A2A41CA7000F43BA2 /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D20731B429A5279D00ECBF94 /* DatadogLogs.framework */; };
+ D207318429A5226B00ECBF94 /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D207317C29A5226A00ECBF94 /* DatadogLogs.framework */; platformFilter = ios; };
+ D207319529A522F600ECBF94 /* LogsFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616F1FAF283E227100651A3A /* LogsFeature.swift */; };
+ D207319629A522F600ECBF94 /* ConsoleLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194E4BB2878AF7600EB6307 /* ConsoleLogger.swift */; };
+ D207319729A5232A00ECBF94 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ D20731A929A5279D00ECBF94 /* ConsoleLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194E4BB2878AF7600EB6307 /* ConsoleLogger.swift */; };
+ D20731AB29A5279D00ECBF94 /* LogsFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616F1FAF283E227100651A3A /* LogsFeature.swift */; };
+ D20731B529A528DA00ECBF94 /* LogEventBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC32423979B00786299 /* LogEventBuilder.swift */; };
+ D20731B629A528DA00ECBF94 /* LogEventBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC32423979B00786299 /* LogEventBuilder.swift */; };
+ D20731C229A528EB00ECBF94 /* LogEventEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC22423979B00786299 /* LogEventEncoder.swift */; };
+ D20731C329A528EB00ECBF94 /* LogEventMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C1F5B271484B400922024 /* LogEventMapper.swift */; };
+ D20731C529A528EC00ECBF94 /* LogEventSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC42423979B00786299 /* LogEventSanitizer.swift */; };
+ D20731C729A528ED00ECBF94 /* LogEventEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC22423979B00786299 /* LogEventEncoder.swift */; };
+ D20731C829A528ED00ECBF94 /* LogEventMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C1F5B271484B400922024 /* LogEventMapper.swift */; };
+ D20731CA29A528ED00ECBF94 /* LogEventSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC42423979B00786299 /* LogEventSanitizer.swift */; };
+ D20731CB29A52E6000ECBF94 /* Sampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613C6B8F2768FDDE00870CBF /* Sampler.swift */; };
+ D20731CC29A52E6000ECBF94 /* Sampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613C6B8F2768FDDE00870CBF /* Sampler.swift */; };
+ D20731CD29A52E8700ECBF94 /* SamplerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613C6B912768FF3100870CBF /* SamplerTests.swift */; };
+ D20731CE29A52E8700ECBF94 /* SamplerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613C6B912768FF3100870CBF /* SamplerTests.swift */; };
+ D20FD9CF2AC6FF42004D3569 /* WebViewLogReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20FD9CE2AC6FF42004D3569 /* WebViewLogReceiverTests.swift */; };
+ D20FD9D02AC6FF42004D3569 /* WebViewLogReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20FD9CE2AC6FF42004D3569 /* WebViewLogReceiverTests.swift */; };
+ D20FD9D12ACC02F9004D3569 /* DatadogWebViewTracking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CE119FE29F7BE0100202522 /* DatadogWebViewTracking.framework */; };
+ D20FD9D32ACC08D1004D3569 /* WebKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20FD9D22ACC08D1004D3569 /* WebKitMocks.swift */; };
+ D20FD9D62ACC0934004D3569 /* WebLogIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20FD9D52ACC0934004D3569 /* WebLogIntegrationTests.swift */; };
+ D21331C12D132F0600E4A6A1 /* SwiftUIWireframesBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21331C02D132F0600E4A6A1 /* SwiftUIWireframesBuilderTests.swift */; };
+ D214DA8129DF2D5E004D0AE8 /* CrashReportingPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DE333525C8278A008E3EC2 /* CrashReportingPlugin.swift */; };
+ D214DA8229DF2D5E004D0AE8 /* CrashReportingPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DE333525C8278A008E3EC2 /* CrashReportingPlugin.swift */; };
+ D214DA8329DF2D5E004D0AE8 /* CrashReporting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6161247825CA9CA6009901BE /* CrashReporting.swift */; };
+ D214DA8429DF2D5E004D0AE8 /* CrashReporting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6161247825CA9CA6009901BE /* CrashReporting.swift */; };
+ D214DA8929DF2D6A004D0AE8 /* CrashReportSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6112B11325C84E7900B37771 /* CrashReportSender.swift */; };
+ D214DA8A29DF2D6A004D0AE8 /* CrashContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6161249D25CAB340009901BE /* CrashContext.swift */; };
+ D214DA8B29DF2D6A004D0AE8 /* CrashContextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616124A625CAC268009901BE /* CrashContextProvider.swift */; };
+ D214DA8C29DF2D6B004D0AE8 /* CrashReportSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6112B11325C84E7900B37771 /* CrashReportSender.swift */; };
+ D214DA8D29DF2D6B004D0AE8 /* CrashContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6161249D25CAB340009901BE /* CrashContext.swift */; };
+ D214DA8E29DF2D6B004D0AE8 /* CrashContextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616124A625CAC268009901BE /* CrashContextProvider.swift */; };
+ D214DA9429DF2F5E004D0AE8 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2DA2385298D57AA00C6C7E6 /* DatadogInternal.framework */; };
+ D214DA9929DF2F6A004D0AE8 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ D2160C9A29C0DE5700FAA9A5 /* FirstPartyHosts.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160C9429C0DE5600FAA9A5 /* FirstPartyHosts.swift */; };
+ D2160C9B29C0DE5700FAA9A5 /* FirstPartyHosts.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160C9429C0DE5600FAA9A5 /* FirstPartyHosts.swift */; };
+ D2160C9E29C0DE5700FAA9A5 /* TracingHeaderType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160C9629C0DE5600FAA9A5 /* TracingHeaderType.swift */; };
+ D2160C9F29C0DE5700FAA9A5 /* TracingHeaderType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160C9629C0DE5600FAA9A5 /* TracingHeaderType.swift */; };
+ D2160CA029C0DE5700FAA9A5 /* HostsSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160C9729C0DE5700FAA9A5 /* HostsSanitizer.swift */; };
+ D2160CA129C0DE5700FAA9A5 /* HostsSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160C9729C0DE5700FAA9A5 /* HostsSanitizer.swift */; };
+ D2160CA229C0DE5700FAA9A5 /* NetworkInstrumentationFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160C9829C0DE5700FAA9A5 /* NetworkInstrumentationFeature.swift */; };
+ D2160CA329C0DE5700FAA9A5 /* NetworkInstrumentationFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160C9829C0DE5700FAA9A5 /* NetworkInstrumentationFeature.swift */; };
+ D2160CC529C0DED100FAA9A5 /* URLSessionTaskInterception.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CC129C0DED100FAA9A5 /* URLSessionTaskInterception.swift */; };
+ D2160CC629C0DED100FAA9A5 /* URLSessionTaskInterception.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CC129C0DED100FAA9A5 /* URLSessionTaskInterception.swift */; };
+ D2160CC929C0DED100FAA9A5 /* DatadogURLSessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CC329C0DED100FAA9A5 /* DatadogURLSessionDelegate.swift */; };
+ D2160CCA29C0DED100FAA9A5 /* DatadogURLSessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CC329C0DED100FAA9A5 /* DatadogURLSessionDelegate.swift */; };
+ D2160CD429C0DF6700FAA9A5 /* NetworkInstrumentationFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CCD29C0DF6700FAA9A5 /* NetworkInstrumentationFeatureTests.swift */; };
+ D2160CD529C0DF6700FAA9A5 /* NetworkInstrumentationFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CCD29C0DF6700FAA9A5 /* NetworkInstrumentationFeatureTests.swift */; };
+ D2160CD829C0DF6700FAA9A5 /* FirstPartyHostsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CCF29C0DF6700FAA9A5 /* FirstPartyHostsTests.swift */; };
+ D2160CD929C0DF6700FAA9A5 /* FirstPartyHostsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CCF29C0DF6700FAA9A5 /* FirstPartyHostsTests.swift */; };
+ D2160CDC29C0DF6700FAA9A5 /* HostsSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CD129C0DF6700FAA9A5 /* HostsSanitizerTests.swift */; };
+ D2160CDD29C0DF6700FAA9A5 /* HostsSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CD129C0DF6700FAA9A5 /* HostsSanitizerTests.swift */; };
+ D2160CDE29C0DF6700FAA9A5 /* URLSessionTaskInterceptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CD229C0DF6700FAA9A5 /* URLSessionTaskInterceptionTests.swift */; };
+ D2160CDF29C0DF6700FAA9A5 /* URLSessionTaskInterceptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CD229C0DF6700FAA9A5 /* URLSessionTaskInterceptionTests.swift */; };
+ D2160CE029C0DF6700FAA9A5 /* URLSessionDelegateAsSuperclassTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CD329C0DF6700FAA9A5 /* URLSessionDelegateAsSuperclassTests.swift */; };
+ D2160CE129C0DF6700FAA9A5 /* URLSessionDelegateAsSuperclassTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CD329C0DF6700FAA9A5 /* URLSessionDelegateAsSuperclassTests.swift */; };
+ D2160CE429C0DFEE00FAA9A5 /* MethodSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CE329C0DFED00FAA9A5 /* MethodSwizzler.swift */; };
+ D2160CE629C0DFEE00FAA9A5 /* MethodSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CE329C0DFED00FAA9A5 /* MethodSwizzler.swift */; };
+ D2160CE929C0E00200FAA9A5 /* MethodSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CE829C0E00200FAA9A5 /* MethodSwizzlerTests.swift */; };
+ D2160CEA29C0E00200FAA9A5 /* MethodSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CE829C0E00200FAA9A5 /* MethodSwizzlerTests.swift */; };
+ D2160CED29C0E0E600FAA9A5 /* DatadogURLSessionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CEC29C0E0E600FAA9A5 /* DatadogURLSessionHandler.swift */; };
+ D2160CEE29C0E0E600FAA9A5 /* DatadogURLSessionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CEC29C0E0E600FAA9A5 /* DatadogURLSessionHandler.swift */; };
+ D2160CF029C0EC4D00FAA9A5 /* SingleFeatureCoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CEF29C0EC4D00FAA9A5 /* SingleFeatureCoreMock.swift */; };
+ D2160CF129C0EC4D00FAA9A5 /* SingleFeatureCoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CEF29C0EC4D00FAA9A5 /* SingleFeatureCoreMock.swift */; };
+ D2160CF229C0ED3C00FAA9A5 /* ServerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3646F243B5C8300C4D4E6 /* ServerMock.swift */; };
+ D2160CF329C0ED3C00FAA9A5 /* ServerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3646F243B5C8300C4D4E6 /* ServerMock.swift */; };
+ D2160CF429C0EDFC00FAA9A5 /* UploadPerformancePreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26C49B52889416300802B2D /* UploadPerformancePreset.swift */; };
+ D2160CF529C0EDFC00FAA9A5 /* UploadPerformancePreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26C49B52889416300802B2D /* UploadPerformancePreset.swift */; };
+ D2160CF729C0EE2B00FAA9A5 /* UploadMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CF629C0EE2B00FAA9A5 /* UploadMocks.swift */; };
+ D2160CF829C0EE2B00FAA9A5 /* UploadMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2160CF629C0EE2B00FAA9A5 /* UploadMocks.swift */; };
+ D2181A8E2B051B7900A518C0 /* URLSessionSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2181A8D2B051B7900A518C0 /* URLSessionSwizzlerTests.swift */; };
+ D2181A8F2B051B7900A518C0 /* URLSessionSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2181A8D2B051B7900A518C0 /* URLSessionSwizzlerTests.swift */; };
+ D21831552B6A57530012B3A0 /* NetworkInstrumentationIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21831542B6A57530012B3A0 /* NetworkInstrumentationIntegrationTests.swift */; };
+ D21831562B6A57530012B3A0 /* NetworkInstrumentationIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21831542B6A57530012B3A0 /* NetworkInstrumentationIntegrationTests.swift */; };
+ D218B0462D072C8400E3F82C /* SessionReplayTelemetry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D218B0452D072C8400E3F82C /* SessionReplayTelemetry.swift */; };
+ D218B0482D072CF300E3F82C /* SessionReplayTelemetryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D218B0472D072CF300E3F82C /* SessionReplayTelemetryTests.swift */; };
+ D21A94F22B8397CA00AC4256 /* WebViewMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21A94F12B8397CA00AC4256 /* WebViewMessage.swift */; };
+ D21A94F32B8397CA00AC4256 /* WebViewMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21A94F12B8397CA00AC4256 /* WebViewMessage.swift */; };
+ D21AE6BC29E5EDAF0064BF29 /* TelemetryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21AE6BB29E5EDAF0064BF29 /* TelemetryTests.swift */; };
+ D21AE6BD29E5EDAF0064BF29 /* TelemetryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21AE6BB29E5EDAF0064BF29 /* TelemetryTests.swift */; };
+ D21C26C528A3B49C005DD405 /* FeatureStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26C428A3B49C005DD405 /* FeatureStorage.swift */; };
+ D21C26C628A3B49C005DD405 /* FeatureStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26C428A3B49C005DD405 /* FeatureStorage.swift */; };
+ D21C26D128A64599005DD405 /* MessageBusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26D028A64599005DD405 /* MessageBusTests.swift */; };
+ D21C26D228A64599005DD405 /* MessageBusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26D028A64599005DD405 /* MessageBusTests.swift */; };
+ D2216EC02A94DE2900ADAEC8 /* FeatureBaggage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2216EBF2A94DE2800ADAEC8 /* FeatureBaggage.swift */; };
+ D2216EC12A94DE2900ADAEC8 /* FeatureBaggage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2216EBF2A94DE2800ADAEC8 /* FeatureBaggage.swift */; };
+ D2216EC32A96649500ADAEC8 /* FeatureBaggageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2216EC22A96632F00ADAEC8 /* FeatureBaggageTests.swift */; };
+ D2216EC42A96649700ADAEC8 /* FeatureBaggageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2216EC22A96632F00ADAEC8 /* FeatureBaggageTests.swift */; };
+ D22442C52CA301DA002E71E4 /* UIColor+SessionReplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22442C42CA301DA002E71E4 /* UIColor+SessionReplay.swift */; };
+ D224430429E9588100274EC7 /* TelemetryReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D214DAA729E54CB4004D0AE8 /* TelemetryReceiver.swift */; };
+ D224430529E9588500274EC7 /* TelemetryReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D214DAA729E54CB4004D0AE8 /* TelemetryReceiver.swift */; };
+ D224430629E95C2C00274EC7 /* MessageBus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D214DAA429E072D7004D0AE8 /* MessageBus.swift */; };
+ D224430729E95C2E00274EC7 /* MessageBus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D214DAA429E072D7004D0AE8 /* MessageBus.swift */; };
+ D224430D29E95D6700274EC7 /* CrashReportReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224430C29E95D6600274EC7 /* CrashReportReceiverTests.swift */; };
+ D224430E29E95D6700274EC7 /* CrashReportReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224430C29E95D6600274EC7 /* CrashReportReceiverTests.swift */; };
+ D224430F29E9779F00274EC7 /* TelemetryReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D248ED4728081B9B00B315B4 /* TelemetryReceiverTests.swift */; };
+ D224431029E977A100274EC7 /* TelemetryReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D248ED4728081B9B00B315B4 /* TelemetryReceiverTests.swift */; };
+ D22743D829DEB8B4001A7EF9 /* VitalInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3FC3C3B2653A97700DEED9E /* VitalInfoTests.swift */; };
+ D22743D929DEB8B4001A7EF9 /* VitalInfoSamplerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2EF44E2694FA14008A7DAE /* VitalInfoSamplerTests.swift */; };
+ D22743DA29DEB8B4001A7EF9 /* VitalMemoryReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BBBCBB265E71D100943419 /* VitalMemoryReaderTests.swift */; };
+ D22743DB29DEB8B4001A7EF9 /* VitalCPUReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC8B5ED2668E4DB000F7529 /* VitalCPUReaderTests.swift */; };
+ D22743DC29DEB8B4001A7EF9 /* VitalRefreshRateReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E986C2F2677B91400D62490 /* VitalRefreshRateReaderTests.swift */; };
+ D22743DD29DEB8B5001A7EF9 /* VitalInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3FC3C3B2653A97700DEED9E /* VitalInfoTests.swift */; };
+ D22743DE29DEB8B5001A7EF9 /* VitalInfoSamplerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2EF44E2694FA14008A7DAE /* VitalInfoSamplerTests.swift */; };
+ D22743DF29DEB8B5001A7EF9 /* VitalMemoryReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BBBCBB265E71D100943419 /* VitalMemoryReaderTests.swift */; };
+ D22743E029DEB8B5001A7EF9 /* VitalCPUReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC8B5ED2668E4DB000F7529 /* VitalCPUReaderTests.swift */; };
+ D22743E129DEB8B5001A7EF9 /* VitalRefreshRateReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E986C2F2677B91400D62490 /* VitalRefreshRateReaderTests.swift */; };
+ D22743E229DEB90B001A7EF9 /* RUMDebuggingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61786F7624FCDE04009E6BAB /* RUMDebuggingTests.swift */; };
+ D22743E329DEB90B001A7EF9 /* RUMDebuggingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61786F7624FCDE04009E6BAB /* RUMDebuggingTests.swift */; };
+ D22743E429DEB933001A7EF9 /* UIViewControllerSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3CDAA25121FB500C816E5 /* UIViewControllerSwizzlerTests.swift */; };
+ D22743E529DEB934001A7EF9 /* UIViewControllerSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3CDAA25121FB500C816E5 /* UIViewControllerSwizzlerTests.swift */; };
+ D22743E629DEB953001A7EF9 /* UIApplicationSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61410166251A661D00E3C2D9 /* UIApplicationSwizzlerTests.swift */; };
+ D22743E729DEB953001A7EF9 /* UIApplicationSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61410166251A661D00E3C2D9 /* UIApplicationSwizzlerTests.swift */; };
+ D22743E929DEC9A9001A7EF9 /* RUMDataModelMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22743E829DEC9A9001A7EF9 /* RUMDataModelMocks.swift */; };
+ D22743EA29DEC9A9001A7EF9 /* RUMDataModelMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22743E829DEC9A9001A7EF9 /* RUMDataModelMocks.swift */; };
+ D22743EB29DEC9E6001A7EF9 /* Casting+RUM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61411B0F24EC15AC0012EAB2 /* Casting+RUM.swift */; };
+ D22743EC29DEC9E6001A7EF9 /* Casting+RUM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61411B0F24EC15AC0012EAB2 /* Casting+RUM.swift */; };
+ D227A0A42C7622EA00C83324 /* BenchmarkProfiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D227A0A32C7622EA00C83324 /* BenchmarkProfiler.swift */; };
+ D227A0A52C7622EA00C83324 /* BenchmarkProfiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D227A0A32C7622EA00C83324 /* BenchmarkProfiler.swift */; };
+ D22C5BC82A98A0B20024CC1F /* Baggages.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C5BC52A989D130024CC1F /* Baggages.swift */; };
+ D22C5BC92A98A0B30024CC1F /* Baggages.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C5BC52A989D130024CC1F /* Baggages.swift */; };
+ D22C5BCB2A98A5400024CC1F /* Baggages.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C5BCA2A98A5400024CC1F /* Baggages.swift */; };
+ D22C5BCC2A98A5400024CC1F /* Baggages.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C5BCA2A98A5400024CC1F /* Baggages.swift */; };
+ D22C5BD02A98A6660024CC1F /* Baggages.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C5BCD2A98A65D0024CC1F /* Baggages.swift */; };
+ D22F06D729DAFD500026CC3C /* FixedWidthInteger+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22F06D529DAFD500026CC3C /* FixedWidthInteger+Convenience.swift */; };
+ D22F06D829DAFD500026CC3C /* FixedWidthInteger+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22F06D529DAFD500026CC3C /* FixedWidthInteger+Convenience.swift */; };
+ D22F06D929DAFD500026CC3C /* TimeInterval+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22F06D629DAFD500026CC3C /* TimeInterval+Convenience.swift */; };
+ D22F06DA29DAFD500026CC3C /* TimeInterval+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22F06D629DAFD500026CC3C /* TimeInterval+Convenience.swift */; };
+ D2303996298D50F1001A1FA3 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2579593298ABCF5008A1BE5 /* XCTest.framework */; };
+ D2303997298D50F1001A1FA3 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6ED127C50EAE00A62B57 /* DatadogCore.framework */; };
+ D2303998298D50F1001A1FA3 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2579593298ABCF5008A1BE5 /* XCTest.framework */; };
+ D2303999298D50F1001A1FA3 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6ED127C50EAE00A62B57 /* DatadogCore.framework */; };
+ D230399A298D50F1001A1FA3 /* XCTest.framework in Headers */ = {isa = PBXBuildFile; fileRef = D2579593298ABCF5008A1BE5 /* XCTest.framework */; };
+ D230399B298D50F1001A1FA3 /* DatadogCore.framework in Headers */ = {isa = PBXBuildFile; fileRef = D2CB6ED127C50EAE00A62B57 /* DatadogCore.framework */; };
+ D230399C298D50F1001A1FA3 /* XCTest.framework in Headers */ = {isa = PBXBuildFile; fileRef = D2579593298ABCF5008A1BE5 /* XCTest.framework */; };
+ D230399D298D50F1001A1FA3 /* DatadogCore.framework in Headers */ = {isa = PBXBuildFile; fileRef = D2CB6ED127C50EAE00A62B57 /* DatadogCore.framework */; };
+ D230399E298D50F1001A1FA3 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2579593298ABCF5008A1BE5 /* XCTest.framework */; };
+ D23039DD298D5235001A1FA3 /* DD.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039AD298D5234001A1FA3 /* DD.swift */; };
+ D23039DE298D5235001A1FA3 /* Writer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039AF298D5235001A1FA3 /* Writer.swift */; };
+ D23039E0298D5235001A1FA3 /* DatadogCoreProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B1298D5235001A1FA3 /* DatadogCoreProtocol.swift */; };
+ D23039E1298D5236001A1FA3 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B3298D5235001A1FA3 /* AppState.swift */; };
+ D23039E2298D5236001A1FA3 /* UserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B4298D5235001A1FA3 /* UserInfo.swift */; };
+ D23039E3298D5236001A1FA3 /* BatteryStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B5298D5235001A1FA3 /* BatteryStatus.swift */; };
+ D23039E4298D5236001A1FA3 /* CarrierInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B6298D5235001A1FA3 /* CarrierInfo.swift */; };
+ D23039E5298D5236001A1FA3 /* DateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B7298D5235001A1FA3 /* DateProvider.swift */; };
+ D23039E6298D5236001A1FA3 /* Sysctl.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B8298D5235001A1FA3 /* Sysctl.swift */; };
+ D23039E7298D5236001A1FA3 /* NetworkConnectionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B9298D5235001A1FA3 /* NetworkConnectionInfo.swift */; };
+ D23039E8298D5236001A1FA3 /* DatadogContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BA298D5235001A1FA3 /* DatadogContext.swift */; };
+ D23039E9298D5236001A1FA3 /* TrackingConsent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BB298D5235001A1FA3 /* TrackingConsent.swift */; };
+ D23039EA298D5236001A1FA3 /* DeviceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BC298D5235001A1FA3 /* DeviceInfo.swift */; };
+ D23039EB298D5236001A1FA3 /* DatadogFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BD298D5235001A1FA3 /* DatadogFeature.swift */; };
+ D23039EC298D5236001A1FA3 /* LaunchTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BE298D5235001A1FA3 /* LaunchTime.swift */; };
+ D23039EE298D5236001A1FA3 /* FeatureMessageReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C1298D5235001A1FA3 /* FeatureMessageReceiver.swift */; };
+ D23039EF298D5236001A1FA3 /* FeatureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C2298D5235001A1FA3 /* FeatureMessage.swift */; };
+ D23039F0298D5236001A1FA3 /* AnyEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C4298D5235001A1FA3 /* AnyEncoder.swift */; };
+ D23039F1298D5236001A1FA3 /* AnyDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C5298D5235001A1FA3 /* AnyDecodable.swift */; };
+ D23039F2298D5236001A1FA3 /* AnyDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C6298D5235001A1FA3 /* AnyDecoder.swift */; };
+ D23039F3298D5236001A1FA3 /* DynamicCodingKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C7298D5235001A1FA3 /* DynamicCodingKey.swift */; };
+ D23039F4298D5236001A1FA3 /* AnyCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C8298D5235001A1FA3 /* AnyCodable.swift */; };
+ D23039F5298D5236001A1FA3 /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C9298D5235001A1FA3 /* AnyEncodable.swift */; };
+ D23039F6298D5236001A1FA3 /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039CB298D5235001A1FA3 /* Attributes.swift */; };
+ D23039F7298D5236001A1FA3 /* AttributesSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039CC298D5235001A1FA3 /* AttributesSanitizer.swift */; };
+ D23039F8298D5236001A1FA3 /* InternalLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039CE298D5235001A1FA3 /* InternalLogger.swift */; };
+ D23039F9298D5236001A1FA3 /* CoreLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039CF298D5235001A1FA3 /* CoreLogger.swift */; };
+ D23039FA298D5236001A1FA3 /* Telemetry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D0298D5235001A1FA3 /* Telemetry.swift */; };
+ D23039FB298D5236001A1FA3 /* URLRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D2298D5235001A1FA3 /* URLRequestBuilder.swift */; };
+ D23039FC298D5236001A1FA3 /* DataFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D3298D5235001A1FA3 /* DataFormat.swift */; };
+ D23039FD298D5236001A1FA3 /* DataCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D4298D5235001A1FA3 /* DataCompression.swift */; };
+ D23039FE298D5236001A1FA3 /* FeatureRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D5298D5235001A1FA3 /* FeatureRequestBuilder.swift */; };
+ D23039FF298D5236001A1FA3 /* Foundation+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D7298D5235001A1FA3 /* Foundation+Datadog.swift */; };
+ D2303A00298D5236001A1FA3 /* DatadogExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D8298D5235001A1FA3 /* DatadogExtended.swift */; };
+ D2303A01298D5236001A1FA3 /* DateFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D9298D5235001A1FA3 /* DateFormatting.swift */; };
+ D2303A02298D5236001A1FA3 /* ReadWriteLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039DB298D5235001A1FA3 /* ReadWriteLock.swift */; };
+ D2303A03298D5236001A1FA3 /* DDError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039DC298D5235001A1FA3 /* DDError.swift */; };
+ D2303A04298D5317001A1FA3 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ D2303A0A298D5412001A1FA3 /* AsyncWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2303A09298D5412001A1FA3 /* AsyncWriter.swift */; };
+ D2303A0B298D5412001A1FA3 /* AsyncWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2303A09298D5412001A1FA3 /* AsyncWriter.swift */; };
+ D23354FC2A42E32000AFCAE2 /* InternalExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23354FB2A42E32000AFCAE2 /* InternalExtended.swift */; };
+ D23354FD2A42E32000AFCAE2 /* InternalExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23354FB2A42E32000AFCAE2 /* InternalExtended.swift */; };
+ D234613128B7713000055D4C /* FeatureContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D234613028B7712F00055D4C /* FeatureContextTests.swift */; };
+ D234613228B7713000055D4C /* FeatureContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D234613028B7712F00055D4C /* FeatureContextTests.swift */; };
+ D23F8E5229DDCD28001CFAE8 /* UIViewControllerHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3CDA2251118FB00C816E5 /* UIViewControllerHandler.swift */; };
+ D23F8E5329DDCD28001CFAE8 /* RUMCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3E63A24BF1A4B008053F2 /* RUMCommand.swift */; };
+ D23F8E5429DDCD28001CFAE8 /* ValuePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611529A425E3DD51004F740E /* ValuePublisher.swift */; };
+ D23F8E5529DDCD28001CFAE8 /* RUMEventSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61122ED325B1B84D00F9C7F5 /* RUMEventSanitizer.swift */; };
+ D23F8E5729DDCD28001CFAE8 /* RUMScopeDependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6122514727FDFF82004F5AE4 /* RUMScopeDependencies.swift */; };
+ D23F8E5829DDCD28001CFAE8 /* VitalMemoryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BBBCB0265E71C600943419 /* VitalMemoryReader.swift */; };
+ D23F8E5929DDCD28001CFAE8 /* WebViewEventReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2CBC26A294383F200134409 /* WebViewEventReceiver.swift */; };
+ D23F8E5A29DDCD28001CFAE8 /* RUMResourceScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61494CB024C839460082C633 /* RUMResourceScope.swift */; };
+ D23F8E5C29DDCD28001CFAE8 /* RUMApplicationScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3E63D24BF1B91008053F2 /* RUMApplicationScope.swift */; };
+ D23F8E5D29DDCD28001CFAE8 /* SwiftUIViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D249859F2728042200B4F72D /* SwiftUIViewModifier.swift */; };
+ D23F8E5E29DDCD28001CFAE8 /* VitalInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3FC3C0626526EFF00DEED9E /* VitalInfo.swift */; };
+ D23F8E5F29DDCD28001CFAE8 /* UIApplicationSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6141014E251A57AF00E3C2D9 /* UIApplicationSwizzler.swift */; };
+ D23F8E6029DDCD28001CFAE8 /* PerformanceMetric.swift in Sources */ = {isa = PBXBuildFile; fileRef = E179FB4D28F80A6400CC2698 /* PerformanceMetric.swift */; };
+ D23F8E6129DDCD28001CFAE8 /* RUMConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25FF2EA29CC6D6F0063802D /* RUMConfiguration.swift */; };
+ D23F8E6329DDCD28001CFAE8 /* RUMDataModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E26E6B824C87693000B3270 /* RUMDataModels.swift */; };
+ D23F8E6429DDCD28001CFAE8 /* SwiftUIViewHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24985A12728048B00B4F72D /* SwiftUIViewHandler.swift */; };
+ D23F8E6529DDCD28001CFAE8 /* RUMFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25FF2E729CC6B680063802D /* RUMFeature.swift */; };
+ D23F8E6629DDCD28001CFAE8 /* RUMDebugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B22E5924F3E6B700DC26D2 /* RUMDebugging.swift */; };
+ D23F8E6729DDCD28001CFAE8 /* RUMUUID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618DCFD624C7265300589570 /* RUMUUID.swift */; };
+ D23F8E6829DDCD28001CFAE8 /* UIKitExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615F197B25B5A64B00BE14B5 /* UIKitExtensions.swift */; };
+ D23F8E6929DDCD28001CFAE8 /* RUMContextAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2CBC26D294395A300134409 /* RUMContextAttributes.swift */; };
+ D23F8E6B29DDCD28001CFAE8 /* RUMMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E5333524B84B43003D6C4E /* RUMMonitor.swift */; };
+ D23F8E6C29DDCD28001CFAE8 /* RUMContextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6156CB8D24DDA1B5008CB2B2 /* RUMContextProvider.swift */; };
+ D23F8E6D29DDCD28001CFAE8 /* ViewIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF9A4425AC5DEA001058CC /* ViewIdentifier.swift */; };
+ D23F8E6E29DDCD28001CFAE8 /* RUMViewsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EFF3D22731822A00D09F33 /* RUMViewsHandler.swift */; };
+ D23F8E6F29DDCD28001CFAE8 /* RequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25FF2ED29CC73240063802D /* RequestBuilder.swift */; };
+ D23F8E7029DDCD28001CFAE8 /* URLSessionRUMResourcesHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BCB11E29D30AF000737A9A /* URLSessionRUMResourcesHandler.swift */; };
+ D23F8E7129DDCD28001CFAE8 /* RUMEventBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF281D24B8968D000B3D9B /* RUMEventBuilder.swift */; };
+ D23F8E7229DDCD28001CFAE8 /* ErrorMessageReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D215ED6A29D2E1080046B721 /* ErrorMessageReceiver.swift */; };
+ D23F8E7329DDCD28001CFAE8 /* SwiftUIActionModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29D5A4C273BF8B400A687C1 /* SwiftUIActionModifier.swift */; };
+ D23F8E7429DDCD28001CFAE8 /* RUMCommandSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616CCE12250A1868009FED46 /* RUMCommandSubscriber.swift */; };
+ D23F8E7529DDCD28001CFAE8 /* RUMUserActionScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61494CB924CB126F0082C633 /* RUMUserActionScope.swift */; };
+ D23F8E7629DDCD28001CFAE8 /* RUMConnectivityInfoProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B0A4E24EBDC6B00A2A780 /* RUMConnectivityInfoProvider.swift */; };
+ D23F8E7729DDCD28001CFAE8 /* UIKitRUMViewsPredicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3CDA62512144600C816E5 /* UIKitRUMViewsPredicate.swift */; };
+ D23F8E7829DDCD28001CFAE8 /* LongTaskObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E359F4D26CD518D001E25E9 /* LongTaskObserver.swift */; };
+ D23F8E7A29DDCD28001CFAE8 /* SessionReplayDependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615950ED291C058F00470E0C /* SessionReplayDependency.swift */; };
+ D23F8E7B29DDCD28001CFAE8 /* RUMDeviceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FD9FCB28533EDF00214BD9 /* RUMDeviceInfo.swift */; };
+ D23F8E7C29DDCD28001CFAE8 /* RUMOffViewEventsHandlingRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A614E7276B2BD000A06CE7 /* RUMOffViewEventsHandlingRule.swift */; };
+ D23F8E7D29DDCD28001CFAE8 /* RUMScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3E63624BF191F008053F2 /* RUMScope.swift */; };
+ D23F8E7E29DDCD28001CFAE8 /* CrashReportReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D236BE2729520FED00676E67 /* CrashReportReceiver.swift */; };
+ D23F8E7F29DDCD28001CFAE8 /* UIViewControllerSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3CDA42511190E00C816E5 /* UIViewControllerSwizzler.swift */; };
+ D23F8E8029DDCD28001CFAE8 /* VitalInfoSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9973F0268DF69500D8059B /* VitalInfoSampler.swift */; };
+ D23F8E8129DDCD28001CFAE8 /* RUMViewScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C2C21124C5951400C0321C /* RUMViewScope.swift */; };
+ D23F8E8229DDCD28001CFAE8 /* RUMSessionScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C2C20624C098FC00C0321C /* RUMSessionScope.swift */; };
+ D23F8E8329DDCD28001CFAE8 /* RUMUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B0A4A24EBC43D00A2A780 /* RUMUser.swift */; };
+ D23F8E8429DDCD28001CFAE8 /* UIKitRUMUserActionsPredicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F637AED12697404200516F32 /* UIKitRUMUserActionsPredicate.swift */; };
+ D23F8E8529DDCD28001CFAE8 /* SwiftUIExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FCA238271D896E0020286F /* SwiftUIExtensions.swift */; };
+ D23F8E8629DDCD28001CFAE8 /* RUMDataModelsMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618715F824DC13A100FC0F69 /* RUMDataModelsMapping.swift */; };
+ D23F8E8729DDCD28001CFAE8 /* RUMInstrumentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616CCE15250A467E009FED46 /* RUMInstrumentation.swift */; };
+ D23F8E8829DDCD28001CFAE8 /* VitalCPUReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC8B5D92668197B000F7529 /* VitalCPUReader.swift */; };
+ D23F8E8929DDCD28001CFAE8 /* RUMOperatingSystemInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616C0A9D28573DFF00C13264 /* RUMOperatingSystemInfo.swift */; };
+ D23F8E8A29DDCD28001CFAE8 /* RUMEventsMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E81EF25A740140084B751 /* RUMEventsMapper.swift */; };
+ D23F8E8B29DDCD28001CFAE8 /* RUMContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3E63824BF19B4008053F2 /* RUMContext.swift */; };
+ D23F8E8C29DDCD28001CFAE8 /* RUMBaggageKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25FF2F329CC88060063802D /* RUMBaggageKeys.swift */; };
+ D23F8E8D29DDCD28001CFAE8 /* VitalRefreshRateReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EA3CA6826775A3500B16871 /* VitalRefreshRateReader.swift */; };
+ D23F8E8E29DDCD28001CFAE8 /* UIEventCommandFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6141015A251A601D00E3C2D9 /* UIEventCommandFactory.swift */; };
+ D23F8E8F29DDCD28001CFAE8 /* RUMUUIDGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618DCFD824C7269500589570 /* RUMUUIDGenerator.swift */; };
+ D23F8EA029DDCD38001CFAE8 /* RUMOffViewEventsHandlingRuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A614E9276B9D4C00A06CE7 /* RUMOffViewEventsHandlingRuleTests.swift */; };
+ D23F8EA229DDCD38001CFAE8 /* RUMSessionScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C2C20824C0C75500C0321C /* RUMSessionScopeTests.swift */; };
+ D23F8EA329DDCD38001CFAE8 /* RUMUserActionScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617CD0DC24CEDDD300B0B557 /* RUMUserActionScopeTests.swift */; };
+ D23F8EA529DDCD38001CFAE8 /* UIKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29A9FDF29DDC75A005C54A4 /* UIKitMocks.swift */; };
+ D23F8EA629DDCD38001CFAE8 /* RUMDeviceInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FD9FCE28534EBD00214BD9 /* RUMDeviceInfoTests.swift */; };
+ D23F8EA829DDCD38001CFAE8 /* RUMResourceScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61494CB424C864680082C633 /* RUMResourceScopeTests.swift */; };
+ D23F8EAB29DDCD38001CFAE8 /* RUMDataModelMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E820425A879AF0084B751 /* RUMDataModelMocks.swift */; };
+ D23F8EAC29DDCD38001CFAE8 /* RUMDataModelsMappingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618715FB24DC5F0800FC0F69 /* RUMDataModelsMappingTests.swift */; };
+ D23F8EAD29DDCD38001CFAE8 /* RUMEventBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF282024B8981D000B3D9B /* RUMEventBuilderTests.swift */; };
+ D23F8EAE29DDCD38001CFAE8 /* DDTAssertValidRUMUUID.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29A9FCB29DDBCC5005C54A4 /* DDTAssertValidRUMUUID.swift */; };
+ D23F8EAF29DDCD38001CFAE8 /* RUMScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618DCFDE24C75FD300589570 /* RUMScopeTests.swift */; };
+ D23F8EB029DDCD38001CFAE8 /* SessionReplayDependencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615950EA291C029700470E0C /* SessionReplayDependencyTests.swift */; };
+ D23F8EB129DDCD38001CFAE8 /* RUMViewScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6198D27024C6E3B700493501 /* RUMViewScopeTests.swift */; };
+ D23F8EB229DDCD38001CFAE8 /* ValuePublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611529AD25E3E429004F740E /* ValuePublisherTests.swift */; };
+ D23F8EB329DDCD38001CFAE8 /* ErrorMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26ED28AFB65B005DD405 /* ErrorMessageReceiverTests.swift */; };
+ D23F8EB429DDCD38001CFAE8 /* RUMApplicationScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617B953F24BF4DB300E6F443 /* RUMApplicationScopeTests.swift */; };
+ D23F8EB629DDCD38001CFAE8 /* RUMViewsHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29889C72734136200A4D1A9 /* RUMViewsHandlerTests.swift */; };
+ D23F8EB829DDCD38001CFAE8 /* RUMActionsHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615C3195251DD5080018781C /* RUMActionsHandlerTests.swift */; };
+ D23F8EB929DDCD38001CFAE8 /* RUMFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E5333024B75DFC003D6C4E /* RUMFeatureMocks.swift */; };
+ D23F8EBA29DDCD38001CFAE8 /* ViewIdentifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C1510C25AC8C1B00362D4B /* ViewIdentifierTests.swift */; };
+ D23F8EBE29DDCD38001CFAE8 /* WebViewEventReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E53889B2773C4B300A7DC42 /* WebViewEventReceiverTests.swift */; };
+ D23F8EBF29DDCD38001CFAE8 /* URLSessionRUMResourcesHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BCB12129D34A5F00737A9A /* URLSessionRUMResourcesHandlerTests.swift */; };
+ D23F8EC029DDCD38001CFAE8 /* RUMEventSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61122EED25B1D75B00F9C7F5 /* RUMEventSanitizerTests.swift */; };
+ D23F8EC129DDCD38001CFAE8 /* RUMEventsMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E81F625A743600084B751 /* RUMEventsMapperTests.swift */; };
+ D23F8EC429DDCD38001CFAE8 /* RUMCommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618715F624DC0CDE00FC0F69 /* RUMCommandTests.swift */; };
+ D23F8EC629DDCD38001CFAE8 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; };
+ D23F8EC729DDCD38001CFAE8 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; };
+ D23F8ECE29DDCD53001CFAE8 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2DA2385298D57AA00C6C7E6 /* DatadogInternal.framework */; };
+ D240680827CE6C9E00C04F44 /* ConsoleOutputInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C902461A648003D8BB8 /* ConsoleOutputInterceptor.swift */; };
+ D240681E27CE6C9E00C04F44 /* ExampleAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C0424616DE9003D8BB8 /* ExampleAppDelegate.swift */; };
+ D240682B27CE6C9E00C04F44 /* UIButton+Disabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C912461A648003D8BB8 /* UIButton+Disabling.swift */; };
+ D240682D27CE6C9E00C04F44 /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614CADD62510BAC000B93D2D /* Environment.swift */; };
+ D240683D27CE6C9E00C04F44 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 61441C0D24616DEC003D8BB8 /* Assets.xcassets */; };
+ D240685527CF5D0100C04F44 /* DatadogCore.framework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = D2CB6ED127C50EAE00A62B57 /* DatadogCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D240685927CF5D0100C04F44 /* DatadogCrashReporting.framework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = D2CB6FD127C5348200A62B57 /* DatadogCrashReporting.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D240686027CF5D0100C04F44 /* DatadogObjc.framework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = D2CB6FB027C5217A00A62B57 /* DatadogObjc.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D240686827CF642900C04F44 /* SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61776D4D273E6D9F00F93802 /* SwiftUI.swift */; };
+ D240687027CF971C00C04F44 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; };
+ D240687127CF971C00C04F44 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6ED127C50EAE00A62B57 /* DatadogCore.framework */; };
+ D240687227CF971C00C04F44 /* DatadogCrashReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6FD127C5348200A62B57 /* DatadogCrashReporting.framework */; };
+ D240687327CF971C00C04F44 /* DatadogObjc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6FB027C5217A00A62B57 /* DatadogObjc.framework */; };
+ D240687827CF982B00C04F44 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; };
+ D240687B27CF982C00C04F44 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* DatadogCore.framework */; };
+ D240687C27CF982C00C04F44 /* DatadogCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* DatadogCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D240687D27CF982D00C04F44 /* DatadogCrashReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7885425C180CB002675B5 /* DatadogCrashReporting.framework */; };
+ D240687E27CF982D00C04F44 /* DatadogCrashReporting.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7885425C180CB002675B5 /* DatadogCrashReporting.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D240687F27CF982F00C04F44 /* DatadogObjc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133BF0242397DA00786299 /* DatadogObjc.framework */; };
+ D240688027CF982F00C04F44 /* DatadogObjc.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61133BF0242397DA00786299 /* DatadogObjc.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D240688627CFA64A00C04F44 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D240688427CFA64A00C04F44 /* LaunchScreen.storyboard */; };
+ D242C29E2A14D6A6004B4980 /* RemoteLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194E4B828785BFD00EB6307 /* RemoteLogger.swift */; };
+ D242C29F2A14D6A7004B4980 /* RemoteLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194E4B828785BFD00EB6307 /* RemoteLogger.swift */; };
+ D242C2A12A14D747004B4980 /* RemoteLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D242C2A02A14D747004B4980 /* RemoteLoggerTests.swift */; };
+ D242C2A22A14D747004B4980 /* RemoteLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D242C2A02A14D747004B4980 /* RemoteLoggerTests.swift */; };
+ D2432CF929EDB22C00D93657 /* Flushable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2432CF829EDB22C00D93657 /* Flushable.swift */; };
+ D2432CFA29EDB22C00D93657 /* Flushable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2432CF829EDB22C00D93657 /* Flushable.swift */; };
+ D243BBC0276C9D640019C857 /* PLCrashReporterIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243BBBF276C9D640019C857 /* PLCrashReporterIntegrationTests.swift */; };
+ D243BBEC29A614CE000B9CEC /* LoggerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243BBEB29A614CE000B9CEC /* LoggerProtocol.swift */; };
+ D243BBED29A614CE000B9CEC /* LoggerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243BBEB29A614CE000B9CEC /* LoggerProtocol.swift */; };
+ D243BBF229A6209C000B9CEC /* RequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243BBF129A6209C000B9CEC /* RequestBuilder.swift */; };
+ D243BBF329A6209C000B9CEC /* RequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243BBF129A6209C000B9CEC /* RequestBuilder.swift */; };
+ D243BBF529A620CC000B9CEC /* MessageReceivers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243BBF429A620CC000B9CEC /* MessageReceivers.swift */; };
+ D243BBF629A620CC000B9CEC /* MessageReceivers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243BBF429A620CC000B9CEC /* MessageReceivers.swift */; };
+ D244B3A3271EDACD003E1B29 /* SwiftUIExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D244B3A2271EDACD003E1B29 /* SwiftUIExtensionsTests.swift */; };
+ D24C9C3F29A79772002057CF /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C3E29A79772002057CF /* Logger.swift */; };
+ D24C9C4029A79772002057CF /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C3E29A79772002057CF /* Logger.swift */; };
+ D24C9C4229A7A50D002057CF /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D207317C29A5226A00ECBF94 /* DatadogLogs.framework */; };
+ D24C9C4329A7A50D002057CF /* DatadogLogs.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D207317C29A5226A00ECBF94 /* DatadogLogs.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D24C9C4629A7A520002057CF /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D20731B429A5279D00ECBF94 /* DatadogLogs.framework */; };
+ D24C9C4729A7A520002057CF /* DatadogLogs.framework in ⚙️ Embed Framework Dependencies */ = {isa = PBXBuildFile; fileRef = D20731B429A5279D00ECBF94 /* DatadogLogs.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ D24C9C4A29A7B35C002057CF /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D207317C29A5226A00ECBF94 /* DatadogLogs.framework */; };
+ D24C9C4B29A7B365002057CF /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D20731B429A5279D00ECBF94 /* DatadogLogs.framework */; };
+ D24C9C4D29A7BA3F002057CF /* LogsMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C4C29A7B9CA002057CF /* LogsMocks.swift */; };
+ D24C9C4E29A7BA41002057CF /* LogsMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C4C29A7B9CA002057CF /* LogsMocks.swift */; };
+ D24C9C5229A7BD12002057CF /* SamplerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C5129A7BD12002057CF /* SamplerMock.swift */; };
+ D24C9C5329A7BD12002057CF /* SamplerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C5129A7BD12002057CF /* SamplerMock.swift */; };
+ D24C9C5529A7C5F3002057CF /* DateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C5429A7C5F3002057CF /* DateProvider.swift */; };
+ D24C9C5629A7C5F3002057CF /* DateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C5429A7C5F3002057CF /* DateProvider.swift */; };
+ D24C9C6029A7CB0A002057CF /* DatadogLogsFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB222F244E1BE900902D19 /* DatadogLogsFeatureTests.swift */; };
+ D24C9C6129A7CB0C002057CF /* DatadogLogsFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB222F244E1BE900902D19 /* DatadogLogsFeatureTests.swift */; };
+ D24C9C6429A7CB7B002057CF /* CrashLogReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF416125EE5FF400CE35EC /* CrashLogReceiverTests.swift */; };
+ D24C9C6529A7CB7D002057CF /* CrashLogReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF416125EE5FF400CE35EC /* CrashLogReceiverTests.swift */; };
+ D24C9C6929A7CE06002057CF /* DDErrorMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C6629A7CBF0002057CF /* DDErrorMocks.swift */; };
+ D24C9C6A29A7CE06002057CF /* DDErrorMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C6629A7CBF0002057CF /* DDErrorMocks.swift */; };
+ D24C9C7129A7D57A002057CF /* DirectoriesMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C7029A7D57A002057CF /* DirectoriesMock.swift */; };
+ D24C9C7229A7D57A002057CF /* DirectoriesMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24C9C7029A7D57A002057CF /* DirectoriesMock.swift */; };
+ D25085102976E30000E931C3 /* DatadogRemoteFeatureMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D250850F2976E30000E931C3 /* DatadogRemoteFeatureMock.swift */; };
+ D25085112976E30000E931C3 /* DatadogRemoteFeatureMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D250850F2976E30000E931C3 /* DatadogRemoteFeatureMock.swift */; };
+ D253EE962B988CA90010B589 /* ViewCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D253EE952B988CA90010B589 /* ViewCache.swift */; };
+ D253EE972B988CA90010B589 /* ViewCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D253EE952B988CA90010B589 /* ViewCache.swift */; };
+ D253EE9B2B98B37B0010B589 /* ViewCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D253EE982B98B3690010B589 /* ViewCacheTests.swift */; };
+ D253EE9C2B98B37C0010B589 /* ViewCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D253EE982B98B3690010B589 /* ViewCacheTests.swift */; };
+ D2552AF32BBC47D300A45725 /* WebRecordIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C5D52F2B84F71200B63F36 /* WebRecordIntegrationTests.swift */; };
+ D2552AF52BBC492400A45725 /* WebEventIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2552AF42BBC47D900A45725 /* WebEventIntegrationTests.swift */; };
+ D2552AF62BBC492600A45725 /* WebEventIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2552AF42BBC47D900A45725 /* WebEventIntegrationTests.swift */; };
+ D2553807288AA84F00727FAD /* UploadMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2553806288AA84F00727FAD /* UploadMock.swift */; };
+ D2553808288AA84F00727FAD /* UploadMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2553806288AA84F00727FAD /* UploadMock.swift */; };
+ D2553826288F0B1A00727FAD /* BatteryStatusPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2553825288F0B1A00727FAD /* BatteryStatusPublisher.swift */; };
+ D2553827288F0B1A00727FAD /* BatteryStatusPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2553825288F0B1A00727FAD /* BatteryStatusPublisher.swift */; };
+ D2553829288F0B2400727FAD /* LowPowerModePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2553828288F0B2300727FAD /* LowPowerModePublisher.swift */; };
+ D255382A288F0B2400727FAD /* LowPowerModePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2553828288F0B2300727FAD /* LowPowerModePublisher.swift */; };
+ D2579552298ABB04008A1BE5 /* FileWriterMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579547298ABB04008A1BE5 /* FileWriterMock.swift */; };
+ D2579553298ABB04008A1BE5 /* DatadogContextMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579548298ABB04008A1BE5 /* DatadogContextMock.swift */; };
+ D2579554298ABB04008A1BE5 /* FeatureBaggageMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579549298ABB04008A1BE5 /* FeatureBaggageMock.swift */; };
+ D2579555298ABB04008A1BE5 /* PassthroughCoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954A298ABB04008A1BE5 /* PassthroughCoreMock.swift */; };
+ D2579556298ABB04008A1BE5 /* FoundationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954B298ABB04008A1BE5 /* FoundationMocks.swift */; };
+ D2579557298ABB04008A1BE5 /* AttributesMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954C298ABB04008A1BE5 /* AttributesMocks.swift */; };
+ D2579558298ABB04008A1BE5 /* Encoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954E298ABB04008A1BE5 /* Encoding.swift */; };
+ D2579559298ABB04008A1BE5 /* DDAssert.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954F298ABB04008A1BE5 /* DDAssert.swift */; };
+ D257955A298ABB04008A1BE5 /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579550298ABB04008A1BE5 /* SwiftExtensions.swift */; };
+ D257955B298ABB04008A1BE5 /* XCTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579551298ABB04008A1BE5 /* XCTestCase.swift */; };
+ D2579578298ABB83008A1BE5 /* XCTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579551298ABB04008A1BE5 /* XCTestCase.swift */; };
+ D2579579298ABB83008A1BE5 /* FoundationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954B298ABB04008A1BE5 /* FoundationMocks.swift */; };
+ D257957A298ABB83008A1BE5 /* DatadogContextMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579548298ABB04008A1BE5 /* DatadogContextMock.swift */; };
+ D257957B298ABB83008A1BE5 /* Encoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954E298ABB04008A1BE5 /* Encoding.swift */; };
+ D257957C298ABB83008A1BE5 /* DDAssert.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954F298ABB04008A1BE5 /* DDAssert.swift */; };
+ D257957D298ABB83008A1BE5 /* FileWriterMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579547298ABB04008A1BE5 /* FileWriterMock.swift */; };
+ D257957E298ABB83008A1BE5 /* FeatureBaggageMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579549298ABB04008A1BE5 /* FeatureBaggageMock.swift */; };
+ D257957F298ABB83008A1BE5 /* AttributesMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954C298ABB04008A1BE5 /* AttributesMocks.swift */; };
+ D2579580298ABB83008A1BE5 /* PassthroughCoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D257954A298ABB04008A1BE5 /* PassthroughCoreMock.swift */; };
+ D2579581298ABB83008A1BE5 /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2579550298ABB04008A1BE5 /* SwiftExtensions.swift */; };
+ D2579592298ABCED008A1BE5 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2579591298ABCED008A1BE5 /* XCTest.framework */; };
+ D2579595298AC912008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; };
+ D2579596298AC927008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257958B298ABB83008A1BE5 /* TestUtilities.framework */; };
+ D2579599298AD95F008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; };
+ D257959A298AD967008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257958B298ABB83008A1BE5 /* TestUtilities.framework */; };
+ D25C834C2B8657CF008E73B1 /* SegmentJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25C834B2B8657CF008E73B1 /* SegmentJSONTests.swift */; };
+ D25CFA9829C4F41900E3A43D /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2C1A55A29C4F2DF00946C31 /* DatadogTrace.framework */; };
+ D25CFA9929C4F41900E3A43D /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257958B298ABB83008A1BE5 /* TestUtilities.framework */; };
+ D25CFA9C29C4FC6900E3A43D /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25EE93429C4C3C300CE3839 /* DatadogTrace.framework */; };
+ D25CFA9D29C4FC6E00E3A43D /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2C1A55A29C4F2DF00946C31 /* DatadogTrace.framework */; };
+ D25CFA9F29C860E100E3A43D /* TracingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25CFA9E29C85FA400E3A43D /* TracingFeatureMocks.swift */; };
+ D25CFAA029C860E300E3A43D /* TracingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25CFA9E29C85FA400E3A43D /* TracingFeatureMocks.swift */; };
+ D25CFAA229C8644E00E3A43D /* Casting+Tracing.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25CFAA129C8644E00E3A43D /* Casting+Tracing.swift */; };
+ D25CFAA329C8644E00E3A43D /* Casting+Tracing.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25CFAA129C8644E00E3A43D /* Casting+Tracing.swift */; };
+ D25EE93C29C4C3C300CE3839 /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25EE93429C4C3C300CE3839 /* DatadogTrace.framework */; platformFilter = ios; };
+ D2612F48290197C700509B7D /* LaunchTimePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C7E3AD28FEBDA10023B2CC /* LaunchTimePublisher.swift */; };
+ D263BCAF29DAFFEB00FA0E21 /* PerformancePresetOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = D263BCAE29DAFFEB00FA0E21 /* PerformancePresetOverride.swift */; };
+ D263BCB029DAFFEB00FA0E21 /* PerformancePresetOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = D263BCAE29DAFFEB00FA0E21 /* PerformancePresetOverride.swift */; };
+ D263BCB429DB014900FA0E21 /* FixedWidthInteger+ConvenienceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D263BCB229DB014900FA0E21 /* FixedWidthInteger+ConvenienceTests.swift */; };
+ D263BCB529DB014900FA0E21 /* FixedWidthInteger+ConvenienceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D263BCB229DB014900FA0E21 /* FixedWidthInteger+ConvenienceTests.swift */; };
+ D263BCB629DB014900FA0E21 /* TimeInterval+ConvenienceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D263BCB329DB014900FA0E21 /* TimeInterval+ConvenienceTests.swift */; };
+ D263BCB729DB014900FA0E21 /* TimeInterval+ConvenienceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D263BCB329DB014900FA0E21 /* TimeInterval+ConvenienceTests.swift */; };
+ D26416B62A30E84F00BCD9F7 /* CoreRegistryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26416B52A30E84F00BCD9F7 /* CoreRegistryTest.swift */; };
+ D26416B72A30E84F00BCD9F7 /* CoreRegistryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26416B52A30E84F00BCD9F7 /* CoreRegistryTest.swift */; };
+ D26C49AF2886DC7B00802B2D /* ApplicationStatePublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26C49AE2886DC7B00802B2D /* ApplicationStatePublisherTests.swift */; };
+ D26C49B02886DC7B00802B2D /* ApplicationStatePublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26C49AE2886DC7B00802B2D /* ApplicationStatePublisherTests.swift */; };
+ D26C49BF288982DA00802B2D /* FeatureUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26C49BE288982DA00802B2D /* FeatureUpload.swift */; };
+ D26C49C0288982DA00802B2D /* FeatureUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26C49BE288982DA00802B2D /* FeatureUpload.swift */; };
+ D26F741129ACBDA100D25622 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ D26F741229ACBDAD00D25622 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2DA2385298D57AA00C6C7E6 /* DatadogInternal.framework */; };
+ D270CDDD2B46E3DB0002EACD /* URLSessionDataDelegateSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D270CDDC2B46E3DB0002EACD /* URLSessionDataDelegateSwizzler.swift */; };
+ D270CDDE2B46E3DB0002EACD /* URLSessionDataDelegateSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D270CDDC2B46E3DB0002EACD /* URLSessionDataDelegateSwizzler.swift */; };
+ D270CDE02B46E5A50002EACD /* URLSessionDataDelegateSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D270CDDF2B46E5A50002EACD /* URLSessionDataDelegateSwizzlerTests.swift */; };
+ D270CDE12B46E5A50002EACD /* URLSessionDataDelegateSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D270CDDF2B46E5A50002EACD /* URLSessionDataDelegateSwizzlerTests.swift */; };
+ D274FD1C2CBFEF6D005270B5 /* CGSize+SessionReplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = D274FD1B2CBFEF6D005270B5 /* CGSize+SessionReplay.swift */; };
+ D2777D9D29F6A75800FFBB40 /* TelemetryReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2777D9C29F6A75800FFBB40 /* TelemetryReceiverTests.swift */; };
+ D2777D9E29F6A75800FFBB40 /* TelemetryReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2777D9C29F6A75800FFBB40 /* TelemetryReceiverTests.swift */; };
+ D27CBD9A2BB5DBBB00C766AA /* Mocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CBD992BB5DBBB00C766AA /* Mocks.swift */; };
+ D27D81C12A5D415200281CC2 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; };
+ D27D81C22A5D415200281CC2 /* DatadogCrashReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7885425C180CB002675B5 /* DatadogCrashReporting.framework */; };
+ D27D81C32A5D415200281CC2 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ D27D81C42A5D415200281CC2 /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D207317C29A5226A00ECBF94 /* DatadogLogs.framework */; };
+ D27D81C52A5D415200281CC2 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; };
+ D27D81C62A5D415200281CC2 /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25EE93429C4C3C300CE3839 /* DatadogTrace.framework */; };
+ D27D81C72A5D415200281CC2 /* DatadogWebViewTracking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CE119FE29F7BE0100202522 /* DatadogWebViewTracking.framework */; };
+ D27D81C82A5D41F400281CC2 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; };
+ D284C7402C2059F3005142CC /* ObjcExceptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D284C73F2C2059F3005142CC /* ObjcExceptionTests.swift */; };
+ D284C7412C2059F3005142CC /* ObjcExceptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D284C73F2C2059F3005142CC /* ObjcExceptionTests.swift */; };
+ D286626E2A43487500852CE3 /* Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D286626D2A43487500852CE3 /* Datadog.swift */; };
+ D286626F2A43487500852CE3 /* Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D286626D2A43487500852CE3 /* Datadog.swift */; };
+ D28ABFD32CEB87C600623F27 /* UIHostingViewRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28ABFD22CEB87C600623F27 /* UIHostingViewRecorderTests.swift */; };
+ D28ABFD62CECDE6B00623F27 /* URLSessionInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28ABFD52CECDE6B00623F27 /* URLSessionInterceptorTests.swift */; };
+ D28ABFD72CECDE6B00623F27 /* URLSessionInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28ABFD52CECDE6B00623F27 /* URLSessionInterceptorTests.swift */; };
+ D28F836529C9E69E00EF8EA2 /* DatadogTraceFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AD4E3924534075006E34EA /* DatadogTraceFeatureTests.swift */; };
+ D28F836629C9E6A200EF8EA2 /* DatadogTraceFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AD4E3924534075006E34EA /* DatadogTraceFeatureTests.swift */; };
+ D28F836829C9E71D00EF8EA2 /* DDSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28F836729C9E71C00EF8EA2 /* DDSpanTests.swift */; };
+ D28F836929C9E71D00EF8EA2 /* DDSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28F836729C9E71C00EF8EA2 /* DDSpanTests.swift */; };
+ D28F836B29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28F836A29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift */; };
+ D28F836C29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28F836A29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift */; };
+ D28FCC352B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D28FCC342B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy */; };
+ D28FCC362B5FCBD100CCC077 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D28FCC342B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy */; };
+ D29294E0291D5ED100F8EFF9 /* ApplicationVersionPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29294DF291D5ECD00F8EFF9 /* ApplicationVersionPublisher.swift */; };
+ D29294E1291D5ED500F8EFF9 /* ApplicationVersionPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29294DF291D5ECD00F8EFF9 /* ApplicationVersionPublisher.swift */; };
+ D29294E3291D652C00F8EFF9 /* ApplicationVersionPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29294E2291D652900F8EFF9 /* ApplicationVersionPublisherTests.swift */; };
+ D29294E4291D652D00F8EFF9 /* ApplicationVersionPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29294E2291D652900F8EFF9 /* ApplicationVersionPublisherTests.swift */; };
+ D293302C2A137DAD0029C9EA /* CrashReportingFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D293302B2A137DAD0029C9EA /* CrashReportingFeature.swift */; };
+ D293302D2A137DAD0029C9EA /* CrashReportingFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D293302B2A137DAD0029C9EA /* CrashReportingFeature.swift */; };
+ D295A16529F299C9007C0E9A /* URLSessionInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D295A16429F299C9007C0E9A /* URLSessionInterceptor.swift */; };
+ D295A16629F299C9007C0E9A /* URLSessionInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D295A16429F299C9007C0E9A /* URLSessionInterceptor.swift */; };
+ D29732492A5C108700827599 /* DDScriptMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29732462A5C108700827599 /* DDScriptMessageHandler.swift */; };
+ D297324B2A5C108700827599 /* MessageEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29732472A5C108700827599 /* MessageEmitter.swift */; };
+ D29732512A5C109A00827599 /* MessageEmitterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D297324F2A5C109A00827599 /* MessageEmitterTests.swift */; };
+ D29732532A5C109A00827599 /* WebViewTrackingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29732502A5C109A00827599 /* WebViewTrackingTests.swift */; };
+ D29A9F3C29DD84AB005C54A4 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; };
+ D29A9F4B29DD8525005C54A4 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ D29A9F5029DD85BA005C54A4 /* RUMContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3E63824BF19B4008053F2 /* RUMContext.swift */; };
+ D29A9F5129DD85BB005C54A4 /* LongTaskObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E359F4D26CD518D001E25E9 /* LongTaskObserver.swift */; };
+ D29A9F5229DD85BB005C54A4 /* RUMUUIDGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618DCFD824C7269500589570 /* RUMUUIDGenerator.swift */; };
+ D29A9F5329DD85BB005C54A4 /* RUMOffViewEventsHandlingRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A614E7276B2BD000A06CE7 /* RUMOffViewEventsHandlingRule.swift */; };
+ D29A9F5429DD85BB005C54A4 /* RUMScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3E63624BF191F008053F2 /* RUMScope.swift */; };
+ D29A9F5529DD85BB005C54A4 /* PerformanceMetric.swift in Sources */ = {isa = PBXBuildFile; fileRef = E179FB4D28F80A6400CC2698 /* PerformanceMetric.swift */; };
+ D29A9F5729DD85BB005C54A4 /* URLSessionRUMResourcesHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BCB11E29D30AF000737A9A /* URLSessionRUMResourcesHandler.swift */; };
+ D29A9F5829DD85BB005C54A4 /* RUMConnectivityInfoProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B0A4E24EBDC6B00A2A780 /* RUMConnectivityInfoProvider.swift */; };
+ D29A9F5929DD85BB005C54A4 /* RUMCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3E63A24BF1A4B008053F2 /* RUMCommand.swift */; };
+ D29A9F5A29DD85BB005C54A4 /* RUMScopeDependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6122514727FDFF82004F5AE4 /* RUMScopeDependencies.swift */; };
+ D29A9F5B29DD85BB005C54A4 /* VitalMemoryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BBBCB0265E71C600943419 /* VitalMemoryReader.swift */; };
+ D29A9F5C29DD85BB005C54A4 /* RUMSessionScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C2C20624C098FC00C0321C /* RUMSessionScope.swift */; };
+ D29A9F5D29DD85BB005C54A4 /* RUMCommandSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616CCE12250A1868009FED46 /* RUMCommandSubscriber.swift */; };
+ D29A9F5E29DD85BB005C54A4 /* UIKitRUMViewsPredicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3CDA62512144600C816E5 /* UIKitRUMViewsPredicate.swift */; };
+ D29A9F6029DD85BB005C54A4 /* ViewIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF9A4425AC5DEA001058CC /* ViewIdentifier.swift */; };
+ D29A9F6129DD85BB005C54A4 /* CrashReportReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D236BE2729520FED00676E67 /* CrashReportReceiver.swift */; };
+ D29A9F6229DD85BB005C54A4 /* WebViewEventReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2CBC26A294383F200134409 /* WebViewEventReceiver.swift */; };
+ D29A9F6329DD85BB005C54A4 /* RUMMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E5333524B84B43003D6C4E /* RUMMonitor.swift */; };
+ D29A9F6429DD85BB005C54A4 /* VitalInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3FC3C0626526EFF00DEED9E /* VitalInfo.swift */; };
+ D29A9F6529DD85BB005C54A4 /* RUMUserActionScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61494CB924CB126F0082C633 /* RUMUserActionScope.swift */; };
+ D29A9F6629DD85BB005C54A4 /* RUMUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B0A4A24EBC43D00A2A780 /* RUMUser.swift */; };
+ D29A9F6729DD85BB005C54A4 /* RUMOperatingSystemInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616C0A9D28573DFF00C13264 /* RUMOperatingSystemInfo.swift */; };
+ D29A9F6829DD85BB005C54A4 /* RUMContextAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2CBC26D294395A300134409 /* RUMContextAttributes.swift */; };
+ D29A9F6929DD85BB005C54A4 /* UIEventCommandFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6141015A251A601D00E3C2D9 /* UIEventCommandFactory.swift */; };
+ D29A9F6A29DD85BB005C54A4 /* SwiftUIViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D249859F2728042200B4F72D /* SwiftUIViewModifier.swift */; };
+ D29A9F6B29DD85BB005C54A4 /* VitalInfoSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9973F0268DF69500D8059B /* VitalInfoSampler.swift */; };
+ D29A9F6D29DD85BB005C54A4 /* UIApplicationSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6141014E251A57AF00E3C2D9 /* UIApplicationSwizzler.swift */; };
+ D29A9F6E29DD85BB005C54A4 /* RUMUUID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618DCFD624C7265300589570 /* RUMUUID.swift */; };
+ D29A9F6F29DD85BB005C54A4 /* RUMInstrumentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616CCE15250A467E009FED46 /* RUMInstrumentation.swift */; };
+ D29A9F7029DD85BB005C54A4 /* RUMContextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6156CB8D24DDA1B5008CB2B2 /* RUMContextProvider.swift */; };
+ D29A9F7129DD85BB005C54A4 /* RUMDeviceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FD9FCB28533EDF00214BD9 /* RUMDeviceInfo.swift */; };
+ D29A9F7329DD85BB005C54A4 /* RUMApplicationScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3E63D24BF1B91008053F2 /* RUMApplicationScope.swift */; };
+ D29A9F7429DD85BB005C54A4 /* RUMFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25FF2E729CC6B680063802D /* RUMFeature.swift */; };
+ D29A9F7529DD85BB005C54A4 /* RUMViewScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C2C21124C5951400C0321C /* RUMViewScope.swift */; };
+ D29A9F7629DD85BB005C54A4 /* RUMViewsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EFF3D22731822A00D09F33 /* RUMViewsHandler.swift */; };
+ D29A9F7729DD85BB005C54A4 /* RUMDebugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B22E5924F3E6B700DC26D2 /* RUMDebugging.swift */; };
+ D29A9F7829DD85BB005C54A4 /* RUMDataModelsMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618715F824DC13A100FC0F69 /* RUMDataModelsMapping.swift */; };
+ D29A9F7929DD85BB005C54A4 /* RequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25FF2ED29CC73240063802D /* RequestBuilder.swift */; };
+ D29A9F7A29DD85BB005C54A4 /* VitalCPUReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC8B5D92668197B000F7529 /* VitalCPUReader.swift */; };
+ D29A9F7B29DD85BB005C54A4 /* RUMDataModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E26E6B824C87693000B3270 /* RUMDataModels.swift */; };
+ D29A9F7C29DD85BB005C54A4 /* RUMEventBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF281D24B8968D000B3D9B /* RUMEventBuilder.swift */; };
+ D29A9F7D29DD85BB005C54A4 /* RUMEventsMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E81EF25A740140084B751 /* RUMEventsMapper.swift */; };
+ D29A9F7E29DD85BB005C54A4 /* UIViewControllerSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3CDA42511190E00C816E5 /* UIViewControllerSwizzler.swift */; };
+ D29A9F7F29DD85BB005C54A4 /* RUMEventSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61122ED325B1B84D00F9C7F5 /* RUMEventSanitizer.swift */; };
+ D29A9F8029DD85BB005C54A4 /* UIViewControllerHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3CDA2251118FB00C816E5 /* UIViewControllerHandler.swift */; };
+ D29A9F8129DD85BB005C54A4 /* RUMConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25FF2EA29CC6D6F0063802D /* RUMConfiguration.swift */; };
+ D29A9F8229DD85BB005C54A4 /* UIKitRUMUserActionsPredicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F637AED12697404200516F32 /* UIKitRUMUserActionsPredicate.swift */; };
+ D29A9F8329DD85BB005C54A4 /* RUMBaggageKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25FF2F329CC88060063802D /* RUMBaggageKeys.swift */; };
+ D29A9F8429DD85BB005C54A4 /* RUMResourceScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61494CB024C839460082C633 /* RUMResourceScope.swift */; };
+ D29A9F8529DD85BB005C54A4 /* SwiftUIViewHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24985A12728048B00B4F72D /* SwiftUIViewHandler.swift */; };
+ D29A9F8629DD85BB005C54A4 /* SessionReplayDependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615950ED291C058F00470E0C /* SessionReplayDependency.swift */; };
+ D29A9F8729DD85BB005C54A4 /* SwiftUIActionModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29D5A4C273BF8B400A687C1 /* SwiftUIActionModifier.swift */; };
+ D29A9F8829DD85BB005C54A4 /* ErrorMessageReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D215ED6A29D2E1080046B721 /* ErrorMessageReceiver.swift */; };
+ D29A9F8929DD85BB005C54A4 /* VitalRefreshRateReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EA3CA6826775A3500B16871 /* VitalRefreshRateReader.swift */; };
+ D29A9F8C29DD861C005C54A4 /* ValuePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611529A425E3DD51004F740E /* ValuePublisher.swift */; };
+ D29A9F8D29DD8665005C54A4 /* UIKitExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615F197B25B5A64B00BE14B5 /* UIKitExtensions.swift */; };
+ D29A9F8E29DD8665005C54A4 /* SwiftUIExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FCA238271D896E0020286F /* SwiftUIExtensions.swift */; };
+ D29A9F9029DD876F005C54A4 /* CITestIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11625D727B681D200E428C6 /* CITestIntegration.swift */; };
+ D29A9F9129DD8771005C54A4 /* CITestIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11625D727B681D200E428C6 /* CITestIntegration.swift */; };
+ D29A9F9529DDB1DB005C54A4 /* UIKitExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29A9F9429DDB1DB005C54A4 /* UIKitExtensions.swift */; };
+ D29A9F9629DDB1DB005C54A4 /* UIKitExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29A9F9429DDB1DB005C54A4 /* UIKitExtensions.swift */; };
+ D29A9F9A29DDB483005C54A4 /* URLSessionRUMResourcesHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BCB12129D34A5F00737A9A /* URLSessionRUMResourcesHandlerTests.swift */; };
+ D29A9F9D29DDB483005C54A4 /* ValuePublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611529AD25E3E429004F740E /* ValuePublisherTests.swift */; };
+ D29A9F9F29DDB483005C54A4 /* RUMApplicationScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617B953F24BF4DB300E6F443 /* RUMApplicationScopeTests.swift */; };
+ D29A9FA229DDB483005C54A4 /* RUMEventSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61122EED25B1D75B00F9C7F5 /* RUMEventSanitizerTests.swift */; };
+ D29A9FA329DDB483005C54A4 /* RUMDeviceInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FD9FCE28534EBD00214BD9 /* RUMDeviceInfoTests.swift */; };
+ D29A9FA429DDB483005C54A4 /* WebViewEventReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E53889B2773C4B300A7DC42 /* WebViewEventReceiverTests.swift */; };
+ D29A9FA629DDB483005C54A4 /* RUMOffViewEventsHandlingRuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A614E9276B9D4C00A06CE7 /* RUMOffViewEventsHandlingRuleTests.swift */; };
+ D29A9FA729DDB483005C54A4 /* RUMCommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618715F624DC0CDE00FC0F69 /* RUMCommandTests.swift */; };
+ D29A9FAA29DDB483005C54A4 /* RUMViewsHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29889C72734136200A4D1A9 /* RUMViewsHandlerTests.swift */; };
+ D29A9FAB29DDB483005C54A4 /* RUMUserActionScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617CD0DC24CEDDD300B0B557 /* RUMUserActionScopeTests.swift */; };
+ D29A9FAC29DDB483005C54A4 /* RUMActionsHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615C3195251DD5080018781C /* RUMActionsHandlerTests.swift */; };
+ D29A9FAE29DDB483005C54A4 /* SessionReplayDependencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615950EA291C029700470E0C /* SessionReplayDependencyTests.swift */; };
+ D29A9FB329DDB483005C54A4 /* RUMScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618DCFDE24C75FD300589570 /* RUMScopeTests.swift */; };
+ D29A9FB729DDB483005C54A4 /* ViewIdentifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C1510C25AC8C1B00362D4B /* ViewIdentifierTests.swift */; };
+ D29A9FB829DDB483005C54A4 /* RUMViewScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6198D27024C6E3B700493501 /* RUMViewScopeTests.swift */; };
+ D29A9FB929DDB483005C54A4 /* RUMEventsMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E81F625A743600084B751 /* RUMEventsMapperTests.swift */; };
+ D29A9FBB29DDB483005C54A4 /* ErrorMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26ED28AFB65B005DD405 /* ErrorMessageReceiverTests.swift */; };
+ D29A9FBC29DDB483005C54A4 /* RUMResourceScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61494CB424C864680082C633 /* RUMResourceScopeTests.swift */; };
+ D29A9FBD29DDB483005C54A4 /* RUMSessionScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C2C20824C0C75500C0321C /* RUMSessionScopeTests.swift */; };
+ D29A9FBE29DDB483005C54A4 /* RUMEventBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF282024B8981D000B3D9B /* RUMEventBuilderTests.swift */; };
+ D29A9FC029DDB540005C54A4 /* RUMFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E5333024B75DFC003D6C4E /* RUMFeatureMocks.swift */; };
+ D29A9FC129DDB58C005C54A4 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; platformFilter = ios; };
+ D29A9FC429DDB710005C54A4 /* RUMInternalProxyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49274908288048F400ECD49B /* RUMInternalProxyTests.swift */; };
+ D29A9FC529DDB719005C54A4 /* RUMInternalProxyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49274908288048F400ECD49B /* RUMInternalProxyTests.swift */; };
+ D29A9FC629DDBA8A005C54A4 /* RUMDataModelMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E820425A879AF0084B751 /* RUMDataModelMocks.swift */; };
+ D29A9FCC29DDBCC5005C54A4 /* DDTAssertValidRUMUUID.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29A9FCB29DDBCC5005C54A4 /* DDTAssertValidRUMUUID.swift */; };
+ D29A9FCE29DDC4BA005C54A4 /* RUMFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29A9FCD29DDC470005C54A4 /* RUMFeatureMocks.swift */; };
+ D29A9FCF29DDC4BC005C54A4 /* RUMFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29A9FCD29DDC470005C54A4 /* RUMFeatureMocks.swift */; };
+ D29A9FD029DDC58E005C54A4 /* RUMFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E5332E24B75DE2003D6C4E /* RUMFeatureTests.swift */; };
+ D29A9FD129DDC590005C54A4 /* RUMFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E5332E24B75DE2003D6C4E /* RUMFeatureTests.swift */; };
+ D29A9FD529DDC624005C54A4 /* RUMDataModelsMappingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618715FB24DC5F0800FC0F69 /* RUMDataModelsMappingTests.swift */; };
+ D29A9FD829DDC686005C54A4 /* UIKitRUMViewsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611F82022563C66100CB9BDB /* UIKitRUMViewsPredicateTests.swift */; };
+ D29A9FD929DDC687005C54A4 /* UIKitRUMViewsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611F82022563C66100CB9BDB /* UIKitRUMViewsPredicateTests.swift */; };
+ D29A9FDA29DDC6D0005C54A4 /* RUMEventFileOutputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF282F24BC5E2D000B3D9B /* RUMEventFileOutputTests.swift */; };
+ D29A9FDB29DDC6D1005C54A4 /* RUMEventFileOutputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF282F24BC5E2D000B3D9B /* RUMEventFileOutputTests.swift */; };
+ D29A9FE029DDC75A005C54A4 /* UIKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29A9FDF29DDC75A005C54A4 /* UIKitMocks.swift */; };
+ D29C9F692D00739400CD568E /* Reflector.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29C9F682D00739400CD568E /* Reflector.swift */; };
+ D29C9F6B2D01D5F600CD568E /* ReflectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29C9F6A2D01D5F600CD568E /* ReflectorTests.swift */; };
+ D29CDD3228211A2200F7DAA5 /* TLVBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29CDD3128211A2200F7DAA5 /* TLVBlock.swift */; };
+ D29CDD3328211A2200F7DAA5 /* TLVBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29CDD3128211A2200F7DAA5 /* TLVBlock.swift */; };
+ D2A1EE23287740B500D28DFB /* ApplicationStatePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE22287740B500D28DFB /* ApplicationStatePublisher.swift */; };
+ D2A1EE24287740B500D28DFB /* ApplicationStatePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE22287740B500D28DFB /* ApplicationStatePublisher.swift */; };
+ D2A1EE32287DA51900D28DFB /* UserInfoPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE31287DA51900D28DFB /* UserInfoPublisher.swift */; };
+ D2A1EE33287DA51900D28DFB /* UserInfoPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE31287DA51900D28DFB /* UserInfoPublisher.swift */; };
+ D2A1EE35287EB8DB00D28DFB /* ServerOffsetPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE34287EB8DB00D28DFB /* ServerOffsetPublisherTests.swift */; };
+ D2A1EE36287EB8DB00D28DFB /* ServerOffsetPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE34287EB8DB00D28DFB /* ServerOffsetPublisherTests.swift */; };
+ D2A1EE38287EEB7400D28DFB /* NetworkConnectionInfoPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE37287EBE4200D28DFB /* NetworkConnectionInfoPublisherTests.swift */; };
+ D2A1EE39287EEB7600D28DFB /* NetworkConnectionInfoPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE37287EBE4200D28DFB /* NetworkConnectionInfoPublisherTests.swift */; };
+ D2A1EE3B287EECC000D28DFB /* CarrierInfoPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE3A287EECA800D28DFB /* CarrierInfoPublisherTests.swift */; };
+ D2A1EE3C287EECC200D28DFB /* CarrierInfoPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE3A287EECA800D28DFB /* CarrierInfoPublisherTests.swift */; };
+ D2A1EE3E2885D7EC00D28DFB /* LaunchTimePublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE3D2885D7EC00D28DFB /* LaunchTimePublisherTests.swift */; };
+ D2A1EE3F2885D7EC00D28DFB /* LaunchTimePublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE3D2885D7EC00D28DFB /* LaunchTimePublisherTests.swift */; };
+ D2A1EE442886B8B400D28DFB /* UserInfoPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE432886B8B400D28DFB /* UserInfoPublisherTests.swift */; };
+ D2A1EE452886B8B400D28DFB /* UserInfoPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A1EE432886B8B400D28DFB /* UserInfoPublisherTests.swift */; };
+ D2A783D429A5309F003B03BB /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BBA2423979B00786299 /* SwiftExtensions.swift */; };
+ D2A783D529A530A0003B03BB /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BBA2423979B00786299 /* SwiftExtensions.swift */; };
+ D2A783D929A530EF003B03BB /* SwiftExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E36D92124373EA700BFBDB7 /* SwiftExtensionsTests.swift */; };
+ D2A783DA29A530EF003B03BB /* SwiftExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E36D92124373EA700BFBDB7 /* SwiftExtensionsTests.swift */; };
+ D2A783E729A53468003B03BB /* LogEventBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3B2423990D00786299 /* LogEventBuilderTests.swift */; };
+ D2A783E829A53468003B03BB /* ConsoleLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194D51B287ECDC00091547D /* ConsoleLoggerTests.swift */; };
+ D2A783EA29A53468003B03BB /* LogMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26EA28AFA11E005DD405 /* LogMessageReceiverTests.swift */; };
+ D2A783EB29A53468003B03BB /* LogSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3C2423990D00786299 /* LogSanitizerTests.swift */; };
+ D2A783ED29A534F2003B03BB /* LoggingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB222C244A21ED00902D19 /* LoggingFeatureMocks.swift */; };
+ D2A783F329A534F9003B03BB /* ConsoleLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194D51B287ECDC00091547D /* ConsoleLoggerTests.swift */; };
+ D2A783F429A534F9003B03BB /* LogSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3C2423990D00786299 /* LogSanitizerTests.swift */; };
+ D2A783F529A534F9003B03BB /* LogEventBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3B2423990D00786299 /* LogEventBuilderTests.swift */; };
+ D2A783F629A534F9003B03BB /* LoggingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB222C244A21ED00902D19 /* LoggingFeatureMocks.swift */; };
+ D2A783F729A534F9003B03BB /* LogMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26EA28AFA11E005DD405 /* LogMessageReceiverTests.swift */; };
+ D2A783FB29A534F9003B03BB /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D207317C29A5226A00ECBF94 /* DatadogLogs.framework */; };
+ D2A7840329A536AD003B03BB /* PrintFunctionMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A7840229A536AD003B03BB /* PrintFunctionMock.swift */; };
+ D2A7840429A536AD003B03BB /* PrintFunctionMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A7840229A536AD003B03BB /* PrintFunctionMock.swift */; };
+ D2A7840529A5370A003B03BB /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; platformFilter = ios; };
+ D2A7840629A53710003B03BB /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257958B298ABB83008A1BE5 /* TestUtilities.framework */; };
+ D2A7840D29A53A4B003B03BB /* TestsDirectory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C462423990D00786299 /* TestsDirectory.swift */; };
+ D2A7840E29A53A4B003B03BB /* TestsDirectory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C462423990D00786299 /* TestsDirectory.swift */; };
+ D2A7840F29A53B2F003B03BB /* Directory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAB2423979B00786299 /* Directory.swift */; };
+ D2A7841029A53B2F003B03BB /* Directory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAB2423979B00786299 /* Directory.swift */; };
+ D2A7841129A53B2F003B03BB /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAC2423979B00786299 /* File.swift */; };
+ D2A7841229A53B2F003B03BB /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAC2423979B00786299 /* File.swift */; };
+ D2A7A8FF2BA1C24A00F46845 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D2A7A8FE2BA1C24A00F46845 /* PrivacyInfo.xcprivacy */; };
+ D2A7A9002BA1C24A00F46845 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D2A7A8FE2BA1C24A00F46845 /* PrivacyInfo.xcprivacy */; };
+ D2A7A9022BA1C4B100F46845 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D2A7A9012BA1C4B100F46845 /* PrivacyInfo.xcprivacy */; };
+ D2A7A9032BA1C4B100F46845 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D2A7A9012BA1C4B100F46845 /* PrivacyInfo.xcprivacy */; };
+ D2AD1CC22CE4AE6600106C74 /* CustomDump.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CBB2CE4AE6600106C74 /* CustomDump.swift */; };
+ D2AD1CC32CE4AE6600106C74 /* Color+Reflection.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CBA2CE4AE6600106C74 /* Color+Reflection.swift */; };
+ D2AD1CC42CE4AE6600106C74 /* DisplayList+Reflection.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CBD2CE4AE6600106C74 /* DisplayList+Reflection.swift */; };
+ D2AD1CC52CE4AE6600106C74 /* DisplayList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CBC2CE4AE6600106C74 /* DisplayList.swift */; };
+ D2AD1CC62CE4AE6600106C74 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CB92CE4AE6600106C74 /* Color.swift */; };
+ D2AD1CC72CE4AE6600106C74 /* Text+Reflection.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CC02CE4AE6600106C74 /* Text+Reflection.swift */; };
+ D2AD1CC82CE4AE6600106C74 /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CBF2CE4AE6600106C74 /* Text.swift */; };
+ D2AD1CC92CE4AE6600106C74 /* SwiftUIWireframesBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CBE2CE4AE6600106C74 /* SwiftUIWireframesBuilder.swift */; };
+ D2AD1CCC2CE4AE9800106C74 /* UIHostingViewRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CCB2CE4AE9800106C74 /* UIHostingViewRecorder.swift */; };
+ D2AD1CCF2CE4AEF600106C74 /* ReflectionMirrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AD1CCE2CE4AEF600106C74 /* ReflectionMirrorTests.swift */; };
+ D2AE9A5D2CF8837C00695264 /* FeatureFlagsMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AE9A5C2CF8836D00695264 /* FeatureFlagsMock.swift */; };
+ D2B249942A4598FE00DD4F9F /* LoggerProtocol+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B249932A4598FE00DD4F9F /* LoggerProtocol+Internal.swift */; };
+ D2B249952A4598FE00DD4F9F /* LoggerProtocol+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B249932A4598FE00DD4F9F /* LoggerProtocol+Internal.swift */; };
+ D2B249972A45E10500DD4F9F /* LoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B249962A45E10500DD4F9F /* LoggerTests.swift */; };
+ D2B249982A45E10500DD4F9F /* LoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B249962A45E10500DD4F9F /* LoggerTests.swift */; };
+ D2B3F0442823EE8400C2B5EE /* TLVBlockTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B3F0432823EE8300C2B5EE /* TLVBlockTests.swift */; };
+ D2B3F0452823EE8400C2B5EE /* TLVBlockTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B3F0432823EE8300C2B5EE /* TLVBlockTests.swift */; };
+ D2B3F04D282A85FD00C2B5EE /* DatadogCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B3F04C282A85FD00C2B5EE /* DatadogCore.swift */; };
+ D2B3F04E282A85FD00C2B5EE /* DatadogCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B3F04C282A85FD00C2B5EE /* DatadogCore.swift */; };
+ D2B3F052282E827700C2B5EE /* DDHTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2B3F051282E826A00C2B5EE /* DDHTTPHeadersWriter+apiTests.m */; };
+ D2B3F053282E827B00C2B5EE /* DDHTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2B3F051282E826A00C2B5EE /* DDHTTPHeadersWriter+apiTests.m */; };
+ D2BCB2A12B7B8107005C2AAB /* WKWebViewRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BCB2A02B7B8107005C2AAB /* WKWebViewRecorder.swift */; };
+ D2BCB2A32B7B9683005C2AAB /* WKWebViewRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BCB2A22B7B9683005C2AAB /* WKWebViewRecorderTests.swift */; };
+ D2BEEDAC2B3356710065F3AC /* URLSessionTaskSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDAB2B3356710065F3AC /* URLSessionTaskSwizzler.swift */; };
+ D2BEEDAD2B3356710065F3AC /* URLSessionTaskSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDAB2B3356710065F3AC /* URLSessionTaskSwizzler.swift */; };
+ D2BEEDAF2B335C400065F3AC /* URLSessionTaskSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDAE2B335C400065F3AC /* URLSessionTaskSwizzlerTests.swift */; };
+ D2BEEDB02B335C400065F3AC /* URLSessionTaskSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDAE2B335C400065F3AC /* URLSessionTaskSwizzlerTests.swift */; };
+ D2BEEDB22B335DA90065F3AC /* URLSessionTaskDelegateSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDB12B335DA90065F3AC /* URLSessionTaskDelegateSwizzler.swift */; };
+ D2BEEDB32B335DA90065F3AC /* URLSessionTaskDelegateSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDB12B335DA90065F3AC /* URLSessionTaskDelegateSwizzler.swift */; };
+ D2BEEDB52B3360820065F3AC /* URLSessionSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDB42B33607D0065F3AC /* URLSessionSwizzler.swift */; };
+ D2BEEDB62B3360830065F3AC /* URLSessionSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDB42B33607D0065F3AC /* URLSessionSwizzler.swift */; };
+ D2BEEDB82B3360F50065F3AC /* URLSessionTaskDelegateSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDB72B3360F50065F3AC /* URLSessionTaskDelegateSwizzlerTests.swift */; };
+ D2BEEDB92B3360F50065F3AC /* URLSessionTaskDelegateSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BEEDB72B3360F50065F3AC /* URLSessionTaskDelegateSwizzlerTests.swift */; };
+ D2BEEDBA2B33638F0065F3AC /* NetworkInstrumentationSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2181A8A2B0500BB00A518C0 /* NetworkInstrumentationSwizzler.swift */; };
+ D2BEEDBB2B3363900065F3AC /* NetworkInstrumentationSwizzler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2181A8A2B0500BB00A518C0 /* NetworkInstrumentationSwizzler.swift */; };
+ D2C1A4FA29C4C4CB00946C31 /* SpanSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61122ECD25B1B74500F9C7F5 /* SpanSanitizer.swift */; };
+ D2C1A4FB29C4C4CB00946C31 /* MessageReceivers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2546C0A29AF56270054E00B /* MessageReceivers.swift */; };
+ D2C1A4FC29C4C4CB00946C31 /* RequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2546C0729AF55E90054E00B /* RequestBuilder.swift */; };
+ D2C1A4FE29C4C4CB00946C31 /* SpanEventMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618D9DE6263AD78900A3FAD2 /* SpanEventMapper.swift */; };
+ D2C1A4FF29C4C4CB00946C31 /* Warnings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87D24509A0C00DA608C /* Warnings.swift */; };
+ D2C1A50029C4C4CB00946C31 /* ActiveSpansPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D202E924C065CF00D1AF3A /* ActiveSpansPool.swift */; };
+ D2C1A50129C4C4CB00946C31 /* DDSpanContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87E24509A0C00DA608C /* DDSpanContext.swift */; };
+ D2C1A50229C4C4CB00946C31 /* Casting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87C24509A0C00DA608C /* Casting.swift */; };
+ D2C1A50329C4C4CB00946C31 /* DDFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEDD629B8F08E00B15732 /* DDFormat.swift */; };
+ D2C1A50429C4C4CB00946C31 /* (null) in Sources */ = {isa = PBXBuildFile; };
+ D2C1A50529C4C4CB00946C31 /* DatadogTracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2546BF029AF4F550054E00B /* DatadogTracer.swift */; };
+ D2C1A50629C4C4CB00946C31 /* TracingWithLoggingIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216275247D1CD700AC5D67 /* TracingWithLoggingIntegration.swift */; };
+ D2C1A50729C4C4CB00946C31 /* DDSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87824509A0C00DA608C /* DDSpan.swift */; };
+ D2C1A50829C4C4CB00946C31 /* TracingURLSessionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25BADA029C1EF3000112069 /* TracingURLSessionHandler.swift */; };
+ D2C1A50929C4C4CB00946C31 /* SpanEventEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A8A424509FAA00DA608C /* SpanEventEncoder.swift */; };
+ D2C1A50A29C4C4CB00946C31 /* TraceFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2546C0329AF55AA0054E00B /* TraceFeature.swift */; };
+ D2C1A50B29C4C4CB00946C31 /* SpanEventBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A8A524509FAA00DA608C /* SpanEventBuilder.swift */; };
+ D2C1A50C29C4C4CB00946C31 /* DDNoOps.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87924509A0C00DA608C /* DDNoOps.swift */; };
+ D2C1A50D29C4C4CB00946C31 /* SpanTagsReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614872762485067300E3EBDB /* SpanTagsReducer.swift */; };
+ D2C1A50E29C4C4EF00946C31 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; };
+ D2C1A51329C4C53F00946C31 /* OTReference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EA24A24DD3005EA2DE /* OTReference.swift */; };
+ D2C1A51429C4C53F00946C31 /* OTSpanContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EC24A24DD3005EA2DE /* OTSpanContext.swift */; };
+ D2C1A51529C4C53F00946C31 /* OTTracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E924A24DD3005EA2DE /* OTTracer.swift */; };
+ D2C1A51629C4C53F00946C31 /* OTConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EB24A24DD3005EA2DE /* OTConstants.swift */; };
+ D2C1A51729C4C53F00946C31 /* OTFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E724A24DD3005EA2DE /* OTFormat.swift */; };
+ D2C1A51829C4C53F00946C31 /* OTSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E624A24DD3005EA2DE /* OTSpan.swift */; };
+ D2C1A51B29C4C75700946C31 /* DDSpanContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F1A620249A45E400075390 /* DDSpanContextTests.swift */; };
+ D2C1A51C29C4C75700946C31 /* ContextMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E8D59728C7AB90007E5DE1 /* ContextMessageReceiverTests.swift */; };
+ D2C1A51D29C4C75700946C31 /* SpanEventBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BD12450F65B00F2C652 /* SpanEventBuilderTests.swift */; };
+ D2C1A51E29C4C75700946C31 /* Casting+Tracing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89C24509C1100DA608C /* Casting+Tracing.swift */; };
+ D2C1A51F29C4C75700946C31 /* ActiveSpansPoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D203FB24C1884500D1AF3A /* ActiveSpansPoolTests.swift */; };
+ D2C1A52029C4C75700946C31 /* DDSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89824509C1100DA608C /* DDSpanTests.swift */; };
+ D2C1A52229C4C75700946C31 /* DDNoopTracerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F1B81426D8E5FF009F3293 /* DDNoopTracerTests.swift */; };
+ D2C1A52329C4C75700946C31 /* WarningsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89A24509C1100DA608C /* WarningsTests.swift */; };
+ D2C1A52429C4C75700946C31 /* TracingURLSessionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A38DDA29C37E1B007C6900 /* TracingURLSessionHandlerTests.swift */; };
+ D2C1A52529C4C75700946C31 /* SpanSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61122EE725B1C92500F9C7F5 /* SpanSanitizerTests.swift */; };
+ D2C1A52729C4C7D000946C31 /* TracingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AD4E172451C7FF006E34EA /* TracingFeatureMocks.swift */; };
+ D2C1A52829C4C8CB00946C31 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; };
+ D2C1A53829C4F2DF00946C31 /* Casting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87C24509A0C00DA608C /* Casting.swift */; };
+ D2C1A53929C4F2DF00946C31 /* DDNoOps.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87924509A0C00DA608C /* DDNoOps.swift */; };
+ D2C1A53A29C4F2DF00946C31 /* RequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2546C0729AF55E90054E00B /* RequestBuilder.swift */; };
+ D2C1A53B29C4F2DF00946C31 /* SpanTagsReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614872762485067300E3EBDB /* SpanTagsReducer.swift */; };
+ D2C1A53D29C4F2DF00946C31 /* OTSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E624A24DD3005EA2DE /* OTSpan.swift */; };
+ D2C1A53E29C4F2DF00946C31 /* OTSpanContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EC24A24DD3005EA2DE /* OTSpanContext.swift */; };
+ D2C1A53F29C4F2DF00946C31 /* OTReference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EA24A24DD3005EA2DE /* OTReference.swift */; };
+ D2C1A54129C4F2DF00946C31 /* MessageReceivers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2546C0A29AF56270054E00B /* MessageReceivers.swift */; };
+ D2C1A54229C4F2DF00946C31 /* ActiveSpansPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D202E924C065CF00D1AF3A /* ActiveSpansPool.swift */; };
+ D2C1A54329C4F2DF00946C31 /* SpanEventEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A8A424509FAA00DA608C /* SpanEventEncoder.swift */; };
+ D2C1A54429C4F2DF00946C31 /* SpanEventMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618D9DE6263AD78900A3FAD2 /* SpanEventMapper.swift */; };
+ D2C1A54529C4F2DF00946C31 /* DDFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEDD629B8F08E00B15732 /* DDFormat.swift */; };
+ D2C1A54629C4F2DF00946C31 /* OTConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909EB24A24DD3005EA2DE /* OTConstants.swift */; };
+ D2C1A54729C4F2DF00946C31 /* DDSpanContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87E24509A0C00DA608C /* DDSpanContext.swift */; };
+ D2C1A54829C4F2DF00946C31 /* OTTracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E924A24DD3005EA2DE /* OTTracer.swift */; };
+ D2C1A54929C4F2DF00946C31 /* (null) in Sources */ = {isa = PBXBuildFile; };
+ D2C1A54A29C4F2DF00946C31 /* DDSpan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87824509A0C00DA608C /* DDSpan.swift */; };
+ D2C1A54B29C4F2DF00946C31 /* TracingWithLoggingIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216275247D1CD700AC5D67 /* TracingWithLoggingIntegration.swift */; };
+ D2C1A54C29C4F2DF00946C31 /* SpanEventBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A8A524509FAA00DA608C /* SpanEventBuilder.swift */; };
+ D2C1A54D29C4F2DF00946C31 /* Warnings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A87D24509A0C00DA608C /* Warnings.swift */; };
+ D2C1A54E29C4F2DF00946C31 /* OTFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E909E724A24DD3005EA2DE /* OTFormat.swift */; };
+ D2C1A54F29C4F2DF00946C31 /* SpanSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61122ECD25B1B74500F9C7F5 /* SpanSanitizer.swift */; };
+ D2C1A55029C4F2DF00946C31 /* TraceFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2546C0329AF55AA0054E00B /* TraceFeature.swift */; };
+ D2C1A55129C4F2DF00946C31 /* TracingURLSessionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25BADA029C1EF3000112069 /* TracingURLSessionHandler.swift */; };
+ D2C1A55229C4F2DF00946C31 /* DatadogTracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2546BF029AF4F550054E00B /* DatadogTracer.swift */; };
+ D2C1A55F29C4F2E800946C31 /* Casting+Tracing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89C24509C1100DA608C /* Casting+Tracing.swift */; };
+ D2C1A56029C4F2E800946C31 /* TracingURLSessionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A38DDA29C37E1B007C6900 /* TracingURLSessionHandlerTests.swift */; };
+ D2C1A56129C4F2E800946C31 /* WarningsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89A24509C1100DA608C /* WarningsTests.swift */; };
+ D2C1A56229C4F2E800946C31 /* SpanEventBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BD12450F65B00F2C652 /* SpanEventBuilderTests.swift */; };
+ D2C1A56329C4F2E800946C31 /* DDNoopTracerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F1B81426D8E5FF009F3293 /* DDNoopTracerTests.swift */; };
+ D2C1A56529C4F2E800946C31 /* ContextMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E8D59728C7AB90007E5DE1 /* ContextMessageReceiverTests.swift */; };
+ D2C1A56629C4F2E800946C31 /* DDSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89824509C1100DA608C /* DDSpanTests.swift */; };
+ D2C1A56729C4F2E800946C31 /* DDSpanContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F1A620249A45E400075390 /* DDSpanContextTests.swift */; };
+ D2C1A56829C4F2E800946C31 /* TracingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AD4E172451C7FF006E34EA /* TracingFeatureMocks.swift */; };
+ D2C1A56929C4F2E800946C31 /* ActiveSpansPoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D203FB24C1884500D1AF3A /* ActiveSpansPoolTests.swift */; };
+ D2C1A56A29C4F2E800946C31 /* SpanSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61122EE725B1C92500F9C7F5 /* SpanSanitizerTests.swift */; };
+ D2C1A57429C4F30000946C31 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2DA2385298D57AA00C6C7E6 /* DatadogInternal.framework */; };
+ D2C5D5282B83FD5300B63F36 /* WebViewMessageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AE740F2AD6EE4E008DB9BB /* WebViewMessageTests.swift */; };
+ D2C5D5292B83FD5400B63F36 /* WebViewMessageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AE740F2AD6EE4E008DB9BB /* WebViewMessageTests.swift */; };
+ D2C5D52B2B84F6AB00B63F36 /* WebViewRecordReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C5D52A2B84F6AB00B63F36 /* WebViewRecordReceiver.swift */; };
+ D2C5D52D2B84F6D800B63F36 /* WebViewRecordReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C5D52C2B84F6D800B63F36 /* WebViewRecordReceiverTests.swift */; };
+ D2C5D5302B84F71200B63F36 /* WebRecordIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C5D52F2B84F71200B63F36 /* WebRecordIntegrationTests.swift */; };
+ D2C7E3AB28F97DCF0023B2CC /* BatteryStatusPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C7E3AA28F97DCF0023B2CC /* BatteryStatusPublisherTests.swift */; };
+ D2C7E3AE28FEBDA10023B2CC /* LaunchTimePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C7E3AD28FEBDA10023B2CC /* LaunchTimePublisher.swift */; };
+ D2C9A26A2C0F3F5A007526F5 /* SessionReplayConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EA0F452C0E1AE200CB20F8 /* SessionReplayConfiguration.swift */; };
+ D2C9A2872C0F467C007526F5 /* SessionReplayConfigurationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C9A2852C0F4660007526F5 /* SessionReplayConfigurationMocks.swift */; };
+ D2C9A2882C0F467C007526F5 /* SessionReplayConfigurationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C9A2852C0F4660007526F5 /* SessionReplayConfigurationMocks.swift */; };
+ D2CB6E0C27C50EAE00A62B57 /* DatadogCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 61133B85242393DE00786299 /* DatadogCore.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D2CB6E0D27C50EAE00A62B57 /* ObjcAppLaunchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6179FFD1254ADB1100556A0B /* ObjcAppLaunchHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D2CB6E0E27C50EAE00A62B57 /* ObjcExceptionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E68FB54244707FD0013A8AA /* ObjcExceptionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D2CB6E2927C50EAE00A62B57 /* KronosInternetAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0C8277B23F0008BE766 /* KronosInternetAddress.swift */; };
+ D2CB6E2C27C50EAE00A62B57 /* KronosNTPPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CB277B23F0008BE766 /* KronosNTPPacket.swift */; };
+ D2CB6E3127C50EAE00A62B57 /* FileWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA72423979B00786299 /* FileWriter.swift */; };
+ D2CB6E3627C50EAE00A62B57 /* ObjcAppLaunchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6179FFD2254ADB1100556A0B /* ObjcAppLaunchHandler.m */; };
+ D2CB6E3C27C50EAE00A62B57 /* Retrying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6139CD702589FAFD007E8BB7 /* Retrying.swift */; };
+ D2CB6E4327C50EAE00A62B57 /* ObjcExceptionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E68FB53244707FD0013A8AA /* ObjcExceptionHandler.m */; };
+ D2CB6E5527C50EAE00A62B57 /* KronosNSTimer+ClosureKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0D1277B23F1008BE766 /* KronosNSTimer+ClosureKit.swift */; };
+ D2CB6E6627C50EAE00A62B57 /* Reader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E792E2577B0F900DFCC17 /* Reader.swift */; };
+ D2CB6E6927C50EAE00A62B57 /* KronosDNSResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0C9277B23F0008BE766 /* KronosDNSResolver.swift */; };
+ D2CB6E7627C50EAE00A62B57 /* KronosClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CC277B23F0008BE766 /* KronosClock.swift */; };
+ D2CB6E7727C50EAE00A62B57 /* DataReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E793A2577B6EE00DFCC17 /* DataReader.swift */; };
+ D2CB6E8127C50EAE00A62B57 /* DataUploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB02423979B00786299 /* DataUploader.swift */; };
+ D2CB6E8827C50EAE00A62B57 /* FileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAD2423979B00786299 /* FileReader.swift */; };
+ D2CB6E8D27C50EAE00A62B57 /* KronosNTPProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CF277B23F0008BE766 /* KronosNTPProtocol.swift */; };
+ D2CB6E9127C50EAE00A62B57 /* KronosTimeFreeze.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0D0277B23F1008BE766 /* KronosTimeFreeze.swift */; };
+ D2CB6E9727C50EAE00A62B57 /* DataUploadStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61ED39D326C2A36B002C0F26 /* DataUploadStatus.swift */; };
+ D2CB6E9927C50EAE00A62B57 /* DataUploadWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB12423979B00786299 /* DataUploadWorker.swift */; };
+ D2CB6E9A27C50EAE00A62B57 /* KronosTimeStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CA277B23F0008BE766 /* KronosTimeStorage.swift */; };
+ D2CB6E9B27C50EAE00A62B57 /* FilesOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BA92423979B00786299 /* FilesOrchestrator.swift */; };
+ D2CB6EA727C50EAE00A62B57 /* Versioning.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D5AEA624B4D45A007F194B /* Versioning.swift */; };
+ D2CB6EA827C50EAE00A62B57 /* URLSessionClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB22423979B00786299 /* URLSessionClient.swift */; };
+ D2CB6EB327C50EAE00A62B57 /* KronosNTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CE277B23F0008BE766 /* KronosNTPClient.swift */; };
+ D2CB6EBA27C50EAE00A62B57 /* DataUploadConditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BAF2423979B00786299 /* DataUploadConditions.swift */; };
+ D2CB6EBF27C50EAE00A62B57 /* KronosData+Bytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0CD277B23F0008BE766 /* KronosData+Bytes.swift */; };
+ D2CB6EC427C50EAE00A62B57 /* DataUploadDelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BB32423979B00786299 /* DataUploadDelay.swift */; };
+ D2CB6EC727C50EAE00A62B57 /* PerformancePreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BB2B1A244A185D009F3F56 /* PerformancePreset.swift */; };
+ D2CB6EDE27C520D400A62B57 /* RUMEventMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FF282724B8A31E000B3D9B /* RUMEventMatcher.swift */; };
+ D2CB6EE027C520D400A62B57 /* SpanMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45ED02451A8730061DAC7 /* SpanMatcher.swift */; };
+ D2CB6EE427C520D400A62B57 /* FeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61EF78C0257F842000EDCCB3 /* FeatureTests.swift */; };
+ D2CB6EE527C520D400A62B57 /* DataUploadConditionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C302423990D00786299 /* DataUploadConditionsTests.swift */; };
+ D2CB6EE627C520D400A62B57 /* DateFormattingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618C365E248E85B400520CDE /* DateFormattingTests.swift */; };
+ D2CB6EE727C520D400A62B57 /* FileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C2C2423990D00786299 /* FileTests.swift */; };
+ D2CB6EEA27C520D400A62B57 /* LogMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C432423990D00786299 /* LogMatcher.swift */; };
+ D2CB6EEC27C520D400A62B57 /* CustomObjcViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61DB33B125DEDFC200F7EA71 /* CustomObjcViewController.m */; };
+ D2CB6EEE27C520D400A62B57 /* DDErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61363D9E24D99BAA0084CD6F /* DDErrorTests.swift */; };
+ D2CB6EF227C520D400A62B57 /* KronosTimeStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0E2277B3D92008BE766 /* KronosTimeStorageTests.swift */; };
+ D2CB6EF427C520D400A62B57 /* FileWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C292423990D00786299 /* FileWriterTests.swift */; };
+ D2CB6EFE27C520D400A62B57 /* RUMMonitorConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617B954124BF4E7600E6F443 /* RUMMonitorConfigurationTests.swift */; };
+ D2CB6F0027C520D400A62B57 /* RUMSessionMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F9CA982513977A000A5E61 /* RUMSessionMatcher.swift */; };
+ D2CB6F0427C520D400A62B57 /* DDTracerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8824A34FD700233986 /* DDTracerTests.swift */; };
+ D2CB6F0927C520D400A62B57 /* RUMDataModels+objcTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D03BDF273404E700367DE0 /* RUMDataModels+objcTests.swift */; };
+ D2CB6F0C27C520D400A62B57 /* KronosNTPPacketTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0DF277B3D92008BE766 /* KronosNTPPacketTests.swift */; };
+ D2CB6F0E27C520D400A62B57 /* DDRUMMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616B668D259CC28E00968EE8 /* DDRUMMonitorTests.swift */; };
+ D2CB6F1027C520D400A62B57 /* DDNSURLSessionDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EE5AD8126205B82001E699E /* DDNSURLSessionDelegateTests.swift */; };
+ D2CB6F1327C520D400A62B57 /* DDConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C162423990D00786299 /* DDConfigurationTests.swift */; };
+ D2CB6F1727C520D400A62B57 /* ObjcExceptionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C3637F2436164B00C4D4E6 /* ObjcExceptionHandlerTests.swift */; };
+ D2CB6F1827C520D400A62B57 /* DatadogTestsObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6184751426EFCF1300C7C9C5 /* DatadogTestsObserver.swift */; };
+ D2CB6F1927C520D400A62B57 /* RequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C332423990D00786299 /* RequestBuilderTests.swift */; };
+ D2CB6F1A27C520D400A62B57 /* FileReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C282423990D00786299 /* FileReaderTests.swift */; };
+ D2CB6F1D27C520D400A62B57 /* DataUploaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C322423990D00786299 /* DataUploaderTests.swift */; };
+ D2CB6F2027C520D400A62B57 /* DatadogConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BBD19624ED50040023E65F /* DatadogConfigurationTests.swift */; };
+ D2CB6F2127C520D400A62B57 /* URLSessionClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C342423990D00786299 /* URLSessionClientTests.swift */; };
+ D2CB6F2227C520D400A62B57 /* DatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C412423990D00786299 /* DatadogTests.swift */; };
+ D2CB6F2627C520D400A62B57 /* DataUploadDelayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C312423990D00786299 /* DataUploadDelayTests.swift */; };
+ D2CB6F2827C520D400A62B57 /* DataUploadWorkerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C2F2423990D00786299 /* DataUploadWorkerTests.swift */; };
+ D2CB6F2B27C520D400A62B57 /* CrashContextProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FC5F3425CC1898006BB4DE /* CrashContextProviderTests.swift */; };
+ D2CB6F2C27C520D400A62B57 /* JSONEncoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E58E8E224615EDA008E5063 /* JSONEncoderTests.swift */; };
+ D2CB6F3027C520D400A62B57 /* DatadogExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C472423990D00786299 /* DatadogExtensions.swift */; };
+ D2CB6F3227C520D400A62B57 /* JSONDataMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BE624519A3700F2C652 /* JSONDataMatcher.swift */; };
+ D2CB6F3327C520D400A62B57 /* FilesOrchestratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C2A2423990D00786299 /* FilesOrchestratorTests.swift */; };
+ D2CB6F3B27C520D400A62B57 /* NSURLSessionBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A763DB252DB2B3005A23F2 /* NSURLSessionBridge.m */; };
+ D2CB6F4327C520D400A62B57 /* DDLogsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C172423990D00786299 /* DDLogsTests.swift */; };
+ D2CB6F4527C520D400A62B57 /* TracerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A89524509BF600DA608C /* TracerTests.swift */; };
+ D2CB6F4627C520D400A62B57 /* CoreMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F1A6192498A51700075390 /* CoreMocks.swift */; };
+ D2CB6F4827C520D400A62B57 /* CrashReportingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2723E25C86DA400D54BF8 /* CrashReportingFeatureMocks.swift */; };
+ D2CB6F4D27C520D400A62B57 /* DataUploadStatusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA20EF26C40121004AFE6D /* DataUploadStatusTests.swift */; };
+ D2CB6F4F27C520D400A62B57 /* RetryingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6139CD762589FEE3007E8BB7 /* RetryingTests.swift */; };
+ D2CB6F5027C520D400A62B57 /* DDDatadogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C142423990D00786299 /* DDDatadogTests.swift */; };
+ D2CB6F5327C520D400A62B57 /* DirectoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C2D2423990D00786299 /* DirectoryTests.swift */; };
+ D2CB6F5F27C520D400A62B57 /* DDNSURLSessionDelegate+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5E42A26DFC433000B0A5F /* DDNSURLSessionDelegate+apiTests.m */; };
+ D2CB6F6427C520D400A62B57 /* LoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C382423990D00786299 /* LoggerTests.swift */; };
+ D2CB6F6627C520D400A62B57 /* RUMMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617B953C24BF4D8F00E6F443 /* RUMMonitorTests.swift */; };
+ D2CB6F6827C520D400A62B57 /* SwiftUIExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D244B3A2271EDACD003E1B29 /* SwiftUIExtensionsTests.swift */; };
+ D2CB6F6A27C520D400A62B57 /* DDRUMMonitor+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5E42026DF85C7000B0A5F /* DDRUMMonitor+apiTests.m */; };
+ D2CB6F7027C520D400A62B57 /* UIKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C1C2423990D00786299 /* UIKitMocks.swift */; };
+ D2CB6F7327C520D400A62B57 /* CoreTelephonyMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C1B2423990D00786299 /* CoreTelephonyMocks.swift */; };
+ D2CB6F7527C520D400A62B57 /* UIKitExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6115299625E3BEF9004F740E /* UIKitExtensionsTests.swift */; };
+ D2CB6F7C27C520D400A62B57 /* CrashReporterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2724825C943C500D54BF8 /* CrashReporterTests.swift */; };
+ D2CB6F7D27C520D400A62B57 /* CrashContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6172472625D673D7007085B3 /* CrashContextTests.swift */; };
+ D2CB6F7E27C520D400A62B57 /* OTSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BAD46926415FCE001886CA /* OTSpanTests.swift */; };
+ D2CB6F7F27C520D400A62B57 /* DDDatadog+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5E42626DFB145000B0A5F /* DDDatadog+apiTests.m */; };
+ D2CB6F8027C520D400A62B57 /* TracingWithLoggingIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61216279247D21FE00AC5D67 /* TracingWithLoggingIntegrationTests.swift */; };
+ D2CB6F8327C520D400A62B57 /* DDConfiguration+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5E42826DFB60A000B0A5F /* DDConfiguration+apiTests.m */; };
+ D2CB6F8427C520D400A62B57 /* DatadogTestsObserverLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 6184751726EFD03400C7C9C5 /* DatadogTestsObserverLoader.m */; };
+ D2CB6F8527C520D400A62B57 /* PerformancePresetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61345612244756E300E7DA6B /* PerformancePresetTests.swift */; };
+ D2CB6F9627C5217A00A62B57 /* DatadogObjc.h in Headers */ = {isa = PBXBuildFile; fileRef = 61133BF2242397DA00786299 /* DatadogObjc.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D2CB6F9927C5217A00A62B57 /* Casting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF5024A49F7400D7BD17 /* Casting.swift */; };
+ D2CB6F9A27C5217A00A62B57 /* RUMDataModels+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6111C58125C0081F00F5C4A2 /* RUMDataModels+objc.swift */; };
+ D2CB6F9B27C5217A00A62B57 /* DDSpanContext+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4824A49B6800D7BD17 /* DDSpanContext+objc.swift */; };
+ D2CB6F9C27C5217A00A62B57 /* OTTracer+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4124A38D2400D7BD17 /* OTTracer+objc.swift */; };
+ D2CB6F9E27C5217A00A62B57 /* Datadog+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C092423983800786299 /* Datadog+objc.swift */; };
+ D2CB6F9F27C5217A00A62B57 /* Logs+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C0C2423983800786299 /* Logs+objc.swift */; };
+ D2CB6FA027C5217A00A62B57 /* Trace+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8224A3431600233986 /* Trace+objc.swift */; };
+ D2CB6FA127C5217A00A62B57 /* HTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4B24A49C8F00D7BD17 /* HTTPHeadersWriter+objc.swift */; };
+ D2CB6FA227C5217A00A62B57 /* DDSpan+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6132BF4624A498D800D7BD17 /* DDSpan+objc.swift */; };
+ D2CB6FA327C5217A00A62B57 /* OTSpan+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8A24A3568900233986 /* OTSpan+objc.swift */; };
+ D2CB6FA427C5217A00A62B57 /* DDURLSessionDelegate+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611720D42524D9FB00634D9E /* DDURLSessionDelegate+objc.swift */; };
+ D2CB6FA527C5217A00A62B57 /* RUM+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E55407B25812D1C00F6E3AD /* RUM+objc.swift */; };
+ D2CB6FA627C5217A00A62B57 /* OTSpanContext+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8C24A356A000233986 /* OTSpanContext+objc.swift */; };
+ D2CB6FA827C5217A00A62B57 /* DatadogConfiguration+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C0D2423983800786299 /* DatadogConfiguration+objc.swift */; };
+ D2CB6FB327C5234300A62B57 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6ED127C50EAE00A62B57 /* DatadogCore.framework */; };
+ D2CB6FB827C523DA00A62B57 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6ED127C50EAE00A62B57 /* DatadogCore.framework */; };
+ D2CB6FB927C523DA00A62B57 /* DatadogObjc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6FB027C5217A00A62B57 /* DatadogObjc.framework */; };
+ D2CB6FBE27C5348200A62B57 /* DatadogCrashReporting.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B7885625C180CB002675B5 /* DatadogCrashReporting.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D2CB6FC027C5348200A62B57 /* DDCrashReportBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617247B725DAB0E2007085B3 /* DDCrashReportBuilder.swift */; };
+ D2CB6FC127C5348200A62B57 /* DDCrashReportExporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612556BA268DD9BF002BCE74 /* DDCrashReportExporter.swift */; };
+ D2CB6FC227C5348200A62B57 /* CrashReportMinifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FDBA1226971953001D9D43 /* CrashReportMinifier.swift */; };
+ D2CB6FC327C5348200A62B57 /* PLCrashReporterIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2728A25C9561A00D54BF8 /* PLCrashReporterIntegration.swift */; };
+ D2CB6FC427C5348200A62B57 /* CrashReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612556AF268C8D31002BCE74 /* CrashReport.swift */; };
+ D2CB6FC527C5348200A62B57 /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615CC40B2694A56D0005F08C /* SwiftExtensions.swift */; };
+ D2CB6FC627C5348200A62B57 /* PLCrashReporterPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6170DC1B25C18729003AED5C /* PLCrashReporterPlugin.swift */; };
+ D2CB6FC727C5348200A62B57 /* ThirdPartyCrashReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2727325C9509D00D54BF8 /* ThirdPartyCrashReporter.swift */; };
+ D2CB6FCB27C5348200A62B57 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; };
+ D2CB6FD927C5352300A62B57 /* DDCrashReportBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FDBA1626974CA9001D9D43 /* DDCrashReportBuilderTests.swift */; };
+ D2CB6FDB27C5352300A62B57 /* SwiftExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615CC40F2694A64D0005F08C /* SwiftExtensionTests.swift */; };
+ D2CB6FDC27C5352300A62B57 /* PLCrashReporterIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243BBBF276C9D640019C857 /* PLCrashReporterIntegrationTests.swift */; };
+ D2CB6FDD27C5352300A62B57 /* CrashReportMinifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FDBA14269722B4001D9D43 /* CrashReportMinifierTests.swift */; };
+ D2CB6FDE27C5352300A62B57 /* DDCrashReportExporterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E95D872695C00200EA3115 /* DDCrashReportExporterTests.swift */; };
+ D2CB6FE027C5352300A62B57 /* CrashReportingPluginTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B7886125C180CB002675B5 /* CrashReportingPluginTests.swift */; };
+ D2CB6FE127C5352300A62B57 /* CrashReportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615CC4122695957C0005F08C /* CrashReportTests.swift */; };
+ D2CB6FE227C5352300A62B57 /* Mocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F2729A25C95EB200D54BF8 /* Mocks.swift */; };
+ D2CB6FE527C5352300A62B57 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; };
+ D2CB6FF327C5369600A62B57 /* DatadogCrashReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6FD127C5348200A62B57 /* DatadogCrashReporting.framework */; };
+ D2CE604229911EDE00DB6656 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2DA2385298D57AA00C6C7E6 /* DatadogInternal.framework */; };
+ D2D30E5B2A40BF540020C553 /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D30E5A2A40BF540020C553 /* Logs.swift */; };
+ D2D30E5C2A40BF540020C553 /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D30E5A2A40BF540020C553 /* Logs.swift */; };
+ D2D30E602A40CD310020C553 /* LogsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D30E5D2A40CD2C0020C553 /* LogsTests.swift */; };
+ D2D30E612A40CD310020C553 /* LogsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D30E5D2A40CD2C0020C553 /* LogsTests.swift */; };
+ D2D3199729E982A30004F169 /* DatadogCrashReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7885425C180CB002675B5 /* DatadogCrashReporting.framework */; };
+ D2D3199829E982AC0004F169 /* DatadogCrashReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2CB6FD127C5348200A62B57 /* DatadogCrashReporting.framework */; };
+ D2D3199A29E98D970004F169 /* DefaultJSONEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D3199929E98D970004F169 /* DefaultJSONEncoder.swift */; };
+ D2D3199B29E98D970004F169 /* DefaultJSONEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D3199929E98D970004F169 /* DefaultJSONEncoder.swift */; };
+ D2D36DCB2AC6DCCA0021F28A /* DatadogCoreProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D36DCA2AC6DCCA0021F28A /* DatadogCoreProtocolTests.swift */; };
+ D2D36DCC2AC6DCCA0021F28A /* DatadogCoreProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D36DCA2AC6DCCA0021F28A /* DatadogCoreProtocolTests.swift */; };
+ D2DA2358298D57AA00C6C7E6 /* CoreLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039CF298D5235001A1FA3 /* CoreLogger.swift */; };
+ D2DA2359298D57AA00C6C7E6 /* NetworkConnectionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B9298D5235001A1FA3 /* NetworkConnectionInfo.swift */; };
+ D2DA235A298D57AA00C6C7E6 /* TrackingConsent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BB298D5235001A1FA3 /* TrackingConsent.swift */; };
+ D2DA235B298D57AA00C6C7E6 /* DynamicCodingKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C7298D5235001A1FA3 /* DynamicCodingKey.swift */; };
+ D2DA235C298D57AA00C6C7E6 /* FeatureRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D5298D5235001A1FA3 /* FeatureRequestBuilder.swift */; };
+ D2DA235D298D57AA00C6C7E6 /* AttributesSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039CC298D5235001A1FA3 /* AttributesSanitizer.swift */; };
+ D2DA235E298D57AA00C6C7E6 /* DatadogFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BD298D5235001A1FA3 /* DatadogFeature.swift */; };
+ D2DA235F298D57AA00C6C7E6 /* CarrierInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B6298D5235001A1FA3 /* CarrierInfo.swift */; };
+ D2DA2360298D57AA00C6C7E6 /* DDError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039DC298D5235001A1FA3 /* DDError.swift */; };
+ D2DA2361298D57AA00C6C7E6 /* AnyCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C8298D5235001A1FA3 /* AnyCodable.swift */; };
+ D2DA2363298D57AA00C6C7E6 /* BatteryStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B5298D5235001A1FA3 /* BatteryStatus.swift */; };
+ D2DA2364298D57AA00C6C7E6 /* LaunchTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BE298D5235001A1FA3 /* LaunchTime.swift */; };
+ D2DA2365298D57AA00C6C7E6 /* FeatureMessageReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C1298D5235001A1FA3 /* FeatureMessageReceiver.swift */; };
+ D2DA2366298D57AA00C6C7E6 /* Writer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039AF298D5235001A1FA3 /* Writer.swift */; };
+ D2DA2367298D57AA00C6C7E6 /* Telemetry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D0298D5235001A1FA3 /* Telemetry.swift */; };
+ D2DA2368298D57AA00C6C7E6 /* DataFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D3298D5235001A1FA3 /* DataFormat.swift */; };
+ D2DA2369298D57AA00C6C7E6 /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C9298D5235001A1FA3 /* AnyEncodable.swift */; };
+ D2DA236A298D57AA00C6C7E6 /* DatadogExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D8298D5235001A1FA3 /* DatadogExtended.swift */; };
+ D2DA236B298D57AA00C6C7E6 /* Sysctl.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B8298D5235001A1FA3 /* Sysctl.swift */; };
+ D2DA236C298D57AA00C6C7E6 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B3298D5235001A1FA3 /* AppState.swift */; };
+ D2DA236D298D57AA00C6C7E6 /* DeviceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BC298D5235001A1FA3 /* DeviceInfo.swift */; };
+ D2DA236E298D57AA00C6C7E6 /* InternalLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039CE298D5235001A1FA3 /* InternalLogger.swift */; };
+ D2DA236F298D57AA00C6C7E6 /* DateFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D9298D5235001A1FA3 /* DateFormatting.swift */; };
+ D2DA2370298D57AA00C6C7E6 /* AnyDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C5298D5235001A1FA3 /* AnyDecodable.swift */; };
+ D2DA2372298D57AA00C6C7E6 /* DD.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039AD298D5234001A1FA3 /* DD.swift */; };
+ D2DA2373298D57AA00C6C7E6 /* ReadWriteLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039DB298D5235001A1FA3 /* ReadWriteLock.swift */; };
+ D2DA2374298D57AA00C6C7E6 /* DatadogContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039BA298D5235001A1FA3 /* DatadogContext.swift */; };
+ D2DA2375298D57AA00C6C7E6 /* Foundation+Datadog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D7298D5235001A1FA3 /* Foundation+Datadog.swift */; };
+ D2DA2376298D57AA00C6C7E6 /* UserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B4298D5235001A1FA3 /* UserInfo.swift */; };
+ D2DA2377298D57AA00C6C7E6 /* URLRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D2298D5235001A1FA3 /* URLRequestBuilder.swift */; };
+ D2DA2378298D57AA00C6C7E6 /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039CB298D5235001A1FA3 /* Attributes.swift */; };
+ D2DA2379298D57AA00C6C7E6 /* AnyDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C6298D5235001A1FA3 /* AnyDecoder.swift */; };
+ D2DA237A298D57AA00C6C7E6 /* FeatureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C2298D5235001A1FA3 /* FeatureMessage.swift */; };
+ D2DA237B298D57AA00C6C7E6 /* DateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B7298D5235001A1FA3 /* DateProvider.swift */; };
+ D2DA237C298D57AA00C6C7E6 /* DatadogCoreProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039B1298D5235001A1FA3 /* DatadogCoreProtocol.swift */; };
+ D2DA237D298D57AA00C6C7E6 /* DataCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039D4298D5235001A1FA3 /* DataCompression.swift */; };
+ D2DA237E298D57AA00C6C7E6 /* AnyEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23039C4298D5235001A1FA3 /* AnyEncoder.swift */; };
+ D2DA238E298D588A00C6C7E6 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; platformFilter = ios; };
+ D2DA23A1298D58F400C6C7E6 /* ReadWriteLockTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA2395298D58F300C6C7E6 /* ReadWriteLockTests.swift */; };
+ D2DA23A3298D58F400C6C7E6 /* AnyEncodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA2398298D58F300C6C7E6 /* AnyEncodableTests.swift */; };
+ D2DA23A4298D58F400C6C7E6 /* AnyCodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA2399298D58F300C6C7E6 /* AnyCodableTests.swift */; };
+ D2DA23A5298D58F400C6C7E6 /* AnyDecodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA239A298D58F300C6C7E6 /* AnyDecodableTests.swift */; };
+ D2DA23A6298D58F400C6C7E6 /* AnyCoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA239B298D58F300C6C7E6 /* AnyCoderTests.swift */; };
+ D2DA23A7298D58F400C6C7E6 /* AppStateHistoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA239D298D58F300C6C7E6 /* AppStateHistoryTests.swift */; };
+ D2DA23A8298D58F400C6C7E6 /* DeviceInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA239E298D58F300C6C7E6 /* DeviceInfoTests.swift */; };
+ D2DA23AA298D58F400C6C7E6 /* FeatureMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA23A0298D58F400C6C7E6 /* FeatureMessageReceiverTests.swift */; };
+ D2DA23AB298D595100C6C7E6 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; platformFilter = ios; };
+ D2DA23B1298D59DC00C6C7E6 /* AnyEncodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA2398298D58F300C6C7E6 /* AnyEncodableTests.swift */; };
+ D2DA23B2298D59DC00C6C7E6 /* AppStateHistoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA239D298D58F300C6C7E6 /* AppStateHistoryTests.swift */; };
+ D2DA23B3298D59DC00C6C7E6 /* AnyDecodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA239A298D58F300C6C7E6 /* AnyDecodableTests.swift */; };
+ D2DA23B4298D59DC00C6C7E6 /* AnyCodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA2399298D58F300C6C7E6 /* AnyCodableTests.swift */; };
+ D2DA23B5298D59DC00C6C7E6 /* ReadWriteLockTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA2395298D58F300C6C7E6 /* ReadWriteLockTests.swift */; };
+ D2DA23B6298D59DC00C6C7E6 /* AnyCoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA239B298D58F300C6C7E6 /* AnyCoderTests.swift */; };
+ D2DA23B8298D59DC00C6C7E6 /* FeatureMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA23A0298D58F400C6C7E6 /* FeatureMessageReceiverTests.swift */; };
+ D2DA23BA298D59DC00C6C7E6 /* DeviceInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA239E298D58F300C6C7E6 /* DeviceInfoTests.swift */; };
+ D2DA23C5298D59F300C6C7E6 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257958B298ABB83008A1BE5 /* TestUtilities.framework */; };
+ D2DA23C7298D5AC000C6C7E6 /* TelemetryMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA23C6298D5AC000C6C7E6 /* TelemetryMocks.swift */; };
+ D2DA23C8298D5AC000C6C7E6 /* TelemetryMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA23C6298D5AC000C6C7E6 /* TelemetryMocks.swift */; };
+ D2DA23CA298D5C1300C6C7E6 /* UIKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA23C9298D5C1300C6C7E6 /* UIKitMocks.swift */; };
+ D2DA23CB298D5C1300C6C7E6 /* UIKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DA23C9298D5C1300C6C7E6 /* UIKitMocks.swift */; };
+ D2DA23CF298D5F2300C6C7E6 /* FeatureMessageReceiverMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26D628A647DB005DD405 /* FeatureMessageReceiverMock.swift */; };
+ D2DA23D0298D5F2300C6C7E6 /* FeatureMessageReceiverMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26D628A647DB005DD405 /* FeatureMessageReceiverMock.swift */; };
+ D2DA23D1298D61FB00C6C7E6 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2DA2385298D57AA00C6C7E6 /* DatadogInternal.framework */; };
+ D2DC4BBD27F234E000E4FB96 /* CITestIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E143CCAE27D236F600F4018A /* CITestIntegrationTests.swift */; };
+ D2DC4BF627F484AA00E4FB96 /* DataEncryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DC4BF527F484AA00E4FB96 /* DataEncryption.swift */; };
+ D2DC4BF727F484AA00E4FB96 /* DataEncryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DC4BF527F484AA00E4FB96 /* DataEncryption.swift */; };
+ D2DE63532A30A7CA00441A54 /* CoreRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DE63522A30A7CA00441A54 /* CoreRegistry.swift */; };
+ D2DE63542A30A7CA00441A54 /* CoreRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DE63522A30A7CA00441A54 /* CoreRegistry.swift */; };
+ D2EA0F432C0D941900CB20F8 /* ReflectionMirror.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EA0F422C0D941900CB20F8 /* ReflectionMirror.swift */; };
+ D2EA0F462C0E1AE300CB20F8 /* SessionReplayConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EA0F452C0E1AE200CB20F8 /* SessionReplayConfiguration.swift */; };
+ D2EBEE1F29BA160F00B15732 /* HTTPHeadersReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618E13A92524B8700098C6B0 /* HTTPHeadersReader.swift */; };
+ D2EBEE2029BA160F00B15732 /* TracePropagationHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEDCF29B8A02100B15732 /* TracePropagationHeadersWriter.swift */; };
+ D2EBEE2129BA160F00B15732 /* W3CHTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728AD9C2934CE4400397996 /* W3CHTTPHeaders.swift */; };
+ D2EBEE2229BA160F00B15732 /* TracePropagationHeadersReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEDD229B8A58E00B15732 /* TracePropagationHeadersReader.swift */; };
+ D2EBEE2329BA160F00B15732 /* B3HTTPHeadersReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F773DC29253F8B00AC1A62 /* B3HTTPHeadersReader.swift */; };
+ D2EBEE2429BA160F00B15732 /* W3CHTTPHeadersReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADA02934CE5D00397996 /* W3CHTTPHeadersReader.swift */; };
+ D2EBEE2529BA160F00B15732 /* TraceID.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEDCC29B893D800B15732 /* TraceID.swift */; };
+ D2EBEE2629BA160F00B15732 /* B3HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F773D32924EA2D00AC1A62 /* B3HTTPHeaders.swift */; };
+ D2EBEE2729BA160F00B15732 /* B3HTTPHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F773DB29253F8B00AC1A62 /* B3HTTPHeadersWriter.swift */; };
+ D2EBEE2829BA160F00B15732 /* W3CHTTPHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728AD9E2934CE5000397996 /* W3CHTTPHeadersWriter.swift */; };
+ D2EBEE2929BA160F00B15732 /* HTTPHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A88324509A0C00DA608C /* HTTPHeadersWriter.swift */; };
+ D2EBEE2A29BA160F00B15732 /* TracingHTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618E13B02524B8F80098C6B0 /* TracingHTTPHeaders.swift */; };
+ D2EBEE2D29BA161100B15732 /* HTTPHeadersReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618E13A92524B8700098C6B0 /* HTTPHeadersReader.swift */; };
+ D2EBEE2E29BA161100B15732 /* TracePropagationHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEDCF29B8A02100B15732 /* TracePropagationHeadersWriter.swift */; };
+ D2EBEE2F29BA161100B15732 /* W3CHTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728AD9C2934CE4400397996 /* W3CHTTPHeaders.swift */; };
+ D2EBEE3029BA161100B15732 /* TracePropagationHeadersReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEDD229B8A58E00B15732 /* TracePropagationHeadersReader.swift */; };
+ D2EBEE3129BA161100B15732 /* B3HTTPHeadersReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F773DC29253F8B00AC1A62 /* B3HTTPHeadersReader.swift */; };
+ D2EBEE3229BA161100B15732 /* W3CHTTPHeadersReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADA02934CE5D00397996 /* W3CHTTPHeadersReader.swift */; };
+ D2EBEE3329BA161100B15732 /* TraceID.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEDCC29B893D800B15732 /* TraceID.swift */; };
+ D2EBEE3429BA161100B15732 /* B3HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F773D32924EA2D00AC1A62 /* B3HTTPHeaders.swift */; };
+ D2EBEE3529BA161100B15732 /* B3HTTPHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F773DB29253F8B00AC1A62 /* B3HTTPHeadersWriter.swift */; };
+ D2EBEE3629BA161100B15732 /* W3CHTTPHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728AD9E2934CE5000397996 /* W3CHTTPHeadersWriter.swift */; };
+ D2EBEE3729BA161100B15732 /* HTTPHeadersWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C5A88324509A0C00DA608C /* HTTPHeadersWriter.swift */; };
+ D2EBEE3829BA161100B15732 /* TracingHTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618E13B02524B8F80098C6B0 /* TracingHTTPHeaders.swift */; };
+ D2EBEE3B29BA163E00B15732 /* B3HTTPHeadersReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F60292BB071008742B3 /* B3HTTPHeadersReaderTests.swift */; };
+ D2EBEE3C29BA163E00B15732 /* B3HTTPHeadersWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F5A292B7C06008742B3 /* B3HTTPHeadersWriterTests.swift */; };
+ D2EBEE3D29BA163E00B15732 /* W3CHTTPHeadersWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADA22934DB5000397996 /* W3CHTTPHeadersWriterTests.swift */; };
+ D2EBEE3E29BA163E00B15732 /* W3CHTTPHeadersReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADA52934DF2400397996 /* W3CHTTPHeadersReaderTests.swift */; };
+ D2EBEE3F29BA163F00B15732 /* B3HTTPHeadersReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F60292BB071008742B3 /* B3HTTPHeadersReaderTests.swift */; };
+ D2EBEE4029BA163F00B15732 /* B3HTTPHeadersWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F5A292B7C06008742B3 /* B3HTTPHeadersWriterTests.swift */; };
+ D2EBEE4129BA163F00B15732 /* W3CHTTPHeadersWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADA22934DB5000397996 /* W3CHTTPHeadersWriterTests.swift */; };
+ D2EBEE4229BA163F00B15732 /* W3CHTTPHeadersReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADA52934DF2400397996 /* W3CHTTPHeadersReaderTests.swift */; };
+ D2EBEE4329BA168200B15732 /* TraceIDGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B558D32469CDD8001460D3 /* TraceIDGeneratorTests.swift */; };
+ D2EBEE4429BA168200B15732 /* TraceIDTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BCE2450A6EC00F2C652 /* TraceIDTests.swift */; };
+ D2EBEE4529BA168400B15732 /* TraceIDGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B558D32469CDD8001460D3 /* TraceIDGeneratorTests.swift */; };
+ D2EBEE4629BA168400B15732 /* TraceIDTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E45BCE2450A6EC00F2C652 /* TraceIDTests.swift */; };
+ D2EBEE4829BA17C400B15732 /* NetworkInstrumentationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEE4729BA17C400B15732 /* NetworkInstrumentationMocks.swift */; };
+ D2EBEE4929BA17C400B15732 /* NetworkInstrumentationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EBEE4729BA17C400B15732 /* NetworkInstrumentationMocks.swift */; };
+ D2EFA868286DA85700F1FAA6 /* DatadogContextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EFA867286DA85700F1FAA6 /* DatadogContextProvider.swift */; };
+ D2EFA869286DA85700F1FAA6 /* DatadogContextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EFA867286DA85700F1FAA6 /* DatadogContextProvider.swift */; };
+ D2EFA875286E011900F1FAA6 /* DatadogContextProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EFA874286E011900F1FAA6 /* DatadogContextProviderTests.swift */; };
+ D2EFA876286E011900F1FAA6 /* DatadogContextProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EFA874286E011900F1FAA6 /* DatadogContextProviderTests.swift */; };
+ D2F44FB8299AA1DA0074B0D9 /* DataCompressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213532F270CA722000315AD /* DataCompressionTests.swift */; };
+ D2F44FB9299AA1DB0074B0D9 /* DataCompressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213532F270CA722000315AD /* DataCompressionTests.swift */; };
+ D2F44FBC299AA36D0074B0D9 /* Decompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F44FBB299AA36D0074B0D9 /* Decompression.swift */; };
+ D2F44FBD299AA36D0074B0D9 /* Decompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F44FBB299AA36D0074B0D9 /* Decompression.swift */; };
+ D2F44FC2299BD5600074B0D9 /* UIViewController+KeyboardControlling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F44FC1299BD5600074B0D9 /* UIViewController+KeyboardControlling.swift */; };
+ D2F44FC3299BD5600074B0D9 /* UIViewController+KeyboardControlling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F44FC1299BD5600074B0D9 /* UIViewController+KeyboardControlling.swift */; };
+ D2F8235329915E12003C7E99 /* DatadogSite.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F8235229915E12003C7E99 /* DatadogSite.swift */; };
+ D2F8235429915E12003C7E99 /* DatadogSite.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F8235229915E12003C7E99 /* DatadogSite.swift */; };
+ D2FB1254292E0E96005B13F8 /* TrackingConsentPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB1253292E0E92005B13F8 /* TrackingConsentPublisher.swift */; };
+ D2FB1255292E0E99005B13F8 /* TrackingConsentPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB1253292E0E92005B13F8 /* TrackingConsentPublisher.swift */; };
+ D2FB1257292E0F0E005B13F8 /* TrackingConsentPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB1256292E0F0B005B13F8 /* TrackingConsentPublisherTests.swift */; };
+ D2FB1258292E0F10005B13F8 /* TrackingConsentPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB1256292E0F0B005B13F8 /* TrackingConsentPublisherTests.swift */; };
+ D2FB125D292FBB56005B13F8 /* Datadog+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB125C292FBB56005B13F8 /* Datadog+Internal.swift */; };
+ D2FB125E292FBB56005B13F8 /* Datadog+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB125C292FBB56005B13F8 /* Datadog+Internal.swift */; };
+ E143CCAF27D236F600F4018A /* CITestIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E143CCAE27D236F600F4018A /* CITestIntegrationTests.swift */; };
+ E1C853142AA9B9A300C74BCF /* TelemetryMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C853132AA9B9A300C74BCF /* TelemetryMocks.swift */; };
+ E1C853152AA9B9A300C74BCF /* TelemetryMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C853132AA9B9A300C74BCF /* TelemetryMocks.swift */; };
+ E1D5AEA724B4D45B007F194B /* Versioning.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D5AEA624B4D45A007F194B /* Versioning.swift */; };
+ E2AA55E72C32C6D9002FEF28 /* ApplicationNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AA55E62C32C6D9002FEF28 /* ApplicationNotifications.swift */; };
+ E2AA55E82C32C6D9002FEF28 /* ApplicationNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AA55E62C32C6D9002FEF28 /* ApplicationNotifications.swift */; };
+ E2AA55EA2C32C76A002FEF28 /* WatchKitExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AA55E92C32C76A002FEF28 /* WatchKitExtensions.swift */; };
+ E2AA55EC2C32C78B002FEF28 /* WatchKitExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AA55E92C32C76A002FEF28 /* WatchKitExtensions.swift */; };
+ F603F1262CAE9F760088E6B7 /* DDInternalLogger+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = F603F1252CAE9F760088E6B7 /* DDInternalLogger+objc.swift */; };
+ F603F1272CAE9F760088E6B7 /* DDInternalLogger+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = F603F1252CAE9F760088E6B7 /* DDInternalLogger+objc.swift */; };
+ F603F12B2CAEA4FA0088E6B7 /* DDInternalLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F603F1282CAEA4E90088E6B7 /* DDInternalLoggerTests.swift */; };
+ F603F12C2CAEA7180088E6B7 /* DDInternalLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F603F1282CAEA4E90088E6B7 /* DDInternalLoggerTests.swift */; };
+ F603F1302CAEA7620088E6B7 /* DDInternalLogger+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F603F12D2CAEA7590088E6B7 /* DDInternalLogger+apiTests.m */; };
+ F603F1312CAEA7630088E6B7 /* DDInternalLogger+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F603F12D2CAEA7590088E6B7 /* DDInternalLogger+apiTests.m */; };
+ F6E106542C75E0D000716DC6 /* LogsDataModels+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6E106532C75E0D000716DC6 /* LogsDataModels+objc.swift */; };
+ F6E106552C75E0D000716DC6 /* LogsDataModels+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6E106532C75E0D000716DC6 /* LogsDataModels+objc.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
+ 3C41693D29FBF5BB0042B9D2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D257953D298ABA65008A1BE5;
+ remoteInfo = "TestUtilities iOS";
+ };
+ 3C41693F29FBF5F20042B9D2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ 3C41694129FBF6100042B9D2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ 3C4D5FEE2A0115C600F1FF78 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2C1A53329C4F2DF00946C31;
+ remoteInfo = "DatadogTrace tvOS";
+ };
+ 3C4D5FF02A0115CB00F1FF78 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2DA2355298D57AA00C6C7E6;
+ remoteInfo = "DatadogInternal tvOS";
+ };
+ 3C9C6BB629F7C0C000581C43 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ 3CE11A0729F7BE0500202522 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 3CE119FD29F7BE0000202522;
+ remoteInfo = "DatadogWebViewTracking iOS";
+ };
61133C722423993200786299 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 61133B79242393DE00786299 /* Project object */;
@@ -203,19 +1813,33 @@
remoteGlobalIDString = 61133B81242393DE00786299;
remoteInfo = Datadog;
};
- 61441C2F24616F1D003D8BB8 /* PBXContainerItemProxy */ = {
+ 6133D1E72A6ED9E100384BEF /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 61133B79242393DE00786299 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 61441C0124616DE9003D8BB8;
- remoteInfo = Example;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
};
- 61441C4F24619499003D8BB8 /* PBXContainerItemProxy */ = {
+ 6133D1F82A6EDB7700384BEF /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 61133B79242393DE00786299 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 61133B81242393DE00786299;
- remoteInfo = Datadog;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ 6133D1FA2A6EDB7700384BEF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D257953D298ABA65008A1BE5;
+ remoteInfo = "TestUtilities iOS";
+ };
+ 6133D2092A6EDBAE00384BEF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 6133D1E52A6ED9E100384BEF;
+ remoteInfo = "DatadogSessionReplay iOS";
};
61441C5924619A08003D8BB8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
@@ -224,54 +1848,518 @@
remoteGlobalIDString = 61441C0124616DE9003D8BB8;
remoteInfo = Example;
};
- 61441C7424619FED003D8BB8 /* PBXContainerItemProxy */ = {
+ 6158155A2AB4534F002C60D7 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 61133B79242393DE00786299 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 61441C0124616DE9003D8BB8;
- remoteInfo = Example;
+ remoteInfo = "Example iOS";
+ };
+ 618F9845265BC486009959F8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 6199362A265BA958009D7EA8;
+ remoteInfo = E2E;
+ };
+ 61993658265BB6A6009D7EA8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 61133B81242393DE00786299;
+ remoteInfo = Datadog;
+ };
+ 6199365C265BB6A6009D7EA8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 61B7885325C180CB002675B5;
+ remoteInfo = DatadogCrashReporting;
+ };
+ 6199366A265BBEDC009D7EA8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 6199362A265BA958009D7EA8;
+ remoteInfo = E2E;
+ };
+ 61A2CC282A4449210000FF25 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D29A9F3329DD84AA005C54A4;
+ remoteInfo = "DatadogRUM iOS";
+ };
+ 61A2CC2D2A4449300000FF25 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23F8E4D29DDCD28001CFAE8;
+ remoteInfo = "DatadogRUM tvOS";
+ };
+ 61B7885E25C180CB002675B5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 61B7885325C180CB002675B5;
+ remoteInfo = DatadogCrashReporting;
+ };
+ D206BB872A41CA6800F43BA2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D207317B29A5226A00ECBF94;
+ remoteInfo = "DatadogLogs iOS";
+ };
+ D206BB8C2A41CA7000F43BA2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D20731A429A5279D00ECBF94;
+ remoteInfo = "DatadogLogs tvOS";
+ };
+ D207318529A5226B00ECBF94 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D207317B29A5226A00ECBF94;
+ remoteInfo = DatadogLogs;
+ };
+ D207319929A5232A00ECBF94 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ D22A031A29F7DAA9002C02C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D20731A429A5279D00ECBF94;
+ remoteInfo = "DatadogLogs tvOS";
+ };
+ D22A031C29F7DABE002C02C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23F8E4D29DDCD28001CFAE8;
+ remoteInfo = "DatadogRUM tvOS";
+ };
+ D2303A06298D5317001A1FA3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ D231F7AF2A00FF28000D6239 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ D231F7B12A00FF2F000D6239 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2DA2355298D57AA00C6C7E6;
+ remoteInfo = "DatadogInternal tvOS";
+ };
+ D231F7B32A00FF8F000D6239 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 61133B81242393DE00786299;
+ remoteInfo = "Datadog iOS";
+ };
+ D231F7B52A00FF9A000D6239 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 61B7885325C180CB002675B5;
+ remoteInfo = "DatadogCrashReporting iOS";
+ };
+ D231F7B72A00FFA3000D6239 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2CB6FBA27C5348200A62B57;
+ remoteInfo = "DatadogCrashReporting tvOS";
+ };
+ D23F8ECF29DDCD5C001CFAE8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2DA2355298D57AA00C6C7E6;
+ remoteInfo = "DatadogInternal tvOS";
+ };
+ D240685627CF5D0100C04F44 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2CB6E0A27C50EAE00A62B57;
+ remoteInfo = "Datadog tvOS";
+ };
+ D240686C27CF687200C04F44 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D24067F827CE6C9E00C04F44;
+ remoteInfo = "Example tvOS";
+ };
+ D25CFA9A29C4F41F00E3A43D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2C1A53329C4F2DF00946C31;
+ remoteInfo = "DatadogTrace tvOS";
+ };
+ D25EE93D29C4C3C300CE3839 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D25EE93329C4C3C300CE3839;
+ remoteInfo = DatadogTrace;
+ };
+ D26F741429ACBDAD00D25622 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2DA2355298D57AA00C6C7E6;
+ remoteInfo = "DatadogInternal tvOS";
+ };
+ D28D5D5327C53A60008E72D0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2CB6FBA27C5348200A62B57;
+ remoteInfo = "DatadogCrashReporting tvOS";
+ };
+ D29A9F3D29DD84AB005C54A4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D29A9F3329DD84AA005C54A4;
+ remoteInfo = DatadogRUM;
+ };
+ D29A9F4D29DD8525005C54A4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ D2A434A42A8E3F900028E329 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 6133D1E52A6ED9E100384BEF;
+ remoteInfo = "DatadogSessionReplay iOS";
+ };
+ D2A783E229A53414003B03BB /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2DA2355298D57AA00C6C7E6;
+ remoteInfo = "DatadogInternal tvOS";
+ };
+ D2C1A51029C4C4EF00946C31 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ D2C1A52B29C4C92800946C31 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D25EE93329C4C3C300CE3839;
+ remoteInfo = "DatadogTrace iOS";
+ };
+ D2C1A57629C4F30000946C31 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2DA2355298D57AA00C6C7E6;
+ remoteInfo = "DatadogInternal tvOS";
+ };
+ D2CB6FB527C5234300A62B57 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2CB6E0A27C50EAE00A62B57;
+ remoteInfo = "Datadog tvOS";
+ };
+ D2DA238F298D588A00C6C7E6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D23039A4298D513C001A1FA3;
+ remoteInfo = "DatadogInternal iOS";
+ };
+ D2DA23D2298D620F00C6C7E6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 61133B79242393DE00786299 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D2DA2355298D57AA00C6C7E6;
+ remoteInfo = "DatadogInternal tvOS";
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
- 61133C742423993200786299 /* Embed Frameworks */ = {
+ 61993660265BB6A6009D7EA8 /* ⚙️ Embed Framework Dependencies */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
- 61133C712423993200786299 /* Datadog.framework in Embed Frameworks */,
+ 61993657265BB6A6009D7EA8 /* DatadogCore.framework in ⚙️ Embed Framework Dependencies */,
+ 6199365B265BB6A6009D7EA8 /* DatadogCrashReporting.framework in ⚙️ Embed Framework Dependencies */,
);
- name = "Embed Frameworks";
+ name = "⚙️ Embed Framework Dependencies";
runOnlyForDeploymentPostprocessing = 0;
};
- 61441C5124619499003D8BB8 /* ⚙️ Embed Framework Dependencies */ = {
+ D240684527CE6C9E00C04F44 /* ⚙️ Embed Framework Dependencies */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
- 61441C4E24619498003D8BB8 /* Datadog.framework in ⚙️ Embed Framework Dependencies */,
- 61570006246AAE5E00E96950 /* DatadogObjc.framework in ⚙️ Embed Framework Dependencies */,
+ D240685927CF5D0100C04F44 /* DatadogCrashReporting.framework in ⚙️ Embed Framework Dependencies */,
+ D240685527CF5D0100C04F44 /* DatadogCore.framework in ⚙️ Embed Framework Dependencies */,
+ 1434A4642B7F73170072E3BB /* OpenTelemetryApi.xcframework in ⚙️ Embed Framework Dependencies */,
+ D24C9C4729A7A520002057CF /* DatadogLogs.framework in ⚙️ Embed Framework Dependencies */,
+ D240686027CF5D0100C04F44 /* DatadogObjc.framework in ⚙️ Embed Framework Dependencies */,
);
name = "⚙️ Embed Framework Dependencies";
runOnlyForDeploymentPostprocessing = 0;
};
+ D240687A27CF982B00C04F44 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ 3C2206F82AB9DBC600DE780C /* DatadogInternal.framework in Embed Frameworks */,
+ 3C2206F72AB9DBB600DE780C /* DatadogTrace.framework in Embed Frameworks */,
+ 1434A4622B7F73110072E3BB /* OpenTelemetryApi.xcframework in Embed Frameworks */,
+ 3C2206F62AB9DBA700DE780C /* DatadogRUM.framework in Embed Frameworks */,
+ 3C2206F52AB9DB9000DE780C /* DatadogSessionReplay.framework in Embed Frameworks */,
+ D240687E27CF982D00C04F44 /* DatadogCrashReporting.framework in Embed Frameworks */,
+ D240687C27CF982C00C04F44 /* DatadogCore.framework in Embed Frameworks */,
+ D24C9C4329A7A50D002057CF /* DatadogLogs.framework in Embed Frameworks */,
+ 3CE11A1229F7BE0900202522 /* DatadogWebViewTracking.framework in Embed Frameworks */,
+ D240688027CF982F00C04F44 /* DatadogObjc.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 61133B82242393DE00786299 /* Datadog.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Datadog.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 61133B85242393DE00786299 /* Datadog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Datadog.h; sourceTree = ""; };
+ 116F84052CFDD06700705755 /* SampleRateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleRateTests.swift; sourceTree = ""; };
+ 1434A4652B7F8D880072E3BB /* DebugOTelTracingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugOTelTracingViewController.swift; sourceTree = ""; };
+ 3C08F9CF2C2D652D002B0FF2 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; };
+ 3C0CB3442C19A1ED003B0E9B /* WatchdogTerminationReporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationReporter.swift; sourceTree = ""; };
+ 3C0D5DD62A543B3B00446CF9 /* Event.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = ""; };
+ 3C0D5DDC2A543D5D00446CF9 /* EventGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventGenerator.swift; sourceTree = ""; };
+ 3C0D5DDF2A543DAE00446CF9 /* EventGeneratorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventGeneratorTests.swift; sourceTree = ""; };
+ 3C0D5DE62A543E9700446CF9 /* RUMViewEventsFilterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RUMViewEventsFilterTests.swift; sourceTree = ""; };
+ 3C0D5DEB2A54405A00446CF9 /* RUMViewEventsFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUMViewEventsFilter.swift; sourceTree = ""; };
+ 3C0D5DEE2A5442A900446CF9 /* EventMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventMocks.swift; sourceTree = ""; };
+ 3C0D5DF42A5443B100446CF9 /* DataFormatTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataFormatTests.swift; sourceTree = ""; };
+ 3C1890132ABDE99200CE9E73 /* DDURLSessionInstrumentationTests+apiTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "DDURLSessionInstrumentationTests+apiTests.m"; sourceTree = ""; };
+ 3C1F88222B767CE200821579 /* OpenTelemetryApi.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = OpenTelemetryApi.xcframework; path = ../Carthage/Build/OpenTelemetryApi.xcframework; sourceTree = ""; };
+ 3C32359C2B55386C000B4258 /* OTelSpanLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTelSpanLink.swift; sourceTree = ""; };
+ 3C32359F2B55387A000B4258 /* OTelSpanLinkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTelSpanLinkTests.swift; sourceTree = ""; };
+ 3C33E4062BEE35A7003B2988 /* RUMContextMocks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RUMContextMocks.swift; sourceTree = ""; };
+ 3C3C9E2B2C64F3CA003AF22F /* Data+Crypto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Crypto.swift"; sourceTree = ""; };
+ 3C3C9E2E2C64F470003AF22F /* Data+CryptoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+CryptoTests.swift"; sourceTree = ""; };
+ 3C3EF2AF2C1AEBAB009E9E57 /* LaunchReport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchReport.swift; sourceTree = ""; };
+ 3C43A3862C188970000BFB21 /* WatchdogTerminationMonitorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationMonitorTests.swift; sourceTree = ""; };
+ 3C4CF9972C47CC8C006DE1C0 /* MemoryWarningMonitorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryWarningMonitorTests.swift; sourceTree = ""; };
+ 3C4CF99A2C47DAA5006DE1C0 /* MemoryWarningMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryWarningMocks.swift; sourceTree = ""; };
+ 3C5CD8C12C3EBA1700B12303 /* MemoryWarningMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryWarningMonitor.swift; sourceTree = ""; };
+ 3C5CD8C42C3EC61500B12303 /* MemoryWarning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryWarning.swift; sourceTree = ""; };
+ 3C5CD8CA2C3ECB4800B12303 /* MemoryWarningReporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryWarningReporter.swift; sourceTree = ""; };
+ 3C5D63682B55512B00FEB4BA /* OTelTraceState+Datadog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OTelTraceState+Datadog.swift"; sourceTree = ""; };
+ 3C5D636B2B55513500FEB4BA /* OTelTraceState+DatadogTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OTelTraceState+DatadogTests.swift"; sourceTree = ""; };
+ 3C62C3602C3E852F00C7E336 /* MultiSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiSelector.swift; sourceTree = ""; };
+ 3C6C7FE02B459AAA006F5CBC /* OTelSpan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTelSpan.swift; sourceTree = ""; };
+ 3C6C7FE12B459AAA006F5CBC /* OTelSpanBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTelSpanBuilder.swift; sourceTree = ""; };
+ 3C6C7FE22B459AAA006F5CBC /* OTelTraceId+Datadog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OTelTraceId+Datadog.swift"; sourceTree = ""; };
+ 3C6C7FE42B459AAA006F5CBC /* OTelSpanId+Datadog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OTelSpanId+Datadog.swift"; sourceTree = ""; };
+ 3C6C7FF22B459AB3006F5CBC /* OTelSpanId+DatadogTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OTelSpanId+DatadogTests.swift"; sourceTree = ""; };
+ 3C6C7FF32B459AB3006F5CBC /* OTelTraceId+DatadogTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OTelTraceId+DatadogTests.swift"; sourceTree = ""; };
+ 3C6C7FF42B459AB3006F5CBC /* OTelSpanTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTelSpanTests.swift; sourceTree = ""; };
+ 3C85D41429F7C59C00AFF894 /* WebViewTracking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewTracking.swift; sourceTree = ""; };
+ 3C85D42B29F7C87D00AFF894 /* HostsSanitizerMock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HostsSanitizerMock.swift; sourceTree = ""; };
+ 3C9B27242B9F174700569C07 /* SpanID.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpanID.swift; sourceTree = ""; };
+ 3CA00B062C2AE52400E6FE01 /* WatchdogTerminationsMonitoringTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationsMonitoringTests.swift; sourceTree = ""; };
+ 3CA8525E2BF2073800B52CBA /* TraceContextInjection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TraceContextInjection.swift; sourceTree = ""; };
+ 3CA852612BF2147600B52CBA /* TraceContextInjection+objc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TraceContextInjection+objc.swift"; sourceTree = ""; };
+ 3CB012DB2B482E0400557951 /* NOPOTelSpan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NOPOTelSpan.swift; sourceTree = ""; };
+ 3CB012DC2B482E0400557951 /* NOPOTelSpanBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NOPOTelSpanBuilder.swift; sourceTree = ""; };
+ 3CBDE6732AA08C2F00F6A7B6 /* URLSessionInstrumentation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionInstrumentation.swift; sourceTree = ""; };
+ 3CBDE6892AA0C47300F6A7B6 /* URLSessionTask+Tracking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLSessionTask+Tracking.swift"; sourceTree = ""; };
+ 3CC6AD172B4F07DC00015B18 /* OTelAttributeValue+Datadog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OTelAttributeValue+Datadog.swift"; sourceTree = ""; };
+ 3CC6AD1A2B4F07E700015B18 /* OTelAttributeValue+DatadogTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OTelAttributeValue+DatadogTests.swift"; sourceTree = ""; };
+ 3CCCA5C32ABAF0F80029D7BD /* DDURLSessionInstrumentation+objc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DDURLSessionInstrumentation+objc.swift"; sourceTree = ""; };
+ 3CCCA5C62ABAF5230029D7BD /* DDURLSessionInstrumentationConfigurationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DDURLSessionInstrumentationConfigurationTests.swift; sourceTree = ""; };
+ 3CCECDAE2BC688120013C125 /* SpanIDGeneratorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpanIDGeneratorTests.swift; sourceTree = ""; };
+ 3CCECDB12BC68A0A0013C125 /* SpanIDTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpanIDTests.swift; sourceTree = ""; };
+ 3CE119FE29F7BE0100202522 /* DatadogWebViewTracking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DatadogWebViewTracking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3CE11A0529F7BE0300202522 /* DatadogWebViewTrackingTests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "DatadogWebViewTrackingTests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3CEC57702C16FD000042B5F2 /* WatchdogTerminationMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationMocks.swift; sourceTree = ""; };
+ 3CEC57752C16FDD30042B5F2 /* WatchdogTerminationAppStateManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationAppStateManagerTests.swift; sourceTree = ""; };
+ 3CF673352B4807490016CE17 /* OTelSpanTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTelSpanTests.swift; sourceTree = ""; };
+ 3CFF4F8A2C09E61A006F191D /* WatchdogTerminationAppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationAppState.swift; sourceTree = ""; };
+ 3CFF4F902C09E630006F191D /* WatchdogTerminationAppStateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationAppStateManager.swift; sourceTree = ""; };
+ 3CFF4F932C09E63C006F191D /* WatchdogTerminationChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationChecker.swift; sourceTree = ""; };
+ 3CFF4F962C09E64C006F191D /* WatchdogTerminationMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationMonitor.swift; sourceTree = ""; };
+ 3CFF4FA32C0E0FE5006F191D /* WatchdogTerminationCheckerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchdogTerminationCheckerTests.swift; sourceTree = ""; };
+ 3CFF5D482B555F4F00FC483A /* OTelTracerProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTelTracerProvider.swift; sourceTree = ""; };
+ 49274903288048AA00ECD49B /* InternalProxyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InternalProxyTests.swift; sourceTree = ""; };
+ 49274908288048F400ECD49B /* RUMInternalProxyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RUMInternalProxyTests.swift; sourceTree = ""; };
+ 49D8C0B62AC5D2160075E427 /* RUM+Internal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RUM+Internal.swift"; sourceTree = ""; };
+ 49D8C0B92AC5F21F0075E427 /* Logs+Internal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logs+Internal.swift"; sourceTree = ""; };
+ 61020C292757AD91005EEAEA /* BackgroundLocationMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundLocationMonitor.swift; sourceTree = ""; };
+ 61020C2B2758E853005EEAEA /* DebugBackgroundEventsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugBackgroundEventsViewController.swift; sourceTree = ""; };
+ 61054E082A6EE10A00AAA894 /* SRCompression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SRCompression.swift; sourceTree = ""; };
+ 61054E092A6EE10A00AAA894 /* RecordWriter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordWriter.swift; sourceTree = ""; };
+ 61054E0B2A6EE10A00AAA894 /* SessionReplayConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionReplayConfiguration.swift; sourceTree = ""; };
+ 61054E0C2A6EE10A00AAA894 /* SessionReplay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionReplay.swift; sourceTree = ""; };
+ 61054E0F2A6EE10A00AAA894 /* AppWindowObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppWindowObserver.swift; sourceTree = ""; };
+ 61054E102A6EE10A00AAA894 /* KeyWindowObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyWindowObserver.swift; sourceTree = ""; };
+ 61054E112A6EE10A00AAA894 /* Recorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Recorder.swift; sourceTree = ""; };
+ 61054E122A6EE10A00AAA894 /* PrivacyLevel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacyLevel.swift; sourceTree = ""; };
+ 61054E142A6EE10A00AAA894 /* UIImage+SessionReplay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+SessionReplay.swift"; sourceTree = ""; };
+ 61054E152A6EE10A00AAA894 /* UIView+SessionReplay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+SessionReplay.swift"; sourceTree = ""; };
+ 61054E162A6EE10A00AAA894 /* CFType+Safety.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CFType+Safety.swift"; sourceTree = ""; };
+ 61054E172A6EE10A00AAA894 /* SystemColors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemColors.swift; sourceTree = ""; };
+ 61054E182A6EE10A00AAA894 /* CGRect+SessionReplay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGRect+SessionReplay.swift"; sourceTree = ""; };
+ 61054E192A6EE10A00AAA894 /* RecordingCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordingCoordinator.swift; sourceTree = ""; };
+ 61054E1B2A6EE10A00AAA894 /* UIApplicationSwizzler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIApplicationSwizzler.swift; sourceTree = ""; };
+ 61054E1C2A6EE10A00AAA894 /* TouchSnapshotProducer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TouchSnapshotProducer.swift; sourceTree = ""; };
+ 61054E1E2A6EE10A00AAA894 /* TouchSnapshot.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TouchSnapshot.swift; sourceTree = ""; };
+ 61054E1F2A6EE10A00AAA894 /* TouchIdentifierGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TouchIdentifierGenerator.swift; sourceTree = ""; };
+ 61054E202A6EE10A00AAA894 /* WindowTouchSnapshotProducer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowTouchSnapshotProducer.swift; sourceTree = ""; };
+ 61054E222A6EE10A00AAA894 /* ViewTreeSnapshotProducer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewTreeSnapshotProducer.swift; sourceTree = ""; };
+ 61054E242A6EE10A00AAA894 /* ViewTreeSnapshot.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewTreeSnapshot.swift; sourceTree = ""; };
+ 61054E252A6EE10A00AAA894 /* ViewTreeSnapshotBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewTreeSnapshotBuilder.swift; sourceTree = ""; };
+ 61054E262A6EE10A00AAA894 /* ViewTreeRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewTreeRecorder.swift; sourceTree = ""; };
+ 61054E282A6EE10A00AAA894 /* UIDatePickerRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDatePickerRecorder.swift; sourceTree = ""; };
+ 61054E292A6EE10A00AAA894 /* UITextViewRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITextViewRecorder.swift; sourceTree = ""; };
+ 61054E2A2A6EE10A00AAA894 /* UIImageViewRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageViewRecorder.swift; sourceTree = ""; };
+ 61054E2B2A6EE10A00AAA894 /* UIViewRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewRecorder.swift; sourceTree = ""; };
+ 61054E2C2A6EE10A00AAA894 /* UINavigationBarRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UINavigationBarRecorder.swift; sourceTree = ""; };
+ 61054E2D2A6EE10A00AAA894 /* UITextFieldRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITextFieldRecorder.swift; sourceTree = ""; };
+ 61054E2E2A6EE10A00AAA894 /* NodeRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NodeRecorder.swift; sourceTree = ""; };
+ 61054E2F2A6EE10A00AAA894 /* UISliderRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UISliderRecorder.swift; sourceTree = ""; };
+ 61054E302A6EE10A00AAA894 /* UIPickerViewRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIPickerViewRecorder.swift; sourceTree = ""; };
+ 61054E312A6EE10A00AAA894 /* UIStepperRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIStepperRecorder.swift; sourceTree = ""; };
+ 61054E322A6EE10A00AAA894 /* UILabelRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UILabelRecorder.swift; sourceTree = ""; };
+ 61054E332A6EE10A00AAA894 /* UISwitchRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UISwitchRecorder.swift; sourceTree = ""; };
+ 61054E342A6EE10A00AAA894 /* UITabBarRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITabBarRecorder.swift; sourceTree = ""; };
+ 61054E352A6EE10A00AAA894 /* UISegmentRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UISegmentRecorder.swift; sourceTree = ""; };
+ 61054E362A6EE10A00AAA894 /* UnsupportedViewRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnsupportedViewRecorder.swift; sourceTree = ""; };
+ 61054E382A6EE10A00AAA894 /* ViewTreeRecordingContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewTreeRecordingContext.swift; sourceTree = ""; };
+ 61054E392A6EE10A00AAA894 /* NodeIDGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NodeIDGenerator.swift; sourceTree = ""; };
+ 61054E3A2A6EE10A00AAA894 /* WindowViewTreeSnapshotProducer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowViewTreeSnapshotProducer.swift; sourceTree = "