From 871a1be22357c35c7d8918940ba4172bfb949f68 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Tue, 2 Jan 2024 23:25:48 -0500 Subject: [PATCH 01/13] Add new SwiftUI API --- .github/workflows/swift.yml | 65 ++- .gitignore | 6 +- .spi.yml | 4 + Assets/SimulationDiagram.svg | 18 + Assets/grape_icon.png | Bin 0 -> 159683 bytes Assets/grape_icon_256.png | Bin 0 -> 58358 bytes DocPostprocess.swift | 83 ++++ .../project.pbxproj | 400 +++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../Content.imageset/Contents.json | 12 + .../Back.solidimagestacklayer/Contents.json | 6 + .../AppIcon.solidimagestack/Contents.json | 17 + .../Content.imageset/Contents.json | 12 + .../Front.solidimagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Middle.solidimagestacklayer/Contents.json | 6 + .../Assets.xcassets/Contents.json | 6 + .../ForceDirectedGraph3D/ContentView.swift | 221 +++++++++ .../ForceDirectedGraph3D/Data.swift | 408 +++++++++++++++ .../ForceDirectedGraph3DApp.swift | 17 + .../ForceDirectedGraph3D/Info.plist | 15 + .../Preview Assets.xcassets/Contents.json | 6 + .../.build/workspace-state.json | 11 + .../ProjectData/main.json | 11 + .../WorkspaceData/SceneMetadataList.json | 209 ++++++++ .../WorkspaceData/Settings.rcprojectdata | 17 + .../Packages/RealityKitContent/Package.swift | 25 + .../Packages/RealityKitContent/README.md | 3 + .../Materials/GridMaterial.usda | 216 ++++++++ .../RealityKitContent.rkassets/Scene.usda | 59 +++ .../RealityKitContent/RealityKitContent.swift | 4 + .../project.pbxproj | 39 +- .../ContentView.swift | 195 ++++---- .../ForceDirectedGraphExampleApp.swift | 2 +- .../ForceDirectedLatticeView.swift | 223 +++++++++ .../ForceDirectedGraphExample/Lattice.swift | 66 +++ .../Miserables.swift | 86 ++++ .../ForceDirectedGraphExample/MyRing.swift | 77 +++ Package.resolved | 23 - Package.swift | 50 +- README.md | 219 ++++++-- Sources/ForceSimulation/ForceLike.swift | 28 -- Sources/ForceSimulation/ForceProtocol.swift | 89 ++++ .../CreatingASimulationWithBuiltinForces.md | 70 +++ .../ForceSimulation.docc/Documentation.md | 75 +++ .../Resources/ForceDirectedGraph.png | Bin 0 -> 434284 bytes .../Resources/SimulationDiagram.svg | 18 + .../ForceSimulation/Forces/CenterForce.swift | 51 ++ .../ForceSimulation/Forces/CollideForce.swift | 335 +++++++++++++ .../Forces/CompositedForce.swift | 100 ++++ .../ForceSimulation/Forces/EmptyForce.swift | 16 + .../ForceSimulation/Forces/LinkForce.swift | 237 +++++++++ .../Forces/ManyBodyForce.swift | 292 +++++++++++ .../Forces/PositionForce.swift | 85 ++++ .../ForceSimulation/Forces/RadialForce.swift | 72 +++ .../Forces/SealedForce2D.swift | 196 ++++++++ .../Forces/SealedForce3D.swift | 195 ++++++++ .../KDTree/BufferedKDTree.swift | 369 ++++++++++++++ Sources/ForceSimulation/KDTree/KDBox.swift | 223 +++++++++ Sources/ForceSimulation/KDTree/KDTree.swift | 307 ++++++++++++ .../KDTree/KDTreeDelegate.swift | 43 ++ .../ForceSimulation/KDTree/KDTreeNode.swift | 159 ++++++ Sources/ForceSimulation/Kinetics.swift | 185 +++++++ Sources/ForceSimulation/Simulation.swift | 198 ++++---- Sources/ForceSimulation/Utils.swift | 72 --- .../Utils/AttributeDescriptor.swift | 46 ++ .../ForceSimulation/Utils/Disposable.swift | 18 + Sources/ForceSimulation/Utils/EdgeID.swift | 19 + .../Utils/LinearCongruentialGenerator.swift | 118 +++++ .../Utils/SimulatableVector.swift | 135 +++++ .../ForceSimulation/Utils/UnsafeArray.swift | 151 ++++++ .../ForceSimulation/forces/CenterForce.swift | 48 -- .../ForceSimulation/forces/CollideForce.swift | 200 -------- .../forces/DirectionForce.swift | 114 ----- .../ForceSimulation/forces/LinkForce.swift | 238 --------- .../forces/ManyBodyForce.swift | 322 ------------ .../ForceSimulation/forces/RadialForce.swift | 101 ---- .../Contents/CompositedGraphContent.swift | 17 + Sources/Grape/Contents/GraphContent.swift | 11 + .../Grape/Contents/GraphContentBuilder.swift | 87 ++++ Sources/Grape/Contents/LinkMark.swift | 84 ++++ .../Grape/Contents/ModifiedGraphContent.swift | 52 ++ Sources/Grape/Contents/NodeMark.swift | 81 +++ .../Grape/Contents/_ArrayGraphContent.swift | 22 + .../Contents/_ConditionalGraphContent.swift | 30 ++ .../Grape/Contents/_EmptyGraphContent.swift | 11 + .../Contents/_ForEach+GraphContent.swift | 94 ++++ .../Contents/_OptionalGraphContent.swift | 26 + .../Grape/Contents/_PairedGraphContent.swift | 22 + .../Grape/Descriptors/ForceDescriptor.swift | 153 ++++++ .../Descriptors/SealedForce2DDescriptor.swift | 76 +++ .../ForceDirectedGraph2DController.swift | 33 ++ .../ForceDirectedGraph2DLayoutEngine.swift | 92 ++++ .../Modifiers/AnyGraphContentModifier.swift | 29 ++ .../Effects/GrapeEffect.ForegroundStyle.swift | 59 +++ .../Modifiers/Effects/GrapeEffect.Label.swift | 105 ++++ .../Effects/GrapeEffect.Opacity.swift | 27 + .../Effects/GrapeEffect.PathShape.swift | 28 ++ .../Effects/GrapeEffect.Stroke.swift | 57 +++ .../Effects/GrapeEffect.Symbol.swift | 37 ++ .../Effects/GrapeEffect.SymbolSize.swift | 29 ++ .../Grape/Modifiers/Effects/GrapeEffect.swift | 2 + .../GraphContent+GraphContentModifiers.swift | 102 ++++ .../Modifiers/GraphContentModifier.swift | 14 + Sources/Grape/Utils/CoreGraphics+SIMD.swift | 51 ++ Sources/Grape/Utils/GraphProtocol.swift | 65 +++ Sources/Grape/Utils/KeyFrame.swift | 39 ++ Sources/Grape/Utils/Transform.swift | 139 ++++++ Sources/Grape/Utils/View+CGImage.swift | 112 +++++ .../Views/ForceDirectedGraph+Gesture.swift | 201 ++++++++ .../Grape/Views/ForceDirectedGraph+View.swift | 95 ++++ Sources/Grape/Views/ForceDirectedGraph.swift | 76 +++ .../ForceDirectedGraphModel+Observation.swift | 19 + .../ForceDirectedGraphModel.findNode.swift | 37 ++ .../Grape/Views/ForceDirectedGraphModel.swift | 467 ++++++++++++++++++ .../Grape/Views/GraphRenderingContext.swift | 57 +++ .../Grape/Views/GraphRenderingStates.swift | 65 +++ Sources/Grape/Views/RenderOperation.swift | 96 ++++ Sources/Grape/Views/SimulationContext.swift | 197 ++++++++ Sources/NDTree/NDBox.swift | 178 ------- Sources/NDTree/NDTree+Traversable.swift | 46 -- Sources/NDTree/NDTree.swift | 308 ------------ Sources/NDTree/Quadtree+Octree.swift | 102 ---- Sources/NDTree/VectorLike.swift | 93 ---- Tests/ForceSimulationTests/ForceTests.swift | 60 +++ .../GKTreeCompareTest.swift | 115 +++++ .../ManyBodyForceTest.swift | 58 --- .../MiserableGraphTest.swift | 204 ++++---- .../GrapeTests/GraphContentBuilderTests.swift | 206 ++++++++ Tests/KDTreeTests/BufferedKDTreeTests.swift | 135 +++++ Tests/KDTreeTests/KDTreeTests.swift | 62 +++ .../NDTree+CustomDebugStringConvertible.swift | 53 -- Tests/NDTreeTests/QuadtreeTests.swift | 145 ------ Tests/NDTreeTests/Similarity.swift | 30 -- 135 files changed, 10152 insertions(+), 2534 deletions(-) create mode 100644 .spi.yml create mode 100644 Assets/SimulationDiagram.svg create mode 100644 Assets/grape_icon.png create mode 100644 Assets/grape_icon_256.png create mode 100644 DocPostprocess.swift create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.pbxproj create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Data.swift create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ForceDirectedGraph3DApp.swift create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Info.plist create mode 100644 Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/.build/workspace-state.json create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.swift create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/README.md create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Materials/GridMaterial.usda create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda create mode 100644 Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift create mode 100644 Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift create mode 100644 Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift create mode 100644 Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift create mode 100644 Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift delete mode 100644 Package.resolved delete mode 100644 Sources/ForceSimulation/ForceLike.swift create mode 100644 Sources/ForceSimulation/ForceProtocol.swift create mode 100644 Sources/ForceSimulation/ForceSimulation.docc/CreatingASimulationWithBuiltinForces.md create mode 100644 Sources/ForceSimulation/ForceSimulation.docc/Documentation.md create mode 100644 Sources/ForceSimulation/ForceSimulation.docc/Resources/ForceDirectedGraph.png create mode 100644 Sources/ForceSimulation/ForceSimulation.docc/Resources/SimulationDiagram.svg create mode 100644 Sources/ForceSimulation/Forces/CenterForce.swift create mode 100644 Sources/ForceSimulation/Forces/CollideForce.swift create mode 100644 Sources/ForceSimulation/Forces/CompositedForce.swift create mode 100644 Sources/ForceSimulation/Forces/EmptyForce.swift create mode 100644 Sources/ForceSimulation/Forces/LinkForce.swift create mode 100644 Sources/ForceSimulation/Forces/ManyBodyForce.swift create mode 100644 Sources/ForceSimulation/Forces/PositionForce.swift create mode 100644 Sources/ForceSimulation/Forces/RadialForce.swift create mode 100644 Sources/ForceSimulation/Forces/SealedForce2D.swift create mode 100644 Sources/ForceSimulation/Forces/SealedForce3D.swift create mode 100644 Sources/ForceSimulation/KDTree/BufferedKDTree.swift create mode 100644 Sources/ForceSimulation/KDTree/KDBox.swift create mode 100644 Sources/ForceSimulation/KDTree/KDTree.swift create mode 100644 Sources/ForceSimulation/KDTree/KDTreeDelegate.swift create mode 100644 Sources/ForceSimulation/KDTree/KDTreeNode.swift create mode 100644 Sources/ForceSimulation/Kinetics.swift delete mode 100644 Sources/ForceSimulation/Utils.swift create mode 100644 Sources/ForceSimulation/Utils/AttributeDescriptor.swift create mode 100644 Sources/ForceSimulation/Utils/Disposable.swift create mode 100644 Sources/ForceSimulation/Utils/EdgeID.swift create mode 100644 Sources/ForceSimulation/Utils/LinearCongruentialGenerator.swift create mode 100644 Sources/ForceSimulation/Utils/SimulatableVector.swift create mode 100644 Sources/ForceSimulation/Utils/UnsafeArray.swift delete mode 100644 Sources/ForceSimulation/forces/CenterForce.swift delete mode 100644 Sources/ForceSimulation/forces/CollideForce.swift delete mode 100644 Sources/ForceSimulation/forces/DirectionForce.swift delete mode 100644 Sources/ForceSimulation/forces/LinkForce.swift delete mode 100644 Sources/ForceSimulation/forces/ManyBodyForce.swift delete mode 100644 Sources/ForceSimulation/forces/RadialForce.swift create mode 100644 Sources/Grape/Contents/CompositedGraphContent.swift create mode 100644 Sources/Grape/Contents/GraphContent.swift create mode 100644 Sources/Grape/Contents/GraphContentBuilder.swift create mode 100644 Sources/Grape/Contents/LinkMark.swift create mode 100644 Sources/Grape/Contents/ModifiedGraphContent.swift create mode 100644 Sources/Grape/Contents/NodeMark.swift create mode 100644 Sources/Grape/Contents/_ArrayGraphContent.swift create mode 100644 Sources/Grape/Contents/_ConditionalGraphContent.swift create mode 100644 Sources/Grape/Contents/_EmptyGraphContent.swift create mode 100644 Sources/Grape/Contents/_ForEach+GraphContent.swift create mode 100644 Sources/Grape/Contents/_OptionalGraphContent.swift create mode 100644 Sources/Grape/Contents/_PairedGraphContent.swift create mode 100644 Sources/Grape/Descriptors/ForceDescriptor.swift create mode 100644 Sources/Grape/Descriptors/SealedForce2DDescriptor.swift create mode 100644 Sources/Grape/Models/ForceDirectedGraph2DController.swift create mode 100644 Sources/Grape/Models/ForceDirectedGraph2DLayoutEngine.swift create mode 100644 Sources/Grape/Modifiers/AnyGraphContentModifier.swift create mode 100644 Sources/Grape/Modifiers/Effects/GrapeEffect.ForegroundStyle.swift create mode 100644 Sources/Grape/Modifiers/Effects/GrapeEffect.Label.swift create mode 100644 Sources/Grape/Modifiers/Effects/GrapeEffect.Opacity.swift create mode 100644 Sources/Grape/Modifiers/Effects/GrapeEffect.PathShape.swift create mode 100644 Sources/Grape/Modifiers/Effects/GrapeEffect.Stroke.swift create mode 100644 Sources/Grape/Modifiers/Effects/GrapeEffect.Symbol.swift create mode 100644 Sources/Grape/Modifiers/Effects/GrapeEffect.SymbolSize.swift create mode 100644 Sources/Grape/Modifiers/Effects/GrapeEffect.swift create mode 100644 Sources/Grape/Modifiers/GraphContent+GraphContentModifiers.swift create mode 100644 Sources/Grape/Modifiers/GraphContentModifier.swift create mode 100644 Sources/Grape/Utils/CoreGraphics+SIMD.swift create mode 100644 Sources/Grape/Utils/GraphProtocol.swift create mode 100644 Sources/Grape/Utils/KeyFrame.swift create mode 100644 Sources/Grape/Utils/Transform.swift create mode 100644 Sources/Grape/Utils/View+CGImage.swift create mode 100644 Sources/Grape/Views/ForceDirectedGraph+Gesture.swift create mode 100644 Sources/Grape/Views/ForceDirectedGraph+View.swift create mode 100644 Sources/Grape/Views/ForceDirectedGraph.swift create mode 100644 Sources/Grape/Views/ForceDirectedGraphModel+Observation.swift create mode 100644 Sources/Grape/Views/ForceDirectedGraphModel.findNode.swift create mode 100644 Sources/Grape/Views/ForceDirectedGraphModel.swift create mode 100644 Sources/Grape/Views/GraphRenderingContext.swift create mode 100644 Sources/Grape/Views/GraphRenderingStates.swift create mode 100644 Sources/Grape/Views/RenderOperation.swift create mode 100644 Sources/Grape/Views/SimulationContext.swift delete mode 100644 Sources/NDTree/NDBox.swift delete mode 100644 Sources/NDTree/NDTree+Traversable.swift delete mode 100644 Sources/NDTree/NDTree.swift delete mode 100644 Sources/NDTree/Quadtree+Octree.swift delete mode 100644 Sources/NDTree/VectorLike.swift create mode 100644 Tests/ForceSimulationTests/ForceTests.swift create mode 100644 Tests/ForceSimulationTests/GKTreeCompareTest.swift delete mode 100644 Tests/ForceSimulationTests/ManyBodyForceTest.swift create mode 100644 Tests/GrapeTests/GraphContentBuilderTests.swift create mode 100644 Tests/KDTreeTests/BufferedKDTreeTests.swift create mode 100644 Tests/KDTreeTests/KDTreeTests.swift delete mode 100644 Tests/NDTreeTests/NDTree+CustomDebugStringConvertible.swift delete mode 100644 Tests/NDTreeTests/QuadtreeTests.swift delete mode 100644 Tests/NDTreeTests/Similarity.swift diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 33679ee..7b6fac4 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -1,22 +1,59 @@ -# This workflow will build a Swift project -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift - -name: Swift +name: Swift CI on: + # trigger this workflow whenever "main" branch has been pushed push: branches: [ "main" ] - pull_request: - branches: [ "main" ] -jobs: - build: - - runs-on: self-hosted #macos-latest +# Set up GITHUB_TOKEN permission for the deployment +permissions: + contents: read + pages: write + id-token: write +# Allow workflow concurrency +# concurrency: +# group: "pages" +# cancel-in-progress: true +jobs: + deploy: + environment: + # Mandatory settings for GitHub Pages deployment + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: macos-13 # to use the latest version that is available on GitHub Actions steps: - - uses: actions/checkout@v3 + - name: Checkout 🛎️ + uses: actions/checkout@v3 + - name: Setup Xcode version + uses: maxim-lobanov/setup-xcode@v1 # To set up xcode version + with: + xcode-version: 'latest-stable' - name: Build - run: swift build -v - - name: Run tests - run: swift test -v + run: swift build + # - name: Run tests + # run: xcodebuild test -scheme ForceSimulation + - name: Build DocC + run: | # If you use docc-plugin, you might be able to use docc-plugin command instead + mkdir -p docs && + swift package --allow-writing-to-directory docs/ForceSimulation \ + generate-documentation --target ForceSimulation \ + --disable-indexing \ + --transform-for-static-hosting \ + --hosting-base-path Grape/ForceSimulation \ + --output-path docs/ForceSimulation && + swift package --allow-writing-to-directory docs/Grape \ + generate-documentation --target Grape \ + --disable-indexing \ + --transform-for-static-hosting \ + --hosting-base-path Grape/Grape \ + --output-path docs/Grape && + swift ./DocPostprocess.swift + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + # Upload docs folder + path: 'docs' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.gitignore b/.gitignore index 746bec3..67916aa 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,8 @@ DerivedData/ *.ts /.vscode /.swiftpm -/Sources/_ForceSimulation \ No newline at end of file +/Sources/_ForceSimulation + +/docs +*.kts +Package.resolved \ No newline at end of file diff --git a/.spi.yml b/.spi.yml new file mode 100644 index 0000000..43dcfb8 --- /dev/null +++ b/.spi.yml @@ -0,0 +1,4 @@ +version: 1 +builder: + configs: + - documentation_targets: [ForceSimulation, Grape] \ No newline at end of file diff --git a/Assets/SimulationDiagram.svg b/Assets/SimulationDiagram.svg new file mode 100644 index 0000000..39e6c2e --- /dev/null +++ b/Assets/SimulationDiagram.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/Assets/grape_icon.png b/Assets/grape_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..601be0be9d2a2a110a070ef3ec797c0f74797375 GIT binary patch literal 159683 zcmbTd2UJtvvp<@I0HKH8Av8g1=$(Wjy%#}|-h1dBLhnsPLFu4?B25$or8gA?kzS-q z@4e@t-}1lrt>68>yI$7HI{Tb6XJ*gLXV1*uXP*RJZ51MXI(z^CK%}Osqz?dqZkiwf z1n1^(7%+T(bHGEX-tz_k2*`i`fqb`DPNvaCDJt*kI7TUl0PQ7yO@O3}{INj1pJ&LBwJ&?d;mM$(oQ zAqSHQkh)>uX6IuC3vhFF_m&EfW&Oif>ZbksvH&aW4~dV9EUWx)fiM#-U6`VWmmN%! zUy#oR4i|)p-?T);gd`*-#l^*WVM1^rVF9?9fRHGkkg$}fxRjs>?C&4zjYKb7dntV- z<-g_KoXN5}`uL!v1O)v3{rUZc`8~WG1Oz1|B?aI@0zyK3Hxzu{f$lz50etS>Z2xdj zvh%j_azgnydAP%VbF{Md@b!^pz3J^=YPg~PW$W(!x2bN7CJoo zbSPgh*FVB-Z3OIG?cD6#eY|gI1^=Z*IePebcsqLh53K*a{oe%Km{&{dUm5?gFK%xC zitzTi<9DOR-v;@Q)ZT`HC_4dtJ8utPFB`i%emC7@`>hR1O3};C%E!aY(8I&^A7|e&Z8_^9hO@3JFRHib{!!@xeu;;PAgl zwLEN{>;wN3sgRhIu;hOuy#bD`m5hLlqD zaP{!I5q#4-;Xl35(vnhh_x7=Jx3N=Gl4ZTon%~LER!T%f$V$jYSd`C7%u0w)MA%k{ z&q`SI=2S@7+FHm~TvXV`{-5WSJZyY_`}X(qe?i^W!{&y^|B-5IBLNo@wH4;G5fX*- ziHeEX@mbr7i1OJ9+DY1o+KUL;i3t9~O~=dWX0%zk{#UNQdu4mWQB=$dZX+gU#b+lf zD#<4zDrV1TB_eLeXK!aOAub{*47ZUG|BdHA5Rp=K^1g9i;NK&}z|QmUma7x&4=SXr zY<{C%meuCBo9%2_|Gw<>AMEkJlKl7c{*HDxO#d&=|4X{JhrN%#m6x5o!;S6!7w{7J zAG`12?q}!qUlc%Dd0E|r8app54>y<<3gzl#WA$5G0Y7)!zen%C{(<>;!2SbV_W%Ek^tTIa9If0P>~2D}0PAmc1bzp!zW^Zc|Hj6j zd;cZ){X>2eQGYl84d*u}|0V=G_Z!w;H{ss;o`N_42wLZwy;-C5Wpl|J;1uSQ^tiOpN5cVU5hj=LYwb8dHrwP>Su-n@$ner`Fc_Z~P0b-6pOK6G8Z|X;>I=wge~C!Ufh@mqK}i4|2HLG+Ur!J^ROKm) zn=YRAbi%w$s>CeUK-q+qZ{e1kUk7ZK?NN0=zbW)btfZ8K#`>0MEHCE%ySTh#HSY9n zud{uLpS%kvp+Df;e4ivSEgR4HpoeNEA@9qHrRV8AlLLln_qf+7L=QSeEB&kG-&w?@ zy#A6cz~BD$?rL=H1Ex6dvKm2glTWw$K;CkYAHI!EA@qc)?Snv*37j`r&pK;9cDsgA ze#rvZ0|&jw7lLcY3KV8%Q@c0m?k?0!6?EL1CAi-Y@F(_rkNxAGgj}NJiDfXv_=Lf6 zPa96#-@gdomXz=(7~d?O`Vf6Rc}odAV~sQB0rbHG1Al<--i7+p(7)()562_s>36_| zcj5=XVq};M0!Y8oSRFGS{DJT7O#qXvGM7nVbD;1f?{lJMCr z9~@!RUQPGjh=R&Nvb8*?2zoxS{e-vC_0x|^t>u{s8xe+YUS$WzSSDBg5tv<(| z&|q&=4!Ou*G-#}siOIVLZO>df#=BbHxj_pd@iWOr>G-UV;2*x04)d$=t&NW(!#dHy zZB4}9-q_Y2?PNL;7uZNyDR07!YfvThZg4PanKzZOkr_%riarI#2h&L(<5z8cWK1Vw zn7v%Il*8T7E^g=rN)iiC#qB?FO5OFmMWOTB8)7phIK6x`J5*dxB? zQ`2fpnZ#L@@LXs|O_o2Rl^pG)<#K=Lgc!sM+GqO6!Rk-ibg}ZRL1rl^3^LvnKJu(t zY1MCTxAyD-anU;6#EnZ>k0V_-WTjehA2Rk+N+xH2C8)QeP+_njdUH&F#lL9U4NpWT84^j$D)lM;rcr5Px!hbPl#{)^%o=ullhUV>qzUuQ&2!E859!T>|#?=h-o<%KC;Poy-X<8?8dH@t)oR|G4 zT$9~+bOZYXIDG_bbl>4##sJldoIG4wlO_6moTsQREkfe%l8C;H!M#3X@i?zp442_8 z0ulX;vQ{-UGPc_fQ*)uJN3_p_*nCc}-UL-ZIBF|GD88qF2scssI|qG;9zUq5nNM2SFk zX51Rb5@qUod$^i9Ax==R5MMT43rh;WAED!T95_1BK)Q@+hqjQ{T|A0^rd|AxRx4ld zBfft6(rtdBPI{(b=_%83F6Z|J-V_T^V@c2C+LtlvYLPdyXvLbq#p3D=e&fZAcUeE+ zo!EiTzDN}DOm*Jd;9Ihg1+w*Xd>{(XdR zVu7g+1nZm5Jsuz~3Rw4zU{cykAxb3evzh1R>#tYl?nOJWQaTPPMPED9>M7*^7=^#dIXZ!lj2GuN!wOlMtP2cZ) ze*5=$bB`2VJknS>e&?}qPTmTu!jPdGLK=N&K_nwJ<(99pJoStXXup}VJjS^Sq!>^( zLRHO&(hlzrLk7;S$OZ#AeewpiM-X|c>FVn1EB??%tjO*sRWqXkCaz)hH5Wsp(gnY3 zhd;$aTmY%+=FDi-^?b5%YnM=P2~;eUJt;=dX>O8SUg z*bFmYOFq1&2e!Og-HM_&a%0?fL=~|1{V=Iv76V>#u~f7%N0vP$qY;@m#p?{4NOc}g z%9n%1km+Vo=q|oH4C-4l^m7{GX_m#!3$R992thUg_K78qxK8Y`-@4Q?HU~QU#b#kdws>6H% zOx93IAp<%^3a~7IadpJ|92mR)R^g#Y{CS;)bcr?|I7}%W(PMSiNxUtc^N#8E74!xj zPFi?3qL0FG!W9V=J1n$bZBu{ZGvBd!Ts~Kz<|d9aG6ub>xzAaw?_m6-SLynQ3qeiE zg_LAM8d)-a5Xx$wLSWkgJ4D{8Mrq5-TMxg-H>w24FPa(R5kg9w6{3h^mhbdikTm@Y z@9$rDm1C^@g8kpYeMN9hEbJQAPc?I4!zk7=(Vh=@4-KJF43$YXtQ~QSX=%}hq%U9F z9BJM`lbk%RtA#q8Rea_Mfi81f+N1{zKZsJ2N!~N@(nr#eQPIx_72-je3%02jr78x- z=+byYh@4AVN`ygj^3$Q-;v3=pgFkyUr>6d~Gc(sA`H^=mZVU0d3);31%9ch*YrknJT$fAnL$eK67)Kv2KnkUfS1v+8xM+A z!E}=#rA-8jURIPYY1f_m_H(vSW)d@$!QKxH z&#a-NS?{!k4&6X6x2rFH8G@HIbH6;1-ZDUs8HKgHW}nLfhSGGIe!8Q!MBkDcPZ3_S zQ3tE2;ozU4#MO!e{Zjp)DOioNzgp~i(~4ZGntJ-X#`~l2PktbJD#3mhJ13MJg3Dp_ z=>EIqARWQSWQ4B*>CypTn$_8?Xx`xP7eqakZ@S7~#re5mlK3VKx4qnUXFT*^z{#)R za}=Bk(lDG5JcbPZ`a+4PRDu8G%yFbv?AUIN6 z292*cNRy9qUX@wnXLdxaq=|yOmuU;A-VgvAq;sFg_jfDSYE} z+=Bh-yPm&e_N5tE!og$h;uR)hX%GRjb!kgvPPusWHDJAw*YId{6d@vxaqBD^Z!Urx&lnUV(<(9+;p^|ey8<{i4v6ds4~DUgW%U}vd&B|@-h5F0jGEm~*Mp{pfa zdQ#deyipwP8d5lHURZ=%MCMwoun@R4T3zsU`?R8a;hQn=fjG&()l3gZ2i$fRqT)f; zXq?Xl>&YNUFsO5~z_YcaaT4_;~wt}Wl>5pTJ#gODxIW$V!|S-&&lUzP#8 zPrVH$%c4NjamDQ;o8&p#_Z?_umA_WkRy-RF;&ZYj4T?oZngamq=Cvl%2QRvNmg%n^ zbvy!V{^jmxC(-t<_oXlFYnP|umsE)Z?zc9~tH(7tKd;jvoJo63PiSwG9(r${D&lRJ zw(JRi?cpzV9Tiy&@;z#a4_`e$V$fGkCyRk1H7*7H>UHol1!d87p~tzu(zSxv>ryX> z%$21r4N9DlMs$UPfQM|vmu>{!7;%4lZ-W>2+W+!^?*Sj{MNRu?8t8B&%fZ!#Det7B zO;8mlmKG~6oDVbuk6&NOv=vBSIr_rnUoxvj>Gb;DMV9injQm#_>Ghi7OF^#_=ztYP zPreH%zhzqAVUs}>w7ujxTK+if@Z>xDErepq6!?Yw5h=xmE^l^P*jqu|@WZx@S0oo| z?YBv@|C&UJ%P%=d@KoDPT+sqUoqy&Z@aBN&&Gm1|VLR>M_-#Mi67I?erDn9 zz+q^@zk*4;u86(BLz_U}>*RSboYHO+w?6))srGk3J>TWWHTSqQni^g%rkgnfLUBS;Kg}B{Yfk zq~&9opFTUb*C6rbL%W2Nfzzjjxb@76=ac0*g7N3q$0Zt%aw6OCW;zcR5pWCM>z9pc zB94D$-OvDS^A5e0)7goi*P)=VHkO}ikCc-gCPzZ>`MGNhf&7U=<3%K9jK3m%8>99(wG!DR1%}L1O%ZlepW^@~R47BlRir}apj%D}3 zX7`6M%rVS8IO!hU)9Ld%u&X0pQt*_wLN)1^`5sieOM!m`ncG#$bWXd5eCt2N3?)dj zu>L$F=6W6cYVUn5jNaM2!mj&$UXN~gR#(E1f*IR!kju}EPJ(Z z7mpRxsfwr?%1`TWl*|WfmupB#1R{%cF)pFP!&R$J1s`}~uMB6%=LpNm`-!VO=Z@VN z0_V6>Wl@w#CBfNl_xr_zvd`#dri-36lfy2yT<*=y@exQA2qJSOe()XVcD|GFH>zy@ z5Yf$n`(WJ+;|FMkX@?QCz2V!Q|63<2uu_QY%mE^WW6&c4w zTs12`|E#uVCfGCVe?68ZW0d8%rZHHKzor~1Mi)^}xbF1Xqu!6H7#hVMci%%-pDfdx z^mAh9P*qo4JkqRO$bj}GA&{98$5GYR;S*R#PMz~{?3kRE`T@&WSHbP=q?pjhWd*@>1{yLB; zYlz%Usw>1y2%PfOY=1Nmg8wzs1t7)D-ODfh+Cq5yQoz>Skqz-fegyQP+F--BqdU&8 z>EL9$&+j=<0rf>fQtDoE-cI^4N&!$~OK>V8Sxms&BA0fA?q?OI4PDJ5^va{&TJISv z%i48B4V$Lha|oPW6sv<8nKm+ON$xVt?b)!P-w;A<7Dvsd&ps1KT%TeyH1E(6GfmxT zKv^CSwn{|y$>bsk+c=0Fv}h=1Fw|-Zu>ea>s8u1k4{N@P<(8*wwz2ez`N#3ew&jeo zUttp%V&1UYS@UoKv_(Ey#GhepZkvR($M)J7_!YJ%0FeAne6DY}^RSq}DBY9M-wE1W zZL#&E@aNdTGffwf3au5Qx*dYInTZ?IPjH;nuKb;%uQt=gp}4%T%lkAciLDwNGs%9M z?8ZNR@^sAZ0jLb)a0ZKN;yccC45c!^k>ECpMo4vJ;8xG)>&T@9oBLA5dCUL>BiiIt zOEf-_(xPv}Ut|r)yU(g-bwYBZsR>F)9zi73nkY5_f^tsrZdk%k*pgDVGxK~4K1|M4 zdv0uV29{vPluk)K>!dlb{uF5+Aq%aF4H9R*+N0sPO7^W%?6O?h=aGMzJt_2OBXONjG zNuN2A{S3>FaTXX(*TSNp)hEQlZ3k9~uf7YKKGu7Jnk~!i$P;Krr(kIy3DI|g3R#%9 z61Wy2>`@-E^b@L@NIbxUIiv&tg=RDPhKCNf5Tu3l_DVtUl394Oo5FsE#@_3f>#Vw% z-S()(JYG4~`S$6J0qb9wBS7Kx@uf;lTyQE~#_m1z0w-3%j;&q73Zf8ie;sVt2a$iP zE?E!AW`Ay_aR;6mIa{4ci~mcch)$9B7Wgw(~>O_67nagD@x zIZ1JM!#tgNi-~bKbn{CQ*Gc#*xeBBY&SK3y`L;CYAD@}_igu^7kk2VZfB>_~{f3z6 z;;2t$8RBD^b!E9tU$ByxkeF;Za~8&MKA!28eb z-Wg;lpxSViZ;2hP+|nG++SQx*)XOzwKqR-qL;m6{_ELN-c)p|=aRxF!Zf(I;+5Q0T zB;;hg38!V0l%Fy$>k7OCBPJ9IAB9^MmL{^|_NXJK#hvlmIMc6#eW5H8q!7~h?gOH1 z`ET;M2fcabeenr%ufcU21%e)K9_0trmlF} zW?0yx0Ax`i`I;pQ$E-d-!YJj4dUkPuwPC~=I2&PzO#rrpfKjsgQ|yE-v&C&LQz}C( zS&`+-xK9b2Q(=zb6q71tlyd|K7o#IFGEjtB~t;#8vf?`3@4~Ji=k2HPX5d?=liEP=qGT46( zaU#3e$;pd>w@cy9t1`l&y{K;yl~FP1Ii&C+Cuue{y{3ho_>$G`p zB7-eLiJ8x^ce*pAtJ@}tVX=bunsTy*HU}nBGKBB3vpaFj6jZ3oq_bQd<|xv~{xE^H zXFNqguENz-(Glc(yRDFD_CgS#c5f9;DFMnQhYKz%p<)NC&!5!fV06d!5VI{Gu1!%A z(re9srd>xNc$he1pN8;E%VXtP&|uT9zLCYt6MRA}Tei35oY+FQ&5XQ)CX-jCTNZIVSrkPkDcwhqc0Fr3Ji#;Wi8YqK89dz~sR^NRS z>QpRYdzq*;#`9E6gQD<()5h~FmxXDPAnU&uAe(Me1M4p0&HQJH*X3dqMkpt~PfGcH zV0~`?R@(N1L9E}M*sFuk6+j%rMRt0+ZbXku7n1xU_H}f|2~EDm%XBRp*5f-#`5V@a z_k<0k-#W?_i^_0m-L}Yk^e8cc!hY^f4=QdR&Qf|F#0rH+LgTS>q1zXV)VuovA>ygI zjX0h-utls7_{V~$!ni7`cTU+}qg01w-r&nC=Rwn1fgPp8nsXr@7WI$bjB@RALUC^+ zae=g0WYk^hkW?B?kaa8@NOGeWFOOg+PVj&)`3ZXM!fZDDOOVbr&Upg;UpUpGK4*j_ zjUlHS@a~>)M4Of-vkgOkIK@`7fDx7Tf`ec#&Rs`|A2UtW^&4yU6wd`uXq{hBbwX$A zR$fP=$^~&%0_R$6uZ?@3ubOQfR#2!7kyBi64oUG?>Y8 z;BZEDR{Bxn)O$R`BG)hXPd0ad*bUe&iH0VmR0Kxb**Z@xGt7cos)AI5KW^B^jHh^-1}QmpnQQn;{fM&3sWdnT~-9yJ8BausDwj{ITrq?gI)-==^ zb=-B!<9clUaYn)zH)D&OhK*YG@o1K@4S)Q6D%8A1jAQh;b~rxAChttFPS=FlfFNtI zL9KH@;O^uD792xUEUHgk*JN_*Ig3k*tW9Pl935PBte|nx#eAI>v~k!(bB(VnuDe^C zS^4R`jEn5{E~l=vM?^v#WH6E|=JJT4)e0rO#dxxBy@O*XgG%|W6whlR5JKAcH)}E| zr`(aV4S9yS;S+5_AXd$FMGnhdSiS@x9XqB~2=XQnx0ebnTN7xzmv$0x^@73w14^;o|ptk+!3B*U4)PTGkR zt$bTO?VeMsd6s4U&u>SOeBUJ`VBCTkdOjT(a9j|Va}V~>d3C8_Fj-F9L_Y+yVF_Es zu0edzp$spq44kU?Qr=^r*o*j1qwovU#w?j;+_HBfXmJS8jJ*70+ffjAEx8L&h#3eZ zgr}WV)FR6h(AMkLg^$5*A?y(o%qk}#=#viRg-8LUQp&@9i^oK^))I}w&gwy`{i-CX zi!rVMPs^1#Nd7b=7V8p|gi)JIeB6uUb}8uj1ylc_=A0E$^?{_x=bc zplcm~vQdVtOEl?dSVixM+oF4^aLU%JTorZ6-I&4N zldbx_eHpX{d<=y&qUQRh(8V5e@{;P?DVAJVt&79dV+ae}w_G@6cMOC$PA zeOUhz&ip2jM0vHs0CKHqnHn*A+R*jj_+o?|fXxCcpx32xh*ZE&BvfZ+P>;;SJA#n& z@>c-P*8mcq4lop!0Oft;Zb60ynX_khs1XUc8;J`E_UTv?%R;ciyii@&UK^K-K+A*G zP2oFB2pi+;MgGvc~^Y8vC!UOy{z zf!vyYcC&@%UvI0MJ}loQNk6V7XE}7~Q7rHzuD-0B?XBD({d@^NQHf{nO4u7HEegML zs!`grPHai!^RO?FTSmErs;9 zy&YuVtJcB+Zy-ttK7naq5m<9v`Z!ld_Q?bS@Xk@ake<4YR{zj@as}WgFFrc|d2LPN zxJx}pY_l?pKgfJyi=ZRA+-v1%Q)jdB`P`iEte5||D(vYD0md%*Xb<;o2zmI}eb7$Q zTaPtei6ENNNck+^yWdo$4Sv37sTYQon{tcK9>93r-lp!jNl9iuD?1LmYK_mV!nRj{>#lkNb>4ACz|Lr>9+)QIssIHcu8B~Va7xIxJvFNWCzrXr7<{$g_KB8-)wr=z^=9TTge zuKWE%k8qFAfRugF?AmB$gTsT-&tXC#Zkyuw%a2G3D?JrEIQcl+ga)`~aBU1)dqRDr z=ED6ywzCzSF~}_+?I?(EgrXM#02E|D8MeL{6)=P-WSIVecu}~+d>^M28j(%2D*Q;K zIOF(W_x+;hFX*L~-*M6wdY8sVW^5qFFP5Z_ferw&M|{SOHzxPNskOUx^qz<5HnN!O zzG@$C8v_k69}a<6N~HPG;1D2_XvK0b=grnyPv#P)GdFje2}m6*he;?Y|AL(yX5(}N)_zFo=f1;t6IgkBxBkZqb#e} z94{a@!{y+fJ71O%krBaPf`4t(rKUG;L2{nO{)s+f7nci=!j6l7a$7WRn3QE{jE(NA z_&Q>oWBxd;B{J>0_~d*pZF(bZFr4t36ua+fYc5T+-R?=3guS*in&Ny->A^Y(hRA=l zrxIs!bV0Jo-gm0(fFMPTuCVv7;^Miicu=24BL!0B8CvLJ{QIB>In=SGY)ANgNpylA zEYPTy9*IM0nfy6Rc1=3h{+jtE1H0N&&bYMcGpS|T7wmIU4X(3_UD`Jbh34@|eQ1mh z?%6XzvM;LO?_HuGL-hgD(6jLK1 zDTtmsF_^g$i?jxK5Vel33cl*W4OmdPo!-}gD{?PgCB0(U4=JcaHAy-2O;b zTdwkn&M#;fvOMBYVT%0=*4;>1i);|o4IoMmmd37ExLK~q4d|wnIezM($U^@Tqx(rX zr*so{Xb^$x16u{^8iEd6FJ8`;{%rNYf@jZRwW?D{h-#Oopi8UUJ1_WAAPHy-170P8 zCIdjYI51H2_t7L!|2Wrbfzhgj%`A4%WwUto}S^AVg zK?@V=$7s{o$il$9r=~$QVWQ#N36)A;=O6UNdx`Ifd-#0iD#+vO76t@_?|v~(0P5W- zEMuW>;T@oFAY%2P2ha#pmS$Ko^+HuV=f$|?DW$&aU%KEJ0&_X~Nlb6{2kvxRdy_yj zBU@E~);wr+qIf!>E_*A*CQ)a!6R?0V;4Ly%g+`*DluK(Q)6X5bHeOzlxbVt(KLRm% zN`}Xa_u%ER4VBH62(vImP7e_Gy`zwQl@+~QF2Q*;UML}Z6wy_yS{9RO8%#(&jExOf zs9Eym8wbo3D|&2gB(Jq%ir5;isU3p*hVf4e`CKw4ihl1KSkb}Z0q|BnZ+-Xf6bGt_ zx2li*#(;-a9J%#yOh8HUz9^;Nl2mDPEGPQqL);KCXNd#6$tBs3pRB=6Wp(@2@Tp>s zIm`>g!}7{37w!TPrXSbid{oL#F4B&?P$EunxeS&%b3yGr%=|qAcAg6*>e}R9#L2zs z>%r%+JpvBg_~AuPqciFSIm*p}LUxh|hF6-a@$GxZfMZ-=fDV48E`WkNxn+Ieb6ima zlYz;;Ygi=puiB;Op|a!FAzpK?6I^Vw=jeksjH!%-Gz&5X1$}@aT>thEO{ENwL^44W znp^d7+7j7??z?qIiL?zZpVw(E*ZXaMQ@rJ%V{?UsQ6lJmpEmtZB7vUDMS71ss8y}g z@x0*gH!AK;b2~LosZ87DnB|}Rt)fM}UUQScmQ(pu+ zkCqkheB@_Cg?c7^!{MfCt+xk(7Y_o*h+d?uI9=yGJwJcm;(?{c{GEtKlbi5k`ZH5# ziZew2*BtIhFY_99`Xkk(KDl1^Y#PVX&hV2V2I|4gO{_uKHxda;znWf^uwg|k3I1d_cFU_Bw?VQy%yxDZ~_+c%mGgL0qxFn>OxVd?Vv=eZ5D%FKHSwxvN)G= zK|>V*$hN=cdW+kqMt01y2b{Ts55P{ay44o*x#g6p1euPJ;Xm4Yt0W9#z>b03nl=Ta zNqr7zN533Bk-6F~yFS=kR0(_3FG2|b%tQj#<&{>)h+8idpTWI&#sRK0(o;`%nK1<( zz1!d3;ok8;Nv?FzO8hod0(HXG;oH2>XN9c}@K1NKC7k;=N?yw28l4oD{oKVFOmh)! z+@Ohz5W1FI4)d9re2aHXl6_dq{F*Cy_;H&X9ZrM&l5e;P&!a3`@$n+DA=a>Sk7%(=}?;!n_9Ru~l*bSNviK?9P{xx*cXt;KJ;X zEah1mXt5y23M4of0G9)YR*|9mfm}K{WU^#2s)22Y5+H^9-f%D;UJgM?s9qoE%d2}B z)n4dv`;6pQBT6{73R-tPn7|4ah}|`t(7E<75c}7!<=Hg!rG!m7F&QvIGZ*4IDd3MI6Zh&}M2lT2)F1PvIZs zToESl3^6ZUnJv!52T4Yn61>x{-0O1DIWJTLcjmJjKmNf53e5$;R`(F>cCFK(zL9Y1 zhal$5_h^ikIfH;?+IX+iE6`E2E>SrcVvPXu^1VGxJHT@$HFCs2C|V+?TxQCD;e`JEvy*kX}Y8-t!ZnVKpk zlf~kEO@cA+o!&l~h~B(X1YS+B>$8>O_tN-OQFm3K!xGAKVD)MdHY2V?iX!zVxXZpr zD1>MwPHcbp!=a{z(L=NURKD`Ubymn3p23avEP~-H1@{f zoSF-NPV$!A+Ec#KaXEkRz}07Cs~JSp$%g}m?GIc0y!OI{n9zO_Ng6Ly4=`Au@VJL! z^@S185_bQm$INnr{B&7Dq#saLxpzn7<4?i`{V#iW`>xxD9l(Xv-7yEI&-c&hBIU8g zzC(LS_0^IC{QUVKN*Ah^ska35SJFX&!gB+bQ8@d4Sh~oLfYq2dsAY{>^hd#!_ z7^6tswre^n&y0N~fD;OAXXnmeKk8M47B@zJmTm&Dem<3It6{}%a@;p?7J{XpDY-gI z->yo2$oCEXkdEGV@0u8&((;y1Uiiw)hh`T^)2p|yrPD5dQ9n|G1Cxk=Ca9x(k*17* zuDR){?e=fj?fajt4ke<`dL;YBf_(Bq<*_e+ZylB!i;V%Ae^r_#&WPJc%y!HzF%KFt z$~raS2$`w33URl9TjP|zyqYvO=~4B;iZ8(50bQNh&2qOE@k$^SOVg1rdO~|jZl%n6 zSiXNHOhkyCt!{O;o+Ij1{TRRUDP0f<$;0DJ+1|7m;fkZw6|nTyp~lx|jQWjJ4?^zw zr`Io@<fQ%}Ku#GS2SX3b}ftf4m5Nys>V<349GMlv`B8#_&c_`dlmOFR8=;|;=){|yJbQS>ekjm zQls68*3ZDxzzJD=`>a-!lXO^9kDJxn4ol*eZuABR@!BH6(@-Mk4AzVQXcWVXTN2KU zpu$}3KDh=CedMEfwA9i_5Md6zP$lI-@WaF_9Vmh8OiNs|MVMU1F`11l@|U6hRZ-v> z)-uAduuPN6RroS6ov>aRaIj(K!OG$HMbZlJ2p(C-0o!eVMkLRB#`FOi9qK~`GJ&Li zbWBTsT2o}1eCMGrA9swhz7#ggB*wBd5D(g=IAhw2zUN~vFZ=tDQc2A|8SdBtY>kxA5YvFWE|(aBEFKbZcxv> zLvR4dmq-c=XcsV36Dh6W#?lpY!*nAkSqi>tl%|f`MsBf}2Uy&K@}2cTUnAppxrnzt zTyz6$L||)MR}x4TIgwiQne31FU%HECVtIRxs_Lb5RmMhKdUh}+?zD`IyGl0S3QF}^ z*pJe=h#ugyuvW*QlfRY)3b_}S6OnhqIC?dpgJSLhB3jzQRmmkVzjCi>>SDawUW0s5GG5y^|QXuP8F@mxhnQ} zyg2|g#hJD+bUSMHg0F3BCUMcUVSYa_YN7+U37=Y(cagVyBzaRh1bOn=`>zB|V0bvU z-z+Sf3SHvn?e7(PvM*(IdrigT_yT_>w>b7UjUk3qeP@*E9T8+DVX}!w^~}wX_z& zOSP%M0|S0{G6w+hRNKYhg2r8#Gtd*{*9;CDR^ZgAq$LDS7waBdF_U68Ti;41my4V1 zggl}BMpP^GK|m-JK0DXDC4aDfr{Q$3^Z=D*Dp4rH-KSgYS;u;>`_krm#?^6PhCn}^ypbB^C@Pww1zQqBQWuy%oO-aV|^jG?9!pU9r2`RW_BV{B&i zgswgb^yTVRtR6pMj~H34o7}rc!XtkDt()Uh2$y;o^94x zeUuMSz&mz$I5&Zuz^LY7x(Ge_Q?&x3?EnUXfM-G?-vgOx;rC2FE6GQk;MMS)Nc|kY z^jxQ5cF#ng^>8y7L>Ud5qmEzW;HHJKA6IQ#pA3bLk3TIktsHFcIQ*s|^yb+E z;AS?y=DcJa49mHV!z0V;Fc+r{*Mi;pRWloPoh(YqamMSPi zqvP(t*K=X|t7(R6`BHWz$#oovR0vyPPRKHd+QWh-Sb0g2`VJ96|FnDu?@|+P*iIR9 z=Wz_*gOHt>aXAdr1KH-D^+|kp4}vZpA9@#5Z)W8D?+?Rxi!&K6rIo3|Wz`!~jXMl` z+}wtKl=q+*wJsF;V()*x6nRW3(xH=tO_HodLii5lgx!Cock!9pfy+%}cuKhh3Kw{O@t~LJ`mGyV;9==v8G_+d`B}LCumo#2seQPDz$CrKi5_3AK5O!=4 zxnRM5t)~jQG_^1K$nYv@&BM>qL_-DKEe;2@> zJ{ypIPxE`ltOpj(*+Ant%j$l8mQTxj(M840J#)9-iMAVG`NI}{%qIMF%stSC3j=iarab?LuMy>&tz^Iz>$-6F>6)x{T*n3mXJ9Hv4` ztkVfH^xdw|+Fq1r)g{m^>7eXkp_>7ehwu@IwlUNnoHE`P0la+ze9sQ#wQ?^|m1&v> z-Fr+2(UECjx0r8Qpmtgn2cKCM!|9L@*|R4k4rdm8pM0xs*^2s(wR?8}BorCez52R+ z&7zsUY}S(}KXeQv{2r%R(PTDEe0;O$*-?ZFi$T#%Li^Dqx9U+_*v-?Gvr|)d?zrHm z%hw4}?j6L}%Y+C}v3cG<$y2^HLI2C0{7&I~Xm6hn%_Nq1<`a?Sv25q@laDO7Uy`oI z1|^C*6jP#|EH0mGT9yZux!J{%zKxW?m|+VfKC z76;ngbb?-h!7OnBy()PYOT;@XT`+$n+4$u&WN2&n#fC%yIH<3%vK&AHmK=2f+f1&21QK zy++Br2iDVmJ|zIty0MBsD1^=F$mhbEe<7d~5uCj4Ha9TmL97|V#=ahZy>F&!CK z_Ks=Ntx^h8CiQn$4t&;b3v0rr0@ak!C34RVJu z5hQ6OLv^p@`t6q1A#L*c_thfuQ94U1l&?gjAY)bOmtsU{G#GTkpwI$GSR7qrac~tN z{|4w#kTiJTuZRiF$e-u_>zV$N2hch&G~#K|N_)m`D@C3&0Wkk}_`I=wp;Cc7s}C0l z{-oL*p`vDiRTY2Pp$Xl5tS4y$g%(9`tk`{qh<%x2!i&ni%_20x+%jZxNP9 zj&0rfPsA<1Sj47_Uk5;uVZVFO!*7(&HQ-s?m#Pw6s-&VNbkhQ~RfR)J+P6JaI7Ab) zHEnaOu-2MyPsR^(0%=v4t+s`<(T=(_rD1^g$6r*EQ;N69h}K}s0=ax#D?kOrLS> zkg_+1P&L{ngCwse`xPfZ96b}l*6|f)8?KRQay6|{+6)g8qnIR0vcK8KoKmV}qQ!s| zTrcv}M_!ugSDhHtu86HvT5|QTCie1o;Yodtkoxn z(K%ARmSIBQ$xF^Y^B!Qm$}KTQBJD}wC|tX81Q*Xgipx)0tS%kK#gn(8gT>C3B{mkf zfxEL{0~ljrW<8wqqk2=+pAvv+eL%4P?j;?~zr(q`Pb_A`2S_y)fiV)RL}audJ*=du z5x^>SI%;jMtrkGl*R51*Yns*gUQUCQVqB%LYBgLB{?+b+*hjQzz$|PW2WkhF^6_zQ zp9ZfC>_!s`{f*Qc~-T zlL3@Tgb~px{Qw%IPeGw|QOszD-y;DL%n;Wvv* z78lQMVRv_io$Y(kFVA7Ixq;pp%r<+>77pFaVmbBkrvzYHf6!GzqT*b-e(lO&wTsW_ z+{U*P$z2g*O%(;C>a7Y20~<99+}`WLBSi+RxlwjM5yrOirtB{5AGWAS4jLlAGyvF9 z(B+$H&5e!?SMs>my(?j`4_6Hr87S;G*O7O= z-f19cGH1rlu0dd@bluy85<~^YEI#B(ds$gB$pb3uWZw#qM9zr9K$P}|+^(Y{*(UNQ51w(!{=ZV`tqIFPXs$*9Ra()UWoh-~6A@7bc0pTDNt#ET1~U^a-9-I- zGJ3YOngyi~bG+qt z^+)9IJa_)xc<`Zvux=Zjap<}g2y0&(JP(}%rvzYHAI4}OAWXj}&O!3X{D6BU&u5>) z-Qpzx9VMbeJ+BV-%hdsxZWHjfo!!O(ES<%Y2oL|!x8spN+CeO%?+x6VVb?SCdmUES zHgMrRhjH#5hjH<#1K2sgK)+{vZNcK_a2Z8QU|5)oa%4mB9H)`WH!GB(*mhg|`e#{07H~_(a_7t<&|v{W2(1S(DZC?JWhwK@4mJ_(bh0WP4?hY?O2f*$1W`OD2W} zOk+f~+zOHbIwQm3{<4BCepJD*p%owk%(i-L-Le<*hB62W93UKm8I=S=Z5AmZVCh6l zNQHMPhzZhYd5B62TFLGZpJ}ImIth>hX=rgSsQ7D}k{bdpg@7H1cyOX}!?OCPh}xw# z0CF2IwFD~PXQ5Hei2OqSIhhE3a9Uhb|F?NIzx()!d%uP|yCc0+B2m+t5`byFFJ=CQ znbTvYo4v|(?vr^of0Ym(!2z=&MCd7u^r(J4h1(>K0D0{c^fs{Gjf3eN%qB4BB>;gT z;Esxtdb|0_%M(d!hAV`g>xY3qqv^9o-fLgJ#$Ub}$L`6WKK%lC-aq?xV_FD4`D_I?fODm~ZrfFc#x?+s0W&lpsmL z0zpY&;3l1_?~ovrZUj=a1f)t(b5nu_HGd03k_H+eP0HnX@UI&Nu4)$~heI_|LlnP* zz#s5&J^1?&#Dz9MSkWAaqAWE5kSJb^oIr?|8isiH0ui4CuwfiHzJi$@{mPBSN}1w*6C7L15oI8C>X^#Jv-mj19~ z^OGd@%R%%rlO*4i08DE?h~Gnax6Ze^&)-~_FB9P7?9BL!mE}Z%8!&vPY zbTfdva(im^W5;{BG#b!H*#k7J0Ecp?Wq=zeFY5T6)z^wRx}TLXwcz&F`_Wzp}Oq!E~#hU$H^Zx*84G-aS4^v+dxqi!cafcfDyOc$VjI1g0^ z*E>f!3CM3JO4=&-+W6X{!l`JvVxQIdxq$4}=hSDABvLHu_VQbDKvN-RzTSV z7`6s#BqBN@jPNt0GH=qla{6X_aoM>Iy#DCx>GCg4?f9=oiQM3FEAG$2*~Au$k=A`w7t9)u(y;|;@!i1G;2aK51k{5s4#m1M{O z9cUb2DQEjj_JM}jdP{paD!9OOx5ZUsF<{G3V$$xL5`Y)|B7mG=)|uCICvN$2+Ax1ym=5&GV1u%8S*ZM( z2r!faIiIU%gq1|Y$$kDkSe$Ij#G=N-nA zzj!B}eA8{X{L~iA%z?~Uh1(9+V}V-LG>WNyW7fd?iRrdn2#0^6;_osB1~dwrWIROI zaWouhI}nX`07e5eH4+p(iP3^%D2J`0j6@WYX^|5&IIkQA2X2cclb>|8iY!bMt95{| zan#2L8>;i7$|V8B0c6tsH8oGq$4dzOA_6BAq-z|U7{G-QI_JmUNTMAxifUg2^iG{o zPWko4fH_W<8zKOx;D49;`ug>196+UT6lIfZK1MSq$<71hKQD)*G8zSWxF0!D7;rf< z`Y(f|Gm8#cN0@I3W?L4kZ3?Oj0uh5A>%U0gmvkh58Y0h5L10P%UbNA_@9q7ap>M$E z>~)Ueam`r8N6qqB<+EqkGE)}vNC`lw`k4yRo;cHMK%Of=%A;PpiYVxns7-?-G&U9S z&u%Tj3UJ`oD|p4{UcsY(_!<26_dSGn{>UA$D}tG~y#T3UR^Ogz%VP1P*13&v-x~cI zZ$peoy3kMqfLcsF#nNwYyVPidH2egrenvg_Px~b`aqOD%ob7Kc|p#%q_lh|q+$Vxuul_`n>3c*Es6B>^JNliotWiq*dp z4||IU9Qmr>sU*uOI;#tR;Ur6x6N2j@C&R#xqVjhNX~;={EBOHmv8X>}9OR>_Ekw1w zR4@&qA`8m~#i>0t_!v=our&>kf1YnTEDl+0KQ~kNv;mco*IJnW4(h&)2){JNf++!b zQ7s3-d_MbP$MOxr_8u3+%7t>!2m7GS%qq~6g8E|u-~)fGHWM-sD|_{~+#)D@?L=I~ zq}p7i9I?v1)wrAc$2$SsiZDC4jaPo@+i=&%Uc{Tf{Xty({R8M0QN~km7Q^}XK_J#s z4RuvMz?rWT_SA z@6$R08Ni7PoPv-9L=?bDNT{RWkPJpFW2NuZ*GU-lN*o-2DT2EcZ2(ua33B40lLJwo zUB(3jeDY5~PZ{x}s>Q<)xMV$zOxg@Q7-A2$fB;u!mTk?#Kn66OH**qK!w~+-9Pl`q z#g75~pNHT(r>HO`056WZpXol#?LPqH3q0Xo^~fm)ehP%Y+zNW?3IOTgdf=W{Jd5Lh_Y!{RzdnR_{_q{J zOM`CV^xRe0aCk^Ur?Eql)^n|XXR#+!g6+%EGFHWjoKxlvs zRW5J?O@%7ak%mk#3a@$@9W^K|oYR+HaU%vSk3lurf|-4k>lP04EpHM-kL z5-g9q8bwTrLV&iT%4H1r5D@w5pTv*K#r6aRJ6$(W1Q^!B3_YMaHa9OyPC5tu8VQI& z-z5~F;seB%hDsKS>kk196sH&>;T=%!;U{#58EhRulv;%(VR}Hacu>A3T8vqhOqOdPg0(xOx}Gk68^Nd1BpsE0$E_TAxXM9I|`B-;SBQ^JpVdNc!IhA zGXTy`0b@!4UQofG*xiQ(|AU_K1x`YTPLcKEEPv|j>);b-Mn35*_ zafbf~fnVKES>u*PB9*8>>dEJ1KteT@=D#UGtZU%jk35Cj{_Z9G_V+%FcmBYgaBJ`T zJ*;$PSos&YwuT@{1#4=?Pa5SjP!afB!p2mJ^EaN28pr`KRO`<@aH>s=ghm}@TK)y^ zQ|YfY{TuQMGDte8klr22Gv&%Lkph#PuU6&PBZ$&4Jj@cp^;kJEV3%Hwnm7_p1xBb; z-jf=Q5xAgU!_EgaQRkCDK#n{?KJ?Ht2LSoMPS6AB;6Tjj#H{FdDG;;juoG$}M>oj7 zN;N=f{8vu{l!QR3khX%WDfMuom*^!m;ej}=7ZL#`bZr@%2K055>x@8FEQ)^_HfS#b|K2MFhC zJO}g)sTt->*sJ^ft>90J6c~3{{X2pJpymf8i_SdgrU`=SZ`9nw)21L=(JfYKVZ6!( z%g=b7+umTdv4@ZSlDFa3$FJbc-}*3iPtRdCY+xNXWOWCbRJp|tqJhQokEVIXNb7uQ-q zqHz73Gyt{bZK01y0=pzEug)uNpCOU57-tWs2kS&7p)LZJ>^vBg3WC6A4V=$a=fHsg z2#7Cs6)6xw_fI#3NLwOdHD+N$IWd1 z=Ky@~6hNi~;CZ_U)b*zO>npN87S916+jfB4~#Vamn!qb?&q|{=y`r9-FRXS zl@x{GuaX5WTLJ_WlLNX1P;3k+MefpgRU}@8o*}8ZYE8s)!D8L@3|RpWe!??2djAf7 z{a-waGrxWWX5moajRVQvR^NQ2|2+DITu)JuhEWAAW!|wCgCv{eVQZljr17b2WFxsHP$WLi2lZI(OCY(qD0F0U@<-xP1%EB(DxA}QB?UJw8a}d58aovI zY4ZSdf)Er5oD?k&kyauY75$WSulk-DS<%vk6N2ODBas(GV!#G|j}$@_`jxzHfJaXh z) z?K$_ydfUShClQxInXc&j`wc6)cEw6RkNk1b-**V}wZ%k0d_1Qr-W2EoCA|RMT1c%3 zHLJ}PtDZ>rTQh7LO;;pUU0yoWImvABxZ8CCXMujjICA?%{4Zbo7QE%V9>cqS;7)L7 z!<0Y?L6%Xu6*b#it?VNTg#GGgYSIj=3S3LQ(nwO$rY_2Ub$g+e-}r2*RZ^NKjZ7pA zRE|__UMD!TkDh>@tA}c|S4TUO!(`kDQB~^$k2}gdfYqhBA7|6#Qm!T%1-W{xA(~|T zGk_(0P$%+mw}TfPauhOj2N(u9-{ocwoHfn?OOiAYDNejpBvC?%zo7W7lmnLi(ExR= z>3wD}MWGY`eNgwLJOaUS%o_Y;fR|LJL_!wmkxE}kh*(7r3D0LcuQ~hbwQ~?M zNn8ZVu!qzFQCGQO&p@NDVGE3Ifca|_)tne{k@(!4};P<}gE-);}08K|)8fxebYi24c zXFXFtDh0H!k{=DS0%ThBT>gIC|7OYF zGVnoVv`l57E=7WLOCnUvQeq5y7v~ViV0MVJ=_zR~vH&jHQfLtHI0P$J#8YwpO<7h? zW4-JUg(N_n^C2&w1i^Aci3RBi0IFI6_1Pi=)j%2W0i-b^ShwF);HNSPsCgp@K|YOS zhIW92M8J{XStKX{3JHV>&iQK`!7C(+FGVCL<`QM%Ea|{7G5TF#wJQLp@e61b!#D{5 zWwDfxnFSHUx$X^uLyvU^UkcFMrwB7805>b%53zz{%qL`P_Ptlv{r|Fde!kXfMpwNd zYi52e?n5OEtYZ-edB8mLpZNi4EU-ubIEV?B2>~k(LaJVho**^#YI4;t9x@Dp->MNS zNkTFn4e(VLz$VNS2YwK9kB@rY?}3=`yWf2$44h8_fQl19*QwvjU_E5r*O!TwodSC8klWO~aa!l7;V zTMY~rz=*UhVWS#dKq6LGXAs8_a_E>~jECG!;KyiwfU6Of*yCsQtyRfKg7#g3YWsdw zOlm_C3tGLBeI%{E9o#3>buiA&@J zAaDY}06T#T<$e5A9AtwdvX|Tvl{|B8qZzVUR0?Jv zx03Zw!Cw0cV)r9cu$dBon+@@YKyc@gLw6iFu=zb#to`KP4b$>u37Z6cVlb!5uqGR7 zMCcy{*hr;KZ2DLB`#ISEa-kKV{vMM7kgtpgATmWfD-w^Qnv=8#NSO1D-s=K^Gcgee z<45d#r4crbC{IlA_aW->iZ6Nxh#h|SyYB&077eQ1>RU>CI;gdzg$C7rRFrGV{Z`2i z#vA};+*Al^)Q@NctDybT3e*D#C5|Blv4AwGYaa>T;hSuk|HS9iu78!pO(1yWu}Mki zckJT>HB+EUNUB&?m;#Z*@`{0TjINX5fkiMZ;arXFrOa+~u`@5FmV!Y10Gbe(rAQiL zaVky?ppym20OUMkWst@NB_L%S#$AadB?6@wkTgeVH5PzIOQ4|sX+#Z5bW0tq0>Oy} zNzl4jl^YWWIbRpP19i=~a8bI{4)lo+kti7syZg%+wc5!=1CX zKnnO~*`gA@W4S*6eY08jwE+In6m_Nq;HJs|=1aa~^OmFk^}=%R6Ia%y4Bjc+SVnE} zSXES1j-U|+JY%Mcft+*#{B0&w{G5`3kO(ML0BVAOgXRE15eTU&fpuG#q|iolj*`SG zLPFqO*&HlK_|@C1#+{79ZWU=kP6z~xmw(~!dL-aK-VJm<3DEY%?MhS%w)?<>x8*F@ zN+M_&8->P|2los9rEWoqVu(&0nx8AoQRh%UE+Jf$+SE`7)T4RTtp1I_S`Al6DFyro z_t*BpSq~t4>eT~rR6F8@5z^H)hFvmf!=N+3Y!-B}v^0;JTI6sZ>2yhttO_~6F*u9? zGUp_~F?j{RbV>UArX-40k`+I#$-oM8P6(-zM5g8$E0q$X6eE6mswM@0kz#^F$Iklv z;3NkvsR<&XszxCBbGr5VCG4C% zA*gDZP@~mHX4YH!huwyG!WjM2tp(Hu zE=AuDid|2`ic<&OVs<|Z_hco%4D(0W-=v>W!2irXu$#m+(D1+38$iJ$Aga5Vr6zma zu$U>pl|fe21-7!Vhf|FwT^X;t5@xky3ovZ1&LaU3hmZVUe-C7UcYNnPz8A}?fjp+C zuPXYo9e#u4KdLEPRX>%eB~UmFeoB>4+X)Ymf${#oPFzSZ;&fLhII?g2CiP)-7@|gG zm(hHt1wl*Ix~Pv|i}Kc>N+fN87|jLi9fN+^q3hOI%z2s?Y7zrP!Xu@A?tg{sI%fNkmMmm_u2Wsp=g-L$+#4YliPo%U}(G}{Vj3(4!GaEy(h z#e^!Dm1?0u73_%y+PxSs*QM}bDxOqSHbH}`Pz8OGA`z*_1x0FuTt9!ldzr9(VFM35 zwuj9bgV-hYNMrp>zI8xvBhD5|)i9iw3~v-;&Id7-m?`u?AaKs*&%%Jff?*(5vTs1_ z|A!WxE7Z9~B>_>y7>w_GFlKw`T08|aq7qYsf z0=*0|X&Isg5`=yVp1TOF6|8#;XB|Ken_IxKqaAMFIE34dUjZzK!0pd5YyD%qBA|k| zQ(~Hv3mIfWd79t35cHU`ypKy6OyKEw5hHS(Vfi$nD@lnn@&O`0fpyntzE^$I5ZX|@KV2UiVO$_#3t>3UpycgCF%2p0?&gZ1vGu_nJ~P! zL)bnS$-FXh8aA9T(*fefeYKy4K*0B}?dA{9H|Q^|`|W=zB2$!pJ|_UDELCRt_&`qN;kjJ#a|rb8$x4(h zgoy~o_{yI_For{(!9jZ{>kkYhYgGy$l&ca#6#XGsBA*1LijM=!*oA7}w*-V-fc-f) zNhq`r!ko7_0bzxgebIYy;T?yuJU0V(0%>63Eigdpa=OI>(D$pYdFxG71oaecucE z5Wp9kgxhYP;l2kp@X(_(Jn_;6?z?}6JMWxhzIh+s$-jt;_5xOGhn0hWY-Hkxq}z&1 z1~~fdOVwj9M4l+94hHgD%DDw;=FhiuoKLXfM*_)))>o47&g~D9%mZ*#p-#10WvICG zJ`l~dqJgJQ8lnX#zd=$4oFL!~Z@3FyX#FK`h`-}(uSwlQlIgz16QBA_xsa ze{k3nI4iK$2W^mGu^=2j(c$j94IX`>!()$ic;MkVZa-mg_^@fbuED){3D)M9u}cK* zfn|u+())zbx;Rzha!)-K)m#Ps>=YzX1j`9*gzzO%ZhQ^^@@|9@udndYoeBMR&v(%Z zn@Z)o2#S?7RpJ-K6H;;MgEl`B)UVqzD#llnt5jN6iz4QQJ&0UL1SID`963vBQkkLM zFXKV6gHs~6&lDqofUC~|{jOBw#8lz_DE2tIF*(mlZ8H)KH~#mH`PNHTvx|QkGJE<) z(5-3RWC_6X^y;QR2oAu85!hSy{^8a2`owN;OEkD)uc|9KZNve@Ouqr|5;cBQ^Tx!< z%qRBnGwh!OeEb&^ffV?ILSS?eq@Zjz)H5H30ma`9FklGw43K!`Hg6~r>Kf<#M#LOc z*qkR{#h9Xmf<&pBkO9OxJn)In;>@od!?Qno9Nk7+p}vVG*40q~sW&71bp&wgmVs2S zThqPv(f)0vSo>HSOVvN8N?Vu|^iIQ5sQSIZ6DYbPrMQnybf{qTmsOjy4!s3z?;kN+ z5RM)1aM#_0$DWwu;YSFMJUYW|CkRK5m>a(44&nq3;0V@y8P+hY_4*opV5>7%OW_DWqp;Sbj)MeQ;BUE5C$q{L+$to!Dk4X3K%ZV`)8}* z4F4CwpELrXlLFNm0DEE}^ei(s>;H0IInu6Tr5{8-bTnbkNkBja5P&`FT-GM{IYQz{ zq*@}}&Sr_1ebJM+_>M!^J2wN*hQVvlBOfGVl*b8+2Kf|KIDWf4|q#R;`$!wt^fOcPB?nB!yR`K9(&y2 zkw+O1J!Wv?1moB-em^g}8IIr%T)`!nh+es|q$v-=JJId{te_pqUwxcN;n3x-R`Y`e z5IvD4asw!hSUMsYGO(~->mc>}NsT)ahDK17#suTkkF69L``+Nv(<{_kh_zf&s{Cs| zlR=_Qr7Nh?N{L7pMP7;UON8jh*3SKTBKmhz*nS=*0Jq+8=q6792>sKmbWP&w{Sn3kgy7@&FQH<5KwfgH4x;au<_38(JL%oSr95kx*`CI;b z&`>W8u!lxlKt_6|_4r;E`YF-=k|Y<$JVhi__Wu5}IdJ5#!Cm(<9)6VY&?5#9KgziC zZpM)#lu)e?XLhk@x6;4N8>0E1em}Tuuee6D~dhvN$D8 zkEk_mIe^~lil6pt4$v4SP;KrbmcRuUfJWl@0323|fil$aZ%M2sy*U-61Tk3p8F|}# zNqi^3Y(_YIm~i5D;Niy%9(%&z!3Tl6?`0f0N`6H1L$Ee*6bl@}uDe)#&ZLwVMpFH- zi5eyge~;z95T{35M9rTdNJWYp5TX3292jJSG#L&q=a3I|QbSK2#>Y@^8WY5$fk+ z5-RyB;rl z-IKWR*27p|WpIZf#7OO`p;_@aR9b0lU)gW|j%v7m*gnTT{_r`0XebS^GGa-aY=smE zR5CSeO6UQwoQ!yKp0hx2eV*3EV1EbU{s#z;zm)O7!-RY8B^*6U=st{Epag@%IDrc| zhd4LmEMTqIln@s+^FuG&c_7JOqcj9W6wBTT`8dy#5P|sZL?*mMAWK#DsK|bzpaCWu z0%}YIByoR8kL^XqA2o!e3jGG96hb-~7|2Ie$#8jvh@ilVsA!8xspo@sYbbLphK;ZF zn(@r9??RjdcU-+Qs-B4&uo)Hb{&4?MtSX`wey83OgLw8Qh2$a7#+MT9zPZR;rgd{A z0EZ9UywJa0FArSXz4~|ddW*FaSm$ToC0Tar>rPTbTTorh4v7pWMCAqC7z$5Sxo)k8 zzBxy0REDqYW55q0KL$DQo0upRLBAybF_2P$x{{EB%A-N$paNKUmqlD4h^~Z0MFLU* z=YQs~i=_}nNc#W&KFW2j1Egmhx#uDtcn4>8Mod>c<^DuBQGI5^a$bJ`v|w*c5?>%);fseI3Ty;;_6wf zdqQs=)*fG)6;%CAbYp zD1^a=@yu`TVtGYi7OknK2={X~{88^-suARYwRf$AKqJ#r^|eKSfNym;@!ea;Zu^_W zdtWbZ8WX(f5`c$pTikrbKL{5t?cH^GXXmdjtsigeW5p4MjiZ!@OTOgPn5_!4vXS-c z^}5OtKPq!!ju0PZ$zD=DYytw*j}+k3~*a{^)9i9#?Zmt~BZ31V}QV+v$L@rVEi-j=YyS;E$_Z9MuXPvJNJ`9o*`{*4r_ zmb|5L7#_pX%^{xO5X`C71*rvGO2gwsTHxmBm|iUL;!V+J*#|-Yy&pUX+<6z{z6S}9 zJW6=%ap10d7`L7P7W3!x7DTv}@57V!y;!aYd%eS21%C-M`H=@8iUb(dCR2Qf3Y1YB zAoTmKL=-HN0t4%v^CfIUmCsyiB)jx^x0D6b5-K&57%%%QB?_7ZW zhqfqEC!w(?*f^mR!*xUhwqUI*1Ry80r4NAb^K+K@jltg_@dtF@pLLSaBmlN>>DEko z-uPJ6!#Qn`Oc4w!V*-LBDMuQ`1z&baBNXJ6^I0fuh&@c}EaARSJdLM+`UEb#?I6s; zwS#2}=QQZC=sj^TKS1ML0IeQ)J@wr(m`h`*a;R2F4ftPIVAcY*r(~#f-~i#4U>%%7m{Wl?I$7H20$9O#j20GGJ}E2X`aG!spF9@WHX3TF zG1p>Hi6`N*gz^vt(7|6q@K)$(OmuI#*Vx9`yh_&-_V z3?zS1s*cqcAT>zcRCTY28ae?glqn^^C;_aEULrD(h=Wz&Hz;TSH7YQ4sHZ0MUsoYq zh5T3>FjRjZ!8OnZJ^=est|Y>uOjL#PbI0IW8p|-c&22pV*{5*v_a7}4e5KqxX(W;t z^5z3Bk_;^YN8tGu+Avgo8&4H-A|lEZ#g9f>>k$tdh-e442*+DmQZMX(QDDrJEsii4spj_D|og{amq6{~yj%3GPEr{pue2rFU)g8WN=1otzsY1LZ%eFby6g2ZQRL z%AHX}b0=CNW@SPpLZ4`1f6@VOWXMlU;r%8^0Cvw^y6Hajocq^bS*|x$YtQ`m5ThGm zzUxAOu8&6ND_-wCWw1x-D8`gq1M&9u5_Zz%%5e!a*k z;N+gBMvfv1P&v1yktns_#VSgi;I@~Z$B_r_#pQQxfaf;p42&Q65&_Wr0#y!iZR=fB zO#NEGDO;vCo&Kb*`twY>@7a?dFJr-CgK^?k;O={XM;>Q9{D|PehZ(n>ARIXG;@Nbf z=tZ;*2S_OQ>=i-< z7wvYv95L(apE8%Ac#W7_vQD2v5>TC{0?9lPY4~3dhG?N`(k0O@Dam{(VG4VhcLtOs z2c5kb<1q^8ib7aK#3x!VNF*D=g_Av=`i(u${MTd5!r^n2(7hJ_$?u;_h50JSFd2cX3kGlnSvSY6mEC7<2W0agreU7lB-j)w1JF_dkV@!Qs=vm+ zF`$CK5)@HpB}8Q-Asg958B!T4(WN&l2_D=yxQ!F9x`2zncehtFyOFPz#xt>&eDE*> zXz4yvMU5QJWas(&FrwD`pid0U7mQnOHMsj8!K0569(ojb_)$;VJ9Oy9waNIgTA+8p zst0zL4tq<7kCoo+@23S?F5mIv5%_!hgQY5N=#*ZOf8ZpJ$ zeFtxJ?IbR>SzKxnWYe)wT4Ssry0HBX&pONrZUff{BWLj*MQR;V3+DB}%TZj_Rnm*xg!bDtUo(5L}5 zFTL6efRxk^p)o*@k{>{gB%qKPqR?YaWWZoY8ec6+&nhP~V!$}SCM_3>J3rt(16)llkOyc3eFJ%JiNq#93mQfNQX*V{>7RL^0{0{IcdbixdxZ_UXk(V$YeF@>g zhX}XbPB?n>#ksLqcrAjp1y(D;-pXOMbl6??xO#05=g;rpxwAVs_3RQ)zVi~cyYsl` zH3r?LL)QV^1v9MByU$~Md5pB^pU0wKd|S$gT!ZM3OEr`p82X;bF9RKAeI`kjP&x!Y zU_sL_r3fTA87e?9B?Y3M*C~BGtp-U{&E<;{chY_P_}>)#U6^Kyw@C={fdFVFKi0)# zmRlU+05*)L-@d|oerXqG-i6~BuQP+f^o&d+=+|@qG_o^g5+OAohepCsec{w_2~Edx z{^yTwKJc)U{>w%BQ&YJAFeCs^uQzX+DrC+M$JRTq+gYtqxR)10|3NGyZWYoD4TT=J zHo_2%mBYv&DNJAHcc?)@xw329|4w<(|XN?i!ab zt#InpHJm!V#HnZYaPsLrJa=XnS1#>hXM2s+Y6)VC`JEfM{pCxDb1))c_C5Ea0w(2; z81?tLYz0L!B?pUYZ(PMn5GZT;I|0~b?fqK4F^PIf`FDxuphGpcE~#xLF}w$vV+lq+ zjzu~1<(Yg(8NqN);dD}7Gcmv;1b9)p2{yI?oI<8zGT{7UZLDu3k5J;)n#0kJ+hi{UPO4u;CYkReP?Q-o>hAiT;@s*Mu9fXHLxI_=Zfta}eSd+BXdTp5e+Kz`@NWicmPlQ>m zhg!fV2@9pYOVXI65B@oGQyStx#YGrS6u}7AAc~Yp}$0nWMX!1au9_JkZ<>WwO3UsPo zED97*e5V_8%zhtw9sAr;gJr||zl2K1o@3ZZpoZ+NBs4=LR!w2?(rihiL=q7v~0H;p27ha&^DA6zuFcT)Di)`EyI0I<>;7XI41*%nHw)S>wvZ9(%hE>$Ujn z0v1F9V|>7O68<>~8vkC`;{1Dor+>A>L!Z*4-vM}@$6n)kbuPOvsH5pqBczOxbXN|S3`?z#YBK9n-RqTNR7li z2Yx*v5sMig{GCNg27DqQi31QTfB(-76aa|{S1(xn_77bN+(=#BGl&d^GyXh40Lsdp zo2`JdvKng}Xr2Hm$3$vK4VTH;ur0{9&}{MDaPASqtN&{X{U4$Ppxe4RR7#kLuWavp z(W>t~Y!*h_lCg-ir*4ZDegpw)*;rAKbm;RN8fLU*^sV)}TEFaH!3)O4Z>TvoQ&QZt zsE3R|yQTC7_D>3GeghFm{BY6WjSesr$>WbbaQOH&-2TxQ@tz+)5#)hOiXzd#q&Gt- z#k2a#%Q`=6FCyr=Aenn-)Wv%)h^t#Rh$3Rf;#?Cv?N*Dg&|L=mg`B8$y9rxR{q?8N=OpK&wgEg!UHI>t7fCX|PqdnIznz^3x-z+vH z33>2gU-AwDD8g(HSa6et0OT`sJEv#1DR!s|3$$|hQV$LR+I&*`_K% zoOl4JKv%!_J4oK762m`L84jL1T!wXNICnHuI|s=CHQ?@CpDWh>zNSCJy;+(p`SHh4 zp~&M3te|**q$UPbf53QOW8C}67xDB@-#RdQX(d0=xJAN7*!O;uG@ZfL0m41E1NT2@ z@YoZCM;>L|b1y%yBy&Gl!9G^@{TkR?0lPaESFbr-ywKyhGi#iBc7pQAesirS-_77IV3ecnBaN`ST%VfF1IsXsQh~;uzf}WY(NOoXrLf*2jVDT zH#d0qZ|vcnKYImcX2N%pgL-fwX#{vKb^mKpAT@@R1!!>th#GikH6bATZqOxakQAUr zIVgCZ)|Xq%9_nVdeF?}tJtY7i%okYP@!?1R!C0>@e$sO9(rj(x=%3G;W8=C|$dWR% zloDG^B%?IW*K(_?f_JPYC<=6_+1EVIla3T$m@-Yakte>Sw5}G3m z1#DR-6&Ullr_8AL)xTuRwc4JqDg~AHQA(JO-+K+4$Jf|7+krbMt70UnQtNy`^0Ujp zfrE_OZeu*~5aY2Y2#-G2;jX(0CvGRqX7r*C_G{}$71tJ6E`i-WhwZC^3l~;6b83Z? z&#rOunI30PSzNj(*x9z|dw-mn05Tq~p3gNOKKG(q09L{KXxyPNq9Q^!V?6uY4)6I@ z!o&XyVZ980v`P>^RM&BoFD3yJOX(;GgbEc1b+>nvBbX3yW58#okQ7jf1V9-#Y4(3) zCAgr4;ex;r2sV%h+4(@9ISK(&P*em@!p|u@SB0%}Qi%LG$+P}mBH1SaMa3Uc0F@jh zIH{4f6qm@o?(m${duFReWL>Zu=gK%0y!zb05!-WU<}PGz(4?5{oY6l zXy5Td)nd>?1J$I4i21`Co1gUG8CSnp?CMvh1mJ_THfB2?{se#sV%Jafkr)FNc+s}X zbcGaM1nWi!c1mKCBsKB!Os#mIfI^BhyatE%L7c^9CD|#}&n~)@g(N^!(08h?mj;wk z`iMyZr_~#AuKJ~!NJtZDh?_~9FHlIAtKTDOCm9w6Ux7{t=4g+t+xD=1`XIzOSWCXL zcV4JuYYVvj1mpgPIz0NA!DEjb+!iB%nY%X6BO9lJrPRur25Q(G}4pK7bXMh=9Fy$xhiuiSud{ zFmeUbq;nXJc*~Dm!1?zq74+Yw@1v~z4UjZQIm`qFC`j=Dq+xHQHAct8xoY$PMa!}s z{E6yft=j!0Z#bm&K*T&|arnoGw!e}@zGq4RJ_zfcJMZ`aZ*YWuO=vr{w?t+LBo0qL z_0Gq7XG6AZQBBrl4Q$C!eKa0PLK#%~!^F98A|J@f0b)w)Q57}Qcv)3_=lR||+sh#v zh`*bV2_#8WivE256Brfz+kia{UBrsFC(Ut3fefD0UyKez7DMeSFg9RV%A=AJ6EYzQ zm=SRBpu>^7S9s4a2@Y@iD*nL-W_awSGd%hdgZu9D)&Az@i@UPdJ^SSv*xPm3zUpw{ zLXWd&dpvh~jgwFHIDM+eh4U6W*L-4tz&K~)kNs?sXVnJ*UgY|jhfXx5OgQ7HIcjt* znoLQqB28zobKc^&epv7cuOslRNX30sWx!Po@;t@gkMZ8)`AY2I;>X zh%9yJib{k|RBt(4i!t#@RDc-#Ln15Wn|xMT2FLqBX$2G^ZGf6MRRpN{{}9}568I_G z0P*jV?&}f>Fz%JajQ9S|F5dNXSJ8E|5d4GkpD;iMkQNU>%m3y?p=AGaH4<1=>kWzD zyuX%cz%cl?`AzktRPi_(>b4X3n9$+>M8#cA8z##x4gxTETuKRXJ zpnggtrp|gYOgLS(R(Ac++J^brx_VDgTLnp0#K02fR2Hxy%@;kwBNQrpy=fq48Oe*= zc?2M74oHDaq^w_6<-VPu$M^y}6;^&9exfrE44vpx^_yiYuUM;`BR;soK~ffpY`PjqG9`|-O((%bdb z`=v{3oO`av=~HW*e8%F;DT|BeEv{XOmA&5pz4f$UK3DjSNFi6NM^vO}7Dy#}h2Fu~ce)xjcE|f@n}|55)T=*Q&VakBnBLY;pK#QmbRz%^Tb@!{#7s^CJ8F!Q&oK_iSVdjKqKg{_E#8;Xc0gnrWbr8 z@!C36?9H{&irAVN=PBQk^kSvEjLp;YVrlB-<%k zb~nxx$KIjm0wg`|Xhae+ePXX2&f?%)AQMGNfxvFbRewwbBn$L}OOjOv?FM$9HPH`6 zxR*hqAcMpp#{d~5O@vCqHQa$vxUObz1P}}Zb3>RJ;E%jwhJ&xzcyU4a@a}hd&VIQP ztd@dn*BmZiS>xPUi*sijo_%_S(4ZJVesoZcU!&0w(*5D!phuiq0TM^fMDW%(IUK)_ar92l+Y#%}`&4Ku=6#qbEHwP} zdx<@MV}Mx*{w5#*o$)3=6l8;;+HTebSUzL|PJJ$?4g`nIKqo=0T>gZ}yJsffk2>7d zuwhODlHgB7Ba{eG68wRrL?9*yR(S&?3{bKkz;FHNMVxE)WfjyxB%3cgGsk%?M zkxtygVD})TI9a2c33it~W(&r(J;Ltl0{;3J|33D5!mW30C6d3Te)m_gQ8D52Z$D2~Fp@%s>O3eHN^6^5(}V$ zir5w_a8(>Ay~|TNq&7@OnExh+74}~6!9FSt#>#$g2`rZuJKKUQmo3gbx5RU&EKZ-a zIQ8rrmo5mluL$;*LCThpM(?_rD4AR-VC=G<$B@Y}AZLy+_t4V8D8*`u7M&=cckuz< zzaLirx{#ilR86x1b}p{*OW)Pw6JI~au{#L8*xYP~D(qZ#oQ#TkS?DKMhlb#<6`q#wX|%a2~f@BP$eblp4z@vf}?MG5|p{;uM&_0s~S z;-6OeYv};gqr1c5VyZO&2EqP%>M4yXzw~!(i?tA7-TF`P?D$>BZaMNrBJN#N0`UF@ z?GJQ&mVEZ^gfQ#;SY9^=<^otST<>e&lTYsA+`F&f{MDUL_>GTP|D#vm=kg|~_s4>i zS6*=0aHQ4*$ckZlLd~ZLUd1da|0V5i%KiPQyB#G$DR>c(fsoJgIR=07$pbkKKL;q3 zLTG1J&}_|?NUrGFxeskE0A1a?Mz9w+l@LfZNiYmDnODIc=2Xd+-nl97d_{sD6M-J< z7f!Gbv)8=^Rx4n=7OZ>0as}*eTU@^4d-mr}Tbw>+aq{W4C+J-T_V#kHCk|C>SK{iW zGp;mKz8d4&C&mwM&&irPb42&{tH7`2TT{?i*sSe^q9fQ=`VGI_D51SN;}?R)F~)2`Q& zk}Vs9a4Hle9TyuWV7PF|4Bv?hNr|dlZOc`xvhIzJeF^d}I73KCfK8}CY{j`uBo6Hm z5yD%3jr{5UN8Ovj!dn4?;^z z^}4~oY2yWDXkLgohnL-Y)y5{hiR{kn0s5bK0Xqu5;HID{%mjCHU<30%ajVS#&9M{i z=(=~=A*&I*^yXQ@{Zv)69H4ios%FrhN{rJ;DT@7Z3P}LPYTpQ~OTDPX^ml>n4=2fg z+&T+l6UPBkIQQ)5j8H@rzyv-3r8>MdBv_9WmZU&wq5u^+P&7fSB#@OJ<~r@DMh=}o zI4ciO7}Z*1H}3S$%gVm*1B}1&`uKZGhuv+5Yu9?5KflIvryb6m6r6l^iF406T)Qk- zE~%*OiG9*LP(4&oW)f(Q1ipIgqT2Gx<6lcM4L8-q0+4dv2QEDW{QSRJF>%Q~+A2D1M$4^pS&o zNeV2-1d#%NZn?$Rdh-vT$6J5+0>E<+b&weRC64=+koo+KWA@H zs@eT5KT}fO)#|pYMKF{kp^_`0&> z9S;7P-noCwGq*T&T+mz9$5y}@!q>G*$EP=t`eblm$sEh(?99Alc zpfYs2tmUJm62cN_E(m!vEY0u5NUf6TSn&_ui+7TY@bY{?xcuxIKldFLul}+*j^0UF zFKuSw+xYnqh5#t(1P}?F zkaCcraQ*1G7I`_fF;;;@79~ndG9*>&z(^C`TZ*u^u)@#x0uM!9<&rQlT zMwu*B8Yfkz-5K6)@W&m&t$|X$L@a1fun57*)#bY1M!%vaFn%OKJn;WA5PR zysfpcjhL!Ks?Y?j#86^xo=rxpG)89rktwmoKkz>0*!Po^v?;Y>(3?EzX~{ zxOQ2vyCbkRh|PqG(?j|7_-cS|iP08NYT@&;Z<12}K!c!9qp&|v5d;#uUz<xl;T zto{^W^)|&{9|Z^@${T}xX&*fuLLiwf7?)43@pIqN;}3n=3`g%ItkyQ2XQG&;G0!2F z{U^AO-UA5U1dNWO-v9+E>J(#xCzyik!qJX zHLDyGfMjJZQtf9h2Ru;)EfId>2hQVd|Lr`un**3Zqyv%HT9yg{@N+~F4amWtv)-!481U4|%ZH zCOGRJ=zGB`!uUHqu3mMxd})m{XVy6NOpoVI3C^AtT)XOpclzGL+8$c=W;mv+wJS8- zTm4O3PTL4giRkO0BZC5`GGY}(QNglLBX3d;1w!d%_|L;RZHzwS zO9&E@2xxs4njwq%hQXCnJ$~*xR``@Jo8kD~z}{ZaC5%%wnSC3sCxR0n$xY`lo5km2 zNazD3WxzOT!{Hh>J~7up)oK0?^nCtEh@uz<^B5XY-Fqe#%vHcolSmn5Oyj{$<8=-N z57#A95||mk_5)|}wja9yHa_@AcwfYT(1FnTnSU@yvItO3)Xb1SDm0)9^vK0h)cz+@ z2m#eSeQJdEYD_|g8Ufeq|6liKDzAyAx`0?Xbbp&@^HyN}7e$<#5`dd30}#y3=H|>i z^sT+)H-ru>oE0263~X#NuJ*dFZH1)vekubY0Ln0SwEwL7PX13WTwL{RJmm{HN_-Lp z1VXZzd4Ts_pzl#qDT`A94m}7RIgs<AmTdf4EmBVt?V|T~m z+IEji7cI`7>2dODi|0;TTsSMZd`YmoL+ICW)GUvi&1VQA^%)+f0rO&?fUeZ_WR$s4 zKC+a@qAct~H0beD(PNdAAP;1)TR#`*wK}KOXZ3evrE9^JG=wCi%#&(^BA{?c45Hec z1R`k_&on`TMAQNdZ!g-76*_{z`JP_-dg8$L8~`uLNXwN&s$_ zj=$_3CAs{az3^v+X;^6aTX|@JIZ4?c}GE*=LrperGFQ0 zb0FXMkFiZCNc~1;u1Vybc;)-x9(497R`YSxFJ3q7D}CoT$v#M@M#jAaM?&9j3uA{x z*q6fH4}+d=D+xd`0gyBdB#RQ2(0{A(uah7oqnH9QNaSw8N(5%@u-99x%+3d_{!hC2 z&KuyYRu0RxpkF)eEqmo* zha{L1iN?3aT)^C1cJ_%HzOX)#P>8^6!PvQA@pIp{#z(w{@UlO$z+$n+Y6UoF%lAY8 z*1*bH967v&KY8D4aM#A|U@~BE;Iueg!!=x#=WrU&;DUS3x99@O<^t^QdT%t9&2|81 zS+zDIszQncT+$|E73&IrY8fP2F`1@H6CfIiDPzJc3l{b`(-}Pb&K>;vcb&$C_pHFP z1wadkbXDLFBtTK3KQZV_N%|vg3>1_Cqj--_4r-qOjS94s`G$~xXqyN|VEy5kU#&1% zx;a$jXAMT_FQq~whjwEQ;LSH|9=i9Khu*hj}r~?c}a~H$nc83$VYhBrTk? zICu*%>lPWhtG?o5V^eX95j6oSG^jA5kA~x|#wlRM`8r%PbX{2mN-z;2@)d;-?jg{V zZ$vm^zgbw#_RpnM55RDMi-{lxX^haL0TgkB1_z)Wb3_Gwr;q@F6eCFDlo*NTRUr5O zU4;y2p2=?ZL-Ng=$yw7c+fPw}XzYlZv%az4?>9AZo>~61dZD)aNa2ET{5;#qqVE_ixaYlG2FCVe_fYSfMg`+$hcQw6E%qKt~vIOXtr z(2~mf3v`M$A<2qc#PdmP5B%0ooyTwgz*(%f31+bY$Sm~vL+>A5&|EMeC=nnX_>=HY z2QB|gwG=RwWWZMNFNuO-hZU$`-w5zT?Uq2@E)c4)%%Np4C6Ox{B+aQAMpb4&^emp%oB0RPlV~0tIOIkY#`b4fgXS)@eRI#=VYL>l*A~mQ#d5dD)vLXi%stcN%xS@MCoRsNakzXz zu(KoR*CvgSMJS(VIiVqv43$UnWYL$DcEv7|cp(V-5vcH&y1p+EDyqws)+ioEp?mF) zrmOpUq%Dy%MZbsgq!6e|U#Lo)RVzS^3rdjyD1$B0&XLiv#|2a%idi|8AY>#!$Rl7( zz-&%<_N_fGowE4I&zRxSk9S~0SgmYGK)wIR25sQ6TOPO}RPi|Oz$cj7@$UIM@MiZL zu&X|_i9F=*Q2?l!dw;E`OE?YxK`AUo&5KgmKJzRp+1kOoa_W>&#M%&O%?!ABYK=F4 z|5-fqn^!@Y!OZ8r*AEZ*BlP^EtS?~(2}D1E0ZB>r8xjB;Gyg)B7*HMjxgqDiq2Q$=|i{F^7^Y(0%H=KoXe1XV!)rebn=4+^7#aLdP)F3v`v3N zW)E1~e;)`RB{ATWgzPwi);+q#EPbbLMD)ZJIbpW=wKX-qz}(afV0;onlIP8E93{5D zS0<6r3LrS=3YlIBGNO96*u}nRco9bctg19v!KGn3Kx_#9AP6&9B7Zfgj3ZG>xFu0ifVLNTs7L1wTOIv{*b24%pcfoZH>OBL^Lfw?ryo{2o|a!E$BM z_ZG{g#oq1;+uIgbE<2n(v%;y9JVNKW>KzWR_{i*zoWLE2Z+Tyui+I>PfsM@r`03rBgSBgazO9@;e=Gtzpn`We&erq%D>#}}yE&yd zl`5tyunDd>OU}W22_zpP0?!Ow@9?&txrDd==y~j1bTIP`U*(Ih`U#z9`%_@~r$oSH zMZcu`Pk97TS^uW?KuzcqE~@-2_)}H$qWMzPI6f%YDH__RT6UtPCOF0sNMq7DY1M82 zS{A+8E1;4e6VBd`+w1KQIpIIyWc^;js^FMS2>=jIviCRK$I~O8ym;8q#t#VGN4Q9U ziK-w8M(iQtaPeGU>-bfWe!{zbl^R>}LJc@qjXl-dF-d^rD43SyIeT&r!lnp#PJ%jL z5dZP>fE?nugJTAqgCXCejEP1ML1&zAi$+=1=nEJ|svQ$dAYA#^j-!P+5s2R0H6SJm zs4O;Y7uo@efov7DKO`kZ@|B=wx0h_@%nfi#pPAviD|T&hZ3bLf2w*MN)}dbuRx69; zs>gEAVS9TImo8eIJKN*j=^m$_B|LY!$K?wSJ68$oHG5&5U~|h1FPRGz?0Qj5BWh)e z`}{hvxP|h6*ssqrXff5IR8%98s!3G<3@R|kW6iY|P&n?5*?pA7XD0Dc0Yhu$J3SR3 zMdBdke+y=tBrza@gAn`bpQPx$dgweipkk8i+X9^00utK-!Z4mQQ-f|7h9lH4fBC`PThsqzb+*aBP! z+wXzMJw(6{I=GkmE6|3j-{u5BdS6YD#l_P-R;!4EyILQmxNu`nl@$pvLzZ<_75CUM z7D(g;H%#8^w2GAzfrgo?2n=E8 z4LXDLCrO-hmXrVt#5B@JbdIF$A^-J=SlfvaNZhF?K_z=uaybzq= z+Es(+>^1D|_So6!apjW5xw9*rJ#BINX@@f>dt5wA*x3g9H7ASMINRNIDhVNKBz3A# z(Mbx8iI39A#*aK2nyi>AiG3=e$BZ<_>ZDRWlZtew`s;-awyS45NFD#`Z>b^Y%N}q0`Ac~Fk6pyhML{PK4{puy*+k}Dd#lUXnB9ddasg|%n;IZ5$^>BTo_@a)fF8TpFvkGb zL9qQGVetb(-AjEi@57d36=c{4hHMYO;qt{5)+@=ACxT{wO_~gi7-8l|R2io_P$ zm1!Cvol?%hf;~MZ1bzm?GGLq(`DbCDLzxfY359C&xNsJ@cA2nVdDlD+s%~t&^IZ%OwF-F7{x!#^G4Eb&1~S;HTUK~u>UwpNk*%YP zU|osyXqi%JRXRnrU&Y!AV$H3ny4s}Tag^ZvA(x;@7EGc$RK0k`P#}GqB-5URk_1yL zkEX{e-<$SGY#Rmm*-1bS#OnfNWeY`O1EZTUoDiORv&E@*ZsRq7>KN|)%;SIHy=Z%P zi7OXZ=w0C1q-$Pt*~&Hmktk|~3^{I%vm`!-Tj7s<;O|!!XWnxSZ-3JzoOZApB8K_Y*DgTbTQpP}!F=|0&pu4)h%O0F~8mW8{x8bo{$+U~ilGVtiZ>#kn`^ z?vLpIQyab2*B`a!2T1X5DDKuA&H;gQ{Y$Sc<@*=i^0S>=K56Y9tXsmlWi`V4qH6)n z-p|MP;ly3s&5ZvF@XJJc1&`_AZ&iscVB>J@3b40hK_s znENsQu=r8E=$ffWI}whK#6ZgyM!ZT{>8-!!@H^kR z<3(9QLgOV|CD^;g3o=*H{(_aV;*c^@%GfkfykwQHeS|orLI?I0FhLbui#&viDtquw z5@&@`lM7&yAJ-I69%Wz2B{DVv=R&{WwWWxg&-2;5~$&EQO%}+1_Yn^ zY-p{GtSOM|ToMb)mRB~k1^VnP3Bqh{arN8^cglm9nLoIn#FOVw;qv8OY;A17vh!$K z^=Zp(Lg_vf61JsSSV|m7YA?N_dS=7ez1HKIw_V1Qzr2mJ@7jgkGcdEwP_;(~KRxEh zsrvWF#wfdAlLeMw3W8sj|INLAE%QrFJKtgOZ#w`s$bEyJzwWyuwJRfMM;~y~*XKx5 zUJhbX(cY5^{T%vQQ1Lu^hZuD5gkH9^_&yf?ECA0=9DolD-4EjW+X(VK0DqLf(Br0I zm0)co{$&AMkYM+k#pTNu2X3vn9aYAs^|W2wG^t{!t09y4bI=1SQ6l{ap&%OMp-U@% z=t!c0Ir~l2ioieu$;W>Lt9qY_+$VqmLm0{GN7$2vx~L2&-dqLD5a*i;UbsUt@y*X2 z=JCK(tqiN-gaja~D5hiOBJ7)$$c8F^RpnWT0jah@g#T45pcldJIR=wpw$Ml3qR;@R zVydWov1YK=FhCiaivGRmgh&PzcU^Z#OH+iXB-zE_pxOOYSN22FUQG^^RI%&MvkLf9 z!mm;=`Ae3AAEjzk{;BsWX|t^-4z;($K%ao5Y`>-|KcfW_2&@uD04b0Fow$GkXjxgO zlDu#ZNFR=|MLCdR0IadOwTVyrw7cFfB=T*i-s3M->#ymk|1sE9q|sK3a@Sf1Kbkm^ zBv{*!RtOB<*aBQSyTW_kat%-a>NQ+C*#o@+&lWKAXyOx?{2J!ha=uC7k5P~NX?_2c z1f=o54CPZq14IRP(JeJr|E+^RMyq?O5m#MwS1miD5eP*q1xa1^hvZ6zJOLS`Z&WL3 zDWJb*3h2?noXCloS2#NGJs|nx0M3mPh+ZrSz#qgwAp+q7prh^p_1%9I*iX=bKC}HL zRsRxX8zW1b30N;3u3oe_e8QwQK!~|vR8IzQQMvn7Q`w>%t3+}V5X)WXgENArf9$6x zSTF=q4k&>HRxde%B?rUolK_rMK*nG_5DMD5=FXxA{ESQT7f6Zk||4}dUJ zALq4QVwDp}Y?RB&$CMfU+Tq@Nj^ZO;dg~u}54*U#ji)Z0#GH-i=7{sjyAD>Q_!trm zholg*A$1OM2<}9A#Epqk9PL+vv(N70$zQ&TlfSitor@k}WU~R9bB6l^%pa|Lqr0E4 z?oCqkt5y91oe-!De1>+uT=x96Zhzzwsr_h30IaHgtqY*Yel@h;?&s5pvLDqdOI2>( zzIaPRG)hTYEn!ZB#G<_Vsc0q=0RDvCe)qe`*gwhOZGW;ZUYrTQY?I#S;O~UNZWH3R zyO}xg?ZEssB5N-IlH@S0Dks$>fW|DzE4*De*W;eY4VW^76cx7IU_+N7H$WPYPecmB zn|2~0*dqJf2M9jDrO?l3FYFV?^TdhYPuK@kIA7cQIeyO_hy(ou3KIZ;5enmex$+lw zp-1V7Ve*ZC_J_=xZEAhB znZ!2z^rt>(ZIX#U)Q2RqR+DXjOl)ob7 zhYK~XMPhTM#)+-ncZvE3PzvBEy-6W=oW*lE1^CFB4-iw8pT(^vOW>?{Ny2wNw{F&F zBYy7ZAI8zq>W=rYXI_6Er+gEu#VWz|wXH{is`-$pSc~&t_5mOrj3%4sP_C8rnsMXx z5wAaY3$Oh61h4;Ojn|)9V|@(JutZo4sQUbAbT20W@-Ghv7}7eCK|hc4rGHuU_6?)I zBmhi0u#=ekS3UaH;D_Ki^V!Ex4xdtT=*?psiLaH%PbT8)Kvua}0 z$3@1kFAi4!#o==KKRZ1gH^cRhsRa7}XA*$@3%A#IqX3+p4Op!&W8C0>&m8_ePE~#F z9gc!+9K}X5stso{2#I*(l?}jqWz&s?xF&nDtYA`WCaqY`$l|=UVhn{a7ZF0JRZubp zq{ww-HYWiwB5;@>i4ao7KdJh0Ok+SBbKjp*KaxaQLiq$BCT4XMNJFfY2sSEo>OLd)EA;?k9Vbi;=aK|yPC%U`T%Qrn zj)SPM+TNV*xl-x1vP|g;3@ZYSN)~NTz6z`~bNTKD*?RAA{1o$vLs1bB;Z##k2SRzRo1$04H%_6<)tT5DNd~az(O`S`C0Nft!r^E zDW~n6ZThA*K*$Lt=@!*uG2qvK{eic%hkfn4Kg7*9&#<~YO!C2tfI&p{k{EME?sJtt z(Sq`MoECK)fwPl{<2Tm0`urJQ{m}_t`^hP;y*y%leY&4$fiUc0SOr1iqa?|@C^P)o zpl7P|sj&D7LrS1h;=snnm-O#hi=nXoxlinCZ%b!@jJ2;?dzz2KCdq6neX?DAbE(ST zouOU!Py;0`K&oeFDTyqtoyin&O(sH;l_(0?#b4XR%?kkkCuKzI|K9@G@+VH4!uss^ ze;H`;Hzr8G!unNjT=f0x++AU1R>dvgjaSCxGG}|6lKY{JJnWd7v_jQAs3h?#7Wt%2 zAk271fCphSIuJNcv;8q7*gca8;>2>Gq%;^px+_J-F_UuAHO+CHk_a{~fK1>J3$ZZp z^gqg#9#Ik$p)%b%or#`j2c{0s_oAJ05U$ z9a>r#VBNwHCkY&0hp-? z^s3@l$be`EG-MR1!5-4^2&s*$27Bm@oy0ayOsS0AX4 z;hG491`R-k{*&_`!6b?~Q6NiMB-8hxLRi(T6fO3n69|8FRsry&VSZxnwC1QK{VA4f ztNB7kSjdXVTbgEh3`x=;V>5=o5wLoimdF2xf%flU1rB$20`TVXZnL+Xdb>+7j^goe zMY{R7SoLVMK&=`%BDU%!<@5vsu0B6veO85ELet|mW;mWu3)e^y6+A2W0O{ltlOP6i zK^Z3flSu(^+EAy8J;q6(hT}wl3YeIHF|`9GN&$<4Y#Jd90AgSvKbrcXaq53EPy7N7 z(}cmmwUy{LU2lOYR{vCp*)CS%H@ssk$PN{jJ` z+Z#6%(nLoY)YJVzAwAAUE_<;g*z16U3fMMn^~a!KTLk+06(DJKxXVdAQJo^mNigSg z5)02H8oEvhBs@0i+if-*eC~6XaQX6`Pa=KmJ1^pyr*B{g`}oOgl5`A&FeUS0U@Vq| zVL4z}P16bE*<>6vuCuPiB#JiWQ4h1d3n#y*TDP)!wrC%nyF~J&>dkC$)=Rft z!XvAbAQv7)*$Rkj&y;E~h%yUSrirmyty)FD%#BbtO?+@tM4ZTC z$1g51o)N;H-rQM8q1wK`?(Ip0KvyOW1g|P-$(+}>vrEp)q&oAu28L&+mp`F5T!L|( zZKg6JXRCU}z?Pa07P1c&o|V;^RAnPCaZrK34f-Bgi-NaVJE#d|GOe``WNV2KeQ>I{~=7|Hh690Aq8uJh*wX|92z! z!K@a>S~bL3!R_SRI z@zlB;B#1GV3pRo#s6Rj{jYXcg0!0ESBnEVh(@0>75g|@vhFSKSLSj=hC9=|_7DxcX z$dwB~z*shQ78eJXY&eUYNOVMdlOu5}YVTjFCr;Hrm8w503M#&Um;~TB1;QIIu3Y3< z_T)TrjU~X5XXpe!h)Yd#^|;(xVDIq)&Q~+`)Fc23?k7?Rg50>6MSH={T2tMWWqzaj zvdXQ^68Us1tFqAzvw{3pXF=0QZsF=%{lB#%6fx6t5pnS?f zpMw(MneK<_*GqOkY70P(OqyOj1>LhZE`2ot(43Jf1zZuNrs`LsVx%>V0fQc(Apojy zOG1~R2iT7f|4$%i~kqb%%kjCl3=4c;GDqB>(W$B&{~7Y*e=pa9vhM|yON;Lps>1u==9B$3`^0EEb? z2QLgzB7rGR{s17v#3RU>_z1ulW4f;MCXwch%c$X$FiaC~6Jd%%wz!>weH2pw6WY#I z%{y@fTDGj!fvuHruJp&E09f7OVub4ZkE}_5X=HwLHtvXM*b{W=81BbE9byNOB#UUOcQYim2=x5poE%HQijdw~>Tmdwu)apg$Ar zouD1s0fC*81oA}GEJz{}Iz_bPVdA}TNMp4~+7wfepSUtP36SS)Or+bPgpbICU;VX< zz*~@E{a3&HB2I1voI6@fcjin-&cIur3v_JhjsOnnj>no{U5<2`gS*Xx_Nel$E zPKp;$*PmC_H=jdHDv&veTKczz`>oD@8Y?SR3ZQapUaTzgppme;nziLqN2D{_5SG04%q@1%oi$ zPXT{>n$(Ko#Kc<7GhC}h64iFE)(8Z=^6VK-P7bhGNZDFvqw;u$YQu^U%~cVYSoFSF z_(rEBheEB2@)Hknl>&s$+rjR3Ru%<^&;qzFa*7 zs=couTL9^80^|l~n69E%7GdZ2Q@W&t*c9%zDZ>QKe3byPGE0*}e@GJ#`}Cm|~i&=%fl zrk*CG>HN6?Kl}N^JKnc8W5n#OW3wLqGbVZrhzeSlz5ib1Z}rLzb)SH+0A70f46nVo#=Y+fh3rvGQ(0JZijyum zep2nMBpjK&ZOH(F3|RZd2?^jzI;2RY0#}^VI92B5rIY$;K$RekahxiPP)!2^CHsLW z7G>aS0z+vukr**sc&5*q7iiw(N5>X7E40h&tcn9cj0x6hfS4H2v6%{}w}DBIT_$+) zl_ys?y-rxHxFiZ$y|C!%vj+hMNM^cM}n*F+NFLj95p5Na=;O&?xvbipvF z6%t@bSKi~`^y^JUFC}q{0;WM|$;1TtcrW-HX@C;s<=#%StZmc13%cdQqiLJ)M2?MV zaS^ukyt-xfqNsGk!|#T_c5!&RrhhPY69AguNEOLD<&#jdMwEzqOHjY#+3J-J_M zP&GI#Qf;}@jMfoqOIOd7+8j(JUTlbgHVJ8XL>aX;GyDy~oS>_GQ4EnXeuhbSxKSHS zkNugm_|SiLu>XPo1;W3<=>Jn`0o=GYU;QsH{2I~nuQRV99kIAc^&I@rP=DBK*Q8DA z<{Kma^t&gx=i$Rzz(z{|)F-{>9$MwR<_K9ZCuMt4B;XrW`-}t^!i9jYg}f%wQhU8K1NFd6l6e) z0%V9k!~U5o5JfMyj0{FCz(hyc;T2Xb zNJJr75wxYRuXe`XMkzOP%B*QB)siJo>EIq3&2y5;!4_6Nk!V1Ob=>dgk zJ4uJvV(7K!h;{O=62k0rAF2`3kjCO7GboNpJ+IFG7o>p!q7jIMal`nPUpa@j;QfOy zefbq!zdqvVU|Bgvg-u)+(b)|1ugx$|lu4!Jc0G01b&wW&&n0a*s*oiGG{btPI-Cg0A}5azt@nhmh2J zI0J-=zeF4{hW-DLFa7zy_uz2vzx+4J1$f&NfUuY|;fQ;T)Bi2=ILOI-?sxUkDlv(R z(&F`{S3GUgKl$z%KKx6E*xQp8Ns#l7G#N39R?{DW5MEFIBniZ1uYEKBPG3WM4lGlq!^Hhf@xqn6f_{uQm0@a zM7At7_odIh4gP|gIR*bo-gsna_}?S}QUnf6vo3T0gesduZl5$YS9FipkoU?Aeh3EMZ~OI{rSHJ*@DqSQT5H}7 z{${VUfm`~zG`c?y%um!H-%Z?Cc|6w%!iyLrXF>OA$e!Slq9j}bEhki z2_pv_94+x@e&O&f?OR{`y{i~#nMUz4;ZH>~0o9`e{lkatMMBrL)AdMvCD?{0>1bH_ zz1}+qb57;wfD(hECb5CPX46UuWQ4a^t~-JcwA;nvsA+DSoo|G_$SAu|g>y6NX`ZBj z{hmFrA_z*Fp>*+Jp!-d;U{wT|hLc-2|93BkXMc%+v;LQR|fc^(te^Ob8xS@bnHj}oQ8E-E%k8yEC)E6xjgVHOV!c#K& zDNe0m7%WYAq1nyB!(UP zT=9H8E(k#c^oV`NG0zZ9$w>r2gwR9)hCq40PfaK#wq!r2f@e}CGNsJU+8?7+-@D18 zh`kb?Z$-c1kK&VV?L(!9q~-cuv7b)OXkJB#&(JGdRWw5mtOTbZpnNNNS|Qh#%w@FC zrNbM^pAACL3GU<(^bCnlj#xK=x) ztEuA8C|0)31|f!k5UUs#6-B6ee%G53Kl`)$*jwFsZ}kuU=ncGnHDZ5%AzTcds*ap~ zc>3~z+T@WsK_89Mo;GIUCTTzevs>0?>rhv@0Zi;L`MqSo3;xuKK&iv5flQ}>-B%S zTwMFFhhg#Nzll!3+nxYifBE;D0~v-D4ljT5uLJy;7Uk{C4bir&Op~@6Rj8E3hY;}M zlP9?G<^c}RnT<>~CRiv!F|~#U9?p+i*{l8%vl5digAP=i|9J^VLiGiJ7$HfpJtqix zjKYnK>R2CRvJ*y}#8eO_YoY8F%VvUav#@UT3`rVSo$RFOEYZBa%_r1agURVYGe=rQpBq|YDG=& z74_dn^n@DG7Y*yy*=e0fv?RS!+l6_EeXf%4RrQt|;35R}QlpNjkF%>PRaftEhD!qf z>MoCqsmRUnKMhl+5UApE69PcVE;|$=AsC1wW3@NnfAp(IZ)wl^-GB9Zk>Q=%hn_f$ z4!&e{8%VR4nG(=4&Q@QUQjfnqotP;N^}z_Wj}0&fDaq5`F6few=We3m-s!NC5Z8M#s(=W1k2 z2L9kG=vgoHx?w{l3)(=Z537gUf$BZ>eGcluZyUIr0SCqpP6B{V+g16daQz;&hv>HAGcKw9Ksg8HW>Q0c@QpxDG{Jp{QyceFxj!@Bd>BAZq1WanW|g3I-_%J|WPc&+bgWgy7xrK{%~|9d0LAht=Kp^f;C1 z?Plh`6mSYuZ%ft}b*hD_uvQ}{^}NVfZwR0L{2tDoyL0Q+Z-4tbUVdeRVZ{bcls8->j(cnZ?*T`igXbjhdlsRaG2U>%N#t0M)>Dtb%1rl`(wa zU>N_>!$bIc<2x+@I9olf;T)`p*XRGEx{>DaLJC^fy&-aKAv6~w079yh;b)7qV7&Z; zHC}mUjr$&1A~3KBqPiDz?9C>|dXtjLN3p5RNoTS!tvxL*D!{^QhY>+BR4HEOLJ$lg zXW^kJ6;hZgtSXqN1>$57M3Ixo0o7Ouqd`Pm=GKeeziI(YBtn>Z+ET$w$e)F> zAEQi9$i6>BVo=*H1dah=G2rR19O3lZfW;D}!bfpB%TVf&g7%;!Pzfg3gA!sw;=Z=} zl1y$QkEA6=qKw3;7tq6PLiU#FuSDcJ@V%qD+Nk)=RrNh$bw{tIfnMh%e7f4^hAT8lTmNB-PYrzCuNGJzC)MAKc;p;$WtELwrKZ#Oh2}2DTtl3(c=*> zk`WJX-^=o>G~8bIWCmQ(A9q?s>j2gOZ^XdZ+WDxNL2eTf^Ty0IN(BVm;>CaT3da8` zVB~jH0&wfbQzDR#SS%m<d9aTCp42oFMZh4I zQQ{CVg(MM-G%r12shn~l4x^}+CKO;w8pK3FzTk5rkQXS`s;i+xN(dhiDu0q2AZ3B; zoPBXqjFooBF<=n_u0C^sr@weO*`un!K9nkdGEB+7=s_u_5e*f_uP40p_@(%YWaYP_ zERM~o6TrhvzrH8Z6C7yYR{9?N?;7y{v&?5tC8(5HzoCLe*2Oo>9kgbYloKABuy16g)DWHRbkS%#TZ(9b=5s{~k+ zfa$ie!2E<(Y*kDL82N}c}=nM<*YwB z+WH_j;9HeEA}6?a+5s6#cKiRfSKnzR^s0I43$M+NQunHTZ^{PqH+6GiaraRYqp6ARpP&z-~nfAZu_JonsbN&tEYi6}fmYmTGZ0^W$7 zN*+REqic~S3+s~&hBO1;ckW@bGyVeIF^NN|aa7QxCRwnFfSVkWRL%4I^F)4|p%49Y z^WC(8oVM03#UklQZPnmgghfdEDl$yBzai5XeUP~(FSR`6)yeXae|Jp}ee0*G4gB^C z0S%`D{$K0`EdDZMqX3+`={l?muJFD>j^>(`GrLk*%aQT)SC4V|k&8GwM|#0^Eapo8 zUTKFgA4MC4xo$4tfW;8- z?6(i_{I^zEEK^%3RsO{(jWXmvfPzH>Xi5xHwV%Hug^5E@`}M)Ft)YG=BF)U-ftXhU zbLa^41i0#bQf?P$(FObdE-7z@u;*PKOka$QOYR=}V8<<(o-tA6iyuVK9gmWx4a&I$>`62JuskQ*YOXeUXuk|wVM zIoEF?f7jQ+qtTHpZfuyc^=Cfb6;dyOT{`1Ydsfw?gHfn#6GZVzl!*>28DbK%qs(?i zvf()hhYzM!zDE(gSR=o7ctaf}X}{fI2s6pDBmHYyDh)xbB{+1P2I((dI(Ol3F2eGZ ze@ZifZ$Akzej*)=fEeEV%t)_)44}4;L%{%rX+E1d1%DyCO06z)Z5fO}V{*|perQ3s z_TmQ5ed`P#{H48#g)BS*1X`mw1R+U2P_Aa9*vw2*sI@21%~VF!iS~biwD@goucc0;Qd=9m%qL^c7xJ|HPRSj(}0|0JtV<%tC56Cka!Z zAq2wu))Ig6-ydNd2P~I0;0ICF14H`Up+Nl={trb|CqIXYCWL@RU!Q`4ZEZ3T4CB7* zd}ji<>d||>`yFQXd&$P^&mPQgmpk?MAU9!`>Xizb6-85z5NI+4MvJyu1ly7VA&(=3eXXL&N^en2Xo$v{^}%JTilD0W4We)_CC_uTgd|6uexigv*b=dGq)) zVZHwS`uz9Y-3h?;v&YL3*xSGVw+IIT*f<0dNu?8{KeA448Fm&sg_7-&hdUGxZ@A7^ zj6ePQG4B7s3K#Al03N4#`C#B|Q3*uxZk7C&#eG=kkz?LzQ-lul&441(K`|xfawJ9s z@<`v9p;APa)0iYS+lYD?qDF(6@3X%y7%L!FfWFKrCy$;^gtq_HZjSz#sgx9NnEhmX z&JHo8n0ZlWV#BrSQB^64-cv*PG!Rm^=PwsT-o3VQM`+I1y&(#;+67G#B3by<>J;I=AMBc+wYP_@W8EPrcnb@})Cr_=^``*i^J9uTK+`D>UlYRH=S zwfsm9S8_%!BLm8>mlS!BSz?O$XKNSCpa7g*-{AXSyn#>rJLe{=-~cRYySwezOF@9* zj4Na%ZMl?RqX_y77A#9*qb8YTVRTA%YkA&Z7W`>!KiPoCIwu(F1c7pT2}$%Pi>pvf zRWxhKQ}RtMCg@*lG{o%W7e%tox?)0VLsVpJVsI}P0k1!IfG7XiAwnR8AtcAQTH%K< z6h1(p1pg=Ye{BtfRCx{6tR&wis{WAG`p_AlvweFR%)<^Nd|Rq}kiVCDd;*UoXM<@k zfOq@Xb}#L*__*KV?Kz}2iHJb}$dPz&s(#t}qKfGiUyI!B;)>S9FquXD+%GOF5%v!L zJpTAGZk+%}2Q}%Ifr)}<=IaqaO9~VORAcl*W)Tr=QXwjQCtMSGpft7Q{>A`@eK=cQ zlg9dc8z)3pwXDc#MApxceD&h2LQ}Fhug? zOb6%^(i{M*4Zw&9zc%ch{BIW26)L{F5`ZD>=WqQe1D`5nG8ORhE|MU8LHv`B5@cjx znIPuFS>swPu>3N`F1M6)*FbpX2Pb&`i3Q&K>4V9^F0jTx&H3ggmk^rOT=@d3zgN|c zlP`dgi(ugyO?sR#lLDpbgsk!>Z-9z4aOBFUE=Dn&D&Oh0v1IVE_NxnQ$<+auvv8%x z$yl}pM9;s#eP$e{+WaOJwLpmLCBFR+FXH6-0?XBq0)A%g+unZwg((Rr34%%hf*|gN zGX56~Y}*^ho72eOwYuL0&Tlvb?xv%k+uE3#gk#%9=sm`YJ8YrR(A@7sUW3B1(n)q& zcvpylHVxHBel{^tz6d5K9ynaQg0%c^Y37Fc@*t+>ZgP<$xc2`2wE* z?j9D)%)$?*|36F!K)G!I(IUb7LxJ|ozX|%U5Ns$$Jx%boBX?oTe10d`mk9s|k(E&Q zE(&{!^WB5?Z8goNuWze18%4!(X_dasx3Ba?@uJP29C)isBccOyGvwF7k{-VO?Af6+~1ViHipd9r`*hlLy zSoSJ8;^v{?dR$MSDNOBCBw9&2X}4?4P9WMufz?*X4WU{GQU~i7EeCE0d8BwpCG3-# z#PXh}So`eovZg(dn}gO%el-d}5OIbbO+nM|qDC1&eqsh_ICtyp`14D8@#*Q}`pn&( z030rU1^}>*ul~Xq*KS_aRKrS7As?`iob;%%f^FDCiU^pkLv!w+20D^cAmi2>8~o_; zoA}6YoJ(W#lT~jvQc;S3Qr5Ac-7H!H#sfO%5t+m^>Kvvf=-O_#29v3Mpv>=*b6;jk zhrsn~=iM@m1s1O=<|0y)UrRZ%5tljG$Wg%jTH%_lfkv$U?FE|SBp{U4{<7pT6PAmB zH=f(W6aW3e#M&Q7K>Aer`yu3@PlXo{s8;v|`WMfUFl=GVg8OKVankE@MG|+Z_N`e>1$ZBU4D?QAI>OH1qjAk^+E^wORuUhnfX<2&VTgVz z!|*5pErg#D3+^ZbQV;d-@&Sa4Ew`iSz4n1M3*vmS3|D^P^3l8go1exw;M<-6aJV`B zJMw2empqxbQNv#)t(ruG&~cbF0qT6Zl?m2KZq2UQrJ;m@@!Ahh@Zx(Hc<{sfQ;r#_ zs`wc>N8jyHd?&_ClNQ!k3+m)Dil>m1FC~z~&01C* zhhBePB>`+=kk|GS$y)i!tIw|EA>I)Qz_|D!Fs|+aE`Ok8#T+WM+%%*p1@_V4P$YN) zEGqpV7Fn$K7qmc**2HvisCssKwPdaP+#lV<`TJKmx)RE0Ai3lj)~EpW2`w?-!8Aee z>AQ#2ug`PExtE?3mAoNv@)wxofYU5*QtpFrG6)Ig%hf$i5`mSEkY1My;y9rkv2Xxt zbc@61f(O1q*(Em!n{WM?*Rp2KCDhR;T2B=BE z5Crs}O8Kndr`Y{LSN7pH;r-BI@o%l>J-B{LpPOh)ubo6tH&8x0t%JFa0NqBMn2zC9UWb!0a{+`0|Qw~rBc_+i3hKXd2%)61`n_};fquv~`PMJ`PGx=7@B zA2lkGK}`gBjDPD0s49Ai1~e9>B+wD74Zv*%s`}o3zaLHzmq~!NJ(qA1>1jmBR(3%I z9hM)FOa}S^R9OYd76t3lP_|o@J+RhiSKO+a*^1FSBYxzQ_+UoXHLMSXP_R$HGzFx} ztAr0SF|dj818L1{Tuj+ zcrx4}u6=PDY6r<&SZcP4Q$v)b?eBE)-FjohPyXl_@B4G-F|2^aP-S^luU{nrWORfR zX^xFGWP5K{F&lq6xgKZr_SIP(Ru zy;{;9`r7+)+EjYjcPn=CVR-VA1+SW#u}yc$dLHynTOvF<6IwlHw}S>)o}lFzF!vJ( zkGs(5d%;g+5Dn^JzF+=an-TcrXMp|vJKvwa`Hh=+?X?jH`=K@5A=HYWs&9l;lO!_6 zKY1#EWh*Mo1bs5qGBu%aGDq?xn6_1jGovEx!AjJ=1<=fm%07AtndCG6r4d@)`-NPQ zKv?CumaR!v$%%&9Yn$J>D0|d?HEP0|hr>QO#XZtedY&z^fT9dbXrT}C+yQI*<^KKU z!J~^sxO&$k0K?gbu;%C92YPj3uXdtpphL~!kdy4O&XJ39s8q^?YTbw-Ey^Js`~b!P zD%u02p-h4vG7P{gPu;>W0FVB{Ibe^b@gint0z^YSER0JaVNO{UQBDGa7!0TvL~h@E z=zq5StB?{aQlDJdF;ql=(l{a0#1r6LX^_xVpghXwX?u!fhbxj$H<%!Zew>mxQT_0M z?x}iYKl`t1pp$#b z7IJqga>sGE+d;qKLr(ONjXd!EPUv?I73p7PrrWGCjeO70B_ds z&pMuD8T7_r+|K=%aWgr-rye7E|E1YjQ3R;|kr}fRL9?(}10f8+%TL}y7zmI2{1L*w zzHpQ^B}+mH)nLvJek6D{?XEdh%8@5GzlqYox{n4Up9-N;8bnf?u+!Y{=c*&9rU*)} z%*^+cx4SBiAGT;l3;d-(m|KERDv7Fg{`fgbyJ5P?6D{z47@ zArk-ti8+60PlFD5&ok8toeF)HdGFO=WCU%tRrWUUTSoriH!r(Ywa|x{clHrUDrr^e z-VP-@4_-w@8tv_K0Zfci+y>c3%6tZc1W34cjKGz9fcL-u&bOv(*CM|4%~PyaK^fpk z0w0;6Uwk8iZ3B>SH#OGMRkcH)nWSKGPdiyV0QBVLJocmw`mD8ZthfA1=~_IS`|OcwDrAT+-pWU6S98^ zHWHbphsFe=o9|z)UcLJ{0Jqjp1B^!|cs@D{FfUSqFIG{+cPA*DW9pTp{&FGMEQIRc zP|$!$?1qZ?3@9cDs@exPl~I^3jFLB$vlp5(d__3WaGb zbG2IG^=FrO{CDU;z=L7%=6)0?MbVPk-D*xd1?0c|2 z`H2B_f*|!OdoOti*oxiLmgamhg6!>FPQn@HUb7?gA4Ka)(Gf&Dt2ge*+}TuVX1C3R z!D#pfm}d7s_6gwP#XH}dp7`D=UU*@H<$}a0rbz&VWi+LOUAp;3X>#f{2kkTASp8O$ zDm0@adc1B+CdV@2bY?@1(qbXHnR6Vd9m;O|^yJ&$A~WEH_R{JIe8q;BQ~+x^~Df1OT2?>(}RGJNP;C1u!9b4+YMYt9Rrt(Y%Jc| zv6NUrj{c|@ufImquBjKTj()o8AAm?$?JsflnH3)YofU4rw!m^#tE5TQZ>VIxP&d(< z5QvJOvQl8RQzh}<-fX`Ykiu>D^U*8P2(yiELZ@K!;C(B~g8A3(`P~JlkYws(>eOiy zGj%E-3sz(Vfprq#esprw1KU=r+XBb}Lvo8|0H1z~Bhp{_(oKvTV6_yGzXTK* zEitVv=dBF(Jvot*vwfXD9c1mI}z91+63%2WsTr2ExCt^U(gK!Te=`Su{z zXdZ2g%@$dLe4f1%8UdNSm)AtGu>~UpU|0aJK6Mk!z@xu#0b$R9-AeCYTvY7AdNoqB zPz;lt0wQl}pe6zcu`ut6YPC>mw5vk)2Lz~DMnP=HWjQ4 z00*r07kKSY7kK=)7r6QQYSQ_~fXUQn5F>p8`lmr{yi*b|Xk@@~?rZw|@E!ERHlrO6 z+NSxp9CLUdy*qm!1&(}fJKTU;HLY2{E-Tx$% zE*9gUN@chUR&qfHXhpl=kt$@N0;m98f+=ZYUV~va$c`C56ii?iKPz^>BMDiGKGGs_ zDsgDJe>$1U$S9GT!zMZW&6w2?AQhNf^i@N*3?EkTbQ%cTCLiQG2BLcp_V@Zvx?2)} z%LjjMZ?m~|DGS#y`^XGgjd1QK0dh;E!Vj4A_K6oM;IC1QI2P&PW`z_^*!pNBt&*_~ zC!m~p%KnFdSDw5H0^`wNx`5@9O7lSXM;rR8_&%YwK=O9LRpC!j0n7mjf+$ob9SN$R z&o0~`n$uqUOp*w=on<2cqvQ;TN+V=xqpdi*l@_n`T9GjX^C9yb8H1%0RRnhp3;_y)GxCLb-I z1&ceqTFfK|HUUt4YBiK^(~pjwWGgMoKWVupBV=FgicI) zuN*n~6_9rQQ!ZaM34kCURlWZxv=^$0kw3)4rRtd=UP@JIz+$n)<`&_b|2*J_Ul~AH zVzC?mT9oRaLa2#AHtZoW!e=E@sp6qo=}()qv?M=}uAZp_SI^n#&Lsj(HScNeqmLx8 zli&t&`uH8;7Us?*z#Nj{eVvXvV5i;Lj`G>pvEy5wFjl9pYdKnTih^+i9G(L{`tdv8 zlg1JF{jZ#0Scp1JSYa17zeogvto%iS8r1loW|Ydb{KE+us7X^r<28I1nUU z+$I5SWk7{bua|UI3giMxvq%C2FTK+`ldrTXKjno_B^h89#Pid`KsdV*@uM$Z#qrDM z@X)8uVRbZ37%*4A@}^@eZ8xFUB9YG-C<|Ljc?Kcp3-CyaA35oJ*T~-^R#k39XznW( zoCO6Sm63<^{}2ho5U{tuz$-rnzWM)(ccdtmf^q6g>R1NM|15wr$UybKH4JA6M7?i@SFFuft$Lr?HZd#LI%yC-DS5{;x~>YZopf8v;)A4;xBMOQi3m|6(OZ1G<=hx`f&@g5Fz6jS&p;2W0dYOxyZ<8M$=?IkH};f}b(vAqQdb zD(Zmw-h1ye%{`6g2mxMD_P7K+w1fJ5)-IpGi~rVRhV`+CR$0{`2zjsGjKC*9J&6F_ z>7PIP!&4mJVC?Uco;?>D|8>$NG?OZW(FB-+zDy=67l6oHC1g72W^v6OQ@em7HSHfM zCC*CgL#uSSIv{drps?UcAvHm{@R8a>U7EMr(yE1S*K|ih<7#}WBQjyktyoDSvsP4v zH!DCbGHe}dn$O8X*M{2)mhHu5gpSxDIqKsUV&m6&7bXBl=N8y(7;$V}`$$OTv1h6b zdGL$~Q1XnQ`r9L<ugK9yX1%h;gL|KzZ zvHQ@JoGz9Fu09KV=bvow()R;~#U2*RB?t=u3lOG60F;sdXe3~21+;xtDXcQRT@Z4t zI_P`wzJ=!rTlDyC|9_?xK=v?nqFpa3kbef67wqee5%!c_F+&iXODdYrU;;6tuiEG8 z{~IKMy`*7=vp}#FY<(S$z-k42>@C3m%)nQ^bPFM9D;&r*D5n6zgal;Pe<(QY6`Wv{7Lqw@_TqtJ+auY*+t}7Hk3)A9#Yk>cis4d z4dr=-)XDDvGoUN?0ynM`;)b;nU^xi2s@MBUKDha0R zYmlnJpOhZGY(ugj{uR{HSPZkV1(c>@<_6|q@?%Ck^pDb{8O2Upj_m=a; z7i!hqgh&#jbeV*fC2g}7K!%z|O|mP&f0GXKvIC$}xnN>U<35Fg5}_0fqx6Cmv!+A9 z^_S1^)IWa>_kZ{l4}bDJ_6~1vnZXv(i3`&(3` z2HCOy4CMj{NiB`=>N64F`)6ys{KEl@#U56xJpfA(P1QePi4YbDVNu5ZP^x~?)jz7v ze-7^DchO6=M@&iiQVZ$N_RYzM>t|8<(DwPg-JEtvCY;u|k21`Co-JN5w2K8G-A3^3 z@de}v`L>s_kiKrW7JdJS4uKHU_}?c!HK71^`sZ8UIK>-pMC|VcQGph5USR-4F6%!G zaxF{Ee>1Tn%z#`;ea~*U)4JirJV_lk4RPl~W?|)2>TTDVY&4pL{ zcAPZ=1ow3c{DMGeu}%PC2pBhvXTNzJZ#;j3hd+8Ammk^3{<#I12_bT&EDDYQIpvxU z^9Em7nsX`yqpDKjzw%LIJ0n*&bu)5DG+FOrfj3`?_|vbS;>TYD)+Z}0mn#r00A8f3 ze*vP^lnBtm1o}D!00dF(>#@I(q0>R!M%stnO8z#%zqL^B2iTbk*!KEeNZ-6K8*{bL z3A9Z`KNt9E9>!-w07C~!mWkIsnB?h~(Ixo&&JQzzdLGyFzVyJtU>mb`e{m;P{Yc)05l> zcqWl!mqgo6dWu*Pr)#Wi?#kcJATm>gH|ie{M5p6V}U!IC`pTISv$@Y z@L41PApqEv${-^Sxkpp#c42m&dsoAPaQyNHPrY&#=k8hJzW43p%40`3ys}p+9g<2} zrqibTpt4;dCktAMPbst#h`Kv>naD^M$V6212ndt=VF(k{|H_Xyc;;I-@#0g!>GeGf z!wQSVatiiXq=3InjDIom2l2D`n-%>e)1QP^dfIMduhvNI~Vu? zfAr2)aGu=o-1D12&sze%6Fi8vClJ&bS#I(ff;$ah+YZ#*cb(6|Gc5#LGzBLS$oFqH zzJx$MFRyX^xkF@xoK5_{q1=@Y;_Vo6|ik7JFDM zSBc!WO0d6701^ry2!BD&|Cfs1N&ruj0YlJzepq54nVEAl3TP|luIk?wJ%0+@D{)WE zC-f4DnW#7C5ZLSEcaeu(VEkR6f9eF7)~;R!G@h|ibG%YoVI$V_c{yUa)R96HOM@8wlcYa676=~=K=6?lYJC^TL5y?&+J4>|y#?wZH-;=& zd-6~{_`JWCgJIw^QV0V#87fIBULy}C zw0NvnP@0pMFuszr$QHo~mc}?eHj8yoNLBp+#1TZ}6!?>H&U6w-AZ$>yqq&ehJ z(WlLe%l9k67C_t(j^7;d!V@>~%y-Uk{pAHXuCQ3Fu-aQq#J&XcBlr7hN(QFtzLEg* zs2{TCzYzbaEdXk@0m7ga0U>qS>-7?x;ID#BFSyfuP4;0NZm`MX`jhr9%% z#~awj5!e#rd8Q>`kLR{zp$B0TI(h$0Um|LG`f^}C^%l*49{=)bNv_!j73$3UrwM?m z_fIuRaM}P(g6UI5;Gplu*$-`CBi-Gzh;^gJs8xCE{u(4vP@t;pTLVk69{swcM8>L- zP7Qon_$Meu7cF(pJ#`%MT5OXD^85JOl&FssX!D=BwaChNhsNgyd!;qxII0g11 zZxbsTz!@bNz`U7)6OV~#m}-5h^@q3c>eHtA z-ySa9w}%T4?&I*v9v1rpmWyd}pp5%vvR*KYSg@Ci(wH3G3DV)J3hRJ@%^BnP_zc%x z+Tiu)Pw~d{Bd)y^aB?kxXb;0;g|JAKeq!|#Qt+n*0v13X^UKh`Wc_C}pm+d;Y6G05 zRnuo4L@S``t_NNHL+hlVmjrAH{$1i2(SWa)6poNrb3>-3x$;Va1p z8TGuXBT#t(LilMGEo!wH6y3{qG`WYG`Q$z{$wyt_Qo_Auwsv#~X7~m6`^Y2-o@B8+ zX3WzV_1&HT00WMWHW&tP2A;KCgPJ>)#1ATsES=4X>b|6Zu~-IEvil_=^;<#vMBJzgSi7E{n4_OMtcSU&~+sU4FDf2HalQerR#d9XkL5JbO!5F=Be zD*wrTf1arZ3iDrX$axPI`*17&YkSzX>Y`57Ek^rp2NhS9zh~piTQ~sQUYpweV2;tx zm?0B(hxoU&2Y4n~n(1A4(S{iwz_z%sJ_A1eIpETzJKu$#dUA~yo?l}aIwA*R0;RD7 zZhqHpe?&BI;mrMG%$=5s70lypS~GGBw7v?YWuzs!uxg4>`?`g#Uj@@hj`fLg!TMRm zh@ooVQW6j{91kgb?yBvJ41lBo5<9^Yp4_RAp0TegNCFYjZ@i->U}m9fO=4TQi?Qyqz!%uHNM%cyABlN_m#dI4Ojek6E* z;swMyewfGnuuN`)qf+ytqSCRcJOOM_vF9}@pqO2Mm!}Sj99n~lO$-i&>S#s z7{{+g+<5gSUijl@Ts}4_F;6usRs9I2@*c9SECs#O8Fw z=7h018F6weVtp&(?1ZsCi8woE+Ff05~IhS6CgV(x@69) zoA^+wY^6df2|~1n&9z5NJB{CU1GLA=@CK&a*|#@@98-s=)(ruX9G{D={W5lW7ygBx zW6fQj06h8BxA5T){yg^g88@y^JvCOl5(ETekEP55wJ;Dkq`+%(H{$efk_^tUJ_oTf zqX_(B`k?gwCq6*#<8u=90Zj=4cu3=hnw@Fyqcv`s{^v!E^;D7*N6M=K* zfe(H7&iA188u){+o?^LxgCV0_SDFJ*c{5Wx3Jx)q+(gsbAiD^RoZ2C0oX;i(GcAQ} zZ7TMZ7D038Pz;u66QZ*hJbvwUgjooqcI?pHPV~`mH1Gj8BoZ6 zJ>+SdhJce$0NSdWy+qvY9fbE+j5>;T z!7s*k3jALCU{0fdu44DBh_|}=nD^!RAm4p1Z~siQ$Avot?76}E71-y|9yFlFdq~utT5rMYK z=4R@Io!(SSWYtDP#BwfxN&&{wHW{Wmm$L+BdZi>b%4p8%@4LM*+4QbS4l@w>@3UF|`f`)&DO6zxV<$q~;$xi9l{xw52So5-@K(Z1u-^NLTYT z205KxDti1`nipkUFT?wx!2FOBzFFFrg1BuVtbG@S>91k`L5=xQ$fJLQsqzK$It2YQ z^vu6!`%5!PfLdc=i`M_P-Zt$9f4i?e2jg#3^xFZRpK~6ZMF)250&pj}vJ7;d@o8ae zR%83jY+>kHLB|Mu;?rA>`IbL___b5qx)rg%??A4u@}C|DtQr+{T(&A#_Rj;M4HTB| z6{L=bLl6|4JN2_gp4dS1)@Ij^-c!dgj};`WPIr(9D z2TJe_ddyK@vm!xpAL2{@GW!WRH?Rpi$%S3C8ba8{2WgxSm4rQ)kTHbwcYgwq1#&K4 z+#n3n_0HdwNSOMd2UU_D`=i`f7q-AC75tRlQLda7?J$awp!~jL(&VRU1dwA&i_>3D zXh2B{Mt~Op$Mkw*8eyDJ0;N`1{G(ZPyV&HSY`(VyxOCL0ql~HIm)r%am4B`NYp@U5 zZIUar58>Qb(SYjY2g&ru&{+Lem%lXr7p6XcFc!eIvJ$NT2vH&@_{+dcb3#9N82r89 z9=2%)bY7QXMiFVZzW+7{KvOuhJ^#7DiydFnAvt3vF>16JsBNuwe1En=ugt*S;afBR z8AsspFP&oOn(gFTK0EzESyER$DoY4-WT-u5L~_uN4lyl=8=|eay}q`6E%LPi8Z}I5 zbIz?H4x0eW-03%nEUu99SWJA0-o8~{Yyzl>%(6eu9q#~U?)S1-diwbYms8-kD43ES z?&w~#Sy%<~r*__dn=~f~u_PLsyFUSV;l&^0{s-QLqw{O*?~gb=8B(v?7j95cr8CQ_ zkD2kYF0fU035??8O&oxbl7&hrsf5Ae4MurHF!k~|rW2onJOnC`^a}DM0hixv0#LcH zQB@$Uvdq{fLL305Kv};{Zz%xE*eE9fIY1{d5+*RJ9PcDPyhy=cBn6x+_yKu7KU?@h z+4v3u1qi0+9}Mg-2!CW`e?uh#2J5pPLS_CNp+=7kI7hac3;x>>x!d{Uj_39I|F^5X z-`gW-_s`o?>Qnyh)|rg`R>tiz|C?mO3I_pOZG^`NJo*Um;6ra=|9N4=_n%s0v4m=^ zv4sDnxQ{USk*t5H+h&6Qw$_RXQtZhnD_wn)OqeMbo>98BC=_?rlhqf`OSCac3nAk(p6-Tn&~f1Ri+s5$x}u;@tT&oZLJIgi$~`IZx_qs9VL;9g4705|JkuHv6lA)6Q>i3Gt){@00 z%t9#B-#`_Tk|JU#mtRQtgjB)jmdF%vv$A2x0z9Ze90;N%5UNNI7E`|-AsP9I(Z2LA z6y!fBQ6DMys|bIgGW~}zy;cZ<99UWhP{hC9Jif>7r?6Y^eOvE*uJWG~8rqg*l!u4} zm}veZGWv4AyIB5`gAfd4A=lj!3vYg%*;M^jH-Kik5_-Z*ZQjhlxCTD@iOB=tPXB!U z56^Jz+K7XFVMddKf2cOUS%4~l%)Ea)1u$zsMkM)!f`Rj(m(2vZ#r%`~Zt)Pv*m8E} zQ+##wkQFIa?|mlT+H0Kna~F@WXjt-=2Q@c5Tc65{BYD5Qj1 z1opBfgEj^VQZE?Vm%?3VPUY@G^bWGz2s@=|f@lKJ+-oYdha5hES1C($#E1piz;6*F zxk{~5pd#3@Ir%0KhQf!iI{7onwp1O4<^*g-tBhSSxrRVSlfX1(S)u=A5-zlKSwxX1rul$(u zC*J<`?l~1U0UvM;jb!z?*#Hkb2)y@^JKuX=eKq2bzq_8a|C{%0VgEuv3#|yyL|P+F zNcB(@v(5ArC?#pqCFVIqJv*_7nSjnSs(D`9K#%-sdtsFXWI;7lLLeJnfk*Tx)x6m6 zKvtr+m+F$*t?S5O4V=BeUpx+a=zBTv+_V-dVnUku*g>;o$<`zw?2Rd+Nr>VYDtgRx z_a^}V=pX(w{N=y;1)Q9%ad5c7x$|qh@%nz1&g|7T9(E}ms^BSKh<1Vz(5@N*D2s>6 z2wooh%l)aGNW^l5RW+=X2#^T;Md~pYO@QjE71dQ*NstUnQK9aZs&w%xM*w;XU}E;m z=6NXp%Ah_G|58H0i4<7OO$KG<3krthSN+gIvf2+NF{s-9)%+(5{t%?yZ&o<0)xZ4f z8qlBuHgr3VeOq+;!wx}vn~~5il}4|E-sSnOhP*AGVhbPV+e5xT7_>tq1|hVGLw-(- z_5Lyw6K{jhFeCkEE4G68QemjE1R!!K zv-epVKI>?fm`*+e1U8tJujJC1!W3=$jKL> zy|94-@fYoYvVda}_Tff%YEsA2y{HWT=iWYJP@IC0?1R}|#MxuIW&BHVA{J_iy4#p5 z{Q$+5%eR#g!5XX!iLYoKOhFnc&<7dtB`?5M`{{YIjgXoB$dx^Uqn#eAsY=koKOqRg zAL{p}bLF3N8#tu3u6v)L=;w_zZ0Ub*(+TLhx@}1m>1A@&4 zpk1Y%px@jc^zYF;zb#Gssr|NAMs9tC0DSx{s{eiEizlTJAYoopZGY453|z*PH!wD0d-%N z?E&3PCs~gP0r zbc28xgJ=v82nTn60&wsBm$BJQ;|${nT)O8bR(lbf4Rtn0;WzCzay9%zDxK!i8z*9w z8A<{PK|}nIVikpaqN{r-LtY8Wnb!h}8sW5H~Ch(hJ&m@9$_QZAU)Q8RHBLp&W*aQD zxMSt*IV@tg;6L|1w;TLz(Dwp7cR;Wb!($t~OB@bukZ)muJO2}$@la7HZTB052#`!3%M}*xP+mbY?q^yfQlWJ@m!P zcFg=ft9(FtBKC+6-GfEk8+g~nU?#QmxF}@uJDW@Tw=e-CG-;1T;v!RgHc3lH5yTf_ z2C%4xN3gpA+RC4VNv_n*x2=Gj6i_xW5{LkiuIy1O{i1RviGE6@ul?%<|NPp6G6O;x z1ytGqp|$w6o9?b7eJ)9mOx5o}xBog|{as#%e4^M~FFgqO-B$g*;2gqkpWo{PQ%4SX z*Q6lY_m1uU>zShDe>ZF310M#C4)1*5dGg5(UVdp)lr-B4t&RW&q3s`nwge6`BP9pA zH_53@wn%(`3A?NDX0$N4)%;iMM6Bn0f8?1!Z?cqz&*Go~imOo7*QdvL#K0!;NcUNF zKJsV%n|0abst#qp=)3H)cFFA5Qtnu&1VWM*G2>sYGc4-7Cm9Wa7A%f>gagzcm- z-09t)08E*jHc`0ezSnW})eF#`(xeu?hCqcz-ZqgGr^(A@wO2sh27S)ex;m3-^;0N; zz3>Qt+TWK|zPexhKoz>Gj8F*+u^S;sEVAhs>3~ngCQu{>^1f2-gj)GzEdbII!n*n& zlrDdMJ;~~ag77CHA__z5`={zY5d*`3A`B#nfo|_#2LG@nh@u1giw!q;RsW7-Z>|yF zZ3O6&U0cM$j>!o*Ucdh#iP1Du*|(krw(s92xvdqjevD}$Se7NW^E%i&m}-59 zvGsKJVq8IwjRU~y?oR-I^vu)rGmk!o^?Dk8i{pTE7jEF_{4HF6^9aKbTewxNNht(u z2V3PtfbexjHI|TalJWpo1wa&yX%;~|2+)4YWb;DM7FfycWji$j7cK(td*7XZ?voS7AN|2({!^<=0nG~VEadtB5EL1(3jR>#(n2SxCHOn8 ze%9lGgGmNDZ4mCX0UB~2T4S5QM#UFx;FmyYQ?+`NlD&Xu&;T}kt76`hbydI`>ouYk zdc=^Lq(G7%`{WoRTLp)rsW*=#58E1M5#g_zOr#zhW3QJD0tF zIntuC_G}cyuAINOQ&UrCnJ%L={3wHdR2q_mpdKsX{3;Jzxd767muL{xKNTV$AdPv1 zpb*K;GH7|xclm5tv0ZF@6-S<~B<)ICxO!IQO-Bx!8w%tX+Pi^qLLx9Iy48Gy^ z+Vs0x7|-eTZ`tRX`(~3O^BO_61)|f@GEDXL2KdnXfGbztLecTV4W9kU28%^CR;hmW z75QJqFMyP7+SVTb3~DeJu>0*YI{}~%ytG>OFCXKWm_k6@tkPuJ zSk)45^Yi^%n*coe?niL*ME5e{7;xd@n>admjN=>UKs2He0#ZKa76Gu5IXb$M(|;kz zVB5~zOMmDb#MK;VBL&6!Vp2^tE^?P@2N1))oU&TBc47Xu;%JwXfV8Z3E(C0^TLTs9 z*LngKA*cbrv;zVu-at_HsX>VUpgR18A$dPY4geJ{06I#4vg+;H>GEw<{?rNB)JFhp zlHl6-!k03?-F8AAvx~P8_#3j|&byddZ@mrQ>uK_~MxP#$a|4%w!ae9aj=;x1iMPao z`h%~oadH}QuuuAUiSfQN$1W{?^YtaKHR`VoJ9#qOfAt}_jg<%Av8y}XaIn>C?3ipNYlN6Xd@xLOc1w@84i zWub(BTjXG?O|Xa;90zb*O&&5<117u!S^%3-1b3mjL}874A9xWrkKfm%e{5#B$y-yT z1AfnVLm>mqMx99pY+L5BfzhT#n_B}@0O!s=%4RXJ(T%D$nSn?XXYvAL88k!*YXn=zP=r%y*6_7RYF=W6R_$f*J%A|m_`d>h;r~;Ddibw)PKb6Suq3^2W zAGX=kdat!DsUY9qewS*Ww($)*!QUG(WS;--&F0k^m4w&Zr+(7HJO`h)36UDH;u@G# z@Hb!>GjMnWeCQ)@Wxrv3_3=~9{+Fq<5dO)wzhMv>0BJ0C$cd_{{tF?M=Fe}#VV*f= zTfvtZ8R5pu!ASxBn(`6~WwqNl-)RzFT^}tAR2O}$(1IYwAKh!*`@E|E z&kD1*mcT%p2w3P#t2WjQjlE#s^I^`(&gRg0zl;ZucYgv9qZp@?86+=pbpAD*zi#$oqLbj)nl}kqia&Oj0WVniyz1iVAt*e!}VU4rGuEDbR~i1WR;8K_V(=N+GNQ zL1k{MZR;*5KL}ZNz2T-ba>Yt@39~)1niS|vs_{H%jxiO#87PrCQDVjwVq6qeSQ7JU zkr^D1@BRd!**X%$ljrfT-2W_Y9$&;bE>tU^&a*RY&F(>AlJyA*^pkB3i03wtJf%hB zEDrMRC4FW>Tisas&{m7Phf(X}pODcRuL=0N?n-HI9!N`}=9qN0sp?x)edm{R+fN zu6ghLxvG$JaPv0n-rH#Pl7oV`o+`T1SI2tB@P|Bfr>DQqUi(24+jja=%|jiN9`@aY z0tk^U`)=nCGETC;o1-R@utJ;;-}dPIwkH6~ zMc^3g9KFnbBM;a=xQ@&BJdamjeneEJ8n)||eocrpLhIzD3pF8=TGaBwX1H3hEO0*(3zfZOM7A{S&ML?Lj6lB90?3I=X>o*PC!?@WmhIY^`AfYzFDO&I6;rMwKq&J*v)Zh z9=dIQcT06AShsupPDufqDpdwT%LPnGaxsdn?7O zCo?Jsg6A*Vo>u^E&!+tG(@GNco-0)an_NWoLv{cYN@Sk|<;KkcI1cd645#;weB&LE z0IUX_o{dWUL0Myt0p~A2i{l%YaqH$K5N&2KTj)h3DsVE>^mYfQ8lg)dWg+(?U;#19 zX(t0@AU469;NcQ(gITkC?Zkp5{GpM?tG7`huVnW!r3oOW14@u*0fizINnVWncqhTLWhqU zxT8zA6AZoY?tE4zUpg7w_EUT0KI$DDnHaJ5y0_cjI06s78+iC#cfQxW_~M8s|74Bj zGWT(#Zi|)0N80sIv;y*VARelN|4hq=y=0aB{&cs`?!`IslLB8by|WO!*R$qB@WBmjLdMmunD_44tmFr z;|g&+YKZ1wG5AdZgrmDZ0XR7sRY295F(Wb|gbl9T_d~q++^4`}X!Jp82644Pl5S(G ztd3UoWU~|vu~(ay(i?MgY4z$_Wpaz#3c8C9_=cH0DMhvSg$(Dbowx>bDdqzO>q~xs z7=ePA?}sGzrNkg%p&(-q>J&p9E|xt^s7eikJid#PrKNfs{-J(ERRH{XK2|uCbHgM|7NN-SeQTZtAoG zoWS3Z0y~}pHYu;1X%Z%D;&nx#*1iz8Eu`{X%fk1hdwIT{gtn95rUK*?i~=!&avki9 zK)T9;_Ia(rax&HC({NXv{ZQ#V}Fpr zKV$9CWI#oV^5B0%01Wc>A^QVB=%k^z9I{ZDiEZ#52zVwu$IYMGqoO+koN4z+eLtUZv|s* z47*<0AskjRAf)k6r!|$^PjPb&h$|p5{53*A29sxshsLY3_dC0>HKgP-F zMI2vy$g~2ini4tH7|me4P?EYm97-_;W1US6`+k-)rv^}Rjxn_k>5Ic`+s(hzc-Z%t``vPg! zzt=AEM*n)nj}7RB50DeVvOjTK(SsUxys|fzFjCPE;6_0;f{mPU{!H34z-_y1x%L{s zzqCuXktigGfWhMd;^t6j&P=btt}G*xRr_6@0BqK6rfa>EryO8{L@r)=0^`{c&Q32D z2&9gz_4@l}ULJ-MLJmQ@kP;bvtf6hBkz>*3Ia)Q1(`KyC_N7ewLRuRWwfB)E0m6*@ zp#=LXW>TU1{27B33lfAszv>skKh!osC_DiOH#I1wzYNzClz-7q<)^GZ0(^j^7qs2k zboc@;_VaM(@#?V>e++(Wq8p@ndqUxTK-%Rwy>#Q-t9ZVKpKwN6@eag%M#fjXH5003Hz6128VY>jmO^iSx^S zJiEV#i@1ObIK+Ux+uCQo^Q|>rd3lZHl2wu}38-ZqN_ERn+XBT1s0Rp{oIE&*R4^^7 zoDf8AgFegZP@EUrPiLo}>>>f|C<#&r4kxEY)0v@H{siV{kGtUMWms6AvLKKw2pwfZ zVky?94ThlejVTcjACP1p%=HZL$P9gdfwrjd`!fw`kQh9!5H}Z83CL<%!4`-682EPp z{OsMG04(=Lj3>3nT^dmg!J5yci~&TaxNy(6@%qa@i*eioB}NJ9&XK5eYmTO8|s+~a+El})# zD%F1-lM2c*H9tR?x#?io{y}ykf)lh2$!BgPFOW0JWFb~YmrMur^#Htt08W42OB6EP zA5AdWiaOA40lb;|+#x||vJ~!c7|2g?Ro{OEcn#13Seys;9$4etdyaAR$aNe&_$HR; zZ(wn73z660WK+l@!DpVPZa4yQonL%CeV-)*E5>jH48yc>|IrBS(*jq*0j}Tz?!jf8 z!+GrC2(-l*<*SdMV2lwkl+@u1qo4Bm_p7$K@0m zoS!Xjmu{!?OP1B>0#I9+k?!^6s$T~T9f&h$ zfE*In9JVm^$81vLa{+X+;>nll1i(t3+JvC-MMt(jg&Ow@L00+N{AVIgiQtcRd`caz z7Rcyk&=5V#(CNveGY8+B)21DQKOEG++7X8t7?`*45V*(sNB?td-F-W)0jBx3f^0mM zm)cChe{~OV>635b;``sk{(Wy?asC>@-U$es2@zo6>`Y9{FsU)xvKd+p4bcvZBZEhj ze(EjS;Q4S3FNN#a3(w<#2Asz}F5v<$;sTCv5eK*gp!)pYIA(n7>uanQFN`DYs zfU?eugmt=aFwnnDMmy+~id7DYF7!MmoJzhMc#Zm>J9f5<^Pjk$tc@^sOakl_Tmy&8 z&nL+T#`>`oe@^CIR0Y}D)ycFS)FPK|FWd}cX)9!E5b0K1z()m?m2d|!Vi0(91j-V? zuHE$5^_r~#nEU`vJ%t$&x&s=;j$-m)2ct#ysDeC^Ua%x@lRG^*C;*h5sjc>{3@}kb zB`n+zJ1%9A0>vFju6}lQ+V;S`z9en$t$KC|T}3~$JbKUDCJLl}6wTc*_c-|Sy0iQO z@}JLJkP*g=U&4;m2UV!7r{H(+t`S#0cNJGY_B>XXt^(lT6fg$HNr-rzPVp?>#9jzEM@wA9dEAQ!a0w6K07rQ8I}y)4Gh(^t zRBI}kO?;Js6bB%bB*B-VCKEKtg-zxY*@6g=k+F3qhMU6IP~C0S-NNhU`%4`GL*@%2 z3E1|PwrWc_7KK#CsvQ-{T#*YFd<=K=P(UF)l%Y8pEcbC=fXIUr zcykdvuAnU-?OU)puhR#L?*t{lU-`{LT)Q^HSmT&&IGTmVh;e~~qwgb*d$@V+LlYms zWM{4uM?>l$w1_?VTP)qymf08;OH+vuWcFBR>lF){MX+YH0zaf7CL&RaHhKVUqN02I z4gw$pzeoTwkq?#!phQz35(LBc_XJZQBuQyU6C3LD0e~%HIOLyFZ)Sb=a|E<1K2EfD ztM*P{_qs;hK_9#%qZ!%T;n;QGFa`Cn4_yA#2`+!;Wt@BL1uTxPfyWIt8)2JG)lPQ` zoNSUiYS9irD0b+8n6H@{Lu#aBj@XP0jFmsKLBw%5!7Frvr|}BThacj;a36lKxQHu1 zv%niquO^b)YNPFZNyt*mHI1~^MY6A4|1ysSZTqUb8RWWxw=XGoDRsnstbvkiLjBACi5&~$`0CM#zZcd0;$(bsy~05Nsds9WVuOa+7tQ6TRz4%A(b?%{<`X+;m|aH9`iJDc>W{82oRQoiv)~UT-d;`asO3OvOceL=OIayv` zbEzGrPc4nu5%cMl+%(g!1^iJh>OJtS{+UsW;WJ=y5xDrtH*xt>&*SK!mqE*8#1Yt> zWu8nFm2_H*#6mHzvg+mcrw+@LQ}mGR^J&i<0A@r4fFl@;80$D#7WSdBKIfQj;03;p zy-yDK_x_JZc2;GoQJFeivvw#AJ65H0Wi z1YqI@Rlt|w5L&t_BhzJgc>Wt;Ug7N4djVRTzIW3EXjJ!{lElAX38vKG9Xc1d)ECUb zKcLh1H-qR6``GbjXiGFb(Zjngj|K7EV_ ze)UHEO(-Q-y^tB_p&?ZMFDG)GAZMD!00+55=(FFZVGGtl2Y44|M8P9+t05V_*7w-N9 zfTc?asbu3H(f04Y=Ky` zDInVmL-p}3iV;i;z?mXYz5om}_GglX)LN)B`}MmM2pB@uNDq!UkZ1|iIqIM+e1p^P z-x_qCO(JaR3R1Sz+BH?I-JgN42&=ob$a`AWB8sB(Oj`_;pC!neFiMA zFz)@e=WzLx-v@;o*sN0mh^Vfp%JC4@a^ZVWshk68p(>GzHrH65637)5GcYnw)o|WO z8Hh0;Ac8@NEFDF;JSTs-$P8Wsr)LbJTlm1A|5M!aq1W-P-+lxyeCgh48(yN?{u)uB zAox2HsR|wLMavM~jWO??RLffLj?;M_J2Tp3rgiN=;C=vC?SNhT{|>?-vxv;-w}FyW z@x;v+E`BW$kTYQ1yUt5eMxNOs+&HUVinnTEcy{s15Qz^F<0Vw})*MazgWvkeN>qAv z_a^{9dFctf>w%9W^2Tk=uv5C|W1kza8yued8h~HG=Jer$1W1^jI*niIrs=`C*$M}F zN`1y^n7r{s!AEc+BXvKo5%N)eM|q!a0g%xE(C{o&`ylu33$zbY9f{j*+n_P@5o&3( zki7Xp64*j7koBz~{3^-&-B=B?^ZLC$f4~;12=B%(VA?L-yDRhGg?y>smM*#EX4;G{ zeC8PU{pyq0yYj+h)g7l^V}SOWDjN9#rGFlTZhlS#L!JzQ)~B?LAC{e0s$JDci~&3a zah`&COoYJ5Vfu^|z%eGiK#m9%8Q`24#0j<7923r6c^$v-zq*d6fA&3i>i_mA*01hk z5vCRu()iy{{4R_&wX7**d5(|* zf5L{jS6DkL`5v>rup!Bsqqs2jJuqo^jspPd;G50#=I`Yp3EssHY!|J^{08M6W)E7oCMGHup!wutE+EJ% zj?pnVV(hF3U{wPd^ZE&vAZh`>@Tw-7GK(f07@Gz#SxJx_*J0bwbpT14+(B#Xfjnc7BNbvZ2_Z@_B&J4ryVLN9?% zj@I?|&z?!1-S*660Gvc(XOyE%9cYPMSDrYC37f1TKxUTSa=5@sE1j4D$I?*K1=d#}6;r|X-DazHvC^jK|q zvnhy+YnAG30O$;RM_&Q(i`bmK3q)%@1MNlzayIgI49^Rgo_Zi=5`*3xKe=@D7F{5< z;K_VGt^5~6$);t1^UX;OFo;0j!2Hm90N#k8utyES^h{}f27eYsbL30ss;q4-hPjHR z3#nTLKlZr@R+5#dpPX{$!W~LKt%OA21}(hkz`ggCwJ)hG!ciZq=JbQ1Y!@>iUqXo=KyhV#HWf z@&+J|3GS~VQ+3}IJZ(WRh|JjB0uC-;#V7vfe}ET0^)q)ZKxKM5c-()g`609pxo8?@cE#O*SZYqqNDIg!#1H5dhMJ3)mjK?q3?o zqB3gYI`%=2K9O4$Rf7l}2!@Xo+1`ekkv2*fBex1#odcA*d|LVC0nyQ>;;MU%2ZR0vLd(9f4ec;Nk zK8wqr{Vu|A6TA+oddh-Lgg~q+;Xql+Syug_RR6i!uT_6-X9b(MIwycd1r*F&+3WP`k)Xf))O; zk0YB1G-`m;>kp|n8e}ij8|#~yhwmi^f!a+{m_t@rvh$imw;B9r`s85_8l4NqwB&&u@yza7I?oG{PVJlXTa*=5%+%KPjK|;_raS)C{(~!Atv@U);Ip;?VoC$*EtQZP8Cb-CO({#qY1>G_Jt8FmX=XbRO$0%) zxQG}Wf$@}Zc<(Ft@PGIvJpV60gI9m=y~r_}a$> zqrY!0{+!6;aYo$xocB|oqvsR|`!kE;g<(!d+eS#t!_pu!7RNIFg2{*kiMFjPsw3F_ zm>E}SB#LFyCT3B~`$iy*`gxZmyQql14s3p0QyIpv2)KOd;OZSt)C*epD zU`liBxSl}}l)7K~9>JgiDzMl03epcC1T_&Ll>^K31RUDP`p!Y|)IkDFz%>*JPswv9 zvK67fF*VUX&T|EJ<`FRZhC;N3zOZdo~e2?fZ_x0rq-0v2IX z0b!m_B8PNPGLMn6eK(gD0q34U#s!EF*93%Pyz4iA9|sR!!;Am;qu`SOTIn^^v;CzV zI4KR;Tkt-57QX5wyDUIc)nncsm_0uTc3KDQU$4^7Afh7zL;=XO&00Q8t^HX* z|BQANiY(z3Q$K$}1P)=!^J%KWGL|q%k2Nwjwk+q+CxtiOY;gG#-^OsT!At+oPhva? z7?wM(L$i%AW?DhUu9xRj>dgHnCOU928jS#o&h2(wm3IV{JgHw`C(nSIjMNiBkZl3S zG$$h*QKA5?%ph6eodWao%m^R1$5pOKGUrPjH?3WZcmW)b>iOR~{>km(V{^M`0Wg5& za=_8i(cPZ_Jo4`MaK9-V40hFd7~2d`8jwtHu} zx830UVBawsqBii`gusXSYn7f?Zc*+t6})<$84;AGC=&e$;$LkZghn3K4YK5rqePVv zj7R!h;NA+`&%om@(XV5t9eG}Da2E2PNpM`Gpi{NGCq+yJLF!#!P!Esk_?hVMaAP)Q`X6gvh(mUm!VQ0$K>3R6E9A+W7E+2`jO;$t?; z(FB2<1mqS~g8hwZpwEcZmH(Wuk}NoF{ZC5ij|Fr>Ks*n`1N3;7+`;y_L&#tcPGZL1 za=`xn;_goXuH1VLH;-EsWJ;`Jb0U3fL>-u8URWll3(G$Qg*C>r&!=Ho)*VUWX1<>q zG9H=5P2E;N%Mn162!yVEuc_{PZhtE1J5GQm0U$H~FQtiFUjSM4%hrca_UrXHz0oJK z8`y39AyY})%9v<7Ctwc!57ck1&sha;Z5hy(z~6g`9mM_ZF_!NU&wz8EzJ`0g@HlAk z2I5F+#IH?EQ4)dN>sN^YGTXma{=xaH#{hde0Bs^L2n2u%55PMV3GNr|D-MJOfDO~+ z51%;-X*ixsAAcGb;NmdEW?N24#~I`3u_tieN&6#JtHun!!0wI3;{)D&t4W9n- z3p6a27Q=5d(Q^KJ4B~BjFacO0EWU+d^+iyKAT0F8oD^%wP|k}SE;&kiE_+@u=Y=Ag z6#WS#&409BdNJIQ|01Xnyf9>&QmC1HW%5JX)vVkeU@Cqw+aIcdPqqG)_NX&V{|?;V zv)&D90}HaZI&`>ZWhkbdbM27i5LS7g7`NCD&u~`mf$}n2NNpLdtBxUXud$cO(F}y zBo_5C`L&B>bxu$y)Z3{hB32w`kO{JAKuq&)jJO649(e)}{H3pBaXwCjNwY44IoDe! zU3vZ-_qZH#OjtfvjE|ib`sIdb>IYyIbyK>*>bClExWv*%;w>=gB#=&dIF1# zfSN1c?2$c7GLY6t;*>B3P`m`fUVDCdOI^Sc0U+}fZW87E=ip$0#qbVD0N(Y``&eV9 z)F=bXN}d}$35`H|m|Nkz0u4_hto|iHw*agR6fS^DXSHi>bC2QQR#J7nQejNj_Xt9J zU%>nxBR>b|LH6LOCK=?<=^a~OwR6{? zHVF1y*d&B47ljx6i?|QZ!~0~YCcE+gRPsXTO9StK4yen-JFZk=|D#X8j!VD#6=3mt zqHD+0M6CmN1PEt5b9_^R7(z&pf3E&RQ3tH^{xBp!67v8$c^ypFw+HO zxduY)s@!iJDoc9pZl8t5pZy@x*cQMe|r;v{kSq zqx&{hQF0$de~PgB=b+(DOq$AVM3SO7`qYrhUa8>*B;~!r$0NhO*I8%{)Y+3<%ui>s zUYI;}sVqt=h{Y77gGegG<}CwxkO@H$j|oY-l@$3)y8bC;zhGoS?WRF(A|N-aU@TO< zWPr9L4Bmz_JN6g*D>}f8cWtSLY{Ek3yWdV_<+c*Gco{Sb(@uck4RG-3*Ky%j9!FTb zF3is}sg~2Pt@(Das1St`B!l`&q{Mz?HLsHcdsy2xfov7X>s3w>*x&8#s?sC<-a6=$ z9~IScjMIK2*WySxc=uDd{1?8CaBeI!_nxbto6PRW`@jxWv==A?If0(~$Qp$X!r)yB z)aRbq&!w(!`$Bt(Bl6M8eRZp zV+G@)r~2#7Lbg3~YA%2v=KkBUI#Nl5LLG=eLl7oB`g6$V+GK>1FpGuG0y*z1Sl<@5 zZXmnhSO1uS`8_nGxiDucgRRoP)PdaXX9>cPNM-mwa?ssVI@Nox(%MDzkUF~sb@B)@ zJ4(Z@-T-@#p5Wr2{TeX5IpxNw@~=iaT%7c@{T``Nz=U$D3OO`Em=wV;nBU2W1BE7- z+a$md(Q4WsxjcXJdZA zGg~PM7$9H5QC#FD@UsW{uE4kk9{vdseh8wKnp!5(s(yAJUJ?Wc5&R_*(DdU4tV&X* zH&-n|y6;(}z-dE}uJlQ2`4@v0GyW%94j?Eg-?FU|H5YfljM_1GHain+Lk}^e4g^Xa z7#)75PG{^(;RR8>K({mqg{yZty1ew%STS=l(7aLM1QtO3tu+X=m6Z zzzYa0$b#h{jGz#~W5mJxp1|S9Uxh2j9(F)yJ6x4n_+AhMX$A@FB2PWtjL>Nl^h~PI z=c>?5a@{5hni8t^oHC+~fwu-K@%_t5Iu-spH4J%Q1pz z0m2$Q{8J!&8^BOU=uE}l!u%DE*Q$87vWN9h70^#m!5ff0ewhTw$4Y*Jtn`EVy$1T= zBqOytLX$|8MVA7o>Y;lD0<{6n75H%~AZ$Sf2tEg3u41O(Z&HB_(Qg;;fGsTm8~D}z zJd-%|DtvFV+F}Pt0=Yi?>~mN>@O@xR!5_@ z26RhHuhnL*xiFKblXq-GKR_y^PrN^O5&~ICm-gBmf!5JN@p(b4Q5$o=0FXtI1%E7? z&`xX7OvX@-=@Af*{0pBem}bu(1DzH(i)l1&j*o7&P7&_nrF|@xKp6P#4$p6Y0rAlbE$sj|=+h2?GEC6_^4+&^`0=j;yaDqXj4>JD zaA^V5ok(hyGvrVJiJyb%p#xsqoEx{lT?U?g7645G^wWuP= zM9XP%VnS4g3oqc@pLuEu@Qz(HOyJLnfSRD$!guk0rVesox17*Ho_Yy~Oq{zd0P>T6 zIA%$5-;z@bu*s#`FWJ1FZgE<+qO_G(g$gIdKSQD**I>*Wy_VBx3GL$Z2=PGkm)Ic$ zbAN5K+uYin%|{^Id(WP6e7%bkfUke!`Q#+FsQnZbckPL`yLZOxDzNW*?&X!qvYyb> z#moUre+Ul$9H5hg4w#FG<@?wQs1@)j{^-y>ccsH0TBf}wmeuD$y-o?|I&sK~ZO(fI z(k_8s@b`i$ZRyGLmZ06O)Umy?oh8?Gf(cu=-;+!w*R#o~8n=HJGU{$#fkQh~@>`)+ zvsu?(8bEu%!OwpOw0aeYW2x>HoW_%uMu8<+Z*&F`mAS%}EsL5;t$i$G-j9g^M|O4l z&+Ia%*_o|oOSIyuEfS390(BCO>HS7fWE{NzyV(E8Rq$p?sBiaAk7(EI1HD!O=EaAC z2blKY7e@-4w!X>y7u!~&&R$--jK`3}*9w?d0(BO0E#B-T0#9)vUI53X-urp}Fm#F1 z&iCe-fS>=346IfIu3TOsM!Yjx0PlJC6~s6(8;3AJ4{k@J4-ieyg-Qu#cUu+%3hm>G^MA>ThvGZqWg5Nq%;`NsdQ_JFp5y-|nHU zuBeZc&$E{*~)P73{X;&cs79)M&pmSH2!=9iJZ2E-hq8nS+la(7MS{a30~`pPI2yYe}u)A z5ph#*FG(lukh~eVcUy3!IYFs8)M^{kAI|mTCAH*qG`AphGH_C-m8U1JptxNPC#hjd z)})T3J-+NF-ctHnA6v1Acs2F=sBb^sDkUp&qTJgMmS8-O4gMh_o<*QlBaPdb1-qL5 zQZGOdk3#PEqmkE@tK8}nG>UyNZ3lCo8?azs$3YlO@b^l;o*%jk&y!F1!;Z;-7x>lj z3Vp;N?9@Z(a{;W?@$DiPbL|Y`ewF8aaMeqeknzrL>p>-%87o!RmJ)A!cz8Mzf=p+;2Su(0LckaHid ztZ!u}TN0WGjD+Fhi#YdZ{$vXLEVSf#CSb&tr$Sr&E1ES*9c0PJnoY&*T-W4GGR#Z^ z%w9uwf1q|cq4f-5O}ZwX2{eL1u*FxKToL(+02v|@d9VQQPmX>Zx+-Ns#Qe2i%tvu=nI8(b^w4tf4>cAL!U-VfSTSLj7njkns2uL z<<9(Tm=Whet9C|n{YUOYW9aWu{ibneqq5JD=tD4-QCH;0WAo2ARnRsFl(!(HG@n37 z5*eGok-uDs0G7bP=e`XrUr&AeSP}qcPQjj=or-0WklF$&z^CVyfU2G!l}nn{>$f2q zI|Oxm56r*4XVu`J|DCuFF?~mlT-yQpc*s4Z(_xk>N^<;^sa%XLF1e(uR8}T6YIRNT&>~I~c=Y@8Ja2q$EhjfvC*;y`8-t%{{?{4Qf zxRc!XFEnbh!SovO05l#pW47JRKz7==k6KataHmn0f6xk30}&p)ZzT+v-T@@QAuQ5C zj#vys;sUgGiRyr<)tH;|u|6U}02^%hpJL5lK^<-q5RTgq)(eiAtHf>~ z0~?b&t4pFZ)Yintqd*YILvHMG1eWiA4dK40fH4$;8gs4IOPps;Z2%Dr z1t%azPTKf6aMt2@`aPD{&3Xc{3B|o2o&SsKo+xgKv(M149?jz;7%`^r7iHj&;`>iO zM?f7H4Y`Vq+S&Z0*pY~&E8QuMKJ`6>15A7j&+XC+j=`_`X-4GAo!9T=%Idn@(Nv3e zSeP#7t)~}Y?ss(xoXogYTI43_;Bp=a=nChyyewzat|-xX2*mv+v5H$7_uEE^8$=rZ zCa0Ywr)R{-IDcV@d+uK#j&QjkcVz-_?ZyqtCuax?EEWp^*9Etn*XzF8QL&0T+!|^( zXCn$B7CGT8QaPHG%s27NIE()jpfeCHO@CL&^m+uqAv7189W5l|&Ihxg)hxEv6+nwf z1ZtbnM7@AZTSwrmh=_Mw=jQx(3C>;xO_+xs3GL?zTUrp^=l6oUv0~jR`0sdM54q(i z4ru5c=Me~pjMay~3Gm6(-udZ4(LF$|dBhHNzd>d+p| z^KBCVow`4Y*J*xY@ttF>{_FRM0^xu_3+ge73LObeFWRjfDT0O(6bXy_eu9IKzc6jk z*s;)%?Y7y1r2jk7JRg8)w+)?~&o!qOX!!s&Xw4u3o$o>03N%^%bj{PuYli*_Ao8O5 z03Oc+aW#urHk^{%nDl8cbXJ9K@4+!L9)4&a2M4l6_YOb+zVpP_cvuYOi>?+@mN)uA zpB;O&7<2=Vww#h|i>16W&BTGQ-6E_o@^^4D{)34e81|h7Xva;+^rOg~IVEbAxMB^o z1Hw*Z5m#N1V}C@x>}A0>$sg;%4#eNNd48v&p&fdLy&k6e>OECIM}l;&U&($U&~1AV zZIOE2lHl+bII;AEx6F;_Fds)?@xkX1F8(B)$5?`Ok@<~WS^sR{e^Dt%S=q;F!>QAQ zQ&kxnjmh;dHqTAu#`KwDO!vo%YD@v2nmKLB z8<5NdPAv{4{K~#WD;GOr26)85N1wpr$_VcCXTyvJ1UrfAEP^$2EmFsy0G{Hfhd|DB zN_#Cj3Gb|R6hk4;M@KVpZ@r-VRJT?V=ych2*V;}MD@(ES$*tc zFKKgBTAt$hih&Wug%Ud^4R)39W8`OWYx7@Y9G_0^Pa3Z3nFzJCaoXaFMMj5T6ZUN8 zogWuG10!fPLB%bwL^|^4d)HKvtwb|OKu}vEw=lUvEA^;y*3Z|)1?%q~48-0Ld>I^9;LV{T`_0bjIpckv6X#YC zpd%na25E>Rp`T=UCdmV?tdQy$tu%{hhxB?9sUS!ej zg(_r+#jM^|h@2dl&v{=)f7H(l{ImsTAQ&jz5)`RVa+=M*%w@;hY&$y}ZSNwK9_Djb zRl`FIPO$e-00xE+{s`glr9#S6qkB#gQ2O36)*u)o;wUTr^s_(!BB#e>a$UKSa*x{XV9@?elXIQ2))(8!?t3KlT5o&p2{SpD(6FAl9VD4FAgDAH}g_e~_V=9eF{G zh(TclIAZ?;Ph$1p*@ObnZDy2V``X(HTHfLL0W+2TmT^Lh7I+22Tw>p%2-FHl(Y#!? z44|&~6t#(f)mP#10C98B-3yxIwq>7akOSU!idgKOjs+u6vUHCS2XOV3qY8uux1bd55q68q*M8YnWQKXQtyAn;=vzG@_&f6w{J8_i-f4E z>?;yb`r9<1>9gdv z#28bs7q>GDPJn1-*l7nAWL?>+;byV2un9KTDG7qw-c{_q@1;5hIFm4X69RH=^sq=* zfXcac-I3cZFWR*)4sE}`!>6k>Ec@E<4Y`6XhB~8MJ$?bx7FZ%5&yYvH19-iUxLHN^b(Py!u5wxgDg1(Jp ztH5o%)v83H9Wz>=)ER?e%rJj>H&~0jnPl41^Oya2=hV2pN3(JCo2VL+?0v_E!ok}e z2x$xSziYua2m4#)!XUpu1j0jCfy0-o=!szRhcLCgDD7x@b0nr}jFo&IVq^pw5iua3 z!rU=1FvenzH4-OpfdIk?#h(dDBqv0X$i`$B^chkqJ*mEJic+P%mkAN4T^edp#j}ih%NGCrZI1jR#`H>OIe3ICwX(*4`RDWGIkk znad=g*beuCj-)K{{Pke(Q{sQT^>S+WNHXR%&b3g0TI#%q+=RGZfW%y$Q(ueA2yT8T zlYS3kcse>LXN(u%%?dFNZIJFvjzuqK{A=Xk^iZ&u}>+wD3%b}FTdKv+yRnaQA z!S4lZ@jc)5Vx9~7v?~=`e6J`6h!+4o^fW+eM_?`dQ;BbSoUin~k)eL1iaCwQ<*Ggh z)!b9hZGsYTMfII|0z6gWBg<+%ns&gpRzMWUfb+cczGM0u$Mlzxl7Luw3S1EiHU5|} zM>!RNo>xiJwZRRxC~2zOxc|P)okY54kE<^H zzG2l)7lC6U)N9-7{lbWs0j3?irEsIf8W{(~_5Kw6c{f>Q_Zah?bzszE#DQROBiG4x zoI5w*!yjH^+!$^l17Ub4BmiqiSuZjc!+_P^ejClRWNGJV0sR_saVp0*M zWor`lFvgc~uD z)ZZPY>kyCR$Q)4*4e7jQ-0h<536`PLu8?1Hr}4j?BKmfMAHw#E-`hc={hkT_$AweS z@hTwzt1kZ7 z1b*A&XVD^vi5no3i}df9`u&lyjuD%U4gQ*_IEqP#8vK)%y3j-LT2^`%oK(Q%Vu>sy zWK+bZ;THCP=6TO9zUfAWY0I0$9jQ$gX=b)|Zq4@8E1Oo^3>58-7&@b=)&!`nESzi9 zB=5maQIWSpL-8&&T0{O6Q${H^dx&TI(?keb)P&iD7VG=MGX($n&c&7%40VcQ;3FSg z;lf1}_@4v`bu{_T0r{q9Q?UPyr zfV=QkeVHuPumbZf+&KAfvEkQoxc7?)G=MP*lL^1MMs|Vs)CEi6cigSWbGGubYHHg7 z-uO?i8t%A^?Sul@&4}CE*hF^k8VMcDj4br%pRfj!?LKGj@}wPGaH(SAEx}(xz>!;o zMg9EnbHM5i#0Z2Cry#+lj?K~`Wm-0lp^-;s;^HP*NN{0FB0>mY;5HeerP{khsRh8P-7-b>@oW!q zGnnezpYd0S&JH*|?^^oX`coKDSyXtl0WMt%_{hfwjH91S3_k@H;M<-6fCn&-O$`?T zgdyPI-~iXJUpE)1Zgf!tt9U2OJEQiJ(`T6B$8BvgL}`&tLK2{eTc`g5F}{j(2fv9S z9D%X11v;$$w5_5U#?#Qz0wA=rvgAZxcP^IZ+4{3Bmfq{`sFdd&*2Y7<^Cq)%{^Y;5 zJhfYsl3lASQ_*cxnfCY#Q7mIw{mlk}6~OoY2o%Rj{hDLd`%e`qr`{@qo{B36|80YuJ12HQfCA{h*-(DCPhRVeer00PJj4yrqRiodkiX-3s$ri5|=?RPba#F3D{a zf!@|Rh8V}YKOME%$M2aSLZ>XO47t z$Hbl4IY|WW=`A^nj#YX}-M#^%F35aU1lq&t`WqPIRa`jyOIR)+1jnI`hmF6YqMz zFX?UJ-r4V(-)IDI@0;MG=cWLY>2WO4Dlr;M(%dJe&l!YE;pri7k|5aZ-P$!P?GgfNzN1{522L{;E@p(MZ~b-WbiJPZu5!FYGl&lPkDr}Tzz*Kv zyBt%&c{xG4WWCY6RxCeHef@D$f8XTCM^4WlF~+fct}zi6 z>u0EAjHBxNvo-{ZRq8m-T-1cn&ao4@yp>@4>G?4+U~%6ISUz;Ck^wb`csqe@%etIJ z-ELQU8}rpU?P6~{qey58#)UT!^oIzP^cI5GY9rk)wa%0@&HTsB66=!{V)SLso0!2J z^*`!{f_CYUANc1lZ=D9m2pk>-{QS=iZ8B$I8hR&;0e;~({~es3oDvOw8pU9&7E2uL z9pc8#Yv#anlReG%(F9mjQoqn1Rc1eW3Am}d2vi?-g~-?N=JDUdx%dSf9{e1LB9QvC zz41PB!e{GcPwsf3z0gQC`PvKgwvi>TsfU^N0a?gP=XsWt=t=U3sg3CWC0ltePCiamC5qDuds)f#5;ZH7vaW|P8JJA|7(hf&0#~;6#=_!Tnipm^e{Ky# zh#r52`dKOz3T?rd5fH)rH~l?p0#_=2O5T6DnwKXc!L~$XI05c_ z0EiY%5Tr2KoQ~zdGWPcOaJpXM^z77KV7tw&dS_f10x>J(fgOEdw%An{P_Cjuz=-QN z{}DFhD>#4d*D-{B02`+Qs1*i7PYE=Eo}6H5yapO_p|gNIq@h>gG_c-WD*;>d1$Mxg zb|OW2H79!5%LUC)?@!@{ZM+lV!%$24Qt0_030-NOGAKue-gR&t?tV z5{hvUQ4qmqN)!VEMoJLln4#4X%!3ftn%V|a@Fheh3>?4|Q(#Da|Cl)d)$5&_sk%_U z%Vbf&Wdl}ZK*I^BN`-=;t99voFkBzK=63QuezD;NS-0aEu``GGfMsoyE<#Rg|S((`e0KXwtBc zVW_=a<{~bHK;THJ|Gz0{0CT_s6VHH|K#{;Y? z4q&+Bs48fPbx;zsP9nf@$3=`bxHs3d0Y1GTW~XKZAW~mNJli#2gd zLo>0{I4_S`QS?`zMslcu{+iS;KY|@#f0vW(RssZ~ z1Du_GAFsXnU*gjFzl#06p8@j*je!NV&_6jPE;VIE8xbkc)&zlOh<~B;80Omx{xI{+ zO)pDyW~dYRyX3xYkA>E6+KKchB}QkG7v7S*L^0XAo63mkOUlo8cnqe~NoFTbVmm{S z<4)pg5&f1ZFwHBMJDBJ-6>iL;lD#4KNdR2EXA+RVawSmei z6gHcj*Ba<`PHc-nwjnylrRoE)vTG&*V{A4HtZxmI4KvLL>0S??=li-lKW^@Juie5t zwaOMN;Fteg!1?nD`sew?1qAG^-T?_f#0ZK36xc80O}4#SEpRaIB|yfhce z9Jgeo^@^}C|9tRg2UMsN2Len?3wICWcona``P;a7^cQjd=<{j!8Jn{liYuTKT-~5c zZjiF~c?^B(Yb)KBGM>u;@cQ&&w>HAg@sc~ie2d7*wk%E(eaS^s{KT*1v)jfSI+>%} zYB_ilgmv9XA|nzfuD;GzW8QHT+nz8c_cZXd;wA^ln5y=~4G2?(9XO=mKaKWrKyn<+ znc>v`k2F1Y;3=SnGzM5ufTTGv8F2d0lY~`sK+OrjG|oj6fw6WaYQTqu{BsK5GIls+ zRb+!KHDzeISR#=v8-#Iq{VBH}N`9N&>h_K?oIk_n=E{!`y(*G4Y7}|CSLRO8IqY|y zL8!bWKiE+~=wzLpYdt6VzW$0ps<`R`&*tI zrzdrz43ydk5`1To()O`_H^7r~8mXFw(Co^RV?*5ZorqRoZ1Bd7zmFJS#l`c#4hjn} zZwfgJj=Pn6JLzaeTY`UYZ3OIY5Dwd+{4f{Py&gSn-$#2l@Rs}C=SS^T zU^SC+@XrW9=)FGA=K|{C1HcEbW576x?NC~S5y^`_XU+kU^SnNs>?`%{bDElDhC^Xw zPrCYn0wTqd#uCLM^24cDFp&@mA@|ASgb0)|z?1-lEagfmU^*lVRbjCd1ge31WEP16 z7YPK329{ZW@*1-mT?3nhgsYfV`BX$HNyzd_(+Ul_CQZ?c#Tf3S8Bl}LVtEUT3pcTT zeuXfY0Bp9N+X*%v2|m4i^!zR#`V1v7l50n6PYhynC_z~(Fhz6!&Kb|5QfzIk8x5Joc^t_|3D~- zK(@5*odqGuBjEci3nGYokk$w6#rf(4YR|rtROYoRi+@R`WtM_HC3QkX5cWXSp7%^( zTWl~~xC!7=cL7lkVz$OTJ0tnId}ZjW?mCk|#&h>|4Ki$9xK<7F7B;`B?4`3eGdp{4Z%~&+@~qJ@68DEBn8k$heMnGsLDf+)BLkxv z1Bv2#AcP12BNi8L>S+_q2N7?LMd!|5k!ySTJmX{U5&)g|ifkqW&@X;~I$`a({*evV zMx{_SU2;1k0PC}WlbZo?Y=dkwO31rGy9Iy{FPH?Cpaw3HfhdZX@) zY9~chwMi4;dEWTJnKhCA0h;}~hxO)py!`s#!95rM3eF#W7QoukiJlM0v&Y%wA+n0@ z5&!1m*|vnhA^=|XOr0Vo(2PJ2?bg;K`<-_|BYH0u{UqQv9==1L1j;+U0R~oUAl$0+ z>nzq1S6E#8rfZqeX)_vgIS<9o%7{Qpyf?%cGK)V!`rt72^%D%k6sGP2rFs8I7(kP- zP^ip*N(n^FizJT(ibk+ktuadugXr^{(8u1KC7EPhT5IQ4fT{G6#ed4tp_(AUatj1E zM9$46-QL=HoaVgg=;pjugu{xr_sOxeCh~8QGhxTJcMg^FNWL~f?}=eGTmX^1P!CFX z3zB3BoX+ssDdF^HP?`fx60k$(q=yECZZhbf*au5KL)s52++@jdh%1{9NsxHmcw#N0cm?yCb zvRtYOoj?TI2lEMDedF(8y?F_jFZ?<}SR|hW2OVctngHegE#x{Pn!RwtHh6xA zoLR1~R0%Vy1RxKlMd4aEt-VlCfKv4mVNBAtAteQjI3;I15d}kH!;|Qfa}xduoTPt= zKyj=AR|VQC%q9IV*tFR!1H0Uwu0tZ(2B_nEBoYjAAfYmpK-5}i+x;g`1Aq!^J!>F< zN$3y+r-C4agPRBo?5+npgW(4U4WQcPsdsj+A9Pv)s){#Bfc&{!8l5&_Q}uSn6?bYQ zq;q+4GT`i{JQp(2MLV&z<9p1(|2&hN@eXmsOHwu);QR&PH+~bibUBg!%)Zn>`=&LJ z3%AYY9gqN!IIK~^-PEz7gC*A}Zwd@Y(NZbcZB~I?~QTk2KAp^+6;rJ5~NO-+OkWS{?&91CNXtCf78w zXp~F>xK_qdOt*~0x*ViQZ4Wdh0_p&UX{-;4B*dcJQa*4yEL)^G=qY{NWv{$x70onosSWH1&p=5h*=Bh2$ zLTpl3v#_Wv#sCTjIKK6DtY3Z=_uupH<8bfYh9sm zS=k&f|cUJr;!AZpF?< z)#8ySFS^Gmmc${ZT|WrhY$`@IwdD{B>`#ryMj-O1U8J0HLQg0M!I+Z(PBC}VuxCjv zO3BZ#e}=F>V!XAua}zh-zPvocAmt3`Y(sN!xtt)#fvw>jc8Gz@yIf3`kT~5D0t(@&K(}%#_aOEZl-Ez_Fw18Ta8qx1N)oY&qDqjlbDH3LcH}Wo@y;!Z)fwKO=<$biyNgv zAdWy}aNq{BlssBitth=y$r<^=2gyM?#xxojl*X$^V3CL|y$c@tF^bvxZKp?8dKA|K8)T~D@XyrD4;AEXF*xOS=FpWl% zbOr)}7H6P?Q}ESA(|+>Kd$%SL)pw5+$UxgGu;l1YrSE0}jy`~LE2OzS$3fGgA2?-^ za(YU*bv?z0EuhZ9ipIJ3Z!#V zwL*#z4ijjISe`$_Iv#D$`?d%JIZIVP%y0p^!K}wQpq;v*TI_1B0GSybWCv-ubqt)| z^wB~Uh!ao#L0?Aql{n*Ivej z3-=?IZyL*-v$vR3Ps-$FxniG^fC&j0BbQ1KlMLc-#U&dm2ggCC)wQuvIJS#fc&AEkH8xG7(C9A|N9dByQJ=o7%My#pN(B`dAE#fFWwfx~XEF zP=K;#B0!6XaPAg>%QGr5K1|=t&BM6$c@@66&`2g024P_1rq}orz)uh|1g);+Ekwdz zf{^!;I083s0B0w&AcXG3qJ0oEW@Cqa9ox>Bo6_JduPLvsG4=d^^Vd`5f97W%>UFjy z6{%ei0sGS21W*tDT2kEETrehDPVEr z>3K1|4+G;krpH9YIN9`aWQ=ioU5<=6#(G;Er^ja7-pCloh%rWtV|tyD)oXDv|B3bI zSS5bdytM&Xf(V`k-VZtHsL4lw==-PJhA;^k4MV^XsG;BL{xDTw!!V%_TPrA@$Iz&*d!SwK15H;-`=)a0~am;U-&KH;fE9K4@VPjN1>ty5d^SY0++A6 z{Vc$@Jps6IZh>K_vYzrSxgV;<`U>5p%^a~8~QG56lYK1?fgdk9uf<4thF9Uw9=%=J$D2RZl_~q-Eq@lhZ z%0vREqyW6c=K5}!Em6Jn*;LgU-a4v&dZb2X0QSMYzlqXj^DReqGrZ}&7YoL@ z!y9jV0`RtT0FF;iuvn~cdd3)7&u8@}-MP_cv<({hJ7X9Y6DQ#2O>8!!b8@A>lz6&> z_qb$0_93&jJ>^S%`7@@Xi7Z+p(?VL{|I6N=Mp=?w=V9o#PsE*as>;e5d#Il0xf|%l zKoA2#5|c!&_e4_G@MPIsltufkr{}l4o}?d-@~FY4^kmwSNJ*CHXKErT*`y?jAZ3aq zL;xgafIXwTfkuy2T|*9)nfFGV{eGNtBKDagA`2*p-KfM$bmh&P_r{GlarWNd{`U82 zuJQWWe}eh^b(}i(F%;zt%!{^{nT7D}m`x6{>zGULnhqGs`gejk)X@X&+?aaod%dm< z=b?W}H1Jbi5S^8O7j$`o-HJ@49ct@NDr0(C&mavfTgI-3zG zxJuj4qBzjWcWk7ZY72KO!Ch!MH_hlE+0j2s2yC1Jp_&)vW-JiR8rF7Xuw5&yNUThF zo50^x|7Ze#lL$ZrXp)tBD^u*l_Fg&$wtNcBhI^o$(2%kh$oc|lcRZGx0c{)@p-bpX zQ-elQo4{o?Dlo8eO^l=tTA~3TfRi+L->NqyQ7!*WXY7c>+gvHrAK%^t=DU84qLO#iEcj9p;D8bw&0XsW8SS%L)3wzqniLMW)l8i*! z$ef0fh=bRXX^T#*VnWxju5~I0(HQ41{u<`&|3QNMLBEpr z!b3%HF7vT2e*@3fcPK|86P#6FmU5ZrtXYu>buzVB#$4A1xe!CktZNS*;e-tuC){!* zvDJ;BI@2Eo6~k9b+;;(ER8uP?)G76BXoF z{T}Qu*#9or+o0nre6kY9M8V%BMh012aR#8YZi2to>}RxO7~N(Hg4_4e1g;9`ouZxW zK$n;3AZZf+zT&`s+KbGoz0|)kJQ5%wkCdhkNQ_A8o?#~$MM29{%34%Jp)ygiAF^_QWE8FJYOyCG7^IxS3Evw z+~i@8b4Oy4Ln@*Jp!k@hJe0mQ>tA;qhqo-MC9p1qE1odO5pcb0eaYX!$<(_3K6Ata zXrOHzI~rswgcd`2efW^01nnS(zt#*K(p!fw`~OX@49IzaCpBkxA}9^NV64v z6L(c}ZIvZf6|Sm>CHE<1iGGBlFzCQYncltQ0W?s*YLfsJe3OIzo$!&OAc>%6vcLs5 zRRBDnK<^e&ODhFZUDnd-N{|(jV=GGN0^NF>=N7f6P2l%`+eI|RV(}Wj{_@|#nKwRZtC%8}VR+_oNEcR}<{3moBiXP( zhfH8i_2N5nyiOiNZ_&W%#39GDzM?l+=qFA9_LmHdtl=^CTV^~*|25Qm*g$UApGGs% z))MOwk^bB|)6JS|CkNV~Z+o{KKBiG?h}UtijV8&^_9kaB#Ski=rHyKwUM73<{SBP2 zWY3>G(jEy;fMfJ4RS0sQvP^!UAQg}VmH9hr|EBQT1|$*&hiOoQqgR(Es29p}Yvg2` zFjHhxcjD>zA}Jg1NbCxEfj*>yAjii+sic|GYuf$I&L*&VKIr%7$aU}$s!j*qA;SE@ z@#-P_eNS?xHBi^U1NQ?T{GcJ`)m2nGdVic0wB(*zB$230XJ&-;P2U1gg~E6&=6gfC zs$kVOdgH>Rle^#|uV-MD_6V5GW&jj+_bw&t_T<&eRqz?u-mgYgz=+lHYiGpJ8VEFb z^Ez~74Au+0{ObRT`TlD-b@HQ7Y9y2c6UIRUMSuDr%Fa=i1GEUTYJVZJpAiQcOlZ>m z*2Jk7P~6kH_!gl7jM#mY>KRatplP?Ma@$?LU9*M<=%t+=a@D>*`6+ZL6$_&{$n0kQ z6_k_TsYP1=342(JU1|c9QohWorbc5}ldIp|ao7^o-Z&KOnB=tvsHrL&;vLXb<{`~M8Ks>mpaXS($zVq-U&YE-(6t2vFYG7Thns|I65$zlPJ-{1Hs2hfr%Rx|#ivs|)TY%F7(2W{lN<)&XTAc&Zng%^Rp2 z`j7DZ@HGQAR)m;lRQ;|*8z8yD7h^zAtk{etagz3t3yv$o#(k27Brr2L<)$R8b;%|Z zjo=n*XiN5Mu4&y`0eh}|B4@9)X|*ZggGu6K`~Tv`XvmrN#NfXPDsBH>HOhZVkolVL zLN$*SL{NoG0!;8%!UCC;ZwwSP^30Jt#KJbbS($UC6u?@6mA2+bRuWhl&O^O525JUI zy73I?TSydufT81MGU#%WHWdf!E}3BQSl@0-lqUMQ<5?_Bzu%GlEg=w@GQ zHuAB~&gpZCUzoWe+C)NOimmO>;;UbK9oJp+Cvj-?w1H^5ps0fs!_?is>O4-)k2G~9 z5?#mwr8c`v1(QVk6T|;WM*bD7{!@9Kcg?F2Fkb>D8m!4y*W%M~P*cculhuZ`UV30w zV)vtH{Tb%Bq=2_QNC0s^qN3v6C60h0o4HO~BPUog&b zd{TY?)Oej968t;zfT{wPXTba42i$nGVfyD#nWW@$@JrVDR)K5T$wY=Vury;#rwpbm z9-gl}2ViM31}R`PCaZGh7BB_Mc1nagii45(f9AN6#om8q0%4?sS65b1SXV;Vw+#Im z{T_dsNy6@b&E2EzZLj_8H$_b0@O8*mU->8c1i|*XN-be;|0O*4wZDNgZ+yNXE=7k- z-8;^KrU0n>4jQ5`n7bcyv(Pjwd2e;u;S-!FQPnqnf0+>E^aQ>Y)juPv9NipHtw8(h zZEw*osRrC(NA|O-d(EsrnwkGr1W1Ykali)<9D+tOK=ks3&VUZ|0#GB+6_9)b3sH;N zeinj8nvqmgBW^=K5j=q(ude; zzwky&_VY(mWBhw)UY*qg88|kfFg)0Y$-!a)961bp^dmO-@B2Ke&;*GG?2*ZRjbryl znIA8&0_CW_!j;IkDFM*-CYa3tX4ULvn*EW!R4K;+0^lH#)>aZ}l9&yYEM}$4vc&4@ z3W}m=|5mJ2mdd=YE|CN*_|lcx7FNu5@KSqe9svg!y{A@om)o>(sVxV(ZnofxP@-xF!_P)PLCiJe$w&IMm?&>zs* z@_P3S6#GZOnk<@Q81*JOX<7b_;E!g1Ct_bjh($8sNda@i{Z+^?AH?h8WN!K!$kWA9vihu;3h^QQ9G zI==6{%A67%tPV6F+#{R)UplmNVt*9Xzs__|8F@umW+UZ$`ZVwdJ_Z~+ZY%$RHBh#l zp!=r{+-J~Y!&zC=D2gl4i~RSI061Zu*_5G3Cn0|wjRAE-#feeq-fE3mLy;L19FIp{ z-jVF~hZwTAI;p2;#U3GxAqjw-P(JesT;RO3R@<^*YtK3YP~g=w{~XUe|MxLp>_8Ph zf--m+ksn~Y{!Rx$lX=+9lFA9XS^`}v$IaNE%50wGS4}yI-&94#LvH+@n@V@=6W;l< z4My5K1ZZV;11lBRr~qnT9nkOlv-n+G@i%KJC`#iB-ktzPGv?$Qcx?o<2alJyN+5^-Ee;3Fh|LcFd(L)s=4F;W14H>b$ zw@iYdcb8CYjjZ~VIO!ylfPCz2bkAaTR!0gJKEkcxtThxcHpo8ioS&YuM?Z8}jV zq&CsWW`%G7<-g25murz~vAz`Y#TjKDV>{!2*PUj}Z)Mf|oI3_i?PIxpQ1$PP?z}7e zJXHXP4z=UHZ~6oPAk>;MnF2*A<0$#nB*m3}yD@agWr~|Ib&9Eh&096HmE{#oCeuVk zPqE%VVoXlXV~2PiM-Cw2T`d<2`)Y2Sh7_WFA!xW6SaOC7o1endU;RmJZ@-K}9Sq*@ zdoFVZ0q8&zm~k0`0KseKPz0Ud^pa%7)W5}ORo}!7U&c90^l_s8q^qbI8rWL}>Lt^A zmO)>;F+P6|AMB6(u`DZWP;dJ8&No0-S}c=Z8OVj<5DR%<7yPX;5ZC@pzm(#pAQC9Z z#36)8shRO_+k=5wj|EQ4F74QX&yC6JXf?JrR z2>TaisCUU;H{G-e9U7v;`Ntu*f@}d~G&fR6K+-5k9RPlp21RaILILxA;EglD-lZ5J zjJB=;#%#U4`9u<#bNbf#Eg>%S#B0{Id5^b00=)kNhWO`#{}A)OE@2}Yc#XrNU^)d> zR&>+md($TXuFqc`_V-iOiThe!nqq0Tln}mWuPwlV z`H!C)C|{*bSQe)am_z8NqnX4A^aD7&(nyI;kVU;XQN{f#f%+30k@>KqYF zTtoRB)g>j&iC*G>O(zKpb5GTu6Fs4PMXr)5_^@?M2dJ_-tA7Z&Ux+Bbn1ZTh=*som zCDa}yRN_JQ+yY}1z}Nh@Fny9A06|>h;GQ!7SIbrdg6B2gLi8tc(TLBfC-W=RKnod! z8x4LT0^|sPK{C+j|2J^I3Hk+!WZ)-}AT-Z!rUoEX2bJHhu+edGeg?ge%yb5-%KDIT{JbvekRoH@d+v496L*lmT!z%qpO-~e*K9v`mj9XOB}jkS z;)O$G8W@$p``-&Z_D)zgOuvmmU8ZE2sy|hHbmj1Nzu8KD?@`(1B(&V{$V47!vNRR!s*)A&_NLwci&^C7{VF<5C9JS1bATUx$96lfeIekV34xyU3KNd^S7l1;3RdImNW{Lsg4`c zQvW8LzXJlJ0U-dNKw!TT#vOo7aH2XnX%P!Q<93wH3Hj_S5W5uejc`n^BSP z*Q_h;kbpXPyjA%F!U+L162D=Umz`UdEwZQuKuuCW@aOeOQJ} zTZF0Vyz^>hB7mDFC`yIZ^QAM>|563f_YJC-W3RCT!;u z{kA|$4rr4FEp?1#(DVd=T1LNY1r+43J>`sjR3HYVEO#JK2K1|YAKq`5V4DQA2|>KM zE23yzv>D$m6fVB7hP~HDpu%`1n7JnwQsIpBTyPwO8Ck{Z%Mz&~>bbQjfdVLCe;;_` zHKXi@972)mN^<_mL;b&)(=-3!ZKM%c{dU~$?lr3gaQm&mM?L}^UNbF1(fVuS^RRpZA3WhTym=UH#b?3JPD3tFMbI9># zEvxEaWqNFCvx%&(tY9`B`x^f&;C`Vpm`Xi3to%VS?9<%w6xjf`20>~3l)cyPYZaK( zzfd!5?>vRapZW>Be&$IOrKku(cvhhkzKx*z1DFU6e%_FrKn+VQRJfda5|EtORP#9p zRQ)=4O~?m++3VrkfJqhj(lW4p!i66&$j;XXEPO52iq+|F82iE4Xgh1<&Gi9^(L6@L z?sxkBUXrPyB>w;jLTm0CN`fy1iGg+NgBP&LANg~JJ%wtFfSLrs>+efpAxS1~tNoxH z@cz}J0b-Mu=>rj1k8tkGE6|n2StQ3o%=I)h&#*t3P#ftSKg~!4hiknPYDeBAh-|57siVsN8V;M{U>ANSSatw-YF)^A6qot z!^688^54gfGfJgB4X-zS0#H|rwgS<>>Iz|0N(j-dYBgw9ga;@}c%&pLw4H1v_`!5( zX$4D5%a+C7mYP19rJWX_209hVNQh4`CsJ8|_PViomA_{W#sd@m)zomUBy>TeP*cno z=ke56|3`f7#ox5>WryBBWwPQPbuOax#zOUmg0`}!3fS(M=pH)Yes08M#3D|vO z37gN%fU<7-|E+DgPYQ~YfMJVqNDNSv59oakoRSx?c>y?g#*F(B1qjoCn=&_NPr;N| zS1=9NP-qaVk-o`tR>q48n2dlAycc-KJ8Vp<{Y;B<6FSJnj7%#tBv`8GmQU_wnt|yO zaO4;V$MP1?0T_)ZvS`IVpe>1iR1SkL^#=lGuaupc`bo#dWp)8t2IQ!HJ_Rj%CHMFjU zBV(%q$O+)w05LKl=q+Z`q`-tYmr4XjqWq3eg-Hg_p9MD0`CC!04M~|QICt!FJrR&W zYZEO}@*)3hKO!Mv%xuJb4j(eges|pyYx?s6N0hUOK<;zs^!W(aTCIVj$AH<48xx`i z6@0TN0O!wdH6$PRb@;Hk`TftQ5}PfFg_9HEaRE~MRd)tTmu!45VCr^*X00(EkFc_` zin270dp_I09ar?2*ue&z%Ob-K-Ny@ZWIs_^B&Dzd0H9$dw?lA53aS|6wKM-3Uw-m$ zVrS!dZEWM}R`q;Bs^bqW4x-pIxOlir!JfP{;eAJcNNRimI!kA-N$q zT?d~e#>~)l4dx275;3EZhQM~^e;>pq!h1%FN;D=oYzZdS?^1y>mGBC6I#n8||Mgda?M*-V&r%jR zt>72R{^kVD4uT{cgnPq&&WptYxc++J4}J_dd9Beg2;*r^ZaJknK#7)Xil;${ZP>fe z1!gmjccm(d!X$#TFtqo3ByL33o+Ppx z6}))yi}=#x{{zmP{VGP~fd2m=LH<5;Wtiqb7@$aJP=Ou@z}p;$PA*Uy1?j66bl2xd zC38aB&m@>;4b*I0Gv}|Lgs#V6T^Pt&a%I@S{c#hE^F7rtm`g}Z#T#jRZ*klx6C4yB zp&T9BuAms2Cg(KhZ=%$w?g?U_64gJEM;wen{XUq95`i}8`@@$P=ce7Fu=(;7o6i-X zQPl){?K!__ctm0j8sEf1%7XiI*N((fb+rRBGTN#z{r)qr0Q0@H7Jzpi66QLW#f?qu zBb*76@*;RB8^_(I=04O0;=kt}tL(SdlKqD6QA1mhNoDteTciW0YYiMeV&?z34vgf! z4Q_x}JOQ}>uG3gpc_kN&6cLUbakI3Ui%}z8>37^LT^VN^AX7pd?C)1n`jmj>r4>x4 zQyXY?#`9TL@0_kCkf_v<_5f&A)i~4QPb3W-bfdk|D?dXhiYfN@U&HS`^%MBoH$G+D z)|9Wy?m>%}N&fq0zCx+rRq&<5 z){RejShOs>nJKBS?veJGgO6YZt2pUC(XJn;0v^q0Ad?&!)OUF$##+)#z+m`N?$sTGj|5T!S1L6I^8(L2_tSXdnSX|=s!nYfaGGw1`HnF9HEbaqL8_2|l*_T7@+8OlVs)7aKj&1K>H|Ue;(br(EQSU3vU%3_v z%9v=eNdy`h?Tn=yA!Aw+*>ng`kj7zSbMjS???vH%JV&2(r$T?SA<6(hX#^8b!6KK{3`eQ6U;f5IctWp;sP(bwC2Pyw(5SHYjbo@T9I>QU z)d*@q82PlxD#c2aO*KZI&c=F>Vc3vi+sBQIc;eW93TyXj)2#`EZ z@R$3UsXVYHkPC9k>iM5})rk8f$6C2Z?mCeA9!jX?j6FJc+}B>a3;8J?W+U!%;yCcJ zj{-N}W=8yU&~>4dL~=&dAVv1e{T&YxehF=r?axI4+;EfmuPoRaY4^8+65u-?c@Mix zh6J9&HL$V*tRAu+;)nxwqV1U7lR2~4JjSUY`pFHBz1}{Fgu(@XwfKp?E~fj;$_jM2u27QD2f@*o&Ozt;mdy& zZ=8G4kOL__av$D+Nr%4yZGx_eP6{A2>iI*@80DZm0~Z`AQ2Gle2LdD@5+dQAoPdRt zbE2K&U}Rm_&|G7&$JqYrH7Ixt=%PUYm?>IoKGGH5Hxh};B|a2r#_No!3wx-O_E09a z8=OP{>|@;GqM^E^uY~98|F=qktt%j+{=d)c=iZu`qqdB!(H)3y1X>t%&8V56N`=>7 zDDeEp0gP&MtsHsN!T&aqYxk9a3lQAgI@2`{mmKA=jJOX`J{Wi6 zKimV`b9%qdB{Sf-Fv)d!Q^h=M)55szRulX;j+%adREcw*r^?A5OSf+Us5`lg#-J0Q zr>=k#r+_0H&Vzvc5mf?4lj)m30hsUa26j3A4txBV!l)F|qfTGE8F|y$Ofoj6;7pb# zZY&+P5-78ID_?ZNzDCV82!!S36-=kIfGouwMnH+mz9XxVoC5Ynv_$X^+5%y(*5?u+ zJJ;imt5h@W?!JUCeC4m=#czBbsRZ<(@ICdg>3QJF^b8p@djFc^Kh+)LBGhBrksSL8 z#{VQmA)Nd7tAE|L02-w{-TYj0+e_A(!MX-hh3!|Cu>0z|b)+-z#!Y1{p%-fAhC88H zk|U;mcA``Y;Rz~hZzEN{u#fiJQzXZ5!^_%K`II>Stvs-g0Epn9fcV2pm6?wTTo`;5 zK#O}%v$axyAzfCr!WVx|WACB{qe87sqNZ6WIyxjy3OF=#1VMxwXzNRVe`bOPG7~ZNT?_A2693rN0C1Pn16% zLPu+a^V6SR@@cA=u0Udz-#V+TZ?^pxVDdFhR!t^+0R_+Os!~s35 z+*5`S-rs3NvbhpRWzV?74EJbg-+eFW^)Jn4SYBE-UfIrZO>?>@oT}`RGEa%geO?lj zd(H6giQBMfBGl!+Kxggwl> zts=nW*OkGTstm!}%MesTsnQ_^oUEx^dP4pp>EJ!vBqQZfpD(qzuk7{yKEY*>L`;8( z&wOj+d|1^Qa}97o`0D2wFZ{bXXza*;wMo>RMYBNIL^IF3@*HdcLpESWni$vhRVZ^0 zyz#mb_mTbnzIDw56Ln9XWJp4g5$wsieK!bOLfmIM20rk9;L*p-XG^uqdlM5Lwl(xg zDj(DjKr?W|Ex_`M5~tbJ1e1`kO76VlkoB-*;;bj%mP#<~&rx${n2_3QM0(_5VM zonNm-=A!{gdH0_8WNSHm`~-0Ab!G(6n+gjKfOY-mPXM$vS*AoAK-)k>3OIF2p)3hp zvj_ds&uPT{(pDXw+nF>B=67{(A`XLud!+ zs6r3ln>pP$i*yP?w?UCO#Pj0}vOWT@o%y%;>=%9l=P$mDqC9xe=Z+hLQ-Qzdb-Qjb z&6zg9fYK^bH>3Q95LPMCMv>Y)Bd5nU;nI!WZYv_AxrVMQXg2?T^-ELipI=6yl-0|( zNPyQDkt&fS;zOG(beDkaRp1z0X&yalVq9Zs7N4;puaudP{LaUt$^GvklkO8jfVH|R z&Lk;Mpk1VZ-5ucdmx0~ww8;(U1fRk^kD}?}euz7Rr{`1!Lufsx+rey-nj238fA9~O z{`q{rd*Yx=kcSY<3@0@S5~Nk?nhN50FKIYr8ko+2TkkNWOirMna%M%*TfhylD94R= zc55yY5Ti6>HY1!op&C7N&79G9mSarPr`(@e=BD===$(h@n-{Hg%czGRs1wF!o^C)< z6j)tZ!)!XW?Ev5EH-_*z<9wyz_4+-?s;vxtX=L`M3c^uJIdkeKA??l_`N!BGQmAEY zZa<69eEzTC#h1R+j0qkD4WJIKat>NTxg>z78`ASkQ3fjg5#r#r)51aTJ^A4%QF$S;5hnWe{@<`Y zmx*jo@@x_;f07%Kd=HW^K6!O=`*|r_V21PjT9Es~pzi{IZAX+VtxW=;87K+Qe|aCD z|Je&DMrauS+>CK@GZw71_TE(^CgR2=F$?}BN5w-*`L}C?b@PG={)>GZWHReA)JI7U zws2-W1T9uMl@+!clX^B`%_8!^)a_qu^Zn2Rz=u8rEG?VLzq2Dk{Wqqk7Ec}LHq$=f z%smyh50p?%z5Px@e%D>7i9KOTy#+V`j@Z<GfrdL?=p$TBWD1^yF!nBLCZ zCkyqCBudF3O@UaA=LaByHU$Je@_W5q>cWJ0Y){tyI@8l{d;J=95d512Kx@>Rv8WjH zno$GT*#dt3Z(hLuwgwe;@__|fBS(9Mtg{n$N+tfu24z;1DLr=Y$@|-T@!ac1+(+9) z`k)#Da%tuyNC;`Be#-ERs5@|m{#a4ZpA6Y=R08jP5Ad${nAdbna;4fvI<2iFkq1sAX|@+61x3~ z(Ns>O4=LGKhA-dhg__)JB&rjcAh@4Nl^`NK^TPiRpZn53zj5m??~k8CA_#XaoN<75H~Qe*rIlVHf2zL<&XqZwZ0gkpZPZm}D8~G*;1t zJ7-4Kn{}&{A;q0}1-N)FNN@vg2y`$C9+R)+)VQYEIcV)FW=gUEq;U_Y;M@`sy$vLN&QiATZ5t$zH4c-4<~=CjCa?rf?C-sX z4oWq}%dh<^KK+@$h6@+YK#Dx3fP~~t-y!_NI&set29a!BBA|w-d*xKk`X;n^0JlKg zUGaP{2}FlIet@6oazxZr1+cqW%CahWBY8~z&aP4!S!>$U zHQgxFX3s@3#SJFe)$>w(_rP#(vFM)C?*V zp8vf)eC{8eM=>U^#o;8ub#2L;vIx)`k$*x`xikJrXKGc-v;$ND?CqNQ{++G%l7%@1 zA;Y(&e(nF>>y&x%sPjSn{dLJRSS*0+uQO&o*IaLs0oH+Zv|LWyvBiX%2?I5Wlbi)k zx6h)#)ouG?c?G!h9wSX068nA2Zn18NK*d{t1MvDAuiMRth26L`#PQ*FZASx7pDv&j zS|_xiapjwq{%h5H};7DAG1AT{L1e|$}@#^D* zl1j0YD@Ze(zzw^t_=yq-2SwRctDHu$OId0_PqiCyH1k7=1igdc>ocQCOu4YIN_GDY z1HA0{>)?0V>;Ko#SZKraH?Y4(Rcq8x*xDxi#!tPD{Vk1RM8aZB^!z;%ufP=qIaf0y zOKIn@)~6u2ra2ByBx`FEc+HvlsP4d(ThG*0>2f-L=B`=P%}C(zlxg3&$sK3rbMHOC zhdvCf9yZE;A+iwV@WDOoo$U}2L8iBnKLx$LgHQ*6lnMT$5pd7_rte?ZxveN7rWxtx zp{(oQ&k4ZBk(>Q-25vKSiDk(XQfpvst-y8Hm(2o!tdeAv(iFdB;J2DR_}-z5N_g`6F!}8LK{rI(qCUlbc5?TSx@2Nc>ai0;%*9%u~ zgdp@K4PrwpXomUX4SeQ{|2>|1_BR>`pLx)|mE8>Ja#v&@^iP6xE;gm4ZEqh8$Q?Hi z_iZByGME*=Vl6lUnge*7n#pkna;!QbPSDZak%6)4yacb(?pc?OaH}Kx~Su>wSM&23+Z0x7n5Z&zkW23;SQ=|4K=P)qo zb`H8`A+_4xpl-xZMl(-8Am9ohxEKhl5^>`rX|EcpNtsVLn=WB>WerLd9x;+R1^>r7 z0_`Y~pJsa+0;$c2W27O6nE200kdY)W0t~_!0ORqeej1|%^04mDB@)RT^9E;9$-slMo)|&+2^u8DLmIP}&)S+Sz`AH!}=6#LDO;Hf`w={n5 z*Dm4GIl{>DGq`cgY%Ot`H7tX^fbjLLsMhELtdt)LM=X`xL-^$W=cevRvkx5 zikkiVy*21T(7N(_{B0885(3@!`s*4CU1L#eBlD|G;9qD!s}i67#k2U_&z?asR{nHD zvTloswH_}iqo`3En@zGRdv z7O<6~`FLQIW{_Q=n+vgJNc!I$2;bFYwB%3p-BXHcBlzeyx?K)M@t?d?33UU9?0R z9HHr`vKPqsdVw&J1Ic%x$s&7>~B(`_k0A43U%Go zY0#N-pMp-acp*yzJ_^WGBH`t>4{s`bqXVEyg`Kne_{y(r;-2qc!EB>IjmmHWZ1rrC zf*PdS-H%!vzmfi>V5E?!qiYfjE|bU}T92LTjI^v9d0v(#0rdz;V!5)67ur zaY|s~&G~Hv_M@;t!;bOYqU&zTRm!TM9;65#R0_z6yZoA z2ibcBk@=2lp_^FfV5C{2C`LH6b_nC~L?8j|^8+|NKg_bNA!qjydm?BZGu`6gPdF|#krXfr%a+-z9nPZ25JQ;$ziEkx`@!{!H5(go6U?>o zQLs}Jl{PAUb!~MOv}5+0e*dB}-}Bl){_}-#`CBmI)4zBYpZ=-W%~=_#7A#S5w&=+& zP=+up1kd8~bJ(IL8)0^~fY)C3gFmMVnM|)cnbU`Ar#asYN^WP~@*FUB9~DN<%;&B< zfDeDfK;^06Kct-)sl4}{TFzAAspNM^f@9B5RT-Jzn{S0DLf2!m-P};^9KUk3lSE!q;_ zMTVumguUHY@#)X~Wjy`tC!q>>J_3z%Aa$=kQde+MOJY;d9#7>boB&;v*u;oq{eMbr z@^Ve;G~6i1K7HaHfzVc?4H5v81Z=-i;fY_ph`l$oQ4ec;HEMCh?VP1{kCBQo$PT%g zmQtXSqkx{IFtv()A~gLa=^JE&hfaU?W~d+xtRCxKDdCg@kXeSU2%e4B3@_$zJ6 zews0_YRt7pr4&B(&(7j^e)=^-zAD>bph#K`Qxe(nTVpN36QPDjLc-gR*eveTmVV`ACi&sR?ww zhcA8QC$YKp4Lo@7{{=-^ASr9D{fJF{fxBZ0ptrq1F-k9`I8%NPsbkO>0_i1wDG5jl zK$Qc%1oRsuVXZZ;0&(j_Sd=BU-dY+bM1o!RGtfry)x~>o1;mZ+4TFDXTW>E+f>Rq7e6`4GE^6b z`=-GX_ju~|>m2`2oa?FruDb!a<8E_{upm3UJ(&So0Jt_c%uP2vKamV;}bCfQg@ktvJ4z;iBdYOO6vgsaQzfU$hJjV&!Ma zWOky-#PI?yqN-}!w`JSaMO%U-&uf z?7WOe9{5vOTU*0o(Vj2rXyd2)|J>34A2I@%4DOVO_gz|`93udo%wo@PB1XkHdj>oY zTwARdO~5zY5%UIjFsc1<~JVLt)BS#h_q_6}=EK1c_@G^tg>3%SXY`?!T%F-qYuyer-f?@)zxsKS^T)it%9SdtjG9kY}KMp<1)9tZ6jkjM~=#3Hp=6ck7S z^F6{FuPf~B#E2LV9alX-LXhh^r`9%QtbvpH3AgvA0);P>MdAy?@0KFg)d6R zQLreN@Y?IYjoHc*HlVhB=r9CPBU&UG|AdzG=ePn&RQ8SgACVsfa}G*PdyKrXKSi!p(6-f_NL8)P zN>(EBkOpc33I<5kE%Ig)0Nv~-EjOrUSfxJzrNZ7W<9Gk*Yk2yXHlYe-XV58VB#|It z%4A4odOqCQdv310$XLClMgS?sr7eXw&L{)<4^YRXTyc}DY!51WlWC!)s)^K?pMpLA z6>$5lz<0d|m@NVO`{{c(+((f~EK-5IQ?9t#khX53Fvt6LKW_o$0N zGB$-h5A&~@D}K`_0IYQlLY-VdoV2;iXSz0*Pz2n3%LD-M+H3RXCSh$h32$7^q7Wnk z9VenD3!$QhyxS2$bC8mcILNIiOg_nT4;05kBS_?a|92)ASRUM3_Ckt!@v9Ve}nt){!!d^%iB@@K5!A_!3pn**$LvoL|6HZ)sb(`bpM!%o zl}iR1iC1m2e67JyP)Y+@H7!1+U=RW#Xd;kq12L1|rg1h58phqPWXRTp!}4_z(I-hoG$VxgC@%0 zPZX>C$s+_mn|(|@BfOq2zTb577(k6zU#)EK zPeT9PZa8*RpkM`uWEm#zywN&uIQE;{$pn=JxjUQ?um`ccw1T22u)VVd%{ibj{>k+k ziBh97DFc$eNT!k0@66o%E&4*D(l!TDs0r$72cP}oU&H3s58?iMegH*D=(W2ZaP#U! zA}}a>7w{}+e(jRR1HDJ)wR8|v<@sv^ZczP`3o)wczY{4aDp1>W$0S0s8|3ay8(=ksn<85c z0}agz#M)+q_T(!DxrC9~jy0NUxq)SzeYn^kH0-oM4b+7~4dCft-@+Gu_AK_!)fi2S zw&f^uaNT=|k89)ry3K!0n*uFr$PL+MgS8f)c5?gH7 zUPpJeh~UqCIN$(up*qQ@LV`EBvrKLa8OhLX{i9J^!gY1J{NlNppMu(iF3 zs;-248sg+7Y*Pp?_^?t>-#i0A%ji8RZfvzm7Vw%nR)?Nw1jRL;dgf=bz5Np2_V9m* zmE~nD7VT*pMDhtfLSq7SkR-qhO!+Gtvf6WnTX)MfG+GLK#?(U1qF zw4j>f255jwaV;v4GOuy|#R`|spU1TiE#v4NGZYh}m}#8t>`EbN03=2Z8*zEZh8KtI zjR#67TsmqhPkg9}wZRCQX5VPWSY?=dwNM1s8l)6RGgu~3H9Q7p!zpO2Hpu9MjR+TB zTi}boa2{X#tsQ`YVxn441WS07m46%P+wsZd0ut_uzTjfw`6AO|&46MQ1)-WNoIf+h z?sfw5@0z>k9%vphJ0GcFnv)gbOfJ)Pc!I0BsDPsz!290^oH_-}=RL($MlzT>(76L+ zbkcB7`I}w*OlDy?dnQj@j1XNo&fA??3c`&NL2mp zP0y_;iVPxNKSiEVD*|LOzZ-5GgH(;Ly)cJ%lyE2S%P|bceLZcCYh|{q-TVU9{(spg zH+rRc=Ur&d&1f{jp|!)<-rmIid>~s+kUm08mdqFoYRX3^tKuND^Qlp(;5Y z9=@>xl!on-iGb6P>TK|*0z`!g@K9hbntOprHxmNjqN%#el2Gqyy!fddY`#3lwQpO& z(y;>U@&`q&I1+`874rK7E>ZCG0&F`#kwquk$$&`r!A21l$v|U3WlJx`8Z|2@Z9a7k zhE@c{+;#{;g+Xeil53$AK!wp7c=i)p_{u-MfSp$>sBs~dF|}e#0&(%anc76CxhAUp zeBsBFsEYXT8iupb_WB8`0QN5xICo}*#lE%m?SQ2F%6(4c{9XO))B^6aVGiFc)o*wG z{+n+C-uqr)b=mg&4}hNa2KNA7rvdk({LIvG4hgPtqbP9k_S-hz{0RW7xn`~3=xVD*bF~t#rchg7`#pAhWlx`;LMg%v&+oUfhy$)c z>Vk9k^6^FqGaBY;!be^fMc|AfNA@&yP5m}?IiF!O~XQ6|Hg z0Rb1jR$=dri#Yk<64q~d@sz*|-Dg=3y4P=<9=X zK0wztNIv`!@aWqCRhr8GpuMw$BtAoM%-rh_$cfB4vz&}O?g38UfM%SO2V^mX4zna6 zDhydONa5V_5p~7K0IqlfFrHUnQm^<6YKSX?P`}H1WVh^LX5hN(CK#6rPd~ehx?(8P z4@i^#I7&5IdR$MNyp_z<`Jy@)Ve`iZIZ6a#?Sb|jt*oq~C`xSaYzZu`{cMzNZIMq4 zOxciAt397$$x?3fu`8Q7oHo$CcP|4diYeyvEqwYje-)dXe+>8C_YrS|#(RItcQL}s zJX?l~e>bDvL2r-HVPccX5#u%CAOiOOOrfptefZe0+I7@RSEB!Kk^rLGY5=gh? zn+TU?`hu11iJNzI2?miySr%CAYP|T#OW1n3!pVnbSUNh2GZylZp!igz7=S9%Y9Y@m z(n0=;%=sv|6$w?us5PNbh6@09Zn$mpg8(h&%UNW#OaK)Mbc^Co} zs&R4;;W{O^%RSN6_4_Ad;N9;8?z+c7<9cy`N;vVEhM)n1d;h8PGk`--*T$IW?)!mL z*VxaMF?b9`;dtQZmIyZyP}k)vPkm*9N56aY=1u@6t4Fce-+8fG?3(^R3EMUu+Do;K zKn}$GwafR#*_ALgYeV=sezJrrCwTg)eaz>zQKI7n^qN|DxlKMo4HB`CGRQ_s7oNNK zi!e!mH4`e7!sgBv>Z(e(kSN@%X} zl_&leT-R?=DSKw**qSQ4EKjI6+O~B{ink!Mww{U->3h1UWL=T5zhx#Cjk=@uw zxcJ5l`#VL#VQ@edDd9T~>{KXuY?c7eOTlgLoP#VI&O}HdZjlKhg|e99YcKw5Y;S)9?|k$>#nFx9&5g#XOhxRo zid$zfC3Zhc9*_LU(d9>wf)|{SNl(wz+fRhk34t1jI-bm+MoV95LJi5Xck}fQ+pvL$ z4H}@Rfaanl0XBpg4dxP{+N#afXeTplg1~?(H0oW2S3kFp^IxrS=yZw0H;*yfD4@m; z^R&{z%FODM-SG^GFqoMql9;-UmgEUFu~_eNqDQe*i?dAv)?nKdZ)}MjU&2{@E7LdM z-PU;h*KJ(8wqzNQXrKGE$Jmse~|-NXW?luYvMKvO|Gtqns1~qfm_b ze2UF;OIYlY1Vs)8%lC-dcuV+zfv2bg}zW zXl7C@twTVls)6N0#+~rc;nvc32m+HknG$*66tZUjt9kKk%>Xcab0+{7UjG_E^qeAM z&6+r5MOzPV-ycxirbNl!dvgJ_7t&3&RWS}7DsazzOL+3}OSpKkYHVuLTKoAZzzK&m z76e1~Bt6+X4%uoTN-O&LfswQE$h91bqQK!phq1N2jorOVts5J1pNo8vi!kHm_-^B- z;?E%jI;#2|+u!lG$(EiRY`N*aIAK&S;oSMh@$0|&7xDIo|5My_<2{BPm};d+p^-$< zrTc=qM0}F4wIBj^VUP*PK(5EQWf8#twv1>CXM#8HZ^!!-70{LdNTh8_VF`gK?Ru%_EqeCV`V%b z=ys}CW@?x4Z|d6QiTB?FyyKm~D52*+B+1F?sO0Wn>I$^TxCL@1U}t(A)dDzj47m4x zU};4J|4_OnQy-;NFSFN<*_Uc3;@#c-uWn!3!Rb5SO)`|K9Hfik5ww^#TwzFa%WZv3^tJKTfw9x@N3(U*V$K zVw{uD@O9;7g-KRj584Erf(Y6&&`kg;K&V?z07{GS1QRO_=1|zRr|n9hNFM`a{5q&C zP|tyjUt?^3V~(Yb8i#HhH6@YGcdWf=)Gv3Zv{NM+08l7MiBZiE*de1+KqW3+JcLVI({x9U+dPB&;Q9`znuk8dX)Zv{ zK3IC(%Y$E3z^F9+{(J8?e_vPey_Bl9lT`)xnEZ5oww$!@Ku$nZ`7eNz*8z9k3rr?$ z@Xsb*!E^y9Oqil=$D1%{Osqiws=7XR;`q|@v*ovd84z}Nph2(d>B@5eHspw1$gpq1 zkoNoanuCDN(gG-M2D#g@t{9^dxcjado*e-%y)*}r-JryHo=;?R9a|+bUmb1#p@9qc z&eY3fK~5h~(30Q|{sA@ag#=)>v;Vhm2Mt4O0O2Vnv5-~o$ z!nzf8iq5%!Cw0{Cl%g}#1R=5tf7%9rG=xAC)~MNSG?+&A$Vz}Kv7X!Xg+y>9;)rZP z_TaW(11_DJq10C(;J> zu)+ewK%q>~){U5zjW)VMHD~N^Gqzu=vHkJ_TVJoS{gTGwk{zWR3!-CCN3<1xoN-1K zoLCg>QTAIzrbT8PQs91e*Qy=eB*oBmiM_22%rBLYKwWQtzAyOa5`jdeoNOT^TB}5< zwqu$YJ6`~Y)`0iD7dU;|Bm+JYn+e2}-#dCK;oO4&WNulRbak}_+_uLI+<2>*@h^%5 z?2m2~!Ly0hX;i>3aN~$k_JQU~HVt?4W` zOaYxHTj{u3_9|!)v^D|vw%eu{j|nflu!p)fA}NtCL33f$0h(66mTagZ#hgYda$sFN z@+RQ;K&Fb>mvyA;9ma!ElqWfl(LaNu8^>B+05WsDG(Z<1qdnf~gd2Pq4Wu`8_!^h z_7Q@@5wU;lZM1 z#gHUbLFkj!y&KDfLUW&>Q9bG(;v|Z z5Y?a67Y=}oykw;-GwL|(hdX+$%`EhdH%>5_5}ti#4~qpuseb4`UFk+LK?z`=4n(_+ z`bY`?VNSY9F^Y18Lu>2U+SQw1D!L&aQlbw?;rYgZv7rPCK$ZsX z2@i2ASX-7$ID6)c__crg<9O_m{|qRr*Efg0(1=vD5~1D)<`*>f-T?NtYjAA?asks0nHXUoFxk3+1eO?N zZ>~M3Q}>OEN-}Pk{O}-sui}R||H@qlSMi(krW9eZyN<>7y5v!2$M1Ro!&a{V9YX23 z#9$z=Ap2a|?`JckS9M|5}@N#$ERT*IbLn ztK=ZOi^0iH53j@MW9)uPRrt1iUGW59gc3}Q0_u0cm;)HM_P`-wtIKMQ;{dHWEqN<$ z6{o?jVKl){o*ZK`COrA%E_Qb{3Pl1o)Z(UZaUsUQ2C*mZ?pO0I8IbZlKJRsC;H_j8 z)JWmb+F=wsJJ`9jCCv|FrN8JULp=cSKo7qI)fgFZVv`8Pl|p8FGf6QlQ-uI)hUg`4YZ?phtKms>#^F8qMg|0t~DHAuc-IyR6`X&Q5rNsjqLrnP$mhe(U1!b8ervzNExO-70{*S zDA?b*WU)0>l9fA&Rw5;P(2b0^IRmXCp;i2o+6=JHi>iV8%T|-2Nd($S4YJ$m;?fCJ zyDMIcDd(RtxLQtB^j$$a^*bIK91|_Rsy5RW?|ck+@L}^>i#YUkoGmzzYc3^VK73zq349J$SJwSN!@m*ZFus~TT zTQR9#wX9Hx$II5;Kbay(+(#J*2eGOO6AAJNfj(((WqBDzLD<^fg0AZ(nc+aPKPzJ7 zSlz*H#Thn^e^UlfvP{rIw~fwmAHR=L6cgyW!e_qlKjZwx7x38I|0t%@NprJGg}$sB zV3(3mM`a@6&(8QSud_WM(+1=iu9f}eX6_#-v~{?1R=aG!wJ`u;W(N2^qQx4X*!M-707ERT!8bc=6 z3b4XUJVkx!8r1t!zlGOly2Je=`0l^yjY0hCDsQc!myw}|CBa=3xb*=_(-1bOZEwYIOiT4f0~nw{5j31u6_0 zWB#TF>UHq^TGUmM9eW!z4%Y)WXE?Cgz#9g66-m zeRgl|p0;v$`HIHpD?VpX&Z+sPO8>G9lWzV$Rz=_jvU5_vUUlLsE+Jdit)iuypzfYl z*TASG+;#U1H{3We@1xE0IEYIuO^Z`^nVV8zQAK&gecx@kC% zL^ESFn&9xE4NRv~Xs(;SK4g!dV>U30Y?P&Iqs&@44EiGb_1p*AYv%(#?BieTCxf0m zvL{h%^a9SF`!YWMfBr>0_x$4+n?1P|>>1i~902vpfTdy%rGNdBv&t>JuYw+RBt&DA zGLiy7ViLeX&(03mXaG2EfC5nN=Mv5*fG`561bAd~{lW%9YPA2EeNz+70BiHO8^6@r zGNhYt^8brApt^B7^B(rUn(S+}^Z6zrFs%neoKWJtQhRLj-y#WcL_aV1!yHp{ZP>d- z?S7)7*JM}iv#9uO5}>GrQYPR#MaF`PhNq$GYk=MBp{pX}36j|S6Oc0J=G0TrIwz`V zjxz)r5=iAXCeV^a1>Al+@Uf4YDme`Plt^x}yAt`&i~SVyRmDM6{ld0DYUZy0Re_Pf1 zYZ`n5M-a1xB^@__IZmyjYago6bK0=Q&F=?S!c5K)ZoPGe*{r~`&+MV9v~lHXq8nvb zs~g9Ym49rSC;H-UH%n{5V{(Y!5?)%8gwtzUFY`hQ-udQRdD6q4$V-g_}s0+0a zDCg+G$Sh>eRVf+O5MixMUS-Fbd!Ms&zonXCclRuQ;}ici&Yk;{c<_M_p)7z(`=7jKoGwB10kT3s5)XM=e}QmI-awo3?+VDR2oS??f~NPA0Lz8;Qo|cfk(NOwcL) zD{pL1q>^&3-%BJ_5_$1@thx>UGU-9XDWIkW0V;&yQehLV)_{pbl=+Uo z!M_HI61ekT;JWL~n((ZAdpux5{sm_~c=&j)AAoH?Rl5569XB5P?eX};W%wNbK1~2- zYE6F9i~IG(f6ZL~Y3f)y6#b|Ux- zl)h{)1&c0+6mzbz&N<^BQ7Ce|!a~SD#U}Tq5n^tEdu(-O4Mj1+=GG=y*KIEX3N{zr=<8xp7X`H+G0^a?OKZ&KKStCX=s1-no zVT*)!K&twW;KI)Fq=4qErBE}1o*^$5QwLizN#m+1%|1k2k^1u##DVxCG^!^*@Uz##$C|*NZ-wahR^{eu6 zPwyQufo(_vaqwPjkC_mgs(&^E-t%tY_B%{Z+y%%`jnSLt!JtV#kBrylS>W-hdY(&R z(9K+mx-yD>_uLO`Y?!GA)(0doa0f@A1G4EfG-4LKasK7)-TB30zumQtUf~dZ#S?(n z&%Nwbb*18ex-?t*QD!CvCrK+Tc1q?0ToIzE_s{(uTQC?^4IDdKV*21Ro_PEcE?hA3 z!4w6tM5Rl;>78FmXWTA07U=Kb5~Oo$Ne*m|l!4iFhN4i|+}y-sF^5u=*4YNv7I7kElRdOz^@Bzk=L+ z*}=_ZfLMMGAye^r*4lCc8{;4H)(3GAAe@O*Z6`rMU?rv=n%7oAdP!}iF3)AS^xQ;) zW{(rV0Y|_i`*GW7$CD6OcVy_-kdkzyl91taDx;z05LQyW^-1#T*@n8FKy#0|sgFA13#00J09XeNz#CLEijT|)F zO~UogB0LS*+$rce;U6L}DNBp90yD~}_nCx^z*Z9g%Bb)Wu^kUAgJW{c{#pn^6M)Kx zza8&|$Y}jXpGSGior5IM6TGs4pX@sHo-ZZ~oZ6q(s_DUSNAH)zHj-}j_E}0CdoF*< z(_wD~f2a-qjz@tO`iHFg8#DkQ6qw*9jO%NYkbk_6(}-Gc9^bJgX2veKDb)p$v2}&+;=e&Hk`=_?r1=rmG+;KNB9%X`mrhUgf zrbNjfDM;*63X9?TVW24J%j+lbiE@N*>sRp?|KeY~qHpk-A;SD0Cr76^g{>M%`UBq0@KM18jQt!(KNy>1Z9E-GG)quoy+%-Pe)ev$^r~f z;h5VFFd^y%f7!ma`wC#9MO_R zD~4INZ&*|&EUH*eCYVw!&A0GX!49R`QXQ%pNAv`l5*Eck2*JnC^_K~GSpu^(1G2|t z$%5W`u!KRd8L4e5_~!Y3KyOKijz2_g3!xeHbL|g7o`mW1qapq|*uS*ozXFN?MN3$w zyD;M8S->jCkKvBKaxP&=wH&>-%jgQw0Rk(*?8nT&Lk|M)c`q;-8zi7v?-~1Nk3@@% zfM#Zopgee)v<~iw|J`7#?f>0+hY9{g;fwnO=CpCZ&urSgC=18k(A0E*CjqP(O#D|F zYR)=e+K_7rNz`ftbW$hHAY z&!6oSyh8&RinSdHWJ6T5z80FfF>Fzdgtqd6B#{f8+B+&RfvEC zg!}H7RJkBqlmrabL_=L0cK_Y?11C?p$(DWuA~(N3gx}yp58Xu0(ELejoW1U5^$(X< z@NNIP;t9ZbId}_FU|qku*xUOV0RJyUTX{U=(q267KC4X-*ZB*@sf?2&F;O@Ebn4Uy z)2YIfPwrrAt42{==H#R|Rgkjh>ev)A^Ca96ihS`PIe*@c+AS?Dp)3nr6uf|e;9jEc z7uUf4mzv5iB>JVB?JYB(TG5&=if|%LcM`%cz5LtwZr0LBt*}t*dXWF%Og2%WR^mcY5^kYDu`Tqj&pFja#wv2wzsU|&rY|cH z4>+v`VRe^w3KUkOv6nYs}(y4gAv1g*OPRsNvzF&Eem&>A>U62d0J+X_kXBJS79GDQe?-!cmjzsnV z<%1^;*oR2uA0Z;tb%l$Y7qPd$2NjKN1-n#Nqcb?4-3B4SWCN!J!DH1P&ZgZd=IB8PXc$^+u-4|ktWj%*)-^QO z&{YksH7Z?0*EMQgL+cuKtx@Z$dCWZ?elzTUt^R|l>fOI}^KX!O+zn0=>|?~%dC-m` z5?j#1DgKEDRP%e)`a2P|5OSj-3^7?i0lADKZb4%U>^Wh&|B^rB-y{V}K>rk1{!P$# za?7P1_p?&JmMf$%#Y%A(rp3wDOCV>;!`+52LxXasdRpeEaj)6R6o9g;JT@t>TH{p&}OI-uUPXc$}XQmly-5 z{hdauMG;P>=$g+T-r$F4GkQVClj=Bf>dLkNt~dwalfU}~6l3LmmtzGQ(M3QXg2sEA zaWQ5A({dwHB7Fe7;Ga!IIkU?T%%TGx8f(UAOgMgGgt}&IUZ{g!cN&Z*P-kM%4TNQI zWbp}eUeo)vOh$H`3r)-_&w z<#+JLxidI*@@~v#V^2AdGL1lOBKw>zp9mbW|;7RT#Pod}6v z8OQ_Gzed!^9z*L1pad#ls(vHy>)?JXmehzUIh}vTNFBvm@c<^YF^sTA1A=gBI=Lf| zMwTXB$I#KGlMmEZ{qFvIOz@x1OzNuV5L1MlkjC!eQ*a#H_)4T_cg}dI+R7mms=(IPww?8c2eY>QeLu|+Qcn3)pK^`P4m`vjL*x^{xfV#g%aS4# zG{Flm{2DedJdbz1^FP7q)3+H*=$3=ynFzTgR0;ukqCi77C`G=4khoF}@}U6KroXSC zprgKBN=SW zuvBBu?O6#Dgo2;88I>}mS>@J-@)Kpz8zENSz19l*NK{B50NjobhRT5cY`=v5ZPoA8 z{TlecHTiKR^@MK3>gaYTltN!X1lWU!{0!K#a$6F0w3r5s00zM1qBd@K?|z4Y#&z8W z|7g@ttm%{)=FmMRdsk;(hm^oJOKe`Kus;uMg*zeTpy5a9<4nocb5!#l02&JQ2RQxu1Yk0m zpe#pNEcQ{?bu0MdRqdQN9FNZP5C@)k8lzioARr$mN_Yt!6A=nE!lm6e@Z1ZZ0P9tp zI&lk%LXL^05fyj291_5Z%b3g}wNHg40hx0`2cfC(ncMVEibrwafk9SLl2f}jiIz>w z(WXFufSk>r3z}8~-=#t1v9Q|5T~$vuX<_))dMgSb|0byDSt#tuK+ejx1_;cBfb^B; z-seyP4k~|Yf`4g8`&xpZtNfL*D1@RJ*2;UZGP=d|`*kA7b9eAa3jR=@ncvk$PwLtq z)CSjnEh^y98t}mnSaF|)KRKK-E{X;}`l{bVhj1v+ncF5anq1y5>I#^x0QWxxTysq; z9pBfEiLOOv#DIC&bxU23oPwd0v@gf{KVMxbK2hxxs(oXT9e$6eZ*l}+NAGn%p{jpo zZ94vAq>A^)=t1smlVCb`nP+fE$=wcUMHhWZ2#D+< z1pY1&RKr~#I@)WflR+(ylm!{FC?{ZD;degsw{hm|(|G4Q{saymI%L?-!H%O6o1P9f zuRa}s;1hQ4hHc-RY?ZFSR9j94L8+oy)5ge;0cAKaBzo}#laOj{glo(jm*VJKnlh6m z0KzD8II|!VsOu)>F^|{Quu9nQknc3eVn)n2eWXS%*bN~Nag&J1d!U8*3(+5Lh27on z-9&>M7xeEjo0y=q=eBk9Yko&Y7-_6dV6D6drCMnwfTHb!4+KKCta8rx@uTM=!8I5V z=$X@jlr7osx@&;GP4xV{*!fbp>o#ai8VYcBHX8 zIuFoZ;2yN1Z-3%UOF^^*%=E4PKd-%ser7VJZ;S2kzqbTn&gXmJ=ejBv%YSxdvi=E% zUiB`%a$4RTg8acaj!r`Up&z%z5(t^80OsCylxqphmK7d&Uonww2cL4+tl zUh5;f4C;jiB?qN4X93p-COgUfB!QwZ17$hJ`uY)UZeGNt-QBjo&q&f3b5#qG?Afx1 zu&_5FkgdUcA=Vs-=iiLB5?2LED)8L%{|4vIJ&Sj}<4@zJo9;qgTT`46`tP|=Sw8@k z>KDX+L{?(Z1buEqftnVS^P9J_eMT(EDg}a3Fh^dnS`!rM7EyDDLM5QI5M zM?pdQBZC4ExxlX)JZDziiq-M0#$s8gZ}v#nJ=|APNnkFB4=LJt;H@95J9!#wYwmQ< zUBJ8E1&k&p_;=O~Qs$Qj-fxMUp8D?IyxmB2UnQ-PEyRENCgAqFfKeds(`N-7S)L5} z_fV~44!WKJDX^ImtgwCfDE^<*QdJ3ynzvR9;1~bJFQcv&*>7D}m@oET8>#XBs2F{} zVfEV$Mk5eLNwkm?Gyc@sRLU%1>V8VxbvMVM3gFoB5mW)3KfeI$7Bc4n;i@;=NZeW7 z;jw?U#?R15&3+RpOs6vtG4}W8Xh>o?vVP*0%aV*b&4t5P%Hfporaa_hNr@&g-cS@{ z?CxH`^Dle?^LdF=CvQVJQccj-sTiJtDpQ}8q9$r92IS94aNrK-b`JI+`>Yr>QQWie z;9W`eYhiis-z3@rP4!F(JlH<&Dru{c->7Yd!a<^KVBGr(8?BVZ@T3!tIK zA(jZ~e6r}YRW(o+z&joT9(#wGVA2(mcM%1EXd|(Wbf=QgpPvt@{)g}=lf`0f_S-w| z25!5<(rk49dAywMH`^*ezOs+oy77OBf$1{;`4iXC|6Y!$>9%!!zo`*`y$gH2&#CGf zg`WP6+0mu%0rW@OEsrCdRi~D90 z9Zf$Vn%}16ad+Kju|}f|l8Iy?YM->bW;FDfq3xID1X|bl+~@ySy!z_z;k(}TAK}FD zlTAxN=Zg7E4#OFhWDZ&aE!*C%FU3aj&OMK*8A&5$K4?LzA^5q3SSd$fG=xF}t!pa} z>@KM>_i@2qX=j0}VPt`2KsD99(-=TA3`3e+7;tCQHU}igS#l#&4qM-?b{z^;U4D#jJ8&1IJH{jcCvl#!RRz zsk8UhSxPbosf#pD?gF@y`9nHeZ$`RcS>LYz+ooD>hJ89)Mp2fyxVee_`P?d{`R}Hg zx@z^rY4DGo!BI~*mrHZzl{u2&O&kS_jx{NaMpL}}%4hIP|LS=>^6>u+_uum#j0&@X z%B0gv1cLbH3orGspo7RD6(1EC+F1lUiQdKp$k_m!#DKJ!a!^oc1pE|P10OQ4gVsl& z5e9;`&nZps--`J-%j_lzBbV^1RvVzfMp)=xaN}4h!A`ce!lXnpNJ9D-A)mu}CBy_z zDF8%n^pL5A_Fb?i3VQv9Eu?q}Yoj}{G`b#O!MYCQVRLMH3<<_v09Qw%Ky(1jfW-T_ z`TlE80`Gk7xz=X$}0O%W)3(c6sWzNF*iESxa-*A7@R8_$G25|2K!0K8$ z_z$Z7532c}8&*mL{>a2B`2_uq!|V7nW1_m=9SG6C*@b}q@_+Y_1_Lk58vFa_zn?UI zk%6((25?^WTBN64z5mozX9TGx`AlR3W?z_PzaN`J&{^BDDs9K4+MO{PK_UgMD_q>##O|d_0!n7DUz<00=18(B z4t@VPR{HEUH(L~dNDDJ9%Op^7iA~OtWWR3NUgT+fFk&FN3b8lD(|iGd#X!hBxtiJg6xOe;^X$)fbV*DJKsOFwU||3 z9MYD|u=T^*E9)4Z&{7K#N?iljTyJ3i$)pwc8Iq87U8BC=aR!M95rL=;!2V>B`?s!n zzH*rVz=`APfG(Lvo$FDWj zGUpJKJh($%`QY*mP5=QdX_W$8nRC@?-~c0GbP9;^;b|rkJ$`D}P;1xguU1FM1GUo% zZkFCPDv3z^tq=ur6~C<1!{@nCL27&Z=DQF9-mmUS68!>8-&V|Mg4NMoI6S={ zx>ufhf33}DyY(*M&bxr3%#dvdT(_>@b7t?S4(FkW7>Z6IQ78bTG5+66%k;k~qDEt4 z$oJ^YE(Aoy!QP^v0;59zM6DNhR(1U&jZb*coZ^tS8#LU#aWPI|Z5^;bQGC;N#2SxK zV;3(7xcL^#3wUZ5i#e>Bkd(FM0XI`7MWzmXo&4E8>TGR@ia!Im`!|zG0@hX!p)5;W zym%3sb!#o0JXwT(f7B36qrk%;Lxk(CTDpbSIk8iZ%PDqt&fwSo?N8vv7e9!{9{s~O za^x@;^EeTpu!l;q`WV4CyCNcQQpGy>*gTg6u}`!D6hW~y5z+>dZv_7dV5PyDpbBL~ zt3>cuMACSqf$<%ApRI6Ei_f&)0L_3Ou^=ZF<~8hCpsDgzgpm^I2p2Y91K|=-0J-)P zC8C}$v_X)BLnr9dP69A9CdCOH8sCXYdDz&(4rR7?F!;HPiH{6=mooQB+y=~fct3?q zEGl4m33$)DftznLfnV1>ds8^g&~>k;2-2J%^BYQ(AM*RU0wz=7&ijB{a-$D@Pi_S z#opHR)t8?7MXmMs005-${hq6DlbZEqQi#U55yuEE>h_D6B|o$oL$o+`gIytmWrZL!*7 zf==wpv=-R7F}la=7OK}QpnV77*XFU>LHt~sb^*HD0tz#%jBms0 z``>2>ao&9Y0OW!&&`&h= z2YrcDhY3*MIdfd9!-s);gqcq=0m~##+{39D+6qXibLZMc-l(6@`ez18RsSlF=YMeh z$aHTyI{3{0Z0${+0Q~)*`P9MxND)vi@QoM0a$>Q!`zspsfUJ$PT-4 zSmwHFP;TW4RbAoY<^}BT?KOrmsho%b)6O;@i!*6Nr12H=lcGR*TS0H$2B(ry4J!ROV{SVwfk8c zGa#2Nh<<;Y1hk2Rd0Zv{9B=?!aJT=4Zq2tGDgf!W$qhe%nziR9cOYnuEZPw)JR>sE zNVXj0-9)0--voYYM*A2Flj0-}O>f6ottP$SJ(ciGk9UyGZ-)KNJ%MmY0L!uJ0kht! z3b^%V;Jd%uu;Q!v@EXFaZFsmAK`IHz>iYwO4Sc*QSR4FLU1Rk8y?%c#a8q|XpzGWs zXsrm_ASv)8k_7gqhxm)fuf_K-9irFp`}FIICjdYBKYjc%j>AIna1NZZ%6Ex?O9HgG=5_l#;s9q36;U{!*oqDfc|TB- z$Wg{2t>K+1Nh=Y3XrWL6UQU^p!kq9_PvraZS zXbfn`GV$j)cJwYh{O}*ftvBBTr3@^a-kd}d&{PpD827flWrIDORj{bgTO>gH(*n9} z6PP5Rwn>9P0o-f3iGm>bOEdri31A2m0BBkU5&>{+1F{f5i!!OPd?pSsIcX{dFM4?% z1>_46xvJkK0L%*zO|ev-#@gg&6l&aXZ<5fx&UvzT1c|OT0Ma94-g4yO;xyc&=RX-6 zRlhs$M59_6AqJ^lJ>@wny>-QayEpfw-jPCgS!!T3HfBE8Ugzui_tj&aHovZhqL|g6 z`&;g7`vlMRUc<5d86b_<)=%N1%d7ZoSzdWDpKs>t%98-;o0K|W#_FLXpRMb~5AI#s z`ab}*j<7#1-MT1O{ijv;8Hqt|FJSn_zZ6yclt$I%&yL?@dqdY;H^y{k^a8fGYm{Xd z6vF)oL?eI`-u)f0hgaq6>?-w>B@%|V%|v$lahb6+TS1{pT)21vRaJ>OWERzmxB}b; zkeIN?2dh4EwFgsTkK&Fh#ZLknwL1Vx6;NskXWw`RzxJ#DJ)XYd9eCv7KY)`buLWyU zsWE5pP8M)@<7UUr5@|k)YD=INGPlA!7VKK%A=od z7_~X~xx0pJuCMaj?%dilNJ20= z=!~z7L6EjDq(IOGK(#`lG_-Z*V~azwvZGW+`VUGgaADgSwIk3HSZO2RM3NIgP48bf zRXl@S#qXeha?=BeWVnHmbaR#)dIq()wKwxGrdUXptipbHtd3!IbPFb<4Wp~B~di0e9U8%w|5>uXoEj$k^t<=k=mJ;g-W~?ZmD5)8?TQ_~Anv_^pnb>S_XTSznr= zisDxZ^uvqA;^#nE@z-%rOCZGia>xY1S1HprFgIIf;6xY321%?}E%ZokWXryCT>;aX z!u|Iz;n`<)@r@VfV9l*pd${W0SIypMpq|xEXoY?( z>$tde5j#7VT4=x7lmd7^yl&jlt<0*ABtLkd_(0xTAn{v|!9khcqLBY1B8-X|>bl0` zzxOZkwXgjSZomC|aPK|u#^FPUu&BwoT6jAp5edaYYV!jr2d&6C__XI&C|FsJflV~PPz8ZB*|vhw40io|Vruyb1gHl3_YnclGXmlOUE6K*8fKVY}%TW9CyR-^}Nm z4dy9cK-cdFSNVxLgKa^{#+Y+^dKf>vvW{QPU8AcBz_;S7Q2&}2{6mWA9~&e-H&6aYx*#&VOu`0_&r0#k}`$6ZTUS}O3>XZKLmj6zXfide#> zAp3v0>N$l30yLRg& zCl%TW^5wKULwujgo8{7SR@EONEganvls)UcHIIP7aLd}Uys@7I209a z;P0yT$?r&{T3=aFo?cu(@xEQN{+XV5?rjzoFdi8*pL^~zdqiC!5_zJ;eMlHUbWWiF z!4s)(N&x5_g${YNF2AcQBj|JIJ-~IREfSzJtppmDnDqsB?(yp2zTh8TOYyqyy8t$M ziT}uGM*q4g2(KmpSF9fZkox69jefAM=l@uP*V|o_ymXsHTx1Tk{FysrSc=%^^}sc^ zf@P^5qwZ-(hzdmmxc-JQmX-@V`NSn$x}=S05K+DY_JUo|zVOtJMc_w^0$6id|3F0& zAtiXC<{kxUKjnh5(U@OZUPW1yxNz}2>RNjcC1)%5U}qb=J`hxi)TqE#D0@CPC7^(DeXd=C1+xL{+g7QoUf zaPR%V(WB`R+M)3N<+%P0uKc+t*%N#-8v@QBK7~JWsp5|t)2%nx*PAZ^uz{l{{qc(H z|7$_TKVjx$GUz1Ns!I--vq`XDx5O~N7rw)uzs@gJN*t4yfofykvT?M;0}n3Y$tQMk z{#<2~03Ul|L7r-VP6(-UY^3YD$=MspC*&s|&zDg$5%9AJMvduYf{i0bapB^5?C;MT z&--+vEu%S_l`Hd;4oU8$=y#cNBZ5;C*GxW@DMQf&ieiL9O|ZASjW2!aU*YMe{~fNo z_5s{->m#`4nj0~lj8SQZu4>^&Ag+ukncF1R9Df0zX0k**(H}1q6l-Id$_h-fH)T93 zm@OI5mM+Sn0R=T;Kdi}k2iU5g#fT!2)CNGC2rz@Z`zDk-W-lQVqJ8%B8I-C}OBfYL zFe^`BRIE2jg*ArF+oxcEj}zNfjfWDyLk3vTfkL3ey)W^+#R9nQIz#qbTLbp@GgAwh zgy$gqMen>^4pEWwLP8NTVJ(U`ju~;EmDPk?aiW!hj&AKxQsPkb;vfm6M4t#ad*mAY z(CT6Q`p#>BHM+c-0DN130L>_h@vqNjD?hNab?)a#scV}tGVW*t`jHo z9q?gl4%j}Xp;4A4Hr6+Aaq}W}E?x2xnG`yc*;Y~+2Yhb_3amzRp_((v0eRD)j1)`U z!sFfoBX1;LDFvlws26j5^{b!63om>DM>ej*4L3Z5(>L6P_4T7DixSnM2J6~#MeX_} zVHIpGd>hJ#GJ%>%2^(iy{}-kmP_WURkQP1$4|2|b(u@ce_Ghrt&DpDKM}%}pfF%cV z+e$L0x0SV~rUlfF+)~Qw+D;k}N))t;iQ2$;bPNSen+v3Kn=vKsZDH*jEhF?R)@6ft zMh4b9lp(Y4neC^x$i}^Q1MhgJ8HroW#ggslVfWn~edRNC1iii>n=l59wjT%apS}sW z^KJwGS5^CWef*2Q5x%HpFdzxbt%;n_sweNuVozYaboeBGaP=@gsWslTUnSnmUj&RM zvrmraD<9q8-THYd)UBbDymtk=U@yhZUfM9XVTo8u{Gm=D0OG%LUVsmHQvrq$QSzt7^6uEU9)v16zq8$-<`Ukp$6D6t(0~9bBt4hB9ojDnKfNA zLy5k=W=1>IXSx2Qnjr6zgQ8$dAu$9&?PmPlIHQ~F;5GqZ3dd%JP*9V|7EqXBMC%x- zbriG$r3%05lkk3ETkDx;Qo16IhP)wA5bS`gl3ypp-|?8#Y2ZXQ z6F$~d{|e8p9>X6#d<0*_oBXSMvwr|0!kqOND_(qfLernq%n!ON&O_igxw=(I<`c_9 z_n-iYp|}IXa&E)7uYKc9)=cQhUF_|#X$i1@-2Tm+7CQp#hRo%UEToZi2aFqv+)|ckObLxbLV!bi*NM=j%gy#R`z}?^ zGm+Duh6qJbpuh-qRpaGvJc(Dn@hm2@6|ApchvUbu$MF-Vu)e;5$#iOa-;BDhQKL5H zA~{_=HVl49tqo<9Ro$*xRiJQk!j=SR)JoX?ryb>MkO0e0G$g>52Vj<;Q7I&6(+wqv zpMEXaGzv68EmbWlz0LqM zNcbj^BrGamb=gSz-f)u%{8HS9C|F_#NGwvf5Owf)yHJ*7C6k$qa9>po%$Cf2|H%_} z#E*v{l0Bd8fajsl(1$Y|is;%h8fodWz!xS*`G+=+&@*@oe3f{sd=Wj%z=y&7PXPLE zIcn9N0|cvDAv4R5j$XeEzv-koziN{XIZaF8_=z!QvjR^%ehC*Y)F_Istes=0E{BOG zzZ4?*Uvco%326GEmc8JQ1PT$NTa$fo#(xIDa(A zEiAdSiPpkAKAd#+96D) z6O`kTl^ivyfK=6}8Af9QLPAwhJC&y;-P8Pkq3jZ8WqbN&6tH3WJCP!?fnF&4F%wkL z`WBe`#IzX5jV)>g)&+>ifSy3{5(rZiG={QvzDA%(3r9pWNmsHDj379&-@eNQY3_o8 zJKXVz1_XZ$5Uxom6V4aFHKz>O@8||FpQm-mQV0eeM9Ggb$1)V(PgFB~LOFE>964$x z7*-GY!T%r$%;4Gm%lKuE?3W^kux<=DQH=OEXh#1*IiXkHDq-`jlK=o<)~~Lv9{z!y zovpvGS^uHb{gAx}y88Nw=lJBiP$(z^A4Y+nfljUs-@u zs~5msDM%wgAb-|*h#~=}c0I8RMx^N8;s__v%ovSE*f_F*3l}fq((WZwz&dMLIVTrz zIHF2FwebakH}W>>+$qCE2?;~<787i*fJy}aI9>4p3W6$2(>h?n&h{p@HZS6(7oSH_ z6qrp{FHDxZ zxI;b(FIaRx>|U^?NLTPQYgE_!EWj zQf_rq(3_@I)2T%QbOnq@1@5_T8B5ET@WONZW|LN-`7q}*egwfkb!W;Ah{HsOqFpcF zOOzA%xru+9M6iZZg!RLRF)9meZf^yWvHp4UM>Gd?GZXB84x=-tD|dewSvXI=+Lp-=_JqZ!82DW;QUOlLDJEiGd* z9b+^pFdB_fmSdEqG0bUX^g$@80E3~lwoAIT1a?F~vRVLOm}H^?s*0dBL03RsE9ja` zz}E%93PdG{6o?ArcB$-pD>sl&i4sisF_0lPLgcKu!4vNxoq=_EAXI+cyWPD|(fn{y$AS zzy?iDLHjur0BMw*kQo{5t4xC6@Adf-_+F!FqD@G>`IZ@$mkK=f)Gqe-YZQgbRQ@(l zQnwNbGsl6Cb8xoh7;xXcNkJPRq0R4+1I_8O$e*i08F zR0*X@6r&MTp->hj6ctcK0i_g38Ki>j^BZ3P=Lf*5@QC9^FbSL`}D>8r2at{S6R}4bz`3QK|#} zM+)la{s5nY{pHROE&N!+Gc{iCViDKCiBn@tmlU4(y-V2KT%eT1fKbhlgI-2cUTH6p zq0VYH1n&=+j;ExH6SyjCjpf-A%3_4`7tUd^sGvv^2nj9Gk2>Cth0eb}H)fn>$shbi zOA2I?8iI+;f>R8s1YXM8hf4g+%zl19Seit&W!Xyqr;KDt$+@uezNU@F70dITr6{#y{0f|`~4?R0PlORnT4}y0PCQ=Mr!tltGIc9au6XXY{0-lW*|Y=>9~$Ao zhnI2U#00ffmurhs3O<}}WoB4=@IIrJ&2@4u*}d@qH#db9E`^^zo#|-S7>`Fdx^Wb< z+0@vB1}Rvl!kIAIA>p0Cjc5(>J9}rJwQq1L{B3GXP{nc!LfH3G zn4D{G`TDt)TwZ;!f2#89VuOoIm0CIpeKFLw-+#yLz(+m;9N7RC`?0_lCzcf*q-yQ> zMFs#!>`C2ZMn)`@RMo(>r-4TvHI9C{;LnMzk8;RI<~hmWpZZXJa={(Jzp068peXRh zoU0$)t@Ynl>dmL_cQpZs5LWsnQuJX0o@wX%ZPlgh2Cd>v%-hIvkXRpoEQJ0Ot2M{9 zrvRcbLEHrMs$xthCGNX_1vlM11)y84_{57)qSryvfjziWlhuCTCdI+VAL6MA6eOve z&KgBg;K<>1tgfsGBO7FPUnIp@WHQs<^&MT?zJ@L#72Y~QQX+WMDAc)mQ^HEvH!$X4 zAyOjQXx#?M$8-}F4}sE)k5dV6T20eWRyZN4%Se+(sNr>l1UyD|`YesuWfBSZ)|&Id zx|bKw5g=2Yrm8joJVC?0Amd|i1K$6BU@|dMxaim#4oqxhKY7VT``(^+V#*@At;FAG zYj=Iyoxr^h0OLs<{JG;!>mwnC^eEPtu{2IrAK54@}6V$#OeoNPEsE6bo~gHk{bufe0P-zfle?sB54c0rx!w+;)c@I~_>&MFN-(>?&4NI;~x&}Bm}VSw~@Jwi)S zN4%@KPsxns*)oo`>!Khn{f99if;rS3>vfpxk*&<<1GnC0s(!B1m*)V32Ik+BWOQpJESt6;UA5b@iEPK0pCGi>O1Sh5|pA%6zY#v)#5KH zGD(1h`z;UL->myYzH=K=im}px$%XYKdBI0Vmrb_St4ia@kue^8WCa_?Mn+jIN*ENn zu#GqYVZVo)+l+H@laR(KWfbu4ty%BvZvBP5{hc3$=H0L!^AiH@zoAmQMYu948wt?OXHkh?Xb%N&Ki3s7ofdfD zfn}V&aoi}zna^h02oxj_$r~-V%Z8@kxuR4mj!>>7Nnm@(!N6u#y-*5A*4MGNx+3o{BGu*iSwkdAEYlfmwW=bGvBluNTW=BogjfGPS;n*R9V9z0@ z0CBE5_of&NvF>w+)(&BPeI1I7R=z`S(q=B*Dk98bWkGGwPR-;Go&pGiE%~m3Aqj%~ zVF@S2910h+x6Z=$Q7CNG0rgPpUKqO0q|K#*HiVN1=C16A{Av;0J)WKWgCqu-{MgO>a|aG6UjUZBQ^y+|#MQ*OhVa zyY~U$&b!Q1NQ&&21qL(K`Vg2ud|sbwAP;$M_MfAOUwUJ){R1mU>c8_AC;DGa0J?T- zRTdwgOqae_*ZMOocLNd?QA&0z5H06O@`jP7U$so?cuxuX{A|ey2U(z2%Uv^Y`t$_% zKd^+^k}^HJoZtabfRAxU1CGM6bgzQsL`9nmpp?+(Z@(!jdYXYnW-Kqwu(4ry0kyW| zxYVp5#}P1^aG>sl&jm@!MpWuwXpCUuA{-i5Eqgyf-fPK!apfKr_rXW!Fw3C;-D!SD zElXRRH%jfoxoHj$_~JMa@X+L`yFJs_SLUw3!-;l!PvsxxGxG&-;u!GZ4+FQ{YO4OB zE_4T~Gzp!uyqs|5%a2bamR;i5>Izt11s;ABxcbqM-xxP(3Cl%babyKSN4U!`HvkMfI ztToAFq)Y1|tr_F-7{`tr#nRFg+Szr{usxMU$>=5@I`Idu+U=tmCi)`OeKdd$$a>rn z0gx6d;&c|!%ydvPpKIX<2&zT|;!s?2cZKkPs20mFb7o|X(r6H8s=DC6ebs*s5y=(V zq4h(pO%MF`+f493ddx!p2P{0YL9>GZ=>FZhAN65-k0)+WoC!`ONvR^G9XKPAB#_r+VP+_$u(7_5Lx)yPkk%blqld}}tcKI0j?LfY zMiw(~M5(C&iTH$V94l4LwmC^Y-Vt#8`~kf#b;c&CiR4{F_X_r?{A4Yb{LOb47pUP|o4 zMii^k?lW2J^QuatRD`?kn&GxPrcesdHRtc>CeV|gu7@QQckL^bYk;Kig6w(YDBYq& zP$#UduHneW5fr861@sxHa90T;cVpEfqZUH(0r#Uxw8U%)2fcQ$C+~u~kI>`}m7?=P z?TY41<(u_}Pm2Y0?)pI!IwzRL3G9o6G9srwXu!0OG~XFX5urZBfOC@t84(>P>ASiD zeDC)H4?kjVRoCyooE9?W>VkL@8HqvJ?zTz?p(e%ctZP6i;O_g4roY)A4p5Zy0oos# zgp2zUjlOyQTvB70{yR&D@gpel=ZXR~u6|uj0P=8^0u%o|M*T5>UvL`e&CIf=(;nK? z^cNZ&BI_KF_cZ~(D>{mWo+7d6hEix=sb-_5cjJvy-21>XrZcM-!0FeF9Z7uBV1JRt z$phwu$c_KeC_hh(*o0V$6)jDdactu#rjt?I5{OU-`@f;a>a0DB-?UXz4|Hz>e2PZW zt|#S_0BuVkoS5_~{y`09PLkXJL}_ctUr8=LM|veW2AB?4oV-qM$0wh>ClG?cfg=S_ z^i+`tLYZv^IbQ(RT?2gdBf#k!+kSr+ggsQjE(MW?`8{{#Ur0j(A|~=15ta3`Z6Ex z4z@$4IIGHd6uj**;P`RV;=mAfMEHqC@7^#p*UntSXicQF0px$RS)XczPfU;S2W!G_ z;5$Uw?`i_@E&M7*qv!S(J0Ah+pK(yG*|3~Mo4x+N7D#}O2Y%VVh|+~q zb!;CRz@lQTt|~n6&@xV4GeNDn)oafY1DTVVIrr=`A(NdF=>etS=iZ=8L5s5;<5WuF z@Zm#PKXM4Funv2+>Sr(b2W&S4qo7h~h$P(Ib(Ix-CO=*?}4{%BO z!um;%voa1j2F*r}RE3_CiVi0Qg7lC>zg>zo>BCApB|4R|@XZCXzCN=3?_vQ=M!X)#Kzh*jkr| zv-`QLe;)?_9FLa#;ID1RZM=+spr`oAY?Yq7+V8)b09@9Wtz5Q>$@D*D#-9h9DSJxX zc!U95x)jl`xj9v4j7@lIM+71JRlLvP zCqdlfNTwzlc5B>oMXlU#{TJ;9Za#fwX&Fa1j$$+}p*43B{XEMXH}dD zWaa4|L})~y{oe+=)~-3Wrsb?ENI9>Jd?g)P2X z`Cm-{zL~F94W9pUF)DwEfU`{GRW!mdwPT^{w#rZK0<81%yTK~f9?nOZ3u?#Z1Q!4T zAy8n{+61IxW5fd?J|ZoX9{1eaO$ccD)Qd4Zu50V&fT zty@*_qQD!N;D;8(f2p{f4{$XBxcZe}q%~Go*8f>K9(^yk{(>}9@rTPOo3Z*NzkZ-s zXI@9y9Yu;*grk6AX{5nH0zr0az@PyqPfhUP!)sVOWb^|12XNz19DV~ib$<~kv-j*N7k`^a6TmDU~5iL zEyInIgxzj;4o8{KO_@24OeL0yQ0)dztpsp~5KRarhcLU$NpmjGocp~L<`mCgSVZi* z-U+<-eZXh}RP#Wc5gi!-V%2M@73N+iL^HD0e%EMU0{Tw24#ab-1#oB`c=R#g)HMe3 zKM2{6bCMR^4f7u)&}SbD)r3G>%~8p zn>dAbE*yk&M*fbY^o3Cak^^;_7c)c!>IzspRN%pfmT}_L7MMtCb`qZu4T%39RN<`R|gLK zGOAO&+{34E;_qt>jK;uy4+FQ~fyUjhSHUy)c!vp-m#lH#xi4(#NC-ci0!W@$@tjeK z&0Vek6i@iiD~0-MzyE3i@a;tcEWW2%{{tp`7+gQyQ~vgDEC{N5hXm*Wx2o<;1_nk+ zS)EnDHP?=D|AQ-7T^U&)0q#cbla+Xwfl%)&aB^I&rxfwdXUlA7j%k99sJ6PYhU3SM zV?3GIDFJzQNw_eIfQ}3VoUGQI_ku5t-2T=jhGK4?(&wfjnv#O=swk0y4vj@h`vJI< z#F;8C=Mc=fhzHZ_53^4Wle<))6o?FEAf;q`I1D<3v zqXSExrO*bmk*u#5c<|w696LTXj)Kg6Bh1L|@XgOMq6f|VKHcPSmy{($Qz409OHzf< ze_5?H#*;CQA3ch-wUy?0oB|(5XBydw179VQl7ZBle2}n%8yAE;e(j5!coQLAro_~f zUr{=l?NEkJ_1-=01?P5{KxLTyGnXZS1t&OqI3)lxR1DF6EiB{xfd@>#|LCz6@(=S8 z>cG~sqC|bo3v4!!$(V58{Y$vv#!2&W@|y++;xg>VM_2KtEOA5c-_8ld zAX-p908qy%V9ij4!jbiL96h#yax}7LNg>Og5>;?$L#HwuS~w_5@knUEHE1eL`;V|K z(nYVM*vq&R9_PqQ)-N?Fm9uzg1!vb!cn;b`z#%Sit189*moPAA(3h0)jC*{40j#Y7 zAN&CDj&}luGHrm)YLpLH$q&n|^CAS9H%km0M89yl_qW^*Joqp$omf;ObKMyo131Ww z@o)!M;~>>N^_*CSU-cIX(5n8)eO>>+c!Fbm-C zP{mY{wj+Bw)4va?z3q6O{~Rg$L*jQ`5=3U+UpFLcPS=idPK*Q$Yj@e20Y!w{?^wdp zvcj{^?4hd6P3gmhxfvlj(;v=3QCjWCGfbekOp7*53N~!=g1BSzGjzi8z&vAlwuH%O zg7X*7VP|I#07H=q+z5j#i^40a66H60X&kwqDV@E@_iBc$VD79bWbx64BFxs%+o;_FI8RAGNA? z^K{NQL|x(X_XdCX!~2<#RRio00BwF**T86G#C@(iZ4!Z6=g(Vm*AU0iYpT>$u_t~v zsM1g6M=lrD*qa{a|9sB+Z|!UnCRanv)db-8?-!v`_1_wye1@6-Zq2x%+4`GJR@qtf z_7?a1{^4Ee->y#EUqM*^W~yZEL5!656=lCaOys+YXfr^M>rYRyygb4ak6*&hc7?L+ zVCr!$l89sGUcY7k@8m8j6NC_kjQkpOtce%|J!XxvEO6}TG0bL{aN)uxszudwZJKm~ zWqSes&Pjf0N2EL*{+v}Xtj2#ns7aK8vP}TC2?C)tF=8+7cSXz)f}wOdO5rfNR50ZD zyds@=velp+iRLu7$S{R+}xB#y?@T3PXVH!fpUzmmCO1+M#=xC zdFdEo;Zf(l_fCihRi3G`O@nCfLHfbl8)IQ22JK6kxB+))z4W-y?%s@ z98BKLc>tuC`5cY?<=rNG16K#*ysFLjEjJqnzdP=<$wm#o#Sowg--=2?F zR4&gc$po18+_4j;-@mb85+2swm+Bz5Th=g>hfR)ziB{O6;SR?@0x+K7H>*N_aA^(y zh8b6t{jMeeZ=Nq^hGzY2QI;RAs`=m3HoPmb*p&^~K5ekwn03nO#0Np6hje0d_wPu` zM@jK^ESNmx-Jp#5qQY!R;r@qKaQgbGk>d=AVeRhR} zyjswu=5_t|FsnZb;%Bcq`CUx_-jrWN3RP8a@6Gpqq%4d7f`A1)P&$9dsm}bI($zlY zwq)eJb5g%2iLU#VI@v0-su?8#ciz2(+wPb_krf%ql>pu@6Zp|~shM<@C%IS}nKWtd z%yPmiH&w^Galy6KHJmzi9ILALML zh#Svz;ywiyvlaXoXLojgWM1iQx~lGTMZd0c0KOfG00>a{A9nY4o}8AmpVr`0@F;2Q z1%6)%FliBJ5d!Wg89MGdS?N=|UHh}wwqMPOevAm@4$yUQpF zO856YA{zR@+gVCoTxpJn1o^VBJ8ERWs1 zX7kyiNdgsIPx7b%4o4w|#~DcW!8yOQwKlj0B^LVb;pSq($Cpszg6Vg_^ zbKk`!;O+o_P;nq8qs=j02JX2ZIDR~n+#Cp{Oe|N<6*E0a5vMEv&i4)G`zIs3!Xy0X z>S6o~diiSHxQYP0g}yY`m{*H`v9x^nd%*lVDyZO9Vx&(+H3JR=fyYodMdc$!egA|E z84_cCXl-Gu3OIIbga;m8!Qu51b)Aw*lRIll(L_F8(gmMMt^Bjhfeb;$ z(#BT(493dxGOjs!5*tSjp(vCQ5bC)s6t*RrcH{|IY zT4hmUJdQdd1qED_)~-2nbqkVDbf5rkx$G|t`~9H@fscL&xZy?<6zeLez!{w~-C?Ui zegu!Uf{ZUgVuUX>*++E1SS@aox&n?I1>XJ`aNUAHYAU1IN`Ah1_8u)0#>frplH>e>X{&F@D|TguOOaXa!E@->0fpK)wK-4WQT$~@(^Ta0b*+ujD0BP->b8fBzJ3nSBM zAxbaFkRy;JxCNDPbd|VcnRNu}ss^sV0eJZBc8sy=uL-!P0_OpbeY0OtE+-ab6Z`>; zXZVL|itjJRc>HRV`1XEXZ2^3nzu3sbUZ7I_aaHRlwZ?zxhOo7`b6qPSn$Gg}OtwZu zf$w{$nM#zrE18AmZlase&ZBeGvt*!A%rmTSMqM*TCE=cXRcOn z5W{NOvHJnw)G6SB`+#dsnV%Q)00#-$2?x4AIk-HTC7KhqVIN>iFL}!3p5(VX>Kaf5 zaM!)SjW?NdR#(W5_vP$9n7fq;58?$eUxx$~1sDZ>T#fPH5Q#yXt6x_WfbWD{ zfXec}#(e$+7(WHV5xEmIY1WjAr}F{VtvGJtE5;u6KgJ(6iWLU~>D z)LU+zVP(0%lTYqqf1gnn1h%_>$|bN>2kb}+BpwUOCkvT*cg}gcM>K+9*GG~W6S0u|+zWYtet-unnNdPui;5{JgON+I|gT}X@(g5o2@;*CbLK$x9Wh6&YqQw13 z1aXX#5cB!TGXE%*>gVTkpu8H1t|kEAkzYhV&#a##roRuO`xQ~6+!s%AQ<}RaH&afR z8*NhHtNppxm4PJ1SoWoLy2jbeoxZ4n6Q?Ga&I&y7_zo^!)F_JpM`)52?%dRe`5o<`wrlyn@muw7UnyG_K_BqOsW-TqUIo7s>J=l-3u?fxI^tIhN<$`j~H>E z!|PVE_<%t_%AGOPw_`XWz&#TO9t}hwK%)`9w8wjY>bX~6{M;RLSmp*UcWE2N2szB!Oo2xMpwD-R6_`}tk$_k3KUG>9P1he$^v zbHS*8{{L_9O`~nQ%Im=St-Vik&u!kl@991DPZH{ouv)+|;8X&L$R19`F*q?UAP#my z>~szpsgWvUszxdpCmC@}9LK|$n2;1W6*6p@*dw-olv55)+%Sv*gC#l}kU=2nNqWug z&e?m-`mwv!?!E7m05$7li1*&T=j^@DKIg1Czq!6|er92(w=eD!lI8#;uq>%qx)o z?|Yw5!x%8{{a$n2^BFoXZF3(e+&4Rh@8^;aFCQt=;-3gWiaH)HaPXZOW^WT@|68R5 zIBq3<=onbx$?z|QVrBlFL%m&0CW!YY_ipJMe=ka6G7-GswrY;R=RbD<%~~F(u^Ni+ z4ksfMDX+cJXFuTT z@(SR_8-Ob>uV&hpWe5C&pNT&2DZ#}R23)kd7yrI`;9qZ@-E<3Z-St%&M_G(e#bV$e zHd{QB?tj#3{7`95JIPOg$r^sN%<)!8wV9Dx{1X94VSV9PYSI7u1oD8U`~(DBqiDJ} zInS*F82-j~yT#^$Ps7qhhUL!4#g@9t7;n5`4U2V!Pd%`Y)so0^aoNhq>_4&((yNH* zHj}R!ETuPD>oP@gh{1>nG;Ky#`P^@9ZeVL`1BZtiPn%O&oc8It?uV#fT9c~0yioq}6IwckITR^~oeURe$D=_`nf z%@Fd*|F{g_1^Y1>zIzX&TLje>*tyvT{w}BZcPNieEK(!_@SKUtWv~2qqSU7{sP|~% zrqD1vZ-Hq^07vD{3~ct9jcjhK-$fdYwHHQKg-lmoIm2R+;r>tT;=(zNEDx-VA{Edg z&~i95JJq?FuE@|y>#_C<`}HCMuPv#dvPKeg``O(aqgl!JYx5ZvYbT*kW!T+2z}d5V z*xg-Xd02qDfJhD~YYw1ILV|-68&ItQT6{wvAMkxup!4IQx5;6BHpI*4dqL9N^Sg7t;MrKd7ndrgK@msS?Ojm>T2+pi?his#Idl0YHfXym(ytlspmGLIh|QylQ| zGQoRQRQvodxE0b&7h$y z&v1Nu3&*#&QEI{Ng?*eme~8@+2RJw^p*8EwiLHa44gS87Y?qm{uHLuG^K3#uGj+G8 z)QIzW>82UhpDgPwrCsD_98OyKmu;!zbeds%JI9F=8LqlA$EiyM>+4mkn{H%&RPwjy zz88DjB>uUT9>BBAer)k<6iE+pNC{=fk?)UYwY72i6~L{x0kgT$-+!^(h2ys6`W`#f z!q;~}*03J}vl)I(ZQ}d(9>*8?wcL71kqE%Eg9zY@Q22HM|0y6p$hIDk?LK~}r`R9N z;u`lf3s#r}Jej14!Ijbk&dM}sHdnaq_H}&rGZ`NI!a*&Ei`N+K_9eJ~6Nx0G^qZwA zff@kHpp0#H0EksmsRl&|Pg4*9HBmrAiNYk$aeU_(F1e&KPukl*#NOTt7cLxPe{YGy zWeHvC$_-En1SLdCZ?C?4P9orI6r0iR@B$hnD#o3f1)q%qRT5dIFr6x_t>@U@nc$KW zIW9e!V`oP&n^zLQ)|DzGx;w8DAEevMq4Cx}89WhN(Xi}(IRNy5e+S6}%5uj0|dTi$21MnfAgHR?Py~z->P1)ur!A&M2D zROopX;Q9U8jwb-&r*lp+ZdLP3e5JDis1YtRi&lw5VcuL4YfpjhN1~*zNUv0Zk|iK{ zy%)ZY<2w@&0$lp8Z!XE?qy!HMG;HZ~RJGgMnW^;3&gMF1eM-fuOs zB}4*hLlDSDlxnyZz(RXeg+~P3FGs{klMzv>EGyT-TW$lcx~iI|(Fgv0-^<>;_a60P z^m9T$&!F&Vn)~cwiZ?HI@H1y02hs@NL;zAe75JISJM(P%>E-g^-2%C$acv9vxQ~+o z*#q_*X+t{(?BgQ{%X%!pRaeciSkLjmAMRrJf<~6XPgClQUU0oSVG zAkz2l60HycF;S$Mr69&&qzVkG*O_HGHa90Yb}Xx1`UGW3EDuZU9~3w^Sm9v5#Npuz zs})fc8fDoO*Xe3fp>xlw?E%#~`YEdJ-EMwXZl;KC*(!nvB+MOBBndICxsDtr`}Z}$D|J_BsFcDq&oH0Puzf6pi0TFvQK2X`ih?K#Vzn$$mc(kM zQIr+f=n{1uLZuW?1cDqQfKnMUl_ASBO!5ixTwyw!U^dM$n@zAb&oG~7m`!s`rwWs4 z<;Iugb(@!}E7x^Zy1Fazv5F1--CHu5LTFt*DFiA3W zjAp<8(#xv-{>6H{#czmD^iJa&;W#*Sj$nabV7O=Vcde`UPICOlWP$IUE$~OOpECbM z08%{Vq00iBi>*JJP8WZE|IF@>1N`e^Ae+6P?}L9##T=1DU)=Zk2!%gI39PMUxb2Pw zKKtndJow;YWfY{`%$pYAdL`$*+Jmy6;b_U>LNFs^7aN@f8iLGzZd31IjExgzoYW|a zWI&Tqq2Wo5aTBY8I;}Obx^_XSs-;mWg?XMsEix!k)qh!~vn!QBr208(_dv<=`f@6D zK`DhyGDxPNl(hTtVhkNr#=W5i3REp?B7oBNaKh-@UXN4=eKa(?bH+YPmfN3<`>0)1 zyB~aaVe42NHl}Ru6A3);2H?i$SNr4TMHc&Uz;Um)dtih=zerD(A9$W-MeYjnXR?X@ z`}s86)v3%s5r7n5-B=Z?-Rau;n=;7#`}@29M5$~VoJks8nBvO7n1yLH83=mc$E&GI zT^Z;+|M_cJUsw3dXZEpLY2;bgCm&nrEk(e+7cmnbySL2;8=Av!RQK=pc&fdd5~%kU z)4`{$y#QiUe#E$TZzIKU_)|5*5Q7qt^+du_gGx|BBh%HUcBT|Wbd{CYT?LAj|A5M> zbLv`s5LU&BfIww6p4V0RN;(-|jc^-m?pI@Nt(<-Q&=Ylij~p>4F4~BbsmI15TqJ)D zeup^jd1YC7+~52H;Of&|#(d=KU_Y^mjTw&h=+gjom)wj|Aao~EEoXE5!&2iN3HYC( z%5u5|&&&|XG0EpYKA+9M1Jqw~ku8?}2e+ex*>Y&!>BVjwnAK6$e{|=kHc(m>k>l#q zGu(FDI@T9iw^!=D8Z+;f@N2OaM;#_R^i_pw(xRRDyH>WH<*g0=<^ZAY@nXCA3F2v_ z_{I7n;gpP~&n}&FS_67$`94~2t3e7GsR2Zfd_2@Sq9klEKorUgrEh-@DzW5CPWFdo? zmEiohN7oj<*Ip0Y`66K5DfVMPzZyKes*@1g$wv39)fHciNSVCZ^z5hH}HuXMd_K@BLNoX+vX z`8r;oPjNO?`6mL9;%OEFg=~`l2)X)BQa@@I#Rc2u1~d48mP`7JxVzyfGN2e(qBU$8 z-!D0?z(H{O^bEJ(xsJs`)g)jbxy4IhcD4*YP)lFxk9uUG1vjH~=3`eRTq3r-yNpO!h&G6^}`InZ& zk0?nUeu)62cseTqfT;T>)A_3)_^4^+%7L#ghlqeLGjPT1WYL;DTR z$Gj+jlc#_ezr^3~cRe@!;!}e!qrXr8D4qaA3P|K5*=;Sr+_vFIFylQd@VDbEesRxbUe|4OqWL+1q z-qr=MuW>m5+I`&$9HS~&+bQBEgr4;vo%;|ku#^By_Pj6VGt6o*<){^&`Y=54K_Xxs z%8+HOqGSSM-yA13pcpvCfHL}faRl~jmu=Y9`t>Mdt%2)q1nzn8}>6SHhwsjvt@k?z=Z}@>GtppjSi{uNrI8S}`7KkeMg#3`3tt)MQ57O=p_u zCr-VASfoM)fj5l2?JElmyJtin&|^R>0#fxHA@AO46X@9IyUO_7Jk3^K#6`#}wn>^Kx<^`=|Z!3VtmN;-E6#Ki%NH z%<udyMA5)j<#P)yAwg}7r{wqkke$xmh4Uwk(?yda>rrRY=v#! zZzwMk7%U&kQUiuRUWtQbn9&92Pg;3$)?s2*NG^r9VODua1Dbd1o1 zMHu#7gGoRJeEi)5>e}z=#^(cfya<@jtIymR9>@{>_+;3%u#Z>-o&VTFLLv-+tUzFr z^H;RuD+|%TldwM#fE3Tt(7>0d@D~ZbgT`j8gm%B3eSCVz7hP_Qg>jM@dM4e|Z`U>y=$5VE{8 z8~|z|g}oUZLif5oE1lX18hiiUU?V#Bt=Id(c$*Y3Xq3~8`fWZY+UX7$tssQF0b+K! z0pJ!F02%jnGW-9Bs_vWTl_fBn0k_=^-1PiXPE-Bet9Oj z(TFCiqf#b1yh<#RVRsMMD>ofsM8%KnKY-nkA#oW=t3t$yhyX`w{1zFxs*FrChpH7g z=9q+MPu$yj$WHPnO4R`08%_>f`G!iO6YGR_{XjDTtIWRWOyr$a_s18BN=jF`@TJvU$ShD(dD>T z;brAT32bdh})Dfm0(k_Q+f#XQKx5o1&hDn3i4iA`*C&eS7T97+;!g3dHbhmY_-%JRiN!V~_WLfSB~{Ynvq$y7s=m=6S#i zzY*Bls+52yJ4gsm0XdN253WDm&-kop4X^~1;^#2ox6L>BE_2dkibMcXJZF>ug;Fnn zV^!|G0_6Ya0RjB1$y~}A7+NDnK|dwzwQm-lk+fUa+CF<)pdqFr;em)a88cCogvx;z z+`7O`&z~d9fwI)WuKJj_o(m4P&96jT;zZDod~HVV&S&f_kedz(2>`kY(lRi%&r~UF z2SVCLLRJwV?W{Xcj}WQ>?X8Aqga`(*RwaR3M@P{Z0$uiluOPgwP!`n)-`nm4ZvBR; z-LD)m>XswD_lJOXaH?P6_lzhQ=4)<9P2J!B>)ASAzSR0RF3w6RMIrzxo-H&0S{I+o zvh3SP{Z6*>w+-%nMrqdmzd7-b4Ez7PpyVvdw!H7|9JrZuXBB9d7ZB9dXyI$Fo#T!> z*Ripgqb#(SEtBC6dD2OV-EqL8!Wmd_?>1y3C_a_&+AGBZX>kYoSin&4|7$v#JXaOuhPz(4hRd&* z)P^T9kAfN)#n_H$2lH68!?;LSgb$7O5kC`0M_fWSyp~F0^)6Tw1MK$z)i9vG_gWm= z!eGlD8Ft`v?ixq*;~(K;*quM}JMZ`sAPWqu6(-PHyhB$K|JBz5FZxr!&he_se~^H1 zxX>>K?(WCB@0J8-1#q|?p&jF^fm~s^B7d-$>F-wxdraV;A`yTT_F|Ml3w}c7`L_%3 zMLJ*|%GkvK+febJn?bT~170F4ps@-D7kbl2r!KB@rRbsrW)p=Me8U=Ux_O2?m)gCJ z@TGP!7FhAD5v=Rrh|x68bYar)0r2E*4yXwsTRVocKda**J_gvGaiF3V1p!bxf`U9a zPI$!cykofPQAn8T$&R(|T>Wml1DMQ)UH!)FB z|Unp{xFD*Gcf89_xS^0HjwaMVn)uL@Hf6(U9uV#i?oa}&Duq5zI<121|B zaQa$UCPiKr?*RYUfgS^9%H^Iy7o|5Tf=W(vFui9PXJ~Blv=sg1u60MT?t7Ef$IC!3fSJx zaMueLxcaIIG>KB{FsQmqE<+pF5=Xh1df@)sYSR?(hbAUdwQ zCn9Hy%p~gC?0e8oiJ_Dje{Z*OB6}?&-l7om0kEq72f#V_rZWtXZ3c^Y79G2VGVoXu zD3-u<4&3=d;MUuK$;3AHG56O;gXRF48M9X(yWXfm6HqytJ^u_SvK&8DD0~ly^JyhZ z5sN(Cf)qn>xLp3|bfWH8GI=M#Q`Le~@0}Z9jbN3s)Ya?G&&6NB+(gwY2sF*m0}6oG z6wbcpZ>cKR30!$qj;$?)&wP4`GmmJfteWuV!#u0Xf3wp;y1d)Uat*_Nwl63)1Sqbz z2h0@_nvl~u!ikj;n`e+CX}}U4<0Q^?38I&8HHXBq|Gpl5>B)pug;Hm#Y}pq1c!X+?P~Xs@2N4{;0P6GMFDJV zDBO0(8g960iYx=lGHiiEPho&{uJA%{4;Hd^{3#BKN8D{{OP@*=_j?UmD`U@>*HsiG zl8uLF>9uyhV>9u-2go>tZyv7EGs{ULHC+W;lwH@I8M;%tOIk!a2c$u|k%j@JrKJXt zZt3oBq&ua%MY=;$8itQY-|zkd=ep0e*4b;Xz0cXNo`5=StbVL;cFp8X50YK?Qu;d+ znS^g^OFJ9!va8&(&MOe2RyHjoa#D>&{MWL|w=$OyeN>L>>vp2@`U$B;~Zjj=?Me6 zm?n?#?LW+FKLHV36#;L2P|n(p%1o2)H;?V_b+7q`(M)bz^5g;@h)Ww~Nu072HlCJ9 z3<^S{3v~bT)qVJVHuz9la=U)U>w-rB4<@q`2_Hh|vuS=+XTAfTmiwbnm=|3s#@h=e z_sj6Zp=WvBl(EHs(&QO+l*t>YT5JvX2i)0!z9J-Dz!3`4hs}~}^en?cE_2DmM3Vr5 zPFa;v+r2`mrXDQOg5`r=Rft&f(&(R|Ev#jt_AT{?zt>hvpjmK9E-C?@*hEn;yg4`zuvQxCe*gTg9`%I)RLL1*Z(8&i%Q&3Ot>#GY zmi{wUs*Z2A)-VHI&eLyHSuTLS<+j{L5b5itr*YyaTZ?)U>@|)CLQCEitTiBs0i5$> z@Gez0RN{^BIt~|zlL0$SE%ns@TU7dcT2OY4O_Fd)>j~!mRqxFpZsoez-V?pwTy5#G z@02{0)E;yBuBF1M#^*6lb8ldg$oV|!*!C;gnbm@RI!N07HnR0bQB!C8 z9FLf%kyGgQ4&-}b6q;Ln9T$*b<5H6s;yuSkjZ3LX-*o?-ME|%Z6TC}&i^R=>3*Jiq zV4O=-_@QzN2TtmN#7NU(C-Nw>59zMY%-1n8AF&WI^+rJp!sAF>67?BD!J-R;SBuRj z?ibIM@gVmkjSS&AId-s|%QbG4lP2pRyrklW=#Mmp zl(nQ6Tf8)1pMZU7^Mt7xdksv8dyjL!{N|M@t?xg;7bACyKvB;@{K4NX7yNl0cE;DG z%6`yH*YFdy!2dzzb0I$4Oq$p6otK5JR$$ftCI>#Y({$m;y-WsNV{^?{d#bWN(*h~% z-tOqPw;-WXs)F)IMgP-i9d^_-SP387N!FveRlSmo!r=5aH&iHRQ#_yNb)|p4hkPW= znTJwAMhIN{kJvTzG=7;=FRp4fJzb;NbwenjE18?eEoFSbnX`TF3s z!@VB-WwCUiUYMu?E{<#QhC(41*7Ui<091adv!^CkfL2@{0?1Qq|%eBEO+IJ z5a@cjQs^CfVnz!&(;ds1e%C7E@N;r2z$d&#V5$^QsJ4Dj>UUI$M1Yn(so`m8-?$+O z-IbgJ@);29vX-qQy;X(F5uA3SHtbEyIkVRcwrYN<*Mh@}GH?OP+iTUVBC;34a^@3d z1X8-zD=~XvOx{0&+O(H4ZkhnNNZrBRhu(8BfL!hiocD8#@uBFjHuE zn#H+EG%tLx%Cmsb#OfE(wW9@inZrOPYS8#_rEqFG$Sc>Q&tN(R4Pu~4#R{7P{lUSV zd2PhgYk`%s)`ainkc+QrRr2o_s)({h`7)~7#jA$htPi!mLfh@L+%2CHWD*x~(NSdJ z>SnC`WB*Jx_SzP~$+dS@me~P6b=Q!0+Y0(iQ&7XU(Yl(y&*5BzqOAa(vBS-^ZzS4S zXpVEmEO^x7rKnBz_DDgp?`7g6?Ba_mPePrCJjl?NE}?#x3Fa;_Td&K?pSMdsWpy(C zCS{0?_*EZbY4+tU8eBij`}x;bpPs2A3YlZa-GTaR=0S#A-#O4)YvKl4@I&OEIGVpn z%8$1xqavN2w|!Yi=Myh!!3+}J0dK+qHPBl&wTZ=k)>c^n3-p?PM$scH@WXh1`w#Wq zS*C9K*RLqlb zQvYN=&506PLO7Awg5N?=k&x)6;vd-H?;Z`BsqaG$S0OR;Pl)z+4C(kt@fqw6Kd5 zQ7F9OZ#N13RxaldEK-24qGCnZTFvzEtTqfbh25MP0GbQ(Sk7Z6vKZo_P~D%Eey)N& z{E1qYOzc*lhmj^z?j*e7;%TAD?||AjztJ2v;T`S;)~83HOXV#Sk~o^OM6`^Y4s61u zl8oV4ky+U;)G*V~E`_hq&o7U$oh!4Qb()0v&N;u!m-&wq7G{hEKDCoOML-WiXqj|* zyD?Tu2ptP>Y_7-Y{JSq2-`H#{^jmUZro3Ffu+of!a=bq)-bcq*jtAyldC`ft!%45k zMc5h9z~)!#y%5!0#~fT`I1`y27D9%PywCAG^o{qY7-lw}gBV9ZEJBHtIN+g% zo@40DNbJ!?<(505EeM|p_r*+co&zbX=BQhDHq;NE@cW)jxv_A2=rn>_`9&Sni>{L+ zy^4R!fh4l!t;Udw?E;qJ@C~u-uVWCd*u_*_5I*|wJ1m(ajAxFWpJ{PX2m%xq7ynV9{PTqI}$VpL;Xd=2b8$&-ha@U=j4fr}Nw(6Pg?WAe=c^`TG9gcy{*HU|268Ui8jJnx&D4K`dZ9$W{x`p}Pzv!! z6s7;>Yh78J#prylMP0)T_`)Gv=t-5ljYxTVlDFKK#|)V<-d(qOrHu-533R=hUTs1_ z4cQVzVCSb^Tq6{6MdWjW_+Rc7YR_d}eOSoss=2U@ZJuI5AIXj(-jLb0JS1a|Qj>jN z(OlC2gu0~$BK#cp3>M%TWxSnBd2Dp^QU>623J(Y z<}f!$Lg>mpE-cb-8ojsJ3C1`7{zMfsswvG1eGM+DT5b{JxtfxS6vqzCUj|ikn(PJL zlrWY9_0^5gy7_p3+2h+5YDN!y4x8UT+4~-8n^t{nzIV*#ILn0(l`$8Ij;Wu)4*%f{ z=o_Cp;jscU;SZiA)|=j1^y5MEDW3mY^YfnpxHAVN+1ptslqVw9JbG<$G)XNVKtXXL zUf=b6`A#NtDVaewR|sg}2PXp*VM4C!#IiMR7x-81#0X*aWmNEsKXo_y9M=y&hXw@T z?oI6SdAbI*qjhZ?jZ9Na1riSm^-ff*3bsN41nv_qk3BO7wY-WCFo z0)qymvmGOy4~0zhC7V#sUK>1-oU)a7$3yGKc~7<=mYU5<*qDO)c&VxPR&v zyK=~kt@MQKf4R=!#n@my?4Y{hK0eAGALkN_w7YmA}s@S@s~vpBxeWYi+Q zzW)4?Pjny<4e$8$1B>{}bBZ7pRCRxaQ8D53u=d+)fbeK^^G)EW7fHBowq0<1>EPQm zU|Kly_qA1qsNaC2qb{$CQg2IWHDhE2R%qMXarxYLh}v{9#;u+2BB5l}JSY(dGK;X4 zKgh_h&LtU`r#(nh4Ub43U#mS*IC({H-+q-F7x~NikKwvKuqJ{>{u~&SpI1_IHSS3a z*|G|UHlfiX(g3wj2x!rAAB*--(>rzM&rj=^Y+WFz1u;R6^Ay{^#cl|XDho6Kp;t^_ zgrj0~iP|xa>J4DJzGhfl%UEAG3hV7fZ&7EghZf8lz))#W!%*em1&$y{$~FSI)Poue zI6xlLP?l{r^3Xugek$IF+E1e=HW=D^Gunno^SsmJf!QFs~(fe zXvTb;^yaCb)ZtFka6>fIeE=F48*W@i#`R!Kv_C)qH|-!b`uS0G^t|zcn8Nha`O6R; zaM)fG!&x%q{G~a_knTZLQbIdPYKE9%wxR?!4_!h1p>q2sC>7iGjDXO6u@}?keCa`} zOiP}=(*kBSSh|=kVJ@7^Wa8c4wVN2EI-+Yns9cGkScalGLN>Ak-@gGrVjiUto5$+3 zPa|ETv0{=~&ntcCgnWo@FgK2<`U-xRIET~Z8=Q{fi#Yd^Q-F|M^4BydvhMcTL?%y! z4oT2Xl-Z(|ROwJnwrH}FT!G(a%iV5AZW2Cvpni2^(HqAFncollaa-9#y(HLtk!<|g zBumEc6QF}vqRgKk4T-2(e!-X#k`3?UW_sbk~$d`#xX>1XL8ENfSBvh0z_4mfw(S+mqBxr(j$rTkbL#WJp zu95!VG@wcd9}qa;QhhxJjhG}LrSr;uzOcoti!nOtc%349C^zBv;jSMR9AUPA z2~La1h*;2XCn8IUqRQnb-2it&-TwO;e^EVXIaKecw5sFYGod7@AiMaP^(f1#B3s^X z9yI-kwZS9MGD^1_AkX!DPL97YYr}|rCMz12(Luq2|Kw_P`08)5JfM+&%f_F($Yc)z4 zC!2b0raXVa(Tszle~~|}m#K~cgv-eJXGxqfDe<0uc%?Ikd(HpM zJISy-9AL)I3?=i`#T7`1VwBTVHr4z=4t~ZaudJ&ct1c(q@t8CCzOO?ORRh(|JZZCp zU@RVdx$VrktV>;^A0O~1M5=~Pc#`WC`YGSfM43%RkL&jM!HAEJwa&E`6X`zlB3w0C z><&or0gFfx)VNbg$AS{Qb(aN|8Bg%h7Vp}qvo_d_Ry0!o(n^&~7`da0?vy?}I*qi? zzv=gzjM1py#r)^B=h)MAl2Gab%0ew*i@yk|v7Y}VsMILADZ(++YGN6q8Y?HF&p8Mh zj@!+5tXqIqx8rteMC9#gf=&Jh?su}RN{!Rdqzk&ovjAPd{%fQ{-E4SD!{wg#mk#3; z=wErPD&)Zi{(c*SY{0aQWMbWlb&4Z}t#`>*(ayfs5bxYWF^0ETcD)^3h@j}gRQl>< z)DL1%)!M(F&ZzoxTufB&OTk4)&*alIXSXpCKRuTzuX?xAy}dLz5leF`cpv3KpK4&U z%0=kDRQ~Mo%0QGvOBD2-+Y9=xO_kG2ra)INo zEBd_d_}x7(e;mN5pD{^|w`q~|;q=SaDeBwn*#HM(7;4y-ec7+z@ZhZq4981PLL=@k zT)0Ul+~c7p7_^@}FX7nzMNmpdXe00a3IS&_#7z%Da=r~G9h79<4+^zgwyamjPkN|u zz*$TQK^;o@#p3iWvctWP%SZ|N-5ZL%Fj zb%$|3WpQDeLUy}|3JHPsJ#PTc*0@2}Fu3h-5@lkFH2Zbm6q|K6-8_Ydr@y4xEE@x9 z!_tShDPkxKs3+4@eb8VS+FyR0OL6@;sheRQz>gB91yr-wkYAD}>9zJ5eYW)fM)?H8Xj{}uZR`HrH=;2H8_ zWlR}bc4m5?_y{lBe?yF;3sKpasJ*_-T7SB<{q-(wtG8tF&3}qj)hjZ9s@CSS)ZUWy z&_xA^>AmuTVvi}ZEPRcG9;qZ0!jkq?Rnw{gP}*sY=(Gno-Us&@o2Hc`IQt75`)t6%L6F|}N?`~XPp~qHYqd0|1t%;4Pq8`-3q%I~n z<44cu>2Gz1&MZOyL#GS6KEX#l(dz~;0dI`1;QZL0w0Y6oOfp)(?Zl}tCxk`Y&)us| zrn!b|`FsVeoxr!_G~9>UOPx_CuWsQ7z`QJ0^K*_ZDqTOW18=V%Gm9sx;XpVCJZJal z^mg?l8&7VId2RZ!@Gpmd(O1#*#u=}+HL4bY^b3;sQp`84|B2qt7vxoBL+@-Jx<`b zy6!>P9u4i+gQ8#D**A3;HI!Kbd0m5A%7P1hI1U8Gw%M52q<9ByEkV$gi z(cBFTBT)&On<#3<-a#8bicV-puIQ1nRG_Fl)r5mxO+W7|MqjY`;)nm|ATf5!Z1Nbd zFT(`G&9{53R0?0I-KG(3GuugZ451Ow{N%H|0?B@qQbTl%0d^GMsquQh9GxBy=|%s# zLS%ydx@*^CyOS*!Y>jLR4bORF!7@kzUf92@1AldcMn!eu3A`Z4Kf?se9u4y(Ty|fG zE%^F3U5?$fqCzyg5M&-;k$G~8oYC*=8IFz3@?gHMQwRNkfDcIhNEHIh z@#uH`V&8I)V+@`RDM8;9JdlNVI@rGd7ONLo|K2zb&=wKgVut%)6Ck8d!d7mJ5-0ttqHwB+b$&!VS zzURp{*mgev9p`7Husg%*=W@1DBu4o{Q2%YmcYS_V{&K*;r8pFsDhyu zx5&mheZJ&llVe3;e7exu+Q)tRI)ppiUsy4K;go*g-CJYp6R4o+;69y^*)7)l?+#;> z9GeNyE+1b7FQU8&zPWp{OS8S37K-gS^IHj~wnps75%rya(l0YGN5#iM=cH4->qbs^ zQfj^E2o;i%6(NC-bSp%iGm}*?R?y1RWhA9%ah+jebcAf;okA}|;$^@orR9bOXRB^L zF)y>`_+IUi548TC_DkM-|J3DQmkl+D&kBHTcYFTs5iNR=QAhqgu+LDhF?*@ABWSs(e7lr*}?S_>b=8{OQ z@wXZ(8Mdd3|Iyo$GiycdaFbk&H=8K&6JcU{Q4{Gsb3{95vTN-TpV@xb#uva^C9eof z5h)70Zl4}q3vBUO>?zk)jW*B95aa`>#KmO-L^u*hO&OuDFOUr4EAL;B2e&j8P2MVl z{kb#YBq=RlVKviqcAo z+esVwwnuLT`x}O75U3^@Pgt7o-+>+nR%hQ?Hqa7af4Uw*BG1*J%Eu|IvoCm3c0Gpt z#O0HWW1IO^3$|YYd)lqo)-69AI%XI|5TobR_|$BOi-`neo&coC2oW?pJLjP^*($Js zr`*SPx(-=#Wd>n?(XwHTbVud4FuuU^oXXINuHuTO-xfOtGYLKaUc8n0#PvI2UW*(R z6?k^@6OriC(&<=KZ`IfKU1`|cjM3F(TMo0vS(sOs)f+Pu){}UXMXA6sn?l*3HzQ_O z3lt)Jmp{#Q{sQygkCCJdb7a{+9e-+m9>e}6JzWt}27Ep1T?J=Eu>fLZu!=E~D_`c) zrsbMeq=H=$6F2>tW1OaVwl*j)24rKMq`1lXH@(Spy+6SuMI|AT!c?-DwfB@hMD>-V zN?Y%+2@++C+q4)mJ4pH`bR&>e;p9YGecfSm1qR-fgTbtP3mNHbv0l1yy-a-M;U7sl z?t~$|poPKW_fkn!b@~B0PjE6|17!0j^z8?RwQRVb$LWA&aWFgs@>}#1pkHq*SIsLN z{Y%<{vq>AgwZ?`3E$j7n2Q%sa6W087h+KbK>kZoDw;#+nE;Y^`PJ7>b^hxr>lFX#x ze>|qa-%Ut3Y;x4;Og5_=ajj1hje$>38v2271Cz zxK!v@a6RTu%5%P{}~SWN;=5Z%p(tp{i`FIWjo9Ht~mH87Bel} zvp9K62FGtb##eWcTA(h=jy~!xh{Ym5I+}B8FEw-XXV8MNfO%%32;0y+x;Xc zcuOgY1bIaPdoPKS>oHx&orA}1_^iTY*1t{k;+BCzx0iDH+^q|1lXjRreGyb&Ud(@5 zRJ?Eau_a3sfWy@0_7tj)^au=zU_?S(%T5}X=0o&02c4_5ldr{u$ct;|SF`K4eF(ok zZRwa*0ABL1R(}plx&+w)F>a7vbUWSLUMq&?{z#Vac6juE*`G~xZ%ejU-{_zvY3fJJzc^hxlJ4X z-qo@uqx_gSVz0lv>GomwmX8||Jwf%Kla6l~Xpf!atHE^jS^4?Z;RS7^J@ha{JaF9L z-d1UThCv0HWJN;3S+_buOwjZGj9(}U>qEaE*4-ag?orLf6vrY_aabG8qH z!sKgZe-qkS-FlN?zq%s&OcCR0^~vxB>fYN21TRr^4y9yxNz1(Eu^?dXFbOhqNB-UG zd}Xkx3b>7EB@d(P`q58=Fh}O8X3}`G6O10F>((`o1g1J>3=X2gt8>D#EI~AhzDiK6 z-#==O)7;?rg9O6w?FQ#tJwJ?oYQDcS6+9G8_c-p6)+&PwVa=JP^Nx9e%U@N*`l`6r z=`gxdGng`Cf@jqLeWmvDwt<1nB&KumXW!m2(eYpUVSaFE&4H=2OW_tKenp zUR2gk%K?gTWYyjOfl0`7AF8@HT>A)UzK1eq4qq;1jVIjC`#)yIuOkM$omDatWDL=$ zG#J?f4T;OT?_nYb<5w#-O8y%7`HX*Fk4$nLV6<|f9Tx(@%3*h{X1M0A2LL_~iRcsT z_@+&qvFL6EG^=7&vEdJY%OHuN`A0{0O*|kD{?0~k+|cn}!ulT84SPAIpzB40(1@XH zlaPCg>LEL-BAjv{du-V!Ar2LBx>GKYt5Nwcet5GvsUni~r0P#fb%BVO^c?+wk=A57 zF62PmNmP8l(ndmcZmDLvyFj71Xx91HolJ5*)-H^co|`>*t>JeJ*_>Y^P}TlN)CmNV zN!W+D))|}YWe<_N-?^;5<*b+unv#xNKTWnO`)wSxR1zDl$ByDvlThfsKl&VP3S*SW zLJ=i2mXV5O!SetC>T(N|COCuwflQ6-A|3kctG9yFFIGK3m3gRxW}A{J!B@fk>|uTT zW`W^SNvUYWDLj%`#>53cmj(ML#AyPPLfm!*@_6q=r@6Th$i3sCeQwIEgQ|6kUf1FHl3oB(RLq} zrlbHNeGT;X;z`S395#`TOB2_5eWehZ8mdYRpAw=>MIw=6u|z%e-m<;5p@B~{ONnA_ zMbPWG=MK$c_xnNK<-vBW0wh}Tvq(+*_vYuFs`UPiRepuNH05vI$?ouF2yZ1{I68vO kpqu%E9DF8Kp}oy#Bnn$``g_77Rlv(9E2$_^DQ@Kdf5DgPNdN!< literal 0 HcmV?d00001 diff --git a/Assets/grape_icon_256.png b/Assets/grape_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..75bae9e0a37486e978e9bb3ec48011aceb790b6f GIT binary patch literal 58358 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

_g#+p|67lDmDj82ejp28=Y6&dxW9B4fd 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 Bjq(5h literal 0 HcmV?d00001 diff --git a/DocPostprocess.swift b/DocPostprocess.swift new file mode 100644 index 0000000..824c517 --- /dev/null +++ b/DocPostprocess.swift @@ -0,0 +1,83 @@ +import Foundation + +// Define the paths for the files +let docsDirectoryPath = "./docs" +let iconSourcePath = "./assets/grape_icon_256.png" +let iconDestPath = "./docs/favicon.png" +let moduleNames = [ + "Grape", + "ForceSimulation", +] + +do { + let fileManager = FileManager.default + + // Check if docs directory exists + var isDir: ObjCBool = false + if fileManager.fileExists(atPath: docsDirectoryPath, isDirectory: &isDir) { + if isDir.boolValue { + // Docs directory exists, proceed with enumeration + let enumerator = fileManager.enumerator(atPath: docsDirectoryPath) + + while let element = enumerator?.nextObject() as? String { + if element.hasSuffix("index.html") { // checks the extension + print(element) + let indexPath = "\(docsDirectoryPath)/\(element)" + var htmlString = try String(contentsOfFile: indexPath, encoding: .utf8) + + for moduleName in moduleNames { + htmlString = htmlString.replacingOccurrences( + of: """ + + """, + with: """ + + """) + + htmlString = htmlString.replacingOccurrences( + of: """ + + """, + with: """ + + + + + + + """) + } + try htmlString.write(toFile: indexPath, atomically: false, encoding: .utf8) + } + } + } + } + + // Copy the icon file if it doesn't exist at the destination + if !fileManager.fileExists(atPath: iconDestPath) { + try fileManager.copyItem(atPath: iconSourcePath, toPath: iconDestPath) + } + for moduleName in moduleNames { + let iconDestPath = "./docs/\(moduleName)/favicon.png" + if !fileManager.fileExists(atPath: iconDestPath) { + try fileManager.copyItem(atPath: iconSourcePath, toPath: iconDestPath) + } + } + +} catch { + // Handle errors by printing to the console for now + print("An error occurred: \(error)") +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.pbxproj b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b5bda7d --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.pbxproj @@ -0,0 +1,400 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 60; + objects = { + +/* Begin PBXBuildFile section */ + B7786A1C2AE2DE7800FF7CA8 /* ForceSimulation in Frameworks */ = {isa = PBXBuildFile; productRef = B7786A1B2AE2DE7800FF7CA8 /* ForceSimulation */; }; + B7786A202AE2DEA000FF7CA8 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7786A1F2AE2DEA000FF7CA8 /* Data.swift */; }; + B783A12C2AE2DA4900EC828F /* RealityKitContent in Frameworks */ = {isa = PBXBuildFile; productRef = B783A12B2AE2DA4900EC828F /* RealityKitContent */; }; + B783A12E2AE2DA4900EC828F /* ForceDirectedGraph3DApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B783A12D2AE2DA4900EC828F /* ForceDirectedGraph3DApp.swift */; }; + B783A1302AE2DA4900EC828F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B783A12F2AE2DA4900EC828F /* ContentView.swift */; }; + B783A1322AE2DA4A00EC828F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B783A1312AE2DA4A00EC828F /* Assets.xcassets */; }; + B783A1352AE2DA4A00EC828F /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B783A1342AE2DA4A00EC828F /* Preview Assets.xcassets */; }; + B7FEF0092AFD824000E3BD07 /* ForceSimulation in Frameworks */ = {isa = PBXBuildFile; productRef = B7FEF0082AFD824000E3BD07 /* ForceSimulation */; }; + B7FEF00B2AFD824000E3BD07 /* Grape in Frameworks */ = {isa = PBXBuildFile; productRef = B7FEF00A2AFD824000E3BD07 /* Grape */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + B7786A1F2AE2DEA000FF7CA8 /* Data.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = ""; }; + B783A1262AE2DA4900EC828F /* ForceDirectedGraph3D.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ForceDirectedGraph3D.app; sourceTree = BUILT_PRODUCTS_DIR; }; + B783A12A2AE2DA4900EC828F /* RealityKitContent */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = RealityKitContent; sourceTree = ""; }; + B783A12D2AE2DA4900EC828F /* ForceDirectedGraph3DApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForceDirectedGraph3DApp.swift; sourceTree = ""; }; + B783A12F2AE2DA4900EC828F /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + B783A1312AE2DA4A00EC828F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + B783A1342AE2DA4A00EC828F /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + B783A1362AE2DA4A00EC828F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B783A1232AE2DA4900EC828F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B7FEF00B2AFD824000E3BD07 /* Grape in Frameworks */, + B783A12C2AE2DA4900EC828F /* RealityKitContent in Frameworks */, + B7786A1C2AE2DE7800FF7CA8 /* ForceSimulation in Frameworks */, + B7FEF0092AFD824000E3BD07 /* ForceSimulation in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + B783A11D2AE2DA4900EC828F = { + isa = PBXGroup; + children = ( + B783A1282AE2DA4900EC828F /* ForceDirectedGraph3D */, + B783A1292AE2DA4900EC828F /* Packages */, + B783A1272AE2DA4900EC828F /* Products */, + ); + sourceTree = ""; + }; + B783A1272AE2DA4900EC828F /* Products */ = { + isa = PBXGroup; + children = ( + B783A1262AE2DA4900EC828F /* ForceDirectedGraph3D.app */, + ); + name = Products; + sourceTree = ""; + }; + B783A1282AE2DA4900EC828F /* ForceDirectedGraph3D */ = { + isa = PBXGroup; + children = ( + B7786A1F2AE2DEA000FF7CA8 /* Data.swift */, + B783A12D2AE2DA4900EC828F /* ForceDirectedGraph3DApp.swift */, + B783A12F2AE2DA4900EC828F /* ContentView.swift */, + B783A1312AE2DA4A00EC828F /* Assets.xcassets */, + B783A1362AE2DA4A00EC828F /* Info.plist */, + B783A1332AE2DA4A00EC828F /* Preview Content */, + ); + path = ForceDirectedGraph3D; + sourceTree = ""; + }; + B783A1292AE2DA4900EC828F /* Packages */ = { + isa = PBXGroup; + children = ( + B783A12A2AE2DA4900EC828F /* RealityKitContent */, + ); + path = Packages; + sourceTree = ""; + }; + B783A1332AE2DA4A00EC828F /* Preview Content */ = { + isa = PBXGroup; + children = ( + B783A1342AE2DA4A00EC828F /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B783A1252AE2DA4900EC828F /* ForceDirectedGraph3D */ = { + isa = PBXNativeTarget; + buildConfigurationList = B783A1392AE2DA4A00EC828F /* Build configuration list for PBXNativeTarget "ForceDirectedGraph3D" */; + buildPhases = ( + B783A1222AE2DA4900EC828F /* Sources */, + B783A1232AE2DA4900EC828F /* Frameworks */, + B783A1242AE2DA4900EC828F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ForceDirectedGraph3D; + packageProductDependencies = ( + B783A12B2AE2DA4900EC828F /* RealityKitContent */, + B7786A1B2AE2DE7800FF7CA8 /* ForceSimulation */, + B7FEF0082AFD824000E3BD07 /* ForceSimulation */, + B7FEF00A2AFD824000E3BD07 /* Grape */, + ); + productName = ForceDirectedGraph3D; + productReference = B783A1262AE2DA4900EC828F /* ForceDirectedGraph3D.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + B783A11E2AE2DA4900EC828F /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1510; + LastUpgradeCheck = 1510; + TargetAttributes = { + B783A1252AE2DA4900EC828F = { + CreatedOnToolsVersion = 15.1; + }; + }; + }; + buildConfigurationList = B783A1212AE2DA4900EC828F /* Build configuration list for PBXProject "ForceDirectedGraph3D" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = B783A11D2AE2DA4900EC828F; + packageReferences = ( + B7786A1A2AE2DE7800FF7CA8 /* XCLocalSwiftPackageReference "../.." */, + ); + productRefGroup = B783A1272AE2DA4900EC828F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B783A1252AE2DA4900EC828F /* ForceDirectedGraph3D */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + B783A1242AE2DA4900EC828F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B783A1352AE2DA4A00EC828F /* Preview Assets.xcassets in Resources */, + B783A1322AE2DA4A00EC828F /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B783A1222AE2DA4900EC828F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B783A1302AE2DA4900EC828F /* ContentView.swift in Sources */, + B7786A202AE2DEA000FF7CA8 /* Data.swift in Sources */, + B783A12E2AE2DA4900EC828F /* ForceDirectedGraph3DApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + B783A1372AE2DA4A00EC828F /* 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = xros; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + XROS_DEPLOYMENT_TARGET = 1.0; + }; + name = Debug; + }; + B783A1382AE2DA4A00EC828F /* 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = xros; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + XROS_DEPLOYMENT_TARGET = 1.0; + }; + name = Release; + }; + B783A13A2AE2DA4A00EC828F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"ForceDirectedGraph3D/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "$(TARGET_NAME)/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = me.lizhen.ForceDirectedGraph3D; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Debug; + }; + B783A13B2AE2DA4A00EC828F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"ForceDirectedGraph3D/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "$(TARGET_NAME)/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = me.lizhen.ForceDirectedGraph3D; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + B783A1212AE2DA4900EC828F /* Build configuration list for PBXProject "ForceDirectedGraph3D" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B783A1372AE2DA4A00EC828F /* Debug */, + B783A1382AE2DA4A00EC828F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B783A1392AE2DA4A00EC828F /* Build configuration list for PBXNativeTarget "ForceDirectedGraph3D" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B783A13A2AE2DA4A00EC828F /* Debug */, + B783A13B2AE2DA4A00EC828F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + B7786A1A2AE2DE7800FF7CA8 /* XCLocalSwiftPackageReference "../.." */ = { + isa = XCLocalSwiftPackageReference; + relativePath = ../..; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + B7786A1B2AE2DE7800FF7CA8 /* ForceSimulation */ = { + isa = XCSwiftPackageProductDependency; + productName = ForceSimulation; + }; + B783A12B2AE2DA4900EC828F /* RealityKitContent */ = { + isa = XCSwiftPackageProductDependency; + productName = RealityKitContent; + }; + B7FEF0082AFD824000E3BD07 /* ForceSimulation */ = { + isa = XCSwiftPackageProductDependency; + productName = ForceSimulation; + }; + B7FEF00A2AFD824000E3BD07 /* Grape */ = { + isa = XCSwiftPackageProductDependency; + productName = Grape; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = B783A11E2AE2DA4900EC828F /* Project object */; +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..04056a5 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "vision", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Contents.json new file mode 100644 index 0000000..950af4d --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "layers" : [ + { + "filename" : "Front.solidimagestacklayer" + }, + { + "filename" : "Middle.solidimagestacklayer" + }, + { + "filename" : "Back.solidimagestacklayer" + } + ] +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..04056a5 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "vision", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..04056a5 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "vision", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift new file mode 100644 index 0000000..598fb90 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift @@ -0,0 +1,221 @@ +// +// ContentView.swift +// ForceDirectedGraph3D +// +// Created by li3zhen1 on 10/20/23. +// + +import SwiftUI +import RealityKit +import RealityKitContent +import simd +import ForceSimulation +import Grape + + +struct My3DForce: ForceField3D { + typealias Vector = SIMD3 + + var force = CompositedForce { + Kinetics3D.CenterForce(center: .zero, strength: 1) + Kinetics3D.ManyBodyForce(strength: -1) + Kinetics3D.LinkForce(stiffness: .constant(0.5)) + } +} + + +func buildSimulation() -> Simulation3D { + let data = getData(miserables) + + + let links = data.links.map { l in + let fromID = data.nodes.firstIndex { mn in + mn.id == l.source + }! + let toID = data.nodes.firstIndex { mn in + mn.id == l.target + }! + return EdgeID(source: fromID, target: toID) + } + + let sim = Simulation( + nodeCount: data.nodes.count, + links: links, + forceField: My3DForce() + ) + + for i in 0..<720 { + sim.tick() + } + return sim +} + + +func getLinkIndices() -> [(Int, Int)] { + let data = getData(miserables) + + let linkIds = data.links.map { l in + (data.nodes.firstIndex{l.source==$0.id}!, data.nodes.firstIndex{l.target==$0.id}!) } + return linkIds +} + +let scaleRatio: Float = 0.0027 + + +let materialColors: [UIColor] = [ + UIColor(red: 17.0/255, green: 181.0/255, blue: 174.0/255, alpha: 1.0), + UIColor(red: 64.0/255, green: 70.0/255, blue: 201.0/255, alpha: 1.0), + UIColor(red: 246.0/255, green: 133.0/255, blue: 18.0/255, alpha: 1.0), + UIColor(red: 222.0/255, green: 60.0/255, blue: 130.0/255, alpha: 1.0), + UIColor(red: 17.0/255, green: 181.0/255, blue: 174.0/255, alpha: 1.0), + UIColor(red: 114.0/255, green: 224.0/255, blue: 106.0/255, alpha: 1.0), + UIColor(red: 22.0/255, green: 124.0/255, blue: 243.0/255, alpha: 1.0), + UIColor(red: 115.0/255, green: 38.0/255, blue: 211.0/255, alpha: 1.0), + UIColor(red: 232.0/255, green: 198.0/255, blue: 0.0/255, alpha: 1.0), + UIColor(red: 203.0/255, green: 93.0/255, blue: 2.0/255, alpha: 1.0), + UIColor(red: 0.0/255, green: 143.0/255, blue: 93.0/255, alpha: 1.0), + UIColor(red: 188.0/255, green: 233.0/255, blue: 49.0/255, alpha: 1.0), +] + + +struct ContentView: View { + + @State var test = false + + var body: some View { + + VStack { + RealityView { content in + + var material = PhysicallyBasedMaterial() + material.baseColor = PhysicallyBasedMaterial.BaseColor(tint: UIColor(white: 1.0, alpha: 0.2)) + material.roughness = PhysicallyBasedMaterial.Roughness(floatLiteral: 0.8) + material.metallic = PhysicallyBasedMaterial.Metallic(floatLiteral: 0.2) + + + + + let nodeMaterials = materialColors.map { c in + var material = PhysicallyBasedMaterial() + material.baseColor = PhysicallyBasedMaterial.BaseColor(tint: c) + material.roughness = PhysicallyBasedMaterial.Roughness(floatLiteral: 1.0) + material.metallic = PhysicallyBasedMaterial.Metallic(floatLiteral: 0.01) + + material.emissiveColor = PhysicallyBasedMaterial.EmissiveColor(color: c) + material.emissiveIntensity = 0.4 + return material + } + + let sim = buildSimulation() + + + let positions = sim.kinetics.position.asArray().map { pos in simd_float3( + (pos[1]) * scaleRatio, + -(pos[0]) * scaleRatio, + (pos[2]) * scaleRatio + 0.25 + )} + + + for i in positions.indices { + let gid = getData(miserables).nodes[i].group + + let sphere = MeshResource.generateSphere(radius: 0.005) + + let sphereEntity = ModelEntity(mesh: sphere, materials: [ + nodeMaterials[gid%nodeMaterials.count] + ]) + + sphereEntity.position = positions[i] + + content.add(sphereEntity) + } + + + + + + let linkIds = getLinkIndices() + + for (f, t) in linkIds { + content.add( + withCylinder( + from: positions[f], + to: positions[t], + material: material + ) + ) + } + + + + + + } update: { content in + guard let animationResource = try? AnimationResource.generate(with: OrbitAnimation(trimDuration: 1)) else {return} + content.entities.forEach { e in + e.playAnimation(animationResource, transitionDuration: 1) + } + } + .frame(depth: 10.0) + + + }.ornament(attachmentAnchor: .scene(alignment: .bottom)) { + Button { + + } label: { + Text("Force Directed Graph Example for visionOS") + } + } + + } + + + private func withCylinder( + from fromPosition: simd_float3, + to toPosition: simd_float3, + material: PhysicallyBasedMaterial + ) -> ModelEntity { + + + + + let cylinderVector = toPosition - fromPosition + + // calculate the height of the cylinder as the distance between the two points + let height = simd_length(cylinderVector) + let direction = simd_normalize(cylinderVector) + + // calculate the midpoint position + let midpoint = SIMD3((fromPosition.x + toPosition.x) / 2, + (fromPosition.y + toPosition.y) / 2, + (fromPosition.z + toPosition.z) / 2) + + // create the cylinder + let cylinder = MeshResource.generateCylinder(height: height, radius: 0.0005) + let cylinderEntity = ModelEntity(mesh: cylinder, materials: [material]) + + // The default cylinder is aligned along the y-axis. Assuming the 'direction' is not parallel to the y-axis, + // calculate the quaternion to rotate from the y-axis to the desired direction. + let yAxis = SIMD3(0, 1, 0) // default cylinder orientation + let dotProduct = simd_dot(yAxis, direction) + let crossProduct = simd_cross(yAxis, direction) + + // Using the dot product (cosine of angle) and the cross product (axis of rotation) + // to create a quaternion representing the rotation + let quaternion = simd_quatf(ix: crossProduct.x, iy: crossProduct.y, iz: crossProduct.z, r: 1 + dotProduct) + + // Normalize the quaternion to ensure valid rotation + let rotation = simd_normalize(quaternion) + + // Apply the transformations + cylinderEntity.transform = Transform(scale: SIMD3(1, 1, 1), + rotation: rotation, + translation: midpoint) + + return cylinderEntity + } +} + +#Preview(windowStyle: .automatic) { + ContentView() +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Data.swift b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Data.swift new file mode 100644 index 0000000..c954a07 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Data.swift @@ -0,0 +1,408 @@ +// +// miserables.swift +// GrapeView +// +// Created by li3zhen1 on 10/8/23. +// + +import Foundation + +let miserables3 = """ +{ + "nodes": [ + + {"id": "Myriel", "group": 1}, + {"id": "Napoleon", "group": 1}, + +], "links": [ + {"source": "Myriel", "target": "Napoleon", "value": 3}, +] +} +""" + +let miserables2 = """ +{ + "nodes": [ + + {"id": "Myriel", "group": 1}, + {"id": "Napoleon", "group": 1}, + {"id": "Mlle.Baptistine", "group": 1}, + {"id": "Valjean", "group": 2}, + {"id": "Marguerite", "group": 3}, + {"id": "Mme.deR", "group": 2}, + +], "links": [ + {"source": "Myriel", "target": "Napoleon", "value": 3}, + {"source": "Myriel", "target": "Mlle.Baptistine", "value": 3}, + {"source": "Napoleon", "target": "Mme.deR", "value": 3}, + {"source": "Mlle.Baptistine", "target": "Valjean", "value": 3} +] +} +""" + +let miserables = """ +{ + "nodes": [ + {"id": "Myriel", "group": 1}, + {"id": "Napoleon", "group": 1}, + {"id": "Mlle.Baptistine", "group": 1}, + {"id": "Mme.Magloire", "group": 1}, + {"id": "CountessdeLo", "group": 1}, + {"id": "Geborand", "group": 1}, + {"id": "Champtercier", "group": 1}, + {"id": "Cravatte", "group": 1}, + {"id": "Count", "group": 1}, + {"id": "OldMan", "group": 1}, + {"id": "Labarre", "group": 2}, + {"id": "Valjean", "group": 2}, + {"id": "Marguerite", "group": 3}, + {"id": "Mme.deR", "group": 2}, + {"id": "Isabeau", "group": 2}, + {"id": "Gervais", "group": 2}, + {"id": "Tholomyes", "group": 3}, + {"id": "Listolier", "group": 3}, + {"id": "Fameuil", "group": 3}, + {"id": "Blacheville", "group": 3}, + {"id": "Favourite", "group": 3}, + {"id": "Dahlia", "group": 3}, + {"id": "Zephine", "group": 3}, + {"id": "Fantine", "group": 3}, + {"id": "Mme.Thenardier", "group": 4}, + {"id": "Thenardier", "group": 4}, + {"id": "Cosette", "group": 5}, + {"id": "Javert", "group": 4}, + {"id": "Fauchelevent", "group": 0}, + {"id": "Bamatabois", "group": 2}, + {"id": "Perpetue", "group": 3}, + {"id": "Simplice", "group": 2}, + {"id": "Scaufflaire", "group": 2}, + {"id": "Woman1", "group": 2}, + {"id": "Judge", "group": 2}, + {"id": "Champmathieu", "group": 2}, + {"id": "Brevet", "group": 2}, + {"id": "Chenildieu", "group": 2}, + {"id": "Cochepaille", "group": 2}, + {"id": "Pontmercy", "group": 4}, + {"id": "Boulatruelle", "group": 6}, + {"id": "Eponine", "group": 4}, + {"id": "Anzelma", "group": 4}, + {"id": "Woman2", "group": 5}, + {"id": "MotherInnocent", "group": 0}, + {"id": "Gribier", "group": 0}, + {"id": "Jondrette", "group": 7}, + {"id": "Mme.Burgon", "group": 7}, + {"id": "Gavroche", "group": 8}, + {"id": "Gillenormand", "group": 5}, + {"id": "Magnon", "group": 5}, + {"id": "Mlle.Gillenormand", "group": 5}, + {"id": "Mme.Pontmercy", "group": 5}, + {"id": "Mlle.Vaubois", "group": 5}, + {"id": "Lt.Gillenormand", "group": 5}, + {"id": "Marius", "group": 8}, + {"id": "BaronessT", "group": 5}, + {"id": "Mabeuf", "group": 8}, + {"id": "Enjolras", "group": 8}, + {"id": "Combeferre", "group": 8}, + {"id": "Prouvaire", "group": 8}, + {"id": "Feuilly", "group": 8}, + {"id": "Courfeyrac", "group": 8}, + {"id": "Bahorel", "group": 8}, + {"id": "Bossuet", "group": 8}, + {"id": "Joly", "group": 8}, + {"id": "Grantaire", "group": 8}, + {"id": "MotherPlutarch", "group": 9}, + {"id": "Gueulemer", "group": 4}, + {"id": "Babet", "group": 4}, + {"id": "Claquesous", "group": 4}, + {"id": "Montparnasse", "group": 4}, + {"id": "Toussaint", "group": 5}, + {"id": "Child1", "group": 10}, + {"id": "Child2", "group": 10}, + {"id": "Brujon", "group": 4}, + {"id": "Mme.Hucheloup", "group": 8} + ], + "links": [ + {"source": "Napoleon", "target": "Myriel", "value": 1}, + {"source": "Mlle.Baptistine", "target": "Myriel", "value": 8}, + {"source": "Mme.Magloire", "target": "Myriel", "value": 10}, + {"source": "Mme.Magloire", "target": "Mlle.Baptistine", "value": 6}, + {"source": "CountessdeLo", "target": "Myriel", "value": 1}, + {"source": "Geborand", "target": "Myriel", "value": 1}, + {"source": "Champtercier", "target": "Myriel", "value": 1}, + {"source": "Cravatte", "target": "Myriel", "value": 1}, + {"source": "Count", "target": "Myriel", "value": 2}, + {"source": "OldMan", "target": "Myriel", "value": 1}, + {"source": "Valjean", "target": "Labarre", "value": 1}, + {"source": "Valjean", "target": "Mme.Magloire", "value": 3}, + {"source": "Valjean", "target": "Mlle.Baptistine", "value": 3}, + {"source": "Valjean", "target": "Myriel", "value": 5}, + {"source": "Marguerite", "target": "Valjean", "value": 1}, + {"source": "Mme.deR", "target": "Valjean", "value": 1}, + {"source": "Isabeau", "target": "Valjean", "value": 1}, + {"source": "Gervais", "target": "Valjean", "value": 1}, + {"source": "Listolier", "target": "Tholomyes", "value": 4}, + {"source": "Fameuil", "target": "Tholomyes", "value": 4}, + {"source": "Fameuil", "target": "Listolier", "value": 4}, + {"source": "Blacheville", "target": "Tholomyes", "value": 4}, + {"source": "Blacheville", "target": "Listolier", "value": 4}, + {"source": "Blacheville", "target": "Fameuil", "value": 4}, + {"source": "Favourite", "target": "Tholomyes", "value": 3}, + {"source": "Favourite", "target": "Listolier", "value": 3}, + {"source": "Favourite", "target": "Fameuil", "value": 3}, + {"source": "Favourite", "target": "Blacheville", "value": 4}, + {"source": "Dahlia", "target": "Tholomyes", "value": 3}, + {"source": "Dahlia", "target": "Listolier", "value": 3}, + {"source": "Dahlia", "target": "Fameuil", "value": 3}, + {"source": "Dahlia", "target": "Blacheville", "value": 3}, + {"source": "Dahlia", "target": "Favourite", "value": 5}, + {"source": "Zephine", "target": "Tholomyes", "value": 3}, + {"source": "Zephine", "target": "Listolier", "value": 3}, + {"source": "Zephine", "target": "Fameuil", "value": 3}, + {"source": "Zephine", "target": "Blacheville", "value": 3}, + {"source": "Zephine", "target": "Favourite", "value": 4}, + {"source": "Zephine", "target": "Dahlia", "value": 4}, + {"source": "Fantine", "target": "Tholomyes", "value": 3}, + {"source": "Fantine", "target": "Listolier", "value": 3}, + {"source": "Fantine", "target": "Fameuil", "value": 3}, + {"source": "Fantine", "target": "Blacheville", "value": 3}, + {"source": "Fantine", "target": "Favourite", "value": 4}, + {"source": "Fantine", "target": "Dahlia", "value": 4}, + {"source": "Fantine", "target": "Zephine", "value": 4}, + {"source": "Fantine", "target": "Marguerite", "value": 2}, + {"source": "Fantine", "target": "Valjean", "value": 9}, + {"source": "Mme.Thenardier", "target": "Fantine", "value": 2}, + {"source": "Mme.Thenardier", "target": "Valjean", "value": 7}, + {"source": "Thenardier", "target": "Mme.Thenardier", "value": 13}, + {"source": "Thenardier", "target": "Fantine", "value": 1}, + {"source": "Thenardier", "target": "Valjean", "value": 12}, + {"source": "Cosette", "target": "Mme.Thenardier", "value": 4}, + {"source": "Cosette", "target": "Valjean", "value": 31}, + {"source": "Cosette", "target": "Tholomyes", "value": 1}, + {"source": "Cosette", "target": "Thenardier", "value": 1}, + {"source": "Javert", "target": "Valjean", "value": 17}, + {"source": "Javert", "target": "Fantine", "value": 5}, + {"source": "Javert", "target": "Thenardier", "value": 5}, + {"source": "Javert", "target": "Mme.Thenardier", "value": 1}, + {"source": "Javert", "target": "Cosette", "value": 1}, + {"source": "Fauchelevent", "target": "Valjean", "value": 8}, + {"source": "Fauchelevent", "target": "Javert", "value": 1}, + {"source": "Bamatabois", "target": "Fantine", "value": 1}, + {"source": "Bamatabois", "target": "Javert", "value": 1}, + {"source": "Bamatabois", "target": "Valjean", "value": 2}, + {"source": "Perpetue", "target": "Fantine", "value": 1}, + {"source": "Simplice", "target": "Perpetue", "value": 2}, + {"source": "Simplice", "target": "Valjean", "value": 3}, + {"source": "Simplice", "target": "Fantine", "value": 2}, + {"source": "Simplice", "target": "Javert", "value": 1}, + {"source": "Scaufflaire", "target": "Valjean", "value": 1}, + {"source": "Woman1", "target": "Valjean", "value": 2}, + {"source": "Woman1", "target": "Javert", "value": 1}, + {"source": "Judge", "target": "Valjean", "value": 3}, + {"source": "Judge", "target": "Bamatabois", "value": 2}, + {"source": "Champmathieu", "target": "Valjean", "value": 3}, + {"source": "Champmathieu", "target": "Judge", "value": 3}, + {"source": "Champmathieu", "target": "Bamatabois", "value": 2}, + {"source": "Brevet", "target": "Judge", "value": 2}, + {"source": "Brevet", "target": "Champmathieu", "value": 2}, + {"source": "Brevet", "target": "Valjean", "value": 2}, + {"source": "Brevet", "target": "Bamatabois", "value": 1}, + {"source": "Chenildieu", "target": "Judge", "value": 2}, + {"source": "Chenildieu", "target": "Champmathieu", "value": 2}, + {"source": "Chenildieu", "target": "Brevet", "value": 2}, + {"source": "Chenildieu", "target": "Valjean", "value": 2}, + {"source": "Chenildieu", "target": "Bamatabois", "value": 1}, + {"source": "Cochepaille", "target": "Judge", "value": 2}, + {"source": "Cochepaille", "target": "Champmathieu", "value": 2}, + {"source": "Cochepaille", "target": "Brevet", "value": 2}, + {"source": "Cochepaille", "target": "Chenildieu", "value": 2}, + {"source": "Cochepaille", "target": "Valjean", "value": 2}, + {"source": "Cochepaille", "target": "Bamatabois", "value": 1}, + {"source": "Pontmercy", "target": "Thenardier", "value": 1}, + {"source": "Boulatruelle", "target": "Thenardier", "value": 1}, + {"source": "Eponine", "target": "Mme.Thenardier", "value": 2}, + {"source": "Eponine", "target": "Thenardier", "value": 3}, + {"source": "Anzelma", "target": "Eponine", "value": 2}, + {"source": "Anzelma", "target": "Thenardier", "value": 2}, + {"source": "Anzelma", "target": "Mme.Thenardier", "value": 1}, + {"source": "Woman2", "target": "Valjean", "value": 3}, + {"source": "Woman2", "target": "Cosette", "value": 1}, + {"source": "Woman2", "target": "Javert", "value": 1}, + {"source": "MotherInnocent", "target": "Fauchelevent", "value": 3}, + {"source": "MotherInnocent", "target": "Valjean", "value": 1}, + {"source": "Gribier", "target": "Fauchelevent", "value": 2}, + {"source": "Mme.Burgon", "target": "Jondrette", "value": 1}, + {"source": "Gavroche", "target": "Mme.Burgon", "value": 2}, + {"source": "Gavroche", "target": "Thenardier", "value": 1}, + {"source": "Gavroche", "target": "Javert", "value": 1}, + {"source": "Gavroche", "target": "Valjean", "value": 1}, + {"source": "Gillenormand", "target": "Cosette", "value": 3}, + {"source": "Gillenormand", "target": "Valjean", "value": 2}, + {"source": "Magnon", "target": "Gillenormand", "value": 1}, + {"source": "Magnon", "target": "Mme.Thenardier", "value": 1}, + {"source": "Mlle.Gillenormand", "target": "Gillenormand", "value": 9}, + {"source": "Mlle.Gillenormand", "target": "Cosette", "value": 2}, + {"source": "Mlle.Gillenormand", "target": "Valjean", "value": 2}, + {"source": "Mme.Pontmercy", "target": "Mlle.Gillenormand", "value": 1}, + {"source": "Mme.Pontmercy", "target": "Pontmercy", "value": 1}, + {"source": "Mlle.Vaubois", "target": "Mlle.Gillenormand", "value": 1}, + {"source": "Lt.Gillenormand", "target": "Mlle.Gillenormand", "value": 2}, + {"source": "Lt.Gillenormand", "target": "Gillenormand", "value": 1}, + {"source": "Lt.Gillenormand", "target": "Cosette", "value": 1}, + {"source": "Marius", "target": "Mlle.Gillenormand", "value": 6}, + {"source": "Marius", "target": "Gillenormand", "value": 12}, + {"source": "Marius", "target": "Pontmercy", "value": 1}, + {"source": "Marius", "target": "Lt.Gillenormand", "value": 1}, + {"source": "Marius", "target": "Cosette", "value": 21}, + {"source": "Marius", "target": "Valjean", "value": 19}, + {"source": "Marius", "target": "Tholomyes", "value": 1}, + {"source": "Marius", "target": "Thenardier", "value": 2}, + {"source": "Marius", "target": "Eponine", "value": 5}, + {"source": "Marius", "target": "Gavroche", "value": 4}, + {"source": "BaronessT", "target": "Gillenormand", "value": 1}, + {"source": "BaronessT", "target": "Marius", "value": 1}, + {"source": "Mabeuf", "target": "Marius", "value": 1}, + {"source": "Mabeuf", "target": "Eponine", "value": 1}, + {"source": "Mabeuf", "target": "Gavroche", "value": 1}, + {"source": "Enjolras", "target": "Marius", "value": 7}, + {"source": "Enjolras", "target": "Gavroche", "value": 7}, + {"source": "Enjolras", "target": "Javert", "value": 6}, + {"source": "Enjolras", "target": "Mabeuf", "value": 1}, + {"source": "Enjolras", "target": "Valjean", "value": 4}, + {"source": "Combeferre", "target": "Enjolras", "value": 15}, + {"source": "Combeferre", "target": "Marius", "value": 5}, + {"source": "Combeferre", "target": "Gavroche", "value": 6}, + {"source": "Combeferre", "target": "Mabeuf", "value": 2}, + {"source": "Prouvaire", "target": "Gavroche", "value": 1}, + {"source": "Prouvaire", "target": "Enjolras", "value": 4}, + {"source": "Prouvaire", "target": "Combeferre", "value": 2}, + {"source": "Feuilly", "target": "Gavroche", "value": 2}, + {"source": "Feuilly", "target": "Enjolras", "value": 6}, + {"source": "Feuilly", "target": "Prouvaire", "value": 2}, + {"source": "Feuilly", "target": "Combeferre", "value": 5}, + {"source": "Feuilly", "target": "Mabeuf", "value": 1}, + {"source": "Feuilly", "target": "Marius", "value": 1}, + {"source": "Courfeyrac", "target": "Marius", "value": 9}, + {"source": "Courfeyrac", "target": "Enjolras", "value": 17}, + {"source": "Courfeyrac", "target": "Combeferre", "value": 13}, + {"source": "Courfeyrac", "target": "Gavroche", "value": 7}, + {"source": "Courfeyrac", "target": "Mabeuf", "value": 2}, + {"source": "Courfeyrac", "target": "Eponine", "value": 1}, + {"source": "Courfeyrac", "target": "Feuilly", "value": 6}, + {"source": "Courfeyrac", "target": "Prouvaire", "value": 3}, + {"source": "Bahorel", "target": "Combeferre", "value": 5}, + {"source": "Bahorel", "target": "Gavroche", "value": 5}, + {"source": "Bahorel", "target": "Courfeyrac", "value": 6}, + {"source": "Bahorel", "target": "Mabeuf", "value": 2}, + {"source": "Bahorel", "target": "Enjolras", "value": 4}, + {"source": "Bahorel", "target": "Feuilly", "value": 3}, + {"source": "Bahorel", "target": "Prouvaire", "value": 2}, + {"source": "Bahorel", "target": "Marius", "value": 1}, + {"source": "Bossuet", "target": "Marius", "value": 5}, + {"source": "Bossuet", "target": "Courfeyrac", "value": 12}, + {"source": "Bossuet", "target": "Gavroche", "value": 5}, + {"source": "Bossuet", "target": "Bahorel", "value": 4}, + {"source": "Bossuet", "target": "Enjolras", "value": 10}, + {"source": "Bossuet", "target": "Feuilly", "value": 6}, + {"source": "Bossuet", "target": "Prouvaire", "value": 2}, + {"source": "Bossuet", "target": "Combeferre", "value": 9}, + {"source": "Bossuet", "target": "Mabeuf", "value": 1}, + {"source": "Bossuet", "target": "Valjean", "value": 1}, + {"source": "Joly", "target": "Bahorel", "value": 5}, + {"source": "Joly", "target": "Bossuet", "value": 7}, + {"source": "Joly", "target": "Gavroche", "value": 3}, + {"source": "Joly", "target": "Courfeyrac", "value": 5}, + {"source": "Joly", "target": "Enjolras", "value": 5}, + {"source": "Joly", "target": "Feuilly", "value": 5}, + {"source": "Joly", "target": "Prouvaire", "value": 2}, + {"source": "Joly", "target": "Combeferre", "value": 5}, + {"source": "Joly", "target": "Mabeuf", "value": 1}, + {"source": "Joly", "target": "Marius", "value": 2}, + {"source": "Grantaire", "target": "Bossuet", "value": 3}, + {"source": "Grantaire", "target": "Enjolras", "value": 3}, + {"source": "Grantaire", "target": "Combeferre", "value": 1}, + {"source": "Grantaire", "target": "Courfeyrac", "value": 2}, + {"source": "Grantaire", "target": "Joly", "value": 2}, + {"source": "Grantaire", "target": "Gavroche", "value": 1}, + {"source": "Grantaire", "target": "Bahorel", "value": 1}, + {"source": "Grantaire", "target": "Feuilly", "value": 1}, + {"source": "Grantaire", "target": "Prouvaire", "value": 1}, + {"source": "MotherPlutarch", "target": "Mabeuf", "value": 3}, + {"source": "Gueulemer", "target": "Thenardier", "value": 5}, + {"source": "Gueulemer", "target": "Valjean", "value": 1}, + {"source": "Gueulemer", "target": "Mme.Thenardier", "value": 1}, + {"source": "Gueulemer", "target": "Javert", "value": 1}, + {"source": "Gueulemer", "target": "Gavroche", "value": 1}, + {"source": "Gueulemer", "target": "Eponine", "value": 1}, + {"source": "Babet", "target": "Thenardier", "value": 6}, + {"source": "Babet", "target": "Gueulemer", "value": 6}, + {"source": "Babet", "target": "Valjean", "value": 1}, + {"source": "Babet", "target": "Mme.Thenardier", "value": 1}, + {"source": "Babet", "target": "Javert", "value": 2}, + {"source": "Babet", "target": "Gavroche", "value": 1}, + {"source": "Babet", "target": "Eponine", "value": 1}, + {"source": "Claquesous", "target": "Thenardier", "value": 4}, + {"source": "Claquesous", "target": "Babet", "value": 4}, + {"source": "Claquesous", "target": "Gueulemer", "value": 4}, + {"source": "Claquesous", "target": "Valjean", "value": 1}, + {"source": "Claquesous", "target": "Mme.Thenardier", "value": 1}, + {"source": "Claquesous", "target": "Javert", "value": 1}, + {"source": "Claquesous", "target": "Eponine", "value": 1}, + {"source": "Claquesous", "target": "Enjolras", "value": 1}, + {"source": "Montparnasse", "target": "Javert", "value": 1}, + {"source": "Montparnasse", "target": "Babet", "value": 2}, + {"source": "Montparnasse", "target": "Gueulemer", "value": 2}, + {"source": "Montparnasse", "target": "Claquesous", "value": 2}, + {"source": "Montparnasse", "target": "Valjean", "value": 1}, + {"source": "Montparnasse", "target": "Gavroche", "value": 1}, + {"source": "Montparnasse", "target": "Eponine", "value": 1}, + {"source": "Montparnasse", "target": "Thenardier", "value": 1}, + {"source": "Toussaint", "target": "Cosette", "value": 2}, + {"source": "Toussaint", "target": "Javert", "value": 1}, + {"source": "Toussaint", "target": "Valjean", "value": 1}, + {"source": "Child1", "target": "Gavroche", "value": 2}, + {"source": "Child2", "target": "Gavroche", "value": 2}, + {"source": "Child2", "target": "Child1", "value": 3}, + {"source": "Brujon", "target": "Babet", "value": 3}, + {"source": "Brujon", "target": "Gueulemer", "value": 3}, + {"source": "Brujon", "target": "Thenardier", "value": 3}, + {"source": "Brujon", "target": "Gavroche", "value": 1}, + {"source": "Brujon", "target": "Eponine", "value": 1}, + {"source": "Brujon", "target": "Claquesous", "value": 1}, + {"source": "Brujon", "target": "Montparnasse", "value": 1}, + {"source": "Mme.Hucheloup", "target": "Bossuet", "value": 1}, + {"source": "Mme.Hucheloup", "target": "Joly", "value": 1}, + {"source": "Mme.Hucheloup", "target": "Grantaire", "value": 1}, + {"source": "Mme.Hucheloup", "target": "Bahorel", "value": 1}, + {"source": "Mme.Hucheloup", "target": "Courfeyrac", "value": 1}, + {"source": "Mme.Hucheloup", "target": "Gavroche", "value": 1}, + {"source": "Mme.Hucheloup", "target": "Enjolras", "value": 1} + ] +} +""" + + + + + +struct Miserable: Codable { + + struct Node: Codable, Identifiable { + let id: String + let group: Int + } + + struct Edge: Codable { + let source: String + let target: String + let value: Int + } + + let nodes: [Node] + let links: [Edge] +} + + +func getData(_ strSource: String) -> Miserable { + let jd = JSONDecoder() + return try! jd.decode(Miserable.self, from: strSource.data(using: .utf8)!) +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ForceDirectedGraph3DApp.swift b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ForceDirectedGraph3DApp.swift new file mode 100644 index 0000000..5f764c8 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ForceDirectedGraph3DApp.swift @@ -0,0 +1,17 @@ +// +// ForceDirectedGraph3DApp.swift +// ForceDirectedGraph3D +// +// Created by li3zhen1 on 10/20/23. +// + +import SwiftUI + +@main +struct ForceDirectedGraph3DApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Info.plist b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Info.plist new file mode 100644 index 0000000..20f75e2 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Info.plist @@ -0,0 +1,15 @@ + + + + + UIApplicationSceneManifest + + UIApplicationPreferredDefaultSceneSessionRole + UIWindowSceneSessionRoleApplication + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + + + diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Preview Content/Preview Assets.xcassets/Contents.json b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/.build/workspace-state.json b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/.build/workspace-state.json new file mode 100644 index 0000000..71deae9 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/.build/workspace-state.json @@ -0,0 +1,11 @@ +{ + "object" : { + "artifacts" : [ + + ], + "dependencies" : [ + + ] + }, + "version" : 6 +} \ No newline at end of file diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json new file mode 100644 index 0000000..4a8c74b --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json @@ -0,0 +1,11 @@ +{ + "pathsToIds" : { + "\/RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/GridMaterial.usda" : "440DE5B4-E4E4-459B-AABF-9ACE96319272", + "\/RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/procedural_sphere_grid.usda" : "34C460AE-CA1B-4348-BD05-621ACBDFFE97", + "\/RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/Scene.usda" : "0A9B4653-B11E-4D6A-850E-C6FCB621626C", + "\/RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/Untitled Scene.usda" : "03E02005-EFA6-48D6-8A76-05B2822A74E9", + "RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/GridMaterial.usda" : "FBD8436F-6B8B-4B82-99B5-995D538B4704", + "RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/procedural_sphere_grid.usda" : "1CBF3893-ABFD-408C-8B91-045BFD257808", + "RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/Scene.usda" : "26DBAE76-5DD8-47B6-A085-1B4ADA111097" + } +} \ No newline at end of file diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json new file mode 100644 index 0000000..1d84a75 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json @@ -0,0 +1,209 @@ +{ + "0A9B4653-B11E-4D6A-850E-C6FCB621626C" : { + "cameraTransform" : [ + 0.9807314, + -1.9820146e-10, + -0.195361, + 0, + -0.10051192, + 0.85749435, + -0.5045798, + 0, + 0.16752096, + 0.51449335, + 0.84097165, + 0, + 0.09084191, + 0.05849296, + 0.13903293, + 1 + ], + "objectMetadataList" : [ + [ + "0A9B4653-B11E-4D6A-850E-C6FCB621626C", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + }, + [ + "0A9B4653-B11E-4D6A-850E-C6FCB621626C", + "Root", + "GridMaterial" + ], + { + "isExpanded" : true, + "isLocked" : false + }, + [ + "0A9B4653-B11E-4D6A-850E-C6FCB621626C", + "Root", + "Sphere" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "1CBF3893-ABFD-408C-8B91-045BFD257808" : { + "cameraTransform" : [ + 0.99999994, + 0, + -0, + 0, + -0, + 0.8660255, + -0.49999988, + 0, + 0, + 0.49999988, + 0.8660255, + 0, + 0, + 0.27093542, + 0.46927398, + 1 + ], + "objectMetadataList" : [ + + ] + }, + "03E02005-EFA6-48D6-8A76-05B2822A74E9" : { + "cameraTransform" : [ + 0.99999994, + 0, + -0, + 0, + -0, + 0.8660254, + -0.49999994, + 0, + 0, + 0.49999994, + 0.8660254, + 0, + 0, + 0.5981957, + 1.0361054, + 1 + ], + "objectMetadataList" : [ + + ] + }, + "26DBAE76-5DD8-47B6-A085-1B4ADA111097" : { + "cameraTransform" : [ + 1, + 0, + -0, + 0, + -0, + 0.7071069, + -0.7071067, + 0, + 0, + 0.7071067, + 0.7071069, + 0, + 0, + 0.2681068, + 0.26850593, + 1 + ], + "objectMetadataList" : [ + [ + "26DBAE76-5DD8-47B6-A085-1B4ADA111097", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "34C460AE-CA1B-4348-BD05-621ACBDFFE97" : { + "cameraTransform" : [ + 0.99999994, + 0, + -0, + 0, + -0, + 0.8660255, + -0.49999988, + 0, + 0, + 0.49999988, + 0.8660255, + 0, + 0, + 0.27093542, + 0.46927398, + 1 + ], + "objectMetadataList" : [ + + ] + }, + "440DE5B4-E4E4-459B-AABF-9ACE96319272" : { + "cameraTransform" : [ + 0.99999994, + 0, + -0, + 0, + -0, + 0.8660254, + -0.49999994, + 0, + 0, + 0.49999994, + 0.8660254, + 0, + 0, + 0.5981957, + 1.0361054, + 1 + ], + "objectMetadataList" : [ + [ + "440DE5B4-E4E4-459B-AABF-9ACE96319272", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "FBD8436F-6B8B-4B82-99B5-995D538B4704" : { + "cameraTransform" : [ + 0.99999994, + 0, + -0, + 0, + -0, + 0.8660254, + -0.49999994, + 0, + 0, + 0.49999994, + 0.8660254, + 0, + 0, + 0.5981957, + 1.0361054, + 1 + ], + "objectMetadataList" : [ + [ + "FBD8436F-6B8B-4B82-99B5-995D538B4704", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + } +} \ No newline at end of file diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata new file mode 100644 index 0000000..6dea95c --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata @@ -0,0 +1,17 @@ +{ + "cameraPresets" : { + + }, + "secondaryToolbarData" : { + "isGridVisible" : true, + "sceneReverbPreset" : -1 + }, + "unitDefaults" : { + "°" : "°", + "kg" : "g", + "m" : "cm", + "m\/s" : "m\/s", + "m\/s²" : "m\/s²", + "s" : "s" + } +} \ No newline at end of file diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.swift b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.swift new file mode 100644 index 0000000..d043ae1 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Package.swift @@ -0,0 +1,25 @@ +// swift-tools-version:5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "RealityKitContent", + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "RealityKitContent", + targets: ["RealityKitContent"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "RealityKitContent", + dependencies: []), + ] +) \ No newline at end of file diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/README.md b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/README.md new file mode 100644 index 0000000..486b575 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/README.md @@ -0,0 +1,3 @@ +# RealityKitContent + +A description of this package. \ No newline at end of file diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Materials/GridMaterial.usda b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Materials/GridMaterial.usda new file mode 100644 index 0000000..b7afd02 --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Materials/GridMaterial.usda @@ -0,0 +1,216 @@ +#usda 1.0 +( + defaultPrim = "Root" + metersPerUnit = 1 + upAxis = "Y" +) + +def Xform "Root" +{ + def Material "GridMaterial" + { + reorder nameChildren = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "DefaultSurfaceShader", "MaterialXPreviewSurface", "Texcoord", "Add", "Multiply", "Fractional", "LineCounts", "Multiply_1", "Separate2", "Separate2_1", "Ifgreater", "Ifgreater_1", "Max", "Background_Color"] + token outputs:mtlx:surface.connect = + token outputs:realitykit:vertex + token outputs:surface + float2 ui:nodegraph:realitykit:subgraphOutputs:pos = (2222, 300.5) + float2 ui:nodegraph:realitykit:subgraphOutputs:size = (182, 89) + int ui:nodegraph:realitykit:subgraphOutputs:stackingOrder = 749 + + def Shader "DefaultSurfaceShader" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor = (1, 1, 1) + float inputs:roughness = 0.75 + token outputs:surface + } + + def Shader "MaterialXPreviewSurface" + { + uniform token info:id = "ND_UsdPreviewSurface_surfaceshader" + float inputs:clearcoat + float inputs:clearcoatRoughness + color3f inputs:diffuseColor.connect = + color3f inputs:emissiveColor + float inputs:ior + float inputs:metallic = 0.15 + float3 inputs:normal + float inputs:occlusion + float inputs:opacity + float inputs:opacityThreshold + float inputs:roughness = 0.5 + token outputs:out + float2 ui:nodegraph:node:pos = (1967, 300.5) + float2 ui:nodegraph:node:size = (208, 297) + int ui:nodegraph:node:stackingOrder = 870 + string[] ui:nodegraph:realitykit:node:attributesShowingChildren = ["Advanced"] + } + + def Shader "Texcoord" + { + uniform token info:id = "ND_texcoord_vector2" + float2 outputs:out + float2 ui:nodegraph:node:pos = (94.14453, 35.29297) + float2 ui:nodegraph:node:size = (182, 43) + int ui:nodegraph:node:stackingOrder = 1358 + } + + def Shader "Multiply" + { + uniform token info:id = "ND_multiply_vector2" + float2 inputs:in1.connect = + float2 inputs:in2 = (32, 15) + float2 inputs:in2.connect = + float2 outputs:out + float2 ui:nodegraph:node:pos = (275.64453, 47.29297) + float2 ui:nodegraph:node:size = (61, 36) + int ui:nodegraph:node:stackingOrder = 1348 + string[] ui:nodegraph:realitykit:node:attributesShowingChildren = ["inputs:in2"] + } + + def Shader "Fractional" + { + uniform token info:id = "ND_realitykit_fractional_vector2" + float2 inputs:in.connect = + float2 outputs:out + float2 ui:nodegraph:node:pos = (440.5, 49.5) + float2 ui:nodegraph:node:size = (155, 99) + int ui:nodegraph:node:stackingOrder = 1345 + } + + def Shader "BaseColor" + { + uniform token info:id = "ND_constant_color3" + color3f inputs:value = (0.89737034, 0.89737034, 0.89737034) ( + colorSpace = "Input - Texture - sRGB - sRGB" + ) + color3f inputs:value.connect = None + color3f outputs:out + float2 ui:nodegraph:node:pos = (1537.5977, 363.07812) + float2 ui:nodegraph:node:size = (150, 43) + int ui:nodegraph:node:stackingOrder = 1353 + } + + def Shader "LineColor" + { + uniform token info:id = "ND_constant_color3" + color3f inputs:value = (0.55945957, 0.55945957, 0.55945957) ( + colorSpace = "Input - Texture - sRGB - sRGB" + ) + color3f inputs:value.connect = None + color3f outputs:out + float2 ui:nodegraph:node:pos = (1536.9844, 287.86328) + float2 ui:nodegraph:node:size = (146, 43) + int ui:nodegraph:node:stackingOrder = 1355 + } + + def Shader "LineWidths" + { + uniform token info:id = "ND_combine2_vector2" + float inputs:in1 = 0.1 + float inputs:in2 = 0.1 + float2 outputs:out + float2 ui:nodegraph:node:pos = (443.64453, 233.79297) + float2 ui:nodegraph:node:size = (151, 43) + int ui:nodegraph:node:stackingOrder = 1361 + } + + def Shader "LineCounts" + { + uniform token info:id = "ND_combine2_vector2" + float inputs:in1 = 24 + float inputs:in2 = 12 + float2 outputs:out + float2 ui:nodegraph:node:pos = (94.14453, 138.29297) + float2 ui:nodegraph:node:size = (153, 43) + int ui:nodegraph:node:stackingOrder = 1359 + } + + def Shader "Remap" + { + uniform token info:id = "ND_remap_color3" + color3f inputs:in.connect = + color3f inputs:inhigh.connect = None + color3f inputs:inlow.connect = None + color3f inputs:outhigh.connect = + color3f inputs:outlow.connect = + color3f outputs:out + float2 ui:nodegraph:node:pos = (1755.5, 300.5) + float2 ui:nodegraph:node:size = (95, 171) + int ui:nodegraph:node:stackingOrder = 1282 + string[] ui:nodegraph:realitykit:node:attributesShowingChildren = ["inputs:outlow"] + } + + def Shader "Separate2" + { + uniform token info:id = "ND_separate2_vector2" + float2 inputs:in.connect = + float outputs:outx + float outputs:outy + float2 ui:nodegraph:node:pos = (1212.6445, 128.91797) + float2 ui:nodegraph:node:size = (116, 117) + int ui:nodegraph:node:stackingOrder = 1363 + } + + def Shader "Combine3" + { + uniform token info:id = "ND_combine3_color3" + float inputs:in1.connect = + float inputs:in2.connect = + float inputs:in3.connect = + color3f outputs:out + float2 ui:nodegraph:node:pos = (1578.1445, 128.91797) + float2 ui:nodegraph:node:size = (146, 54) + int ui:nodegraph:node:stackingOrder = 1348 + } + + def Shader "Range" + { + uniform token info:id = "ND_range_vector2" + bool inputs:doclamp = 1 + float2 inputs:gamma = (2, 2) + float2 inputs:in.connect = + float2 inputs:inhigh.connect = + float2 inputs:inlow = (0.02, 0.02) + float2 inputs:outhigh + float2 inputs:outlow + float2 outputs:out + float2 ui:nodegraph:node:pos = (990.64453, 128.91797) + float2 ui:nodegraph:node:size = (98, 207) + int ui:nodegraph:node:stackingOrder = 1364 + } + + def Shader "Subtract" + { + uniform token info:id = "ND_subtract_vector2" + float2 inputs:in1.connect = + float2 inputs:in2.connect = + float2 outputs:out + float2 ui:nodegraph:node:pos = (612.64453, 87.04297) + float2 ui:nodegraph:node:size = (63, 36) + int ui:nodegraph:node:stackingOrder = 1348 + } + + def Shader "Absval" + { + uniform token info:id = "ND_absval_vector2" + float2 inputs:in.connect = + float2 outputs:out + float2 ui:nodegraph:node:pos = (765.64453, 87.04297) + float2 ui:nodegraph:node:size = (123, 43) + int ui:nodegraph:node:stackingOrder = 1348 + } + + def Shader "Min" + { + uniform token info:id = "ND_min_float" + float inputs:in1.connect = + float inputs:in2.connect = + float outputs:out + float2 ui:nodegraph:node:pos = (1388.1445, 128.91797) + float2 ui:nodegraph:node:size = (114, 36) + int ui:nodegraph:node:stackingOrder = 1363 + } + } +} + diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda new file mode 100644 index 0000000..4cb070b --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda @@ -0,0 +1,59 @@ +#usda 1.0 +( + defaultPrim = "Root" + metersPerUnit = 1 + upAxis = "Y" +) + +def Xform "Root" +{ + reorder nameChildren = ["GridMaterial", "Sphere"] + rel material:binding = None ( + bindMaterialAs = "weakerThanDescendants" + ) + + def Sphere "Sphere" ( + active = true + prepend apiSchemas = ["MaterialBindingAPI"] + ) + { + rel material:binding = ( + bindMaterialAs = "weakerThanDescendants" + ) + double radius = 0.05 + quatf xformOp:orient = (1, 0, 0, 0) + float3 xformOp:scale = (1, 1, 1) + float3 xformOp:translate = (0, 0, 0.0004) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"] + + def RealityKitComponent "Collider" + { + uint group = 1 + uniform token info:id = "RealityKit.Collider" + uint mask = 4294967295 + token type = "Default" + + def RealityKitStruct "Shape" + { + float3 extent = (0.2, 0.2, 0.2) + float radius = 0.05 + token shapeType = "Sphere" + } + } + + def RealityKitComponent "InputTarget" + { + uniform token info:id = "RealityKit.InputTarget" + } + } + + def "GridMaterial" ( + active = true + prepend references = @Materials/GridMaterial.usda@ + ) + { + float3 xformOp:scale = (1, 1, 1) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"] + } +} + diff --git a/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift new file mode 100644 index 0000000..5caba4e --- /dev/null +++ b/Examples/ForceDirectedGraph3D/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift @@ -0,0 +1,4 @@ +import Foundation + +/// Bundle for the RealityKitContent project +public let realityKitContentBundle = Bundle.module diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj index d97bf5d..dab62f5 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj @@ -7,16 +7,25 @@ objects = { /* Begin PBXBuildFile section */ + B70B52AD2AF822FF00A1E6CD /* ForceSimulation in Frameworks */ = {isa = PBXBuildFile; productRef = B70B52AC2AF822FF00A1E6CD /* ForceSimulation */; }; + B70B52AF2AF822FF00A1E6CD /* Grape in Frameworks */ = {isa = PBXBuildFile; productRef = B70B52AE2AF822FF00A1E6CD /* Grape */; }; + B71759592AFBFC4B000DF006 /* Miserables.swift in Sources */ = {isa = PBXBuildFile; fileRef = B71759582AFBFC4B000DF006 /* Miserables.swift */; }; + B717595B2AFBFDBD000DF006 /* Lattice.swift in Sources */ = {isa = PBXBuildFile; fileRef = B717595A2AFBFDBD000DF006 /* Lattice.swift */; }; + B719E4112AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B719E4102AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift */; }; + B780DD7A2AF84ECB001C605F /* MyRing.swift in Sources */ = {isa = PBXBuildFile; fileRef = B780DD792AF84ECB001C605F /* MyRing.swift */; }; B7AFA55B2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7AFA55A2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift */; }; B7AFA55D2ADF4997009C7154 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7AFA55C2ADF4997009C7154 /* ContentView.swift */; }; B7AFA55F2ADF4999009C7154 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B7AFA55E2ADF4999009C7154 /* Assets.xcassets */; }; B7AFA5622ADF4999009C7154 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B7AFA5612ADF4999009C7154 /* Preview Assets.xcassets */; }; B7AFA56B2ADF49AA009C7154 /* ForceSimulation in Frameworks */ = {isa = PBXBuildFile; productRef = B7AFA56A2ADF49AA009C7154 /* ForceSimulation */; }; - B7AFA56D2ADF49AA009C7154 /* NDTree in Frameworks */ = {isa = PBXBuildFile; productRef = B7AFA56C2ADF49AA009C7154 /* NDTree */; }; B7AFA56F2ADF49D6009C7154 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7AFA56E2ADF49D6009C7154 /* Data.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + B71759582AFBFC4B000DF006 /* Miserables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Miserables.swift; sourceTree = ""; }; + B717595A2AFBFDBD000DF006 /* Lattice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lattice.swift; sourceTree = ""; }; + B719E4102AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ForceDirectedLatticeView.swift; sourceTree = ""; }; + B780DD792AF84ECB001C605F /* MyRing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyRing.swift; sourceTree = ""; }; B7AFA5572ADF4997009C7154 /* ForceDirectedGraphExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ForceDirectedGraphExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; B7AFA55A2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForceDirectedGraphExampleApp.swift; sourceTree = ""; }; B7AFA55C2ADF4997009C7154 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -31,8 +40,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B7AFA56D2ADF49AA009C7154 /* NDTree in Frameworks */, + B70B52AF2AF822FF00A1E6CD /* Grape in Frameworks */, B7AFA56B2ADF49AA009C7154 /* ForceSimulation in Frameworks */, + B70B52AD2AF822FF00A1E6CD /* ForceSimulation in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -58,12 +68,16 @@ B7AFA5592ADF4997009C7154 /* ForceDirectedGraphExample */ = { isa = PBXGroup; children = ( + B780DD792AF84ECB001C605F /* MyRing.swift */, + B719E4102AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift */, B7AFA55A2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift */, B7AFA55C2ADF4997009C7154 /* ContentView.swift */, B7AFA55E2ADF4999009C7154 /* Assets.xcassets */, B7AFA5632ADF4999009C7154 /* ForceDirectedGraphExample.entitlements */, B7AFA5602ADF4999009C7154 /* Preview Content */, B7AFA56E2ADF49D6009C7154 /* Data.swift */, + B71759582AFBFC4B000DF006 /* Miserables.swift */, + B717595A2AFBFDBD000DF006 /* Lattice.swift */, ); path = ForceDirectedGraphExample; sourceTree = ""; @@ -94,7 +108,8 @@ name = ForceDirectedGraphExample; packageProductDependencies = ( B7AFA56A2ADF49AA009C7154 /* ForceSimulation */, - B7AFA56C2ADF49AA009C7154 /* NDTree */, + B70B52AC2AF822FF00A1E6CD /* ForceSimulation */, + B70B52AE2AF822FF00A1E6CD /* Grape */, ); productName = ForceDirectedGraphExample; productReference = B7AFA5572ADF4997009C7154 /* ForceDirectedGraphExample.app */; @@ -153,8 +168,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + B717595B2AFBFDBD000DF006 /* Lattice.swift in Sources */, + B780DD7A2AF84ECB001C605F /* MyRing.swift in Sources */, B7AFA55D2ADF4997009C7154 /* ContentView.swift in Sources */, + B719E4112AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift in Sources */, B7AFA56F2ADF49D6009C7154 /* Data.swift in Sources */, + B71759592AFBFC4B000DF006 /* Miserables.swift in Sources */, B7AFA55B2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -289,6 +308,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"ForceDirectedGraphExample/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -300,7 +320,9 @@ MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = me.lizhen.ForceDirectedGraphExample; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; }; name = Debug; @@ -314,6 +336,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"ForceDirectedGraphExample/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -361,13 +384,17 @@ /* End XCLocalSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - B7AFA56A2ADF49AA009C7154 /* ForceSimulation */ = { + B70B52AC2AF822FF00A1E6CD /* ForceSimulation */ = { isa = XCSwiftPackageProductDependency; productName = ForceSimulation; }; - B7AFA56C2ADF49AA009C7154 /* NDTree */ = { + B70B52AE2AF822FF00A1E6CD /* Grape */ = { isa = XCSwiftPackageProductDependency; - productName = NDTree; + productName = Grape; + }; + B7AFA56A2ADF49AA009C7154 /* ForceSimulation */ = { + isa = XCSwiftPackageProductDependency; + productName = ForceSimulation; }; /* End XCSwiftPackageProductDependency section */ }; diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ContentView.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ContentView.swift index 799a2a4..fa418b2 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ContentView.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ContentView.swift @@ -1,120 +1,111 @@ +//// +//// ContentView.swift +//// GrapeView +//// +//// Created by li3zhen1 on 10/8/23. +//// // -// ContentView.swift -// GrapeView +//import SwiftUI +//import simd +//import ForceSimulation +//import CoreGraphics // -// Created by li3zhen1 on 10/8/23. // -import SwiftUI - -import NDTree -import ForceSimulation -import CoreGraphics -let colors: [GraphicsContext.Shading] = [ - GraphicsContext.Shading.color(red: 17.0/255, green: 181.0/255, blue: 174.0/255), - - GraphicsContext.Shading.color(red: 64.0/255, green: 70.0/255, blue: 201.0/255), - - GraphicsContext.Shading.color(red: 246.0/255, green: 133.0/255, blue: 18.0/255), - - GraphicsContext.Shading.color(red: 222.0/255, green: 60.0/255, blue: 130.0/255), - - GraphicsContext.Shading.color(red: 17.0/255, green: 181.0/255, blue: 174.0/255), - - GraphicsContext.Shading.color(red: 114.0/255, green: 224.0/255, blue: 106.0/255), - - GraphicsContext.Shading.color(red: 22.0/255, green: 124.0/255, blue: 243.0/255), - GraphicsContext.Shading.color(red: 115.0/255, green: 38.0/255, blue: 211.0/255), - GraphicsContext.Shading.color(red: 232.0/255, green: 198.0/255, blue: 0.0/255), - GraphicsContext.Shading.color(red: 203.0/255, green: 93.0/255, blue: 2.0/255), - GraphicsContext.Shading.color(red: 0.0/255, green: 143.0/255, blue: 93.0/255), - GraphicsContext.Shading.color(red: 188.0/255, green: 233.0/255, blue: 49.0/255), +// +//func getLinks() -> [EdgeID] { +// let data = getData(miserables) +// return data.links.map { l in +// EdgeID( +// data.nodes.firstIndex { n in n.id == l.source }!, +// data.nodes.firstIndex { n in n.id == l.target }! +// ) +// } +//} +// +// +// +import SwiftUI +let colors: [Color] = [ + .init(red: 17.0/255, green: 181.0/255, blue: 174.0/255), + .init(red: 64.0/255, green: 70.0/255, blue: 201.0/255), + .init(red: 246.0/255, green: 133.0/255, blue: 18.0/255), + .init(red: 222.0/255, green: 60.0/255, blue: 130.0/255), + .init(red: 17.0/255, green: 181.0/255, blue: 174.0/255), + .init(red: 114.0/255, green: 224.0/255, blue: 106.0/255), + .init(red: 22.0/255, green: 124.0/255, blue: 243.0/255), + .init(red: 115.0/255, green: 38.0/255, blue: 211.0/255), + .init(red: 232.0/255, green: 198.0/255, blue: 0.0/255), + .init(red: 203.0/255, green: 93.0/255, blue: 2.0/255), + .init(red: 0.0/255, green: 143.0/255, blue: 93.0/255), + .init(red: 188.0/255, green: 233.0/255, blue: 49.0/255), ] - -struct MiserableNode: Identifiable { - let id: Int - let group: Int - let name: String +// +//struct MiserableNode: Identifiable { +// let id: Int +// let group: Int +// let name: String +//} +// +//struct MyForceField: ForceField { +// +// typealias Vector = SIMD2 +// +// public var force = CompositedForce { +// Kinetics.ManyBodyForce(strength: -12) +// Kinetics.LinkForce( +// getLinks(), +// stiffness: .weightedByDegree(k: { _, _ in 1.0 }), +// originalLength: .constant(35) +// ) +// Kinetics.CenterForce(center: 0, strength: 0.4) +// Kinetics.CollideForce(radius: .constant(3)) +// +// } +//} +// +// +import SwiftUI +enum ExampleKind { + case ring + case classicMiserable + case lattice + + static let list: [ExampleKind] = [.ring, .classicMiserable, .lattice] } - -typealias MiserableSimulation = Simulation -typealias MiserableLinkForce = LinkForce +extension ExampleKind { + var description: String { + switch self { + case .ring: + return "My Ring" + case .classicMiserable: + return "Miserables" + case .lattice: + return "Lattice" + } + } +} struct ContentView: View { - @State var points: [Vector2d] = [] - - var sim: MiserableSimulation - let data: Miserable - var linkForce: MiserableLinkForce - - init() { - self.data = getData(miserables) - self.sim = Simulation(nodeIds: data.nodes.map {$0.id}, alphaDecay: 0.01) - sim.createManyBodyForce(strength: -12) - self.linkForce = sim.createLinkForce( - data.links.map { l in (l.source, l.target) }, - stiffness: .weightedByDegree { _, _ in 1.0 }, - originalLength: .constant(35) - ) - sim.createCenterForce(center: Vector2d(0, 0), strength: 0.4) - sim.createCollideForce(radius: .constant(3)) - - } + @State var selection: ExampleKind = .classicMiserable var body: some View { - NavigationStack { - Canvas { context, sz in - - for l in self.data.links { - if let s = self.data.nodes.firstIndex(where: { $0.id == l.source}), - let t = self.data.nodes.firstIndex(where: { $0.id == l.target}) { - // draw a line from s to t - let x1 = CGFloat( 300.0 + self.sim.nodePositions[s].x ) - let y1 = CGFloat( 200.0 - self.sim.nodePositions[s].y ) - let x2 = CGFloat( 300.0 + self.sim.nodePositions[t].x ) - let y2 = CGFloat( 200.0 - self.sim.nodePositions[t].y ) - - context.stroke(Path { path in - path.move(to: CGPoint(x: x1, y: y1)) - path.addLine(to: CGPoint(x: x2, y: y2)) - }, with: .color(.gray.opacity(0.2))) - } - } - - for i in self.points.indices { - - let x = 300.0 + points[i].x - 4.0 - let y = 200.0 - points[i].y - 4.0 - - let rect = CGRect(origin: .init(x: x, y: y), size: CGSize(width: 8.0, height: 8.0)) - - context.fill(Path(ellipseIn: rect), with: colors[(self.data.nodes[i].group) % colors.count]) - context.stroke(Path(ellipseIn: rect), with: .color(Color(nsColor: .windowBackgroundColor)), style: StrokeStyle(lineWidth: 1.5)) - - } + NavigationSplitView { + List(ExampleKind.list, id:\.self, selection: $selection) { kind in + Text(kind.description) } - .onAppear { - self.points = sim.nodePositions + } detail: { + switch selection { + case .ring: + MyRing() + case .classicMiserable: + MiserableGraph() + case .lattice: + Lattice() } - .frame(width: 600, height: 400) - .navigationTitle("Force Directed Graph Example") - - }.toolbar { - - Button(action: { - Timer.scheduledTimer(withTimeInterval: 1/60, repeats: true) { t in - sim.tick() - self.points = sim.nodePositions - } - }, label: { - HStack { - Image(systemName: "play.fill") - Text("Run") - }.padding() - }) } } } diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedGraphExampleApp.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedGraphExampleApp.swift index a1a8685..e2d8a59 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedGraphExampleApp.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedGraphExampleApp.swift @@ -11,7 +11,7 @@ import SwiftUI struct ForceDirectedGraphExampleApp: App { var body: some Scene { WindowGroup { - ContentView().padding(0) + ContentView() } } } diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift new file mode 100644 index 0000000..7133ae7 --- /dev/null +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift @@ -0,0 +1,223 @@ +////// +////// ForceDirectedLatticeView.swift +////// ForceDirectedGraphExample +////// +////// Created by li3zhen1 on 10/18/23. +////// +//// +////import CoreGraphics +////import ForceSimulation +////import simd +////import SwiftUI +//// +////struct ForceDirectedLatticeView: View { +//// @State var points: [simd_double2]? = nil +//// +//<<<<<<< HEAD +// +//import CoreGraphics +//import ForceSimulation +//import simd +//import SwiftUI +// +//struct ForceDirectedLatticeView: View { +// @State var points: [simd_double2]? = nil +// +// private let sim: Simulation2D +// private let edgeIds: [(Int, Int)] +// private let nodeIds: [Int] +// private let canvasWidth: CGFloat = 800.0 +// let width = 36 +// +// init() { +// self.nodeIds = Array(0..<(width * width)) +// +// var edge = [(Int, Int)]() +// for i in 0.. +//// private let edgeIds: [(Int, Int)] +//// private let nodeIds: [Int] +//// private let canvasWidth: CGFloat = 800.0 +//// let width = 36 +//// +//// init() { +//// self.nodeIds = Array(0..<(width * width)) +//// +//// var edge = [(Int, Int)]() +//// for i in 0..>>>>>> protocol_force diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift new file mode 100644 index 0000000..bd5ccc2 --- /dev/null +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift @@ -0,0 +1,66 @@ +// +// Lattice.swift +// ForceDirectedGraphExample +// +// Created by li3zhen1 on 11/8/23. +// + +import SwiftUI +import Grape + + +struct Lattice: View { + + let width = 20 + let edge: [(Int, Int)] + @State var isRunning = false + + init() { + var edge = [(Int, Int)]() + for i in 0.. +// +// public var force = CompositedForce { +// LinkForce( +// originalLength: .constant(20.0), +// stiffness: .weightedByDegree(k: { _, _ in 3.0}) +// ) +// CenterForce() +// ManyBodyForce(strength: -15) +// } +//} + + + +struct MiserableGraph: View { + + @State var isRunning = false + let graphData = getData(miserables) + + var body: some View { + ForceDirectedGraph($isRunning) { + + for l in graphData.links { + let fromID = graphData.nodes.firstIndex { mn in + mn.id == l.source + }! + let toID = graphData.nodes.firstIndex { mn in + mn.id == l.target + }! + LinkMark(from: fromID, to: toID) + } + ForEach(graphData.nodes.indices, id: \.self) { i in + NodeMark(id: i) + .symbol(.asterisk) + .symbolSize(radius: 12.0) + .foregroundStyle( + colors[graphData.nodes[i].group % colors.count] + .shadow(.inner(color:colors[graphData.nodes[i].group % colors.count].opacity(0.3), radius: 3, x:0, y: 1.5)) + .shadow(.drop(color:colors[graphData.nodes[i].group % colors.count].opacity(0.12), radius: 12, x:0, y: 8)) + ) + .stroke() + .label(offset: CGVector(dx: 0.0, dy: 12.0)) { +// if i.isMultiple(of: 5) { + Text(graphData.nodes[i].id) + .font(.title3) +// } + } + } + } force: { + ManyBodyForce(strength: -20) + LinkForce( + originalLength: .constant(35.0), + stiffness: .weightedByDegree(k: { _, _ in 1.0}) + ) + CenterForce() +// CollideForce() + } + .onNodeTapped { + print($0) + } + .toolbar { + Button { + isRunning = !isRunning + } label: { + Image(systemName: isRunning ? "pause.fill" : "play.fill") + Text(isRunning ? "Pause" : "Start") + } + } + } +} diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift new file mode 100644 index 0000000..adabf22 --- /dev/null +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift @@ -0,0 +1,77 @@ +// +// ForceDirectedGraphSwiftUIExample.swift +// ForceDirectedGraphExample +// +// Created by li3zhen1 on 11/5/23. +// + +import Foundation +import Grape +import SwiftUI +import ForceSimulation + + +//struct MyForceField: ForceField { +// +// typealias Vector = SIMD2 +// +// public var force = CompositedForce { +// LinkForce( +// originalLength: .constant(20.0), +// stiffness: .weightedByDegree(k: { _, _ in 3.0}) +// ) +// CenterForce() +// ManyBodyForce(strength: -15) +// } +//} + + + +struct MyRing: View { + + @State var isRunning = false + + var body: some View { + + + ForceDirectedGraph($isRunning) { + ForEach(Array(0..<20), id: \.self) { i in + NodeMark(id: 3 * i + 0) + .symbol(.circle) + .symbolSize(radius:4.0) + .foregroundStyle(.green) + NodeMark(id: 3 * i + 1) + .symbol(.pentagon) + .symbolSize(radius:5.0) + .foregroundStyle(.blue) + NodeMark(id: 3 * i + 2) + .symbol(.circle) + .symbolSize(radius:6.0) + .foregroundStyle(.yellow) + + LinkMark(from: 3 * i + 0, to: 3 * i + 1) + LinkMark(from: 3 * i + 1, to: 3 * i + 2) + + for j in 0..<3 { + LinkMark(from: 3 * i + j, to: 3 * ((i + 1) % 20) + j) + } + } + } force: { + ManyBodyForce(strength: -15) + LinkForce( + originalLength: .constant(20.0), + stiffness: .weightedByDegree(k: { _, _ in 3.0}) + ) + CenterForce() + CollideForce() + } + .toolbar { + Button { + isRunning = !isRunning + } label: { + Image(systemName: isRunning ? "pause.fill" : "play.fill") + Text(isRunning ? "Pause" : "Start") + } + } + } +} diff --git a/Package.resolved b/Package.resolved deleted file mode 100644 index e65252d..0000000 --- a/Package.resolved +++ /dev/null @@ -1,23 +0,0 @@ -{ - "pins" : [ - { - "identity" : "swift-docc-plugin", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-docc-plugin", - "state" : { - "revision" : "26ac5758409154cc448d7ab82389c520fa8a8247", - "version" : "1.3.0" - } - }, - { - "identity" : "swift-docc-symbolkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-docc-symbolkit", - "state" : { - "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", - "version" : "1.0.0" - } - } - ], - "version" : 2 -} diff --git a/Package.swift b/Package.swift index 063b047..ad1a53d 100644 --- a/Package.swift +++ b/Package.swift @@ -6,8 +6,8 @@ import PackageDescription let package = Package( name: "Grape", platforms: [ - .macOS(.v12), - .iOS(.v13), + .macOS(.v14), + .iOS(.v17), .watchOS(.v10), ], @@ -15,43 +15,49 @@ let package = Package( // Products define the executables and libraries a package produces, making them visible to other packages. .library( - name: "NDTree", - targets: ["NDTree"] + name: "ForceSimulation", + targets: ["ForceSimulation"] ), .library( - name: "ForceSimulation", - targets: ["ForceSimulation"] + name: "Grape", + targets: ["Grape"] ), - + ], dependencies: [ - // other dependencies - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.1.0"), + .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.1.0") ], targets: [ - - .target( - name: "NDTree", - path: "Sources/NDTree" - // , swiftSettings:[.unsafeFlags(["-whole-module-optimization", "-Ounchecked"])] - ), - - .testTarget( - name: "NDTreeTests", - dependencies: ["NDTree"]), .target( name: "ForceSimulation", - dependencies: ["NDTree"], path: "Sources/ForceSimulation" - // , swiftSettings:[.unsafeFlags(["-whole-module-optimization", "-Ounchecked"])] + ), + + .target( + name: "Grape", + dependencies: ["ForceSimulation"], + path: "Sources/Grape" + // link ForceSimulation in release mode + // swiftSettings: [.unsafeFlags(["-Xfrontend", "-disable-availability-checking"])] + ), + + .testTarget( + name: "KDTreeTests", + dependencies: ["ForceSimulation"] ), .testTarget( name: "ForceSimulationTests", - dependencies: ["ForceSimulation", "NDTree"]), + dependencies: ["ForceSimulation"] + ), + + .testTarget( + name: "GrapeTests", + dependencies: ["Grape"] + ), ] ) diff --git a/README.md b/README.md index 474109d..d6f21a9 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,191 @@

- grap-icon + grape-icon

Grape

+

A Swift library for force simulation and graph visualization. -ForceDirected

+ ForceDirected +

+ + + + + + + +## Examples + +### Force Directed Graph +This is a force directed graph visualizing the data from [Force Directed Graph Component](https://observablehq.com/@d3/force-directed-graph-component). Take a closer look at the animation: + + + +https://github.com/li3zhen1/Grape/assets/45376537/d80dc797-1980-4755-85b9-18ee26e2a7ff + + + +Source code: [Miserables.swift](https://github.com/li3zhen1/Grape/blob/main/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift). + + + +
+ +### Force Directed Graph in visionOS + +This is the same graph as the first example, rendered in `RealityView`: + + + +https://github.com/li3zhen1/Grape/assets/45376537/4585471e-2339-4aee-8f39-0c11fdfb6901 + + + +Source code: [ForceDirectedGraph3D/ContentView.swift](https://github.com/li3zhen1/Grape/blob/main/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift). + + +
+ +### Lattice Simulation + +This is a 36x36 force directed lattice like [Force Directed Lattice](https://observablehq.com/@d3/force-directed-lattice): + + + +https://github.com/li3zhen1/Grape/assets/45376537/5b76fddc-dd5c-4d35-bced-29c01269dd2b + +Source code: [Lattice.swift](https://github.com/li3zhen1/Grape/blob/main/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift) -Grape currently include 2 packages, `NDTree` and `ForceSimulation`. `NDTree` is a N-dimensional tree data structure, which is used to accelerate the force simulation. `ForceSimulation` is a force simulation library, which is used to simulate the force between nodes in a graph. Both of them are based on SIMD-like data structures. +
+
-Documentations will be added soon. +## Get started -### Examples +Grape ships 2 modules: -This is a force directed graph visualizing the data from [Force Directed Graph Component](https://observablehq.com/@d3/force-directed-graph-component), running at 120FPS on a SwiftUI Canvas. Take a closer look at the animation: +- The `Grape` module allows you to create force-directed graphs in SwiftUI Views. +- The `ForceSimulation` module is the underlying mechanism of `Grape`, and it helps you to create more complicated or customized force simulations. It also contains a `KDTree` data structure built with performance in mind, which can be useful for spatial partitioning tasks. -https://github.com/li3zhen1/Grape/Assets/Grape_0.2.0.mov +
+### `Grape` -### Features +```swift +import Grape + +struct MyGraph: View { + @State var isRunning = true // start moving once appeared. + + var body: some View { + ForceDirectedGraph(isRunning: $isRunning) { + + // Declare nodes and links like you would do in Swift Charts. + NodeMark(id: 0, fill: .green) + NodeMark(id: 1, fill: .blue) + NodeMark(id: 2, fill: .yellow) + for i in 0..<2 { + LinkMark(from: i, to: i+1) + } + + } forceField: { + LinkForce() + CenterForce() + ManyBodyForce() + } + } +} +``` + +Below is another [example](https://github.com/li3zhen1/Grape/blob/main/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift) rendering a ring with 60 vertices, with out-of-the-box dragging support: + +https://github.com/li3zhen1/Grape/assets/45376537/73213e7f-73ee-44f3-9b3e-7e58355045d2 + + + + + +> [!IMPORTANT] +> `ForceDirectedGraph` is only a minimal working example. Please refer to the next section to create a more complex view. + +
+ + + +### `ForceSimulation` + +`ForceSimulation` module mainly contains 3 concepts, `Kinetics`, `ForceProtocol` and `Simulation`. +

+ A diagram showing the relationships of `Kinetics`, `ForceProtocol` and `Simulation`. A `Simulation` contains a `Kinetics` and a `ForceProtocol`. +

+ +- `Kinetics` describes all kinetic states of your system, i.e. position, velocity, link connections, and the variable `alpha` that describes how "active" your system is. +- Forces are any types that conforms to `ForceProtocol`. This module provides most of the forces you will use in force directed graphs. And you can also create your own forces. They should be responsible for 2 tasks: + - `bindKinetics(_ kinetics: Kinetics)`: binding to a `Kinetics`. In most cases the force should keep a reference of the `Kinetics` so they know what to mutate when `apply` is called. + - `apply()`: Mutating the states of `Kinetics`. For example, a gravity force should add velocities on each node in this function. +- `Simulation` is a shell class you interact with, which enables you to create any dimensional simulation with velocity Verlet integration. It manages a `Kinetics` and a force conforming to `ForceProtocol`. Since `Simulation` only stores one force, you are responsible for compositing multiple forces into one. +- Another data structure `KDTree` is used to accelerate the force simulation with [Barnes-Hut Approximation](https://jheer.github.io/barnes-hut/). + +
+ +The basic concepts of simulations and forces can be found here: [Force simulations - D3](https://d3js.org/d3-force/simulation). You can simply create simulations by using `Simulation` like this: + +```swift +import simd +import ForceSimulation + +// assuming you’re simulating 4 nodes +let nodeCount = 4 + +// Connect them +let links = [(0, 1), (1, 2), (2, 3), (3, 0)] + +/// Create a 2D force composited with 4 primitive forces. +let myForce = SealedForce2D { + // Forces are namespaced under `Kinetics` + // here we only use `Kinetics>`, i.e. `Kinetics2D` + Kinetics2D.ManyBodyForce(strength: -30) + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + Kinetics2D.CenterForce(center: .zero, strength: 1) + Kinetics2D.CollideForce(radius: .constant(3)) +} + +/// Create a simulation, the dimension is inferred from the force. +let mySimulation = Simulation( + nodeCount: nodeCount, + links: links.map { EdgeID(source: $0.0, target: $0.1) }, + forceField: myForce +) + +/// Force is ready to start! run `tick` to iterate the simulation. + +for mySimulation in 0..<120 { + mySimulation.tick() + let positions = mySimulation.kinetics.position.asArray() + /// Do something with the positions. +} + +``` + +See [Example](https://github.com/li3zhen1/Grape/tree/main/Examples/ForceDirectedGraphExample) for more details. + +
+ +
+ + +## Roadmap | | 2D simd | ND simd | Metal | | --- | --- | --- | --- | @@ -46,38 +200,31 @@ https://github.com/li3zhen1/Grape/Assets/Grape_0.2.0.mov | **SwiftUI View** | 🚧 | | | -### Usage +
-```swift -import ForceSimulation -import NDTree +
-struct Node: Identifiable { ... } - -let nodeIds: [Node.ID] = ... -let links: [(Node.ID, Node.ID)] = ... - -let sim = Simulation2D(nodeIds: nodeIds, alphaDecay: 0.01) -sim.createManyBodyForce(strength: -12) -sim.createLinkForce(links) -sim.createCenterForce(center: Vector2d(0, 0), strength: 0.4) -sim.createCollideForce(radius: .constant(3)) - -``` +## Performance -See [Example](https://github.com/li3zhen1/Grape/tree/main/Examples/ForceDirectedGraphExample) for more details. +
+#### Simulation +Grape uses simd to calculate position and velocity. Currently it takes **~0.005** seconds to iterate 120 times over the example graph(2D). (77 vertices, 254 edges, with manybody, center, collide and link forces. Release build on a M1 Max, [tested](https://github.com/li3zhen1/Grape/blob/main/Tests/ForceSimulationTests/MiserableGraphTest.swift) with command `swift test -c release`) -### Performance +For 3D simulation, it takes **~0.008** seconds for the same graph and same configs. -Grape uses simd to calculate position and velocity. Currently it takes ~0.12 seconds to iterate 120 times over the example graph(2D). (77 vertices, 254 edges, with manybody, center, collide and link forces. Release build on a M1 Max) +> [!IMPORTANT] +> Due to heavy use of generics (some are not specialized in Debug mode), the performance in Debug build is ~100x slower than Release build. Grape might ship a version with pre-inlined generics to address this problem. -Grape also supports ND simulation. Examples and +
+#### KDTree +The `BufferedKDTree` from this package is **~22x** faster than `GKQuadtree` from Apple’s GameKit, according to this [test case](https://github.com/li3zhen1/Grape/blob/main/Tests/ForceSimulationTests/GKTreeCompareTest.swift). However, please note that comparing Swift structs with NSObjects is unfair, and their behaviors are different. +
-### Credits +## Credits This library has been greatly influenced by the outstanding work done by [D3.js (Data-Driven Documents)](https://d3js.org). diff --git a/Sources/ForceSimulation/ForceLike.swift b/Sources/ForceSimulation/ForceLike.swift deleted file mode 100644 index 76bbe07..0000000 --- a/Sources/ForceSimulation/ForceLike.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// ForceLike.swift -// -// -// Created by li3zhen1 on 10/1/23. -// - -import NDTree - -/// A protocol that represents a force. -/// A force takes a simulation state and modifies its node positions and velocities. -public protocol ForceLike { - associatedtype NodeID: Hashable - - /// Takes a simulation state and modifies its node positions and velocities. - /// This is executed in each tick of the simulation. - func apply(alpha: Double) -} - -public protocol NDTreeBasedForceLike: ForceLike { - associatedtype TD: NDTreeDelegate -} - -extension Array where Element: NDTreeBasedForceLike { - public func combined() { - - } -} diff --git a/Sources/ForceSimulation/ForceProtocol.swift b/Sources/ForceSimulation/ForceProtocol.swift new file mode 100644 index 0000000..3975c99 --- /dev/null +++ b/Sources/ForceSimulation/ForceProtocol.swift @@ -0,0 +1,89 @@ +/// A protocol that represents a force. +/// +/// A force takes a simulation state and modifies its node positions and velocities. +public protocol ForceProtocol { + associatedtype Vector where Vector: SimulatableVector & L2NormCalculatable + + + + /// Takes a simulation state and modifies its node positions and velocities. + /// This is executed in each tick of the simulation. + // @inlinable func apply() + + + /// Takes a simulation state and modifies its node positions and velocities. + /// This is executed in each tick of the simulation. + @inlinable func apply(to kinetics: inout Kinetics) + + /// Bind to a kinetic system that describes the state of all nodes in your simulation. + /// This has to be called before `apply` is called. + @inlinable mutating func bindKinetics(_ kinetics: Kinetics) + + /// Deinitialize the tree and deallocate the memory. + /// Called when `Simulation` is deinitialized. + @inlinable func dispose() +} + + +public protocol Force2D: ForceProtocol where Vector == SIMD2 {} +public protocol Force3D: ForceProtocol where Vector == SIMD3 {} + +extension Kinetics2D.LinkForce: Force2D {} +extension Kinetics2D.ManyBodyForce: Force2D {} +extension Kinetics2D.CenterForce: Force2D {} +extension Kinetics2D.CollideForce: Force2D {} +extension Kinetics2D.PositionForce: Force2D {} +extension Kinetics2D.RadialForce: Force2D {} +extension Kinetics2D.EmptyForce: Force2D {} +extension CompositedForce: Force2D where Vector == SIMD2 {} + +extension Kinetics3D.LinkForce: Force3D {} +extension Kinetics3D.ManyBodyForce: Force3D {} +extension Kinetics3D.CenterForce: Force3D {} +extension Kinetics3D.CollideForce: Force3D {} +extension Kinetics3D.PositionForce: Force3D {} +extension Kinetics3D.RadialForce: Force3D {} +extension Kinetics3D.EmptyForce: Force3D {} +extension CompositedForce: Force3D where Vector == SIMD3 {} + +public protocol ForceDescriptor: Equatable { + associatedtype ConcreteForce: ForceProtocol + func createForce() -> ConcreteForce +} + +/// A helper force for hiding long type signatures you composed with `CompositedForce`. +/// You can easily build a force with a result builder. +public protocol ForceField: ForceProtocol +where Vector: SimulatableVector & L2NormCalculatable { + associatedtype F: ForceProtocol where F.Vector == Vector + + @inlinable + @ForceBuilder + var force: F { get set } +} + +extension ForceField { + // @inlinable + // public func apply() { + // self.force.apply() + // } + + @inlinable + public func apply(to kinetics: inout Kinetics) { + self.force.apply(to: &kinetics) + } + + @inlinable + public func dispose() { + self.force.dispose() + } + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics) { + self.force.bindKinetics(kinetics) + } +} + +public protocol ForceField2D: ForceField & Force2D {} + +public protocol ForceField3D: ForceField & Force3D {} diff --git a/Sources/ForceSimulation/ForceSimulation.docc/CreatingASimulationWithBuiltinForces.md b/Sources/ForceSimulation/ForceSimulation.docc/CreatingASimulationWithBuiltinForces.md new file mode 100644 index 0000000..fe98652 --- /dev/null +++ b/Sources/ForceSimulation/ForceSimulation.docc/CreatingASimulationWithBuiltinForces.md @@ -0,0 +1,70 @@ +# Creating a Simulation with Built-in Forces + + + +## Overview + + + +You can simply create simulations by using Simulation like this: + +```swift +import simd +import ForceSimulation + +// assuming you’re simulating 4 nodes +let nodeCount = 4 + +// Connect them +let links = [(0, 1), (1, 2), (2, 3), (3, 0)] + +/// Create a 2D force composited with 4 primitive forces. +let myForce = SealedForce2D { + // Forces are namespaced under `Kinetics` + // here we only use `Kinetics>`, i.e. `Kinetics2D` + Kinetics2D.ManyBodyForce(strength: -30) + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + Kinetics2D.CenterForce(center: .zero, strength: 1) + Kinetics2D.CollideForce(radius: .constant(3)) +} + +/// Create a simulation, the dimension is inferred from the force. +let mySimulation = Simulation( + nodeCount: nodeCount, + links: links.map { EdgeID(source: $0.0, target: $0.1) }, + forceField: myForce +) + +/// Force is ready to start! run `tick` to iterate the simulation. + +for mySimulation in 0..<120 { + mySimulation.tick() + let positions = mySimulation.kinetics.position.asArray() + /// Do something with the positions. +} +``` + +ForceSimulation module mainly contains 3 concepts, `Kinetics`, `ForceProtocol` and `Simulation`. + +@Image(source: "SimulationDiagram.svg", alt: "A diagram showing the relationships of `Kinetics`, `ForceProtocol` and `Simulation`. A `Simulation` contains a `Kinetics` and a `ForceProtocol`.") + +A diagram showing the relationships of `Kinetics`, `ForceProtocol` and `Simulation`. A `Simulation` contains a `Kinetics` and a `ForceProtocol`. + +- `Kinetics` describes all kinetic states of your system, i.e. position, velocity, link connections, and the variable alpha that describes how "active" your system is. `Vector` tells simulation how you decribe a coordinate in this space, it can be `SIMD2` or `SIMD3` or any other types conforming to `SimulatableVector`. + +- Forces are any types that conforms to `ForceProtocol`. This module provides most of the forces you will use in force directed graphs. And you can also create your own forces. They should be responsible for 2 tasks: + + - `bindKinetics(_ kinetics: Kinetics)`: binding to a Kinetics. In most cases the force should keep a reference of the Kinetics so they know what to mutate when apply is called. + + - `apply()`: Mutating the states of Kinetics. For example, a gravity force should add velocities on each node in this function. + +- Simulation is a shell class you interact with, which enables you to create any dimensional simulation with velocity Verlet integration. It manages a Kinetics and a force conforming to ``ForceProtocol``. Since Simulation only stores one force, you are responsible for compositing multiple forces into one. + +- Another data structure ``KDTree`` is used to accelerate the force simulation with Barnes-Hut Approximation. + +In this example, we run our simulation in a 2D space (`SIMD2`). We explicitly create a ``SealedForce2D`` to make sure the force is in the same dimension as the Kinetics. The `Vector` in `Simulation` is inferred from the force we pass. + +See [Examples](https://github.com/li3zhen1/Grape/tree/main/Examples) for example Xcode projects. \ No newline at end of file diff --git a/Sources/ForceSimulation/ForceSimulation.docc/Documentation.md b/Sources/ForceSimulation/ForceSimulation.docc/Documentation.md new file mode 100644 index 0000000..0d1838b --- /dev/null +++ b/Sources/ForceSimulation/ForceSimulation.docc/Documentation.md @@ -0,0 +1,75 @@ +# ``ForceSimulation`` + +Run force simulation within any number of dimensions. + +## Overview + +The `ForceSimulation` library enables you to create any dimensional simulation that uses velocity Verlet integration. + +If you’re looking for an out-of-the-box SwiftUI View to render force-directed graphs, please refer to [Grape | Documentation](https://li3zhen1.github.io/Grape/Grape/documentation/grape/). + + + +@Image(source: "ForceDirectedGraph.png", alt: "An example of 2D force directied graph.") + + +For more information on force simulations, read: [Force simulations - D3](https://d3js.org/d3-force/simulation). + + +## Topics + +### Creating a simulation + +* + +* ``Simulation`` +* ``Kinetics`` + +### Built-in forces + +* ``Kinetics/LinkForce`` +* ``Kinetics/ManyBodyForce`` +* ``Kinetics/CenterForce`` +* ``Kinetics/CollideForce`` +* ``Kinetics/PositionForce`` +* ``Kinetics/RadialForce`` +* ``Kinetics/EmptyForce`` + +### Utility forces for compositing a force field + +* ``ForceField`` +* ``CompositedForce`` +* ``SealedForce2D`` +* ``SealedForce3D`` + + + +### Spatial partitioning data structures + +- ``KDTree`` +- ``KDBox`` +- ``BufferedKDTree`` +- ``KDTreeDelegate`` + +### Deterministic randomness + + +- ``SimulatableFloatingPoint`` +- ``DeterministicRandomGenerator`` +- ``HasDeterministicRandomGenerator`` +- ``DoubleLinearCongruentialGenerator`` +- ``FloatLinearCongruentialGenerator`` + + +### Supporting protocols + +- ``ForceProtocol`` +- ``SimulatableVector`` + +### Utilities + +- ``UnsafeArray`` +- ``EdgeID`` +- ``AttributeDescriptor`` + + diff --git a/Sources/ForceSimulation/ForceSimulation.docc/Resources/ForceDirectedGraph.png b/Sources/ForceSimulation/ForceSimulation.docc/Resources/ForceDirectedGraph.png new file mode 100644 index 0000000000000000000000000000000000000000..774c6045fc62485d20d37a599db7ff0db082524b GIT binary patch literal 434284 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

fw)~M6!PPdaAOoZ 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

H+j)p7`Qo4ToyB+G6|m9}v~C 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%0A@lzSW(xe{ z6+pGZEQKGLX`i0$OY*-$tTp2~OvFD=QN2u>x^AVWNU)U>Bjfr^bNstuuc7d~Ec?{@ zqhvj=%1zv&{!)~~%!J|ms2VNC#tzDB2S9I@c<{~7U;F6QWau9(HPprn<-OxvWjPYTVUDvtnGL0^@@ z-=WlJ1i2oS+Rs5}3}zx#I~^a$EV|v9k6Ace2&jk#1FBY&53?%7T|21#arA-1GLBY7 z#@o>-yv^~IriK~awMdz(T-kWK)=1-)LVqRzQ05+s?Zh~Y+Jep3F{d~pHo1NSg^w<(z77Ub9OP~5%v||~f~mne+})~+f#Ylg$>8Hcu=CNn9dD;-Wl9$BvbDM^JqZMe;od(y zue5tf+%e55hv=bd+oPAs?l))PYtSZ+$PnZ!nX?KR^os$P{|+yiwf8o$0Z5Ll({JE% z)jOeO`ELdH!A{W1OjqR3g1Y|vwA-iejh#yT6hkyoa<7@YH$9W=&*avY z;}S&zsWdBqouBk{24kA_%yEa~noics>g+_vu3APF zF(BDD60@Pda(5iLq>xDBNAeppRtDj9=F@sxtDp06y(?`at|ErKfIqimpT7)9<=w3> zI6sHrqLqfITVSBR=ZTi~eV-LiWGmX(s8|7~#peV9pc3!t|gD_#|avkMrioA=-Fh!RK$*c6&iwY}X$!?ws~fOB48HPnPA85eNuLsk4iYJRz#dcI$A#Zi8tL|40xPiOTS|Jpoxh!^FMgDTQVsuM97*IKpbd`;He`ta~r2^TOIiewF?%5C1l z6_96KwhRS4s^v5>yCU*reEBtUHc`}vk6krn1KS!%BMLVoa(iWMXAjMlY38l7+Z zp-!4CD`ifxpOT7`G4KsKga&_fv^>b7LRD0}aD_>0NQvft5zRFUIU#Y&7V;}(!-o;@ z=FDxokv$UC6xPk_zZiF$X_&p+@o(}6>3-WOV(6(I4<|}@MosgS{KoPzHBVmc5E$4u zCFG~wP}cKt+azX}swRiHKv^qrxy*dWq&{OVa;7swvB^x{?wf~TYM7(4?t$f77KlSW zI)e;stCiYOiuRc8OMmVO+!b5iNd_iO#OqGUFrU#7F;#PR%E4ltA4Z7l5!qvkmu~H} zx2*~e1X{dBn)#Kd-_BNCOby-HS2{e8s5f)|pm2kK>ZK#W%F%ldfG)I2rY%|Hrg z9GTB%=WEAj=!F4G&u)HA2e!(Jg!H~d%~z1Z+om;6P*W#W*;{Y^|DjpN62cZcSW>&6 z8zje0y7wSkEIJK)@ZRrC;|*CWJvNF}pC_zmn-g|QPFmGZ2yyY#FM4|f)LG$X^epI@ zt#WPZh4G^ToW%rS+;!PTE?KieChf#!eL%t zS}xlbvaX$cInEs-ra7ap!00*vP%>~xYAc9qIE<@VEH{9Z5Q*X(8UG-yLJNxq0NbO{ zLWFVi>3#mRO634i>>0Oyr)lJPu{2W;MA-65jt8Q5}@%I}=DoN>&oB}kR=Bl(Yu zMh+Ck6Y7W7#@AZQ+^@hKFTmS(6VxnIrbZ;=O5h(zH?F8&OUh)H|J;gwD-a1}N^%ij z14-EMvs5r8eEy?bT%11P1Y{@Q8tzj+y-h+h>IZ)-^lJmO`UI_0b>*X+*P}gtDB*)h z=E(*~@cQLmRkpm|AQ?z!!UuBHDA17HLTadfa~OaQeCLRIJ)-&y%S=K#Veo#ltTYmWFAE4TcJZ#CT>B#DdNqA@JEj6{-(* zF|Xoy6KQcnEAP$z4?$w)inWsg56c&5u_~tSVl%n7( ztjreMTlVBgaLZ{1k*p*LI5?|zSs+n*MPBSrI~*U9E;oSoBE#iUdqeLAp#d^lKF4AOrt8eld{Me2>!TY zblt=AaKr34fp|(gcdneWPb=h%?V{hVpKM-B+j~{k=-vF7_&`>A{V(BoEx;nIA?+{B zWL?Tso9YFCI>7OUz#^JYMqaztUC_6U$#vr7lbES87P!9^bTG%LV})o~Eo}K2&D`!* zkU3onnr`|DG)Prs6k&8adRBB{@6&3#nzo;BI+wkvP#SY6lEr}D|I%((AB+XL>?9 z9z4M75*MT6swCDnxPtxM(>wD5`Y9gHDeLErMU%i}*q)A-M;cS%%h{z0*%chACof~+ z8-KlC2$qw2@*wa-WBo=)=~#iV9DiZy%O9~LuyG^o{V!PijKQn-InSlMu#zUFt5f<< zSM+&@IDd&7$X?!P>|Q=7(;8yYkgY$dfieJ~-rRq_iz4wY;Xn}?Q9U3LtIf&t84j_3 z7C8MN`?6?#;a-gN=ZJ;c73ybd|E{tm$;m=X@*TW4^%H9>$lgnenD$Z3zydgb4(Ml5 zLBH9(x*&x*EB5fA=MJoWYi0G8rpN6=fnZQBeUeGhRo|-;pUL~lDqygh`+ZVI6vhi7 z4ihxg)>INyi4&SyTFV?ooaK}K%l*-mc)&X++xYaUfC0$>mR+Fc!wrzgXusn56_pa= z&N4lqhqN~D9oI35BYiI9G>U&Su^%qB?PEAZEw-6{Q3JToC?0jh`m=p~gU&OQ%J08f z0I&QhPDG(EHI-nW1Iqe!z}Jk1Xc>{;t?-W%Q1shDWeRAva7qTmhRt)J4b55KCNp@X4$=SY{vz-1{iCF0UT@MBO}aMH3H!#IHNa@m(2d-ZpQ zkx+LDgNUw~gofD-c&DiU+mi6Jh_1KG78$H1km}0~_`+1vaV@W@!P%=a)Z85542geT zoj>q6OA4pmOoB8;tJJZihd>Rd8hOGz$Q&bRyUD|ij1-maF*O#}<&V(`xI=Fw`gHIGDfN=Fkk3?}W1_kN|rPMFUrBJ_V@XEh0 zl9f+$m6Us0Tu|p7dy?>lnJD2SSGsN)@13_;(!1+U!_8YtA6neR&RnEi{iOCoz(KzO zw_P^dtenzGSwa;sW#bS|7Fgh38g+2-XR0 z&WRV)(<@;S_?Tv{$oY3802c}osl%bP3Cns?4Pm3beQfSCH+Sr}KaT{Z1!`TF0bQ~> z;14Tf%x&^X&a|+`xFWlbvXR5IA_oYVv_!UvWN%SJImCac#U(sxx^Y0Q|li*yEP!&Oy-$mqZ+B;2RVdg=yjVJaid*RPMvvp?hXG2fy}K1~k1 zf2VczF5bA(DkS@YrMy`|Yw*fQl#8X}PH`CSS2G*n{IF_bNgAZSS9ffEoVjpOC+4i< zUE;Nxp8>>!<#?>%7|eB3qN@<;cH;34UO2P7V^9=ip#SV>y7r?Xq=E9@hRD&T%{iHH$3wOm^?SbBH?);^m{SIK(pLUoz&@qc zwr-pip66DQI@EFsvEivt#P#eGU!NJusyH8~nc+ZURo1A}g2?O*z-H1r3IKVeqjwr9 zPBdA=1^X)}ka!sySknJ#JhorPJ3*QL1ApsHGB`yFxot5==b;bf6}z96=L6d$raz5O!;01L~N?QXy=0-EX?}~sxaa)s!|ai1 z)5q^{U4Zlo{)^*ca-(h1nvQd~_=`U}RR1;NtQc@~=BJyv-P4mka3!Wf%PP)eyzjez z^zVgXR-NKaq((h0vfWiMZgK&$&9*EVEEBFUsH4jk5MJT>bFk^Wwzn@nJ7s6}nL-ee zSXUc>7mrx|p46c8v^oEeW}WO!86CWOxksP>*(Y&88|`}CBxTp(w;RPZM%7+xOx}Od zhy3XOp$}P-_P993oN+_Wc{v*F%M!K9NsLO+R8}H36y1Xi9vLg#jsNf?kM1ciY3+j{ zr0-!>Sl21=o$blc>AUB-UNZDn;xWm(G~*Ev8qx!h+Wj!sQwD$I_UeiC5VP6~e>p7o z52s$Fix4Xt?wM?&f}df_MrVsVfzc4z>Bhy%v7_E%4II&_<>M|BI~m;A(0OyLMM-QBhD)id01fq$x-*!HUuaX;Oj|k={!nK+vry zEg;gQi-1T8y%T~6q4(ZnRhLSlap?ujT}tW9oRA zFFd=s{zix4ZZu6H&|qlh7*w;sq~HS<%5@)^|Y4OFwmUHHt5xXlM*Kbt@2F?o6& z8g%nTTKT2cL@89;q|Xf5hSGHiM_3@3_)7e5_z8=8JjCvCW07eh-W3N<;M7sxH||8l z%uSUNojwyFrsp92l5!NQtVfqrZCJf9k-hVrseDTuO(fyh=X@*sT)gd@`xx`i!s<8L zyp`iml{n#93#G%gFZV6K&qSsXeQU0aa{`3p-Rf=efD?g^-TSb-RNsNP?U2*87=L3<0j(?aC%|+9r6f1U z?Eftr!l}-Zlu)-swgo3}_rgH@_gmT7vnsAZUw(|{C~IrAjdL$dXo~R76y zeK$Bq`Sj~X&3Hr2@lD#Wupr_t|C3^2-iGKfW{GkxV~J`XudSsZw#Gk zjo~PNkG(xFX)>-d!dm}heIRa?&0r?G>=xF!)~)+_lq^w)*ej^)494+75d#D}Bip+E{7u=G zul;{yZwAwuo{6_8x~YE6?9I)H``03thsm&10@}7mvgaiANNFYf{)#VU*smK+c0Q>* z@;FgG**x0Q&!w+fGp}+j$%l)p5K}p8XdRlQ8OkAuncYbmO9DdIbPan(kXD6951(0a z;h8}Y66XC%&Leh4*&-nxB`wDm!1qwR&b9DFJ&3?;;J${7@ULw+@|hXz=v}IlTuyY^ z3&YHO^SRZe@M%n{Q3`vAIz6-S%KkJ7T==1-v6?}#Cy0NRZKQX9Np&{xWG3~_3VzJJ zequn$mD0E!;li%W@Db}3Iz7pvo92nLHA-~Uy2DQzkx1a8#6NF7pYFI+?th+$>rw6t zSX@Dh^D8e9rgy6IP6l?kwvR5Tq<+Yv1}eNA=}bA>!KZ%Ai*q!xR2o7}Kg4E>CtGQi z{=PnwayFCmNAbPrrp)OlXS7}aAR5}o%QIR>Y_^KSAc23-HKRgfiA*rR)qGf8!XR-~ z0Fr%tkz)0pys8%uhv%sB*l7pAKf`;95+QDmk|oi(ULp%3IRn9TBHROUaNo=MbSl@9 zd}GAN5*?|053;8)miiJpGzcZd-O{v*wI%G}s9n5hr_c(YC?LjUg&5;?(AR@J(Rx-tLGh zjl0U$wYv<*7nWAk&+(yiM+9yk4_)0=PsdG{h&D}8ZGscewpdaEE%u6B_SiR@A0h9xmrkp*Y5O!B_UF{} zB%h>gPk!*yA!OHAdO~YM$}=e30az@x75CmbK?eHVVvC%vZaC>{*l#g^V_#>eThWnV=8~)+ zcjVdQ^;>Qw^V5EJdDCGZdKJ)KsiCm8sY2tsNt`K~kr4qPpta^PVveC@;-7W;4{!Gx}`?Tl%Sc722Fk&c|> zYtRVIyX6~6FH@wE1J|9}=brP3=W7H2Lx?g^n7ZCfWXSaDul>2t+Qrn)wxypPp2a9p z{1A*?U9QFw;-`yBhPUBQ>A@Pmc%YhnF{dMbt-0U zcked80L#JZ-gah+;m3f&8`4qIUnK~m@!Be5KIt`Lf!M+;P?BzBfZv9|#~RZK5y$$- zQ2}k+EeFzP@nT+Oywe%4Amge1^#4T;bB;s|Sz(~!(FXBa(L)6on%N@JGc8|(rog{I zH!B|+zusu(1$_sy^!R2+BTw)E7f4j>N;(w|_ez6c+Cjq!q*-2PQdtz5g#q0AnL15( z-kx4iSq0t9}QQhh6 z>wK^Z)jkFxT$};xI2ffQyU~j=C02)qfB7rO@R?jU-NGxv2lTu*!2fWEqU9)q@9M1 zVd}-=XsSMMIeg>yilp2TE!PSAmDv&4EQz~2WNwnZklWa+uCgI8Y-Ug@S!>0iyV)%~ zWd8{BV>7|W9EJ-RrCHfD<}IpYh>M?b=V3bC*+EV1DSY@d6LQCzGl~jThlq@<&iU26 z;N2#?BTrEdAm|L!%#TOZ4cnBb==e`cLH!d8nWvcYl1cvpl~Yr>k`EuiL%=K8-FIp9 zk7BZ^2@m&R&wFQCbGSCoKRRw>VjFk>-D@2A&e{F3)lP5cCt1y0jrqh`u=sie&sO_0 zEBI~XmdNP)l$Bmjv@mOk6(z!%&M0w{7wqKqaUDT zCO3H9=E_O?8q{~~D{_1E2FpqD)#?7hjoqi-P#AE^!OZm^bGNq#U5UGEo#p)i{5uzQ z8cN~T%r-41YbsRNzu(W7Ud6>`={jN%odrUU(P#nEYb)xAu+exw!V;J_c=CAlyDBG+ zrmCh@Mgn0ZWbRL1&bron))$BbXd^RNEewD_6M39%Xvsrq|C?c%PQriM_^)1sD+bQXgokW#P|MVqCI?S2m45{A$INe8 zZGpWiC3rsw$8GtFwvE)=04u==?O*6QejlPN_a{|L`uK`#JC}rW;3pT~$08G&Ut_V9 z#lap=fgYE-kkt()`12#FkZGw6hS^(~T%*qg$2}95KSBWfHBze31U&~?QrdFo(Z~JO zp_?lXsY^j~3s`C^Uaml#dyc6@O#`_JwXt1qi%oN=Pgdtuw=h9(eYg z*lIAVboO}`y+ZLiDx)g#NBQZE;f{d^w~t@p9r$3Umgh$?rcAneZ*;f7-C|TSrdMDm zT_A<-#|_%q&+=RAxL%vP(fIR@j)xbPv`OhE%1f&{+LaPXdxB~H7gRQ}IiqJ#l{es^ zpu^AHH<6Z*UA+(iX)9>x=wKmqZ~Hq+R9pjM_TP@6T6vlc%>4aXS{1r{t%5sT7)eOs zkvsDhz)wbf(|Q9eUxxudE`TnNdHNc~`GN44ovum&v_H>G>VS`Z*RlraZ&vkg&>oAv zia39>xZy6K0R>c51P|liCpQ^f)dRq3k-WT^XC~~Ov=6avG;hvZY<1LAfL8$*{V~b< zWtfC(MH!DKd?5?P&Ng}X3a+rd&%d0LgbFNb3#?b!zqfYM79)N|=io6j{LKeRXbYeF zvYL}szKbctYyxCHU;G(wM9eYLDmk#oCHzkkQwd0~Mf#ljOx#e2=gOnj2ER4Kni-}2 z4XfyC>VJ$o-R=%(YJYjkAu|yHdS#I}5 zqrU|36oQ)WXigZB3YZlK1BjK-$=(kxlwtlU{~3?66_3*zCQ*MLm!EL(-Sfakk>&@v zu!9+?)=8;sxu7yRut$Mc%6+`$GHnvlZ{$w3_^A4*RCmzmA~6F+lqIeFE@!;WJkl*$ ziVG|vB}}WbkrK?;434IEs_IYnXZ%()TIx%9I*cE6{KfNc{ybB~6mMHaDUv1Y$eI77 z27>4tVtx{yJ+G2$q*n^1BNqrBBzZkBXULb=6`bZIsgH=XdQGWQ$hqAz~TV+u)HU1>*_ zcY&iD2ve0_Gvw3SH)7xX_Y1E|W}8L1F;yGLgZDF@RCX?0ljZU8s?ti?MwyM9nsn_D zGiQvJUx}cODDHR1Ch0$cWgCWxOGMlA57UU{D>X;(y)@&=y1lk@A zL#ol5Ln|GVT8^*AZxki*&l*=xdK9Px{@`+U=kc_#$S@WB2(AJ_-+vGak#TaB@EYeg zED4aaD3Kt`wGJn6!Mr^A{4BNQNd2oiNPCi)`+D0z*kW6B&m}nOrCEz%hg}$NBiq7z zzpunU4^k>tpDTNpyChn|g+njP%Fq9(Q^^uNTn7rMB^P&qJ?kHzk|lo8YKJ`dEavpK zQ(Hh;=(~)Bkbu6nHtAF0F%M)H8;CJ=pIbpG){a|2xw%2%>J{Q6hX=h8F8SKrx=8G8 zTa>W4)Bo@5MtFhB-C`}V>{pl6DPnksa5W$^&5lJV^;X)a*Oi%gofo7xwO_0W-E@KBzLw^Y~C8}?Hu|u`2@}3j_{M1 z=N@cT){&o7yE&}vIFaA-k6T=p%Br>uE<+b?vZ9_sLxzf!A1Bw}_ZhCFTJhd($5Uol zrm#V~j|slIn0^m7#-3M4!{W6W{zo#?!}UvHqU}r{XKz;y9)&bE9fsJY8P#3 zhL*`@2ph9m25v6G9G}Ss-R#(Bu(oT4jLigF&f(wt&QbqA>p1ESAyF*@1%{-b@%xjCF<5Gg+FCL$k)? zanGrKpE4>=O*hYR>=oTVV*Oo)%CrG3CktO_&l%lY|G;TuBaY$YJ7+<`wc=Gp8BvtB$WY)Q7KRvLvy6Yw|&SuL}ovei!)4(<4bd6O34){GtDmS7jBFs8shj{3g%mr6V~ zu&))14oQ76(o3Tm0(E_tG$cstyEnN#n`r&@8ePa9WF!;924$&S~D^6MVq0 z$E-VJL~fh?`8}!btLbJAmr^l`=YwG)w0#qdxfRkvTAz3E%+XMVhmnt26&7D?c3=bH zgKyRv1D0&IAHkksM*pw$Vo^yALdLUEb{i&Y!Q*=v^)>e7mpK=3KBu035I;9DW+ zAH_l1XqB|C%VsLV;wNDhFM!b!W;)Q7QV1Y$YUXbQ6S$3et7u+T@Z+oV<1sZWem?z8 z23{>F4Ik4%vGi@=Z2IQYV&EEkNbYXZo(CC=cislwMC=69jvU^z7%|cs0tX+wh)W<7MaR`LOh;F+R+s5G@9n}jTpG4`yI7#Rl7>8wxiourrn#?Fx8*CZ&y<&E6Z?~$UqVUR5b{exW5a~) zcS=tf?-q~T3Al8xu5-FPU`oc6vNdH!y^@75@uG1@wYJ?5nDNy2-xEv$PDi)E=ecqDvu{-oavP7 z&;zXqNuiCLdf43sV2L579UB1=GBw%JZiTdwS&JdEW=Fq*v*3PGZCvfYtSM6SR+lex zdh86*#YmzY5DMr+tqRCr#jIA0rch~V`Y0vK3K`qfK*3ah3_F#_GYCJr+Z0s;VAoAM z-$j35MrJZ#%NnOz8IocQL*gULvXu7v@_1a#BFVZ_mCuKo1L1ma!W`E}->)^JrKQXG z4~uj2d60frln%asgP>zn+pSLK);J8vEX{fCL!|OZ&zCvt@OO_2natn);6ZjrDE!bc zJQxCsYQ8~i{J4uvHa?O2C-{QpeGH`+m zUVp@$_D+wY0vg0{Dxjz!d70V&a<+;#ZWN(k;niFP_;!7n^?<~n=A)u>=_%kr4SEOQ z8mO`f*#r{HFSD_#HE=4vS1#`d=$dbXtYCk9WSj$k7@t*NqfNnAsO!e-6?qaWEV>Eexv*N{SQ}bsQ0pjtLx5-#M ztdT3U)A?B!^9Unyx9_zwB`E9Ltew=T7^VY^L-XXs&5{HbH_n8`&ME=Gy4>lj>e_s!=gQ zgkY-=4KHfmwVE2#T>j(vV;IH%F8XTOUx-#5+uH|fcU$D!98gP{yeRmz<5zy(ld~3f z>q5bCPkCIdH@s;!RpZ^qhuZcb9qy~o{MRj^obwLEmlFbPFp0Go8!&ZsU`$;A|Hpb- zD?>9j;Z34-H2)MF1JFWl#FOvV|D<`3Xyq&@;#PG6EVU0+_?67_L28&!TQo>3Nnwvt zHD{w>pKRz{7!sEkf}=Ve$$&we_S&cSyqfm|iH5X2AT)NtUJQr|9tRe`eXL5^ zPW4;&Wj6X8k+2@ZOxuCa8m<;(24q+h#VPX#lqvFQ2jxw4tBsR`gMZDAEXlCuy+b_e zJY{eV=@WFkNAcmP^{bPLJ)~?p@2!N4RvBC;U-I!7 z@`5LBJce@t#JObt_>DEKa806TxtY z@^#FK{o6lSm~!UpO5xE}7alQHyb4n)_~wUzjKN0iB6lM=>pG!zaBtD#ZS)K8>%Tcu z8Yk8CdpKc-9c{6(O614of*ILNnrOqO2+bz%GnzD@6 zn8cD9$pT_Xe}OK82>G363@uU3#g^+KMTIB(_?2~30)Hgy$ygr7hj_@52o zt#aHk$It?zr=M@7k0(sj`e;~^{;+7{Ej|WDc>vMD^L>(W6B=WztOjAKE2_}r-0iV_ z?SdccCN3oH+9bR=(?9W=7uu0HvOOp>C{rQm9SjmXXJ^;TR8iEr_GM5^Lre5 zK5$D)**LV+eKYUTag^U)aUN4&PDGHSniWK1eZKNOp5O4-o6!tu`LXK)$U)VR66qge ze)E5UTutv~0@Zg%YSi4MLU)ILh^=JvgXT3nTa4|ds?VFQH>H8nQsO-(zf=*2(iGvM9)M|&Fc<#|Ax`Eq8(YJ5*Hl4p@} zc}Ivj$BB7Snd^UcOBm+}6?_FZ1r;AyX&O|%hKgz<^TuUN`v_%fML6M zK}Bb$ndgig!#C8Rr_BWf)RCn_SgtT1BoE*AK;o4rJ$k0%of-gNn)Eg8dNKp2W7o+@ zphYU-p?TV<;FMTEnbO&d96vYv95$>^FVrZZy{4#-O&bj#r2fmiOZ6^f&3W42MBIuC zaLuso=G{^D!28q)bVGCllXpCQ$m4U{!DQ%Y{cDOz4cVc|-m`AGv5v|L1*~T)tNCv) zIEh;Z$>c1@5_U+hmWa^_$FBSR>N);6qv>keA2Z#e_avSczBpXpJ$5bl(OvFGF}wFf z`RRr9VqTAl$#uOEq5TQp2*`IcVe-u9KspWYAa`bNlty>OjWFeZ*nRe_aL2n=fu;wh z9F+3CXqO-#>{k5D3NV;djothsE0bnIrwrwvg_TaS%s`10S2?XX{)G4|ajbl0*8aMN zys)T4#8RW6jp8$IGhk}&x?^u5oG05-*t>khi`q7KaNC9oWWuI;9}0zNrzkh#`prv} zhE!Zg>Ona9?1TA;hT;+7L26-}{&j%4#ZvjPVh6Fveg0@|t6N{zUIPhUP-!QssRCi55+C)E zupdVG`uRXH@EE2HDl2H2>|DQ_o-_1YFv_on5^^QEvrRSPpulQrOCE( zJAQ)AgxQG%b~%90$Y5k>mR51EPwJUQRP`ze{6k%aGv>h#ZmzR@pqxrQTd_Y_+1Jn6 zh}bRtX8sLnqzuq)rd(5BFo))yt_h^A1#a_e`(RVqmmkg(#z#y?0!I9|H>ZgLBS(AL zJ$-+NTnnG4nEG@@t02R*l&h^gHFIw;B0_4{IvszBN{qkjpkH9Tdt0+MOndK^Leu(} z_@|N1@(w3tlc81;=3RGbP zs_P-&rAR0EF`8~B;pI{AmHi%2QGdmlewroSan}2S)$)jUA%{8y)urt<4{VJ<4`eu{ z{@C58W14>|^FGoelmFO=K4foRYP8y0LvC`$Mz@DjpEdc_lJpMHicUX`;W|(s=0P0@on~u zr-{lV$F_Fphs;53x3zYe#RIOxi_J!I0*qLn}or>&(P3Slvhr2&9Q`74zuTDsAw1@AVyW!Tl0Lb1V>2V zpbd4q-l|Zisib4h%6rf|{GU}2RS8$$7@V#E>8v}Qry+{e2IcA}^eEYKhQ|}Hx*@(h z5{kHs5Bi;?=8G=(NSec*30eqX!09)T2bWw|8eat&n0=TO777}rDR~wgRG!+COs<@A zNg)hvf7tK&P_Ip19e2P7y*R?ZhsvDvNh1=jzB6B>8X=a>t>zw$nf;J7c>#DAcqYlj z84GdtPH|nr?n(;xPhy#2Q2bl98$Bk*&V<0NuvkX*knGu0nCfD0t6$_7nvKF z{Sh8w-1aFMwPQ?+5i)XfIjk|dmZnGnwRTD2588&$T0US!DAKnW*(g(6T^pL4+J`%P zBH(C)@n-Xe<|os^2T-WN8ZzOVWdAO+^f1|mxyZ#7(b>)6;aw{1=r9$wx3MxjjJG$p zwn~)VMVGi7VZMP|9x6&$BEd>0qc6Q@jPYBCDz`3$5Ld5TSzr?`GU(<)S_Rju* zGd$qQ60I1to&O<*k9}c=(oCc-73*If9-gfu%4-|Q$*WbY*v=$D3sk2YwV2%dGQmkxB8j$*zxkxHCGYjY8P@r6XXYKz?z&Bagc;#B>CLSaaAW>@ybI1#Lk@G z5{W!xK88n!BS8*h+9MFz3o1tjhUvG_9ffbC#8h;Jg~z0`=cUX2#<`H$6_V7WsqNq!_I$afzo%=aV;y!^ipJ7YUT6pe z_6;}EIQpuOnsFsp9%`5bd}a&NKeFq>(#*10uv}!kk~03WF@g5w;lSkGY&Zja*p0z; zmiFg}zm34<10bqxK?(wVP%-jzFpD<+`euSjKAb-)`oaO}!%9uiVL!?fnM&5+xPT1Y z@Fb@;O~soZ4NWC6kv<#ST<{hnVxkC}uwHLA!0QB>q(?NRO?$!9TRlya!EkE}ThG!8 z%TAMS7qwMO5d zL}zrNA6jEfSD;1tpX#_9n8n8T%DAQ2LX>k*Va6F*X0u1V4Wz@EDex(N#b9qc=oGV2 z}_s6{mS@-YC&O#LaJ@u$GU7}JH2j|UyQkrcCGGc+iuz-zYKn8!0U0UeXAJ#HKA*G z5+@IjJ2M3}zczl(y6=Brb49}Z7paOX8y~If{1Yi*6VL^Nb2M!ESLp0DE=8R!Vi={< z*__!4*>K)ARB&3dkwSc7dz-h95CpE~T?!WNcz0*)y9NJ6_%9c)l%QPZw*;hi0JZ33 zd$$Jm`m|>XH@&@z_V-V{hA|bq-*-k<%G=UnQ~Jg!ja2EA_efe!r<^Fa%B`j%8Qph4#`KDdWrjvyik}QLwOGE+No#lD2^(co^A(!@P*K(8@WK(_Wr@|pk z1o!M2*2g@u%(C96h3-7gE#5Iysj(9YwDQ7nMn`=?WycMoEyJhd(CXTgai8*%&Ijoq?c_bxQ&ixEmpQGFhr7 z>ka|yGEYDfGPmH*1!?&a@^S7oX^oAkGVLA(rWK*?T`c*XKh0r zdpU2PaPa?q;uQF!^u5O>r1|3G)xCfTHgjJzf@{UkRh05jA@U>J1W1v`py1VOHD!p7 z^fHv%k1?BaWfWw(H{TJ`g?Q#QgD6Y_y+N3$=y@*Bt4~qf_Eh87+QU~g!PDabOBpV! z9hUi!qzoWIX4==P;hPUXw_X7F&99!2cg0M?&RxiOXoXrI@|1fW=Aewp(+@v1xZvfV z0&e}xeR{cthtK5dV}{2`wuhlG4}Omy6*A(y7bOtJ294dc=K>UAo5fb-JA?i^^*L!W zdVz!ZY)b`(28UCJd*a!k{2E4^j>w?X;O%){ICZV-?pzqKCgXK7jgMD9!Tqe?1Yce` zUK3lOVf>a9=Q_ZcUwy}}d{Ams&ZWq;hu3$I&lSTsqoUJxz_L0TqNqn)g&v@0F^ z?b^uklJ5ob(}M0JPix&e2*(SMUEiZ!?M}*Woe;9&$bWnN^gtnmxBYN#*FFuRr(9O^ zHxZY|8@xA3PH9#H7A^c;#bh{T-Wsue;dNG_)!|Im@V{Gzd&-)wZmY6l;Xc0mdl1pR zK6FcTEHU6v5TDhTXI}eW%wBk1Ip`8?8lz5&eZ6R!q?lOaC9zPA;b+AUA>ud513FMyF4-_VE z8OHj(eoAULxN2f7_2kI+>h`bG3&O`Ad6WEpMEa&Avd`hL0Dv28Q zHG(I!SDB*%6B9HF(B`}woPMsp?O;Vb_yAGuFa;&s-$MHXHTfFm!(w)5Wr6BW9ekBpv}ai*gFMV>Em(jIEQoGm#C0C zy_*@p-wVrM7!n!TPv*6ytTB5}*#H?Cthn)k{^PNvwrpD)LfA?=3?Aj#C$*_z+ZkasVb(~g>(|`Fbjljps zch{n7BdIzbRvkJW;TuwH3iaxYWQG^6MNqHTrW5V~C;y)<)4=_-fs(}R2|c*2aDTky zhtum~UEDPfsy*a0!rzX7IYrNJH!b-VbKNZkYH(#1_O~XiTyQdq{foPp*4ApdruH&w zb8ch*cO(<6u77fHC?-QYz*o)tjU=({Py8rWfOp0c0?$QKjp8BmhMxaGmHgXx3#|PE z57*xXwdX*r2*-*&ftSo8WGnRNHMqhSJlk_hH-A`hTuI>%yWF~ZLs(lYbOe-qOWRPe zv0$LAS(%&Z%88!zs>-gCvY^7~it6S9a%vT|fv7KLOKhbI{Cb5pyCY8Hv^);9d=tMd z%VnBw4E|@h6L<{xde8rnr2l734_{GV0RG|xdHsY7LkH@)h;g|WY4*<0S620%($}J`*b>yHGZO=W=+X}l zjo@44)(VFxqylt=Sx zXLOvq!@9m7=R1tSBQ-rt?{ph*E6kvzacCGaX|awf>)ZCMV|gG00hF0zjcUW51$5nM z3+It11n)C#R9M`!Q9{@x+5OF-71iFDtrJ_30SF#T>^!sJy7NyB(hdrFn3zXE3A=p% z55J5V!k;68V(L|^^z$0m6&p*89Mv}2r1Hx&?NW01y^6I%9tA8eq}AYJH*HFGL8wO* zLNpae_BnF3;pNbN?Wd2BfGmN!=lrGa^4``q^matjEdaR6{rvHRm;4~^PT+}5NHkL` zv(Lv2mNnCN33yKp|E@H=t`g@e-A9ehJP$tk#Y{=!U{(Z~E-7;Ss8wxjByusDc+5=Y znboZRboxh}IPfvP&hNDM#RST0ZXi-5sRpGu8aUcv`QL>mD+q{;%?DCVTR3D!%qo%OE#XP5LQ`f^X6(nXYrKlIa4FMrIPkfp zB1s;fV)cLR5grtDIlbPkDEZK=U`tM>Sy~}{A?Ba!X`dSGQ7`2cN3ddeFYkapP0ygv znq=94gFY>QtQJn2o6i^8Q*h}Dq}ux^{Ncz zu`FYv%;VcfLlf5I`$V$7#dI^g7WQ_NrRh&3vmWHrO5F`8%087Q7JCX6Uh>n&jUmZw zWa`X44?C-PaxNu%g{?9d`5bX~;YAR;JY_9yU5wPyBUa&YQa^?EIkl+tZc1T1 z6gMb=ZxCgfO^70lHPzYGErXCxw&u0ovMXl%@k8Zxl^e;+zmDY_>aaz&+s?~=rG@27 z=3Qs1eB{I*LH06{o@u0)xQs!qoS9Q6)taL~Y#-X~II4&k1lDwLF8}xLuKRa~04#>I z&w+$Tuge6#5^AcCk{?Ydk+zHcvgIa2VPYp~aB67&Dr`AXD;8H@`+)5eYUVs?Uwm1rK$iFP}3}UhAcQGUOHYQx>g-w{X_qsONU7e17wk4HRLYOT&+4!(G zF1n?5+icL@TxY>3RMe$2tLy@-9kiAu_IHV(dobzIcH}C-O;chqA2nwWwuI{8ohHqG-Y=m`6S1R@&)g2mA3Z?}- z7F(meGSsVu_&6cej%*$udZk`w%+Q)`cAqZF#0zXFz7n5X%-E@t&-AHi277`i0$^y?nrehWLvhtSScsGUoMAPnP)dl ztj!q3@2iCqBoJqvhIVD2DwI2FaIgN6w5@G83=XMJeOI(oDOtFC2VW-cJiXIbj z>BpCo78lnBSWj;G8=J#yLi=LrRcZQ~+Q#SpWv1c&GSg~_bTZssd|9Fo_;bWc+O5m; zRH?-3VX$J&D3S?(kt3u+J^}(vuIdYDs~!|VN2u(9@dba+;!D$iXgr)M<6i8HIQ|%; zB|LJXcmMqKe?D1eY#@j|1BUj~t6ff&i$8x|xcH?$YNMOh0%Q$TAiNA*#Y$gM11~)X zl+Ywz}=obdsDU40ZIWyso)s62uYW7ZBq{*|CF$*6=~9@mN56@uYwxHt$v-W zZ~|`IEIAGh+U6j-zkyeY2LsrXEndJ2qm4)y1-&FFmw$LvVD*A$ls^CdjK$aGfx6gM zqH=yhn)xAT+Hyg{imEaXpwlU3(K)E*d1&y?=R8z%ux2jMp2H!E3KzHr>ptOz|P&_oD&Z$%qIEaO5hyI zi!JSV;fjpL5qyE!+keN;q{pWmR1ANXARqFl-IU`rY+fUgxycJty_w9@y_Fv_R%Bvg z=^AJ~bg$u0vw>Lu(^>%f%U z#EujQGR0_=^S#T4gavPHR3gfGZ|#?XQ< zTZe-+zfq#ruB{GKz?v=fujj}g)j*Wqm?j(43ve3vpf3XQ8+c3#X{bO06evzt-wc)fTS`%e5*1Y#BbO%?Qfmxjo8Y06+SPUnbkXYiLK zU#=U7hPJllra4Auq2&$!of)(MjZVWEQHy0x{`w`-^mwN5Tave%m`{d^!ToDUg5_0Q zLWzC|;k<0p4J%c!&J-Lt7rG!Ty#^(!j}Y-3l?NoNsHzIK>3nHv3W%~_QTNjZ^?~F_ zzxSbJe)m1SirC6#zvrW|mSrX0)Z!$Wre6zllQMxV0v?q4j+`0~Uca93pv2Dcq=v$Y zqalh{kNsxhveXYAg^^mgZ_$$va*2Tnd4-?hZcHOoQ;f3H2Q0xDCC>^4$iiz)1|*jf z>KfIn!*}FhEJVwv0WYrQP1%;rsjXj9#xKioucL{1&fD8)2Xe^eE)$RWSEs)EN4ZOX zpE(00V!u|g5^fj`uj0yS2R$mKVP}owlnWOjT$4RiSr3K)?$%%5=SAyjYrWdI(`;;9 zPYparbm@8}2KarCA+JUT+SE`jEbf9{bI25GVAMcPu`MS;%)LCKb@oAYf!<+XtlyF* z%dLqAYtQ5_r6lXI*?Nuh=Ki}u~y8h4W6;7_}oX`23_u)HfNDqbhHbahVPgkE- z-gHuFepIS1oo@)=86gis{da!x_)LL2!zcP8OeGR%|D&a;R;X4f(BGI@ zE{*4CMx22-gE%h34*dZE7L&AwpN|5_Bgj3f20*`4=g%9_H%K?cFq>7WXiOi5`ynR( z+!VdCZTmb@gzz+{;CT0~r3&@b92W=k^^<+HLXyO|)Nk*^J1;Vp;tUg&-HK|D$diXh z(T=c1V1xnUrXi?8712FUD&%t6YAYDw1&ovVVft&c;ybk;>-qO?0;-if$PlC<6-{kR z^dXeHZj;f|XvIZ%0NH#N?WXj&qO!e0_SrIW{@1q8>T%OSA0@G)V4A8?xjlXC*!Mbc zC_gDN7V)+Xd26KgH<)dyuKh5Gcq_wgrSmGSvY9}82{ZHS?wgnBYs&X_o({u4@IDl` z+5*N#QstL~Zz#HpAnxYu{%aDejyd`adC4XZ5Nu$}<$O=b&dru+JulQ$kJICrOJ7+sMo&{HAvH?1&O1T~^c~OBO6=N3?9Rq9Pc^k?)21ACP(ar>% zu=E}N!8B&@-d8TgJ2LbEr2Th>X)tDQXt%9_hG_~7C67fr)1~r|8}~IQ7L$>*tW=cY zd#p4R0Z$bW;QFtE!R%@2v9eSFC4e55azTkW4rnrd*iV=3E{xdiaik|xyjwBplEgVN z2d?mKVr%_UhqH`CuNO7F$PhDPR@=4(W0jxJUtb53u|p=)u$sJ2{La(&O@qL&U43@AFuIis9LF}2eDTO?z-*? z0W0@`e!Msz(PF#d%n~*{)#`eV6E#D`#9E&!-kKab`4nv-%FO3xt#|F(%!#qh6g!!q zby-QL&3W*}+{(&to9}xTqalRVmHsRpJ>$0MjicdO>B)saa zl}u5kBXzHEpMigfBAt9+HB?aW_XHG&-LRaElq7jFKAu!tIaa9;<>6|G{cJAAaP zz1~DyE_QW5|BZtG_wn{+twT=4Jvn*0jtd^84}+cdalea?#}Z70M}WXK`{cxxL&_}FA2w#f}*l8`GCWm z2N%>e9%ZQhj(4T}xKp(<`#KHo^gPlDHr~6iV?Ftdd21{ItPGi`{a35N`EtYxEtIb< zKx_u@;W0gy0a(!xAoYeCO+IyPdv#1{?m+sF zbg4;gHCnBZe>Hgp3pLZD<0ATyx4|t1QQ7C&G-jsw`3c@@oubRVq)oBWa~?NVGaYC1 zn5wAohH2qyO{qwQ$#9cm$xTS?SeRQ8Z$93UuByti(nuVx*A!(_vh>7`kJr1*{4K%j zYvZcX4$QXU{n~Tw#c~4d>pK}Y0hOX!#5r?fJYIBccndSEyz`+gTx|*L`beNyp<*Y3 zSb`wFHNp6yz)u z|8ZjArLDxz5~UAy3SKrx_%l^C>Zu6>)nu0Go|KD=w;(T$y zU+p{}3JW*ao6bO!Ewz4Z=hHp<)J*}caYtR!zc)tAT&r2W?JRsQyt<~1JEb9+QOzD@ z!X=K{*NaPkZgFZyD9U>F1=Wt@6GwqLyKhP^l%bm|1tlU+8Y#CZ76~ygigT4EfYxW$ zTpHys{6(!U8JOsW@mUG`!lNl_PR9KSCG~r4(`(Fh{f*VN9zh6ScdY7G6{?7bxFP$f z4~;8G=npJDt<(v`#g>Na4S_N&(Cj=U@CJ&z+KdG$n z86)2&OA^ks@k=%9*l+gb#1??e=NXf#NA zSl!S!!B|BYbt1~$X<)TbLP|YpEOta?*`{)ZlZQEFdSA3rvA&&|cx|jch!G{(?rQ7c zZFD-(4!+FEPQ6%v=8SUI;Qac*%-%z)wdDV5SE-^vKq%-m@D%91R2N97@H*RlKp*A? zMjOoXG^+9eplsZ|>8iTlEkN5SDSu(ZujV9hN0=^Hk$ryPxsFCAaHzxkY=9}tOGlIw zkSh^r=2)GFT*&9yLwfl}jdlKDg#_8QMMJj#u+4u8eq)&ej%grEX84+PjyOM}I@v8O z;?DajGBnCD6~5_AmwDp{GH1iwmbBO8Lwne>c}^__L{Pf`G!055)NHlKnqdL#gW&vc zK_Nt`46NVDr{Kro7f(M+PH4usW6DeNJ3c)x?}J#?ChTCW_b~G@-ZC*A5M_5W1edQu zRH%(Fc6dnHSu}~~2eAr66=19h)N(c+^lvT1@sNtJ=d4Hzn+HAtGkYS_Gl#P`2vJX| z?bo9&zQdHQ_NH#y6mHQM8~ZINl-X;BOQIbDgA?_x>*S*(NZO5(1j5}TH;1Y;u2GIf z^=(j8wL-xy%h?Le^d1oS*-^Xbbj3n3o}O^&#!dJS{Mh|h%x#+gV?)wloyzY#YU1aQ zj$iato_cKk!s{wxF}zdMx8N#w;K~=6@AHmc0K$*w0BD>2UN}tF59z6DG;K0D+RC5o zYvopASW#gbcC&u3M5tj*jPH&E=_iY)jP6cdjwtdU4#|Qc}j#xTwmLD7_9lNHY6mrZog|xdH+|BFLT)bbz z%_8tiSf=G)R4N2E!JKAJi|^2(%?%n_HnxW|)^s5%Hi!fWYS8Ske zdE3W*=o7DN{pqx|_l$-V6;!}jnze6ML7}I}>CE`?C)8L%2mgTcVH5)fE&Ja=?(fMqwU}=0SmooGf)|EMiUAvb1G*W zu8SzU`_^nX9FA;y>rg4{<)fCfpCw@7+f@4RFDn6e>vvm)hI5(QtMIEZu+-82&`{m)Njj1Tg%0RYHj!j$Ca5=42Xf@w(yL$DN zvW}d^!6eE{78*Br*s0=^CamV0kp`KsEb2=`6;Al>Err(PBotElB%@}n0%&!K1DpbK zL&PRp&1#wi32Ej(UFDsv_8`&kjpr|D5!;clLq#iPCgtNQVPbJU1Tum5BgLWJYRH3V zhy1!*#NTm)LD=J;gRS*E2-lf!tFjgwNU)PyjBV!GWz`wdNiHQLrS2U! z6sY^}wneR(3aDSMwF_2Lwk50W{Is;(xHhb4q@PKpY?^2iz`MxBS#Fjwem5&lHUa?r3W8vKI15x9lhlgdoER=mJ8-4?3_sl~4Z>0~fGt9U z9dVMCHQhj4s})DAEMQr-_26kMl6V;~{sUVM(75XdERXA0`E`LS7Ie!+Z0+sIvAyW> zPIOz;w9v?B%cBiL{p8~{bc#Y>YWUiXB%ieKZb+`A9oIps`*iYl9Wn&Z?gpC-{T`9O#4 zrr|Qx_5}7|y@tom>WF=aDqpQBR*~Ct(kzq@&XiXbCb2OiI{8TyZD&#E8O;Y?+SkWIp zLI0e}ArR1j|Bhm=<2KU2#(O?DrzhV&Hxd;6;E)@wtsFT2XZ8}tix#HB{*6T*paJM| z997`_2vUMQ21eS6ofNxjbwk+{TOqY*85$s?3=Ho8&TUSvenhTH9u7Ru^xKT4^`gK z6UCsZditKs6KLwlWz68%n9HeFPF8bm@gyq8Qw}Q~+jRASio42j2fsBXE7;gclHgC0 z&n*xhVgpKnE9m}((DzXgD(4Qx^3tlz+C$|j))T&Sc@DEb5jUKL13bID_LaM9871S@ zUm7HBJfeJ`?T{x02uO=+_v*2eYA~Z!p_p#|W%Ia?sKNOj#o6zHr6zS+RU*GE7i&Cq zhjz!Uvst;tQ`e)$z6Kh`2W{jL3m&nzN$IfX!0bSsU%xgy9`;rf#yL#v z8(Ii|4cz+HKC+^LFa7jT@-m!>sZ|dgItV3ZPl(L-XeE4qZfL^obx%;c(Y;l`Qhr%N zwPrt*v3Anc;k!GMMfr(nAo_RkRK`C)mieIC4$zhbAmw*C=do=K9e-eG3a$I_z0mWx zzbz-2=ctI~6562xjHzKa?c{V9yxlRPB;z2UA;b2-Q*4P4g{1;RtRx@x-uHXQ|>tSr6#aI z!p7&*Plg{t2r%wvu;D zg8Uz`7n^ZYr-p%5e{$AP{l!e*g-S1;AU(CFUD{k;9G(3V{WxH!X)U^_J?6U}WO;2= za&IU*TIDMOu($KNtN$R@6uQ}VDZOG}LPiG>qUis1|6q~RHE%|U*Z)U+Q%sB1+1!KH z1FF&$TEgO|8S5q680xJTELyaM(WspmyXF|OzLV$hyFIA)noPR8?KerYq}~YW{+26Z zG@D1Be~lj4?m8F>skc*%_S?|-9WDEPJ>JxbNWF%wAoI*~Fq6IDci?}{)&(BGLx39a zK~V!$G1teE*1%G{q(IyH;z?6R zx9}~;Ilb^L8N?sy+U)O+>px70vz#YchTmbw*liC#;VoDJU{3kox7||R1{_bWvRlPd z^@eiY@6870hjsIbalYXcJL^1-MnPh(zCJVv%JeL0dA`6y3kni{mJo!W+(f4oUe)>* zw!pp4nWDJe>b~$R)F&u;K0&2YO9Ye|w3!)86)xs+((2`uAHNia9_GK8K;@)IZz8+W zHTpM#8oI9$n!K{9jMjSJj*^iAWvc>t#4cas(|}$XhmlcpFrYH%C$;Lv>Z{SToA$kr z1*6sW-dGT-0PUP&)kqF0e#$yQXaVI65z+|SVha&`5$kNsjt zx+e5y#_9_eZ2}i>8n+QPtQ!PSS^vZh?ywKE1zE0Mo9t>&lWj|$=9qpOJgbWm;~0@- z&UUdQ9_6Z^Pg1Fy01ds?3xGYnXYKGG;MI{sc%bX&j?p56fTgyNV**s&pOPf2$x)p~ znx#GT$E{&EZEXBC@H5|j`6K+#QGy|4v-Zk;*K>A8!Z@i?52-$pm#3vjdwIzRgEi5#JNILz{P11UZVHlH19qaDB{}x(Dbf@Sg$}0C8Mv=$bpu_L5odpJ9Bt`E7uaU#frB3mQL1SCEY#sUo)cdAmR&R=3JLBefZJX`>l4~QW zc}i|Bj>8P|aZ`ll1Mr^qZ5Fb;>*iaH!~XgR-Z_WB!+MLX(UH@bAM7t6->jr@dgH1< zeq^38F~!8{Eu+Xr!7I+p%BeJYqLHv;HZMGs(h zviAZX)l7Z+oT0}YnAy>!*bdvkFj(drT5gw{$l1$AEH%qegmy$k zTY}9_s~1IDYAI2yEB68*`^IgU?G-58vWoJQPiQ4wm+~nP_MENzpyqDiKiTCG0eJA2 zd*itvI#PK?4m`!p&d+Od+KTBaYow`34;TuPq9lXk#Px(e6XQY+!`dID$H#q_l=RjzabkL{ zv*1=mf%EoQwfYHW9wqoUz3Stkzk7SDVqz|LUfbd$oX%ZV_uc0IK0>vfpiEZKk~xex ztDlHCJan8y@65ZVaKk8OSK(IDh$qni4K|#(PDReW!|62kjoQ=zrvFZ7Jgz3%ebWw5 z0eFoodU6N=)ooaFdA5Xf+l60)oByHc!Sx12{sPDbya;HWr~zQw6r~#Qgx5cvDFPU? zA!x1kSrB@BExT1BTJ1UcBFu7f1+SeGCI=Qi5WA`InDxdEj}kPRVx_8a9jAgBkjUm( zoB`wXy?142?HK-V8m`h zb%_n@HggeLOC5cw8EGXBiEV=f9>ctug}CT~o%KwN47FI= zeHGCi?l&~t&kv8#ck;~^{Bd?Y5hmT{gU>=B&OTdT9UQ#5?1);_+5aBU+W1d?QriN; zmH&R5ejMdMbPpHSpY~pFkl-=UF+id1fX|l*c)%F|+Z)!WyMdPh`SmeCWAVGLY!t7X z4J=QA65}8Z%as7Jv)2;~0RwhwB|sy)2xpl;`J3{&l-Pe~N|>p!mR-IH?;Q=!0N!7J zf>xCfL!d~*7cM%5pJ=$wtuez1tuy*V$xNFvuYq|14@8E_Z%JSxP3vz6VZRxgDaS}d zAirEu7v_{>3o)yKlW~;GfYSQpRJ{!k2J&L42*ze{Nzxl6yXvu8Ct$(#>Takw`)M;( zoXyZm=1ao)j(Gtw51zjiqUw)x2a)~u(JMdf5vhM`2J-KY>|}Tyy?GtF+j@m62%|6~ zP^>m-rtX+}-J=sNBy?B=s>{s54%c}!_iHTkU!00=&_*K)2v8!fA#n3~^2k66yFTt?cq-o|t(7mel4Pd0a7z zLu`8C5o<>26;{suc@2HJ%)BFWt!a`l5N%<5*JbJQlW3i1%n2>3rTx;^2g?5KCtPiP zeb)#>GLo|6pSQd4-Va!(xbe%a&-&vkPTdoXc0YZzbERkSaY~LMTz6jYbBFO2Gjv{H zf4cjUR-^w}OFM7rLBo%AfvRzNXfW`Z|pis542oY~7>lx;l!dFaFo8!_It9az(UDk{(w5?%s;YCa&YRP?R_WM~W z`&nz_Lgozg)R`{EU@qc&MYtTy_YE3|gVX`FxId|aM^hzQIhU4A#j@P$c3Z2((KeG( zw*El`Tb6>uS2nF|8@KE$p6zG`aA4HHuN{Ai(Ar!G%vDV9yRMd> zVaz#q}j>UMKnZqKFkJ?_d)>LnVS^!@!yC$G4 zVKKGS=6i7hw>hMQuaCF!5w78`XNYj9gD0slHCrc3B&vpX6Oya|KdS6xk;w?$?eJXN zDcg-jC~O{w&8ji$rBi0vK=C#{36X!5Iut9vjQZ>KU<}<*~>GplLV zzd0B}qVJT%XG<+Fb)0Ott5aOR#?e?dnhxvlC+c|nifbM#-^-mMY9Grt%!T;A&>K)j zySi?iz`A?hg)`J2{k8c_WBnexgnau<@%fOpFI?v*RPUrVpoA=gxwEnEDM66+NkU>< z^wO$xe|liQ5X|nVTyI#%zQbjmK;2=&O6vtg2D zZdA*Jsl>L2Cj!F@6?Z1i0I&C~i0*Wg&tiT%8D59*T|a~A))7xw2b^wIn0t}=0ayl1 z9)u{$XGfwuoe#6h0lbefLY& zKYzP7m3}x6w>u#fnb_Pa4T!H&Y%H(4Sv(NAe`J9m-($*%W|0dv3o zKYaZIhE&BR_GqZcVQu(Ke58c?Bgx1*{R$NwDYZ^tkrKV+x*ax~9qG08z4>(;(evQ{ zOGu|=MV|uN**wNb{QPZQ{QR?~A$SJZ_XO~gu*Q9j$e~!;PCewIaW)_qYJ1k5=P|QX z`F$(btenTq)2{y5vk|+h*BJBzRyDPEr9svgr4Yam}zp@XM z^1Ua3ceFIaA3wMxU(EL^Y>fYy?UE(`Fqac6hY+@X>B(Y8L#uChkjLCo2j3G@%qD+i zz>WoPXTmx+gCG$Ww2UKB#9z+sHUq{&ksPE_j`pa1qGnQZvZ+jlWBvIbH&`?e_7*Zv zrX5L)3KvV_WcbMnfYGk_EH9Ux&-qM}NBzW$fVd|a=*)M8JVy~amx$k~sYzZI2a$8T z1S}$nu`AhU2tUlL3^!EB%{357V+>=}6x50Pk*gfDPdzNl0QHeA6Wzi~!g?ZyDWOTePxs2%_b?qJm^PM-umrtbd5{yLD0Z&r;35!lKEhnLzo66$K&9(@i+V?Bf8)nZ|ILXRBz_5+AEKfeKQ^j7smt0o&8dMrrl*MFr&J{aE z;E*`C373(V#D$4vK&iNYx3wzw2qA_PrRCu`y1g+z%9MwVf8#4b20})GCFGk13|xA- z`CBM;bYrhS3kj&HQ9g1-lM>d^$NfJB&0G&(m5Am38bxiEtXI-k+Hyl6uOYexTu>Er z$oQJM{M`zoJ?_QBh>q~cF%N26AR<)aaOh5xclBcQ12Edck6MYo%F&Q@8mmm=!w%R0e@8sc~JP*D&A6AHyV(mk>dN~x0LG$C#huA5)*2U)4PyZHj zrR8sv5?{!I5&95PUR2@@k zL6>8u&T>|=<>HMrbE~U5-@5t@-!;8?%`W?-HMwH{QS{Kktx;@BM;825J!~Qqao=QP z?j#xBeDw5bDi_A&d0nc4{6--dFjbmVx>zFe64v zeU2T61**w5Z#IF2=6p9h^#-$78yzR=N;O%{1g9G`4-7)m>4VE{Nuu9u*yN}+il)%w6EZPm*391H_~Je#yr?I|@j^z%qrX-os?x%1JW)Tk?D3xs8-Fs5+6~ z%G*CIl=m?GE9Kgy%<@@=O=|zeoQ4I+7Qiip@%=VrQK;dqv0|o<4L!fL3S1khcsGV1 zI|aVsd;|IvcF%e8_It5P_}0&J@ivvpY~n89HFn!p*YI#VF^9~EAWzFFCCFIpH~R*V z`C-2@W-m3$wlWZir?Lm_vOo{3cmHJJL0HtEJU=6~N}H##NZ|_G9OmrF#M`SnQDdu0 z(Oq?AiYMPs6d@92I1JB>?-LK{+4mX*e{Wa!1P0ie@!_4_N}PIMWS2WLBEr)#^SxiH zi_#i{2!$(+$DB|D^rGv8Ou%h*FZ}O)aNzMxy9Z^_x3wRrBR;Ob(r^dGkGHnHBK9Qa z$e@=ii%d$t+8rx0`W`9PfzZ7ugg{O?+bJBL_n}lk!DFM&2t5n1Grb#ui$q`ELZ^R1PWFO7RyXEnq zuV6g)jPN^33;NETvBLzz*`fLHKrdAKP$FK)b6yXg=f0$CJn`TaUS4{F7M!-zk^B_( z5K*c)_Dyzg*<(%uJZ%=mlK>`^fZe^?D2o5I;4F7A9CKP1K%#(lZa|EJ#%ybA!^y9# z*J@}Zh6dXyjG2=!3ora^Ww3C-cGU+PBoNP@VOli!S>K;N2aeaZHFvIJKyjsK0Utmb zUtI)CWWg~KfFCsnC)a>hXDkA0G5vOd>x9w=cf#q;84o7{Vt&k~UEB=N4NAkv6Sf-q!rg@6=hk);sr=6B&Ylq;$%PHzgb5k*;V@2MHU*%L0_Y ziWG0W1@2S?C2tC^B8c11o1>j{T2EjUMn^$?5-z5BUM;30{L|GirDM?Zw%jgOp*Vq) zPP=!2g3%>)4FAc>DYaK--i3I(3lMmc1dT6pirBswp2}RLV4u5v2(kS9@tgIk7UI<;gSe|%)`7&wgVP7*g zIUa`Ei93gy7|s=jdF}uFn;wA+Wn~yf2ci3NB|B)Xblbn4j zBIP`Ph_?6stG>(_9rl#3zW`6QN41!8n73yWNBtHzF}$8m!NTjxCFLPoo|d2ZZ2mB1P!UNA$Bg60L;_=y zGJs9zrVkufl?s7oxi9>yo;xo}vGT>;)T=%~ISLkX*uq(WilCRe#sgL_yCw#7%-&Q_ zQHCx$OiT~Ojpm?f+6Y>9;b?jVEWyWjM=U(h!FQ=+U`F)n^Mr*Wc-EKyfdd6a5cV&tcSpnM52j-e6RnLvc!Gu5G?BO@!#btY1{uu)k94IuS3C7_r9erIm~}HwpL&{_sY{N6N$p zQr4qnnF7&Ff7fNbr$6)depB3dqW_zcy#sH31y2R=W4c}-jI0o8W;=ir!dz3prE=8m z=^AbkmFtrk@_ z-OtAaHdw$UA1BM3s`sf-3vTR4;ZKa)Lr;Un6nE;JZ<4ZigtfD{Iu5+F@V0}GuYI3J!T#q+EGx^akSMER(%gJx2BBlw#d#KuX zz^~dWm8%YWYo5h6ibE?5^Hf79Tekzpo7s_;gp(`VWeM6eU0|O8^tq%nr`ViFz(t?J zB4@R}#y4)X-fc!=spFt4z0%NNmYytHNEh^(RUXwKYF6%6H+;$OV-&7WFx~!Xs5W{7 z_GrZ6*c2JCY?kAy0}QtQN2@L(VOD?ao!QT_1Hcj7u5k5YKN&$aeSGj=Ke?WMFKQbe zscY>GEX4o@&r=bbrFjGwD|HbU-$5&E?!lpROsA# zvFB4q0#DC!vFR*DnmjKl`4_b2kXE*RHG9eAbe4RTk{sxL)OiEMsnw^XBv!w8Z&Zh- z??Rbf>G~*?I|5c$pYpH(iEsY})m}O%ePm$al$3arU0xi!9S*l)a;f}fPvw=uxEI&D z_VDd7K9r)_!DUdtqzNiUcJqHC&m{?r0plP5p1Eu=8KClJxThzdP06WJZ_enjhFU%W zh6^eK&SXM&3pkN1ULS#XF;QAqTIJ>*kne5%(UR=NQ9B)=Z3eb7=Elh9EkXEYbetetJfSOh-jzMb*-2ZDUx6=dwKUfhOOgPiQ z@C?1e7_i~d=kXR3Nq=rgq^?N9U$SSg_Lg!Pj(jUG-MSE={*WB2H^Q`VypAJ{lHo9; zrn%~=jW`+cr*Oc2(oO6LaiOG5RN7tiJ0W}Y$F*&>TRbED*WI~Qz)}?>1wGw5cx{#B z{28*Hzl*jAU{(+8{S*o?S}pPF62-}jrOIL!nI!AVz2D9$;%|2MvKcE%b3~U-iMI0Q zhK-Fs#u0*I54MoK-dPg7GsODFLQb2W6lI@M_L0~=7nrT;VRtU!i~qji@p$qegeK8f zDDgUcHNO!*vkpJn%5_ZIM*VtY;W%3AgBV=9Em!8p*!NrxK_`a?%3_JG$BIWKfA{_^ zpY_Zmdx|7%cK&HUO{I#y>4AnO%c@oo0a)_CwA(t*p9{jF+@?9$RoDrJ~j*mly9*_5W16Z|0fT*Q{%?FO$_^nOw>g zJIN295N@8pAJ#Q=#u}F^V>%xFx2Rc<*?B6!Qt z>ij>t%yqRlwQ7Kj)5@pXPble`g50M^I(y0i{u(L(kWp5UuMpct)#D~e#*GXD{t3W6 ze5-}C04NHKXVHHg^aJgS@-nLt0q&2D12WkQegi#Un1XaG;))Lx7JUGSvH4eCd!q1} z2N)Tip(EamXOk-NudL<-#CE;o+(KQniJN={JOF8ySKH^72&13Rk+X6UDS`Bs)m%rnBe`$)oX8w-E|Po zGlYU~QchR*N9T@0)O{y|SMI=JOfzL<)LOSvbBGR%3B0hqIIMt94#vNnw{0@mGk~W-O6;8g6y`4NHR#1W=xehJ zrX5hImw4eDSZmkjg|C)vO(jqg=mdb4CX8No$BcT2DU)LZa^GVkaw8joUBIMd$n=8i zC7y94yS@vq=Y?KG^`gzh~5AY3E{e1ZKa$&UlHyS*9=Zaw&=X2aZ3h!BZ6<+gm;8l;CqyL(x6^ zqzczu$4cjsT1O4>aA4bphr#zB=;~cF9oY+&Jtu0Z36ZwNW(eUck;58$whRSoa8y$i!KvCK0iBHsL?0yU=32u8%K-LV;gGMr zfc>7ifwVve0=1(*>T3#b@z^K#_zivpUL5Y+>A6pu82U0+a?SAN{=XqwmH&cht>Gsh zj!rTmT6dnOUEpmuzwwW1GH2ooxDIpzPO*xKRiegRdHr#`o0R8fARE9t3P4!=q;>~T z{leO#w26~OU%AfrYkV2mX8L*aF=tL+iVf+5AKyvX9eQ;6MIk_awYT1q=44X*aA?Nm zy&NV1Vr(`xl}QGiSD&j8s;&%6L~)(J|GC``L!|eAb+GdQEephU;gkXez6gpDO~#cH z`C^pBUQHB2tgc#ho3pSV+!^6+%xGj#2M2l3D~}vQsV&j!H;$sBk#5W7y_6RQfCpx$ zE?qEHwQzDJd=2`DA4jhl1zaqBo%%lQZ!5CiKE3}W`*UJG8SZVcYiOOvDEUaV3C6r! zJ&hA+7d|Z*Qz!CXA98&_S^0QZo$&oA#?r4{7U~qyq#y+BFGL@`sJ$_Jb)k>_4C4E$ z+O*|+08G2s-_4f(;Go`XBPqDM(JfiiqrCIDYvXdRMV5IRvR8&@#!me_Hh5;b-7Lo@ zx28_&DS7eZ#t-fSA@3wbBxcjd@_LdcecVKRbHH4+fY<%^0o^`5iLq=i07blB4nx<_ zsqn*=K~2d?zt>zYl_UN)dL<=qO#z1`<-n(^KAlV_bV#m zc^^(r>y|R*S+f5So-?RPYTi3}B5jFV4W0cgrqvc|okaJaU zR>>sYvZ7QXUF8vX^exnV@9-g=mwTvm3Qu${RDLYvtF#{P(K;V$H`u#$FwNceRh(pS z-(S^gPekWhqu0*qocgB<8%qWQu9+5{ zF@GJMcUc}C^>G}%8VKv`57q@-CV4yr7i$7+Jq9&u*~Zkie~ii-4XAw5F&*GB&k4Zx zw>hzNiu0&9Zs#&)YAXuAManRa=CRc5!Jlj?cQn2$8?~b=P{rIpSE7_1Vahu7+KB(; znXI5_E~juB02it-B6$c2CvTpxdgU}e(ag!EAuez4^yQE=I{S^(`$bE;U3I!1QRgKrY&&M9)(1Pdz;iUtpuZ zO!q5n#ZQF&tF3|FFl;bdni{KA=w+Y=8@*o8WM>&q3)%3W!vXy_M|{rpWD$@~Q+3Z* zXphk4!f=z!SVXEq*k5MWf>E?h8H6q%h zL>%B=tga}_Q(1hS3HIs(VR;};9c5rmPFLE3#H0H!uPbl*TEEt?C*ePQ-1rzslA>kD z{>}Be=0IUCdi(h^DuRiv5x^>(4H(ybxpa?D-J;a2bc(_(ZczIV8b1{J<&oP*?fbMk z3dOkFms(D^eZA#>K3_ff{`2owwGD(Xo_%m9aWi4Jc3k!hWgpy)8~iev3Xf6Cg5Xgf}RP;597gg;@K|_aByT1~77gps*E3S)ekXnURt`gMVycj#bftnHv)%qDz40>EO%9+A$@7>qLA4KPI_lc1#bGe1;=r(UO!q9 z{x*&2lJVm1Np!wPz90*$Y^}c9%tR#ULsd3Y12QZ@n9Pxj76(%vWwhAnNj=H*NDL#S zlhguhQ)D4|s7og&lM7EkD<^bfE4Xwg4cd@)kvV;-_o$N!{C2PL;rtCc_`<>z9i|iP z3BLR7E2sXE&E=5t1Q_h0lM{u*2(}S_13$}WX@>kOa0y$la?}E$AdgPR*7(u%8n?#w zAxCMCv~>=p%JJq&2YTa5=95%^MaFbt+M3Y%e{axjV4uvgnc}R;-92+bbB=1*TZY_QOE{kNs4Nh&=kd%O+QX{LbX4Fqu?*h4wHZ5!tB+Ej1s>D#(-q1vHq(lr7_!PoG<{dcarV^QDwB-hM^;wZ`83Nf*gXSEzfV5enc?VR(HsQx#~$Rm?IKK=)Og=D22`zD)iZxZ+`u z4;avbm_ZaldzD@TD~rd<0WWFc#|!B_55_9!c06#EqZugULnkQSrZ1(y6^AVW)e2}# zr~F6&){ML_7mfMgzan zGH<$F{(>J0Z-4DWF0q}53xXCV&D&gBe7#F;a=k~Dpd%6E6IMQ|kjd(HZ;jeA3)TAH zZ)Pfpa&Uc>(cn>vIkpsW0}{hW(>Y$E?1{5iZM zuh{DS=(P*xi?W(9n^kXcLD@7#NI`PjXq)|edTE`ChRk@=a#^-{X@aCzr$aac)9f2l z)_1@hrg#TJ(Ar>L^D^VIet4z_K%})VYADg^vb^}Q|C8kqzIW+r$fds&9r7lGdbq}u zNiXT#a@IY#pcR6)7r*u_bYO- z@qwH7MDwCW0G5lA;SrWP6lPlLOET>fmG?iYzlNNMm8^es`SoJRN-RhD|6}aD|Jm;Q z_MZr%HKNs0HKJ5$l~}b`i&C^!t(rB8+IvOB*?}6NimF+o+FGUdh_qUJs}*~X2tk6x z`sTdu`#i7v$L}AI}zOcZ;J$tGVsSfQB?Ocr9%#x#h<_49njWb=v7L?krh-9WncCZrBON zXxiC0LfUjluF%P1?7OTc(g6V=lsY&GW&9lzxaBVAJ& z^S^^Rl{((KQ#i94qJ|so$-bFrJm+?E^~Yl#cRh;?X{}Dvsot@3FLGS>kbEX%i{XXl z-A2CCOr7r*;t@_KhKHf`e-p<*-neas93`EIkO2IA;f`hm6|ZM|OmRz7AZVbZDV^u% z)#r6He2HeSn~w#Sp4|k!DY?>P5aNox!i{*5mZrc8e*fzajzcIZS;n_|Uh8JJ7CYx) zQF$nQ(6;gpEIt8^q9B;CYeiBNnw4A5nMs$ks5?P8!8#mk==2h&GEr?s)Zs9%Ep2W-Jft~WbpI27|H$Zr5NBc zE7okwtG&6L{E__EH2!Waey^zq!iZ`L@&%Oat1T+a6U`giLtGvdC2>5d|_B<8fq{C7quj!QTJxj=a`S=Qa=B4#xi z-wlzeY-MD67mjv&`rpGrEi|{uoe8-qV&yppuyf^A0Qok!Htgt*)Q9{WT52s8^O!$C z7R-E9omgjU5E)_Oz$>CV#<2IQS92Vl_m{gr_{GN}wHhc=QFLU!#LPr}1*nhxJr@szNe^6VGt%Pj0b0s~LR! z>&=1DiXfiugYzrZm@*^|;;|E!szOptd+7_Dw?sxrK`$J59Yp;CwGrm53OqS!gl zpL_q+>#%iF1yCItK)Iia_;JWDB3Uqq5(+2W)D7cp>T-oml=|*s1&Y&3RVw+_Klt1j ziGl~)Z9d4lq#3c%dG~=s7*?Rs2R|QiY5OCN*}CJY9(S%`mah?BIN(eFTtW8r?+h#O z!{O9Ot)iMG`3pX#j>3yEec85_9ZPFa%jD;2MLAYvJyZYBS{nkY3M07uxFw$T;zyPc z_Tr3#Yh0*MOLHaaPqgsre=U(vH3;o>hJlNTzrlfX7^NXOF&Y|LH618Y6X|f0mV`jk z03X83K2Ty5K@%W^wYez3;_YwJb& z(*Q})nhNs{w`R}&vz6kSYC78;W>vx6oqd<)kT09`*F$?)IUCP^o-F+YxVyq5=Q#$VuZ_nez%G&~lPg0&G7HQS6k9e}M>5^)BL;lbaSp*pnZo$*>WLspY(z6pd2-y+1Mj&Yw>_;Ir&iy5qUS=omur^?Ct zQ`0Qn)fT_|)|M#a@N*Z`uy?4P`|eU_1AR#ZysbKI&pll^-}9eA`PLpX%&Gni?pAS3 zRiP^|GKpHMVH#MeAhRjt^s(}l!^DdK3m%o_x#wLQq~!fd9iQTo8LF-OzVnxcyQ=a@ z4rj}7GKO}q%Qc12!lHL_>+A$ z>`U%uTqj8=g}(#+^u3qUzNl8giE2`}oGrTK7EW|cLnW-WafB`HBx$kdn$G<7lP%01 zoK4U|t7x|*BCzZJFN+*SZWi~;5%wukV!ni5EKddb6RCE}&41_P2Q6S4Pr!A6Xct2V zU!`PH8<}r5tU!}_V=V7E3CLHqXh)|Jda42mCItA;fmi{D01dT`s`;nt7zbNFdhU6) zko(XKe0a}mEogYb{RvViKLoisdick<=++gEY&uq-+`oKkx%A%HU{WipT)OG6?^&uH z5Sr75oRT7C9iV(VmrBU=FKI}BfUgh144qJMVGexY~$?AoS3c8L_{&!xq?|?xc zTL=^S`lt=(Khnm#$(xV zlk)Rmrp{%?$-m6Ynf<*kd^ng6qDt&;dlW}a1A>XW#lpv9Hi~B9{VVd(Q^A$cfLQNm zi}ijndMc)?tOHzpiTL6UI9C)2hQc1#bil*2CedU}i)h0rsQ}J@8%G0+c$SetmY-ZH z%(6W!z3I4BBD7wKvv6wYjEKGSp*hyl(Z}6|y7lSHZ}8!4<*o~|u1c7|?ussC^=Ha% zP!Z+mA$xeA1weUj`h&k{b&cm`i*1jiw?P|9F)XsM6)&Ol7-sms-up9Rn z0pwq)?keIf;g0Y_ErovsQa=dDqlY2;+O+=xp!J-O#$Dq>Qp5hr%G^CrNctzGWLqISTNVwL7t)6`yaVH~0GVYX7iBXcd{?~r*D z{gz5Zf z>6|k_0v@sOaoKaI(bN@)VQ2{E(7>3-jDYL+hCgmmx5d*m9ACfT&N^uMK+jhIz7YF2 zj#B%I4~~Izz|_4``Dj=WBmInLBl$vI_kA^o6}$4#cx&3*e76l>9`jYExGR_{qu$Hf zapwTvf~G`|E~t8pCYOp|tloOMrp1UnUWBQrS_@m=Ao}NOa7O&!?c!WES$yAwc8$&m z6n>JJUcHgYz{x1jY(Q^c)3IKq3mO9b1{5(1D;eCi#>4k_yPY@WT}o-pvrtG!JN~R< z_@^_;1@%20jgtGc!3SX{k@L3K<{ zRc&vNoF}%mFJ&y2NF1{`fW(t$L1n>{cS@TFy1MC9JXNE|YNjSUPwiJ5Tt{={eT1F4 zEpj%lisr>m9&f`IMIg(|wxgP$E-%{Hw23^(>~J~bf@?J&m6-p!;)o%9@luy!hD-SnBX@uA=`}%?=l*=4B{GqGCg%ChuX*Bm>JLZSU zVEcU7DVakjFdxvNKf3c3BDf)Co1uS_rN?zB_LVof`gjyFheuy=$himjA8K z1&`nYM0K_e;B5f?W19P0uS!gC%9vC#9pZ^CN_k(Kj!)p=9#Bu!1c1v4`>rw0PQa~K zqR~WivSIy}<~=nuKJU4J{&~J-Axy3)C==$N;ZS)Gn-#{g%B%MH@h1|bz)7_+OK2&V z&SfR4YhT~FA8p$Hyi|i-t(TnNBzA{TrpZ67dq(B6)v7%~ZgP16M1egRJc#ZWyg9*G zqnPwuB}<+Eeb{tcuh2>gcN0F;?_0u!jtR9t`|o3+sLvLGK*4I9fMj*c{T(-(m+Mi) z-!F1(iOm-F>NVN9$tZ3MXCv^fjq-lK*jqB?n5RdMjjt=pg_e7!n@U%4d!px0?ltr7 zl5Z`vXk3em^2)SzuTODICHT7}01*zN^bHinNY>F3kP`pp~ejhInN&+U7qO*f^ z=C{XwmvWCK-udV7oS_0<^y+5;i8-(+21i*3h~?0fcewYCcw*GI?4rkJc4m#O;Ok(U zlgZv@%^i9#<0v7?R<`Cs*Wwm=;$^(ekJTrcTr{&McMF%tA18_kUgB~flYElJv_k2YL*wQ(JA3ILJeKsc=d`7Fvm#Fgls0TVb?uiJ)n^?0g==Cc}| zWuQL5lZyd8H^L)doPZI5G^lj|1puuA2_gj!?4#aHx#%o3CZ_{gE6|h^6 zm&Kw#<(VHb413Utx>ogJKQtQL6-6a-aoMPGi{idUxIY=HFRnbLdO}VHGKGWOzG=Rx z!AmHNmfrrhGgV(hqO}u&DP@9J{){p$b%Fi=Ow`kE%CuAcZl6yvX)bzAvCt|-(|$MH zFZp@y6;(I+N-D!)usL8D=8ic<0WUFG0ZDn_2Vm>_c7y5 zF&{i@YC7!qWpe9)ze+QqHIruT-;;SLbt|O~VSVZ<7n)mmb}q1{Pitxlj+yxd6vwpm z6#JnfGRFX0aWSGH=~5BrQr5y&Ki6cZ0z0rA;m6}E&-t3u?(F{44sAmrbwR0N*xHl} z%C;=fE7%vm__4CVP$j0Di#}TK_O-;n6NJIWx>=V3Zv<#O>h$b18pE~DrtRGK+)Vi! z6UR-aDs(Nvy_Lvo`XBbkd9yoobnGbCN7zrWVKz>cRP$@86Xfh>i-mm^uw7izp$Sg^ zS(()ApcAlsu3WMUDFEv;On9`b^pU=BOenOVS&zJiCsW;ZH>2LRZ?ox9sO%2nDjSRZ z2I)5k=NA<3&7;D3(TOLi{3I&#Nb8e2115PHbPSQd@b6_X70yfesLXdA00vy9c?2*6 zh$;tX?5mLOLhBX*<9y+fCPM++Y-*wxUM~R?;T_;xM2wU;t#_NL-30<*ZUFO|9uC+F zMIxtu$cEo({3LnxS#M z9CtSPG$=0-Xn_3O%$oZ}6XMC96KhTa#jG+C{J;Fw~KCea@j=j!Y;A0Q`R2{x`iq}aJdFb3vgDL;B zclUbbUQ#I*khJN?Le*Xtk7N&(W~y#K7H0#jH93P8*jC|4Pd|HZcg<1XW6_)!)5oQ- zA$_Rt#Oog0y(k=Zt9Cn=syDClXSrG{YDnWAcJ684WK)J;%~e}VkjK$Ek_8z4%S+kA z2GRKPZHtmeD#z8M1Z7k1Kh!_~b6cR5v8?_CHkeZm^v6VWl%P*zp#rAma;e(ep&s)vNg|ERrIiPbGqY>WygqWu5qof!W^ z0D$Sz?!K~*hlq+-sHAM~XgbNVLHK|4E17>bzJJm?*{dV}WuKs#rhs=;G?*R5jos(S zqN3;q%e{!&hD%*qUWa)g{r)J~K<#{?6GG*K<_xiuP3kLpX3C6IZEc{&}g#n<{yq6#4bhChNz`a`Sm4<3qkUe-ymvHR->6I3PZ3j z`{Qp<3%@1^QjDQIgR^PIMPB8Kl_1Si|-jBooZJE&E)JTyM&pDmRVRM8K zO&?&V0CNuVEN==a2kZ-c`;o_mM(INQN_HNM^_t|UVxhx#(*Ed}mDBjDtj_T~f*n?ox)gekBCXg*%|$dPwej&kILDVXUS|29??`6LaO zNh`gmi_Dd;PiYvf9?Yb2C`?6-AvO1u8@@e-0U))@ zH+4)g4yQvmhEmIdW-9J<7fL1^eT7lOhf)HbBX|xw=~O^Fg&`G^wZG*ZJfu&<1HA0_ z3TGz2Bu_WDb$GKpx*1l-tIv;%O>VTx9saa(n!e&?qqgZU3fPim zCHoGZsR6gHMrR5;?oZrX>`9jzJNaf2Q0;Y2+TiUh$jVt|l8pE`K8kTVe40`8+Xe&B zT5TfrqK^NX4Sr|XSQhfJ(&ks03ZTe(a&#s-&eSZ9JO^d@=Tg)9SU1 z#V|^_%0X>WuRa2fg)fKvzW*D@r5{16I^#GSbzO{fHnME1mWpl)PWrwV2y0sn?YeoPO+Rvb+Wp!3Sx*Kz5TfQT4lb)0^&WjGOO_mHTVIp^AC7*2H(4sZ1fh9h)I@QO!-`7GJ$`$61f^Uz~Orr@`HYGAa^VFqkSg-v=X-Q^S5=`#7pR;k)5$Mn_!2pv zjbudk>8WP3^I$Quq`dJskT6}xxuggRas9mT#4!6@9naw2@gB_7R*AgCMyF=cp`(hR z)rf|J-UAuZl8yvsc&~ie+u>+|fl^kQaH&8`Y9To2fdDahg7wOZ9c1AX2pRw#D^@h! z*6q5jnLbe>cMQIr+QXQ;@$(gZWlj5)BmA4tgOtOtniX}TgiT=Vf@3>XVPZ4(v6|)* z7{0H8UVCuT152!r?7)NPX!Q0~7r^d-N`+8rS4~7977+7j2Qx zuhgrU$JVPPK7{6Qp(GA)Z?|UQy6=4V5z$$IhYzHZZb=Rey*uZQ$4((Hgnt%EoZY_Tz~HPt=pFxkuyU7!;CXx zdGAC`7ZBpB{E2A4_P+b*lHC+|t+<)H)@0m068`q+Ntp^U9 ztepI<6B`Syp-wex(|AU&=9E(CJ8l8eePYwDcK=w-;Ki{1L#ZTWlaNP_^|pwrD~Im# zShL!z3|L;?t2XTjjElE~(@QYn^32i>O~NwEkcs>3?u@RDb3F!Og*6-#4Ql8RNfWrWVGX({S}kyHofZ%&ph7XU@X$WZmzX>m6-!#Saei7XnP(dz8D{CA z?;dkX7~JM~LdDG`s#Hva+~zs|(HRrycGW<4uiD*)()deb>O2f9`U1FvX>x(Sbnlo5 z->IQx{z7!LiOZm7CGYbLlHf%Gh?+W(*9CAtq>+iyU`u+Y*Ui7wml;xh-} zhOh%4$VNDAji#J4xEQd7JNO(P-h6V!6wn#qWYMU0YtMaJu|!oGjM|}bRX(ja`puzg z1{{J!9Il6oNgEus;f=oL?xMC!JwoHS4n?!r(15-+I+q%>XvX-R?be8W9<=wo(Y&(J zi7Nu{g*yg>4o~NOveYO`1NV(3`hbsnAT=cP^?tG^n2naY(E_*!Q>uC7v0)(DiKr&VOZ+? z!mZ=hbGHdyx=C}Tx@DZn@rJcu?+b~m(40+@;6Pv~MP}^$k&`aj;$6iZv1%2oZouT0 zZSlTe&1|z@(b?1XHSyWi{>dV^*BGjU^S>IARp7yQU)2kd$M@tbU%i586U6@T248)~ z!SwJ0rR(u&i1*7Fx>#eDK+{UgV@gd_&kZT^oLdsJvpUhmczX@6W23`z!uvW;{ePi$ z_f=H_f=N#c zM9DXZ@e@lwjU;rIZgQnyg)A%6&?vsL@ z24p*poyD<124owViC6o8Z~7s|$D4@cQC1V*23rB`0klX5HT3u+`b2dL$0=_3O4M)> zJ{%qrx|9^<744XTdytOiuvM}Kz7fiSS0b;}$G^@moD7dw@EbS?UhZ|J2*KVpYj>x9 z64D*mta?6i*0TF*kIp+}q%pbd;mwLf z&Tw8LpAQQI8XgTtAqM>kW+z`nZT5O(i-l)tJ0PNE3%bg)PHudQt5UnodK0}(_h%k` zk*8tFU>jpl@WTi7OQ@`(>w}tuX3g(U0y_@Zy|6%FzRU=uh zzw|{H8lc?*SehS6&EFO%x51(wsCcYvnI@oFs0H%+c00$6QL`*R@!8E6*J6JNKiZDp z-t*BTinL2Kw{~>$0l#$6248I}=b69O{qh<wS=t3s90XPW*{a&bfRQkjm%7ST za)3*D!m#H#hR$~Jae=Ip*e05%*gZ*1{3Adw z-aLadN*;Va-Op~N0S89XveNOUv(4o#KWyW^9ak3eA%H`?>+0*QH)T#*dDtUFpJi@s z$R|cZFjez1l3-k<^0=Q7ndx`;=+;n6WJelKmm^o!z?akGz$kCknQOYuVWz~w@-E<4 z2cVLUFs$Fqp|U}f_{4#qGP%z*u_}wIc*uoNk#SagjJRaTjk%f@c-nJ^9tAxB9S?Cf z?C%N{xt$$H74>qcSY%)C7T8GI1` zeQlWm{blLiJlr;1lkV-|Gwu7WI&!--KHPl~T$2&ux8{Ng!PpP}Zft2YSq$7Mw{D!Q z4<@Z592@q7&_Nu{v1ctL2P(*RvAX}!SVE@mA(c_rr03IT>Gq=?fJ-kYwxo>RbiP*zo%Jz*r>}h(@A}CyU8UTLHgTihuXJhE3ADZ`B_h4 zLjH<;(EGc&)S;T^jDCg!p2!!HFbdVAa(;@SDmQIT^0c}p2074#zV3OLb&N*XbaxMb-)Pwqt#rhUP$J(^J$;&@>qjtq@-P->pdQq-Tf~_I9x;wyL(4Sr_ zpgPE|{~^^;`Nkdd7Sho;_+thsX5@rnre@XeRPK}*gXie)%NgV)q(vf$^h(dpxaXt- z?OynR*wZwTG%dEF>&prp5Y^*>Cxh*qG??%$KiJ5Q3VA82hECyoye2+d(xcd3Rmksh35u@+- z-g)K<+v!{)Qng)=JzSFp!5b>2d#B+O3M77w^GzV6s3L6QDiU5K++U)+FK-tAqX8Ia z@q%}{Ln?<^{2=YkH>CE-!S*hNM}6U^7K}Ru8?@mTaRm}KXRzH z-qBYWmAY`UZ>$`>41b_S ze_O{X?5Z<&x~903FXc&EW85Bz{i!F<12Or2{rfWO>bBr18W>_f4McoCz4P$k#en+xI)=}mD zpK4;U@fx^`25&T!XetLD%{_Ozbyni!M=LBThGR(d2p6@qTyKZPipp*kyUiD-so3J0 z;;7X1(T^l2Jn(xU|Eekf%Bp1rF&s1+^SG_{4b9t$7W3-?M?TuBPih%HKedGaPD9S8 z)|867&tsrK@!3+{j3=(KrZ=SAjI(=!W`F~YTh<~76*+Q6*FZ|kQF~Eu&PnGbvrk-S zT`lrFhYe@nY8v6#um*5MZ<_C@ds$@J%?;Kt`yAYJP%N+yUl@H_(HuCwtQzY3%Q;q( ziydKqG2)lk<9UzeXXOfG>Er&(?Ga~HWO&TL3?2R`WmXCwu`&BuIgln%V)-`+AkTOF zXk*H42L9bc^dlrkV9ZnnZP69*M?Q4BxjhxTJQK9ilitv`wp1GkmERTPQ(A4SR8Dj# zc0;BqELHgliT-!W(GrUBQ>zae2azXygC}P^T^LJX>OuLVsh949FR`$!uDke1d4=$a zZQhpD4P=aM%}_DY`u20qCyCmvMWw+h!%)?kY*k9(;Dkfcm*o2q!MY|Xf||rRKMl`s z_dJCEgJaAHy`eZDR1_mv4e<#s>PPhm1oZ!h z7ecsupr&Tdch_aFOJulO_YB?;NS<(YuqDsew%S@Gz{Gm%t7tZB&UOTRfp#&{EZ#uj z2iJMOX@t}+smmuaM+>9IL73~4U`ocdK+t1gR7X?*U;C|rsd4ycupGz);G!I?_c{=I zI&n_P=0>c|(Uqf(hEkEylLi?wFj3PV`}1e(%B?)`K(xEV)3Sy3mgC{EPpFfn4YXf+ z%a(1%r-?b44RGiW&l=B&Ohd{-t^OgIZ4npRf zhQBiO#nq4TG`^*|c4E#`snXefI^bU=*l5^Rr_4~=f=;Lj{NBE6zwM-S4fE0Oe7brA zQ5`dMas)|*iiLg4PTMGJCIl4~pN&D2rqkaH9wA5(^7x3&Vv+Lt@A@79^M;9ZoJfRX zrifZ^V4Y`msrjGPDQjdCeh^_8SjzHQx5h_UR{5csNSLE(gov=)Z+1>V(41VuF63;g zimZQzEqly;NQ!udl{?j}?pFZ#mgN+W&fZ#%>8KSWkIFA#88y)9N3`-a!4mzWxJob3 zw=ZM*%Q0+1HSmm@g0kVf#4M46Y3KeO%`-yWzhmc<)kxp7BNxsQ zzh#0zD6hS*Us``u-Jg`NrPNPTad-U>H!|e?7**@~QH8os&iBjKpZ!^>IryS>Oq0H` zBW|ig_bV@|l4^|JZSL!MKo!s?vdwfb+~7ozg5UPxQVuj|XZ|lVva%>jF5j_MI45^e zI-K$VYu}XJxg`9ywB>Qjn!dbmo~`ova>>Sb>q5FVs?w`w9AN^A%S7tG#XXkyU4g44fEfTrzK1labZozZ2R|zpsO)sd?95=+ z>UkVN$7?j=-10;F-kHEi$YEj1j_K zO59mWhU$>Iq%Chp+e?ix`+xW}d#dX72-e(CIoWu13l=njI@zBJED}xJwT`Q;&qHa; zu)A#$=Gl{`$_JZ2B)O>jF>1^tXozI^HBGd$=Qd{Xj3%i7gxo@a<}EQQUIHw^B5K-_iw*x?H&_-;6CK?h*jz4!|#53W~s8- zr(f4GW3reD#_wsihL3LE z;}q}SWZfj{_yUmC6XDHUZ05P@zcDOyi_FT3D$71yU&o%2!NXO4Ps+Z45yKEYF7T6r zhU%-~#R_5Tg6AjXmkP%k99gWmvN%QyDy!9s_8ei3n|(e93NZhYc_$6CzL=)q=c|6` zk;*el$PD_+MLcpLme<|l;kUFi@BX$7w(2fS|+&wSO$k;uvZssiw zF;Sj(^&0Y83i_@eaZ^X0ypJ@^xV3V{9j5S;%FC_=$Gq;Px>^Mkm6AT5#Y5FNke(C` zDg+ab`Nd}WwvQY}eKMQ6Djv2R{yhr$x&Mb8T687p?*3~|rk{%g^h|i3kB?^2%;k5Z zhRo#qFeqXnmAJbjKn}4a7THpx4lN?^Mx;TDN=r(piV`p+?3B3eH1YG^?3(_pQMJh! z&J238u|C*tj5S^cVId*kxc+CBN4UEW0AQk?Uf(zzT33~`Zmd%d4PHyKRpklB$XLY# zRG9U?740ZqmK&rgAv~oruL+0G@|wrb0SG^4t0!MvY6bw;OZgmfLFQUfkx}J$U|+xE=qAzi8&18Y8C>%ACOrYV@0>AU-akMr5Yi$rM{eYeb{P zicdJ|XFB5WfL)wG8E(HN?i3y)+deU>V+m_>kZ36J~1j`|Ml^3@*HyV3xkDBORJ%W0{WOtdceR?zrA*C;_=0tofTQ15$Jdfpp zS}Vpo6t|L?LP9Q7-oB{d_IxCGy?`sX_Yq97>(Ypir>BjmgV!LruhCNTcnG-|SPJT* z@2Qq~XI-0_!Tjqs?#$ur(K!>(xwR*O@1UcKhoupPm2VGzG8W7sLjf}4m@#6l=$RXT2a!uG}YD3VqJFJvHd~DHpH`ZhRfDu>zeJ! z3BuKj^`~{&E|4%OBN5nO0vWc*LEeozD@8Qf`?F z-mPN6(YXKUGN7ii1^^RMcGg9hp}bKIi86H==p4G>cXOh;zD|aGV4i zpPo%La=7RwmxvK&dowI7Qc^7XdqN#eOi8iN5~GyIna?+#2buJ$-vfw7|wtAxJ%_RS#8u!4~v_W+PhZ@zP*TpfUALEXbcrf=pDlvko$ z`s5EXGbX0fO=fLyiWh8uB{ThI0_pvEpYF2$%{S*!I} z+u0pBLf=m9KGDtx--pEU1{;TB5`GT+HjePGqwFTvXK{r_Pn>ngLc+EVms8sRn)!>} zLL1}^ux76v1C6KWi()$If8JM_VBd;GPIoo^1SFs}DG&X=Y7zd{b8iS0Q zPL?}-qBfEo_+VTRRP}HUB(jZRLb^xo4dz4e=3z3xJ%E9GchG_tnemj*t$l%wemM+~ z4gowPhaA16He#;f?c{Oh+xDpM6@KVV&z{cywMc`#z-u`5K%EUO{|yjeI>fnbU-2R^ z0pqajd+9F;Y25E$RVQRA7>pJ9MEfXPCHxby5mczpopq^`<-S%y$@yF$^E!=P%{0+c zF@Cs6nC6i_>I~3xxWwtuCIcmKBxc%j#5X<=42*U;0JKvA-6A6FSEDnU#{$VUsxLsh z8RfT9vM^~atFb|eDk;|VKhU#BFOq*H3+0GWurSfhf*Y0{^d#EDn!3eXUFx_yfbm7Q z##t;6TmUX1u}QCWXl|JozX#cEoT~fW-SlyDpsp5HZ122)*(yiSx z(oz(J338Xp=WJXN!aqfiL3%oe_xAOGf`+R6?Njwza-uoQQ9# z-8X|h;mC^AqgU*afVa4KrjN?bpm?t+i-+0~F{QZ3U2A*r?v5`ov3pqkcg>tty`A+( zJ0InajH0k(232`&ZclcEQjC@6NqLX{-^50(zzxQa9$Uf(38osLIW(QDh?-L^3d4ThKUUzW|dC_H{CC5PPkLM4`3 z+X(m=WlD$|hmga`9ql4w(0YCH8VV$$PL9rhbrU7)bOd)=L)|{;OuNyCu#@5!AU~jj zJEBX!7?<1DzcafLP}w_Q>Qo`g`_zzIVrVUL5aeY88DGCN7qnQN!!4G1=%=gbaDo}6 z;XfmHc}Xy8csAm(3vk!FQdcG}6ChWjZhwsoEJiX*X|#yNh|QTOe)rG+3l6vw%AWK} zku^R%IFfUi@1=mu=ID|`4TuY=^_?MlzelQZHeBz9+I&y?chb~S6m*7D&6IwvM`a)U znF2d&Tk+lssqY^A0m^6vqn{Pq0N5)5j?5Zvu*+9-p9`(9Z~I;?L+NrY3%<0DBD$fb z0i9SL;o^RfCz0&hWyk?XqIeroi?f8HZD10i+BzEhBVj5qLCpKSxs0y<5`#mU96%;~ zhdLP-UFA_V3v$Pf@V<$s8jVK37TC%H`jSM0MiuVA=D4x(2Q*5N^8@ zB(&L=<%!A_jqyY_N-xsbm8b$Fm+yE_NN{+-r7gLl#NaxM@?&#I5G-2FM%=7u8KS{D`n5&VH7acp+DBA|?Nu(#hx~^oe^oO^3w>=zc z_aHeTWoMJ2%=#=7INHn*=z;j;; z#Q*1yIrk6;1TbRgtW}O?A!#{hVhP(ZWd&BuyCTUKPhid7NhJ_e)}XkylWBU3r7 z?61p!XeS1weVP@7FJe~Toe6rpioTbYf3_eMH4i}`7Qv|mp#d@H#|K7-qjXp33eHWt zO*#QGZAQQP;8RY2%Y;@#`HbssyPEN>DNzZo+=RCY7OO!01Lf0NMypVaemFF^i7oM$ z=l-{D^Yx(niWfDHu!A!oPuGJGt%sXSvFHf5Rs=_pLU8)EtVb#gz_aoEoB`%bB>uKo z`njDZ)p%+B!E;32SsI%+8M2$ZE3yc0lv%`3`Bg$g_?De9C^0K(3c1?Ot7uBO8}_*A z7}fIeSew`?5!UXFA1{K0o$YOxz->OIo2_+_$Nbm*Hci0S`yk3U*&^s%o<)EXYi&9@ z_SRx$L&BRLhg*i0FWzs@ID?txm`${uvYk1O9~VM7Wo&~Rlu~A8N_b8Sp7u{hOn+OA z?0^5+x!fm>@<@_hg9vIjcd^xyU2`Z-^!akOV-eW$-IfY1V^6BI$#hXYZad@0(gbrr zZPj0+^-iVwGr#y@k^~NH!+fM8Y$W>teW{v_JHPoS+nfG=jQ_rO>&Qw5qfc6j%>(kR z@coikZQ2YVbly!$CeZ?r)uF%I1y$d3@xJHU&3zaAP#D^E^Mx$}rJp+4Ne#<@P&QH*7%BnR6kwl~%V zLo&qRH--G6A@|XHBB!_Ta)2h)c_-x@bgSPK$uSTaj%=~uyN?0Y94Ov%?ljvD+~2tmq$K>A_Wpht zs6&-NuXeL6`CYC8T@h0UI&MZU`4PK*_s+YW9{3*rU}@24w-m?BH@5hC$SrKUGP=Uj z5SlfNxuXlGbxaK7*t!&#oMYO}?;zv%S=|e=AF8e;DmM0!EIsOPCpOVdy#v3YA#Ch# za9kYAAzk2OW37gA5z+fsbN8N;QdDTQ1!Q5;hu)(}!h?fR)WEo>MG<|cOUe2pJ^`EK z0+Rqq64)PigejV4ZB}!$tC9d5Uw$5@2;*VARtm-fx~Yj@Mjo~Sk4>9T441QlYOIfu zqnj)&<~?b|>a>d#cEX6obg3w?t67Cjc}n)i{oL&O-Ib zSFYa>NpP|7mFUch_KxVc`off`g`X|WdI^Kt6RE1b-*s{ZSjwDY#PDofX`)f6h~D(? zHa)im+K)@an=sxoss`pqfOk@9?Jb)cSbD;3X`A>X%|C5Ru_+OudSbVND8vcM#h0R# zii+=Rh0owWcmw05|1L!Sb9d`O4pnaTU)~n2Rs9e~t?csOoNg0VMPI;=7CEfn;!-7GtYl+7fOaFkHD`2D_ zxDSFHUYqggTi)~${tNm_0T0qs?%gX(Gm`MNH|J)b7!**=y2t%RZDC6Q_E9O}!l%k4 zv$r>n7lN&bjOsUw=kr=@dpoyDBpE@T7XO36oZz9I#FW=@%;%QdWvLE*IEVaTvSfH@ zXBoWf4^PMP{0@k>P3!9a)K?iJAPg6y_1_P>7}wgAyhfeDH6?O(D}#?G$*u7BS(}0Kx{*nmlr0pg1(Y@ z6{ti9-yRJ4d<{PEK;mSzKL^^ErKmdP*FO!C?>16nXzVDT7i?__wf8%Oo*~vb@GiLY zyt&?pHAdN}{-c8ZYDWLTK%n)r%R{qP%E9yljC^v|H&oYGS9u@LFcYLj8zWIRHddc0 z6Vqx-^f&bP4h|?k@PK`jl9vg3Ccf6~cU0hD`I7i?&S+1wfQXYm$FH_S8jxS8`jFfvQ$z~z#_kmmFU$2I0 zYuZkq$cOD`yWyW;)*~pTtpr_FlMs&ZlJKEbmaqtttQmWNZ(N+rply=GM+mK+&7UAC z6{EAm(n8sYs?gd+S*6p3b(qt1zD#y4(jM@=eV*4Pdj#c>Kk&*~#OAt{Zc#oe!)&4< zy6S|~v)z`MFC3Q>qBzR2K6Xm^bh;+U9Og_$GSz&|;SgMjP)JFti9Y<%^z}@?MeWJs zz5~D!@(0niTc*q=LgS)5r8@0S2)TM>3tyyFxdb=iGxs8td zVaNCtp|~ zZEi+k`ahlhr@))vF~X2RqBKC98Uo-Ts}?i;ISp2u#)@Ls*gZ2JIjTiR=KEL#*d75I8x_MnD^;6K%M*07v>fHmGe&6{2jZjG={|fFI1sC!Nhx_ zyX@wpxJP-WN&1oF@%4RQpi=K}CUAK;LoBk($1&HDTq|4Kn~A3FIcdg_WeI*SoR1Dv z;>8Vwo|~d`G`jsnAZu{(7YjmWbwXfQ zFy!wtn?0hSZAU9lA(UlaY0;S04Cyx^@AUN-xVlQkAO!dzi#^PP|M?88<7qUNF$b)7S#bf9qjGL03j@eQJ3vDBqg3`HRd0LkZeZYXbg5q4PCW}b6gTWUy$8C(c3t5Ei zW6vA(0jJj7%+gdW`h3H+YDR5KF7!LOOODw?(&$ zWRVvS*^Ue;xqgX93M_Z~Ty__WIOi&y@#B3&xr9IW9Ul!(_75$8BLYSdJ5${CAY5>O zvb7J;T4sCHnwV`+z1qB{1riejOJ+Q|qmKDRgid%^TT)XjCf4^P?w@y5Z991jkJE5h z*8W8QepnA89NcwL>t`5;OiCzj_#>wT6p^0NLEBy*Jb0GaKCX~`E&TaBi=q>?fvkmK8J$l(dOf(xCZn%V*;vKHUN_M zOSTOA`!G*jt-v$RyY9fY{2&pO_nlTf{vZv^VMzc(i@dX3!ypaWZdM)2yWnZGBIAPz z_x#kp8XxMU>-qVu&yS(qCPO)H%Pvzgc0QL?dId2{?Ba{#%pa?e&69y!viq#yo#xf0 z-~C=|ymRTS)4yWZO&0WVr_~n;m@#>`b;%3lP_XhlyKyqGsCXjk=H5+|F42gx_D0+I z=6oDEB2EWlZCh|EElZ0~az|*WtI%?)D}sx4#&6Rb}X%{-7($hw&BIk_0RY8@h_&;?W9D}P&4w$#P| zgvb4(287hto@`+_zNeXHMnVa}mCS|jBXTEp5F797nW3EpaC^XQnF84dp}ssG&;Dfr z$P4@c`^bC^ym(31iBPSC%o1KzEC5J=ZJa%7=m?_6~6{gC&2+zsJ`b-hCm`p{L^9Y2&cx|X_I*EFVz zZt2p7nk|hH#)rOwElB0>KTA~iiOAc}tv{RoU6seA=Up{S%UNhXy8m0hUDifOvc?Qq zAozoaw9yHFFqhAbZ7SvzWfLM#KVm<>2Ii z5x=MPdWQ#brNDi1LymoMJN>b<(rM;J-dT<(toUjCn^ooHTUQTuXhw(6|62!`nVn zkZS#wfeNO7-3a>yjt5H5tHpBSu3YLIadMlgcm(Wn-CmvwhcL9om{?BNC|0%Nbm%|z zp^%61X!oHKL-Inb_2Y{Lh_~1P$( z4l!J~8CLSV#}8HVOW9cF z_6}5G{KFqEL>ICUz_Y)lnCn#!INfn3ZqTix5b!!x5Q=5xd>g0Y1(UlapsJ%0bt&-q zw>y+Ng6E*LMb&c?q?S<9yZGEX(YSDIk}@6-oca@QDMd;6{{o1;b43D%FFWS)B{*`c z7e6v5>8@@~zD2K7VO=`v4T;T(Uj(4UnQ$$ngxo zVN3kQSqGeQ%M~Z0c?NKH6{T7g+(UdP49y+ZPaJuE0>B2IYYzP+zZD9?oXC5I7(&(D znG;kC2jb}vzlk+PqK)p}gNhF8vJdow-PPQI2Vn(QfO?_Ld+aXuC``G(=g-{o6UtX( zR;Lre;&+d}cAETbCqL{qz^UpMN&+e*DrwL;|8m&hwIVDc&`;@Mr8&NN!-BP2V)gC; z^f*$EOorjnwq8d-vPw4wfj#G151#m8)krCSSxzhgU|bMhvv=n|6!u|{l}76UyyLoj z#>ypxns4$5xq18=OwG-93(}pt%3MCR96B(^ZMrMLVSkwH*xLGj!1_Ddy=pOik{gWn z^BYj7P@|k5Hy?c?N?>PN2j(wdmKz$NVIzoaLesV;KIh3V#u_Wr)`Ghx=#gdS2xPv` zHSHmeRFz{#x&DHL9QRZW`bRQR?3cnK-^i5PcaYiQmW^HK`W4lNi=pT&(8NIDUh-6K zVL9SdmNv@8##3#)f{RaZXuY_@d23|2AvO4k?{&hHoD#Zz!om4l=qZod(M8Nue(e`% zkTq4otp+{`fytbYtZ{nAG>1@j*4%2mS)fQw%F=>h$34NJUobn*&bj?b+x_)UToyy_ zqc-!U#vhQ6c2C9ecJ|m7d5ELjr>NqMo6{r$le>O4BKS{6Q0?Vy!rab@Mcf7%>fbn2 z;?1P{~Ew=?skIGe~G%fuJho=*AY!*WvA0V63!hGR(}W0MJ6x0SSGr zi7?FcPN>{Xh;(tXuQaGSm46z{Y>+U32RyFeEtc?n9hd2{fTazlmvkpK<%+)B^QlM_ zRHp|VUa*oB(~8;6(spz(-I9nlEwf}Hk&Wgx3@n2$&uN_0`E*<|g>(@?i67YfAOSh1 zB4JakO1a#14Ap%e;lDCZ?V;#s7TX!8wo!My8=|wq2o*+P-H$cYh0XYWa?&+)2Qt`Y zB(&|!fBe$5Cp!S%OXAWf7fTg&ON||?`aZ12gOzfFRp;FmA-C#7-xG@w_@`5fk>(k1 zi$YJBEV7N>{I$Hd!DSX5q--e2%$55FeP{dz5H;L6U-(e`SS-7xd00t`&>-)cpSAx% zeGEoefU3qPVvwe4bwfVHFK1+{dkfG!EZt-ZVEvY(C=ND8{OE%wZVm6QU+&zt1SYYg z?~yZtiD$OB^p8&}(EA|!)S;{OTnCy%^A$&yWlQk$SA!eYsAUqz0r4(Q6CS%)8}}}x zp{Kjb&R_*%3qlinr+`Il32e&Sv&|LkLmf+Bv||Lsd-c*bcps&IZsr^w+CP!8HRq)U z%x+X5NDkb@?Dq5VZ}f2+iXiqQH|N4ZNmj#!NqCLOF^}=d$sNLUTKy=;nwI^ym||zN z{f<)5aG2$}=cZ>T1`5Wu^*CV#!|7aT9y-AgXusp)921*Tb}w`r=sABS7#L6Q9}wYn z>sa&T(wQ@2^4WZVjciJYh@OeBA~IT2QixO3A&bT72B6A^ddzic(FdWEfbCExX?T$*f_ zuk#KXZN24|U`0Ko66Dl;aDy#TB`G_^q63k`Ior-mJAUh?ysZ5#U`ZIW5JB%z8Y;W& z3T)o#57w}<9%YL4njA22Vv2}8yB-(vYNVAjZY!~V4Aqac_Zb#b|4&NvkMJHb2TLyU zsl^&3EmA!FCAXeS(4L>VYxqgI=7fzjB0-_(O2+ez*K!W!;E$g~=i{It)_KNKZ-tO{ z_UOa){2iBY!R1@0_v?67B>id9BKwosCh*{+2>jrK&)0EL6F8lei!69hpntcoRxQ8J z#f;PEUtRIIxiU?^c9P-88?66)TuB^y*W|ByavXnE+@q2oG7i&&gZx7)R?FXO8Un#3 zo~Y0K@!;gQ+&$EF2w0kngWh0B}r9Gp9KFy_xZ+$k(y}QEZsvTH{UsGwLJ`IH&1MXU7zFp7;4l`HX6y`lfGA zwv5GpkjLdG%vtdZNScA(qifBvdf7g z7srJ}wo}9TBgC9}*4*qV^d@0{esahJUJcX6Z8jHAN<%^{95`LpuLik_{uCQQPGPLn zbgn1;RN_55`eGncp`&CG@@>c`2B+-tBf5bLg3gFWI0TR)1*UI}w-41f!Z78)3Z6gw z<8Py?0k05@5yoU;2zBm9S|mx`o4PV-p|N!}Jct9Md2p-E?^(!Ku4^ttc}zjOSnx}b zvX5vB-ki|v4)9Tv9;!SsB-UE7fDHGSg88$7$?r#rc0?QY*0QQEGB+1;mS=LI!q$67 znvW=c;F)l?DY`m9j&=#?iD(91a0b~Zi(8;~9TUQ#w_Dw&olm=PRlOc@0KIEuuhDy*KVY{#IJz6m(LUbw!B!XZPdg%%fXB@4H z(s`=YjdIh4R;v;@XwOycZxz^;OE}`u0}wM0^pl5Ly5}EVi9K+%J{-r7RQV zyox>O^DNlZOmrU!s~NPiTlsHV=5`yD;J7(%wsah`)cObeDMGFCqn71vyt9W>GxoNC z-^Q!VFeQieIH?oS0z-c4M*}MBzTB-ll}3%xXMUxG8>pJK2;O$L505w)>(lW1F+Kb6*e{NSyLS!Rip$>-~G2@uB8@b&wi5^vbM{Z8m}O#P+4wKMwuy7-*u z)L&(F{T6kGr004CG>)_AzdYxF75>}COXooDoiP!?JQu|#wTn~KH}1PM@@r7mZU=Yk zJ)n3%z_wG9UXYC8AAWoMwNtPEqa^&i0>zOLS^>oOTHM>qW9HJ_6umQWVEQa{TA&l7 z%^Z)PGwx-a>hBM5&7ngSe} zYyb)50-d0TWNVq=1165{sK)lCc6CMl`P^FCYJl&(^PBTIxbGA3)BLPLslTbkcRtY7 zceTHxRY68KUE>*=zFCzoVMMESS`#K_BdDxFoh5-WwzoS8%reB1|@fsqOPWfW#h!vP3+2 z)m(8v+-F@(1r1c5M)fwjt5sNzh#o1LMX4@JcGSEcZ@tn~6B{<3I;X``i?nx$a$xMO z`W**A#jj?dgWHK?fEIhD-C>Wj#W5#f$3Eo^Tnf?`TdCQMet=`YUX$+gW%o&Tl$NV9 z_tWU{vU+_lN!;)m(Q#`==HZh;`1)q6$>LRom+&X3V*z^R{2%eY?J)`&KTWX19bd-!kLn8mw3x^$9vrOd*&WUv^hOq0WgHUnvhU!oTY6OEq3$HX z^aWdt_Y%wFF%_IiKn-%SaQIu#Z$&2EChNc$ z;FrdS54@SPnevsQ(at@zwQJXzE;e?!8e&`Z zGHkKDC#te{Fzxwl8<9ZwcM554hx@xPfZVQ|2n{8 zEoRBF+wN-5K?$k_+jTMuZhe10J`b-+n;zCfT#3->jD&bBOU>l`rR?k{m7vpue(L&t zt*=F`SCB%WihuijEe(cAAA1D1K(2hFNwOWww}*IEP1xG??NnRODOg{gKXai{5q3@1 z&+>zR?a~jzo;qqo0lQ~eohur-ZZU3B)zS_6H#4G!TGX=-%(?*hUrV;;QOS}o{24dLE+4@d!d`GF0DJpF_{wm}1mi{9oW~%2*~?rH z17?$Z&fHPwj8RP>!_rfrMd#{JgC>F$||tG4TV3{MRjEXnJ$Nv6C1Kw!At z05gRlsn`~83w{tX{YY%BT<|usYMaZM1Y8F+^}s%`fm4*ut}Ruj_*{#Dd%)_xzSVHm zzJ#k(+8!-ECKNNAT(cb4<5$6771|s4tlBwn^J7)K>q^T5sNy-sQgg@7CsU1HC4wkl zd<>m9(&Rf!>CJh94`nR{B8TQ3Y`%#p)dY7Y?gY&jnFZe{J-)oJ9^z$6CVSKIRH>kM zU^~yDRrWo(eSykU#KfkUOWVb?f;vSw?JxVI<=O0w$5Z=+FG{v^m0wW7JLBnV?>Be< zoUyb2uTiN~%LUI(T=fC4rr|a&sSKVYhniP)_GDcHxvWr*c_lt=7)A4yNBm0SGOCxz zZ`vif)(XZuXKH=rb*ELEfWtb2W^@fSPJoE{HPYxQNeatk4_*6*Nj+aePsGB!C*Oi? zX&=tiMbu&8J6$MYpUoT1TMsUuHoNjMbESH`% zU^Dw$xRP!b-TG~RrMxOrp?g=g`3tUt%KdRsV=F3;`cPkV(gGXd;(%~DJuxCEtK;B|Z+h=kCBGLr8l&R_4$1Cn6C=ttk=ZGW= zrgjBzT7cwp3+MxEK$e$FmxOlD4(ee6k~}kIcAcL;x;X$~b*}aUltyWX;yv9iGoRjk zcSNg+**3tEngwcRQwILZ({*8!iPe_F#a6tba){@m*vZ&kDS1K~;?Q#F`i|xL=_-Lf^jO21Acy zI<8)-@?$^m?C5duILDv2n6-YdWvKn0adr8yO7NsFGs?d_`(SS}hEL=pdahu$fm%6K z|MM7RD6Hm98yOuXclf0c5^i+p!MD2&pIF3(6y?d8Lvmo#x2S5jb{F-Ezfc^%KOW&5 zYD}+Ok8qUMNLVG$MZWiWI3BcI%@=Zj^lZ&)Z>3}(0aP6uC7GU9^X@EKt*9krUj>Kl4WP_BLm=_D#6QM`g!f+AUb{+*ePhteFNUl8&C)4vB<~{!AEk zz3yk9?Xlh!@yBX|DZgzRr>EWhrzKLBwlhyDkKY>vn|Z%h!V^apms{`b&}7?$n^!wu z+3Se>FJy4{0|BmJc#w~gQsNg9(kzLWh^GPn(0Dj(0`M=dA!Tf?+BAF~IQiI#_(A4Y zV8$Odvc58syJ%*rpDr1+eh8bJ%0);?%Mzxwr8aN|!8#2>u-Xp`wOToNV)y zUUBeqG2Io-Gq};*`z^G`)wj??vx(B$@fL46$8LAdZjKx>InL9BL*PE^g@sHZ_VXsY zoH0p^3lq6@z(;*)R*kic2KW;>!1?2hKj;bUQMBqk7tW2iSItwt$Wj&E+O{B`=Qz31 zr6TrZH?Iy_q=2h54h--_5W00LYB+zY-JJ2v&tZPD=;Mz2Al6T3ywvyU2-HccYP+v7 zdkxkY%lIU=koEova5`~aV1Gh-^NjrVN;Uhhj)D`As=s}p!%^F5++p8P)YS(A;E;i$ z9d3N>>`Wlkg&BuOZs&b5sH?bp6xr`%-PZ9e_du(k0t)tLv@~U8t; zz7CY@V$^a=%u-`nWT)hqR+p>RKTK_Lqffi9H|}@Gr<0E5`>8-n)?OQYta(^7r7T__LTi}+{r8c zdS)l00iOT5CF|-oq1+FP=tuID$CcD#`o`)8*n|v$w>ShQ)k6-@Ky_*87Z2(ii zH=y5eG$mg`bm`Q?q`Mfd=NE|a*K9!Y1zbT&a_TCU0kh=r_mRuciBfa>{RxZkeNeD- zas#>e_`P5?XHS7ceJ2vT_iLmuCcwwALz+ygc_2s!4$rOYvoJR4LEC8cQvT+N)G0H- zZ|^FHRp31z@y&cMcc`O-oOH%?Yb2*e7i3IkCL4o`W6%DH-4!61GXu%XBtfk1nD1U) z=gAzBf0tTUp&ymHwmZJ9!(Z<7+&jM5{?AEMyQlZb%?K8UXt}c~T3r=*$??1VN@&Wa zwE&=0v@kPd{t#old5lnbvr!Y!L$CmBhZM09SE8thofXt|QOR=;ln%y+Jw^a1fQJuv zX}!MvcJiwyX*OMFqmBhql_P zb!{N|tHaWEdI4G~wyVik+AGHsR5XsdW5*k`UY)_7$!==h(yfB~`AHw=c1F>7B=q1Qrwt(S zc@dylYFeZ6lV^7#ziv$4sk9M2-!4d%I%+D8Kbf|}GR*}^k-GyaZ4-rFuHOIa-hPc|3`3Z^XU!f^H^7;YN-!w!V@N09}_V6f8 z1}wp8ESjpsfaJ+I@++GM83~zI=zAejEKaB1T zcCtCyD~hymcpu^gVLL8D-jqaUDiC$mP%ZreD%*`{J+QTxtb7ghg+k2FD(*KGzEjT2 z$KF5*P*+>9Vg$7w;014O3j}C;6$`S8GQb=uHzbhHCnMOGrfTvw$Ngza`p;~=+S#qX z^pFaVaVYwS26O%V0&wuX7eU@~KXW6<^EWJXt|z^d5me8F9ww29A?SgDCO-+^u9YoD zcg0-Wt`@TLCn4C-=}XNZgA1kPlCGY7Q{;yAX8-%um zPcX94oeo?IfGYJU*U-x6#Q@Us?^4-vCJpdieNB4&%+g&^+^)@wmHXaPdMk9%+^oifsp7J^xB5<9ah?~y_v6rlbsv7cMp=_?`Fc0&2|KNPF!?;7 zePtpb%WvTcI?6~TI^i~6&)WOm_|Bevl{P&dst=BTlH>Ug4m?qx5J<7i9LdR}r6a_U z0iv?raS?0UhyyCNb&me!K3_iqWG#&#VdXy$6SUvfL#r9O0GvTqmje@=wG1WA8E0tr(&C` zT7dTl`!Mm_ULNH%gvYAjIu^IrTr0d>s7KiELTD^ieOdm@_5)zTJGwMx;S$o3Pv4}Ke)ikH9VM)v*YdR$c29f zJ0|KHJUKVi&-4zz7j?i~P-(35FUm(O84ouVS^^$#JMKIu-xr-wj*%#JE%ExRcY2!Z zj$_+Q=VTTKv9k0PXiO$_C{0iT1ySlUtUtms(dc9A5o8 z?t4B+(<*22r%{!|2BX34`KGdbNZiTt4V(&_YwF=neWL+-r-;#}ZC$vqQeU5rT7Oi} zoW>zqj8NlO{B3o81Hbol@VN)M)ZsntSu_t~o92`VEKO7~m_|PSW-oy}MBDC^n^=cP zA431)cgyO%aj90%?~47KtERNDJET3~+Gz3g-{fg7IrA_yRnog|r^xCofC14hY7E)rH^r~TG=FK&#QbO~%JPkBvhP-IN~ z=AlS9(PBeU_?j%Jy*p|9SN0Zjef87PYQ9_gse-Q_%7t@NB-S537)jJkq+S5ey*3$> zc>rcXuicB6sSIlO_C1a zkLRb+%r_z3vu z;6?g10z}2ro=xNKVpVz|u~I_&HS%C_D6}maFsl}tIAFK=!+~KC$R5T&&}7N{^%J03 zYVYhE^yKUXH)77_o4Fm130cE5x29J|B;TiV`&`39W67Z%1IXT)Vkfg$n8R01WMW$W z0;tCF2ta+G_B|l#CE{<&3fDST@TC3ONQ|LP5n`rQ&gIcl!kwqE&r#!wV`T2L8b%tJ zud2F>z|kGC!|X}i8F7E>6j7NF@twZay@VFVUvClTMy&sv&fzO3qid5j=KKzCX2c!_ zWR$-*^Lo15$F}wn*5V`a8fI7C;~s&d2`6x^Q^W`8coe3v1&7W6xOKG<5gHKMq&fBE47?@G22 zWuB0=3bUKp-q22`P_evb!`^&Ek+DbhqWeW{+%Wt=lDcc^ZUbvX?r!nn{Nq4IUqhEK zC@>mr4z#N9$toSUELg#F(H)1ds#QQ`SDEmqpY69*I4N_7F}Bl!hr!8})u>yd za!mv11$RjQ_%?2`z=57V`oD3ef94D+K(AnbV}Ll~k(^qrtyK}sHf2WS`C_Dr>Vp3W zyDp{L=7n4hX?B9vl3C-e~r0X$^X7EWCE>G_t~|{7>bA&KUME z`=<$64OdoJO!Sr*eSa1c9UD<64c^zm&K++t$cYtT)Ll#RBVEAZ;pbZG$>UhEu8!9$ zSjl;V;6lXq?U+Chf{2E(z&(iMbEq@O=*11tLty%F z3zxkn5{9(M-Mw8l&X&rvP}-)icEC1rrY(B~ZtQdBbElgjk(j9&v4ERvXA3iqQ;8Hj zY7bQj1g2sV7SA2@Hlizg3h;|vJy;Hxd6=uVv|%N%vD4ft5#uxqx6v#=>q)M8?+T3kH0wioSOI!s4uHin;XjiXnK zSb0{CjGBm$RhX!y@2g4rC7rJpcRb1ECKN4joe#N5o52VD{vl;r^YyTm9KDrCgG-|Khu`B)+Ta^Zd;2 zlAtdzwMOm#v`NYbOzBOez(<4YkV~C zehoGcD`=MLdYk7IL=W8elTg||zJ4Uv3&OZ)-cswm@w$L&@R4NzvEc2d@9+hAHB{{Q z<}WCBd-u4f&$_Vo(r0Sc(Jzmb!{daf8>U4WI;&zv@zMrZ%m2qbm^o+V=`!@ zTQNmgDR8Yi%5P0#C-cvG;7gq zP9HuUvf5(jocj0r45yV!8)&coK@Mfb?~xpL2%y0}7cKWOiVPEx~H z4tW)ojT@ghq^gizPKKA&3}s7X>A*`q<5G?$cA%#^>`6yMF9M(?q5K@qlIzkJ3H#n> zKl&c-?_4J>7pR^p~O%?mIvUMGEr$B^JTX4wsh6bECmvP$Ae&?LJFoLO5 zXd(tMM=I{kOeDX!w2~K~pCbh#_6u0wq*bGH{NJy~1k>IwII6{}A1}TtXtvyy!_fC9 zUQ0&)1vCAC_uu{guG6`Z8{^wKPeVf7XwM)o^q-J)KbVgsSO;z0 zOcq?pSBNqpK4V`dX<8(Q0BUBj4tJ`+aAQHoSAy4H?8PNA-n)49ds{iqpBvCiYzv)H zKiu;wTWK7*R+Of4DkQ~gL#X;<8f2@O^Lz#B-J0E!AlG?VfJYz3zA5n98Ws;|Y3-Hn zr%J5rv9G4U?V>tsWV{O$HTI9X*7%_-nFa@K@~Mb3R|>fYz-V&Ofq#gnX|+*^3}{LV zOc=j&yb@P#cDp<{=U$)VSj`7UgI{BA$aJ4JBMGvxUm4Yr<~Iv$_Fgm?Hbra(&0rOW z)A!Zl6gI7IEj{#UgZx{28PsqUsM`gZ70-P4q;%S&h3l(Nz1yLG4g^8QUQY2w0*T9ZeS7nKR~=oVd04W%)5UG@tVohrijN8@&OOzRI}>E z0{4upS%CNta#5*kiCLq3wn{IXCwrZ=KZt2R_fCy#H1>Cx$@ZXZ&1m@ikk_F6VdcOc zTE?Oe<1cl*8(Eu9PLgv9`!^RGiHM9z_ekTc6Jb-w=msY;t0 z^Yr7yei_W)0t@k%Va^r_<3>O&w$j~`A0MwD7hVRDRonL(>(T`p3idj|>(#X~u#RDFN({d!bF1cVB5p6fw!urJmr8wqr|N%`mk~Es9Akw8sF4^dmP7Dsm4dDX%=ORomD@%g%)WkCt(( z4cT`n7BKFZi5Kjdz0N6%Lui!gyExt{)gf3W()Grl@T)}u|CF=B#d7j+w{O(g1Ri#pL_N_IBR=z+&RsyTDt8=&-q6ho22EmZa z&JLrkr$K`yF9&}y8K;pL7(@2L2PWdCv4jSH*Uckh?u6T|gVF#nWkjqGr z__pV0vEw;znhnJ8_v1eGjP{jp7$Z`7Zkqbyof8i1U`zOVS$*F?hukCR-QAVLm$u_U zC?iIwNOXiaNPKc`Q{WJz;A2W--{1ug(EM8jrjYLb0>kIikl#MJLfqQ%8HgVvO4u`rneb$s64y1=D6KlS(gq6%M#eugn>5hsR=Qo zhL_RkoAPQ&*^OAdeiIj*pXz@xBd3JO${y3(ANFeEbsJ)4z zbr=Eq!}r9_-Y3MhJi_#ViNtk?*z^iihk=Po zd1U|;8ZCHl^G;;2YKg*E_7=@56Afm=v?0^#n?dAgm-HXO>Je>3)xPcz!s-iw^2-v; zL}+Qn^=;M)dJt>h{RxOPXb(~;EbyZt>3^=R`~W+EBl3~=WJ}>$#Z-^V3!~c;CMN<{ zneP*;ftmt%BBDCytR%-w@zJjm0jG=PIgod*ny~Ti1Jkalag=g%7Xe;#egllk_yLel6hxV0z3$VzQI~|Cz!@P zIR+q!GfJhyj+>r1XRy<&g%8kSmv3iNrC$V$MTeV&Z*x7$1w3wTakT`-_8C~nZXCj^ z=GpD363EBZnj%7jL?i#rI|z?;0{7qeN(I^Wf%SGh=Ibj1*6Ef%0ACMA2)B-ccu&o9 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 literal 0 HcmV?d00001 diff --git a/Sources/ForceSimulation/ForceSimulation.docc/Resources/SimulationDiagram.svg b/Sources/ForceSimulation/ForceSimulation.docc/Resources/SimulationDiagram.svg new file mode 100644 index 0000000..39e6c2e --- /dev/null +++ b/Sources/ForceSimulation/ForceSimulation.docc/Resources/SimulationDiagram.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/Sources/ForceSimulation/Forces/CenterForce.swift b/Sources/ForceSimulation/Forces/CenterForce.swift new file mode 100644 index 0000000..a2aa165 --- /dev/null +++ b/Sources/ForceSimulation/Forces/CenterForce.swift @@ -0,0 +1,51 @@ +extension Kinetics { + /// A force that drives nodes towards the center. + /// + /// Center force is relatively fast, the complexity is `O(n)`, + /// where `n` is the number of nodes. + /// See [Collide Force - D3](https://d3js.org/d3-force/collide). + public struct CenterForce: ForceProtocol { + + // @usableFromInline var kinetics: Kinetics! = nil + + @inlinable + public func apply() { + fatalError() + } + + @inlinable + public func apply(to kinetics: inout Kinetics) { + var meanPosition = Vector.zero + let positionBufferPointer = kinetics.position.mutablePointer + for i in 0..: KDTreeDelegate +where Vector: SimulatableVector { + + @usableFromInline + var radiusBufferPointer: UnsafeMutablePointer + + public var maxNodeRadius: Vector.Scalar = .zero + + @inlinable + public mutating func didAddNode(_ node: Int, at position: Vector) { + let p = radiusBufferPointer[node] + maxNodeRadius = max(maxNodeRadius, consume p) + } + + @inlinable + public mutating func didRemoveNode(_ node: Int, at position: Vector) { + if radiusBufferPointer[node] >= maxNodeRadius { + // 🤯 for Collide force, set to 0 is fine + // Otherwise you need to traverse the delegate again + maxNodeRadius = 0 + } + } + + @inlinable + public func spawn() -> MaxRadiusNDTreeDelegate { + return Self(radiusBufferPointer: radiusBufferPointer) + } + + @inlinable + init(maxNodeRadius: Vector.Scalar = 0, radiusBufferPointer: UnsafeMutablePointer) + { + self.maxNodeRadius = maxNodeRadius + self.radiusBufferPointer = radiusBufferPointer + } +} + +extension Kinetics { + + public typealias CollideRadius = AttributeDescriptor + + /// A force that prevents nodes from overlapping. + /// + /// This is a very expensive force, the complexity is `O(n log(n))`, + /// where `n` is the number of nodes. + /// See [Collide Force - D3](https://d3js.org/d3-force/collide). + public struct CollideForce: ForceProtocol { + + // @usableFromInline + // var kinetics: Kinetics! = nil + + public var radius: CollideRadius + + public let iterationsPerTick: UInt + public var strength: Vector.Scalar + + @inlinable + public init( + radius: CollideRadius, + strength: Vector.Scalar = 1.0, + iterationsPerTick: UInt = 1 + ) { + self.radius = radius + self.iterationsPerTick = iterationsPerTick + self.strength = strength + } + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics) { + // self.kinetics = kinetics + self.calculatedRadius = self.radius.calculateUnsafe(for: kinetics.validCount) + self.tree = .allocate(capacity: 1) + self.tree.initialize( + to: + BufferedKDTree( + rootBox: .init( + p0: .init(repeating: 0), + p1: .init(repeating: 1) + ), + nodeCapacity: kinetics.validCount, + rootDelegate: .init( + radiusBufferPointer: self.calculatedRadius.mutablePointer) + ) + ) + } + + @usableFromInline + var calculatedRadius: UnsafeArray! = nil + + @usableFromInline + internal var tree: + UnsafeMutablePointer>>! = nil + + @inlinable + public func apply() { + fatalError() + // assert(self.kinetics != nil, "Kinetics not bound to force") + + // let strength = self.strength + // let calculatedRadius = self.calculatedRadius!.mutablePointer + // let positionBufferPointer = kinetics.position.mutablePointer + // let velocityBufferPointer = kinetics.velocity.mutablePointer + + // let tree = self.tree! + + // for _ in 0...cover(of: self.kinetics.position) + + // tree.pointee.reset( + // rootBox: coveringBox, + // rootDelegate: .init(radiusBufferPointer: calculatedRadius) + // ) + // assert(tree.pointee.validCount == 1) + + // for p in kinetics.range { + // tree.pointee.add(nodeIndex: p, at: positionBufferPointer[p]) + // } + + // for i in kinetics.range { + // let iOriginalPosition = positionBufferPointer[i] + // let iOriginalVelocity = velocityBufferPointer[i] + // let iR = calculatedRadius[i] + // let iR2 = iR * iR + // let iPosition = iOriginalPosition + iOriginalVelocity + // let random = kinetics.randomGenerator + + // tree.pointee.visit { t in + + // let maxRadiusOfQuad = t.delegate.maxNodeRadius + // let deltaR = maxRadiusOfQuad + iR + + // if var jNode = t.nodeIndices { + // while true { + // let j = jNode.index + // // print("\(i)<=>\(j)") + // // is leaf, make sure every collision happens once. + // if j > i { + + // let jR = calculatedRadius[j] + // let jOriginalPosition = positionBufferPointer[j] + // let jOriginalVelocity = velocityBufferPointer[j] + // var deltaPosition = + // iPosition - (jOriginalPosition + jOriginalVelocity) + // let l = (deltaPosition).lengthSquared() + + // let deltaR = iR + jR + // if l < deltaR * deltaR { + + // var l = /*simd_length*/ (deltaPosition.jiggled(by: random)) + // .length() + // l = (deltaR - l) / l * strength + + // let jR2 = jR * jR + + // let k = jR2 / (iR2 + jR2) + + // deltaPosition *= l + + // velocityBufferPointer[i] += deltaPosition * k + // velocityBufferPointer[j] -= deltaPosition * (1 - k) + // } + // } + // if jNode.next == nil { + // break + // } else { + // jNode = jNode.next!.pointee + // } + // } + // return false + // } + + // // TODO: SIMD mask + + // // for laneIndex in t.box.p0.indices { + // // let _v = t.box.p0[laneIndex] + // // if _v > iPosition[laneIndex] + deltaR /* True if no overlap */ { + // // return false + // // } + // // } + + // // for laneIndex in t.box.p1.indices { + // // let _v = t.box.p1[laneIndex] + // // if _v < iPosition[laneIndex] - deltaR /* True if no overlap */ { + // // return false + // // } + // // } + + // let p0Flag = t.box.p0 .> (iPosition + deltaR) + // let p1Flag = t.box.p1 .< (iPosition - deltaR) + // let flag = p0Flag .| p1Flag + + // for laneIndex in t.box.p0.indices { + // if flag[laneIndex] { + // return false + // } + // // let _v = t.box.p1[laneIndex] + // // if (t.box.p0[laneIndex] > iPosition[laneIndex] + deltaR) + // // || (t.box.p1[laneIndex] < iPosition[laneIndex] + // // - deltaR) /* True if no overlap */ + // // { + // // return false + // // } + // } + // return true + // } + // } + // } + } + + + + @inlinable + public func apply(to kinetics: inout Kinetics) { + + + let strength = self.strength + let calculatedRadius = self.calculatedRadius!.mutablePointer + let positionBufferPointer = kinetics.position.mutablePointer + let velocityBufferPointer = kinetics.velocity.mutablePointer + + let tree = self.tree! + + for _ in 0...cover(of: kinetics.position) + + tree.pointee.reset( + rootBox: coveringBox, + rootDelegate: .init(radiusBufferPointer: calculatedRadius) + ) + assert(tree.pointee.validCount == 1) + + for p in kinetics.range { + tree.pointee.add(nodeIndex: p, at: positionBufferPointer[p]) + } + + for i in kinetics.range { + let iOriginalPosition = positionBufferPointer[i] + let iOriginalVelocity = velocityBufferPointer[i] + let iR = calculatedRadius[i] + let iR2 = iR * iR + let iPosition = iOriginalPosition + iOriginalVelocity + + tree.pointee.visit { t in + + let maxRadiusOfQuad = t.delegate.maxNodeRadius + let deltaR = maxRadiusOfQuad + iR + + if var jNode = t.nodeIndices { + while true { + let j = jNode.index + // print("\(i)<=>\(j)") + // is leaf, make sure every collision happens once. + if j > i { + + let jR = calculatedRadius[j] + let jOriginalPosition = positionBufferPointer[j] + let jOriginalVelocity = velocityBufferPointer[j] + var deltaPosition = + iPosition - (jOriginalPosition + jOriginalVelocity) + let l = (deltaPosition).lengthSquared() + + let deltaR = iR + jR + if l < deltaR * deltaR { + + var l = /*simd_length*/ (deltaPosition.jiggled(by: &kinetics.randomGenerator)) + .length() + l = (deltaR - l) / l * strength + + let jR2 = jR * jR + + let k = jR2 / (iR2 + jR2) + + deltaPosition *= l + + velocityBufferPointer[i] += deltaPosition * k + velocityBufferPointer[j] -= deltaPosition * (1 - k) + } + } + if jNode.next == nil { + break + } else { + jNode = jNode.next!.pointee + } + } + return false + } + + // TODO: SIMD mask + + // for laneIndex in t.box.p0.indices { + // let _v = t.box.p0[laneIndex] + // if _v > iPosition[laneIndex] + deltaR /* True if no overlap */ { + // return false + // } + // } + + // for laneIndex in t.box.p1.indices { + // let _v = t.box.p1[laneIndex] + // if _v < iPosition[laneIndex] - deltaR /* True if no overlap */ { + // return false + // } + // } + + let p0Flag = t.box.p0 .> (iPosition + deltaR) + let p1Flag = t.box.p1 .< (iPosition - deltaR) + let flag = p0Flag .| p1Flag + + for laneIndex in t.box.p0.indices { + if flag[laneIndex] { + return false + } + // let _v = t.box.p1[laneIndex] + // if (t.box.p0[laneIndex] > iPosition[laneIndex] + deltaR) + // || (t.box.p1[laneIndex] < iPosition[laneIndex] + // - deltaR) /* True if no overlap */ + // { + // return false + // } + } + return true + } + } + } + } + + /// Deinitialize the tree and deallocate the memory. + /// Called when `Simulation` is deinitialized. + @inlinable + public func dispose() { + self.tree.dispose() + } + + } +} diff --git a/Sources/ForceSimulation/Forces/CompositedForce.swift b/Sources/ForceSimulation/Forces/CompositedForce.swift new file mode 100644 index 0000000..81f0b5c --- /dev/null +++ b/Sources/ForceSimulation/Forces/CompositedForce.swift @@ -0,0 +1,100 @@ +/// Workaround for yet unsupported packed generic pack types & same type requirements +public struct CompositedForce: ForceProtocol +where + F1: ForceProtocol, F2: ForceProtocol, + Vector: SimulatableVector & L2NormCalculatable, + F1.Vector == Vector, F2.Vector == Vector, F1.Vector == Vector +{ + + @usableFromInline var force1: F1? + @usableFromInline var force2: F2 + + @inlinable + public init(force1: F1? = nil, force2: F2) { + self.force1 = force1 + self.force2 = force2 + } + // @inlinable + // public func apply() { + // self.force1?.apply() + // self.force2.apply() + // } + + @inlinable + public func apply(to kinetics: inout Kinetics) { + self.force1?.apply(to: &kinetics) + self.force2.apply(to: &kinetics) + } + + @inlinable + public func dispose() { + self.force1?.dispose() + self.force2.dispose() + } + + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics) { + self.force1?.bindKinetics(kinetics) + self.force2.bindKinetics(kinetics) + } + + @inlinable + public init(@ForceBuilder _ builder: () -> CompositedForce) { + self = builder() + } +} + +// public typealias CompositedForce2D = CompositedForce, F1, F2> +// where F1: ForceProtocol>, F2: ForceProtocol> + +// public typealias CompositedForce3D = CompositedForce, F1, F2> +// where F1: ForceProtocol>, F2: ForceProtocol> + + +@resultBuilder +public struct ForceBuilder +where Vector: SimulatableVector & L2NormCalculatable { + + public static func buildPartialBlock(first: F) -> F// CompositedForce.EmptyForce, F> + where F: ForceProtocol, Vector: SimulatableVector & L2NormCalculatable { + return first //.init(force2: first) + } + + public static func buildPartialBlock( + accumulated: F1, + next: F2 + ) -> CompositedForce + where + F1: ForceProtocol, F2: ForceProtocol, + Vector: SimulatableVector & L2NormCalculatable, + F1.Vector == Vector, F2.Vector == Vector + { + return CompositedForce(force1: accumulated, force2: next) + } + + public static func buildBlock( + _ force1: F1? = nil, + _ force2: F2 + ) -> CompositedForce + where + F1: ForceProtocol, F2: ForceProtocol, + Vector: SimulatableVector & L2NormCalculatable, + F1.Vector == Vector, F2.Vector == Vector + { + return CompositedForce(force1: force1, force2: force2) + } + + + public static func buildExpression( + _ expression: Descriptor + ) -> Descriptor.ConcreteForce { + expression.createForce() + } + + public static func buildExpression( + _ expression: F + ) -> F { + expression + } +} diff --git a/Sources/ForceSimulation/Forces/EmptyForce.swift b/Sources/ForceSimulation/Forces/EmptyForce.swift new file mode 100644 index 0000000..2dec42a --- /dev/null +++ b/Sources/ForceSimulation/Forces/EmptyForce.swift @@ -0,0 +1,16 @@ +extension Kinetics { + + public struct EmptyForce: ForceProtocol { + @inlinable + public func apply() {} + + @inlinable + public func apply(to kinetics: inout Kinetics) {} + + @inlinable + public func bindKinetics(_ kinetics: Kinetics) {} + + @inlinable + public func dispose() {} + } +} diff --git a/Sources/ForceSimulation/Forces/LinkForce.swift b/Sources/ForceSimulation/Forces/LinkForce.swift new file mode 100644 index 0000000..c757461 --- /dev/null +++ b/Sources/ForceSimulation/Forces/LinkForce.swift @@ -0,0 +1,237 @@ +extension Kinetics { + + public enum LinkStiffness { + case constant(Vector.Scalar) + case varied((EdgeID, LinkLookup) -> Vector.Scalar) + case weightedByDegree(k: (EdgeID, LinkLookup) -> Vector.Scalar) + + @inlinable + func calculate(for link: [EdgeID], in lookup: LinkLookup) -> [Vector.Scalar] { + switch self { + case .constant(let m): + return Array(repeating: m, count: link.count) + case .varied(let f): + return link.map { l in f(l, lookup) } + case .weightedByDegree(let k): + return link.map { l in + k(l, lookup) + / Vector.Scalar( + min( + lookup.count[l.source, default: 0], + lookup.count[l.target, default: 0] + ) + ) + } + } + } + } + + public enum LinkLength { + case constant(Vector.Scalar) + case varied((EdgeID, LinkLookup) -> Vector.Scalar) + + @inlinable + func calculate(for link: [EdgeID], in lookup: LinkLookup) -> [Vector.Scalar] { + switch self { + case .constant(let m): + return Array(repeating: m, count: link.count) + case .varied(let f): + return link.map { l in f(l, lookup) } + } + } + } + + /// A force that represents links between nodes. + /// + /// The complexity is `O(e)`, where `e` is the number of links. + /// See [Link Force - D3](https://d3js.org/d3-force/link). + public struct LinkForce: ForceProtocol { + // @usableFromInline + // internal var kinetics: Kinetics! = nil + + @usableFromInline + var linkStiffness: LinkStiffness + + @usableFromInline + var calculatedStiffness: [Vector.Scalar] = [] + + @usableFromInline + var linkLength: LinkLength + + @usableFromInline + var calculatedLength: [Vector.Scalar] = [] + + /// Bias + @usableFromInline + var calculatedBias: [Vector.Scalar] = [] + + @inlinable + public func apply() { + fatalError() + // let positionBufferPointer = kinetics.position.mutablePointer + // let velocityBufferPointer = kinetics.velocity.mutablePointer + // let random = kinetics.randomGenerator + // for _ in 0..]! = nil + + @usableFromInline + internal var linkLookup: LinkLookup = .init(links: []) + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics) { + // self.kinetics = kinetics + self.links = kinetics.links + self.links = self.links.filter { + $0.source < kinetics.validCount && $0.target < kinetics.validCount + } + self.linkLookup = .init(links: self.links) + self.calculatedBias = self.links.map { l in + Vector.Scalar(self.linkLookup.count[l.source, default: 0]) + / Vector.Scalar( + linkLookup.count[l.target, default: 0] + + linkLookup.count[l.source, default: 0]) + } + + self.calculatedStiffness = self.linkStiffness.calculate( + for: self.links, in: self.linkLookup) + self.calculatedLength = self.linkLength.calculate(for: self.links, in: self.linkLookup) + } + + @usableFromInline var iterationsPerTick: UInt + + @inlinable + public init( + // _ links: [EdgeID], + stiffness: LinkStiffness, + originalLength: LinkLength = .constant(30), + iterationsPerTick: UInt = 1 + ) { + // self.links = links + self.iterationsPerTick = iterationsPerTick + self.linkStiffness = stiffness + self.linkLength = originalLength + + } + + + @inlinable + public func dispose() {} + } +} + +public struct LinkLookup { + public let sourceToTarget: [NodeID: [NodeID]] + public let targetToSource: [NodeID: [NodeID]] + public let count: [NodeID: Int] + + @inlinable + public init(links: [EdgeID]) { + var sourceToTarget: [NodeID: [NodeID]] = [:] + var targetToSource: [NodeID: [NodeID]] = [:] + var count: [NodeID: Int] = [:] + for link in links { + sourceToTarget[link.source, default: []].append(link.target) + targetToSource[link.target, default: []].append(link.source) + count[link.source, default: 0] += 1 + count[link.target, default: 0] += 1 + } + self.sourceToTarget = sourceToTarget + self.targetToSource = targetToSource + self.count = count + } + +} + + +extension Kinetics.LinkStiffness: Equatable { + @inlinable + public static func == (lhs: Kinetics.LinkStiffness, rhs: Kinetics.LinkStiffness) -> Bool { + switch (lhs, rhs) { + case (.constant(let l), .constant(let r)): + return l == r + default: + return false + } + } +} + +extension Kinetics.LinkLength: Equatable { + @inlinable + public static func == (lhs: Kinetics.LinkLength, rhs: Kinetics.LinkLength) -> Bool { + switch (lhs, rhs) { + case (.constant(let l), .constant(let r)): + return l == r + default: + return false + } + } +} \ No newline at end of file diff --git a/Sources/ForceSimulation/Forces/ManyBodyForce.swift b/Sources/ForceSimulation/Forces/ManyBodyForce.swift new file mode 100644 index 0000000..7fac3c5 --- /dev/null +++ b/Sources/ForceSimulation/Forces/ManyBodyForce.swift @@ -0,0 +1,292 @@ +import simd + +public struct MassCentroidKDTreeDelegate: KDTreeDelegate +where Vector: SimulatableVector { + + public var accumulatedMass: Vector.Scalar = .zero + public var accumulatedCount: Int = 0 + public var accumulatedMassWeightedPositions: Vector = .zero + + @usableFromInline let massArray: UnsafeMutablePointer //(NodeID) -> Vector.Scalar + + @inlinable + init(massProvider: UnsafeMutablePointer) { + self.massArray = massProvider + } + + @inlinable + init( + initialAccumulatedProperty: Vector.Scalar, + initialAccumulatedCount: Int, + initialWeightedAccumulatedNodePositions: Vector, + massProvider: UnsafeMutablePointer //@escaping (Int) -> Vector.Scalar + ) { + self.accumulatedMass = initialAccumulatedProperty + self.accumulatedCount = initialAccumulatedCount + self.accumulatedMassWeightedPositions = initialWeightedAccumulatedNodePositions + self.massArray = massProvider + } + + @inlinable public mutating func didAddNode(_ node: Int, at position: Vector) { + let p = massArray[node] + #if DEBUG + assert(p > 0) + #endif + accumulatedCount += 1 + accumulatedMass += p + accumulatedMassWeightedPositions += position * p + } + + @inlinable public mutating func didRemoveNode(_ node: Int, at position: Vector) { + let p = massArray[node] + accumulatedCount -= 1 + accumulatedMass -= p + accumulatedMassWeightedPositions -= position * p + // TODO: parent removal? + } + + // @inlinable public func copy() -> Self { + // return Self( + // initialAccumulatedProperty: self.accumulatedMass, + // initialAccumulatedCount: self.accumulatedCount, + // initialWeightedAccumulatedNodePositions: self.accumulatedMassWeightedPositions, + // massProvider: self.massProvider + // ) + // } + + @inlinable public func spawn() -> Self { + return Self(massProvider: self.massArray) + } +} + +extension Kinetics { + public typealias NodeMass = AttributeDescriptor + + /// A force that simulate the many-body force. + /// + /// This is a very expensive force, the complexity is `O(n log(n))`, + /// where `n` is the number of nodes. The complexity might degrade to `O(n^2)` if the nodes are too close to each other. + /// See [Manybody Force - D3](https://d3js.org/d3-force/many-body). + public struct ManyBodyForce: ForceProtocol { + + @usableFromInline let strength: Vector.Scalar + @usableFromInline var theta2: Vector.Scalar + @usableFromInline var theta: Vector.Scalar { + didSet { + theta2 = theta * theta + } + } + @usableFromInline let distanceMin: Vector.Scalar = 1 + @usableFromInline let distanceMin2: Vector.Scalar = 1 + @usableFromInline let distanceMax2: Vector.Scalar = .infinity + @usableFromInline let distanceMax: Vector.Scalar = .infinity + + public let mass: NodeMass + @usableFromInline var precalculatedMass: UnsafeArray! = nil + + @inlinable + public init( + strength: Vector.Scalar, + nodeMass: NodeMass = .constant(1.0), + theta: Vector.Scalar = 0.9 + ) { + self.strength = strength + self.mass = nodeMass + self.theta = theta + self.theta2 = theta * theta + + } + + @inlinable + public func apply() { + fatalError() + + // // Avoid capturing self + // let alpha = self.kinetics.alpha + // let theta2 = self.theta2 + // let distanceMin2 = self.distanceMin2 + // let distanceMax2 = self.distanceMax2 + // let strength = self.strength + // let precalculatedMass = self.precalculatedMass.mutablePointer + // let positionBufferPointer = kinetics.position.mutablePointer + // let tree = self.tree! + + // let coveringBox = KDBox.cover(of: self.kinetics.position) + // tree.pointee.reset(rootBox: coveringBox, rootDelegate: .init(massProvider: precalculatedMass)) + // for p in kinetics.range { + // tree.pointee.add(nodeIndex: p, at: positionBufferPointer[p]) + // } + + // for i in self.kinetics.range { + // let pos = positionBufferPointer[i] + // var f = Vector.zero + // tree.pointee.visit { t in + + // guard t.delegate.accumulatedCount > 0 else { return false } + // let centroid = + // t.delegate.accumulatedMassWeightedPositions / t.delegate.accumulatedMass + + // let vec = centroid - pos + // let boxWidth = (t.box.p1 - t.box.p0)[0] + // var distanceSquared = + // (vec + // // .jiggled() + // .jiggled(by: random)).lengthSquared() + + // let farEnough: Bool = + // (distanceSquared * theta2) > (boxWidth * boxWidth) + + // if distanceSquared < distanceMin2 { + // distanceSquared = (distanceMin2 * distanceSquared).squareRoot() + // } + + // if farEnough { + + // guard distanceSquared < distanceMax2 else { return true } + + // /// Workaround for "The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions" + // let k: Vector.Scalar = + // strength * alpha * t.delegate.accumulatedMass + // / distanceSquared // distanceSquared.squareRoot() + + // f += vec * k + // return false + + // } else if t.childrenBufferPointer != nil { + // return true + // } + + // if t.isFilledLeaf { + + // if t.nodeIndices!.contains(i) { return false } + + // let massAcc = t.delegate.accumulatedMass + + // let k: Vector.Scalar = strength * alpha * massAcc / distanceSquared // distanceSquared.squareRoot() + // f += vec * k + // return false + // } else { + // return true + // } + // } + + // positionBufferPointer[i] += f / precalculatedMass[i] + // } + } + + + + + + @inlinable + public func apply(to kinetics: inout Kinetics) { + + // Avoid capturing self + let alpha = kinetics.alpha + let theta2 = self.theta2 + let distanceMin2 = self.distanceMin2 + let distanceMax2 = self.distanceMax2 + let strength = self.strength + let precalculatedMass = self.precalculatedMass.mutablePointer + let positionBufferPointer = kinetics.position.mutablePointer + // let random = kinetics.randomGenerator + let tree = self.tree! + + let coveringBox = KDBox.cover(of: kinetics.position) + tree.pointee.reset(rootBox: coveringBox, rootDelegate: .init(massProvider: precalculatedMass)) + for p in kinetics.range { + tree.pointee.add(nodeIndex: p, at: positionBufferPointer[p]) + } + + for i in kinetics.range { + let pos = positionBufferPointer[i] + var f = Vector.zero + tree.pointee.visit { t in + + guard t.delegate.accumulatedCount > 0 else { return false } + let centroid = + t.delegate.accumulatedMassWeightedPositions / t.delegate.accumulatedMass + + let vec = centroid - pos + let boxWidth = (t.box.p1 - t.box.p0)[0] + var distanceSquared = + (vec + .jiggled(by: &kinetics.randomGenerator)).lengthSquared() + + let farEnough: Bool = + (distanceSquared * theta2) > (boxWidth * boxWidth) + + if distanceSquared < distanceMin2 { + distanceSquared = (distanceMin2 * distanceSquared).squareRoot() + } + + if farEnough { + + guard distanceSquared < distanceMax2 else { return true } + + /// Workaround for "The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions" + let k: Vector.Scalar = + strength * alpha * t.delegate.accumulatedMass + / distanceSquared // distanceSquared.squareRoot() + + f += vec * k + return false + + } else if t.childrenBufferPointer != nil { + return true + } + + if t.isFilledLeaf { + + if t.nodeIndices!.contains(i) { return false } + + let massAcc = t.delegate.accumulatedMass + + let k: Vector.Scalar = strength * alpha * massAcc / distanceSquared // distanceSquared.squareRoot() + f += vec * k + return false + } else { + return true + } + } + + positionBufferPointer[i] += f / precalculatedMass[i] + } + } + + // public var kinetics: Kinetics! = nil + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics) { + // self.kinetics = kinetics + self.precalculatedMass = self.mass.calculateUnsafe(for: (kinetics.validCount)) + + self.tree = .allocate(capacity: 1) + self.tree.initialize( + to: + BufferedKDTree( + rootBox: .init( + p0: .init(repeating: 0), + p1: .init(repeating: 1) + ), + nodeCapacity: kinetics.validCount, + rootDelegate: MassCentroidKDTreeDelegate( + massProvider: precalculatedMass.mutablePointer) + ) + ) + } + + /// The buffered KDTree used across all ticks. + @usableFromInline + internal var tree: + UnsafeMutablePointer>>! = nil + + /// Deinitialize the tree and deallocate the memory. + /// Called when `Simulation` is deinitialized. + @inlinable + public func dispose() { + self.tree.deinitialize(count: 1) + self.tree.deallocate() + } + } +} diff --git a/Sources/ForceSimulation/Forces/PositionForce.swift b/Sources/ForceSimulation/Forces/PositionForce.swift new file mode 100644 index 0000000..cd5f465 --- /dev/null +++ b/Sources/ForceSimulation/Forces/PositionForce.swift @@ -0,0 +1,85 @@ +extension Kinetics { + + public typealias TargetOnDirection = AttributeDescriptor + public enum DirectionOfPositionForce: Equatable { + case x + case y + case z + case entryOfVector(Int) + } + public typealias PositionStrength = AttributeDescriptor + + /// A force that moves nodes to a target position. + /// + /// Center force is relatively fast, the complexity is `O(n)`, + /// where `n` is the number of nodes. + /// See [Position Force - D3](https://d3js.org/d3-force/position). + public struct PositionForce: ForceProtocol { + + // @usableFromInline var kinetics: Kinetics! = nil + + public var strength: PositionStrength + public var direction: Int + public var calculatedStrength: UnsafeArray! = nil + public var targetOnDirection: TargetOnDirection + public var calculatedTargetOnDirection: UnsafeArray! = nil + + @inlinable + public func apply() { + // assert(self.kinetics != nil, "Kinetics not bound to force") + // let alpha = kinetics.alpha + // let lane = self.direction + // for i in kinetics.range { + // kinetics.velocity[i][lane] += + // (self.calculatedTargetOnDirection[i] - kinetics.position[i][lane]) + // * self.calculatedStrength[i] * alpha + // } + } + + @inlinable + public func apply(to kinetics: inout Kinetics) { + let alpha = kinetics.alpha + let lane = self.direction + for i in kinetics.range { + kinetics.velocity[i][lane] += + (self.calculatedTargetOnDirection[i] - kinetics.position[i][lane]) + * self.calculatedStrength[i] * alpha + } + } + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics) { + // self.kinetics = kinetics + self.calculatedTargetOnDirection = self.targetOnDirection.calculateUnsafe( + for: kinetics.validCount) + self.calculatedStrength = self.strength.calculateUnsafe(for: kinetics.validCount) + } + + @inlinable + public init( + direction: DirectionOfPositionForce, + targetOnDirection: TargetOnDirection, + strength: PositionStrength = .constant(1.0) + ) { + self.strength = strength + self.direction = direction.lane + self.targetOnDirection = targetOnDirection + } + + @inlinable + public func dispose() {} + } + +} + +extension Kinetics.DirectionOfPositionForce { + @inlinable + var lane: Int { + switch self { + case .x: return 0 + case .y: return 1 + case .z: return 2 + case .entryOfVector(let i): return i + } + } +} diff --git a/Sources/ForceSimulation/Forces/RadialForce.swift b/Sources/ForceSimulation/Forces/RadialForce.swift new file mode 100644 index 0000000..dfb805b --- /dev/null +++ b/Sources/ForceSimulation/Forces/RadialForce.swift @@ -0,0 +1,72 @@ +extension Kinetics { + + public typealias RadialBound = AttributeDescriptor + public typealias RadialStrength = AttributeDescriptor + + /// A force that applies a radial force to all nodes. + /// + /// Center force is relatively fast, the complexity is `O(n)`, + /// where `n` is the number of nodes. + /// See [Position Force - D3](https://d3js.org/d3-force/position). + public struct RadialForce: ForceProtocol { + + // @usableFromInline var kinetics: Kinetics! = nil + public var radius: RadialBound + public var strength: RadialStrength + public var center: Vector + + @usableFromInline + var calculatedRadius: UnsafeArray! = nil + + @usableFromInline + var calculatedStrength: UnsafeArray! = nil + + @inlinable + public func apply() { + // assert(self.kinetics != nil, "Kinetics not bound to force") + + // let alpha = kinetics.alpha + // for i in kinetics.range { + // let nodeId = i + // let deltaPosition = (kinetics.position[i] - self.center).jiggled(by: kinetics.randomGenerator) //.jiggled() + // let r = (deltaPosition).length() + // let k = + // (self.calculatedRadius[nodeId] + // * self.calculatedStrength[nodeId] * alpha) / r + // kinetics.velocity[i] += deltaPosition * k + // } + } + + @inlinable + public func apply(to kinetics: inout Kinetics) { + let alpha = kinetics.alpha + for i in kinetics.range { + let deltaPosition = (kinetics.position[i] - self.center).jiggled( + by: &kinetics.randomGenerator) //.jiggled() + let r = deltaPosition.length() + let k = + (self.calculatedRadius[i] + * self.calculatedStrength[i] * alpha) / r + kinetics.velocity[i] += deltaPosition * k + } + } + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics) { + // self.kinetics = kinetics + self.calculatedRadius = self.radius.calculateUnsafe(for: kinetics.validCount) + self.calculatedStrength = self.strength.calculateUnsafe(for: kinetics.validCount) + } + + @inlinable + public init(center: Vector, radius: RadialBound, strength: RadialStrength) { + self.center = center + self.radius = radius + self.strength = strength + } + + @inlinable + public func dispose() {} + } + +} diff --git a/Sources/ForceSimulation/Forces/SealedForce2D.swift b/Sources/ForceSimulation/Forces/SealedForce2D.swift new file mode 100644 index 0000000..da39b46 --- /dev/null +++ b/Sources/ForceSimulation/Forces/SealedForce2D.swift @@ -0,0 +1,196 @@ + +/// A force that can be composed of one or multiple forces. The forces you can add +/// here include: +/// - `Kinetics2D.CenterForce` +/// - `Kinetics2D.RadialForce` +/// - `Kinetics2D.ManyBodyForce` +/// - `Kinetics2D.LinkForce` +/// - `Kinetics2D.CollideForce` +/// - `Kinetics2D.PositionForce` +/// - `Kinetics2D.EmptyForce` +/// +/// If you want to add a custom force, checkout `CompositedForce`. +public struct SealedForce2D: Force2D { + + public var entries: [ForceEntry] = [] + + @inlinable + public func apply() { + for force in self.entries { + force.apply() + } + } + + @inlinable + public func apply(to kinetics: inout Kinetics>) { + for force in self.entries { + force.apply(to: &kinetics) + } + } + + @inlinable + public func dispose() { + for force in self.entries { + force.dispose() + } + } + + @inlinable + public init( + _ entries: [ForceEntry] + ) { + self.entries = entries + } + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics>) { + self.entries = self.entries.map { entry in + switch entry { + case .center(var force): + force.bindKinetics(kinetics) + return .center(force) + case .radial(var force): + force.bindKinetics(kinetics) + return .radial(force) + case .manyBody(var force): + force.bindKinetics(kinetics) + return .manyBody(force) + case .link(var force): + force.bindKinetics(kinetics) + return .link(force) + case .collide(var force): + force.bindKinetics(kinetics) + return .collide(force) + case .position(var force): + force.bindKinetics(kinetics) + return .position(force) + default: + return entry + } + } + } + + public enum ForceEntry { + case center(Kinetics2D.CenterForce) + case radial(Kinetics2D.RadialForce) + case manyBody(Kinetics2D.ManyBodyForce) + case link(Kinetics2D.LinkForce) + case collide(Kinetics2D.CollideForce) + case position(Kinetics2D.PositionForce) + case empty + + @inlinable + public func apply() { + switch self { + case .center(let force): + force.apply() + case .radial(let force): + force.apply() + case .manyBody(let force): + force.apply() + case .link(let force): + force.apply() + case .collide(let force): + force.apply() + case .position(let force): + force.apply() + default: + break + } + } + + @inlinable + public func dispose() { + switch self { + case .center(let force): + force.dispose() + case .radial(let force): + force.dispose() + case .manyBody(let force): + force.dispose() + case .link(let force): + force.dispose() + case .collide(let force): + force.dispose() + case .position(let force): + force.dispose() + default: + break + } + } + + + @inlinable + public func apply(to kinetics: inout Kinetics>) { + switch self { + case .center(let force): + force.apply(to: &kinetics) + case .radial(let force): + force.apply(to: &kinetics) + case .manyBody(let force): + force.apply(to: &kinetics) + case .link(let force): + force.apply(to: &kinetics) + case .collide(let force): + force.apply(to: &kinetics) + case .position(let force): + force.apply(to: &kinetics) + default: + break + } + } + } + + @inlinable + public init(@SealedForce2DBuilder _ builder: () -> [ForceEntry]) { + self.entries = builder() + } + +} + + +@resultBuilder +public struct SealedForce2DBuilder { + public static func buildBlock(_ components: SealedForce2D.ForceEntry...) -> [SealedForce2D.ForceEntry] { + components + } + + public static func buildExpression(_ expression: FD) -> SealedForce2D.ForceEntry where FD: ForceDescriptor, FD.ConcreteForce: Force2D { + let f = expression.createForce() + switch f { + case let f as Kinetics2D.CenterForce: + return .center(f) + case let f as Kinetics2D.RadialForce: + return .radial(f) + case let f as Kinetics2D.ManyBodyForce: + return .manyBody(f) + case let f as Kinetics2D.LinkForce: + return .link(f) + case let f as Kinetics2D.CollideForce: + return .collide(f) + case let f as Kinetics2D.PositionForce: + return .position(f) + default: + return .empty + } + } + + public static func buildExpression(_ f: F) -> SealedForce2D.ForceEntry where F:Force2D { + switch f { + case let f as Kinetics2D.CenterForce: + return .center(f) + case let f as Kinetics2D.RadialForce: + return .radial(f) + case let f as Kinetics2D.ManyBodyForce: + return .manyBody(f) + case let f as Kinetics2D.LinkForce: + return .link(f) + case let f as Kinetics2D.CollideForce: + return .collide(f) + case let f as Kinetics2D.PositionForce: + return .position(f) + default: + return .empty + } + } +} diff --git a/Sources/ForceSimulation/Forces/SealedForce3D.swift b/Sources/ForceSimulation/Forces/SealedForce3D.swift new file mode 100644 index 0000000..2a30afd --- /dev/null +++ b/Sources/ForceSimulation/Forces/SealedForce3D.swift @@ -0,0 +1,195 @@ + +/// A force that can be composed of one or multiple forces. The forces you can add +/// here include: +/// - `Kinetics3D.CenterForce` +/// - `Kinetics3D.RadialForce` +/// - `Kinetics3D.ManyBodyForce` +/// - `Kinetics3D.LinkForce` +/// - `Kinetics3D.CollideForce` +/// - `Kinetics3D.PositionForce` +/// - `Kinetics3D.EmptyForce` +/// +/// If you want to add a custom force, checkout `CompositedForce`. +public struct SealedForce3D: Force3D { + + public var entries: [ForceEntry] = [] + + @inlinable + public func apply() { + for force in self.entries { + force.apply() + } + } + + @inlinable + public func apply(to kinetics: inout Kinetics>) { + for force in self.entries { + force.apply(to: &kinetics) + } + } + + @inlinable + public func dispose() { + for force in self.entries { + force.dispose() + } + } + + @inlinable + public init( + _ entries: [ForceEntry] + ) { + self.entries = entries + } + + @inlinable + public mutating func bindKinetics(_ kinetics: Kinetics>) { + self.entries = self.entries.map { entry in + switch entry { + case .center(var force): + force.bindKinetics(kinetics) + return .center(force) + case .radial(var force): + force.bindKinetics(kinetics) + return .radial(force) + case .manyBody(var force): + force.bindKinetics(kinetics) + return .manyBody(force) + case .link(var force): + force.bindKinetics(kinetics) + return .link(force) + case .collide(var force): + force.bindKinetics(kinetics) + return .collide(force) + case .position(var force): + force.bindKinetics(kinetics) + return .position(force) + default: + return entry + } + } + } + + public enum ForceEntry { + case center(Kinetics3D.CenterForce) + case radial(Kinetics3D.RadialForce) + case manyBody(Kinetics3D.ManyBodyForce) + case link(Kinetics3D.LinkForce) + case collide(Kinetics3D.CollideForce) + case position(Kinetics3D.PositionForce) + case empty + + @inlinable + public func apply() { + switch self { + case .center(let force): + force.apply() + case .radial(let force): + force.apply() + case .manyBody(let force): + force.apply() + case .link(let force): + force.apply() + case .collide(let force): + force.apply() + case .position(let force): + force.apply() + default: + break + } + } + + @inlinable + public func dispose() { + switch self { + case .center(let force): + force.dispose() + case .radial(let force): + force.dispose() + case .manyBody(let force): + force.dispose() + case .link(let force): + force.dispose() + case .collide(let force): + force.dispose() + case .position(let force): + force.dispose() + default: + break + } + } + + @inlinable + public func apply(to kinetics: inout Kinetics>) { + switch self { + case .center(let force): + force.apply(to: &kinetics) + case .radial(let force): + force.apply(to: &kinetics) + case .manyBody(let force): + force.apply(to: &kinetics) + case .link(let force): + force.apply(to: &kinetics) + case .collide(let force): + force.apply(to: &kinetics) + case .position(let force): + force.apply(to: &kinetics) + default: + break + } + } + } + + @inlinable + public init(@SealedForce3DBuilder _ builder: () -> [ForceEntry]) { + self.entries = builder() + } + +} + + +@resultBuilder +public struct SealedForce3DBuilder { + public static func buildBlock(_ components: SealedForce3D.ForceEntry...) -> [SealedForce3D.ForceEntry] { + components + } + + public static func buildExpression(_ expression: FD) -> SealedForce3D.ForceEntry where FD: ForceDescriptor, FD.ConcreteForce: Force3D { + let f = expression.createForce() + switch f { + case let f as Kinetics3D.CenterForce: + return .center(f) + case let f as Kinetics3D.RadialForce: + return .radial(f) + case let f as Kinetics3D.ManyBodyForce: + return .manyBody(f) + case let f as Kinetics3D.LinkForce: + return .link(f) + case let f as Kinetics3D.CollideForce: + return .collide(f) + case let f as Kinetics3D.PositionForce: + return .position(f) + default: + return .empty + } + } + + public static func buildExpression(_ f: F) -> SealedForce3D.ForceEntry where F:Force3D { + switch f { + case let f as Kinetics3D.CenterForce: + return .center(f) + case let f as Kinetics3D.RadialForce: + return .radial(f) + case let f as Kinetics3D.ManyBodyForce: + return .manyBody(f) + case let f as Kinetics3D.LinkForce: + return .link(f) + case let f as Kinetics3D.CollideForce: + return .collide(f) + case let f as Kinetics3D.PositionForce: + return .position(f) + default: + return .empty + } + } +} diff --git a/Sources/ForceSimulation/KDTree/BufferedKDTree.swift b/Sources/ForceSimulation/KDTree/BufferedKDTree.swift new file mode 100644 index 0000000..6884ae3 --- /dev/null +++ b/Sources/ForceSimulation/KDTree/BufferedKDTree.swift @@ -0,0 +1,369 @@ +public struct BufferedKDTree: Disposable +where + Vector: SimulatableVector & L2NormCalculatable, + Delegate: KDTreeDelegate +{ + public typealias Box = KDBox + public typealias TreeNode = KDTreeNode + + @usableFromInline + internal var rootPointer: UnsafeMutablePointer { + treeNodeBuffer.mutablePointer + } + + @usableFromInline + internal var validCount: Int = 0 + + @usableFromInline + internal var treeNodeBuffer: UnsafeArray + + @inlinable + static internal var clusterDistanceSquared: Vector.Scalar { + return Vector.clusterDistanceSquared + } + + @inlinable + public var root: TreeNode { rootPointer.pointee } + + @inlinable + public init( + rootBox: Box, + nodeCapacity: Int, + rootDelegate: @autoclosure () -> Delegate + ) { + // Assuming each add creates 2^Vector.scalarCount nodes + // In most situations this is sufficient (for example the miserable graph) + // But It's possible to exceed this limit: + // 2 additions very close but not clustered in the same box + // In this case there's no upperbound for addition so `resize` is needed + let maxBufferCount = (nodeCapacity << Vector.scalarCount) + 1 + self.rootDelegate = rootDelegate() + + treeNodeBuffer = .createBuffer( + withHeader: maxBufferCount, + count: maxBufferCount, + initialValue: .zeroWithDelegate(self.rootDelegate) + ) + rootPointer.pointee = TreeNode( + nodeIndices: nil, + childrenBufferPointer: nil, + delegate: self.rootDelegate, + box: rootBox + ) + self.validCount = 1 + } + + @usableFromInline + internal var rootDelegate: Delegate + + @inlinable + public mutating func reset( + rootBox: Box, + rootDelegate: @autoclosure () -> Delegate + ) { + self.rootDelegate = rootDelegate() + + treeNodeBuffer.withUnsafeMutablePointerToElements { + for i in 0.. treeNodeBuffer.header) + let rootCopy = root + #endif + let oldRootPointer = rootPointer + + let newTreeNodeBuffer = UnsafeArray.createBuffer( + withHeader: newTreeNodeBufferSize, + count: newTreeNodeBufferSize, + moving: treeNodeBuffer.mutablePointer, + movingCount: validCount, + fillingExcessiveBufferWith: .zeroWithDelegate(self.rootDelegate) + ) + + let newRootPointer = newTreeNodeBuffer.withUnsafeMutablePointerToElements { $0 } + + for i in 0.. Bool { + if validCount + count > treeNodeBuffer.count { + let factor = (count / self.treeNodeBuffer.count) + 2 + + resize(to: treeNodeBuffer.count * factor) + + assert(treeNodeBuffer.count >= validCount + count) + + return true + } + return false + } + + @inlinable + public mutating func add( + nodeIndex: Int, + at point: Vector + ) { + assert(validCount > 0) + cover(point: point) + addWithoutCover( + onTreeNode: rootPointer, + nodeOf: nodeIndex, + at: point + ) + } + + @inlinable + internal mutating func addWithoutCover( + onTreeNode treeNode: UnsafeMutablePointer, + nodeOf nodeIndex: Int, + at point: Vector + ) { + if treeNode.pointee.childrenBufferPointer != nil { + + let directionOfNewNode = getIndexInChildren( + point, relativeTo: treeNode.pointee.box.center) + let treeNodeOffset = (consume treeNode) - rootPointer + self.addWithoutCover( + onTreeNode: treeNode.pointee.childrenBufferPointer! + directionOfNewNode, + nodeOf: nodeIndex, + at: point + ) + rootPointer[treeNodeOffset].delegate.didAddNode(nodeIndex, at: point) + return + + } else if treeNode.pointee.nodeIndices == nil { + // empty leaf + + treeNode.pointee.nodeIndices = TreeNode.NodeIndex(nodeIndex) + treeNode.pointee.nodePosition = point + treeNode.pointee.delegate.didAddNode(nodeIndex, at: point) + + return + } else if treeNode.pointee.nodePosition.distanceSquared(to: point) + > Self.clusterDistanceSquared + { + // filled leaf + + let treeNodeOffset = (consume treeNode) - rootPointer + resizeIfNeededBeforeAllocation(for: Self.directionCount) + + let spawnedDelegate = treeNode.pointee.delegate.spawn() + let center = treeNode.pointee.box.center + + let newTreeNode = self.rootPointer + treeNodeOffset + let _box = newTreeNode.pointee.box + for j in 0..> i) & 0b1 + if isOnTheHigherRange != 0 { + __box.p0[i] = center[i] + } else { + __box.p1[i] = center[i] + } + } + + let obsoletePtr = self.rootPointer + validCount + j + + obsoletePtr.pointee.disposeNodeIndices() + obsoletePtr.pointee = TreeNode( + nodeIndices: nil, + childrenBufferPointer: nil, + delegate: spawnedDelegate, + box: __box + ) + + } + newTreeNode.pointee.childrenBufferPointer = rootPointer + validCount + validCount += Self.directionCount + + if let childrenBufferPointer = newTreeNode.pointee.childrenBufferPointer { + let direction = getIndexInChildren( + newTreeNode.pointee.nodePosition, + relativeTo: center + ) + // newly created, no need to dispose + // childrenBufferPointer[direction].disposeNodeIndices() + childrenBufferPointer[direction] = .init( + nodeIndices: newTreeNode.pointee.nodeIndices, + childrenBufferPointer: childrenBufferPointer[direction] + .childrenBufferPointer, + delegate: newTreeNode.pointee.delegate, + box: childrenBufferPointer[direction].box, + nodePosition: newTreeNode.pointee.nodePosition + ) + + newTreeNode.pointee.nodeIndices = nil + newTreeNode.pointee.nodePosition = .zero + } + + let directionOfNewNode = getIndexInChildren(point, relativeTo: center) + + // This add might also resize this buffer! + addWithoutCover( + onTreeNode: newTreeNode.pointee.childrenBufferPointer! + directionOfNewNode, + nodeOf: nodeIndex, + at: point + ) + + rootPointer[treeNodeOffset].delegate.didAddNode(nodeIndex, at: point) + return + } else { + // filled leaf and within cluster distance + treeNode.pointee.nodeIndices!.append(nodeIndex: nodeIndex) + + treeNode.pointee.delegate.didAddNode(nodeIndex, at: point) + return + } + + } + + @inlinable + internal mutating func cover(point: Vector) { + if self.root.box.contains(point) { return } + + repeat { + let direction = self.getIndexInChildren(point, relativeTo: self.root.box.p0) + self.expand(towards: direction) + } while !self.root.box.contains(point) + } + + @inlinable + internal mutating func expand(towards direction: Int) { + let nailedDirection = (Self.directionCount - 1) - direction + let nailedCorner = self.root.box.getCorner(of: nailedDirection) + let _corner = self.root.box.getCorner(of: direction) + let expandedCorner = (_corner + _corner) - nailedCorner + let newRootBox = Box(nailedCorner, expandedCorner) + + let _rootValue = self.root + + // spawn the delegate with the same internal values + // for the children, use implicit copy of spawned + let spawned = _rootValue.delegate.spawn() + + let newChildrenPointer = self.rootPointer + validCount + + resizeIfNeededBeforeAllocation(for: Self.directionCount) + + for j in 0..> i) & 0b1 + // TODO: use simd mask + if isOnTheHigherRange != 0 { + __box.p0[i] = _corner[i] + } else { + __box.p1[i] = _corner[i] + } + } + // newly allocated, no need to dispose + if j != nailedDirection { + self.treeNodeBuffer[validCount + j] = TreeNode( + nodeIndices: nil, + childrenBufferPointer: nil, + delegate: spawned, + box: __box, + nodePosition: .zero + ) + } else { + self.treeNodeBuffer[validCount + j] = TreeNode( + nodeIndices: _rootValue.nodeIndices, + childrenBufferPointer: _rootValue.childrenBufferPointer, + delegate: _rootValue.delegate, + box: __box, + nodePosition: _rootValue.nodePosition + ) + } + } + self.validCount += Self.directionCount + + // don't dispose, they are used in treeNodeBuffer[validCount + j] + self.rootPointer.pointee = .init( + nodeIndices: nil, + childrenBufferPointer: newChildrenPointer, + delegate: _rootValue.delegate, + box: newRootBox + ) + } + + @inlinable + static internal var directionCount: Int { 1 << Vector.scalarCount } + + @inlinable + public func dispose() { + treeNodeBuffer.withUnsafeMutablePointerToElements { + for i in 0.. Int { + var index = 0 + let mask = point .>= originalPoint + + for i in 0..) -> Bool + ) { + rootPointer.pointee.visit(shouldVisitChildren: shouldVisitChildren) + } +} \ No newline at end of file diff --git a/Sources/ForceSimulation/KDTree/KDBox.swift b/Sources/ForceSimulation/KDTree/KDBox.swift new file mode 100644 index 0000000..fe12ebf --- /dev/null +++ b/Sources/ForceSimulation/KDTree/KDBox.swift @@ -0,0 +1,223 @@ +// +// KDBox.swift +// +// +// Created by li3zhen1 on 10/14/23. +// +import simd + +/// A box in N-dimensional space. +/// +/// - Note: `p0` is the minimum point of the box, `p1` is the maximum point of the box. +public struct KDBox: Equatable where V: SIMD, V.Scalar: FloatingPoint & ExpressibleByFloatLiteral { + /// the minimum anchor of the box + public var p0: V + + /// the maximum anchor of the box + public var p1: V + + /// Create a box with 2 anchors. + /// + /// - Parameters: + /// - p0: anchor + /// - p1: another anchor in the diagonal position of `p0` + /// - Note: `p0` you pass does not have to be minimum point of the box. + /// `p1` does not have to be maximum point of the box. The initializer will + /// automatically adjust the order of `p0` and `p1` to make sure `p0` is the + /// minimum point of the box and `p1` is the maximum point of the box. + @inlinable + public init(p0: V, p1: V) { + // #if DEBUG + assert(p0 != p1, "NdBox was initialized with 2 same anchor") + // #endif + // var p0 = p0 + // var p1 = p1 + + // for i in p0.indices { + // if p1[i] < p0[i] { + // swap(&p0[i], &p1[i]) + // } + // } + // let mask = p0 .< p1 + // self.p0 = p1.replacing(with: p0, where: mask) + // self.p1 = p0.replacing(with: p1, where: mask) + self.p0 = pointwiseMin(p0, p1) + self.p1 = pointwiseMax(p0, p1) + // TODO: use Mask + } + + /// Create a box with 2 anchors. + /// + /// - Parameters: + /// - pMin: minimum anchor of the box + /// - pMax: maximum anchor of the box + /// - Note: Please make sure `pMin` is the minimum point of the box and `pMax` is the + /// maximum point of the box. + @inlinable + @available(*, deprecated, renamed: "init(uncheckedP0:uncheckedP1:)") + internal init(pMin: V, pMax: V) { + assert(pMin != pMax, "NdBox was initialized with 2 same anchor") + self.p0 = pMin + self.p1 = pMax + } + + @inlinable + internal init(uncheckedP0: V, uncheckedP1: V) { + self.p0 = uncheckedP0 + self.p1 = uncheckedP1 + } + + /// Create a box with 2 zero anchors. + @inlinable + @available(*, deprecated, renamed: "zero") + public init() { + p0 = .zero + p1 = .zero + } + + /// Create a box with 2 anchors. + /// - Parameters: + /// - p0: anchor + /// - p1: another anchor in the diagonal position of `p0` + /// - Note: `p0` you pass does not have to be minimum point of the box. + /// `p1` does not have to be maximum point of the box. The initializer will + /// automatically adjust the order of `p0` and `p1` to make sure `p0` is the + /// minimum point of the box and `p1` is the maximum point of the box. + @inlinable + public init(_ p0: V, _ p1: V) { + self.init(p0: p0, p1: p1) + } + +} + +extension KDBox { + @inlinable + var diagnalVector: V { + return p1 - p0 + } + + @inlinable + static var zero: Self { + return Self(uncheckedP0: .zero, uncheckedP1: .zero) + } + + @inlinable var center: V { (p1 + p0) / 2.0 } + + /// Test if the box contains a point. + /// - Parameter point: N dimensional point + /// - Returns: `true` if the box contains the point, `false` otherwise. + /// The boundary test is similar to ..< operator. + @inlinable func contains(_ point: V) -> Bool { + let mask = (p0 .> point) .| (point .>= p1) + + return mask == .init(repeating: false) + + // equivalent to: + // for i in point.indices { + // if p0[i] > point[i] || point[i] >= p1[i] { + // return false + // } + // } + // return true + } +} + +extension KDBox { + + @inlinable func getCorner(of direction: Int) -> V { + var mask = SIMDMask() + + for i in 0..> i) & 0b1) == 1 + } + return p0.replacing(with: p1, where: mask) + + // equivalent to: + // var corner = V.zero + // for i in 0..> i) & 0b1) == 1 ? p1[i] : p0[i] + // } + // return p0.replacing(with: p1, where: mask) //corner + } + + // @inlinable public var debugDescription: String { + // return "[\(p0), \(p1)]" + // } +} + +extension KDBox { + + /// Get the small box that contains a list points and guarantees the box's size is at least 1x..x1. + /// + /// - Parameter points: The points to be covered. + /// - Returns: The box that contains all the points. + @inlinable public static func cover(of points: [V]) -> Self { + + var _p0 = points[0] + var _p1 = points[0] + + for p in points { + // let mask1 = p .< _p0 + // let mask2 = p .>= _p1 + + // _p0 = _p0.replacing(with: p, where: mask1) + // _p1 = _p1.replacing(with: p + 1, where: mask2) + + _p0 = pointwiseMin(p, _p0) + _p1 = pointwiseMax(p, _p1) + + // for i in p.indices { + // if p[i] < _p0[i] { + // _p0[i] = p[i] + // } + // if p[i] >= _p1[i] { + // _p1[i] = p[i] + 1 + // } + // } + } + + #if DEBUG + let _box = Self(_p0, _p1) + assert( + points.allSatisfy { p in + _box.contains(p) + }) + #endif + + return Self(_p0, _p1) + } + + @inlinable public static func cover(of points: UnsafeArray) -> Self { + + + var _p0 = points[0] + var _p1 = points[0] + + for pi in 0.. _p1[i] { + // _p1[i] = p[i] + 1 + // } + // } + } + + + #if DEBUG + let testBox = Self(_p0, _p1+1) + for i in points.range { + assert(testBox.contains(points[i])) + } + #endif + + return Self(consume _p0, consume _p1+1) + } + +} diff --git a/Sources/ForceSimulation/KDTree/KDTree.swift b/Sources/ForceSimulation/KDTree/KDTree.swift new file mode 100644 index 0000000..d78df07 --- /dev/null +++ b/Sources/ForceSimulation/KDTree/KDTree.swift @@ -0,0 +1,307 @@ + +/// A node in NDTree +/// - Note: `NDTree` is a generic type that can be used in any dimension. +/// `NDTree` is a value type. +public struct KDTree +where + Vector: SimulatableVector & L2NormCalculatable, + Delegate: KDTreeDelegate +{ + public typealias NodeIndex = Delegate.NodeID + public typealias Direction = Int + public typealias Box = KDBox + + public var box: Box + public var children: [KDTree]? + public var nodePosition: Vector? + public var nodeIndices: [NodeIndex] + + @inlinable var clusterDistanceSquared: Vector.Scalar { + return Vector.clusterDistanceSquared + } + + public var delegate: Delegate + + @inlinable + public init( + box: Box, + // clusterDistanceSquared: Vector.Scalar, + spawnedDelegateBeingConsumed: consuming Delegate + ) { + self.box = box + self.nodeIndices = [] + self.delegate = consume spawnedDelegateBeingConsumed + } + + @inlinable + init( + box: Box, + spawnedDelegateBeingConsumed: consuming Delegate, + childrenBeingConsumed: consuming [KDTree] + ) { + self.box = box + self.nodeIndices = [] + self.delegate = consume spawnedDelegateBeingConsumed + self.children = consume childrenBeingConsumed + } + + @inlinable + static var directionCount: Int { 1 << Vector.scalarCount } + + @inlinable + mutating func cover(_ point: Vector) { + if box.contains(point) { return } + + repeat { + let direction = getIndexInChildren(point, relativeTo: box.p0) + expand(towards: direction) + } while !box.contains(point) + } + /// Get the index of the child that contains the point. + /// + /// **Complexity**: `O(n*(2^n))`, where `n` is the dimension of the vector. + @inlinable + func getIndexInChildren(_ point: Vector, relativeTo originalPoint: Vector) -> Int { + var index = 0 + + let mask = point .>= originalPoint + + for i in 0..]() + result.reserveCapacity(Self.directionCount) + // let center = newRootBox.center + + for j in 0..> i) & 0b1 + + // TODO: use simd mask + if isOnTheHigherRange != 0 { + __box.p0[i] = _corner[i] + } else { + __box.p1[i] = _corner[i] + } + } + result.append( + Self( + box: __box, + // clusterDistanceSquared: clusterDistanceSquared, + spawnedDelegateBeingConsumed: j != nailedDirection ? self.delegate : spawned + ) + ) + } + + // result[nailedDirection] = consume tempSelf + + self = Self( + box: newRootBox, + spawnedDelegateBeingConsumed: self.delegate, + childrenBeingConsumed: consume result + ) + + } + + @inlinable + public mutating func add(_ nodeIndex: NodeIndex, at point: Vector) { + cover(point) + addWithoutCover(nodeIndex, at: point) + } + + @inlinable + public mutating func addWithoutCover(_ nodeIndex: NodeIndex, at point: Vector) { + defer { + delegate.didAddNode(nodeIndex, at: point) + } + guard children != nil else { + if nodePosition == nil { + nodeIndices.append(nodeIndex) + nodePosition = point + return + } else if nodePosition!.distanceSquared(to: point) < clusterDistanceSquared { + // the condition (nodePosition == point) is mostly only true when the tree is initialized + // hence omitted + nodeIndices.append(nodeIndex) + return + } else { + + var spawnedChildren = [KDTree]() + spawnedChildren.reserveCapacity(Self.directionCount) + let spawendDelegate = self.delegate.spawn() + let center = box.center + + for j in 0..> i) & 0b1 + // TODO: use simd mask + if isOnTheHigherRange != 0 { + __box.p0[i] = center[i] + } else { + __box.p1[i] = center[i] + } + } + spawnedChildren.append( + Self( + box: __box, + // clusterDistanceSquared: clusterDistanceSquared, + spawnedDelegateBeingConsumed: spawendDelegate + ) + ) + } + if let nodePosition { + let direction = getIndexInChildren(nodePosition, relativeTo: box.center) + spawnedChildren[direction].nodeIndices = self.nodeIndices + spawnedChildren[direction].nodePosition = self.nodePosition + spawnedChildren[direction].delegate = self.delegate + self.nodeIndices = [] + self.nodePosition = nil + // TODO: Consume + } + + let directionOfNewNode = getIndexInChildren(point, relativeTo: box.center) + spawnedChildren[directionOfNewNode].addWithoutCover(nodeIndex, at: point) + + self.children = spawnedChildren + return + + } + } + + let directionOfNewNode = getIndexInChildren(point, relativeTo: box.center) + self.children![directionOfNewNode].addWithoutCover(nodeIndex, at: point) + return + } +} + +extension KDTree where Delegate.NodeID == Int { + + /// Initialize a KDTree with a list of points and a key path to the vector. + /// + /// - Parameters: + /// - points: A list of points. The points are only used to calculate the covering box. You should still call `add` to add the points to the tree. + /// - clusterDistance: If 2 points are close enough, they will be clustered into the same leaf node. + /// - buildRootDelegate: A closure that tells the tree how to initialize the data you want to store in the rootPointer. + /// The closure is called only once. The `NDTreeDelegate` will then be created in children tree nods by calling `spawn` on the rootPointer delegate. + @inlinable + public init( + covering points: [Vector], + buildRootDelegate: () -> Delegate + ) { + let coveringBox = Box.cover(of: points) + self.init( + box: coveringBox, spawnedDelegateBeingConsumed: buildRootDelegate() + ) + for i in points.indices { + add(i, at: points[i]) + } + } + + @inlinable + public init( + covering points: UnsafeArray, + buildRootDelegate: () -> Delegate + ) { + let coveringBox = Box.cover(of: points) + self.init( + box: coveringBox, spawnedDelegateBeingConsumed: buildRootDelegate() + ) + for i in 0.., + rootDelegate: @autoclosure () -> Delegate + ) { + let coveringBox = Box.cover(of: points) + self.init( + box: coveringBox, spawnedDelegateBeingConsumed: rootDelegate() + ) + for i in 0..( + // covering points: [T], + // keyPath: KeyPath, + // buildRootDelegate: () -> Delegate + // ) { + // let coveringBox = Box.cover(of: points, keyPath: keyPath) + // self.init( + // box: coveringBox, clusterDistance: clusterDistance, buildRootDelegate: buildRootDelegate + // ) + // for i in points.indices { + // add(i, at: points[i][keyPath: keyPath]) + // } + // } +} + +extension KDTree { + + /// The bounding box of the current node + @inlinable public var extent: Box { box } + + /// Returns true is the current tree node is leaf. + /// + /// Does not guarantee that the tree node has point in it. + @inlinable public var isLeaf: Bool { children == nil } + + /// Returns true is the current tree node is internal. + /// + /// Internal tree node are always empty and do not contain any points. + @inlinable public var isInternalNode: Bool { children != nil } + + /// Returns true is the current tree node is leaf and has point in it. + @inlinable public var isFilledLeaf: Bool { nodePosition != nil } + + /// Returns true is the current tree node is leaf and does not have point in it. + @inlinable public var isEmptyLeaf: Bool { nodePosition == nil } + + /// Visit the tree in pre-order. + /// + /// - Parameter shouldVisitChildren: a closure that returns a boolean value indicating whether should continue to visit children. + @inlinable public mutating func visit( + shouldVisitChildren: (inout KDTree) -> Bool + ) { + if shouldVisitChildren(&self) && children != nil { + // this is an internal node + for i in children!.indices { + children![i].visit(shouldVisitChildren: shouldVisitChildren) + } + } + } + +} diff --git a/Sources/ForceSimulation/KDTree/KDTreeDelegate.swift b/Sources/ForceSimulation/KDTree/KDTreeDelegate.swift new file mode 100644 index 0000000..efe4c72 --- /dev/null +++ b/Sources/ForceSimulation/KDTree/KDTreeDelegate.swift @@ -0,0 +1,43 @@ +// +// NDTree.swift +// +// +// Created by li3zhen1 on 10/14/23. +// + +/// The data structure carried by a node of NDTree. +/// +/// It receives notifications when a node is added or removed on a node, +/// regardless of whether the node is internal or leaf. +/// It is designed to calculate properties like a box's center of mass. +/// +/// When implementing your delegates, ensure they +/// are value types to enable memberwise copy. +public protocol KDTreeDelegate { + associatedtype NodeID: Hashable + associatedtype Vector: SIMD where Vector.Scalar: FloatingPoint & ExpressibleByFloatLiteral + + /// Called when a node is added on a node, regardless of whether the node is internal or leaf. + /// + /// If you add `n` points to the root, this method will be called `n` times in the root delegate, + /// although it is probably not containing points now. + /// - Parameters: + /// - node: The nodeID of the node that is added. + /// - position: The position of the node that is added. + @inlinable mutating func didAddNode(_ node: NodeID, at position: Vector) + + /// Called when a node is removed on a node, regardless of whether the node is internal or leaf. + @inlinable mutating func didRemoveNode(_ node: NodeID, at position: Vector) + + /// Copy object. + /// + /// This method is called when the root box is not large enough to cover the new nodes. + // @inlinable func copy() -> Self + + /// Create new object with properties set to initial value as if the box is empty. + /// + /// However, you can still carry something like a closure to get information from outside. + /// This method is called when a leaf box is splited due to the insertion of a new node in this box. + @inlinable func spawn() -> Self + +} diff --git a/Sources/ForceSimulation/KDTree/KDTreeNode.swift b/Sources/ForceSimulation/KDTree/KDTreeNode.swift new file mode 100644 index 0000000..33b9dcc --- /dev/null +++ b/Sources/ForceSimulation/KDTree/KDTreeNode.swift @@ -0,0 +1,159 @@ +public struct KDTreeNode +where + Vector: SimulatableVector & L2NormCalculatable, + Delegate: KDTreeDelegate +{ + public var box: KDBox + public var nodePosition: Vector + public var childrenBufferPointer: UnsafeMutablePointer? + + @usableFromInline + internal var nodeIndices: NodeIndex? + public var delegate: Delegate + + @inlinable + init( + nodeIndices: consuming NodeIndex?, + childrenBufferPointer: consuming UnsafeMutablePointer?, + delegate: consuming Delegate, + box: consuming KDBox, + nodePosition: consuming Vector = .zero + ) { + self.childrenBufferPointer = consume childrenBufferPointer + self.nodeIndices = consume nodeIndices + self.delegate = consume delegate + self.box = consume box + self.nodePosition = consume nodePosition + } + + @inlinable + mutating public func disposeNodeIndices() { + nodeIndices?.dispose() + nodeIndices = nil + } +} + +extension KDTreeNode { + + + @usableFromInline + struct NodeIndex: Disposable { + + @usableFromInline + var index: Int + + @usableFromInline + var next: UnsafeMutablePointer? + + } +} + +extension KDTreeNode.NodeIndex { + + @inlinable + internal init( + nodeIndex: Int + ) { + self.index = nodeIndex + self.next = nil + } + + @inlinable + internal init( + _ nodeIndex: Int + ) { + self.index = nodeIndex + self.next = nil + } + + + @inlinable + internal mutating func append(nodeIndex: Int) { + if let next { + next.pointee.append(nodeIndex: nodeIndex) + } else { + next = .allocate(capacity: 1) + next!.initialize(to: .init(nodeIndex: nodeIndex)) + // next!.pointee = .init(nodeIndex: nodeIndex) + } + } + + @inlinable + consuming internal func dispose() { + if let next { + next.pointee.dispose() + next.deallocate() + } + } + + @inlinable + internal func contains(_ nodeIndex: Int) -> Bool { + if index == nodeIndex { return true } + if let next { + return next.pointee.contains(nodeIndex) + } else { + return false + } + } + + @inlinable + internal func forEach(_ body: (Int) -> Void) { + body(index) + if let next { + next.pointee.forEach(body) + } + } +} + +extension KDTreeNode { + /// Returns true is the current tree node is leaf. + /// + /// Does not guarantee that the tree node has point in it. + @inlinable public var isLeaf: Bool { childrenBufferPointer == nil } + + /// Returns true is the current tree node is internal. + /// + /// Internal tree node are always empty and do not contain any points. + @inlinable public var isInternalNode: Bool { childrenBufferPointer != nil } + + /// Returns true is the current tree node is leaf and has point in it. + @inlinable public var isFilledLeaf: Bool { nodeIndices != nil } + + /// Returns true is the current tree node is leaf and does not have point in it. + @inlinable public var isEmptyLeaf: Bool { nodeIndices == nil } + + /// Visit the tree in pre-order. + /// + /// - Parameter shouldVisitChildren: a closure that returns a boolean value indicating whether should continue to visit children. + @inlinable public mutating func visit( + shouldVisitChildren: (inout KDTreeNode) -> Bool + ) { + if shouldVisitChildren(&self) && childrenBufferPointer != nil { + // this is an internal node + for i in 0...directionCount { + childrenBufferPointer![i].visit(shouldVisitChildren: shouldVisitChildren) + } + } + } + + /// Returns an array of point indices in the tree node. + @inlinable + public var containedIndices: [Int] { + guard isFilledLeaf else { return [] } + var result: [Int] = [] + nodeIndices!.forEach { result.append($0) } + return result + } + + @inlinable + static func zeroWithDelegate(_ delegate: consuming Delegate) -> Self { + return Self( + nodeIndices: nil, + childrenBufferPointer: nil, + delegate: delegate, + box: .zero, + nodePosition: .zero + ) + } + +} diff --git a/Sources/ForceSimulation/Kinetics.swift b/Sources/ForceSimulation/Kinetics.swift new file mode 100644 index 0000000..72c24af --- /dev/null +++ b/Sources/ForceSimulation/Kinetics.swift @@ -0,0 +1,185 @@ +/// A class that holds the state of the simulation, which +/// includes the positions, velocities of the nodes. +public struct Kinetics: Disposable +where Vector: SimulatableVector & L2NormCalculatable { + + /// The position of points stored in simulation. + /// + /// Ordered as the nodeIds you passed in when initializing simulation. + /// They are always updated. + public var position: UnsafeArray + + // public var positionBufferPointer: UnsafeMutablePointer + + /// The velocities of points stored in simulation. + /// + /// Ordered as the nodeIds you passed in when initializing simulation. + /// They are always updated. + public var velocity: UnsafeArray + + // public var velocityBufferPointer: UnsafeMutablePointer + + /// The fixed positions of points stored in simulation. + /// + /// Ordered as the nodeIds you passed in when initializing simulation. + /// They are always updated. + public var fixation: UnsafeArray + + + public var validCount: Int + public var alpha: Vector.Scalar + public let alphaMin: Vector.Scalar + public let alphaDecay: Vector.Scalar + public let alphaTarget: Vector.Scalar + + public let velocityDecay: Vector.Scalar + + @usableFromInline + var randomGenerator: Vector.Scalar.Generator + + + public let links: [EdgeID] + + // public var validRanges: [Range] + // public var validRanges: Range + + @inlinable + public var range: Range { + return 0..], + initialAlpha: Vector.Scalar, + alphaMin: Vector.Scalar, + alphaDecay: Vector.Scalar, + alphaTarget: Vector.Scalar, + velocityDecay: Vector.Scalar, + position: [Vector], + velocity: consuming [Vector], + fixation: consuming [Vector?] + ) { + self.links = links + // self.initializedAlpha = initialAlpha + self.alpha = initialAlpha + self.alphaMin = alphaMin + self.alphaDecay = alphaDecay + self.alphaTarget = alphaTarget + self.velocityDecay = velocityDecay + + let count = position.count + self.validCount = count + + self.position = .createBuffer(moving: consume position, fillingWithIfFailed: .zero) + self.velocity = .createBuffer(moving: velocity, fillingWithIfFailed: .zero) + self.fixation = .createBuffer(moving: fixation, fillingWithIfFailed: nil) + self.randomGenerator = .init() + } + + // @inlinable + // init( + // links: [EdgeID], + // initialAlpha: Vector.Scalar, + // alphaMin: Vector.Scalar, + // alphaDecay: Vector.Scalar, + // alphaTarget: Vector.Scalar, + // velocityDecay: Vector.Scalar, + // position: consuming [Vector], + // velocity: consuming [Vector], + // fixation: consuming [Vector?], + // randomSeed: Vector.Scalar.Generator.OverflowingInteger + // ) { + // self.links = links + // self.initializedAlpha = initialAlpha + // self.alpha = initialAlpha + // self.alphaMin = alphaMin + // self.alphaDecay = alphaDecay + // self.alphaTarget = alphaTarget + // self.velocityDecay = velocityDecay + // let count = position.count + // self.validCount = count + + // self.position = UnsafeArray.createBuffer( + // withHeader: count, + // count: count, + // initialValue: .zero + // ) + + // self.velocity = UnsafeArray.createBuffer( + // withHeader: count, + // count: count, + // initialValue: .zero + // ) + // self.fixation = UnsafeArray.createBuffer( + // withHeader: count, + // count: count, + // initialValue: nil + // ) + + // self.randomGenerator = .allocate(capacity: 1) + // self.randomGenerator.initialize(to: .init(seed: randomSeed)) + // } + + // @inlinable + // internal func jigglePosition() { + // for i in range { + // position[i] = position[i].jiggled(by: self.randomGenerator) + // } + // } + + // @inlinable + // static func createZeros( + // links: [EdgeID], + // initialAlpha: Vector.Scalar, + // alphaMin: Vector.Scalar, + // alphaDecay: Vector.Scalar, + // alphaTarget: Vector.Scalar, + // velocityDecay: Vector.Scalar, + // count: Int + // ) -> Kinetics { + // return Kinetics( + // links: links, + // initialAlpha: initialAlpha, + // alphaMin: alphaMin, + // alphaDecay: alphaDecay, + // alphaTarget: alphaTarget, + // velocityDecay: velocityDecay, + + // position: Array(repeating: .zero, count: count), + // velocity: Array(repeating: .zero, count: count), + // fixation: Array(repeating: nil, count: count) + // ) + // } + + @inlinable + public func dispose() { + // self.randomGenerator.deinitialize(count: 1) + // self.randomGenerator.deallocate() + } +} + +extension Kinetics { + @inlinable + @inline(__always) + func updatePositions() { + for i in range { + if let fix = fixation[i] { + position[i] = fix + } else { + velocity[i] *= velocityDecay + position[i] += velocity[i] + } + } + } + + @inlinable + @inline(__always) + mutating func updateAlpha() { + alpha += alphaTarget - alpha * alphaDecay + } + +} + +public typealias Kinetics2D = Kinetics> +public typealias Kinetics3D = Kinetics> diff --git a/Sources/ForceSimulation/Simulation.swift b/Sources/ForceSimulation/Simulation.swift index 2b89cec..277ef4b 100644 --- a/Sources/ForceSimulation/Simulation.swift +++ b/Sources/ForceSimulation/Simulation.swift @@ -1,125 +1,113 @@ -// -// Simulation.swift -// -// -// Created by li3zhen1 on 10/16/23. -// +/// An any-dimensional force simulation. +/// The points are placed in a space where you use a SIMD data structure +/// to describe their coordinates. +public final class Simulation +where Vector: SimulatableVector & L2NormCalculatable, ForceField: ForceProtocol { -import NDTree + @usableFromInline + var forceField: ForceField -enum SimulationError: Error { - case subscriptionToNonexistentNode -} - -/// An N-Dimensional force simulation. -public final class Simulation where NodeID: Hashable, V: VectorLike, V.Scalar == Double { - - /// The type of the vector used in the simulation. - /// Usually this is `Double` if you are on Apple platforms. - public typealias Scalar = V.Scalar - - - public let initializedAlpha: Double - - public var alpha: Double - public var alphaMin: Double - public var alphaDecay: Double - public var alphaTarget: Double - public var velocityDecay: V.Scalar - - public internal(set) var forces: [any ForceLike] = [] + public var kinetics: Kinetics - - public internal(set) var nodePositions: [V] - public internal(set) var nodeVelocities: [V] - public internal(set) var nodeFixations: [V?] - - public private(set) var nodeIds: [NodeID] - - @usableFromInline internal private(set) var nodeIdToIndexLookup: [NodeID: Int] = [:] + /// Create a new simulation. + /// + /// - Parameters: + /// - nodeCount: Count of the nodes. Force simulation calculate them by order once created. + /// - links: The links between nodes. + /// - forceField: The force field that drives the simulation. The simulation takes ownership of the force field. + /// - alpha: Initial alpha value, determines how "active" the simulation is. + /// - alphaMin: The minimum alpha value. The simulation stops when alpha is less than this value. + /// - alphaDecay: The larger the value, the faster the simulation converges to the final result. + /// - alphaTarget: The alpha value the simulation converges to. + /// - velocityDecay: A multiplier for the velocity of the nodes in Velocity Verlet integration. The position of the nodes is updated by the formula `x += v * velocityDecay`. + // @inlinable + // public init( + // nodeCount: Int, + // links: [EdgeID], + // forceField: consuming ForceField, + // initialAlpha: Vector.Scalar = 1, + // alphaMin: Vector.Scalar = 1e-2, + // alphaDecay: Vector.Scalar = 2e-3, + // alphaTarget: Vector.Scalar = 0.0, + // velocityDecay: Vector.Scalar = 0.6 + // ) { + // self.kinetics = .createZeros( + // links: links, + // initialAlpha: initialAlpha, + // alphaMin: alphaMin, + // alphaDecay: alphaDecay, + // alphaTarget: alphaTarget, + // velocityDecay: velocityDecay, + // count: nodeCount + // ) + // // self.kinetics.jigglePosition() + // forceField.bindKinetics(self.kinetics) + // self.forceField = forceField + // } /// Create a new simulation. + /// /// - Parameters: - /// - nodeIds: Hashable identifiers for the nodes. Force simulation calculate them by order once created. - /// - alpha: - /// - alphaMin: + /// - nodeCount: Count of the nodes. Force simulation calculate them by order once created. + /// - links: The links between nodes. + /// - forceField: The force field that drives the simulation. The simulation takes ownership of the force field. + /// - alpha: Initial alpha value, determines how "active" the simulation is. + /// - alphaMin: The minimum alpha value. The simulation stops when alpha is less than this value. /// - alphaDecay: The larger the value, the faster the simulation converges to the final result. - /// - alphaTarget: - /// - velocityDecay: - /// - getInitialPosition: The closure to set the initial position of the node. If not provided, the initial position is set to zero. + /// - alphaTarget: The alpha value the simulation converges to. + /// - velocityDecay: A multiplier for the velocity of the nodes in Velocity Verlet integration. The position of the nodes is updated by the formula `x += v * velocityDecay`. + @inlinable public init( - nodeIds: [NodeID], - alpha: Double = 1, - alphaMin: Double = 1e-3, - alphaDecay: Double = 2e-3, - alphaTarget: Double = 0.0, - velocityDecay: Double = 0.6, - - setInitialStatus getInitialPosition: ( - (NodeID) -> V - )? = nil - + nodeCount: Int, + links: [EdgeID], + forceField: consuming ForceField, + initialAlpha: Vector.Scalar = 1, + alphaMin: Vector.Scalar = 1e-3, + alphaDecay: Vector.Scalar = 2e-3, + alphaTarget: Vector.Scalar = 0.0, + velocityDecay: Vector.Scalar = 0.6, + position: [Vector]? = nil, + velocity: [Vector]? = nil, + fixation: [Vector?]? = nil ) { - self.alpha = alpha - self.initializedAlpha = alpha // record and reload this when restarted - - self.alphaMin = alphaMin - self.alphaDecay = alphaDecay - self.alphaTarget = alphaTarget - - self.velocityDecay = velocityDecay - - if let getInitialPosition { - self.nodePositions = nodeIds.map(getInitialPosition) - } else { - self.nodePositions = Array(repeating: .zero, count: nodeIds.count) - } + self.kinetics = Kinetics( + links: links, + initialAlpha: initialAlpha, + alphaMin: alphaMin, + alphaDecay: alphaDecay, + alphaTarget: alphaTarget, + velocityDecay: velocityDecay, + position: consume position ?? Array(repeating: .zero, count: nodeCount), + velocity: consume velocity ?? Array(repeating: .zero, count: nodeCount), + fixation: consume fixation ?? Array(repeating: nil, count: nodeCount) + ) + // self.kinetics.jigglePosition() + forceField.bindKinetics(self.kinetics) + self.forceField = forceField + } - self.nodeVelocities = Array(repeating: .zero, count: nodeIds.count) - self.nodeFixations = Array(repeating: nil, count: nodeIds.count) - - - self.nodeIdToIndexLookup.reserveCapacity(nodeIds.count) - for i in nodeIds.indices { - self.nodeIdToIndexLookup[nodeIds[i]] = i + /// Run a number of iterations of ticks. + @inlinable + public func tick(iterations: UInt = 1) { + // print(self.kinetics.alpha, self.kinetics.alphaMin) + guard self.kinetics.alpha >= self.kinetics.alphaMin else { return } + for _ in 0.. Int { - return nodeIdToIndexLookup[nodeId]! + deinit { + self.forceField.dispose() } - /// Run the simulation for a number of iterations. - /// - Parameter iterationCount: Default to 1. - public func tick(iterationCount: UInt = 1) { - for _ in 0.. = Simulation where NodeID: Hashable - -public typealias Simulation3D = Simulation where NodeID: Hashable +public typealias Simulation2D = Simulation, ForceField> +where ForceField: ForceProtocol> -#endif +public typealias Simulation3D = Simulation, ForceField> +where ForceField: ForceProtocol> diff --git a/Sources/ForceSimulation/Utils.swift b/Sources/ForceSimulation/Utils.swift deleted file mode 100644 index 83e6314..0000000 --- a/Sources/ForceSimulation/Utils.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// Utils.swift -// -// -// Created by li3zhen1 on 10/1/23. -// -import NDTree - - -// TODO: https://forums.swift.org/t/deterministic-randomness-in-swift/20835/5 - -/// A random number generator that generates deterministic random numbers. -public struct LinearCongruentialGenerator { - @usableFromInline internal static let a: Double = 1_664_525 - @usableFromInline internal static let c: Double = 1_013_904_223 - @usableFromInline internal static let m: Double = 4_294_967_296 - @usableFromInline internal static var _s: Double = 1 - @usableFromInline internal var s: Double = 1 - - @inlinable mutating func next() -> Double { - s = (Self.a * s + Self.c).truncatingRemainder(dividingBy: Self.m) - return s / Self.m - } - - @inlinable static func next() -> Double { - Self._s = (Self.a * Self._s + Self.c).truncatingRemainder(dividingBy: Self.m) - return Self._s / Self.m - } -} - -extension Double { - @inlinable public func jiggled() -> Double { - if self == 0 || self == .nan { - // return Double.random(in: -5e-6..<5e-6) - return (LinearCongruentialGenerator.next() - 0.5) * 1e-5 - } - return self - } -} - -extension VectorLike where Scalar == Double { - @inlinable public func jiggled() -> Self { - var result = Self.zero - for i in indices { - result[i] = self[i].jiggled() - } - return result - } -} - -extension Vector2d { - @inlinable public func jiggled() -> Self { - return Vector2d(x.jiggled(), y.jiggled()) - } -} - -/// A Hashable identifier for an edge. -public struct EdgeID: Hashable where NodeID: Hashable { - public let source: NodeID - public let target: NodeID - - public init(_ source: NodeID, _ target: NodeID) { - self.source = source - self.target = target - } -} - -public protocol PrecalculatableNodeProperty { - associatedtype NodeID: Hashable - associatedtype V: VectorLike where V.Scalar == Double - func calculated(for simulation: Simulation) -> [Double] -} diff --git a/Sources/ForceSimulation/Utils/AttributeDescriptor.swift b/Sources/ForceSimulation/Utils/AttributeDescriptor.swift new file mode 100644 index 0000000..7b9800e --- /dev/null +++ b/Sources/ForceSimulation/Utils/AttributeDescriptor.swift @@ -0,0 +1,46 @@ +public enum AttributeDescriptor { + case varied((Int) -> T) + case constant(T) +} + +extension AttributeDescriptor: Equatable where T: Equatable { + + @inlinable + public static func == (lhs: AttributeDescriptor, rhs: AttributeDescriptor) -> Bool { + switch (lhs, rhs) { + case (.constant(let l), .constant(let r)): + return l == r + default: + return false + } + } +} + +extension AttributeDescriptor { + @inlinable + func calculate(for count: Int) -> [T] { + switch self { + case .constant(let m): + return [T](repeating: m, count: count) + case .varied(let radiusProvider): + return (0.. UnsafeArray where T: Numeric { + switch self { + case .constant(let m): + return UnsafeArray.createBuffer( + withHeader: count, + count: count, + initialValue: m + ) + case .varied(let valueProvider): + let array = UnsafeArray.createBuffer(withHeader: count, count: count) { + valueProvider($0) + } + return array + } + } +} diff --git a/Sources/ForceSimulation/Utils/Disposable.swift b/Sources/ForceSimulation/Utils/Disposable.swift new file mode 100644 index 0000000..9aeb467 --- /dev/null +++ b/Sources/ForceSimulation/Utils/Disposable.swift @@ -0,0 +1,18 @@ +public protocol Disposable { + @inlinable + mutating func dispose() +} + +extension UnsafeMutablePointer where Pointee: Disposable { + + /// Disposes the underlying memory block and + /// deallocates the memory block previously allocated at this pointer. + /// + /// This pointer must be a pointer to the start of a previously allocated memory + /// block. The memory must not be initialized or `Pointee` must be a trivial type. + @inlinable + public func dispose() { + self.pointee.dispose() + self.deallocate() + } +} \ No newline at end of file diff --git a/Sources/ForceSimulation/Utils/EdgeID.swift b/Sources/ForceSimulation/Utils/EdgeID.swift new file mode 100644 index 0000000..e51640d --- /dev/null +++ b/Sources/ForceSimulation/Utils/EdgeID.swift @@ -0,0 +1,19 @@ +/// A Hashable identifier for an edge. +/// +/// It’s a utility type for preserving `Hashable` conformance. +public struct EdgeID: Hashable { + public var source: NodeID + public var target: NodeID + + public init(source: NodeID, target: NodeID) { + self.source = source + self.target = target + } +} + +extension EdgeID { + public init(_ source: NodeID, _ target: NodeID) { + self.source = source + self.target = target + } +} diff --git a/Sources/ForceSimulation/Utils/LinearCongruentialGenerator.swift b/Sources/ForceSimulation/Utils/LinearCongruentialGenerator.swift new file mode 100644 index 0000000..8f6586d --- /dev/null +++ b/Sources/ForceSimulation/Utils/LinearCongruentialGenerator.swift @@ -0,0 +1,118 @@ +// TODO: https://forums.swift.org/t/deterministic-randomness-in-swift/20835/5 + +/// A random number generator that generates deterministic random numbers. +public protocol DeterministicRandomGenerator { + associatedtype Scalar where Scalar: FloatingPoint & ExpressibleByFloatLiteral + associatedtype OverflowingInteger: FixedWidthInteger & UnsignedInteger + @inlinable static func next() -> Scalar + @inlinable mutating func next() -> Scalar + @inlinable init(seed: OverflowingInteger) + @inlinable init() +} + +/// A random number generator that generates deterministic random numbers for `Double`. +public struct DoubleLinearCongruentialGenerator: DeterministicRandomGenerator { + public typealias OverflowingInteger = UInt32 + @usableFromInline internal static let a: UInt32 = 1_664_525 + @usableFromInline internal static let c: UInt32 = 1_013_904_223 + @usableFromInline internal static var _s: UInt32 = 1 + @usableFromInline internal var s: UInt32 = 1 + @usableFromInline internal static let m: Double = 4_294_967_296 + + @inlinable public mutating func next() -> Double { + // Perform the linear congruential generation with integer arithmetic. + // The overflow addition and multiplication automatically wrap around, + // thus imitating the modulo operation. + s = (Self.a &* s) &+ Self.c + + // Convert the result to Double and divide by m to normalize it. + return Double(s) / Self.m + } + + @inlinable public static func next() -> Double { + + Self._s = (Self.a &* Self._s) &+ Self.c + + // Convert the result to Double and divide by m to normalize it. + return Double(Self._s) / Self.m + } + + @inlinable public init(seed: OverflowingInteger) { + self.s = 1 //seed + } + + @inlinable public init() { + self.init(seed: 1) + } +} + +/// A random number generator that generates deterministic random numbers for `Float`. +public struct FloatLinearCongruentialGenerator: DeterministicRandomGenerator { + public typealias OverflowingInteger = UInt16 + @usableFromInline internal static let a: UInt16 = 75 + @usableFromInline internal static let c: UInt16 = 74 + @usableFromInline internal static var _s: UInt16 = 1 + @usableFromInline internal var s: UInt16 = 1 + @usableFromInline internal static let m: Float = 65537.0 + + @inlinable public mutating func next() -> Float { + // Perform the linear congruential generation with integer arithmetic. + // The overflow addition and multiplication automatically wrap around. + s = (Self.a &* s) &+ Self.c + + // Convert the result to Float and divide by m to normalize it. + return Float(s) / Self.m + } + + @inlinable public static func next() -> Float { + _s = (a &* _s) &+ c + + // Convert the result to Float and divide by m to normalize it. + return Float(_s) / Self.m + } + + @inlinable public init(seed: OverflowingInteger) { + self.s = seed + } + + @inlinable public init() { + self.init(seed: 1) + } +} + +/// A floating point type that can be generated with a deterministic random number generator ``DeterministicRandomGenerator``. +public protocol HasDeterministicRandomGenerator: FloatingPoint & ExpressibleByFloatLiteral { + associatedtype Generator: DeterministicRandomGenerator where Generator.Scalar == Self +} + +extension Double: HasDeterministicRandomGenerator { + public typealias Generator = DoubleLinearCongruentialGenerator +} + +extension Float: HasDeterministicRandomGenerator { + public typealias Generator = FloatLinearCongruentialGenerator +} + +extension HasDeterministicRandomGenerator { + + @inlinable + static var jigglingScale: Self { + return 1e-5 + } + + @inlinable + public func jiggled() -> Self { + if self == .zero || self.isNaN { + return (Generator.next() - 0.5) * Self.jigglingScale + } + return self + } + + @inlinable + public func jiggled(by: UnsafeMutablePointer) -> Self { + if self == .zero || self.isNaN { + return (by.pointee.next() - 0.5) * Self.jigglingScale + } + return self + } +} diff --git a/Sources/ForceSimulation/Utils/SimulatableVector.swift b/Sources/ForceSimulation/Utils/SimulatableVector.swift new file mode 100644 index 0000000..203c1bc --- /dev/null +++ b/Sources/ForceSimulation/Utils/SimulatableVector.swift @@ -0,0 +1,135 @@ + +/// A protocol for vectors that can be jiggled, and has a certain precision for +/// simulation — so zero vectors could be altered +/// into a small random non-zero vector, and then the force simulation could be +/// could be numerically stable. +public protocol SimulatableVector: SIMD +where Scalar: FloatingPoint & HasDeterministicRandomGenerator { + @inlinable + static var clusterDistance: Scalar { get } + + @inlinable + static var clusterDistanceSquared: Scalar { get } + + @inlinable + func jiggled(by: UnsafeMutablePointer) -> Self +} + +// extension SimulatableVector { + +// /// If the vector is zero, returns a vector with the same magnitude as `self` but pointing in a random direction, +// /// otherwise returns `self`. +// @inlinable +// public func jiggled() -> Self { +// var result = Self.zero +// for i in indices { +// result[i] = self[i].jiggled() +// } +// return result +// } +// } + +/// A protocol for vectors that can be calculated with L2 norms, i.e. Euclidean distance. +public protocol L2NormCalculatable: SIMD where Scalar: FloatingPoint { + @inlinable + func distanceSquared(to point: Self) -> Scalar + + @inlinable + func distance(to point: Self) -> Scalar + + @inlinable + func lengthSquared() -> Scalar + + @inlinable + func length() -> Scalar +} + +extension SIMD2: SimulatableVector where Scalar: FloatingPoint & HasDeterministicRandomGenerator { + + @inlinable + public static var clusterDistance: Scalar { + return 1e-5 + } + + @inlinable + public static var clusterDistanceSquared: Scalar { + return clusterDistance * clusterDistance + } + + @inlinable + public func jiggled(by: UnsafeMutablePointer) -> Self { + return .init(x: self.x.jiggled(by: by), y: self.y.jiggled(by: by)) + } +} + +extension SIMD3: SimulatableVector where Scalar: FloatingPoint & HasDeterministicRandomGenerator { + + @inlinable + public static var clusterDistance: Scalar { + return 1e-5 + } + + @inlinable + public static var clusterDistanceSquared: Scalar { + return clusterDistance * clusterDistance + } + + @inlinable + public func jiggled(by: UnsafeMutablePointer) -> Self { + return .init( + x: self.x.jiggled(by: by), + y: self.y.jiggled(by: by), + z: self.z.jiggled(by: by) + ) + } +} + +#if canImport(simd) +import simd + + +extension SIMD2: L2NormCalculatable where Scalar == Double { + @inlinable + public func distanceSquared(to point: SIMD2) -> Scalar { + return simd_distance_squared(self, point) + } + + @inlinable + public func distance(to point: SIMD2) -> Scalar { + return simd_distance(self, point) + } + + @inlinable + public func lengthSquared() -> Scalar { + return simd_length_squared(self) + } + + @inlinable + public func length() -> Scalar { + return simd_length(self) + } +} + +extension SIMD3: L2NormCalculatable where Scalar == Float { + @inlinable + public func distanceSquared(to point: SIMD3) -> Scalar { + return simd_distance_squared(self, point) + } + + @inlinable + public func distance(to point: SIMD3) -> Scalar { + return simd_distance(self, point) + } + + @inlinable + public func lengthSquared() -> Scalar { + return simd_length_squared(self) + } + + @inlinable + public func length() -> Scalar { + return simd_length(self) + } +} + +#endif diff --git a/Sources/ForceSimulation/Utils/UnsafeArray.swift b/Sources/ForceSimulation/Utils/UnsafeArray.swift new file mode 100644 index 0000000..8abfc7e --- /dev/null +++ b/Sources/ForceSimulation/Utils/UnsafeArray.swift @@ -0,0 +1,151 @@ +/// A wrapper of managed buffer that stores an array of elements. +@_eagerMove +public final class UnsafeArray: ManagedBuffer { + + @inlinable + class func createBuffer(withHeader header: Int, count: Int, initialValue: Element) + -> UnsafeArray + { + let buffer = self.create(minimumCapacity: count) { _ in header } + buffer.withUnsafeMutablePointerToElements { + $0.initialize(repeating: initialValue, count: count) + } + return unsafeDowncast(buffer, to: UnsafeArray.self) + } + + @inlinable + class func createBuffer(withHeader header: Int, count: Int, initializer: (Int) -> Element) + -> UnsafeArray + { + let buffer = self.create(minimumCapacity: count) { _ in header } + buffer.withUnsafeMutablePointerToElements { + for i in 0.., + movingCount: Int, + fillingExcessiveBufferWith initialValue: consuming Element + ) -> UnsafeArray { + let buffer = self.create(minimumCapacity: count) { _ in header } + buffer.withUnsafeMutablePointerToElements { + $0.moveInitialize(from: moving, count: movingCount) + $0.advanced(by: movingCount).initialize( + repeating: initialValue, + count: count - movingCount + ) + } + return unsafeDowncast(buffer, to: UnsafeArray.self) + } + + @inlinable + class func createBuffer( + moving array: [Element], + fillingWithIfFailed element: Element + ) -> UnsafeArray { + let buffer = self.create(minimumCapacity: array.count) { _ in array.count } + array.withUnsafeBufferPointer { bufferPtr in + if let baseAddr = bufferPtr.baseAddress { + buffer.withUnsafeMutablePointerToElements { + $0.moveInitialize(from: .init(mutating: baseAddr), count: array.count) + } + } + else { + buffer.withUnsafeMutablePointerToElements { + for i in 0.. UnsafeArray { + let buffer = self.create(minimumCapacity: count) { _ in count } + // buffer.withUnsafeMutablePointerToElements { + // $0.initialize(repeating: Element(), count: count) + // } + return unsafeDowncast(buffer, to: UnsafeArray.self) + } + + + + @inlinable + public var count: Int { + return header + } + + @inlinable + public var range: Range { + return 0..

Element { + return withUnsafeMutablePointerToElements { $0[index] } + } + + @inlinable + func setElement(_ element: Element, at index: Int) { + withUnsafeMutablePointerToElements { $0[index] = element } + } + + @inlinable + deinit { + withUnsafeMutablePointers { headerPtr, elementPtr in + elementPtr.deinitialize(count: self.header) + headerPtr.deinitialize(count: 1) + } + } + + @inlinable + public subscript(index: Int) -> Element { + get { + return withUnsafeMutablePointerToElements { $0[index] } + } + set { + withUnsafeMutablePointerToElements { $0[index] = newValue } + } + } + + @inlinable + public func asArray() -> [Element] { + return withUnsafeMutablePointerToElements { + Array(UnsafeBufferPointer(start: $0, count: self.header)) + } + } + + @inlinable + public func firstIndex(where predicate: (Element) throws -> Bool) rethrows -> Int? { + var result: Int? = nil + + try withUnsafeMutablePointerToElements { + for i in 0.. { + return withUnsafeMutablePointerToElements { + $0 + } + } + +} diff --git a/Sources/ForceSimulation/forces/CenterForce.swift b/Sources/ForceSimulation/forces/CenterForce.swift deleted file mode 100644 index 2347d62..0000000 --- a/Sources/ForceSimulation/forces/CenterForce.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// CenterForce.swift -// -// -// Created by li3zhen1 on 10/16/23. -// -import NDTree - -/// A force that represents links between nodes. -final public class CenterForce: ForceLike -where NodeID: Hashable, V: VectorLike, V.Scalar == Double { - public var center: V - public var strength: Double - weak var simulation: Simulation? - - internal init(center: V, strength: Double) { - self.center = center - self.strength = strength - } - - public func apply(alpha: Double) { - guard let sim = self.simulation else { return } - - var meanPosition = V.zero - for n in sim.nodePositions { - meanPosition += n //.position - } - let delta = meanPosition * (self.strength / Double(sim.nodePositions.count)) - - for i in sim.nodePositions.indices { - sim.nodePositions[i] -= delta - } - } - -} - -extension Simulation { - - /// Create a center force, See: https://d3js.org/d3-force/center - @discardableResult - public func createCenterForce(center: V, strength: Double = 0.1) -> CenterForce { - let f = CenterForce(center: center, strength: strength) - f.simulation = self - self.forces.append(f) - return f - } - -} diff --git a/Sources/ForceSimulation/forces/CollideForce.swift b/Sources/ForceSimulation/forces/CollideForce.swift deleted file mode 100644 index 0977693..0000000 --- a/Sources/ForceSimulation/forces/CollideForce.swift +++ /dev/null @@ -1,200 +0,0 @@ -// -// File.swift -// -// -// Created by li3zhen1 on 10/17/23. -// -import NDTree - -struct MaxRadiusTreeDelegate: NDTreeDelegate where NodeID: Hashable, V: VectorLike { - - public var maxNodeRadius: Double - - @usableFromInline var radiusProvider: (NodeID) -> Double - - mutating func didAddNode(_ nodeId: NodeID, at position: V) { - let p = radiusProvider(nodeId) - maxNodeRadius = max(maxNodeRadius, p) - } - - mutating func didRemoveNode(_ nodeId: NodeID, at position: V) { - if radiusProvider(nodeId) >= maxNodeRadius { - // 🤯 for Collide force, set to 0 is fine - // Otherwise you need to traverse the delegate again - maxNodeRadius = 0 - } - } - - func copy() -> MaxRadiusTreeDelegate { - return Self(maxNodeRadius: maxNodeRadius, radiusProvider: radiusProvider) - } - - func spawn() -> MaxRadiusTreeDelegate { - return Self(radiusProvider: radiusProvider) - } - - init(maxNodeRadius: Double = 0, radiusProvider: @escaping (NodeID) -> Double) { - self.maxNodeRadius = maxNodeRadius - self.radiusProvider = radiusProvider - } - -} - - -/// A force that prevents nodes from overlapping. -public final class CollideForce: ForceLike -where NodeID: Hashable, V: VectorLike, V.Scalar == Double { - - weak var simulation: Simulation? { - didSet { - guard let sim = simulation else { return } - self.calculatedRadius = radius.calculated(for: sim) - } - } - - public enum CollideRadius { - case constant(Double) - case varied((NodeID) -> Double) - } - public var radius: CollideRadius - var calculatedRadius: [Double] = [] - - public let iterationsPerTick: UInt - public var strength: Double - - internal init( - radius: CollideRadius, - strength: Double = 1.0, - iterationsPerTick: UInt = 1 - ) { - self.radius = radius - self.iterationsPerTick = iterationsPerTick - self.strength = strength - } - - public func apply(alpha: Double) { - guard let sim = self.simulation else { return } - - for _ in 0...cover(of: sim.nodePositions) - - - let tree = NDTree>( - box: coveringBox, clusterDistance: 1e-5 - ) { - return switch self.radius { - case .constant(let m): - MaxRadiusTreeDelegate { _ in m } - case .varied(_): - MaxRadiusTreeDelegate { index in - self.calculatedRadius[index] - } - } - } - - for i in sim.nodePositions.indices { - tree.add(i, at: sim.nodePositions[i]) - } - - for i in sim.nodePositions.indices { - let iOriginalPosition = sim.nodePositions[i] - let iOriginalVelocity = sim.nodeVelocities[i] - let iR = self.calculatedRadius[i] - let iR2 = iR * iR - let iPosition = iOriginalPosition + iOriginalVelocity - - tree.visit { t in - - let maxRadiusOfQuad = t.delegate.maxNodeRadius - let deltaR = maxRadiusOfQuad + iR - - if t.nodePosition != nil { - for j in t.nodeIndices { -// print("\(i)<=>\(j)") - // is leaf, make sure every collision happens once. - guard j > i else { continue } - - let jR = self.calculatedRadius[j] - let jOriginalPosition = sim.nodePositions[j] - let jOriginalVelocity = sim.nodeVelocities[j] - var deltaPosition = iPosition - (jOriginalPosition + jOriginalVelocity) - let l = deltaPosition.lengthSquared() - - let deltaR = iR + jR - if l < deltaR * deltaR { - - var l = deltaPosition.jiggled().length() - l = (deltaR - l) / l * self.strength - - let jR2 = jR * jR - - let k = jR2 / (iR2 + jR2) - - deltaPosition *= l - - sim.nodeVelocities[i] += deltaPosition * k - sim.nodeVelocities[j] -= deltaPosition * (1 - k) - } - } - return false - } - - for laneIndex in t.box.p0.indices { - let _v = t.box.p0[laneIndex] - if _v > iPosition[laneIndex] + deltaR /* True if no overlap */ { - return false - } - } - - for laneIndex in t.box.p1.indices { - let _v = t.box.p1[laneIndex] - if _v < iPosition[laneIndex] - deltaR /* True if no overlap */ { - return false - } - } - return true - - // return - // !(t.quad.x0 > iPosition.x + deltaR /* True if no overlap */ - // || t.quad.x1 < iPosition.x - deltaR - // || t.quad.y0 > iPosition.y + deltaR - // || t.quad.y1 < iPosition.y - deltaR) - } - } - } - } - -} - -extension CollideForce.CollideRadius: PrecalculatableNodeProperty { - public func calculated(for simulation: Simulation) -> [Double] { - switch self { - case .constant(let r): - return Array(repeating: r, count: simulation.nodePositions.count) - case .varied(let radiusProvider): - return simulation.nodeIds.map { radiusProvider($0) } - } - } -} - -extension Simulation { - - /// Create a collide force, See: https://d3js.org/d3-force/collide - @discardableResult - public func createCollideForce( - radius: CollideForce.CollideRadius = .constant(3.0), - strength: Double = 1.0, - iterationsPerTick: UInt = 1 - ) -> CollideForce { - let f = CollideForce( - radius: radius, - strength: strength, - iterationsPerTick: iterationsPerTick - ) - f.simulation = self - self.forces.append(f) - return f - } - -} diff --git a/Sources/ForceSimulation/forces/DirectionForce.swift b/Sources/ForceSimulation/forces/DirectionForce.swift deleted file mode 100644 index 4d2c330..0000000 --- a/Sources/ForceSimulation/forces/DirectionForce.swift +++ /dev/null @@ -1,114 +0,0 @@ -// -// PositionForce.swift -// -// -// Created by li3zhen1 on 10/1/23. -// - -import NDTree - -/// A force that moves nodes to a target position. -final public class DirectionForce: ForceLike -where NodeID: Hashable, V: VectorLike, V.Scalar == Double { - - public enum Direction { - case x - case y - case entryOfVector(Int) - } - public enum Strength { - case constant(Double) - case varied( (NodeID) -> Double ) - } - - public enum TargetOnDirection { - case constant(V.Scalar) - case varied( (NodeID) -> V.Scalar ) - } - - public var strength: Strength - public var direction: Int - public var calculatedStrength: [Double] = [] - public var targetOnDirection: TargetOnDirection - public var calculatedTargetOnDirection: [V.Scalar] = [] - - internal init(direction: Direction, targetOnDirection: TargetOnDirection, strength: Strength = .constant(1.0)) { - - - self.strength = strength - self.direction = direction.lane - self.targetOnDirection = targetOnDirection - } - - weak var simulation: Simulation? { - didSet { - guard let sim = self.simulation else { return } - self.calculatedStrength = strength.calculated(for: sim) - self.calculatedTargetOnDirection = targetOnDirection.calculated(for: sim) - } - } - - public func apply(alpha: Double) { - guard let sim = self.simulation else { return } - let lane = self.direction - for i in sim.nodePositions.indices { - sim.nodeVelocities[i][lane] += ( - self.calculatedTargetOnDirection[i] - sim.nodePositions[i][lane] - ) * self.calculatedStrength[i] * alpha - } - } -} - -extension DirectionForce.Strength: PrecalculatableNodeProperty { - public func calculated(for simulation: Simulation) -> [Double] { - switch self { - case .constant(let value): - return Array(repeating: value, count: simulation.nodeIds.count) - case .varied(let getter): - return simulation.nodeIds.map(getter) - } - } -} - -extension DirectionForce.TargetOnDirection: PrecalculatableNodeProperty { - public func calculated(for simulation: Simulation) -> [Double] { - switch self { - case .constant(let value): - return Array(repeating: value, count: simulation.nodeIds.count) - case .varied(let getter): - return simulation.nodeIds.map(getter) - } - } -} - - -extension DirectionForce.Direction { - @inlinable var lane: Int { - switch self { - case .x: return 0 - case .y: return 1 - case .entryOfVector(let i): return i - } - } -} - -public extension Simulation { - - /// Create a direction force, Similar to https://d3js.org/d3-force/position - @discardableResult - func createPositionForce( - direction: DirectionForce.Direction, - targetOnDirection: DirectionForce.TargetOnDirection, - strength: DirectionForce.Strength = .constant(1.0) - ) -> DirectionForce { - let force = DirectionForce( - direction: direction, - targetOnDirection: targetOnDirection, - strength: strength - ) - force.simulation = self - self.forces.append(force) - return force - } -} - diff --git a/Sources/ForceSimulation/forces/LinkForce.swift b/Sources/ForceSimulation/forces/LinkForce.swift deleted file mode 100644 index ebe89d6..0000000 --- a/Sources/ForceSimulation/forces/LinkForce.swift +++ /dev/null @@ -1,238 +0,0 @@ -// -// LinkForce.swift -// -// -// Created by li3zhen1 on 10/16/23. -// - -import NDTree - -enum LinkForceError: Error { - case useBeforeSimulationInitialized -} - -/// A force that represents links between nodes. -final public class LinkForce: ForceLike -where NodeID: Hashable, V: VectorLike, V.Scalar == Double { - - /// - public enum LinkStiffness { - case constant(Double) - case varied( (EdgeID, LinkLookup) -> Double ) - case weightedByDegree( k: (EdgeID, LinkLookup) -> Double ) - } - var linkStiffness: LinkStiffness - var calculatedStiffness: [Double] = [] - - /// - public typealias LengthScalar = V.Scalar - public enum LinkLength { - case constant(LengthScalar) - case varied((EdgeID, LinkLookup) -> LengthScalar) - } - var linkLength: LinkLength - var calculatedLength: [LengthScalar] = [] - - /// Bias - var calculatedBias: [Double] = [] - - /// Binding to simulation - /// - weak var simulation: Simulation? { - didSet { - - guard let sim = simulation else { return } - - linksOfIndices = links.map { l in - EdgeID( - sim.nodeIdToIndexLookup[l.source, default: 0], - sim.nodeIdToIndexLookup[l.target, default: 0] - ) - } - - self.lookup = .buildFromLinks(linksOfIndices) - - self.calculatedBias = linksOfIndices.map { l in - Double(lookup.count[l.source, default: 0]) - / Double( - lookup.count[l.target, default: 0] + lookup.count[l.source, default: 0]) - } - - let lookupWithOriginalID = LinkLookup.buildFromLinks(links) - self.calculatedLength = linkLength.calculated( - for: self.links, connectionLookupTable: lookupWithOriginalID) - self.calculatedStiffness = linkStiffness.calculated( - for: self.links, connectionLookupTable: lookupWithOriginalID) - } - } - - var iterationsPerTick: UInt - - internal var linksOfIndices: [EdgeID] = [] - var links: [EdgeID] - - public struct LinkLookup<_NodeID> where _NodeID: Hashable { - let sources: [_NodeID: [_NodeID]] - let targets: [_NodeID: [_NodeID]] - let count: [_NodeID: Int] - } - private var lookup = LinkLookup(sources: [:], targets: [:], count: [:]) - - internal init( - _ links: [EdgeID], - stiffness: LinkStiffness, - originalLength: LinkLength = .constant(30), - iterationsPerTick: UInt = 1 - ) { - self.links = links - self.iterationsPerTick = iterationsPerTick - self.linkStiffness = stiffness - self.linkLength = originalLength - - } - - public func apply(alpha: Double) { - guard let sim = self.simulation else { return } - - - - for _ in 0..]) -> Self { - var sources: [_NodeID: [_NodeID]] = [:] - var targets: [_NodeID: [_NodeID]] = [:] - var count: [_NodeID: Int] = [:] - for link in links { - sources[link.source, default: []].append(link.target) - targets[link.target, default: []].append(link.source) - count[link.source, default: 0] += 1 - count[link.target, default: 0] += 1 - } - return Self(sources: sources, targets: targets, count: count) - } -} - -protocol PrecalculatableEdgeProperty { - associatedtype NodeID: Hashable - associatedtype V: VectorLike where V.Scalar == Double - func calculated( - for links: [EdgeID], connectionLookupTable: LinkForce.LinkLookup - ) -> [Double] -} - - - -extension LinkForce.LinkLength: PrecalculatableEdgeProperty { - func calculated( - for links: [EdgeID], connectionLookupTable: LinkForce.LinkLookup - ) -> [V.Scalar] { - switch self { - case .constant(let value): - return links.map { _ in value } - case .varied(let f): - return links.map { link in - f(link, connectionLookupTable) - } - } - } -} - - - -extension LinkForce.LinkStiffness: PrecalculatableEdgeProperty { - func calculated( - for links: [EdgeID], - connectionLookupTable lookup: LinkForce.LinkLookup - ) -> [Double] { - switch self { - case .constant(let value): - return links.map { _ in value } - case .varied(let f): - return links.map { link in - f(link, lookup) - } - case .weightedByDegree(let k): - return links.map { link in - k(link, lookup) / Double( - min( - lookup.count[link.source, default: 0], - lookup.count[link.target, default: 0] - ) - ) - } - } - } -} - - - -extension Simulation { - - - /// Create a link force, Similar to https://d3js.org/d3-force/link - @discardableResult - public func createLinkForce( - _ links: [EdgeID], - stiffness: LinkForce.LinkStiffness = .weightedByDegree { _, _ in 1.0 }, - originalLength: LinkForce.LinkLength = .constant(30), - iterationsPerTick: UInt = 1 - ) -> LinkForce { - let linkForce = LinkForce( - links, stiffness: stiffness, originalLength: originalLength) - linkForce.simulation = self - self.forces.append(linkForce) - return linkForce - } - - @discardableResult - public func createLinkForce( - _ linkTuples: [(NodeID, NodeID)], - stiffness: LinkForce.LinkStiffness = .weightedByDegree { _, _ in 1.0 }, - originalLength: LinkForce.LinkLength = .constant(30), - iterationsPerTick: UInt = 1 - ) -> LinkForce { - let links = linkTuples.map { EdgeID($0.0, $0.1) } - let linkForce = LinkForce( - links, stiffness: stiffness, originalLength: originalLength) - linkForce.simulation = self - self.forces.append(linkForce) - return linkForce - } -} diff --git a/Sources/ForceSimulation/forces/ManyBodyForce.swift b/Sources/ForceSimulation/forces/ManyBodyForce.swift deleted file mode 100644 index c277200..0000000 --- a/Sources/ForceSimulation/forces/ManyBodyForce.swift +++ /dev/null @@ -1,322 +0,0 @@ -// -// File.swift -// -// -// Created by li3zhen1 on 10/1/23. -// - -import NDTree - -enum ManyBodyForceError: Error { - case buildQuadTreeBeforeSimulationInitialized -} - - -struct MassQuadtreeDelegate: NDTreeDelegate where NodeID: Hashable, V: VectorLike { - - public var accumulatedMass: Double = .zero - public var accumulatedCount = 0 - public var accumulatedMassWeightedPositions: V = .zero - - @usableFromInline let massProvider: (NodeID) -> Double - - init( - massProvider: @escaping (NodeID) -> Double - ) { - self.massProvider = massProvider - } - - internal init( - initialAccumulatedProperty: Double, - initialAccumulatedCount: Int, - initialWeightedAccumulatedNodePositions: V, - massProvider: @escaping (NodeID) -> Double - ) { - self.accumulatedMass = initialAccumulatedProperty - self.accumulatedCount = initialAccumulatedCount - self.accumulatedMassWeightedPositions = initialWeightedAccumulatedNodePositions - self.massProvider = massProvider - } - - @inlinable mutating func didAddNode(_ node: NodeID, at position: V) { - let p = massProvider(node) - #if DEBUG - assert(p > 0) - #endif - accumulatedCount += 1 - accumulatedMass += p - accumulatedMassWeightedPositions += position * p - } - - @inlinable mutating func didRemoveNode(_ node: NodeID, at position: V) { - let p = massProvider(node) - accumulatedCount -= 1 - accumulatedMass -= p - accumulatedMassWeightedPositions -= position * p - // TODO: parent removal? - } - - @inlinable func copy() -> Self { - return Self( - initialAccumulatedProperty: self.accumulatedMass, - initialAccumulatedCount: self.accumulatedCount, - initialWeightedAccumulatedNodePositions: self.accumulatedMassWeightedPositions, - massProvider: self.massProvider - ) - } - - @inlinable func spawn() -> Self { - return Self(massProvider: self.massProvider) - } - - @inlinable var centroid: V? { - guard accumulatedCount > 0 else { return nil } - return accumulatedMassWeightedPositions / accumulatedMass - } -} - -/// A force that simulate the many-body force. See: https://d3js.org/d3-force/many-body -final public class ManyBodyForce: ForceLike -where NodeID: Hashable, V: VectorLike, V.Scalar == Double { - - var strength: Double - - public enum NodeMass { - case constant(Double) - case varied( (NodeID) -> Double ) - } - var mass: NodeMass = .constant(1.0) - var precalculatedMass: [Double] = [] - - weak var simulation: Simulation? { - didSet { - guard let sim = self.simulation else { return } - self.precalculatedMass = self.mass.calculated(for: sim) - self.forces = [V](repeating: .zero, count: sim.nodePositions.count) - } - } - - var theta2: Double - var theta: Double { - didSet { - theta2 = theta * theta - } - } - - var distanceMin2: Double = 1 - var distanceMax2: Double = Double.infinity - var distanceMin: Double = 1 - var distanceMax: Double = Double.infinity - - internal init( - strength: Double, - nodeMass: NodeMass = .constant(1.0), - theta: Double = 0.9 - ) { - self.strength = strength - self.mass = nodeMass - self.theta = theta - self.theta2 = theta * theta - } - - var forces: [V] = [] - public func apply(alpha: Double) { - guard let simulation else { return } -// guard - try! calculateForce(alpha: alpha) //else { return } - - - for i in simulation.nodeVelocities.indices { - simulation.nodeVelocities[i] += self.forces[i] / precalculatedMass[i] - } - } - - // private func getCoveringBox() throws -> NDBox { - // guard let simulation else { throw ManyBodyForceError.buildQuadTreeBeforeSimulationInitialized } - // var _p0 = simulation.nodes[0].position - // var _p1 = simulation.nodes[0].position - // - // for p in simulation.nodes { - // for i in 0..= _p1[i] { - // _p1[i] = p.position[i] + 1 - // } - // } - // } - // return NDBox(_p0, _p1) - // - // } - - func calculateForce(alpha: Double) throws { - - guard let sim = self.simulation else { - throw ManyBodyForceError.buildQuadTreeBeforeSimulationInitialized - } - - let coveringBox = NDBox.cover(of: sim.nodePositions) //try! getCoveringBox() - - let tree = NDTree>(box: coveringBox, clusterDistance: 1e-5) - { - - return switch self.mass { - case .constant(let m): - MassQuadtreeDelegate { _ in m } - case .varied(_): - MassQuadtreeDelegate { index in - self.precalculatedMass[index] - } - } - } - - for i in sim.nodePositions.indices { - tree.add(i, at: sim.nodePositions[i]) - - #if DEBUG - assert(tree.delegate.accumulatedCount == i + 1) - #endif - - } - -// var forces = [V](repeating: .zero, count: sim.nodePositions.count) - - for i in sim.nodePositions.indices { - var f = V.zero - tree.visit { t in - - // guard t.delegate.accumulatedCount > 0 else { return false } - // - // let centroid = t.delegate.accumulatedMassWeightedPositions / t.delegate.accumulatedMass - // let vec = centroid - sim.nodePositions[i] - // - // var distanceSquared = vec.jiggled().lengthSquared() - // - // /// too far away, omit - // guard distanceSquared < self.distanceMax2 else { return false } - // - // - // - // /// too close, enlarge distance - // if distanceSquared < self.distanceMin2 { - // distanceSquared = (self.distanceMin2 * distanceSquared).squareRoot() - // } - // - // - // if t.nodePosition != nil { - // - // /// filled leaf - // if !t.nodeIndices.contains(i) { - // let k: Double = self.strength * alpha * t.delegate.accumulatedMass / distanceSquared / (distanceSquared).squareRoot() - // forces[i] += vec * k - // } - // - // return false - // - // } - // else if t.children != nil { - // - // let boxWidth = (t.box.p1 - t.box.p1)[0] - // - // /// internal, guard in 180 guarantees we have nodes here - // if distanceSquared * self.theta2 > boxWidth * boxWidth { - // // far enough - // let k: Double = self.strength * alpha * t.delegate.accumulatedMass / distanceSquared / (distanceSquared).squareRoot() - // forces[i] += vec * k - // return false - // } - // else { - // return true - // } - // } - // else { - // // empty leaf - // return false - // } - - guard t.delegate.accumulatedCount > 0 else { return false } - let centroid = t.delegate.accumulatedMassWeightedPositions / t.delegate.accumulatedMass - - let vec = centroid - sim.nodePositions[i] - let boxWidth = (t.box.p1 - t.box.p0)[0] - var distanceSquared = vec.jiggled().lengthSquared() - - let farEnough: Bool = (distanceSquared * self.theta2) > (boxWidth * boxWidth) - -// let distance = distanceSquared.squareRoot() - - if distanceSquared < self.distanceMin2 { - distanceSquared = (self.distanceMin2 * distanceSquared).squareRoot() - } - - if farEnough { - - guard distanceSquared < self.distanceMax2 else { return true } - - /// Workaround for "The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions" - let k: Double = - self.strength * alpha * t.delegate.accumulatedMass / distanceSquared // distanceSquared.squareRoot() - - f += vec * k - return false - - } else if t.children != nil { - return true - } - - - if t.isFilledLeaf { - -// for j in t.nodeIndices { -// if j != i { -// let k: Double = -// self.strength * alpha * self.precalculatedMass[j] / distanceSquared / distanceSquared.squareRoot() -// f += vec * k -// } -// } - if t.nodeIndices.contains(i) {return false} - - let massAcc = t.delegate.accumulatedMass -// t.nodeIndices.contains(i) ? (t.delegate.accumulatedMass-self.precalculatedMass[i]) : (t.delegate.accumulatedMass) - let k: Double = self.strength * alpha * massAcc / distanceSquared // distanceSquared.squareRoot() - f += vec * k - return false - } else { - return true - } - } - forces[i] = f - } -// return forces - } - -} - -extension ManyBodyForce.NodeMass: PrecalculatableNodeProperty { - public func calculated(for simulation: Simulation) -> [Double] { - switch self { - case .constant(let m): - return Array(repeating: m, count: simulation.nodePositions.count) - case .varied(let massGetter): - return simulation.nodeIds.map { n in - return massGetter(n) - } - } - } -} - -extension Simulation { - /// Create a many-body force. See: https://d3js.org/d3-force/many-body - @discardableResult - public func createManyBodyForce( - strength: Double, - nodeMass: ManyBodyForce.NodeMass = .constant(1.0) - ) -> ManyBodyForce { - let manyBodyForce = ManyBodyForce( - strength: strength, nodeMass: nodeMass) - manyBodyForce.simulation = self - self.forces.append(manyBodyForce) - return manyBodyForce - } -} diff --git a/Sources/ForceSimulation/forces/RadialForce.swift b/Sources/ForceSimulation/forces/RadialForce.swift deleted file mode 100644 index b0a11ac..0000000 --- a/Sources/ForceSimulation/forces/RadialForce.swift +++ /dev/null @@ -1,101 +0,0 @@ -// -// RadialForce.swift -// -// -// Created by li3zhen1 on 10/1/23. -// - -import NDTree - -/// A force that applies a radial force to all nodes. -/// Similar to https://d3js.org/d3-force/position -final public class RadialForce: ForceLike -where NodeID: Hashable, V: VectorLike, V.Scalar == Double { - weak var simulation: Simulation? { - didSet { - guard let sim = self.simulation else { return } - self.calculatedStrength = strength.calculated(for: sim) - self.calculatedRadius = radius.calculated(for: sim) - } - } - - public var center: V - - /// Radius accessor - public enum NodeRadius { - case constant( V.Scalar ) - case varied( (NodeID) -> V.Scalar ) - } - public var radius: NodeRadius - private var calculatedRadius: [V.Scalar] = [] - - /// Strength accessor - public enum Strength { - case constant(Double) - case varied( (NodeID) -> Double ) - } - public var strength: Strength - private var calculatedStrength: [Double] = [] - - - - - public init(center: V, radius: NodeRadius, strength: Strength) { - self.center = center - self.radius = radius - self.strength = strength - } - - public func apply(alpha: Double) { - guard let sim = self.simulation else { return } - for i in sim.nodePositions.indices { - let nodeId = i - let deltaPosition = (sim.nodePositions[i] - self.center).jiggled() - let r = deltaPosition.length() - let k = - (self.calculatedRadius[nodeId] - * self.calculatedStrength[nodeId] * alpha) / r - sim.nodeVelocities[i] += deltaPosition * k - } - } - -} - -extension RadialForce.Strength: PrecalculatableNodeProperty { - public func calculated(for simulation: Simulation) -> [Double] { - switch self { - case .constant(let s): - return simulation.nodeIds.map { _ in s } - case .varied(let s): - return simulation.nodeIds.map(s) - } - } -} - -extension RadialForce.NodeRadius: PrecalculatableNodeProperty { - public func calculated(for simulation: Simulation) -> [Double] { - switch self { - case .constant(let r): - return simulation.nodeIds.map { _ in r } - case .varied(let r): - return simulation.nodeIds.map(r) - } - } -} - -extension Simulation { - - /// Create a radial force, Similar to https://d3js.org/d3-force/position - @discardableResult - public func createRadialForce( - center: V = .zero, - radius: RadialForce.NodeRadius, - strength: RadialForce.Strength = .constant(0.1) - ) -> RadialForce { - let f = RadialForce(center: center, radius: radius, strength: strength) - f.simulation = self - self.forces.append(f) - return f - } - -} diff --git a/Sources/Grape/Contents/CompositedGraphContent.swift b/Sources/Grape/Contents/CompositedGraphContent.swift new file mode 100644 index 0000000..83bd982 --- /dev/null +++ b/Sources/Grape/Contents/CompositedGraphContent.swift @@ -0,0 +1,17 @@ +public protocol GraphComponent: GraphContent { + + associatedtype Body: GraphContent + + @inlinable + @GraphContentBuilder + var body: Body { get } +} + +extension GraphComponent { + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) + { + body._attachToGraphRenderingContext(&context) + } +} diff --git a/Sources/Grape/Contents/GraphContent.swift b/Sources/Grape/Contents/GraphContent.swift new file mode 100644 index 0000000..e15aedc --- /dev/null +++ b/Sources/Grape/Contents/GraphContent.swift @@ -0,0 +1,11 @@ +import SwiftUI + + +public protocol GraphContent { + associatedtype NodeID: Hashable + + @inlinable + func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) +} + + diff --git a/Sources/Grape/Contents/GraphContentBuilder.swift b/Sources/Grape/Contents/GraphContentBuilder.swift new file mode 100644 index 0000000..e72e86b --- /dev/null +++ b/Sources/Grape/Contents/GraphContentBuilder.swift @@ -0,0 +1,87 @@ +@resultBuilder +public struct GraphContentBuilder { + + public typealias Content = GraphContent + @inlinable + public static func buildPartialBlock(first content: T) -> T + where T.NodeID == NodeID { + return content + } + @inlinable + public static func buildPartialBlock(accumulated: T1, next: T2) -> some Content + where T1: Content, T2: Content, T1.NodeID == NodeID, T2.NodeID == NodeID, T1.NodeID == T2.NodeID + { + return _PairedGraphContent(accumulated, next) + } + @inlinable + public static func buildBlock() -> some Content { + return _EmptyGraphContent() + } + + /// Creates a list of graph contents from a for-loop. + /// + /// **Known issue**: + /// Type inference failes when the nested element is decorated with a modifier. + /// + /// **Workaround**: + /// - Use `ForEach` like in SwiftUI. This is the recommended way. + /// - Or create a you nested component comforming to `GraphComponent`, + /// and use this in your loop body, like the example below + /// + /// example: + /// ```swift + /// struct MyComponent: GraphComponent { + /// let i: Int + /// init(_ i: Int) { + /// self.i = i + /// } + /// var body: some GraphContent { + /// NodeMark(id: i) + /// .opacity(0.4) + /// } + /// } + /// ``` + /// Then use your component like this: + /// ```swift + /// let myGraph = buildGraph { + /// for i in 0..<10 { + /// MyComponent(i) + /// } + /// } + @inlinable + public static func buildArray(_ components: [T]) -> some Content + where T: Content, T.NodeID == NodeID { + return _ArrayGraphContent(components) + } + + // Opaque breaks type inference? + @inlinable + public static func buildEither(first component: T1) -> _ConditionalGraphContent + where T1: Content, T1.NodeID == NodeID, T2: Content, T2.NodeID == NodeID { + return _ConditionalGraphContent(.trueContent(component)) + } + + @inlinable + public static func buildEither(second component: T2) -> _ConditionalGraphContent + where T1: Content, T1.NodeID == NodeID, T2: Content, T2.NodeID == NodeID { + return _ConditionalGraphContent(.falseContent(component)) + } + + @inlinable + public static func buildLimitedAvailability(_ component: T?) -> some Content + where T: Content, T.NodeID == NodeID { + return _OptionalGraphContent(component) + } + + @inlinable + public static func buildIf(_ component: T?) -> some Content + where T: Content, T.NodeID == NodeID { + return _OptionalGraphContent(component) + } + + @inlinable + public static func buildExpression(_ expression: T) -> T + where T: Content, T.NodeID == NodeID { + return expression + } +} diff --git a/Sources/Grape/Contents/LinkMark.swift b/Sources/Grape/Contents/LinkMark.swift new file mode 100644 index 0000000..3c5a9e3 --- /dev/null +++ b/Sources/Grape/Contents/LinkMark.swift @@ -0,0 +1,84 @@ +import ForceSimulation +import SwiftUI + +public struct LinkMark: GraphContent & Identifiable { + + public enum LabelDisplayStrategy { + case auto + case specified(Bool) + case byPageRank((Double, Double) -> Bool) + } + + public enum LabelPositioning { + case auto + } + + public enum ArrowStyle { + case none + case triangle + } + + public var id: EdgeID + + // public var label: String? + // public var labelColor: Color + // public var labelDisplayStrategy: LabelDisplayStrategy + // public var labelPositioning: LabelPositioning + + public var strokeColor: Color + public var strokeWidth: Double + public var strokeDashArray: [Double]? + + public var arrowStyle: ArrowStyle + + @inlinable + public init( + from: NodeID, + to: NodeID, + label: String? = nil, + labelColor: Color = .gray, + labelDisplayStrategy: LabelDisplayStrategy = .auto, + labelPositioning: LabelPositioning = .auto, + strokeColor: Color = .gray.opacity(0.2), + strokeWidth: Double = 1.0, + strokeDashArray: [Double]? = nil, + arrowStyle: ArrowStyle = .none + ) { + self.id = .init(source: from, target: to) + // self.label = label + // self.labelColor = labelColor + // self.labelDisplayStrategy = labelDisplayStrategy + // self.labelPositioning = labelPositioning + self.strokeColor = strokeColor + self.strokeWidth = strokeWidth + self.strokeDashArray = strokeDashArray + self.arrowStyle = arrowStyle + } + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + context.linkOperations.append( + .init( + self, + context.states.currentStroke, + nil + ) + ) + context.states.currentID = .link(id.source, id.target) + } +} + +extension LinkMark: CustomDebugStringConvertible { + @inlinable + public var debugDescription: String { + return + "LinkMark(\(id.source) -> \(id.target))" + } +} + +extension LinkMark: Equatable { + @inlinable + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id + } +} diff --git a/Sources/Grape/Contents/ModifiedGraphContent.swift b/Sources/Grape/Contents/ModifiedGraphContent.swift new file mode 100644 index 0000000..9f60469 --- /dev/null +++ b/Sources/Grape/Contents/ModifiedGraphContent.swift @@ -0,0 +1,52 @@ +import SwiftUI + +public struct ModifiedGraphContent where C: GraphContent, M: GraphContentModifier { + + @usableFromInline + let content: C + + @usableFromInline + let modifier: M + + @inlinable + public init( + _ content: C, + _ modifier: M + ) { + self.content = content + self.modifier = modifier + } +} + +// public struct ModifiedGraphContent_Environment where C: GraphContent { +// @usableFromInline +// let content: C + +// @usableFromInline +// let keyPath: WritableKeyPath<_Grape.Environment, T> + +// @usableFromInline +// let value: T + +// @inlinable +// init( +// _ content: C, +// _ keyPath: WritableKeyPath<_Grape.Environment, T>, +// _ value: T +// ) { +// self.content = content +// self.keyPath = keyPath +// self.value = value +// } +// } + +extension ModifiedGraphContent: GraphContent { + public typealias NodeID = C.NodeID + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + modifier._into(&context) + content._attachToGraphRenderingContext(&context) + modifier._exit(&context) + } +} diff --git a/Sources/Grape/Contents/NodeMark.swift b/Sources/Grape/Contents/NodeMark.swift new file mode 100644 index 0000000..a037284 --- /dev/null +++ b/Sources/Grape/Contents/NodeMark.swift @@ -0,0 +1,81 @@ +import SwiftUI +import simd + +public struct NodeMark: GraphContent & Identifiable { + + public enum LabelDisplayStrategy { + case auto + case specified(Bool) + case byPageRank((Double) -> Bool) + } + + public enum LabelPositioning { + case bottomOfMark + case topOfMark + case startAfterMark + case endBeforeMark + } + + public var id: NodeID + + public var fill: Color + public var strokeColor: Color? + public var strokeWidth: Double + public var radius: Double + // public var label: String? + // public var labelColor: Color + // public var labelDisplayStrategy: LabelDisplayStrategy + // public var labelPositioning: LabelPositioning + @inlinable + public init( + id: NodeID, + fill: Color = .accentColor, + radius: Double = 4.0, + label: String? = nil, + labelColor: Color = .accentColor, + labelDisplayStrategy: LabelDisplayStrategy = .auto, + labelPositioning: LabelPositioning = .bottomOfMark, + strokeColor: Color? = nil, + strokeWidth: Double = 1 + ) { + self.id = id + self.fill = fill + self.radius = radius + // self.label = label + // self.labelColor = labelColor + // self.labelDisplayStrategy = labelDisplayStrategy + // self.labelPositioning = labelPositioning + + self.strokeColor = strokeColor + self.strokeWidth = strokeWidth + } + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + context.nodeOperations.append( + .init( + self, + context.states.currentShading, + context.states.currentStroke, + context.states.currentSymbolShape + ) + ) + context.states.currentID = .node(id) + context.nodeRadiusSquaredLookup[id] = simd_length_squared( + context.states.currentSymbolSizeOrDefault.simd) + } +} + +extension NodeMark: CustomDebugStringConvertible { + @inlinable + public var debugDescription: String { + return "Node(id: \(id))" + } +} + +extension NodeMark: Equatable { + @inlinable + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id && lhs.radius == rhs.radius + } +} diff --git a/Sources/Grape/Contents/_ArrayGraphContent.swift b/Sources/Grape/Contents/_ArrayGraphContent.swift new file mode 100644 index 0000000..dd8476d --- /dev/null +++ b/Sources/Grape/Contents/_ArrayGraphContent.swift @@ -0,0 +1,22 @@ +@usableFromInline +struct _ArrayGraphContent: GraphContent +where C: GraphContent { + public typealias NodeID = C.NodeID + + @usableFromInline + let storage: [C] + + @inlinable + public init( + _ storage: [C] + ) { + self.storage = storage + } + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + for content in storage { + content._attachToGraphRenderingContext(&context) + } + } +} \ No newline at end of file diff --git a/Sources/Grape/Contents/_ConditionalGraphContent.swift b/Sources/Grape/Contents/_ConditionalGraphContent.swift new file mode 100644 index 0000000..67c0670 --- /dev/null +++ b/Sources/Grape/Contents/_ConditionalGraphContent.swift @@ -0,0 +1,30 @@ +public struct _ConditionalGraphContent: GraphContent +where C1: GraphContent, C2: GraphContent, C1.NodeID == C2.NodeID { + public typealias NodeID = C1.NodeID + + + public enum Storage { + case trueContent(C1) + case falseContent(C2) + } + + @usableFromInline + let storage: Storage + + @inlinable + public init( + _ storage: Storage + ) { + self.storage = storage + } + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + switch storage { + case .trueContent(let content): + content._attachToGraphRenderingContext(&context) + case .falseContent(let content): + content._attachToGraphRenderingContext(&context) + } + } +} \ No newline at end of file diff --git a/Sources/Grape/Contents/_EmptyGraphContent.swift b/Sources/Grape/Contents/_EmptyGraphContent.swift new file mode 100644 index 0000000..8985451 --- /dev/null +++ b/Sources/Grape/Contents/_EmptyGraphContent.swift @@ -0,0 +1,11 @@ +@usableFromInline +struct _EmptyGraphContent: GraphContent { + @inlinable + public init() { + + } + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + + } +} \ No newline at end of file diff --git a/Sources/Grape/Contents/_ForEach+GraphContent.swift b/Sources/Grape/Contents/_ForEach+GraphContent.swift new file mode 100644 index 0000000..7c185bf --- /dev/null +++ b/Sources/Grape/Contents/_ForEach+GraphContent.swift @@ -0,0 +1,94 @@ +import SwiftUI + +public struct _GraphContentWrapper: GraphContent +where InnerGraphContent: GraphContent { + public typealias NodeID = InnerGraphContent.NodeID + + public let storage: InnerGraphContent + + @inlinable + init(_ content: InnerGraphContent) { + self.storage = content + } + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + storage._attachToGraphRenderingContext(&context) + } +} + +public protocol _GraphContentWrappingView: View { + associatedtype InnerGraphContent: GraphContent + @inlinable + var storage: InnerGraphContent { get } +} + +extension _GraphContentWrapper: _GraphContentWrappingView { + @inlinable + public var body: some View { + EmptyView() + } + + @inlinable + internal static func pullback(_ content: @escaping (T) -> InnerGraphContent) -> (T) -> Self { + return { element in + return .init(content(element)) + } + } + + @inlinable + internal static func pullback(id: KeyPath, _ content: @escaping (ID) -> InnerGraphContent) + -> (T) -> Self where ID: Hashable + { + return { element in + return .init(content(element[keyPath: id])) + } + } +} + +extension ForEach: GraphContent where Content: GraphContent { + public typealias NodeID = Content.NodeID + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + self.data.forEach { element in + self.content(element)._attachToGraphRenderingContext(&context) + } + } +} + +extension ForEach +where ID == Data.Element.ID, Content: _GraphContentWrappingView, Data.Element: Identifiable { + @inlinable + public init( + _ data: Data, + @GraphContentBuilder graphContent: @escaping (Data.Element) -> IG + ) + where + IG: GraphContent, + NodeID: Hashable, + Content == _GraphContentWrapper + { + let pb = _GraphContentWrapper.pullback(graphContent) + self.init(data, content: pb) + } + +} + +extension ForEach where Content: _GraphContentWrappingView { + @inlinable + public init( + _ data: Data, + id: KeyPath, + @GraphContentBuilder graphContent: @escaping (ID) -> IG + ) + where + IG: GraphContent, + NodeID: Hashable, + Content == _GraphContentWrapper, + ID: Hashable + { + let pb = _GraphContentWrapper.pullback(id: id, graphContent) + self.init(data, id: id, content: pb) + } +} diff --git a/Sources/Grape/Contents/_OptionalGraphContent.swift b/Sources/Grape/Contents/_OptionalGraphContent.swift new file mode 100644 index 0000000..21f4643 --- /dev/null +++ b/Sources/Grape/Contents/_OptionalGraphContent.swift @@ -0,0 +1,26 @@ + +@usableFromInline +struct _OptionalGraphContent: GraphContent +where C: GraphContent { + public typealias NodeID = C.NodeID + + @usableFromInline + let storage: C? + + @inlinable + public init( + _ storage: C? + ) { + self.storage = storage + } + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + switch storage { + case .none: + break + case .some(let content): + content._attachToGraphRenderingContext(&context) + } + } +} \ No newline at end of file diff --git a/Sources/Grape/Contents/_PairedGraphContent.swift b/Sources/Grape/Contents/_PairedGraphContent.swift new file mode 100644 index 0000000..782c372 --- /dev/null +++ b/Sources/Grape/Contents/_PairedGraphContent.swift @@ -0,0 +1,22 @@ +/// TODO: switch to Generic packs when same type requirements are supported +@usableFromInline +struct _PairedGraphContent: GraphContent +where C1: GraphContent, C2: GraphContent, NodeID: Hashable, C1.NodeID == NodeID, C2.NodeID == NodeID { + @usableFromInline + let first: C1 + + @usableFromInline + let second: C2 + + @inlinable + public init(_ first: C1, _ second: C2) { + self.first = first + self.second = second + } + + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + first._attachToGraphRenderingContext(&context) + second._attachToGraphRenderingContext(&context) + } +} \ No newline at end of file diff --git a/Sources/Grape/Descriptors/ForceDescriptor.swift b/Sources/Grape/Descriptors/ForceDescriptor.swift new file mode 100644 index 0000000..eb6cd68 --- /dev/null +++ b/Sources/Grape/Descriptors/ForceDescriptor.swift @@ -0,0 +1,153 @@ +import ForceSimulation +import simd + +public struct CenterForce: ForceDescriptor { + public var x: Double + public var y: Double + public var strength: Double + @inlinable + public init( + x: Double = 0.0, + y: Double = 0.0, + strength: Double = 0.5 + ) { + self.x = x + self.y = y + self.strength = strength + } + + public func createForce() -> Kinetics2D.CenterForce { + return .init(center: [x, y], strength: strength) + } + +} + +extension Kinetics.CenterForce where Vector == SIMD2 { + @inlinable + public init(descriptor: CenterForce) { + self.init(center: [descriptor.x, descriptor.y], strength: descriptor.strength) + } +} + +public struct ManyBodyForce: ForceDescriptor { + + public var strength: Double + public var mass: Kinetics2D.NodeMass + public var theta: Double + @inlinable + public init( + strength: Double = -30.0, + mass: Kinetics2D.NodeMass = .constant(1.0), + theta: Double = 0.9 + ) { + self.strength = strength + self.mass = mass + self.theta = theta + } + @inlinable + public func createForce() -> Kinetics2D.ManyBodyForce { + return .init(strength: self.strength, nodeMass: self.mass, theta: theta) + } + +} + +public struct LinkForce: ForceDescriptor { + public var stiffness: Kinetics2D.LinkStiffness + public var originalLength: Kinetics2D.LinkLength + public var iterationsPerTick: UInt + @usableFromInline var links: [EdgeID] + @inlinable + public init( + originalLength: Kinetics2D.LinkLength = .constant(30.0), + stiffness: Kinetics2D.LinkStiffness = .weightedByDegree { _, _ in 1.0 }, + iterationsPerTick: UInt = 1 + ) { + self.stiffness = stiffness + self.originalLength = originalLength + self.iterationsPerTick = iterationsPerTick + self.links = [] + } + @inlinable + public func createForce() -> Kinetics2D.LinkForce { + return .init( + stiffness: stiffness, originalLength: originalLength, + iterationsPerTick: iterationsPerTick) + } + // public func attachToSimulation(_ simulation: Simulation2D) { + // simulation.createLinkForce(links, stiffness: stiffness, originalLength: originalLength, iterationsPerTick: iterationsPerTick) + // } +} + +public struct CollideForce: ForceDescriptor { + public var strength: Double + public var radius: Kinetics2D.CollideRadius = .constant(3.0) + public var iterationsPerTick: UInt = 1 +@inlinable + public func createForce() -> Kinetics2D.CollideForce { + return .init( + radius: radius, strength: strength, iterationsPerTick: iterationsPerTick + ) + } +@inlinable + public init( + strength: Double = 0.5, + radius: Kinetics2D.CollideRadius = .constant(3.0), + iterationsPerTick: UInt = 1 + ) { + self.strength = strength + self.radius = radius + self.iterationsPerTick = iterationsPerTick + } + + // public func attachToSimulation(_ simulation: Simulation2D) { + // simulation.createCollideForce(radius: radius, strength: strength, iterationsPerTick: iterationsPerTick) + // } +} + +public struct PositionForce: ForceDescriptor { + + public var strength: Kinetics2D.PositionStrength + public var targetOnDirection: Kinetics2D.TargetOnDirection + public var direction: Kinetics2D.DirectionOfPositionForce +@inlinable + public init( + direction: Kinetics2D.DirectionOfPositionForce, + targetOnDirection: Kinetics2D.TargetOnDirection, + strength: Kinetics2D.PositionStrength = .constant(1.0) + ) { + self.strength = strength + self.direction = direction + self.targetOnDirection = targetOnDirection + } +@inlinable + public func createForce() -> Kinetics2D.PositionForce { + return .init( + direction: direction, + targetOnDirection: targetOnDirection, + strength: strength + ) + } +} + +public struct RadialForce: ForceDescriptor { + public var strength: Kinetics2D.RadialStrength + public var radius: Kinetics2D.CollideRadius = .constant(3.0) + public var center: SIMD2 = .zero + public var iterationsPerTick: UInt = 1 +@inlinable + public init( + center: SIMD2 = .zero, + strength: Kinetics2D.RadialStrength = .constant(1.0), + radius: Kinetics2D.CollideRadius = .constant(3.0), + iterationsPerTick: UInt = 1 + ) { + self.center = center + self.strength = strength + self.radius = radius + self.iterationsPerTick = iterationsPerTick + } +@inlinable + public func createForce() -> Kinetics2D.RadialForce { + return .init(center: center, radius: radius, strength: strength) + } +} diff --git a/Sources/Grape/Descriptors/SealedForce2DDescriptor.swift b/Sources/Grape/Descriptors/SealedForce2DDescriptor.swift new file mode 100644 index 0000000..f67444b --- /dev/null +++ b/Sources/Grape/Descriptors/SealedForce2DDescriptor.swift @@ -0,0 +1,76 @@ +// +// File.swift +// +// +// Created by li3zhen1 on 12/26/23. +// + +import ForceSimulation + +public struct SealedForceDescriptor2D { + public enum Entry: Equatable { + case center(Grape.CenterForce) + case link(Grape.LinkForce) + case manyBody(Grape.ManyBodyForce) + case position(Grape.PositionForce) + case collide(Grape.CollideForce) + case radial(Grape.RadialForce) + } + + @usableFromInline + var storage: [Entry] + + @inlinable + public init(_ entries: [Entry]) { + self.storage = entries + } +} + +extension SealedForceDescriptor2D: ForceDescriptor { + @inlinable + public func createForce() -> ForceSimulation.SealedForce2D { + let result = storage.map { + switch $0 { + case .center(let descriptor): + return ForceSimulation.SealedForce2D.ForceEntry.center( + descriptor.createForce() + ) + case .link(let descriptor): + return ForceSimulation.SealedForce2D.ForceEntry.link( + descriptor.createForce() + ) + case .manyBody(let descriptor): + return ForceSimulation.SealedForce2D.ForceEntry.manyBody( + descriptor.createForce() + ) + case .position(let descriptor): + return ForceSimulation.SealedForce2D.ForceEntry.position( + descriptor.createForce() + ) + case .collide(let descriptor): + + return ForceSimulation.SealedForce2D.ForceEntry.collide( + descriptor.createForce() + ) + case .radial(let descriptor): + return ForceSimulation.SealedForce2D.ForceEntry.radial( + descriptor.createForce() + ) + } + } + return ForceSimulation.SealedForce2D(result) + } + + @inlinable + static public func == (lhs: SealedForceDescriptor2D, rhs: SealedForceDescriptor2D) -> Bool { + return lhs.storage == rhs.storage + } +} + +@resultBuilder +public struct SealForceDescriptor2DBuilder { + @inlinable + public static func buildBlock() -> SealedForceDescriptor2D { + return SealedForceDescriptor2D([]) + } +} diff --git a/Sources/Grape/Models/ForceDirectedGraph2DController.swift b/Sources/Grape/Models/ForceDirectedGraph2DController.swift new file mode 100644 index 0000000..9fdc8b0 --- /dev/null +++ b/Sources/Grape/Models/ForceDirectedGraph2DController.swift @@ -0,0 +1,33 @@ +import Observation +import SwiftUI +import ForceSimulation + + +//@Observable +//public class ForceDirectedGraph2DProxy where NodeID: Hashable, ForceField: ForceProtocol, ForceField.Vector == SIMD2{ +// +// @ObservationIgnored +// @usableFromInline +// weak var layoutEngine: ForceDirectedGraph2DLayoutEngine? +// +// +// public var lastRenderedSize: CGSize = .init() +// +// +// public var draggingNodeID: NodeID? = nil +// +// @inlinable +// public init() { +// +// } +// +// @inlinable +// public func start() { +// layoutEngine?.start() +// } +// +// @inlinable +// public func stop() { +// layoutEngine?.stop() +// } +//} diff --git a/Sources/Grape/Models/ForceDirectedGraph2DLayoutEngine.swift b/Sources/Grape/Models/ForceDirectedGraph2DLayoutEngine.swift new file mode 100644 index 0000000..65b2f85 --- /dev/null +++ b/Sources/Grape/Models/ForceDirectedGraph2DLayoutEngine.swift @@ -0,0 +1,92 @@ +import ForceSimulation +import Observation +import SwiftUI +import Charts + +protocol LayoutEngine { + +} + +//@Observable +public class ForceDirectedGraph2DLayoutEngine: LayoutEngine & Observation.Observable & ObservableObject { + + public var simulation: Simulation2D + + @ObservationIgnored + public var lastRenderedSize: CGSize = .init() + + // var isRunning = false + + @ObservationIgnored + @usableFromInline + let frameRate: Double = 60.0 + + @ObservationIgnored + @usableFromInline + var scheduledTimer: Timer? = nil + + @inlinable + public init(initialSimulation: Simulation2D) { + self.simulation = initialSimulation + } + + @inlinable + func start() { + guard self.scheduledTimer == nil else { return } + self.scheduledTimer = Timer.scheduledTimer( + withTimeInterval: 1.0 / frameRate, + repeats: true + ) { [weak self] _ in + self?.tick() + } + } + + @inlinable + func stop() { + self.scheduledTimer?.invalidate() + self.scheduledTimer = nil + } + + @inlinable + func tick() { + withMutation(keyPath: \.simulation) { + // Task.detached { + self.simulation.tick() + // } +// DispatchQueue(label: "grape", qos:.background).async { +// simulation.tick() +// } + } + } + + @inlinable + func tickDetached() { + withMutation(keyPath: \.simulation) { + _ = Task.detached { + self.simulation.tick() + } +// DispatchQueue(label: "grape", qos:.background).async { +// simulation.tick() +// } + } + } + + @ObservationIgnored + @usableFromInline + let _$observationRegistrar = Observation.ObservationRegistrar() + + @inlinable + nonisolated func access( + keyPath: KeyPath + ) { + _$observationRegistrar.access(self, keyPath: keyPath) + } + + @inlinable + nonisolated func withMutation( + keyPath: KeyPath, + _ mutation: () throws -> MutationResult + ) rethrows -> MutationResult { + try _$observationRegistrar.withMutation(of: self, keyPath: keyPath, mutation) + } +} diff --git a/Sources/Grape/Modifiers/AnyGraphContentModifier.swift b/Sources/Grape/Modifiers/AnyGraphContentModifier.swift new file mode 100644 index 0000000..5658f1c --- /dev/null +++ b/Sources/Grape/Modifiers/AnyGraphContentModifier.swift @@ -0,0 +1,29 @@ +public struct AnyGraphContentModifier: GraphContentModifier { + + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + storage._into(&context) + } + + @inlinable + public func _exit( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + storage._exit(&context) + } + + @usableFromInline + let storage: any GraphContentModifier + + @inlinable + public init(erasing: T) { + self.storage = erasing + } + + @inlinable + public static func == (lhs: AnyGraphContentModifier, rhs: AnyGraphContentModifier) -> Bool { + return false + } +} diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.ForegroundStyle.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.ForegroundStyle.swift new file mode 100644 index 0000000..9cce7dc --- /dev/null +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.ForegroundStyle.swift @@ -0,0 +1,59 @@ +import SwiftUI + +extension GraphContentEffect { + @usableFromInline + internal struct ForegroundStyle where S: ShapeStyle { + @usableFromInline + let style: S + + @inlinable + public init(_ style: S) { + self.style = style + } + } + + @usableFromInline + internal struct Shading { + @usableFromInline + let shading: GraphicsContext.Shading + + @inlinable + public init(_ shading: GraphicsContext.Shading) { + self.shading = shading + } + } +} + + +extension GraphContentEffect.ForegroundStyle: GraphContentModifier { + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + let shading: GraphicsContext.Shading = .style(style) + context.states.shading.append(shading) + // context.operations.append(.updateShading(shading)) + } + + @inlinable + public func _exit(_ context: inout _GraphRenderingContext) where NodeID : Hashable { + context.states.shading.removeLast() + // context.operations.append( + // .updateShading(context.states.currentShading) + // ) + } +} + +extension GraphContentEffect.Shading: GraphContentModifier { + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + context.states.shading.append(shading) + } + + @inlinable + public func _exit(_ context: inout _GraphRenderingContext) where NodeID : Hashable { + context.states.shading.removeLast() + } +} \ No newline at end of file diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.Label.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.Label.swift new file mode 100644 index 0000000..ce9dd7e --- /dev/null +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.Label.swift @@ -0,0 +1,105 @@ +import SwiftUI + +extension GraphContentEffect { + @usableFromInline + internal struct Label { + + @usableFromInline + let text: Text? + + @usableFromInline + let alignment: Alignment + + @usableFromInline + let offset: CGVector + + @inlinable + public init( + _ text: Text?, + alignment: Alignment = .bottom, + offset: CGVector = .zero + ) { + self.text = text + self.alignment = alignment + self.offset = offset + } + } + +} + +extension GraphContentEffect.Label: GraphContentModifier { + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + + } + + @inlinable + @MainActor + public func _exit(_ context: inout _GraphRenderingContext) + where NodeID: Hashable { + guard let text = text else { return } + if let currentID = context.states.currentID { + let resolvedText = text.resolved() + context.resolvedTexts[currentID] = resolvedText + context.symbols[resolvedText] = .pending(text) + + switch currentID { + case .node(_): + if let currentSymbolSize = context.states.currentSymbolSize { + let anchorOffset = alignment.anchorOffset(for: currentSymbolSize) + context.textOffsets[currentID] = (alignment, offset.simd + anchorOffset) + } else { + context.textOffsets[currentID] = (alignment, offset.simd) + } + case .link(_, _): + context.textOffsets[currentID] = (alignment, offset.simd) + } + } + } +} + +extension Alignment { + @inlinable + internal func anchorOffset(for size: CGSize) -> SIMD2 { + // vertical text ? + switch vertical { + case .top: + return SIMD2(0, -Double(size.height) / 2) + case .center: + switch horizontal { + case .leading: + return SIMD2(Double(size.width) / 2, 0) + case .trailing: + return SIMD2(-Double(size.width) / 2, 0) + default: + return .zero + } + case .bottom: + return SIMD2(0, Double(size.height) / 2) + default: + return .zero + } + } + + @inlinable + internal func textImageOffsetInCGContext(width: Double, height: Double) -> SIMD2 { + let dx: Double = + switch horizontal { + case .center: -width / 2 + case .trailing: -width + case .leading: 0 + default: 0 + } + let dy: Double = + switch vertical { + case .center: height / 2 + case .bottom: height + case .top: 0 + default: 0 + } + + return SIMD2(dx, dy) + } +} diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.Opacity.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.Opacity.swift new file mode 100644 index 0000000..2bc0e60 --- /dev/null +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.Opacity.swift @@ -0,0 +1,27 @@ +extension GraphContentEffect { + @usableFromInline + internal struct Opacity { + @usableFromInline + let value: Double + + @inlinable + public init(_ value: Double) { + self.value = value + } + } +} + +extension GraphContentEffect.Opacity: GraphContentModifier { + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + context.states.opacity.append(value) + } + + @inlinable + public func _exit(_ context: inout _GraphRenderingContext) + where NodeID: Hashable { + context.states.opacity.removeLast() + } +} diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.PathShape.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.PathShape.swift new file mode 100644 index 0000000..3c6519a --- /dev/null +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.PathShape.swift @@ -0,0 +1,28 @@ +// import SwiftUI +// extension GraphContentEffect { +// @usableFromInline +// internal struct Shape { +// @usableFromInline +// let path: Path + +// @inlinable +// public init(_ path: Path) { +// self.path = path +// } +// } +// } + +// extension GraphContentEffect.Shape: GraphContentModifier { +// @inlinable +// public func _into( +// _ context: inout _GraphRenderingContext +// ) where NodeID: Hashable { +// context.states.shape.append(path) +// } + +// @inlinable +// public func _exit(_ context: inout _GraphRenderingContext) +// where NodeID: Hashable { +// context.states.shape.removeLast() +// } +// } diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.Stroke.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.Stroke.swift new file mode 100644 index 0000000..2598b30 --- /dev/null +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.Stroke.swift @@ -0,0 +1,57 @@ +import SwiftUI + +public enum StrokeColor: Equatable, Hashable { + case clip + case color(Color) +} + +extension StrokeStyle: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(lineWidth) + hasher.combine(lineCap) + hasher.combine(lineJoin) + hasher.combine(miterLimit) + hasher.combine(dash) + hasher.combine(dashPhase) + } +} + +extension GraphContentEffect { + @usableFromInline + internal struct Stroke: Equatable, Hashable { + + // @usableFromInline + // let shading: GraphicsContext.Shading + @usableFromInline + let color: StrokeColor + + @usableFromInline + let style: StrokeStyle? + + @inlinable + public init( + // _ shading: GraphicsContext.Shading, + _ color: StrokeColor = .clip, + _ style: StrokeStyle? = nil + ) { + self.color = color + self.style = style + } + } +} + + +extension GraphContentEffect.Stroke: GraphContentModifier { + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + context.states.stroke.append(self) + } + + @inlinable + public func _exit(_ context: inout _GraphRenderingContext) + where NodeID: Hashable { + context.states.stroke.removeLast() + } +} \ No newline at end of file diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.Symbol.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.Symbol.swift new file mode 100644 index 0000000..6336e8d --- /dev/null +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.Symbol.swift @@ -0,0 +1,37 @@ +import SwiftUI + +extension GraphContentEffect { + @usableFromInline + internal struct Symbol { + @usableFromInline + let shape: AnyShape + + @inlinable + public init(_ shape: S) where S: SwiftUI.Shape { + self.shape = .init(shape) + } + } +} + +extension GraphContentEffect.Symbol: GraphContentModifier { + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + let currentSize = context.states.currentSymbolSizeOrDefault + context.states.symbolShape.append( + shape.path( + in: CGRect( + origin: CGPoint(x: -currentSize.width / 2, y: -currentSize.height / 2), + size: currentSize + ) + ) + ) + } + + @inlinable + public func _exit(_ context: inout _GraphRenderingContext) + where NodeID: Hashable { + context.states.symbolShape.removeLast() + } +} diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.SymbolSize.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.SymbolSize.swift new file mode 100644 index 0000000..8320914 --- /dev/null +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.SymbolSize.swift @@ -0,0 +1,29 @@ +import SwiftUI + +extension GraphContentEffect { + @usableFromInline + internal struct SymbolSize { + @usableFromInline + let size: CGSize + + @inlinable + public init(_ size: CGSize) { + self.size = size + } + } +} + +extension GraphContentEffect.SymbolSize: GraphContentModifier { + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + context.states.symbolSize.append(size) + } + + @inlinable + public func _exit(_ context: inout _GraphRenderingContext) + where NodeID: Hashable { + context.states.symbolSize.removeLast() + } +} diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.swift new file mode 100644 index 0000000..421b6cf --- /dev/null +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.swift @@ -0,0 +1,2 @@ +@usableFromInline +enum GraphContentEffect {} diff --git a/Sources/Grape/Modifiers/GraphContent+GraphContentModifiers.swift b/Sources/Grape/Modifiers/GraphContent+GraphContentModifiers.swift new file mode 100644 index 0000000..85ec316 --- /dev/null +++ b/Sources/Grape/Modifiers/GraphContent+GraphContentModifiers.swift @@ -0,0 +1,102 @@ +import SwiftUI + +#if canImport(Charts) + import Charts +#endif + +extension GraphContent { + @inlinable + @_disfavoredOverload + public func foregroundStyle(_ style: S) -> some GraphContent + where S: SwiftUI.ShapeStyle { + return ModifiedGraphContent(self, GraphContentEffect.Shading(.style(style))) + } + + @inlinable + public func foregroundStyle(_ color: Color) -> some GraphContent { + return ModifiedGraphContent(self, GraphContentEffect.Shading(.color(color))) + } + + @inlinable + @_disfavoredOverload + public func symbol(_ shape: S) -> some GraphContent where S: SwiftUI.Shape { + return ModifiedGraphContent(self, GraphContentEffect.Symbol(shape)) + } + + #if canImport(Charts) + @inlinable + public func symbol(_ shape: BasicChartSymbolShape) -> some GraphContent { + return ModifiedGraphContent(self, GraphContentEffect.Symbol(shape)) + } + #endif + + @inlinable + public func symbolSize(_ size: CGSize) -> some GraphContent { + return ModifiedGraphContent(self, GraphContentEffect.SymbolSize(size)) + } + + @inlinable + public func symbolSize(radius: CGFloat) -> some GraphContent { + return ModifiedGraphContent( + self, + GraphContentEffect.SymbolSize( + CGSize(width: radius * 2, height: radius * 2) + )) + } + + @inlinable + @available(*, deprecated, message: "use foregroundStyle(_:)") + public func fill(_ shading: GraphicsContext.Shading) -> some GraphContent { + return ModifiedGraphContent(self, GraphContentEffect.Shading(shading)) + } + + @inlinable + public func label( + _ text: Text?, alignment: Alignment = .bottom, offset: CGVector = .zero + ) -> some GraphContent { + + return ModifiedGraphContent( + self, GraphContentEffect.Label(text, alignment: alignment, offset: offset)) + } + + @inlinable + public func label( + _ string: String?, alignment: Alignment = .bottom, offset: CGVector = .zero + ) -> some GraphContent { + return ModifiedGraphContent( + self, GraphContentEffect.Label(nil, alignment: alignment, offset: offset)) + } + + @inlinable + public func label( + _ alignment: Alignment = .bottom, offset: CGVector = .zero, @ViewBuilder _ text: () -> Text? + ) -> some GraphContent { + + return ModifiedGraphContent( + self, GraphContentEffect.Label(text(), alignment: alignment, offset: offset)) + } + + /// Sets the stroke style for this graph content. + /// + /// - When a `.clip` color is applied to node marks, the stroke color of the symbol + /// will be **the same as the background (cliped to transparent).** + /// - When a `.clip` color is applied to link marks, the stroke will not be drawn. + /// - When a `nil` stroke style is applied to node marks, the stroke style will be the same as the default stroke style. + @inlinable + public func stroke( + _ color: StrokeColor = .clip, + _ strokeStyle: StrokeStyle? = nil + ) -> some GraphContent { + return ModifiedGraphContent( + self, GraphContentEffect.Stroke(color, strokeStyle)) + } + + @inlinable + public func stroke( + _ color: Color, + _ strokeStyle: StrokeStyle? = nil + ) -> some GraphContent { + return ModifiedGraphContent( + self, GraphContentEffect.Stroke(.color(color), strokeStyle)) + } +} diff --git a/Sources/Grape/Modifiers/GraphContentModifier.swift b/Sources/Grape/Modifiers/GraphContentModifier.swift new file mode 100644 index 0000000..bd64cfd --- /dev/null +++ b/Sources/Grape/Modifiers/GraphContentModifier.swift @@ -0,0 +1,14 @@ +@_typeEraser(AnyGraphContentModifier) +public protocol GraphContentModifier { + + @inlinable + func _into( + _ context: inout _GraphRenderingContext + ) + + @inlinable + func _exit( + _ context: inout _GraphRenderingContext + ) + +} diff --git a/Sources/Grape/Utils/CoreGraphics+SIMD.swift b/Sources/Grape/Utils/CoreGraphics+SIMD.swift new file mode 100644 index 0000000..6119814 --- /dev/null +++ b/Sources/Grape/Utils/CoreGraphics+SIMD.swift @@ -0,0 +1,51 @@ +// +// CoreGraphics+SIMD.swift +// +// +// Created by li3zhen1 on 12/13/23. +// + +import SwiftUI +//#if canImport(SwiftUI) && canImport(simd) +import simd + +extension CGPoint { + @inlinable + internal var simd: SIMD2 { + return SIMD2(x: x, y: y) + } +} + +extension CGSize { + @inlinable + internal var simd: SIMD2 { + return SIMD2(x: width, y: height) + } +} + + +extension CGVector { + @inlinable + internal var simd: SIMD2 { + return SIMD2(x: dx, y: dy) + } +} + +extension SIMD2 where Scalar == Double { + @inlinable + internal var cgPoint: CGPoint { + return CGPoint(x: x, y: y) + } + + @inlinable + internal var cgSize: CGSize { + return CGSize(width: x, height: y) + } + + @inlinable + internal var cgVector: CGVector { + return CGVector(dx: x, dy: y) + } +} + +//#endif diff --git a/Sources/Grape/Utils/GraphProtocol.swift b/Sources/Grape/Utils/GraphProtocol.swift new file mode 100644 index 0000000..1fbb737 --- /dev/null +++ b/Sources/Grape/Utils/GraphProtocol.swift @@ -0,0 +1,65 @@ +import ForceSimulation + +protocol GraphProtocol { + associatedtype Node: Identifiable + associatedtype Edge: Identifiable where Edge.ID == EdgeID + + @inlinable + var nodes: [Node] { get set } + + @inlinable + var links: [Edge] { get set } +} + +extension GraphProtocol { + @inlinable + mutating func pruneLinks() { + let nodeDictionary = Dictionary(uniqueKeysWithValues: nodes.map { ($0.id, $0) }) + let nodeSet = Set(nodes.map { $0.id }) + // let linkSet = Set(links.map { $0.id }) + + // let nodesOccuredInLinkSet = Set(links.map { $0.id.source } + links.map { $0.id.target }) + + let validLinks = links.filter { + nodeSet.contains($0.id.source) && nodeSet.contains($0.id.target) + } + + self.nodes = nodeSet.map { nodeDictionary[$0]! } + + self.links = validLinks + } + + @inlinable + func isPruned() -> Bool { + guard nodes.count == Set(nodes.map { $0.id }).count else { + return false + } + + guard links.count == Set(links.map { $0.id }).count else { + return false + } + + guard + (links.allSatisfy { l in + nodes.contains(where: { $0.id == l.id.source }) + && nodes.contains(where: { $0.id == l.id.target }) + }) + else { + return false + } + return true + } + + @inlinable + func difference(from other: Self) -> (nodeDiff: CollectionDifference, edgeDiff: CollectionDifference) { + + #if DEBUG + assert(isPruned()) + #endif + + let nodeDiff = nodes.difference(from: other.nodes) { $0.id == $1.id } + let edgeDiff = links.difference(from: other.links) { $0.id == $1.id } + + return (nodeDiff, edgeDiff) + } +} diff --git a/Sources/Grape/Utils/KeyFrame.swift b/Sources/Grape/Utils/KeyFrame.swift new file mode 100644 index 0000000..cf31785 --- /dev/null +++ b/Sources/Grape/Utils/KeyFrame.swift @@ -0,0 +1,39 @@ +public struct KeyFrame { + public var elapsed: UInt = 0 + + @inlinable @inline(__always) + public init(rawValue: UInt) { + self.elapsed = rawValue + } + + @inlinable @inline(__always) + public mutating func advance(by delta: UInt = 1) { + elapsed &+= delta + } + + @inlinable @inline(__always) + public mutating func reset() { + elapsed = 0 + } +} + +extension KeyFrame: RawRepresentable, Equatable, Hashable, ExpressibleByIntegerLiteral { + + @inlinable @inline(__always) + public var rawValue: UInt { + return elapsed + } + + @inlinable @inline(__always) + public init(integerLiteral value: UInt) { + self.init(rawValue: value) + } + +} + +extension KeyFrame: CustomStringConvertible { + @inlinable + public var description: String { + return elapsed.description + } +} diff --git a/Sources/Grape/Utils/Transform.swift b/Sources/Grape/Utils/Transform.swift new file mode 100644 index 0000000..ed0e1c0 --- /dev/null +++ b/Sources/Grape/Utils/Transform.swift @@ -0,0 +1,139 @@ +public protocol TransformProtocol { + associatedtype Scalar: FloatingPoint & ExpressibleByFloatLiteral + associatedtype Vector: SIMD where Vector.Scalar == Scalar + + @inlinable + var translate: Vector { get set } + + @inlinable + var scale: Scalar { get set } + + @inlinable + init(translate: Vector, scale: Scalar) +} + +extension TransformProtocol { + + @inlinable + public static var identity: Self { + return Self(translate: .zero, scale: 1) + } + + @inlinable + public func apply(to point: Vector) -> Vector { + return point * scale + translate + } + + @inlinable + public func invert(_ point: Vector) -> Vector { + return (point - translate) / scale + } + + @inlinable + public func apply(to points: [Vector]) -> [Vector] { + return points.map(apply) + } + + @inlinable + public func translate(by delta: Vector) -> Self { + return Self(translate: translate + delta, scale: scale) + } + + @inlinable + public func translate(to point: Vector) -> Self { + return Self(translate: point, scale: scale) + } + + @inlinable + public mutating func translating(by delta: Vector) { + // self = Self(translate: translate + delta, scale: scale) + self.translate = translate + delta + } + + @inlinable + public mutating func translating(to point: Vector) { + // self = Self(translate: point, scale: scale) + self.translate = point + } + + @inlinable + public func scale(by delta: Scalar) -> Self { + return Self(translate: translate, scale: scale + delta) + } + + @inlinable + public func scale(to factor: Scalar) -> Self { + return Self(translate: translate, scale: factor) + } + + @inlinable + public mutating func scaling(by delta: Scalar) { + // self = Self(translate: translate, scale: scale * delta) + self.scale = scale * delta + } + + @inlinable + public mutating func scaling(to factor: Scalar) { + // self = Self(translate: translate, scale: factor) + self.scale = factor + } + +} + +public struct ViewportTransform: TransformProtocol { + public typealias Scalar = Double + public var translate: SIMD2 + + public var scale: Scalar + + @inlinable + public init(translate: SIMD2, scale: Scalar) { + self.translate = translate + self.scale = scale + } +} + +public struct VolumeTransform: TransformProtocol { + public typealias Scalar = Double + + // TODO: translate wastes 1 lane, + // combine translate and scale into a single SIMD4? + public var translate: SIMD3 + + public var scale: Scalar + + @inlinable + public init(translate: SIMD3, scale: Scalar) { + self.translate = translate + self.scale = scale + } +} + +#if canImport(SwiftUI) + + import SwiftUI + + extension ViewportTransform { + @inlinable + public func toCGAffineTransform() -> CGAffineTransform { + return CGAffineTransform( + a: CGFloat(scale), + b: 0, + c: 0, + d: CGFloat(scale), + tx: CGFloat(translate.x), + ty: CGFloat(translate.y) + ) + } + + @inlinable + public func fromCGAffineTransform(_ transform: CGAffineTransform) -> Self { + return Self( + translate: .init(x: Scalar(transform.tx), y: Scalar(transform.ty)), + scale: Scalar(transform.a) + ) + } + + } + +#endif diff --git a/Sources/Grape/Utils/View+CGImage.swift b/Sources/Grape/Utils/View+CGImage.swift new file mode 100644 index 0000000..2bc244e --- /dev/null +++ b/Sources/Grape/Utils/View+CGImage.swift @@ -0,0 +1,112 @@ +import CoreGraphics +import SwiftUI + +#if canImport(AppKit) + import AppKit + @inlinable + internal func getDisplayScale() -> CGFloat { + return NSScreen.main?.backingScaleFactor ?? 2.0 + } +#elseif canImport(UIKit) + import UIKit + @inlinable + internal func getDisplayScale() -> CGFloat { + return UIScreen.main.scale + } +#else + @inlinable + internal func getDisplayScale() -> CGFloat { + return 2.0 + } +#endif + +// #if os(macOS) +// import AppKit +// @inlinable +// func getCGContext() -> CGContext? { +// return NSGraphicsContext.current?.cgContext +// } +// #elseif os(iOS) +// import UIKit +// @inlinable +// func getCGContext() -> CGContext? { +// return UIGraphicsGetCurrentContext() +// } +// #endif + +// class CLD: NSObject, CALayerDelegate { +// func draw(_ layer: CALayer, in ctx: CGContext) { +// let text = "Hello World!" +// let font = NSFont.systemFont(ofSize: 72) +// let attributes = [NSAttributedString.Key.font: font] +// let attributedString = NSAttributedString(string: text, attributes: attributes) +// let line = CTLineCreateWithAttributedString(attributedString) +// let bounds = CTLineGetBoundsWithOptions(line, CTLineBoundsOptions.useOpticalBounds) +// ctx.textMatrix = .identity +// ctx.translateBy(x: 0, y: bounds.height) +// ctx.scaleBy(x: 1.0, y: -1.0) +// CTLineDraw(line, ctx) +// } +// } + +extension View { + @inlinable + @MainActor + internal func toCGImage(scaledBy factor: CGFloat) -> CGImage? { + let renderer = ImageRenderer( + content: self + ) + renderer.scale = factor + // guard let image = renderer.nsImage else { return nil } + // var imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) + // let imageRef = image.cgImage(forProposedRect: &imageRect, context: nil, hints: nil) + return renderer.cgImage + } + + @inlinable + @MainActor + internal func toCGImage(with environment: EnvironmentValues, antialias: Double = 1.5) -> CGImage? { + let renderer = ImageRenderer( + content: self.environment(\.self, environment) + ) + renderer.scale = environment.displayScale * antialias + + // guard let image = renderer.nsImage else { return nil } + // var imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) + // let imageRef = image.cgImage(forProposedRect: &imageRect, context: nil, hints: nil) + return renderer.cgImage + } + + // @inlinable + // @MainActor + // internal func toCGImage() -> CGImage? { + // let uicont + // return renderer.cgImage + // } + + // @inlinable + // @MainActor + // public func toCALayer() -> CALayer? { + // let renderer = ImageRenderer(content: self) + // if let context = getCGContext() { + // renderer.render(rasterizationScale: 2.0) { size, render in + // let caLayer = CALayer + // } + // } + // return renderer.cgImage + // } +} + +extension Text { + @inlinable + internal func resolved() -> String { + // This is an undocumented API + return self._resolveText(in: Self.resolvingEnvironment) + } + + @inlinable + static internal var resolvingEnvironment: EnvironmentValues { + return EnvironmentValues() + } + +} diff --git a/Sources/Grape/Views/ForceDirectedGraph+Gesture.swift b/Sources/Grape/Views/ForceDirectedGraph+Gesture.swift new file mode 100644 index 0000000..4c29a24 --- /dev/null +++ b/Sources/Grape/Views/ForceDirectedGraph+Gesture.swift @@ -0,0 +1,201 @@ +import ForceSimulation +import SwiftUI + +extension ForceDirectedGraph { + @inlinable + static var minimumAlphaAfterDrag: CGFloat { 0.5 } + @inlinable + internal func onDragChange( + _ value: SwiftUI.DragGesture.Value + ) { + if model.draggingNodeID == nil { + if let nodeID = model.findNode(at: value.startLocation) { + model.draggingNodeID = nodeID + } else { + model.backgroundDragStart = value.location.simd + } + } + guard let nodeID = model.draggingNodeID else { + if let dragStart = model.backgroundDragStart { + let delta = value.location.simd - dragStart + model.modelTransform.translate += delta + model.backgroundDragStart = value.location.simd + } + return + } + + if model.simulationContext.storage.kinetics.alpha > Self.minimumAlphaAfterDrag { + model.simulationContext.storage.kinetics.alpha = Self.minimumAlphaAfterDrag + } + + let newLocationInSimulation = model.finalTransform.invert(value.location.simd) + + if let nodeIndex = model.simulationContext.nodeIndexLookup[nodeID] { + model.simulationContext.storage.kinetics.fixation[ + nodeIndex + ] = newLocationInSimulation + } + + guard let action = model._onNodeDragChanged else { return } + action(nodeID, value.location) + + } + + @inlinable + internal func onDragEnd( + _ value: SwiftUI.DragGesture.Value + ) { + + guard let nodeID = model.draggingNodeID else { + if let dragStart = model.backgroundDragStart { + let delta = value.location.simd - dragStart + model.modelTransform.translate += delta + model.backgroundDragStart = value.location.simd + } + return + } + if model.simulationContext.storage.kinetics.alpha > Self.minimumAlphaAfterDrag { + model.simulationContext.storage.kinetics.alpha = Self.minimumAlphaAfterDrag + } + + model.draggingNodeID = nil + + guard let nodeIndex = model.simulationContext.nodeIndexLookup[nodeID] else { return } + if model._onNodeDragEnded == nil { + model.simulationContext.storage.kinetics.fixation[ + nodeIndex + ] = nil + } else if let action = model._onNodeDragEnded, action(nodeID, value.location) { + model.simulationContext.storage.kinetics.fixation[ + nodeIndex + ] = nil + } + } + + @inlinable + static var minimumDragDistance: CGFloat { 3.0 } +} + +extension ForceDirectedGraph { + @inlinable + internal func onTapGesture( + _ location: CGPoint + ) { + guard let action = self.model._onNodeTapped else { return } + let nodeID = self.model.findNode(at: location) + action(nodeID) + } +} + +extension ForceDirectedGraph { + + @inlinable + static var minimumScaleDelta: CGFloat { 0.001 } + + @inlinable + static var minimumScale: CGFloat { 0.25 } + + @inlinable + static var maximumScale: CGFloat { 4.0 } + + @inlinable + static var magnificationDecay: CGFloat { 0.1 } + + @inlinable + internal func clamp( + _ value: CGFloat, + min: CGFloat, + max: CGFloat + ) -> CGFloat { + Swift.min(Swift.max(value, min), max) + } + + @inlinable + internal func onMagnifyChange( + _ value: MagnifyGesture.Value + ) { + // print(value.magnification) + let alpha = -self.model.finalTransform.invert(value.startLocation.simd) + let oldScale = self.model.modelTransform.scale + let oldTranslate = self.model.modelTransform.translate + let newScale = clamp( + Darwin.cbrt(value.magnification) * oldScale, + min: Self.minimumScale, + max: Self.maximumScale) + let newTranslate = (oldScale - newScale) * alpha + oldTranslate + + let newModelTransform = ViewportTransform( + translate: newTranslate, + scale: newScale + ) + self.model.modelTransform = newModelTransform + + guard let action = self.model._onGraphMagnified else { return } + action() + } + + @inlinable + internal func onMagnifyEnd( + _ value: MagnifyGesture.Value + ) { + let alpha = -self.model.finalTransform.invert(value.startLocation.simd) + let oldScale = self.model.modelTransform.scale + let oldTranslate = self.model.modelTransform.translate + let newScale = clamp( + Darwin.cbrt(value.magnification) * oldScale, + min: Self.minimumScale, + max: Self.maximumScale + ) + let newTranslate = (oldScale - newScale) * alpha + oldTranslate + let newModelTransform = ViewportTransform( + translate: newTranslate, + scale: newScale + ) + // print("newModelTransform", newModelTransform) + self.model.modelTransform = newModelTransform + guard let action = self.model._onGraphMagnified else { return } + action() + } +} + +extension ForceDirectedGraph { + @inlinable + public func onTicked( + perform action: @escaping (KeyFrame) -> Void + ) -> Self { + self.model._onTicked = action + return self + } + + @inlinable + public func onNodeTapped( + perform action: @escaping (NodeID?) -> Void + ) -> Self { + self.model._onNodeTapped = action + return self + } + + @inlinable + public func onNodeDragChanged( + perform action: @escaping (NodeID, CGPoint) -> Void + ) -> Self { + self.model._onNodeDragChanged = action + return self + } + + @inlinable + public func onNodeDragEnded( + shouldBeFixed action: @escaping (NodeID, CGPoint) -> Bool + ) -> Self { + self.model._onNodeDragEnded = action + return self + } + + @inlinable + public func onGraphMagnified( + perform action: @escaping () -> Void + ) -> Self { + return self + } + +} diff --git a/Sources/Grape/Views/ForceDirectedGraph+View.swift b/Sources/Grape/Views/ForceDirectedGraph+View.swift new file mode 100644 index 0000000..d12c671 --- /dev/null +++ b/Sources/Grape/Views/ForceDirectedGraph+View.swift @@ -0,0 +1,95 @@ +import ForceSimulation +import SwiftUI + +extension ForceDirectedGraph: View { + + @inlinable + public var body: some View { + // HStack { + // #if DEBUG + // debugView + // #endif + // canvas + // } + canvas + .onChange( + of: self._graphRenderingContextShadow, + initial: false // Don't trigger on initial value, keep `changeMessage` as "N/A" + ) { _, newValue in + self.model.revive(for: newValue, with: .init(self._forceDescriptors)) + } + .onChange(of: self.isRunning, initial: false) { oldValue, newValue in + guard oldValue != newValue else { return } + if newValue { + self.model.start() + } else { + self.model.stop() + } + } + } + + // #if DEBUG + + @ViewBuilder + @inlinable + var debugView: some View { + VStack(alignment: .leading, spacing: 8.0) { + Text("Elapsed Time: \(model.currentFrame.rawValue)") + Divider() + Text(self.model.changeMessage) + Divider() + Button { + self.clickCount += 1 + } label: { + Text("Click \(clickCount)") + } + + ScrollView { + ForEach(self.model.graphRenderingContext.nodes, id: \.id) { node in + Text("\(node.debugDescription)") + } + }.frame(maxWidth: .infinity) + + } + .frame(width: 200.0) + } + + // #endif + + @MainActor + @ViewBuilder + @inlinable + var canvas: some View { + // #if DEBUG + // let _ = Self._printChanges() + // #endif + + Canvas { context, size in + let _ = model.currentFrame + self.model.render(&context, size) + } + .gesture( + DragGesture( + minimumDistance: Self.minimumDragDistance, + coordinateSpace: .local + ) + .onChanged(onDragChange) + .onEnded(onDragEnd) + ) + .gesture( + MagnifyGesture(minimumScaleDelta: Self.minimumScaleDelta) + .onChanged(onMagnifyChange) + .onEnded(onMagnifyEnd) + ) + .onTapGesture(count: 1, perform: onTapGesture) + } +} + +extension ForceDirectedGraph: Equatable { + @inlinable + public static func == (lhs: ForceDirectedGraph, rhs: ForceDirectedGraph) -> Bool + { + return lhs._graphRenderingContextShadow == rhs._graphRenderingContextShadow + // && lhs._forceDescriptors == rhs._forceDescriptors + } +} diff --git a/Sources/Grape/Views/ForceDirectedGraph.swift b/Sources/Grape/Views/ForceDirectedGraph.swift new file mode 100644 index 0000000..074e77d --- /dev/null +++ b/Sources/Grape/Views/ForceDirectedGraph.swift @@ -0,0 +1,76 @@ +import ForceSimulation +import SwiftUI + +public struct ForceDirectedGraph { + + @inlinable + @Environment(\.self) + var environmentValues: EnvironmentValues + + // the copy of the graph context to be used for comparison in `onChange` + // should be not used for rendering + @usableFromInline + let _graphRenderingContextShadow: _GraphRenderingContext + + @usableFromInline + let _forceDescriptors: [SealedForce2D.ForceEntry] + + // TBD: Some state to be retained when the graph is updated + @State + @inlinable + var clickCount = 0 + + // @State + @inlinable + var model: ForceDirectedGraphModel + { + @storageRestrictions(initializes: _model) + init(initialValue) { + _model = .init(initialValue: initialValue) + } + get { _model.wrappedValue } + set { _model.wrappedValue = newValue } + } + + @usableFromInline + var _model: State> + + @inlinable + var isRunning: Bool { + get { + _isRunning.wrappedValue + } + set { + _isRunning.wrappedValue = newValue + } + } + + @usableFromInline + var _isRunning: Binding + + @inlinable + public init( + _ _isRunning: Binding = .constant(true), + ticksPerSecond: Double = 60.0, + @GraphContentBuilder _ graph: () -> some GraphContent, + @SealedForce2DBuilder force: () -> [SealedForce2D.ForceEntry] = { [] }, + emittingNewNodesWithStates state: @escaping (NodeID) -> KineticState = { _ in + .init(position: .zero) + } + ) { + + var gctx = _GraphRenderingContext() + graph()._attachToGraphRenderingContext(&gctx) + self._graphRenderingContextShadow = gctx + self._isRunning = _isRunning + + self._forceDescriptors = force() + let force = SealedForce2D(self._forceDescriptors) + self.model = .init( + gctx, + force, + emittingNewNodesWith: state, + ticksPerSecond: ticksPerSecond + ) + } +} diff --git a/Sources/Grape/Views/ForceDirectedGraphModel+Observation.swift b/Sources/Grape/Views/ForceDirectedGraphModel+Observation.swift new file mode 100644 index 0000000..af4c0de --- /dev/null +++ b/Sources/Grape/Views/ForceDirectedGraphModel+Observation.swift @@ -0,0 +1,19 @@ +import Observation + +extension ForceDirectedGraphModel: Observation.Observable { + + @inlinable + nonisolated func access( + keyPath: KeyPath + ) { + _$observationRegistrar.access(self, keyPath: keyPath) + } + + @inlinable + nonisolated func withMutation( + keyPath: KeyPath, + _ mutation: () throws -> MutationResult + ) rethrows -> MutationResult { + try _$observationRegistrar.withMutation(of: self, keyPath: keyPath, mutation) + } +} diff --git a/Sources/Grape/Views/ForceDirectedGraphModel.findNode.swift b/Sources/Grape/Views/ForceDirectedGraphModel.findNode.swift new file mode 100644 index 0000000..fdbfe48 --- /dev/null +++ b/Sources/Grape/Views/ForceDirectedGraphModel.findNode.swift @@ -0,0 +1,37 @@ +import ForceSimulation +import SwiftUI +import simd + +extension ForceDirectedGraphModel { + @inlinable + internal func findNode( + at locationInSimulationCoordinate: SIMD2 + ) -> NodeID? { + for i in simulationContext.storage.kinetics.range.reversed() { + let iNodeID = simulationContext.nodeIndices[i] + guard + let iRadius2 = graphRenderingContext.nodeRadiusSquaredLookup[ + simulationContext.nodeIndices[i] + ] + else { continue } + let iPos = simulationContext.storage.kinetics.position[i] + + + if simd_length_squared(locationInSimulationCoordinate - iPos) <= iRadius2 + { + return iNodeID + } + } + return nil + } + + + @inlinable + internal func findNode( + at locationInViewportCoordinate: CGPoint + ) -> NodeID? { + let simulationLocation = self.finalTransform.invert(locationInViewportCoordinate.simd) + return findNode(at: simulationLocation) + } + +} diff --git a/Sources/Grape/Views/ForceDirectedGraphModel.swift b/Sources/Grape/Views/ForceDirectedGraphModel.swift new file mode 100644 index 0000000..8780007 --- /dev/null +++ b/Sources/Grape/Views/ForceDirectedGraphModel.swift @@ -0,0 +1,467 @@ +import ForceSimulation +import Foundation +import Observation +import SwiftUI + +// @Observable +public final class ForceDirectedGraphModel { + + @usableFromInline + var graphRenderingContext: _GraphRenderingContext + + @usableFromInline + var simulationContext: SimulationContext + + @usableFromInline + var modelTransform: ViewportTransform = .identity + + /// Moves the zero-centered simulation to final view + @usableFromInline + var finalTransform: ViewportTransform = .identity + + @usableFromInline + var viewportPositions: UnsafeArray> + + @usableFromInline + var draggingNodeID: NodeID? = nil + + @usableFromInline + var backgroundDragStart: SIMD2? = nil + + @usableFromInline + let velocityDecay: Double + + // cache this so text size don't change on monitor switch + @usableFromInline + var lastRasterizedScaleFactor: Double = 2.0 + + @usableFromInline + var _$changeMessage = "N/A" + + @usableFromInline + var _$currentFrame: KeyFrame = 0 + + @inlinable + var changeMessage: String { + @storageRestrictions(initializes: _$changeMessage) + init(initialValue) { + _$changeMessage = initialValue + } + + get { + access(keyPath: \.changeMessage) + return _$changeMessage + } + + set { + withMutation(keyPath: \.changeMessage) { + _$changeMessage = newValue + } + } + } + + @inlinable + var currentFrame: KeyFrame { + @storageRestrictions(initializes: _$currentFrame) + init(initialValue) { + _$currentFrame = initialValue + } + + get { + access(keyPath: \.currentFrame) + return _$currentFrame + } + set { + withMutation(keyPath: \.currentFrame) { + _$currentFrame = newValue + } + } + } + + /** Observation ignored params */ + + @usableFromInline + let ticksPerSecond: Double + + @usableFromInline + var scheduledTimer: Timer? = nil + + @usableFromInline + var _onTicked: ((KeyFrame) -> Void)? = nil + + @usableFromInline + var _onNodeDragChanged: ((NodeID, CGPoint) -> Void)? = nil + + @usableFromInline + var _onNodeDragEnded: ((NodeID, CGPoint) -> Bool)? = nil + + @usableFromInline + var _onNodeTapped: ((NodeID?) -> Void)? = nil + + @usableFromInline + var _onViewportTransformChanged: ((ViewportTransform, Bool) -> Void)? = nil + + @usableFromInline + var _onSimulationStabilized: (() -> Void)? = nil + + @usableFromInline + var _emittingNewNodesWith: (NodeID) -> KineticState + + @usableFromInline + var _onGraphMagnified: (() -> Void)? = nil + + @inlinable + init( + _ graphRenderingContext: _GraphRenderingContext, + _ forceField: consuming SealedForce2D, + emittingNewNodesWith: @escaping (NodeID) -> KineticState = { _ in + .init(position: .zero) + }, + ticksPerSecond: Double, + velocityDecay: Double + ) { + self.graphRenderingContext = graphRenderingContext + self.ticksPerSecond = ticksPerSecond + self._emittingNewNodesWith = emittingNewNodesWith + self.velocityDecay = velocityDecay + let _simulationContext = SimulationContext.create( + for: consume graphRenderingContext, + with: consume forceField, + velocityDecay: consume velocityDecay + ) + + _simulationContext.updateAllKineticStates(emittingNewNodesWith) + + self.simulationContext = consume _simulationContext + + self.viewportPositions = .createUninitializedBuffer( + count: self.simulationContext.storage.kinetics.position.count + ) + self.currentFrame = 0 + } + + @inlinable + convenience init( + _ graphRenderingContext: _GraphRenderingContext, + _ forceField: consuming SealedForce2D, + emittingNewNodesWith: @escaping (NodeID) -> KineticState = { _ in + .init(position: .zero) + }, + ticksPerSecond: Double + ) { + self.init( + graphRenderingContext, + forceField, + emittingNewNodesWith: emittingNewNodesWith, + ticksPerSecond: ticksPerSecond, + velocityDecay: 30 / ticksPerSecond + ) + } + + @inlinable + deinit { + stop() + } + + @usableFromInline + let _$observationRegistrar = Observation.ObservationRegistrar() + +} + +extension GraphicsContext.Shading { + @inlinable + static var defaultLinkShading: Self { + return .color(.displayP3, red: 0.5, green: 0.5, blue: 0.5, opacity: 0.3) + } + + @inlinable + static var defaultNodeShading: Self { + return .color(.primary) + } +} + +extension StrokeStyle { + @inlinable + static var defaultLinkStyle: Self { + return StrokeStyle(lineWidth: 1.0) + } +} + +// Render related +extension ForceDirectedGraphModel { + + @inlinable + func start() { + guard self.scheduledTimer == nil else { return } + self.scheduledTimer = Timer.scheduledTimer( + withTimeInterval: 1.0 / ticksPerSecond, + repeats: true + ) { [weak self] _ in + self?.tick() + } + } + + @inlinable + func tick() { + withMutation(keyPath: \.currentFrame) { + simulationContext.storage.tick() + currentFrame.advance() + } + _onTicked?(currentFrame) + } + + @inlinable + func stop() { + self.scheduledTimer?.invalidate() + self.scheduledTimer = nil + } + + @inlinable + @MainActor + func render( + _ graphicsContext: inout GraphicsContext, + _ size: CGSize + ) { + // should not invoke `access`, but actually does now ? + // print("Rendering frame \(_$currentFrame.rawValue)") + + let transform = modelTransform.translate(by: size.simd / 2) + + // var viewportPositions = [SIMD2]() + // viewportPositions.reserveCapacity(simulationContext.storage.kinetics.position.count) + for i in simulationContext.storage.kinetics.position.range { + viewportPositions[i] = transform.apply( + to: simulationContext.storage.kinetics.position[i]) + } + + self.finalTransform = transform + + for op in graphRenderingContext.linkOperations { + + guard let source = simulationContext.nodeIndexLookup[op.mark.id.source], + let target = simulationContext.nodeIndexLookup[op.mark.id.target] + else { + continue + } + + let sourcePos = viewportPositions[source] + let targetPos = viewportPositions[target] + + let p = + if let pathBuilder = op.path { + pathBuilder(sourcePos, targetPos) + } else { + Path { path in + path.move(to: sourcePos.cgPoint) + path.addLine(to: targetPos.cgPoint) + } + } + if let strokeEffect = op.stroke { + switch strokeEffect.color { + case .color(let color): + graphicsContext.stroke( + p, + with: .color(color), + style: strokeEffect.style ?? .defaultLinkStyle + ) + case .clip: + break + } + } else { + graphicsContext.stroke( + p, with: .defaultLinkShading, + style: .defaultLinkStyle + ) + } + } + + for op in graphRenderingContext.nodeOperations { + guard let id = simulationContext.nodeIndexLookup[op.mark.id] else { + continue + } + let pos = viewportPositions[id] + if let path = op.path { + graphicsContext.transform = .init(translationX: pos.x, y: pos.y) + graphicsContext.fill( + path, + with: op.fill ?? .defaultNodeShading + ) + if let strokeEffect = op.stroke { + switch strokeEffect.color { + case .color(let color): + graphicsContext.stroke( + path, + with: .color(color), + style: strokeEffect.style ?? .defaultLinkStyle + ) + case .clip: + graphicsContext.blendMode = .clear + graphicsContext.stroke( + path, + with: .color(.black), + style: strokeEffect.style ?? .defaultLinkStyle + ) + graphicsContext.blendMode = .normal + } + } + } else { + graphicsContext.transform = .identity + let rect = CGRect( + origin: (pos - op.mark.radius).cgPoint, + size: CGSize( + width: op.mark.radius * 2, height: op.mark.radius * 2 + ) + ) + graphicsContext.fill( + Path(ellipseIn: rect), + with: op.fill ?? .defaultNodeShading + ) + + if let strokeEffect = op.stroke { + switch strokeEffect.color { + case .color(let color): + graphicsContext.stroke( + Path(ellipseIn: rect), + with: .color(color), + style: strokeEffect.style ?? .defaultLinkStyle + ) + case .clip: + graphicsContext.blendMode = .clear + graphicsContext.stroke( + Path(ellipseIn: rect), + with: .color(.black), + style: strokeEffect.style ?? .defaultLinkStyle + ) + graphicsContext.blendMode = .normal + } + } + } + } + // return + graphicsContext.transform = .identity.concatenating(CGAffineTransform(scaleX: 1, y: -1)) + graphicsContext.withCGContext { cgContext in + + for (symbolID, resolvedTextContent) in graphRenderingContext.resolvedTexts { + + guard let resolvedStatus = graphRenderingContext.symbols[resolvedTextContent] + else { continue } + + // Look for rasterized symbol's image + var rasterizedSymbol: CGImage? = nil + switch resolvedStatus { + case .pending(let text): + let env = graphicsContext.environment + let cgImage = text.toCGImage( + with: env, + antialias: Self.textRasterizationAntialias + ) + lastRasterizedScaleFactor = env.displayScale + graphRenderingContext.symbols[resolvedTextContent] = .resolved(cgImage) + rasterizedSymbol = cgImage + case .resolved(let cgImage): + rasterizedSymbol = cgImage + } + + guard let rasterizedSymbol = rasterizedSymbol else { + continue + } + + // Start drawing + switch symbolID { + case .node(let nodeID): + guard let id = simulationContext.nodeIndexLookup[nodeID] else { + continue + } + let pos = viewportPositions[id] + if let textOffsetParams = graphRenderingContext.textOffsets[symbolID] { + let offset = textOffsetParams.offset + + let physicalWidth = + Double(rasterizedSymbol.width) / lastRasterizedScaleFactor + / Self.textRasterizationAntialias + let physicalHeight = + Double(rasterizedSymbol.height) / lastRasterizedScaleFactor + / Self.textRasterizationAntialias + + let textImageOffset = textOffsetParams.alignment.textImageOffsetInCGContext( + width: physicalWidth, height: physicalHeight) + + cgContext.draw( + rasterizedSymbol, + in: .init( + x: pos.x + offset.x + textImageOffset.x, // - physicalWidth / 2, + y: -pos.y - offset.y - textImageOffset.y, // - physicalHeight + width: physicalWidth, + height: physicalHeight + ) + ) + } + + case .link(let fromID, let toID): + guard let from = simulationContext.nodeIndexLookup[fromID], + let to = simulationContext.nodeIndexLookup[toID] + else { + continue + } + let center = (viewportPositions[from] + viewportPositions[to]) / 2 + if let textOffsetParams = graphRenderingContext.textOffsets[symbolID] { + let offset = textOffsetParams.offset + + let physicalWidth = + Double(rasterizedSymbol.width) / lastRasterizedScaleFactor + / Self.textRasterizationAntialias + let physicalHeight = + Double(rasterizedSymbol.height) / lastRasterizedScaleFactor + / Self.textRasterizationAntialias + + let textImageOffset = textOffsetParams.alignment.textImageOffsetInCGContext( + width: physicalWidth, height: physicalHeight) + + cgContext.draw( + rasterizedSymbol, + in: .init( + x: center.x + offset.x + textImageOffset.x, // - physicalWidth / 2, + y: -center.y - offset.y - textImageOffset.y, // - physicalHeight + width: physicalWidth, + height: physicalHeight + ) + ) + + } + } + } + } + + } + + @inlinable + static var textRasterizationAntialias: Double { + return 1.5 + } + + @inlinable + func revive( + for newContext: _GraphRenderingContext, + with newForceField: consuming SealedForce2D + ) { + // self.changeMessage = + // "gctx \(graphRenderingContext.nodes.count) -> \(newContext.nodes.count)" + + self.simulationContext.revive( + for: newContext, + with: newForceField, + velocityDecay: velocityDecay, + emittingNewNodesWith: self._emittingNewNodesWith + ) + self.graphRenderingContext = newContext + + /// Resize + if self.simulationContext.storage.kinetics.position.count != self.viewportPositions.count { + self.viewportPositions = .createUninitializedBuffer( + count: self.simulationContext.storage.kinetics.position.count + ) + } + debugPrint("[REVIVED]") + } + +} diff --git a/Sources/Grape/Views/GraphRenderingContext.swift b/Sources/Grape/Views/GraphRenderingContext.swift new file mode 100644 index 0000000..c35b51f --- /dev/null +++ b/Sources/Grape/Views/GraphRenderingContext.swift @@ -0,0 +1,57 @@ +import SwiftUI + +public struct _GraphRenderingContext { + @usableFromInline + enum TextResolvingStatus: Equatable { + case pending(Text) + case resolved(CGImage?) + } + + @usableFromInline + internal var resolvedTexts: [GraphRenderingStates.StateID: String] = [:] + + @usableFromInline + internal var textOffsets: + [GraphRenderingStates.StateID: (alignment: Alignment, offset: SIMD2)] = [:] + + @usableFromInline + internal var symbols: [String: TextResolvingStatus] = [:] + + @usableFromInline + internal var nodeOperations: [RenderOperation.Node] = [] + + @usableFromInline + internal var nodeRadiusSquaredLookup: [NodeID: Double] = [:] + + @usableFromInline + internal var linkOperations: [RenderOperation.Link] = [] + + @inlinable + internal init() { + + } + + @usableFromInline + internal var states = GraphRenderingStates() +} + +extension _GraphRenderingContext: Equatable { + @inlinable + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.symbols == rhs.symbols + && lhs.nodeOperations == rhs.nodeOperations + && lhs.linkOperations == rhs.linkOperations + } +} + +extension _GraphRenderingContext { + @inlinable + internal var nodes: [NodeMark] { + nodeOperations.map(\.mark) + } + + @inlinable + internal var edges: [LinkMark] { + linkOperations.map(\.mark) + } +} diff --git a/Sources/Grape/Views/GraphRenderingStates.swift b/Sources/Grape/Views/GraphRenderingStates.swift new file mode 100644 index 0000000..6a58b8e --- /dev/null +++ b/Sources/Grape/Views/GraphRenderingStates.swift @@ -0,0 +1,65 @@ +import SwiftUI + +@usableFromInline +internal struct GraphRenderingStates { + + @usableFromInline + enum StateID: Hashable { + case node(NodeID) + case link(NodeID, NodeID) + } + + @usableFromInline + var currentID: StateID? = nil + + @usableFromInline + var shading: [GraphicsContext.Shading] = [] + + @inlinable + var currentShading: GraphicsContext.Shading? { shading.last } + + @usableFromInline + var stroke: [GraphContentEffect.Stroke] = [] + + @inlinable + var currentStroke: GraphContentEffect.Stroke? { stroke.last } + + @usableFromInline + var opacity: [Double] = [] + + @inlinable + var currentOpacity: Double? { opacity.last } + + @usableFromInline + var symbolShape: [Path] = [] + + @inlinable + var currentSymbolShape: Path? { symbolShape.last } + + @usableFromInline + var symbolSize: [CGSize] = [] + + @inlinable + var currentSymbolSize: CGSize? { symbolSize.last } + + @inlinable + var currentSymbolSizeOrDefault: CGSize { symbolSize.last ?? defaultSymbolSize } + + @usableFromInline + let defaultShading: GraphicsContext.Shading + + @usableFromInline + let defaultSymbolSize = CGSize(width: 6, height: 6) + + @inlinable + init( + defaultShading: GraphicsContext.Shading = .color(.blue), + reservingCapacity capacity: Int = 128 + ) { + shading.reserveCapacity(capacity) + stroke.reserveCapacity(capacity) + opacity.reserveCapacity(capacity) + + self.defaultShading = defaultShading + } +} diff --git a/Sources/Grape/Views/RenderOperation.swift b/Sources/Grape/Views/RenderOperation.swift new file mode 100644 index 0000000..383a973 --- /dev/null +++ b/Sources/Grape/Views/RenderOperation.swift @@ -0,0 +1,96 @@ +import SwiftUI + +@usableFromInline +internal enum RenderOperation { + @usableFromInline + struct Node { + @usableFromInline + let mark: NodeMark + @usableFromInline + let fill: GraphicsContext.Shading? + @usableFromInline + let stroke: GraphContentEffect.Stroke? + @usableFromInline + let path: Path? + + @inlinable + init( + _ mark: NodeMark, + _ fill: GraphicsContext.Shading?, + _ stroke: GraphContentEffect.Stroke?, + _ path: Path? + ) { + self.mark = mark + self.fill = fill + self.stroke = stroke + self.path = path + } + } + + @usableFromInline + struct Link { + @usableFromInline + let mark: LinkMark + @usableFromInline + let stroke: GraphContentEffect.Stroke? + @usableFromInline + let path: ((SIMD2, SIMD2) -> Path)? + + @inlinable + init( + _ mark: LinkMark, + _ stroke: GraphContentEffect.Stroke?, + _ path: ((SIMD2, SIMD2) -> Path)? + ) { + self.mark = mark + self.stroke = stroke + self.path = path + } + } +} + +extension RenderOperation.Node: Equatable { + @inlinable + internal static func == (lhs: Self, rhs: Self) -> Bool { + let fillEq = lhs.fill == nil && rhs.fill == nil + let pathEq = lhs.path == nil && rhs.path == nil + return lhs.mark == rhs.mark + && fillEq + && lhs.stroke == rhs.stroke + && pathEq + } +} + +extension RenderOperation.Link: Equatable { + @inlinable + internal static func == (lhs: Self, rhs: Self) -> Bool { + let pathEq = lhs.path == nil && rhs.path == nil + return lhs.mark == rhs.mark + && lhs.stroke == rhs.stroke + && pathEq + } +} + +// @usableFromInline +// internal enum RenderingOperation { +// case node( +// NodeMark, +// GraphicsContext.Shading?, +// StrokeStyle?, +// ((SIMD2) -> Path)? +// ) +// case link( +// LinkMark, +// GraphicsContext.Shading?, +// StrokeStyle?, +// ((SIMD2, SIMD2) -> Path)? +// ) +// case label(Text, id: GraphRenderingStates.StateID) +// } + +// extension RenderingOperation: Equatable { +// @inlinable +// internal static func == (lhs: Self, rhs: Self) -> Bool { +// return false +// } +// } diff --git a/Sources/Grape/Views/SimulationContext.swift b/Sources/Grape/Views/SimulationContext.swift new file mode 100644 index 0000000..2d833bc --- /dev/null +++ b/Sources/Grape/Views/SimulationContext.swift @@ -0,0 +1,197 @@ +import ForceSimulation + + +public struct KineticState { + public let position: SIMD2 + public let velocity: SIMD2 + public let fixation: SIMD2? + @inlinable + public init( + position: SIMD2, + velocity: SIMD2 = .zero, + fixation: SIMD2? = nil + ) { + self.position = position + self.velocity = velocity + self.fixation = fixation + } +} + +@usableFromInline +internal struct SimulationContext { + + public typealias Vector = ForceField.Vector + public typealias ForceField = SealedForce2D + + @usableFromInline + internal var storage: Simulation2D + + @usableFromInline + internal var nodeIndexLookup: [NodeID: Int] + + @usableFromInline + internal var nodeIndices: [NodeID] + + @inlinable + internal init( + _ storage: consuming Simulation2D, + _ nodeIndexLookup: consuming [NodeID: Int], + _ nodeIndices: consuming [NodeID] + ) { + self.storage = consume storage + self.nodeIndexLookup = consume nodeIndexLookup + self.nodeIndices = consume nodeIndices + } + +} + +extension SimulationContext { + @inlinable + public static func create( + for graphRenderingContext: _GraphRenderingContext, + with forceField: consuming ForceField, + velocityDecay: Vector.Scalar + ) -> Self { + let nodes = graphRenderingContext.nodes + + let nodeIndexLookup = Dictionary( + uniqueKeysWithValues: nodes.enumerated().map { + ($0.element.id, $0.offset) + } + ) + + let links = graphRenderingContext.edges.map { + EdgeID( + source: nodeIndexLookup[$0.id.source]!, + target: nodeIndexLookup[$0.id.target]! + ) + } + return .init( + .init( + nodeCount: nodes.count, + links: consume links, + forceField: consume forceField, + velocityDecay: velocityDecay + ), + consume nodeIndexLookup, + nodes.map(\.id) + ) + } + + /// reuse the same simulation context for new graph + @inlinable + public mutating func revive( + for newContext: _GraphRenderingContext, + with newForceField: consuming ForceField, + velocityDecay: Vector.Scalar, + emittingNewNodesWith states: (NodeID) -> KineticState = { _ in .init(position: .zero) } + ) { + let newNodes = newContext.nodes + + let newNodeIndexLookup = Dictionary( + uniqueKeysWithValues: newNodes.enumerated().map { + ($0.element.id, $0.offset) + } + ) + + let newLinks = newContext.edges.map { + EdgeID( + source: newNodeIndexLookup[$0.id.source]!, + target: newNodeIndexLookup[$0.id.target]! + ) + } + + let newlyAddedNodes = newNodes.filter { newNode in + !nodeIndexLookup.keys.contains(newNode.id) + } + + let newlyAddedNodeStates = Dictionary( + uniqueKeysWithValues: newlyAddedNodes.map { + ($0.id, states($0.id)) + } + ) + + + + let newPosition = newNodes.map { + if let index = self.nodeIndexLookup[$0.id] { + return storage.kinetics.position[index] + } else { + if let newState = newlyAddedNodeStates[$0.id] { + return newState.position + } + return .zero + } + } + + let newVelocity = newNodes.map { + if let index = self.nodeIndexLookup[$0.id] { + return storage.kinetics.velocity[index] + } else { + if let newState = newlyAddedNodeStates[$0.id] { + return newState.velocity + } + return .zero + } + } + + let newFixation = newNodes.map { + if let index = self.nodeIndexLookup[$0.id] { + return storage.kinetics.fixation[index] + } else { + if let newState = newlyAddedNodeStates[$0.id] { + return newState.fixation + } + return nil + } + } + + let newStorage = Simulation2D( + nodeCount: newNodes.count, + links: consume newLinks, + forceField: consume newForceField, + velocityDecay: consume velocityDecay, + position: consume newPosition, + velocity: consume newVelocity, + fixation: consume newFixation + ) + + self = .init( + consume newStorage, + consume newNodeIndexLookup, + newNodes.map(\.id) + ) + } + + @inlinable + public func getKineticState(nodeID: NodeID) -> KineticState? { + if let index = nodeIndexLookup[nodeID] { + return .init( + position: storage.kinetics.position[index], + velocity: storage.kinetics.velocity[index], + fixation: storage.kinetics.fixation[index] + ) + } else { + return nil + } + } + + @inlinable + public func updateKineticState(nodeID: NodeID, _ state: KineticState) { + if let index = nodeIndexLookup[nodeID] { + storage.kinetics.position[index] = state.position + storage.kinetics.velocity[index] = state.velocity + storage.kinetics.fixation[index] = state.fixation + } + } + + @inlinable + public func updateAllKineticStates(_ states: (NodeID) -> KineticState) { + for (nodeID, index) in nodeIndexLookup { + let state = states(nodeID) + storage.kinetics.position[index] = state.position + storage.kinetics.velocity[index] = state.velocity + storage.kinetics.fixation[index] = state.fixation + } + } +} diff --git a/Sources/NDTree/NDBox.swift b/Sources/NDTree/NDBox.swift deleted file mode 100644 index a5d7d96..0000000 --- a/Sources/NDTree/NDBox.swift +++ /dev/null @@ -1,178 +0,0 @@ -// -// NDBox.swift -// -// -// Created by li3zhen1 on 10/14/23. -// - -/// A box in N-dimensional space. -/// - Note: `p0` is the minimum point of the box, `p1` is the maximum point of the box. -public struct NDBox where V: VectorLike { - /// the minimum anchor of the box - public var p0: V - - /// the maximum anchor of the box - public var p1: V - - /// Create a box with 2 anchors. - /// - Parameters: - /// - p0: anchor - /// - p1: another anchor in the diagonal position of `p0` - /// - Note: `p0` you pass does not have to be minimum point of the box. - /// `p1` does not have to be maximum point of the box. The initializer will - /// automatically adjust the order of `p0` and `p1` to make sure `p0` is the - /// minimum point of the box and `p1` is the maximum point of the box. - @inlinable public init(p0: V, p1: V) { - #if DEBUG - assert(p0 != p1, "NdBox was initialized with 2 same anchor") - #endif - var p0 = p0 - var p1 = p1 - for i in p0.indices { - if p1[i] < p0[i] { - swap(&p0[i], &p1[i]) - } - } - self.p0 = p0 - self.p1 = p1 - // TODO: use Mask - } - - /// Create a box with 2 anchors. - /// - Parameters: - /// - pMin: minimum anchor of the box - /// - pMax: maximum anchor of the box - /// - Note: Please make sure `pMin` is the minimum point of the box and `pMax` is the - /// maximum point of the box. - @inlinable internal init(pMin: V, pMax: V) { - #if DEBUG - assert(pMin != pMax, "NdBox was initialized with 2 same anchor") - #endif - self.p0 = pMin - self.p1 = pMax - } - - /// Create a box with 2 zero anchors. - @inlinable public init() { - p0 = .zero - p1 = .zero - } - - /// Create a box with 2 anchors. - /// - Parameters: - /// - p0: anchor - /// - p1: another anchor in the diagonal position of `p0` - /// - Note: `p0` you pass does not have to be minimum point of the box. - /// `p1` does not have to be maximum point of the box. The initializer will - /// automatically adjust the order of `p0` and `p1` to make sure `p0` is the - /// minimum point of the box and `p1` is the maximum point of the box. - public init(_ p0: V, _ p1: V) { - self.init(p0: p0, p1: p1) - } - -} - -extension NDBox { - @inlinable var diagnalVector: V { - return p1 - p0 - } - - @inlinable var center: V { (p1 + p0) / V.Scalar(2) } - - /// Test if the box contains a point. - /// - Parameter point: N dimensional point - /// - Returns: `true` if the box contains the point, `false` otherwise. - /// The boundary test is similar to ..< operator. - @inlinable func contains(_ point: V) -> Bool { - for i in point.indices { - if p0[i] > point[i] || point[i] >= p1[i] { - return false - } - } - return true - // return (p0 <= point) && (point < p1) - } -} - -extension NDBox { - @inlinable func getCorner(of direction: Int) -> V { - var corner = V.zero - for i in 0..> i) & 0b1) == 1 ? p1[i] : p0[i] - } - return corner - } - - - @inlinable public var debugDescription: String { - return "[\(p0), \(p1)]" - } -} - - -public extension NDBox { - - /// Get the small box that contains a list points and guarantees the box's size is at least 1x..x1. - /// - Parameter points: The points to be covered. - /// - Returns: The box that contains all the points. - @inlinable static func cover(of points: [V]) -> Self { - - var _p0 = points[0] - var _p1 = points[0] - - for p in points { - for i in p.indices { - if p[i] < _p0[i] { - _p0[i] = p[i] - } - if p[i] >= _p1[i] { - _p1[i] = p[i] + 1 - } - } - } - - #if DEBUG - let _box = Self(_p0, _p1) - assert(points.allSatisfy{ p in - _box.contains(p) - }) - #endif - - return Self(_p0, _p1) - } - - /// Get the small box that contains a list points and guarantees the box's size is at least 1x..x1. - /// Please note that KeyPath is slow. - /// - /// - Parameter - /// - points: The points to be covered. - /// - keyPath: The key path to get the vector from the point. - /// - Returns: The box that contains all the points. - @inlinable static func cover(of points: [T], keyPath: KeyPath) -> Self { - - var _p0 = points[0][keyPath: keyPath] - var _p1 = points[0][keyPath: keyPath] - - for _p in points { - let p = _p[keyPath: keyPath] - for i in p.indices { - if p[i] < _p0[i] { - _p0[i] = p[i] - } - if p[i] >= _p1[i] { - _p1[i] = p[i] + 1 - } - } - } - - #if DEBUG - let _box = Self(_p0, _p1) - assert(points.allSatisfy{ p in - _box.contains(p[keyPath: keyPath]) - }) - #endif - - return Self(_p0, _p1) - } -} - diff --git a/Sources/NDTree/NDTree+Traversable.swift b/Sources/NDTree/NDTree+Traversable.swift deleted file mode 100644 index ee11198..0000000 --- a/Sources/NDTree/NDTree+Traversable.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// File.swift -// -// -// Created by li3zhen1 on 10/16/23. -// - -public protocol Traversable { - - @inlinable func visit( - shouldVisitChildren: (Self) -> Bool - ) - - @inlinable func visitPostOrdered( - _ action: (Self) -> () - ) - -} - - -extension NDTree: Traversable { - - /// Visit the tree in pre-order. - /// - Parameter shouldVisitChildren: a closure that returns a boolean value indicating whether should continue to visit children. - @inlinable public func visit(shouldVisitChildren: (NDTree) -> Bool) { - if shouldVisitChildren(self), let children { - // this is an internal node - for t in children { - t.visit(shouldVisitChildren: shouldVisitChildren) - } - } - } - - /// Visit the tree in post-order. - /// - Parameter action: a closure that takes a tree as its argument. - @inlinable public func visitPostOrdered( - _ action: (NDTree) -> () - ) { - if let children { - for c in children { - c.visitPostOrdered(action) - } - } - action(self) - } -} diff --git a/Sources/NDTree/NDTree.swift b/Sources/NDTree/NDTree.swift deleted file mode 100644 index 6d59aad..0000000 --- a/Sources/NDTree/NDTree.swift +++ /dev/null @@ -1,308 +0,0 @@ -// -// NDTree.swift -// -// -// Created by li3zhen1 on 10/14/23. -// - -/// The data structure carried by a node of NDTree -/// It receives notifications when a node is added or removed on a node, regardless of whether the node is internal or leaf. -/// It is designed to calculate properties like a box's center of mass. -public protocol NDTreeDelegate { - associatedtype NodeID: Hashable - associatedtype V: VectorLike - - mutating func didAddNode(_ node: NodeID, at position: V) - - mutating func didRemoveNode(_ node: NodeID, at position: V) - - /// Copy object. This method is called when the root box is not large enough to cover the new nodes. - /// The method - func copy() -> Self - - /// Create new object with properties set to initial value as if the box is empty. - /// However, you can still carry something like a closure to get information from outside. - /// This method is called when a leaf box is splited due to the insertion of a new node in this box. - func spawn() -> Self -} - -/// A node in NDTree -/// - Note: `NDTree` is a generic type that can be used in any dimension. -/// `NDTree` is a reference type. -public final class NDTree where V: VectorLike, D: NDTreeDelegate, D.V == V { - - public typealias NodeIndex = D.NodeID - - public typealias Direction = Int - - public typealias Box = NDBox - - public private(set) var box: Box - - public private(set) var children: [NDTree]? - - public private(set) var nodePosition: V? - public private(set) var nodeIndices: [NodeIndex] - - public let clusterDistance: V.Scalar - private let clusterDistanceSquared: V.Scalar - - - public private(set) var delegate: D - - private init( - box: Box, - clusterDistance: V.Scalar, - parentDelegate: D - ) { - self.box = box - self.clusterDistance = clusterDistance - self.clusterDistanceSquared = clusterDistance * clusterDistance - self.nodeIndices = [] - self.delegate = parentDelegate.spawn() - } - - - public init( - box: Box, - clusterDistance: V.Scalar, - buildRootDelegate: () -> D - ) { - self.box = box - self.clusterDistance = clusterDistance - self.clusterDistanceSquared = clusterDistance * clusterDistance - self.nodeIndices = [] - self.delegate = buildRootDelegate() - } - - public convenience init( - covering nodes: [NodeIndex: V], - clusterDistance: V.Scalar, - buildRootDelegate: () -> D - ) { - let coveringBox = Box.cover(of: Array(nodes.values)) - self.init(box: coveringBox, - clusterDistance: clusterDistance, - buildRootDelegate: buildRootDelegate) - for (i, p) in nodes { - add(i, at: p) - } - } - - - public func add(_ nodeIndex: NodeIndex, at point: V) { - cover(point) - - addWithoutCover(nodeIndex, at: point) - - } - - private func addWithoutCover(_ nodeIndex: NodeIndex, at point: V) { - defer { - delegate.didAddNode(nodeIndex, at: point) - } - - guard let children = self.children else { - if nodePosition == nil { - nodeIndices.append(nodeIndex) - nodePosition = point - return - } - else if nodePosition == point || nodePosition!.distanceSquared(to: point) < clusterDistanceSquared { - nodeIndices.append(nodeIndex) - return - } - else { - - let spawned = Self.spawnChildren( - box, -// V.directionCount, - clusterDistance, - /*&*/delegate - ) - - if let nodePosition { - let direction = getIndexInChildren(nodePosition, relativeTo: box.center) - spawned[direction].nodeIndices = self.nodeIndices - spawned[direction].nodePosition = self.nodePosition - spawned[direction].delegate = self.delegate.copy() -// self.delegate = self.delegate.copy() - - - -// for ni in nodeIndices { -// delegate.didAddNode(ni, at: nodePosition) -// } - - self.nodeIndices = [] - self.nodePosition = nil - } - - let directionOfNewNode = getIndexInChildren(point, relativeTo: box.center) - spawned[directionOfNewNode].addWithoutCover(nodeIndex, at: point) - - self.children = spawned - return - - } - } - - let directionOfNewNode = getIndexInChildren(point, relativeTo: box.center) - children[directionOfNewNode].addWithoutCover(nodeIndex, at: point) - - return - } - - private func cover(_ point: V) { - if box.contains(point) { return } - - repeat { - let direction = getIndexInChildren(point, relativeTo: box.p0) - expand(towards: direction) - } while !box.contains(point) - } - - - private func expand(towards direction: Direction) { - let nailedDirection = (V.directionCount - 1) - direction - let nailedCorner = box.getCorner(of: nailedDirection) - - let _corner = box.getCorner(of: direction) - let expandedCorner = (_corner+_corner) - nailedCorner - - let newRootBox = Box(nailedCorner, expandedCorner) - - let copiedCurrentNode = shallowCopy() - var spawned = Self.spawnChildren( - newRootBox, -// V.directionCount, - clusterDistance, - /*&*/delegate - ) - - spawned[nailedDirection] = copiedCurrentNode - - self.box = newRootBox - self.children = spawned - self.nodeIndices = [] - self.delegate = delegate.copy() - - } - - private static func spawnChildren( - _ _box: Box, - _ _clusterDistance: V.Scalar, - _ _delegate: D - ) -> [NDTree] { - - -// var spawned = Array(repeating: _box, count: _directionCount) -// -// -// -// let center = _box.center -// -// for j in spawned.indices { -// for i in 0..> i) & 0b1 -// -// // TODO: use simd mask -// if isOnTheHigherRange != 0 { -// spawned[j].p0[i] = center[i] -// } else { -// spawned[j].p1[i] = center[i] -// } -// } -// } -// var result = [NDTree]() -// result.reserveCapacity(_directionCount) -// for b in spawned { -// result.append(NDTree(box: b, clusterDistance: _clusterDistance, parentDelegate: /*&*/_delegate)) -// } - - var result = [NDTree]() - result.reserveCapacity(V.directionCount) - let center = _box.center - - for j in 0..> i) & 0b1 - - // TODO: use simd mask - if isOnTheHigherRange != 0 { - __box.p0[i] = center[i] - } else { - __box.p1[i] = center[i] - } - } - result.append(NDTree(box: __box, clusterDistance: _clusterDistance, parentDelegate: /*&*/_delegate)) - } - - return result - } - - /// Copy object while holding the same reference to children - private func shallowCopy() -> NDTree { - let copy = NDTree(box: box, clusterDistance: clusterDistance, parentDelegate: /*&*/delegate) - - copy.nodeIndices = nodeIndices - copy.nodePosition = nodePosition - copy.children = children - copy.delegate = delegate - - return copy - } - - - private func getIndexInChildren(_ point: V, relativeTo originalPoint: V) -> Int { - var index = 0 - for i in 0..= originalPoint[i] { // isOnHigherRange in this dimension - index |= (1 << i) - } - } - return index - } - -} - -extension NDTree where D.NodeID == Int { - public convenience init( - covering points: [V], - clusterDistance: V.Scalar, - buildRootDelegate: () -> D - ) { - let coveringBox = Box.cover(of: points) - self.init(box: coveringBox, clusterDistance: clusterDistance, buildRootDelegate: buildRootDelegate) - for i in points.indices { - add(i, at: points[i]) - } - } - - public convenience init( - covering points: [T], - keyPath: KeyPath, - clusterDistance: V.Scalar, - buildRootDelegate: () -> D - ) { - let coveringBox = Box.cover(of: points, keyPath: keyPath) - self.init(box: coveringBox, clusterDistance: clusterDistance, buildRootDelegate: buildRootDelegate) - for i in points.indices { - add(i, at: points[i][keyPath: keyPath]) - } - } -} - - - -extension NDTree { - @inlinable public var extent: Box { box } - - @inlinable public var isLeaf: Bool { children == nil } - @inlinable public var isInternalNode: Bool { children != nil } - - @inlinable public var isFilledLeaf: Bool { nodePosition != nil } - @inlinable public var isEmptyLeaf: Bool { nodePosition == nil } - -} diff --git a/Sources/NDTree/Quadtree+Octree.swift b/Sources/NDTree/Quadtree+Octree.swift deleted file mode 100644 index da2f625..0000000 --- a/Sources/NDTree/Quadtree+Octree.swift +++ /dev/null @@ -1,102 +0,0 @@ -// -// File 2.swift -// -// -// Created by li3zhen1 on 10/13/23. -// - -#if canImport(simd) - - import simd - extension simd_double2: VectorLike { - - @inlinable public func lengthSquared() -> Double { - return x * x + y * y - } - - @inlinable public func length() -> Double { - return (x * x + y * y).squareRoot() - } - - @inlinable public func distanceSquared(to: SIMD2) -> Scalar { - return (self - to).lengthSquared() - } - - @inlinable public func distance(to: SIMD2) -> Scalar { - return (self - to).length() - } - - - public static let directionCount = 4 - } - - extension simd_double3: VectorLike { - - @inlinable public func lengthSquared() -> Double { - return x * x + y * y + z * z - } - - @inlinable public func length() -> Double { - return (x * x + y * y + z * z).squareRoot() - } - - @inlinable public func distanceSquared(to: SIMD3) -> Scalar { - return (self - to).lengthSquared() - } - - @inlinable public func distance(to: SIMD3) -> Scalar { - return (self - to).length() - } - - public static let directionCount = 8 - } - - - - - public typealias Vector2d = simd_double2 - public typealias Vector3d = simd_double3 - - public protocol QuadtreeDelegate: NDTreeDelegate where V == Vector2d {} - public protocol OctreeDelegate: NDTreeDelegate where V == Vector3d {} - - - public typealias QuadBox = NDBox - public typealias OctBox = NDBox - - public typealias Quadtree = NDTree - public typealias Octree = NDTree - - - -/// Uncomment the region below to unlock 4d tree - -// extension simd_double4: VectorLike { -// -// @inlinable public func lengthSquared() -> Double { -// return x * x + y * y + z * z + w * w -// } -// -// @inlinable public func length() -> Double { -// return (x * x + y * y + z * z + w * w).squareRoot() -// } -// -// @inlinable public func distanceSquared(to: SIMD4) -> Scalar { -// return (self - to).lengthSquared() -// } -// -// @inlinable public func distance(to: SIMD4) -> Scalar { -// return (self - to).length() -// } -// public static let directionCount = 16 -// } -// public typealias Vector4d = simd_double4 -// public protocol HyperoctreeDelegate: NDTreeDelegate where V == Vector4d {} -// public typealias HyperoctBox = NDBox -// public typealias Hyperoctree = NDTree - - - - - -#endif diff --git a/Sources/NDTree/VectorLike.swift b/Sources/NDTree/VectorLike.swift deleted file mode 100644 index eb6a9c7..0000000 --- a/Sources/NDTree/VectorLike.swift +++ /dev/null @@ -1,93 +0,0 @@ -// -// VectorLike.swift -// -// -// Created by li3zhen1 on 10/13/23. -// - - - -/// A vector-like type that can be used in a `ForceSimulation`. -/// The members required by `VectorLike` are basically the same as `simd`'s `SIMD` protocol. -/// `NDTree` only rely on this protocol so that you can implement your structure on the platforms -/// that do not support `simd`. -public protocol VectorLike: CustomStringConvertible, Decodable, Encodable, ExpressibleByArrayLiteral, Hashable { - - /// The children count of a node in NDTree. - /// Should be equal to the 2^(dimension of the vector). - /// For example, a 2D vector should have 4 children, a 3D vector should have 8 children. - /// This property should be implemented even if you are using `simd`. - static var directionCount: Int { get } - - - associatedtype Scalar: FloatingPoint, Decodable, Encodable, Hashable, CustomDebugStringConvertible - - /// The length of the vector squared. - /// This property should be implemented even if you are using `simd`. - @inlinable func lengthSquared() -> Scalar - - /// The length of the vector. - /// This property should be implemented even if you are using `simd`. - @inlinable func length() -> Scalar - - /// The distance to another vector, squared. - /// This property should be implemented even if you are using `simd`. - @inlinable func distanceSquared(to: Self) -> Scalar - - /// The distance to another vector. - /// This property should be implemented even if you are using `simd`. - @inlinable func distance(to: Self) -> Scalar - - - @inlinable static func * (a: Self, b: Double) -> Self - @inlinable static func / (a: Self, b: Double) -> Self - - @inlinable static func * (a: Self, b: Scalar) -> Self - @inlinable static func / (a: Self, b: Scalar) -> Self - @inlinable static func - (a: Self, b: Self) -> Self - @inlinable static func + (a: Self, b: Self) -> Self - - - @inlinable static func + (a: Self, b: Scalar) -> Self - - @inlinable static func += (a: inout Self, b: Self) - @inlinable static func -= (a: inout Self, b: Self) - @inlinable static func *= (a: inout Self, b: Scalar) - @inlinable static func /= (a: inout Self, b: Scalar) - - @inlinable static var scalarCount: Int { get } - @inlinable static var zero: Self { get } - - init() - - subscript(index: Int) -> Self.Scalar { get set } - - var indices: Range { get } - - - - -// mutating func replace(with other: Self, where mask: M) where M:MaskLike, M.Storage.Scalar==Scalar.SIMDMaskScalar -// public static func .< (a: SIMD32, b: SIMD32) -> SIMDMask> -// -// /// Returns a vector mask with the result of a pointwise less than or equal -// /// comparison. -// public static func .<= (a: SIMD32, b: SIMD32) -> SIMDMask> -// -// /// The least element in the vector. -// public func min() -> Scalar -// -// /// The greatest element in the vector. -// public func max() -> Scalar -// -// /// Returns a vector mask with the result of a pointwise greater than or -// /// equal comparison. -// public static func .>= (a: SIMD32, b: SIMD32) -> SIMDMask> -// -// /// Returns a vector mask with the result of a pointwise greater than -// /// comparison. -// public static func .> (a: SIMD32, b: SIMD32) -> SIMDMask> - - -} - diff --git a/Tests/ForceSimulationTests/ForceTests.swift b/Tests/ForceSimulationTests/ForceTests.swift new file mode 100644 index 0000000..4a95899 --- /dev/null +++ b/Tests/ForceSimulationTests/ForceTests.swift @@ -0,0 +1,60 @@ +// +// File.swift +// +// +// Created by li3zhen1 on 10/4/23. +// + +import XCTest +import simd + +@testable import ForceSimulation + +final class ForceTests: XCTestCase { + + private func _testForceMutatePositions(_ myForce: some Force2D) { + + let simulation = Simulation( + nodeCount: 5, + links: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 0)].map { + EdgeID(source: $0.0, target: $0.1) + }, + forceField: myForce + ) + + for i in 0...10 { + simulation.tick() + } + + let position = simulation.kinetics.position.asArray() + + + XCTAssertNotEqual(position, Array(repeating: .zero, count: 5)) + } + + + func testLinkForceMutatesPosition() { + _testForceMutatePositions( + SealedForce2D { + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + } + ) + } + + + func testManyBodyForceMutatesPosition() { + _testForceMutatePositions( + SealedForce2D { + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + Kinetics2D.ManyBodyForce(strength: -300) + } + ) + } + +} diff --git a/Tests/ForceSimulationTests/GKTreeCompareTest.swift b/Tests/ForceSimulationTests/GKTreeCompareTest.swift new file mode 100644 index 0000000..fec8972 --- /dev/null +++ b/Tests/ForceSimulationTests/GKTreeCompareTest.swift @@ -0,0 +1,115 @@ +// +// File.swift +// +// +// Created by li3zhen1 on 10/4/23. +// + +import XCTest +import simd +@testable import ForceSimulation + +// #if canImport(GameKit) +// import GameKit +// #endif + +struct DummyQuadtreeDelegate: KDTreeDelegate { + @inlinable + mutating func didAddNode(_ node: Int, at position: SIMD2) { + count += 1 + } + + @inlinable + mutating func didRemoveNode(_ node: Int, at position: SIMD2) { + count -= 1 + } + + @inlinable + func copy() -> Self { + return Self(count: count) + } + + @inlinable + func spawn() -> Self { + return Self(count: 0) + } + + var count = 0 + + init(count: Int = 0) { + self.count = count + } + +} + +struct NamedNode: Identifiable { + let name: String + let id: Int + + static var count = 0 + static func make(_ name: String) -> NamedNode { + defer { count += 1 } + return NamedNode(name: name, id: count) + } +} + +final class ManyBodyForceTests: XCTestCase { + // #if canImport(GameKit) + // func _testGameKit() { + // // randomly generate 100000 nodes in [-100, 100] x [-100, 100] + // let nodes: [simd_float2] = (0..<100000).map { _ in + // let x = Float.random(in: -100...100) + // let y = Float.random(in: -100...100) + // return simd_float2(x, y) + // } + + // measure { + // let gkTree = GKQuadtree( + // boundingQuad: .init(quadMin: [-100.0, -100.0], quadMax: [100.0, 100.0]), + // minimumCellSize: 1e-5 + // ) + + // for (i, node) in nodes.enumerated() { + // gkTree.add(NSNumber(value: i), at: node) + // } + + // // traverse the tree + // var count = 0 + // gkTree.elements(in: .init(quadMin: [-100.0, -100.0], quadMax: [100.0, 100.0])) + // .forEach { _ in count += 1 } + // XCTAssertEqual(count, nodes.count) + // } + // } + // #endif + + func testGrapeKDTree() { + let nodes: [simd_double2] = (0..<100000).map { _ in + let x = Double.random(in: -100...100) + let y = Double.random(in: -100...100) + return simd_double2(x, y) + } + + measure { + var kdtree = BufferedKDTree, DummyQuadtreeDelegate>( + rootBox: .init([-100.0, -100.0], [100.0, 100.0]), + nodeCapacity: nodes.count, + rootDelegate: DummyQuadtreeDelegate() + ) + + for (i, node) in nodes.enumerated() { + kdtree.add(nodeIndex: i, at: node) + } + + // traverse the tree + var count = 0 + kdtree.visit { t in + if t.isLeaf { + count += t.delegate.count + return false + } + return true + } + XCTAssertEqual(count, nodes.count) + } + } +} diff --git a/Tests/ForceSimulationTests/ManyBodyForceTest.swift b/Tests/ForceSimulationTests/ManyBodyForceTest.swift deleted file mode 100644 index 103934e..0000000 --- a/Tests/ForceSimulationTests/ManyBodyForceTest.swift +++ /dev/null @@ -1,58 +0,0 @@ -// -// File.swift -// -// -// Created by li3zhen1 on 10/4/23. -// - -import XCTest -import NDTree -@testable import ForceSimulation - - -struct NamedNode: Identifiable { - let name: String - let id: Int - - static var count = 0 - static func make(_ name: String) -> NamedNode { - defer { count += 1 } - return NamedNode(name: name, id: count) - } -} - -final class ManyBodyForceTests: XCTestCase { - - func test() { - let nodes: [NamedNode] = [ - .make("Alice"), - .make("Bob"), - .make("Carol"), - .make("David") - ] - -// let pos = [(-1,-1), (-1,1), (1,-1), (1, 1)] -// let sim = Simulation(nodes: nodes) { n, i in -// n.position = Vector2f(x: Double(pos[i].0), y: Double(pos[i].1)) -// } -// -// -// let f = sim.createManyBodyForce(strength: 0.4) -// -// sim.tick() - - - - // sim.simulationNodes.forEach { n in - // print(n) - // } - - - // sim.tick() - // sim.simulationNodes.forEach { n in - // print(n) - // } - } - - -} diff --git a/Tests/ForceSimulationTests/MiserableGraphTest.swift b/Tests/ForceSimulationTests/MiserableGraphTest.swift index b1b5fdc..a85a509 100644 --- a/Tests/ForceSimulationTests/MiserableGraphTest.swift +++ b/Tests/ForceSimulationTests/MiserableGraphTest.swift @@ -5,114 +5,142 @@ // Created by li3zhen1 on 10/4/23. // -import NDTree import XCTest +// import ForceSimulation +import simd @testable import ForceSimulation +func getLinks() -> [EdgeID] { + let data = getData() + return data.links.map { l in + EdgeID( + source: data.nodes.firstIndex { n in n.id == l.source }!, + target: data.nodes.firstIndex { n in n.id == l.target }! + ) + } +} + +struct MyForceField: ForceField2D { + var force = CompositedForce { + Kinetics2D.ManyBodyForce(strength: -30) + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + Kinetics2D.CenterForce(center: .zero, strength: 1) + Kinetics2D.CollideForce(radius: .constant(3)) + } +} + +struct MySealedForce: ForceField2D { + var force = SealedForce2D { + Kinetics2D.ManyBodyForce(strength: -30) + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + Kinetics2D.CenterForce(center: .zero, strength: 1) + Kinetics2D.CollideForce(radius: .constant(3)) + + } +} + +struct MyLatticeForce: ForceField2D { + var force = SealedForce2D { + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(1) + ) + Kinetics2D.ManyBodyForce(strength: -1) + } +} + +struct MyForceField3D: ForceField3D { + var force = CompositedForce { + Kinetics3D.ManyBodyForce(strength: -30) + Kinetics3D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + Kinetics3D.CenterForce(center: .zero, strength: 1) + Kinetics3D.CollideForce(radius: .constant(3)) + } +} + final class MiserableGraphTest: XCTestCase { - func test() { - let data = getData() + func testLattice() { - let sim = Simulation( - nodeIds: data.nodes.map { n in - n.id - }) - - let linkForce = sim.createLinkForce( - data.links.map({ l in - (l.source, l.target) - })) - let manybodyForce = sim.createManyBodyForce(strength: -30) - - let centerForce = sim.createCenterForce(center: .zero) - let collideForce = sim.createCollideForce(radius: .constant(5)) - - // for _ in 0..<120{ - // sim.tick() - // } - // - //// sim.tick() - // - // for _ in 0..<120{ - // sim.tick() - // } + let myForce = SealedForce2D { + Kinetics2D.ManyBodyForce(strength: -30) + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + Kinetics2D.CenterForce(center: .zero, strength: 1) + Kinetics2D.CollideForce(radius: .constant(3)) + } + + let width = 20 + + var edge = [(Int, Int)]() + for i in 0..( - nodeIds: data.nodes.map { n in - n.id - }) - - let linkForce = sim.createLinkForce( - data.links.map({ l in - (l.source, l.target) - })) - let manybodyForce = sim.createManyBodyForce(strength: -30) - - let centerForce = sim.createCenterForce(center: .zero) - let collideForce = sim.createCollideForce(radius: .constant(5)) - - // for _ in 0..<120{ - // sim.tick() - // } - // - //// sim.tick() - // - // for _ in 0..<120{ - // sim.tick() - // } - - + let simulation = Simulation( + nodeCount: data.nodes.count, + links: getLinks(), + forceField: MySealedForce() + ) + measure { for _ in 0..<120 { - sim.tick() + simulation.tick() } } - sim.tick() - // print(sim.simulationNodes) + } + + func testMiserable3d() { + + let data = getData() + let simulation = Simulation( + nodeCount: data.nodes.count, + links: getLinks(), + forceField: MyForceField3D() + ) + + measure { + for _ in 0..<120 { + simulation.tick() + } + } } - -// func test4d() { -// let data = getData() -// -// let sim = Simulation( -// nodeIds: data.nodes.map { n in -// n.id -// }) -// -// let linkForce = sim.createLinkForce( -// data.links.map({ l in -// (l.source, l.target) -// })) -// let manybodyForce = sim.createManyBodyForce(strength: -30) -// -// let centerForce = sim.createCenterForce(center: .zero) -// let collideForce = sim.createCollideForce(radius: .constant(5)) -// -// measure { -// for _ in 0..<120 { -// sim.tick() -// } -// } -// sim.tick() -// // print(sim.simulationNodes) -// -// } } diff --git a/Tests/GrapeTests/GraphContentBuilderTests.swift b/Tests/GrapeTests/GraphContentBuilderTests.swift new file mode 100644 index 0000000..664998d --- /dev/null +++ b/Tests/GrapeTests/GraphContentBuilderTests.swift @@ -0,0 +1,206 @@ +import SwiftUI +import XCTest +import simd + +@testable import Grape + +func buildGraph( + @GraphContentBuilder _ builder: () -> some GraphContent +) -> some GraphContent where NodeID: Hashable { + let result = builder() + return result +} + +final class GraphContentBuilderTests: XCTestCase { + + func testSyntaxes() { + + struct ID: Identifiable { + var id: Int + } + + let arr = [ + ID(id: 0), + ID(id: 1), + ID(id: 2), + ] + + let a = ForEach(arr) { i in + NodeMark(id: i.id) + } + + let b = buildGraph { + NodeMark(id: 0) + ForEach(arr) { i in + NodeMark(id: i.id) + } + } + + let c = buildGraph { + NodeMark(id: 0) + for i in 0..<10 { + NodeMark(id: 0) + } + } + + var t = 1 + let d = buildGraph { + if true { + NodeMark(id: 0) + for i in 0..<10 { + NodeMark(id: 0) + } + } else { + LinkMark(from: 0, to: 1) + NodeMark(id: 0) + } + + if t == 1 { + LinkMark(from: 0, to: 1) + } + } + + var gc = _GraphRenderingContext() + d._attachToGraphRenderingContext(&gc) + + XCTAssert( + gc.nodes.count == 11, + "Expected 1 node, got \(gc.nodes.count)" + ) + } + + func testForLoop() { + let gc = buildGraph { + for i in 0..<10 { + NodeMark(id: i) + } + } + + var ctx = _GraphRenderingContext() + + gc._attachToGraphRenderingContext(&ctx) + + XCTAssert( + ctx.nodes.count == 10, + "Expected 10 nodes, got \(ctx.nodes.count)" + ) + } + + func testMixed() { + let gc = buildGraph { + LinkMark(from: 0, to: 1) + NodeMark(id: 3) + NodeMark(id: 4) + NodeMark(id: 5) + } + + var ctx = _GraphRenderingContext() + + gc._attachToGraphRenderingContext(&ctx) + + XCTAssert( + ctx.nodes.count == 3, + "Expected 3 nodes, got \(ctx.nodes.count)" + ) + + XCTAssert( + ctx.edges.count == 1, + "Expected 1 edge, got \(ctx.edges.count)" + ) + + XCTAssert( + ctx.nodes[0].id == 3) + + XCTAssert( + ctx.nodes[1].id == 4) + + XCTAssert( + ctx.nodes[2].id == 5) + + } + + func testConditional() { + let gc = buildGraph { + if true { + NodeMark(id: 0) + .foregroundStyle(.red) + // .opacity(0.2) + } else { + NodeMark(id: 1) + } + } + + var ctx = _GraphRenderingContext() + + gc._attachToGraphRenderingContext(&ctx) + + XCTAssert( + ctx.nodes.count == 1, + "Expected 1 node, got \(ctx.nodes.count)" + ) + + XCTAssert( + ctx.nodes[0].id == 0, + "Expected 0 edges, got \(ctx.edges.count)" + ) + + XCTAssert( + ctx.edges.count == 0, + "Expected 0 edges, got \(ctx.edges.count)" + ) + + } + + struct ID: Identifiable { + var id: Int + } + + func testForEach() { + let arr = [ + ID(id: 0), + ID(id: 1), + ID(id: 2), + ] + + let gc = buildGraph { + ForEach(arr) { i in + NodeMark(id: i.id) + // .opacity(0.2) + } + } + + var ctx = _GraphRenderingContext() + gc._attachToGraphRenderingContext(&ctx) + + XCTAssert( + ctx.nodes.count == 3, + "Expected 3 nodes, got \(ctx.nodes.count)" + ) + + } + + struct MyGraphComponent: GraphComponent { + typealias NodeID = Int + var body: some GraphContent { + NodeMark(id: 0) + // .opacity(0.6) + NodeMark(id: 1) + NodeMark(id: 2) + } + } + + func testCustomComponent() { + let gc = buildGraph { + MyGraphComponent() + // .opacity(0.2) + } + + var ctx = _GraphRenderingContext() + gc._attachToGraphRenderingContext(&ctx) + + XCTAssert( + ctx.nodes.count == 3, + "Expected 3 nodes, got \(ctx.nodes.count)" + ) + } +} diff --git a/Tests/KDTreeTests/BufferedKDTreeTests.swift b/Tests/KDTreeTests/BufferedKDTreeTests.swift new file mode 100644 index 0000000..b953b00 --- /dev/null +++ b/Tests/KDTreeTests/BufferedKDTreeTests.swift @@ -0,0 +1,135 @@ +import XCTest + +@testable import ForceSimulation + +struct CountKDTreeDelegate: KDTreeDelegate { + mutating func didAddNode(_ node: Int, at position: SIMD2) { + count += 1 + } + + mutating func didRemoveNode(_ node: Int, at position: SIMD2) { + count -= 1 + } + + typealias NodeID = Int + + typealias Vector = SIMD2 + + var count = 0 + + func spawn() -> CountKDTreeDelegate { + return .init(count: 0) + } + +} + +class BufferedKDTreeTests: XCTestCase { + + private func buildTree( + box: KDBox>, + points: [SIMD2] + ) -> BufferedKDTree, CountKDTreeDelegate> { + var t = BufferedKDTree( + rootBox: box, + nodeCapacity: points.count, + rootDelegate: CountKDTreeDelegate() + ) + for i in points.indices { + t.add(nodeIndex: i, at: points[i]) + } + return t + } + + func testCorner() { + + let t = buildTree( + box: .init(p0: [0, 0], p1: [1, 1]), + points: [ + [0, 0] + ]) + + XCTAssert(t.root.nodeIndices!.index == 0) + XCTAssert(t.root.childrenBufferPointer == nil) + XCTAssert(t.root.delegate.count == 1) + } + + func testCorner2() { + let t = buildTree( + box: .init(p0: [0, 0], p1: [1, 1]), + points: [ + [1, 1] + ]) + + XCTAssert(t.root.nodeIndices == nil) + XCTAssert(t.root.delegate.count == 1) + XCTAssert(t.root.childrenBufferPointer![3].delegate.count == 1) + XCTAssert(t.root.box.p1 == [2, 2]) + } + + func testRandomTree() { + let randomPoints = (0..<1000).map { _ in + SIMD2([Double.random(in: 0..<100), Double.random(in: 0..<100)]) + } + + let t = buildTree(box: .init(p0: [0, 0], p1: [100, 100]), points: randomPoints) + XCTAssert(t.root.delegate.count == randomPoints.count) + XCTAssert( + Array(0..(0.125, 0.125)]) + t.add(nodeIndex: 1, at: [0.1251, 0.1251]) + } + + func testExpand() { + var t = buildTree(box: .init(p0: [0, 0], p1: [1, 1]), points: [SIMD2(0.5, 0.5)]) + t.add(nodeIndex: 1, at: [1.5, 1.5]) + + XCTAssert(t.root.box.p1 == [2, 2]) + XCTAssert( + Array(1..<5).reduce( + 0, + { partialResult, n in + partialResult + t.treeNodeBuffer[n].delegate.count + }) == 2) + + t.add(nodeIndex: 2, at: [1.5, 0.5]) + XCTAssert(t.root.box.p1 == [2, 2]) + XCTAssert( + Array(1..<5).reduce( + 0, + { partialResult, n in + partialResult + t.treeNodeBuffer[n].delegate.count + }) == 3) + + t.add(nodeIndex: 3, at: [0.51, 0.51]) + XCTAssert(t.root.box.p1 == [2, 2]) + XCTAssert( + Array(1..<5).reduce( + 0, + { partialResult, n in + partialResult + t.treeNodeBuffer[n].delegate.count + }) == 4) + XCTAssert( + Array(5..<9).reduce( + 0, + { partialResult, n in + partialResult + t.treeNodeBuffer[n].delegate.count + }) == 2) + XCTAssert( + Array(0..) { - count += 1 - } - - func didRemoveNode(_ node: Int, at position: SIMD2) { - count -= 1 - } - - func copy() -> Self { - return Self(count: count) - } - - func spawn() -> Self { - return Self(count: 0) - } - - var count = 0 - - init(count: Int = 0) { - self.count = count - } - -} - -final class AddTests: XCTestCase { - - // tests below are mainly generate by github copilot with d3 source code - private func t( - _ points: [Vector2d] - ) -> Quadtree { -// var del = DummyQuadtreeDelegate() - let box = QuadBox.cover(of: points) - let qt = Quadtree(box: box, clusterDistance: 1e-5) { - DummyQuadtreeDelegate() - } - for i in points.indices { - qt.add(i, at: points[i]) - } - return qt - } - - private func t( - _ box: QuadBox, - _ points: [Vector2d] - ) -> Quadtree { -// var del = DummyQuadtreeDelegate() - let qt = Quadtree(box: box, clusterDistance: 1e-5) { - DummyQuadtreeDelegate() - } - for i in points.indices { - qt.add(i, at: points[i]) - } - - return qt - } - - func testCreatePoint() { - let q = t([[0, 0]]) - assert(q.debugDescription ~= "{data: [0.0, 0.0]}") - - q.add(1, at: [0.9, 0.9]) - assert(q.debugDescription ~= "[{data: [0.0, 0.0]},,, {data: [0.9, 0.9]}]") - - q.add(2, at: [0.9, 0.0]) - assert( - q.debugDescription ~= "[{data: [0.0, 0.0]}, {data: [0.9, 0.0]},, {data: [0.9, 0.9]}]") - - q.add(3, at: [0.0, 0.9]) - assert( - q.debugDescription - ~= "[{data: [0.0, 0.0]}, {data: [0.9, 0.0]}, {data: [0.0, 0.9]}, {data: [0.9, 0.9]}]" - ) - - q.add(4, at: [0.4, 0.4]) - assert( - q.debugDescription - ~= "[[{data: [0.0, 0.0]},,, {data: [0.4, 0.4]}], {data: [0.9, 0.0]}, {data: [0.0, 0.9]}, {data: [0.9, 0.9]}]" - ) - } - - func testCreatePointOnPerimeter() { - let q = t([[0, 0]]) - assert(q.debugDescription ~= "{data: [0.0, 0.0]}") - assert(q.delegate.count == 1) - - q.add(1, at: [1, 1]) - assert(q.debugDescription ~= "[{data: [0.0, 0.0]},,, {data: [1.0, 1.0]}]") - assert(q.delegate.count == 2) - - q.add(2, at: [1, 0]) - assert( - q.debugDescription ~= "[{data: [0.0, 0.0]}, {data: [1.0, 0.0]},, {data: [1.0, 1.0]}]") - assert(q.delegate.count == 3) - - q.add(3, at: [0, 1]) - assert( - q.debugDescription - ~= "[{data: [0.0, 0.0]}, {data: [1.0, 0.0]}, {data: [0.0, 1.0]}, {data: [1.0, 1.0]}]" - ) - assert(q.delegate.count == 4) - } - - func testCreatePointOnTop() { - let q = t(QuadBox([0, 0], [2, 2]), [[0, 0], [1, -1]]) - assert(q.debugDescription ~= "[{data: [1.0, -1.0]},,{data: [0.0, 0.0]},]") - assert(q.delegate.count == 2) - assert(q.extent.p0 ~= [0, -2]) - assert(q.extent.p1 ~= [4, 2]) - } - - func testCreatePointOnBottom() { - let q = t(QuadBox([0, 0], [2, 2]), [[0, 0], [1, 3]]) - assert(q.delegate.count == 2) - assert(q.extent.p0 ~= [0, 0]) - assert(q.extent.p1 ~= [4, 4]) - } - - func testCreatePointOnLeft() { - let q = t(QuadBox([0, 0], [2, 2]), [[0, 0], [-1, 1]]) - assert(q.delegate.count == 2) - assert(q.extent.p0 ~= [-2, 0]) - assert(q.extent.p1 ~= [2, 4]) - } - - func testCreateCoincidentPoints() { - let q = t(QuadBox([0, 0], [1, 1]), [[0, 0], [1, 0], [0, 1], [0, 1]]) - assert(q.children![2].nodeIndices.count == 2) - assert(q.delegate.count == 4) - } - - func testCreateFirstPoint() { - let q = t(QuadBox([1, 2], [2, 3]), [[1, 2]]) - assert(q.extent.p0 ~= [1, 2]) - assert(q.extent.p1 ~= [2, 3]) - assert(q.debugDescription ~= "{data: [1.0, 2.0]}") - assert(q.delegate.count == 1) - } - -} diff --git a/Tests/NDTreeTests/Similarity.swift b/Tests/NDTreeTests/Similarity.swift deleted file mode 100644 index 0b6f691..0000000 --- a/Tests/NDTreeTests/Similarity.swift +++ /dev/null @@ -1,30 +0,0 @@ -infix operator ~=: ComparisonPrecedence - -extension String { - func removeWhitespace() -> String { - return self.replacingOccurrences(of: " ", with: "") - } - - static func ~= (lhs:Self, rhs:Self) -> Bool { - return lhs.removeWhitespace() == rhs.removeWhitespace() - } - -} - - - -extension Float { - static let tolerance: Self = 1e-5 - static func ~= (lhs:Self, rhs: Self) -> Bool { - return abs(lhs-rhs) <= tolerance - } -} - - -extension Double { - static let tolerance: Self = 1e-5 - static func ~= (lhs:Self, rhs: Self) -> Bool { - return abs(lhs-rhs) <= tolerance - } -} - From 264352880e6c7b26a8030cc4ad0ff6ba549707e1 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Wed, 3 Jan 2024 10:49:59 -0500 Subject: [PATCH 02/13] Add graph scaling --- .../Modifiers/EnvironmentModifiers.swift | 49 +++++++++++++++++++ Sources/Grape/Views/ForceDirectedGraph.swift | 14 +++++- .../Grape/Views/GraphRenderingContext.swift | 6 +++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 Sources/Grape/Modifiers/EnvironmentModifiers.swift diff --git a/Sources/Grape/Modifiers/EnvironmentModifiers.swift b/Sources/Grape/Modifiers/EnvironmentModifiers.swift new file mode 100644 index 0000000..59aa841 --- /dev/null +++ b/Sources/Grape/Modifiers/EnvironmentModifiers.swift @@ -0,0 +1,49 @@ +import SwiftUI + +@usableFromInline +enum GrapeEnvironment { } + +extension GrapeEnvironment { + @usableFromInline + struct GraphForegroundScale: EnvironmentKey { + @usableFromInline + static let defaultValue: [AnyHashable: GraphicsContext.Shading] = [:] + } +} + +extension EnvironmentValues { + @inlinable + var graphForegroundScaleEnvironment: GrapeEnvironment.GraphForegroundScale.Value { + get { self[GrapeEnvironment.GraphForegroundScale.self] } + set { self[GrapeEnvironment.GraphForegroundScale.self] = newValue } + } +} + +@usableFromInline +struct GraphEnvironmentViewModifier: ViewModifier { + + @usableFromInline + let colorScale: Dictionary + + @inlinable + init(_ mapping: KeyValuePairs) where S: ShapeStyle, DataValue: Hashable { + var colorScale: [AnyHashable: GraphicsContext.Shading] = [:] + mapping.forEach { + colorScale[.init($0.0)] = .style($0.1) + } + self.colorScale = colorScale + } + + @inlinable + func body(content: Content) -> some View { + content + .environment(\.graphForegroundScaleEnvironment, colorScale) + } +} + +extension View { + @inlinable + func graphForegroundStyleScale(_ mapping: KeyValuePairs) -> some View where S: ShapeStyle, DataValue: Hashable { + return modifier(GraphEnvironmentViewModifier(mapping)) + } +} diff --git a/Sources/Grape/Views/ForceDirectedGraph.swift b/Sources/Grape/Views/ForceDirectedGraph.swift index 074e77d..59e62b0 100644 --- a/Sources/Grape/Views/ForceDirectedGraph.swift +++ b/Sources/Grape/Views/ForceDirectedGraph.swift @@ -5,7 +5,19 @@ public struct ForceDirectedGraph { @inlinable @Environment(\.self) - var environmentValues: EnvironmentValues + var environment: EnvironmentValues + + @inlinable + @Environment(\.graphForegroundScaleEnvironment) + var graphForegroundScale + + @inlinable + @Environment(\.colorScheme) + var colorScheme + + @inlinable + @Environment(\.colorSchemeContrast) + var colorSchemeContrast // the copy of the graph context to be used for comparison in `onChange` // should be not used for rendering diff --git a/Sources/Grape/Views/GraphRenderingContext.swift b/Sources/Grape/Views/GraphRenderingContext.swift index c35b51f..f0406f7 100644 --- a/Sources/Grape/Views/GraphRenderingContext.swift +++ b/Sources/Grape/Views/GraphRenderingContext.swift @@ -33,6 +33,12 @@ public struct _GraphRenderingContext { @usableFromInline internal var states = GraphRenderingStates() + + + @inlinable + func updateEnvironment(with newEnvironment: EnvironmentValues) { + + } } extension _GraphRenderingContext: Equatable { From 286097860e511d093c8c24b83c31f527114fe3e4 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Wed, 3 Jan 2024 10:55:30 -0500 Subject: [PATCH 03/13] Add shading by --- .../Effects/GrapeEffect.ForegroundStyle.swift | 20 +++++++++++++++---- ...fiers.swift => GraphForegroundScale.swift} | 0 2 files changed, 16 insertions(+), 4 deletions(-) rename Sources/Grape/Modifiers/{EnvironmentModifiers.swift => GraphForegroundScale.swift} (100%) diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.ForegroundStyle.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.ForegroundStyle.swift index 9cce7dc..c1fc803 100644 --- a/Sources/Grape/Modifiers/Effects/GrapeEffect.ForegroundStyle.swift +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.ForegroundStyle.swift @@ -22,8 +22,17 @@ extension GraphContentEffect { self.shading = shading } } -} + @usableFromInline + internal struct ShadingBy { + @usableFromInline + let value: AnyHashable + @inlinable + public init(by value: T) { + self.value = value + } + } +} extension GraphContentEffect.ForegroundStyle: GraphContentModifier { @inlinable @@ -36,7 +45,8 @@ extension GraphContentEffect.ForegroundStyle: GraphContentModifier { } @inlinable - public func _exit(_ context: inout _GraphRenderingContext) where NodeID : Hashable { + public func _exit(_ context: inout _GraphRenderingContext) + where NodeID: Hashable { context.states.shading.removeLast() // context.operations.append( // .updateShading(context.states.currentShading) @@ -44,6 +54,7 @@ extension GraphContentEffect.ForegroundStyle: GraphContentModifier { } } + extension GraphContentEffect.Shading: GraphContentModifier { @inlinable public func _into( @@ -53,7 +64,8 @@ extension GraphContentEffect.Shading: GraphContentModifier { } @inlinable - public func _exit(_ context: inout _GraphRenderingContext) where NodeID : Hashable { + public func _exit(_ context: inout _GraphRenderingContext) + where NodeID: Hashable { context.states.shading.removeLast() } -} \ No newline at end of file +} diff --git a/Sources/Grape/Modifiers/EnvironmentModifiers.swift b/Sources/Grape/Modifiers/GraphForegroundScale.swift similarity index 100% rename from Sources/Grape/Modifiers/EnvironmentModifiers.swift rename to Sources/Grape/Modifiers/GraphForegroundScale.swift From ff5108396d0858c0c40dc4ced9e1310c7fda40b7 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 14:38:23 -0500 Subject: [PATCH 04/13] Add rich label --- .../ForceDirectedGraphExample/Lattice.swift | 3 +- .../Miserables.swift | 80 ++++++++----------- .../ForceDirectedGraphExample/MyRing.swift | 13 +-- .../Grape/Contents/GraphContentBuilder.swift | 3 +- .../Contents/_ForEach+GraphContent.swift | 43 +++++++++- .../Modifiers/Effects/GrapeEffect.Label.swift | 40 ++++++++++ .../GraphContent+GraphContentModifiers.swift | 51 +++++++++++- .../Grape/Views/ForceDirectedGraph+View.swift | 2 +- Sources/Grape/Views/ForceDirectedGraph.swift | 11 ++- .../Grape/Views/ForceDirectedGraphModel.swift | 8 +- Sources/Grape/Views/GraphLayoutInputs.swift | 3 + .../Grape/Views/GraphRenderingContext.swift | 2 +- 12 files changed, 193 insertions(+), 66 deletions(-) create mode 100644 Sources/Grape/Views/GraphLayoutInputs.swift diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift index bd5ccc2..7306e27 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift @@ -43,7 +43,6 @@ struct Lattice: View { .stroke() } for l in edge { - LinkMark(from: l.0, to: l.1) } } force: { @@ -52,6 +51,8 @@ struct Lattice: View { stiffness: .weightedByDegree(k: { _, _ in 1}) ) ManyBodyForce(strength: -0.8) +// CenterForce() +// CollideForce(strength: 0.01, radius: .constant(1.0)) } .toolbar { diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift index c8339ed..61afc4d 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift @@ -1,5 +1,5 @@ // -// ForceDirectedGraphSwiftUIExample.swift +// Miserables.swift // ForceDirectedGraphExample // // Created by li3zhen1 on 11/5/23. @@ -8,60 +8,46 @@ import Foundation import Grape import SwiftUI -import ForceSimulation import Charts -//struct MyForceField: ForceField { -// -// typealias Vector = SIMD2 -// -// public var force = CompositedForce { -// LinkForce( -// originalLength: .constant(20.0), -// stiffness: .weightedByDegree(k: { _, _ in 3.0}) -// ) -// CenterForce() -// ManyBodyForce(strength: -15) -// } -//} - - - struct MiserableGraph: View { - @State var isRunning = false - let graphData = getData(miserables) + private let graphData = getData(miserables) + + @State private var isRunning = false + @State private var opacity: Double = 0 var body: some View { + ForceDirectedGraph($isRunning) { - for l in graphData.links { - let fromID = graphData.nodes.firstIndex { mn in - mn.id == l.source - }! - let toID = graphData.nodes.firstIndex { mn in - mn.id == l.target - }! - LinkMark(from: fromID, to: toID) - } - ForEach(graphData.nodes.indices, id: \.self) { i in - NodeMark(id: i) + ForEach(graphData.nodes) { node in + NodeMark(id: node.id) .symbol(.asterisk) - .symbolSize(radius: 12.0) + .symbolSize(radius: 9.0) + .stroke() .foregroundStyle( - colors[graphData.nodes[i].group % colors.count] - .shadow(.inner(color:colors[graphData.nodes[i].group % colors.count].opacity(0.3), radius: 3, x:0, y: 1.5)) - .shadow(.drop(color:colors[graphData.nodes[i].group % colors.count].opacity(0.12), radius: 12, x:0, y: 8)) + colors[node.group % colors.count] + .shadow( + .inner( + color: colors[node.group % colors.count].opacity(0.3), + radius: 3, + x: 0, + y: 1.5 + ) + ) ) - .stroke() - .label(offset: CGVector(dx: 0.0, dy: 12.0)) { -// if i.isMultiple(of: 5) { - Text(graphData.nodes[i].id) - .font(.title3) -// } + .label(offset: [0.0, 12.0]) { + Text(node.id) + .font(.caption2) } } + + ForEach(graphData.links) { l in + LinkMark(from: l.source, to: l.target) + } + } force: { ManyBodyForce(strength: -20) LinkForce( @@ -69,14 +55,16 @@ struct MiserableGraph: View { stiffness: .weightedByDegree(k: { _, _ in 1.0}) ) CenterForce() -// CollideForce() - } - .onNodeTapped { - print($0) } + + .opacity(opacity) + .animation(.easeInOut, value: opacity) .toolbar { Button { - isRunning = !isRunning + isRunning.toggle() + if opacity < 1 { + opacity = 1 + } } label: { Image(systemName: isRunning ? "pause.fill" : "play.fill") Text(isRunning ? "Pause" : "Start") diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift index adabf22..2b9f157 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift @@ -35,7 +35,7 @@ struct MyRing: View { ForceDirectedGraph($isRunning) { - ForEach(Array(0..<20), id: \.self) { i in + ForEach(0..<20) { i in NodeMark(id: 3 * i + 0) .symbol(.circle) .symbolSize(radius:4.0) @@ -49,12 +49,15 @@ struct MyRing: View { .symbolSize(radius:6.0) .foregroundStyle(.yellow) + + LinkMark(from: 3 * i + 0, to: 3 * i + 1) LinkMark(from: 3 * i + 1, to: 3 * i + 2) - - for j in 0..<3 { - LinkMark(from: 3 * i + j, to: 3 * ((i + 1) % 20) + j) - } + + LinkMark(from: 3 * i + 0, to: 3 * ((i + 1) % 20) + 0) + LinkMark(from: 3 * i + 1, to: 3 * ((i + 1) % 20) + 1) + LinkMark(from: 3 * i + 2, to: 3 * ((i + 1) % 20) + 2) + } } force: { ManyBodyForce(strength: -15) diff --git a/Sources/Grape/Contents/GraphContentBuilder.swift b/Sources/Grape/Contents/GraphContentBuilder.swift index e72e86b..732c9c2 100644 --- a/Sources/Grape/Contents/GraphContentBuilder.swift +++ b/Sources/Grape/Contents/GraphContentBuilder.swift @@ -21,7 +21,7 @@ public struct GraphContentBuilder { /// Creates a list of graph contents from a for-loop. /// /// **Known issue**: - /// Type inference failes when the nested element is decorated with a modifier. + /// Type inference fails when the nested element is decorated with a modifier. /// /// **Workaround**: /// - Use `ForEach` like in SwiftUI. This is the recommended way. @@ -48,6 +48,7 @@ public struct GraphContentBuilder { /// MyComponent(i) /// } /// } + @available(*, deprecated, message: "Use ForEach instead. Swift cannot infer types when nested elements is decorated with a modifier. ") @inlinable public static func buildArray(_ components: [T]) -> some Content where T: Content, T.NodeID == NodeID { diff --git a/Sources/Grape/Contents/_ForEach+GraphContent.swift b/Sources/Grape/Contents/_ForEach+GraphContent.swift index 7c185bf..8a5ab7f 100644 --- a/Sources/Grape/Contents/_ForEach+GraphContent.swift +++ b/Sources/Grape/Contents/_ForEach+GraphContent.swift @@ -37,7 +37,9 @@ extension _GraphContentWrapper: _GraphContentWrappingView { } @inlinable - internal static func pullback(id: KeyPath, _ content: @escaping (ID) -> InnerGraphContent) + internal static func pullback( + id: KeyPath, _ content: @escaping (ID) -> InnerGraphContent + ) -> (T) -> Self where ID: Hashable { return { element in @@ -60,6 +62,7 @@ extension ForEach: GraphContent where Content: GraphContent { extension ForEach where ID == Data.Element.ID, Content: _GraphContentWrappingView, Data.Element: Identifiable { @inlinable + @_disfavoredOverload public init( _ data: Data, @GraphContentBuilder graphContent: @escaping (Data.Element) -> IG @@ -72,7 +75,6 @@ where ID == Data.Element.ID, Content: _GraphContentWrappingView, Data.Element: I let pb = _GraphContentWrapper.pullback(graphContent) self.init(data, content: pb) } - } extension ForEach where Content: _GraphContentWrappingView { @@ -91,4 +93,41 @@ extension ForEach where Content: _GraphContentWrappingView { let pb = _GraphContentWrapper.pullback(id: id, graphContent) self.init(data, id: id, content: pb) } + +} + +// extension ForEach { +// @inlinable +// public init( +// _ range: Range, +// @GraphContentBuilder content: @escaping (Int) -> IG +// ) +// where +// Data == Swift.Range, ID == Swift.Int, IG: GraphContent, NodeID: Hashable, +// Content == _GraphContentWrapper +// { +// self.init(range, id: \.self, content: _GraphContentWrapper.pullback(content)) +// } +// } + +extension ForEach +where + Data == Swift.Range, ID == Swift.Int, Content: _GraphContentWrappingView +{ + @inlinable + public init( + _ data: RawData, + @GraphContentBuilder graphContent: @escaping (RawData.Element) -> IG + ) + where + IG: GraphContent, NodeID: Hashable, + RawData: RandomAccessCollection, + RawData.Indices == Swift.Range, + Content == _GraphContentWrapper + { + + self.init(data.indices, id: \.self) { index in + graphContent(data[index]) + } + } } diff --git a/Sources/Grape/Modifiers/Effects/GrapeEffect.Label.swift b/Sources/Grape/Modifiers/Effects/GrapeEffect.Label.swift index ce9dd7e..25a3610 100644 --- a/Sources/Grape/Modifiers/Effects/GrapeEffect.Label.swift +++ b/Sources/Grape/Modifiers/Effects/GrapeEffect.Label.swift @@ -25,6 +25,29 @@ extension GraphContentEffect { } } + @usableFromInline + internal struct RichLabel { + + @usableFromInline + let view: AnyView + + @usableFromInline + let alignment: Alignment + + @usableFromInline + let offset: CGVector + + @inlinable + public init( + _ view: some View, + alignment: Alignment = .bottom, + offset: CGVector = .zero + ) { + self.view = .init(erasing: view) + self.alignment = alignment + self.offset = offset + } + } } extension GraphContentEffect.Label: GraphContentModifier { @@ -60,6 +83,23 @@ extension GraphContentEffect.Label: GraphContentModifier { } } + +extension GraphContentEffect.RichLabel: GraphContentModifier { + @inlinable + public func _into( + _ context: inout _GraphRenderingContext + ) where NodeID: Hashable { + + } + + @inlinable + @MainActor + public func _exit(_ context: inout _GraphRenderingContext) + where NodeID: Hashable { + + } +} + extension Alignment { @inlinable internal func anchorOffset(for size: CGSize) -> SIMD2 { diff --git a/Sources/Grape/Modifiers/GraphContent+GraphContentModifiers.swift b/Sources/Grape/Modifiers/GraphContent+GraphContentModifiers.swift index 85ec316..e2a8f9d 100644 --- a/Sources/Grape/Modifiers/GraphContent+GraphContentModifiers.swift +++ b/Sources/Grape/Modifiers/GraphContent+GraphContentModifiers.swift @@ -35,6 +35,11 @@ extension GraphContent { return ModifiedGraphContent(self, GraphContentEffect.SymbolSize(size)) } + @inlinable + public func symbolSize(_ size: SIMD2) -> some GraphContent { + return ModifiedGraphContent(self, GraphContentEffect.SymbolSize(size.cgSize)) + } + @inlinable public func symbolSize(radius: CGFloat) -> some GraphContent { return ModifiedGraphContent( @@ -59,6 +64,14 @@ extension GraphContent { self, GraphContentEffect.Label(text, alignment: alignment, offset: offset)) } + @inlinable + public func label( + _ text: Text?, alignment: Alignment = .bottom, offset: SIMD2 = .zero + ) -> some GraphContent { + + return label(text, alignment: alignment, offset: offset.cgVector) + } + @inlinable public func label( _ string: String?, alignment: Alignment = .bottom, offset: CGVector = .zero @@ -69,11 +82,45 @@ extension GraphContent { @inlinable public func label( - _ alignment: Alignment = .bottom, offset: CGVector = .zero, @ViewBuilder _ text: () -> Text? + _ string: String?, alignment: Alignment = .bottom, offset: SIMD2 = .zero + ) -> some GraphContent { + return label(string, alignment: alignment, offset: offset.cgVector) + } + + @inlinable + public func label( + _ alignment: Alignment = .bottom, offset: CGVector = .zero, + @ViewBuilder _ content: () -> Text? ) -> some GraphContent { return ModifiedGraphContent( - self, GraphContentEffect.Label(text(), alignment: alignment, offset: offset)) + self, GraphContentEffect.Label(content(), alignment: alignment, offset: offset)) + } + + @inlinable + public func label( + alignment: Alignment = .bottom, offset: SIMD2 = .zero, + @ViewBuilder _ content: () -> Text? + ) -> some GraphContent { + return label(alignment, offset: offset.cgVector, content) + } + + @inlinable + public func richLabel( + _ alignment: Alignment = .bottom, offset: CGVector = .zero, + @ViewBuilder _ content: () -> some View + ) -> some GraphContent { + + return ModifiedGraphContent( + self, GraphContentEffect.RichLabel(content(), alignment: alignment, offset: offset)) + } + + @inlinable + public func richLabel( + alignment: Alignment = .bottom, offset: SIMD2 = .zero, + @ViewBuilder _ content: () -> some View + ) -> some GraphContent { + return richLabel(alignment, offset: offset.cgVector, content) } /// Sets the stroke style for this graph content. diff --git a/Sources/Grape/Views/ForceDirectedGraph+View.swift b/Sources/Grape/Views/ForceDirectedGraph+View.swift index d12c671..c134a67 100644 --- a/Sources/Grape/Views/ForceDirectedGraph+View.swift +++ b/Sources/Grape/Views/ForceDirectedGraph+View.swift @@ -87,7 +87,7 @@ extension ForceDirectedGraph: View { extension ForceDirectedGraph: Equatable { @inlinable - public static func == (lhs: ForceDirectedGraph, rhs: ForceDirectedGraph) -> Bool + public static func == (lhs: Self, rhs: Self) -> Bool { return lhs._graphRenderingContextShadow == rhs._graphRenderingContextShadow // && lhs._forceDescriptors == rhs._forceDescriptors diff --git a/Sources/Grape/Views/ForceDirectedGraph.swift b/Sources/Grape/Views/ForceDirectedGraph.swift index 59e62b0..236e8c1 100644 --- a/Sources/Grape/Views/ForceDirectedGraph.swift +++ b/Sources/Grape/Views/ForceDirectedGraph.swift @@ -1,7 +1,9 @@ import ForceSimulation import SwiftUI -public struct ForceDirectedGraph { +public struct ForceDirectedGraph where NodeID == Content.NodeID { + + // public typealias NodeID = Content.NodeID @inlinable @Environment(\.self) @@ -34,7 +36,7 @@ public struct ForceDirectedGraph { // @State @inlinable - var model: ForceDirectedGraphModel + var model: ForceDirectedGraphModel { @storageRestrictions(initializes: _model) init(initialValue) { @@ -45,7 +47,7 @@ public struct ForceDirectedGraph { } @usableFromInline - var _model: State> + var _model: State> @inlinable var isRunning: Bool { @@ -64,7 +66,8 @@ public struct ForceDirectedGraph { public init( _ _isRunning: Binding = .constant(true), ticksPerSecond: Double = 60.0, - @GraphContentBuilder _ graph: () -> some GraphContent, + initialViewportTransform: ViewportTransform = .identity, + @GraphContentBuilder _ graph: () -> Content, @SealedForce2DBuilder force: () -> [SealedForce2D.ForceEntry] = { [] }, emittingNewNodesWithStates state: @escaping (NodeID) -> KineticState = { _ in .init(position: .zero) diff --git a/Sources/Grape/Views/ForceDirectedGraphModel.swift b/Sources/Grape/Views/ForceDirectedGraphModel.swift index 8780007..fc706d4 100644 --- a/Sources/Grape/Views/ForceDirectedGraphModel.swift +++ b/Sources/Grape/Views/ForceDirectedGraphModel.swift @@ -4,7 +4,9 @@ import Observation import SwiftUI // @Observable -public final class ForceDirectedGraphModel { +public final class ForceDirectedGraphModel { + + public typealias NodeID = Content.NodeID @usableFromInline var graphRenderingContext: _GraphRenderingContext @@ -356,9 +358,9 @@ extension ForceDirectedGraphModel { antialias: Self.textRasterizationAntialias ) lastRasterizedScaleFactor = env.displayScale - graphRenderingContext.symbols[resolvedTextContent] = .resolved(cgImage) + graphRenderingContext.symbols[resolvedTextContent] = .resolved(consume text, cgImage) rasterizedSymbol = cgImage - case .resolved(let cgImage): + case .resolved(_, let cgImage): rasterizedSymbol = cgImage } diff --git a/Sources/Grape/Views/GraphLayoutInputs.swift b/Sources/Grape/Views/GraphLayoutInputs.swift new file mode 100644 index 0000000..d455d3d --- /dev/null +++ b/Sources/Grape/Views/GraphLayoutInputs.swift @@ -0,0 +1,3 @@ +struct GraphLayoutInputs { + +} \ No newline at end of file diff --git a/Sources/Grape/Views/GraphRenderingContext.swift b/Sources/Grape/Views/GraphRenderingContext.swift index f0406f7..21522b4 100644 --- a/Sources/Grape/Views/GraphRenderingContext.swift +++ b/Sources/Grape/Views/GraphRenderingContext.swift @@ -4,7 +4,7 @@ public struct _GraphRenderingContext { @usableFromInline enum TextResolvingStatus: Equatable { case pending(Text) - case resolved(CGImage?) + case resolved(Text, CGImage?) } @usableFromInline From ecdf2dc0a9821953133f3287dcf37535b8498d7d Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 15:03:18 -0500 Subject: [PATCH 05/13] Add repeated --- .../project.pbxproj | 4 - .../ForceDirectedLatticeView.swift | 223 ------------------ .../ForceDirectedGraphExample/Lattice.swift | 15 +- .../Miserables.swift | 15 +- .../ForceDirectedGraphExample/MyRing.swift | 2 +- Sources/Grape/Contents/Repeated.swift | 27 +++ .../Contents/_ForEach+GraphContent.swift | 57 +++-- 7 files changed, 74 insertions(+), 269 deletions(-) delete mode 100644 Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift create mode 100644 Sources/Grape/Contents/Repeated.swift diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj index dab62f5..089cab8 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj @@ -11,7 +11,6 @@ B70B52AF2AF822FF00A1E6CD /* Grape in Frameworks */ = {isa = PBXBuildFile; productRef = B70B52AE2AF822FF00A1E6CD /* Grape */; }; B71759592AFBFC4B000DF006 /* Miserables.swift in Sources */ = {isa = PBXBuildFile; fileRef = B71759582AFBFC4B000DF006 /* Miserables.swift */; }; B717595B2AFBFDBD000DF006 /* Lattice.swift in Sources */ = {isa = PBXBuildFile; fileRef = B717595A2AFBFDBD000DF006 /* Lattice.swift */; }; - B719E4112AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B719E4102AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift */; }; B780DD7A2AF84ECB001C605F /* MyRing.swift in Sources */ = {isa = PBXBuildFile; fileRef = B780DD792AF84ECB001C605F /* MyRing.swift */; }; B7AFA55B2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7AFA55A2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift */; }; B7AFA55D2ADF4997009C7154 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7AFA55C2ADF4997009C7154 /* ContentView.swift */; }; @@ -24,7 +23,6 @@ /* Begin PBXFileReference section */ B71759582AFBFC4B000DF006 /* Miserables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Miserables.swift; sourceTree = ""; }; B717595A2AFBFDBD000DF006 /* Lattice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lattice.swift; sourceTree = ""; }; - B719E4102AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ForceDirectedLatticeView.swift; sourceTree = ""; }; B780DD792AF84ECB001C605F /* MyRing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyRing.swift; sourceTree = ""; }; B7AFA5572ADF4997009C7154 /* ForceDirectedGraphExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ForceDirectedGraphExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; B7AFA55A2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForceDirectedGraphExampleApp.swift; sourceTree = ""; }; @@ -69,7 +67,6 @@ isa = PBXGroup; children = ( B780DD792AF84ECB001C605F /* MyRing.swift */, - B719E4102AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift */, B7AFA55A2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift */, B7AFA55C2ADF4997009C7154 /* ContentView.swift */, B7AFA55E2ADF4999009C7154 /* Assets.xcassets */, @@ -171,7 +168,6 @@ B717595B2AFBFDBD000DF006 /* Lattice.swift in Sources */, B780DD7A2AF84ECB001C605F /* MyRing.swift in Sources */, B7AFA55D2ADF4997009C7154 /* ContentView.swift in Sources */, - B719E4112AE5FBFC009D6C24 /* ForceDirectedLatticeView.swift in Sources */, B7AFA56F2ADF49D6009C7154 /* Data.swift in Sources */, B71759592AFBFC4B000DF006 /* Miserables.swift in Sources */, B7AFA55B2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift in Sources */, diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift deleted file mode 100644 index 7133ae7..0000000 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift +++ /dev/null @@ -1,223 +0,0 @@ -////// -////// ForceDirectedLatticeView.swift -////// ForceDirectedGraphExample -////// -////// Created by li3zhen1 on 10/18/23. -////// -//// -////import CoreGraphics -////import ForceSimulation -////import simd -////import SwiftUI -//// -////struct ForceDirectedLatticeView: View { -//// @State var points: [simd_double2]? = nil -//// -//<<<<<<< HEAD -// -//import CoreGraphics -//import ForceSimulation -//import simd -//import SwiftUI -// -//struct ForceDirectedLatticeView: View { -// @State var points: [simd_double2]? = nil -// -// private let sim: Simulation2D -// private let edgeIds: [(Int, Int)] -// private let nodeIds: [Int] -// private let canvasWidth: CGFloat = 800.0 -// let width = 36 -// -// init() { -// self.nodeIds = Array(0..<(width * width)) -// -// var edge = [(Int, Int)]() -// for i in 0.. -//// private let edgeIds: [(Int, Int)] -//// private let nodeIds: [Int] -//// private let canvasWidth: CGFloat = 800.0 -//// let width = 36 -//// -//// init() { -//// self.nodeIds = Array(0..<(width * width)) -//// -//// var edge = [(Int, Int)]() -//// for i in 0..>>>>>> protocol_force diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift index 7306e27..1a088fb 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Lattice.swift @@ -33,27 +33,25 @@ struct Lattice: View { @inlinable var body: some View { ForceDirectedGraph($isRunning) { - ForEach(Array(0..<(width*width)), id:\.self) { i in - + + Repeated(0..<(width*width)) { i in let _i = Double(i / width) / Double(width) let _j = Double(i % width) / Double(width) - NodeMark(id: i, radius: 3.0) .foregroundStyle(Color(red: 1, green: _i, blue: _j)) .stroke() } - for l in edge { - LinkMark(from: l.0, to: l.1) + + Repeated(edge) { + LinkMark(from: $0.0, to: $0.1) } + } force: { LinkForce( originalLength: .constant(0.8), stiffness: .weightedByDegree(k: { _, _ in 1}) ) ManyBodyForce(strength: -0.8) -// CenterForce() -// CollideForce(strength: 0.01, radius: .constant(1.0)) - } .toolbar { Button { @@ -63,5 +61,6 @@ struct Lattice: View { Text(isRunning ? "Pause" : "Start") } } + } } diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift index 61afc4d..6f45d36 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/Miserables.swift @@ -17,12 +17,13 @@ struct MiserableGraph: View { @State private var isRunning = false @State private var opacity: Double = 0 + @State private var inspectorPresented = false var body: some View { ForceDirectedGraph($isRunning) { - ForEach(graphData.nodes) { node in + Repeated(graphData.nodes) { node in NodeMark(id: node.id) .symbol(.asterisk) .symbolSize(radius: 9.0) @@ -44,10 +45,10 @@ struct MiserableGraph: View { } } - ForEach(graphData.links) { l in + Repeated(graphData.links) { l in LinkMark(from: l.source, to: l.target) } - +// } force: { ManyBodyForce(strength: -20) LinkForce( @@ -56,9 +57,15 @@ struct MiserableGraph: View { ) CenterForce() } - + .onNodeTapped { node in + inspectorPresented = true + } .opacity(opacity) .animation(.easeInOut, value: opacity) + .inspector(isPresented: $inspectorPresented) { + Text("Hello") + } + .toolbar { Button { isRunning.toggle() diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift index 2b9f157..db4f377 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MyRing.swift @@ -35,7 +35,7 @@ struct MyRing: View { ForceDirectedGraph($isRunning) { - ForEach(0..<20) { i in + Repeated(0..<20) { i in NodeMark(id: 3 * i + 0) .symbol(.circle) .symbolSize(radius:4.0) diff --git a/Sources/Grape/Contents/Repeated.swift b/Sources/Grape/Contents/Repeated.swift new file mode 100644 index 0000000..76875e1 --- /dev/null +++ b/Sources/Grape/Contents/Repeated.swift @@ -0,0 +1,27 @@ +public struct Repeated +where Data: RandomAccessCollection, Content: GraphContent { + + @usableFromInline + let data: Data + + @usableFromInline + let content: (Data.Element) -> Content + + @inlinable + public init( + _ data: Data, + @GraphContentBuilder graphContent: @escaping (Data.Element) -> Content + ) { + self.data = data + self.content = graphContent + } +} + +extension Repeated: GraphContent { + @inlinable + public func _attachToGraphRenderingContext(_ context: inout _GraphRenderingContext) { + self.data.forEach { element in + self.content(element)._attachToGraphRenderingContext(&context) + } + } +} diff --git a/Sources/Grape/Contents/_ForEach+GraphContent.swift b/Sources/Grape/Contents/_ForEach+GraphContent.swift index 8a5ab7f..ae4aa7e 100644 --- a/Sources/Grape/Contents/_ForEach+GraphContent.swift +++ b/Sources/Grape/Contents/_ForEach+GraphContent.swift @@ -62,7 +62,7 @@ extension ForEach: GraphContent where Content: GraphContent { extension ForEach where ID == Data.Element.ID, Content: _GraphContentWrappingView, Data.Element: Identifiable { @inlinable - @_disfavoredOverload + // @_disfavoredOverload public init( _ data: Data, @GraphContentBuilder graphContent: @escaping (Data.Element) -> IG @@ -93,41 +93,40 @@ extension ForEach where Content: _GraphContentWrappingView { let pb = _GraphContentWrapper.pullback(id: id, graphContent) self.init(data, id: id, content: pb) } +} +extension ForEach { + @inlinable + public init( + _ range: Range, + @GraphContentBuilder content: @escaping (Int) -> IG + ) + where + Data == Swift.Range, ID == Swift.Int, IG: GraphContent, NodeID: Hashable, + Content == _GraphContentWrapper + { + self.init(range, id: \.self, content: _GraphContentWrapper.pullback(content)) + } } -// extension ForEach { +// extension ForEach +// where +// Data == Swift.Range, ID == Swift.Int, Content: _GraphContentWrappingView +// { // @inlinable -// public init( -// _ range: Range, -// @GraphContentBuilder content: @escaping (Int) -> IG +// public init( +// _ data: RawData, +// @GraphContentBuilder graphContent: @escaping (RawData.Element) -> IG // ) // where -// Data == Swift.Range, ID == Swift.Int, IG: GraphContent, NodeID: Hashable, +// IG: GraphContent, NodeID: Hashable, +// RawData: RandomAccessCollection, +// RawData.Indices == Swift.Range, // Content == _GraphContentWrapper // { -// self.init(range, id: \.self, content: _GraphContentWrapper.pullback(content)) + +// self.init(data.indices, id: \.self) { index in +// graphContent(data[index]) +// } // } // } - -extension ForEach -where - Data == Swift.Range, ID == Swift.Int, Content: _GraphContentWrappingView -{ - @inlinable - public init( - _ data: RawData, - @GraphContentBuilder graphContent: @escaping (RawData.Element) -> IG - ) - where - IG: GraphContent, NodeID: Hashable, - RawData: RandomAccessCollection, - RawData.Indices == Swift.Range, - Content == _GraphContentWrapper - { - - self.init(data.indices, id: \.self) { index in - graphContent(data[index]) - } - } -} From 5b00209b2682ddf9355a71616e1410f50a7ef0c1 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 15:03:51 -0500 Subject: [PATCH 06/13] Add repeated --- Sources/Grape/Contents/Repeated.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Grape/Contents/Repeated.swift b/Sources/Grape/Contents/Repeated.swift index 76875e1..11042c2 100644 --- a/Sources/Grape/Contents/Repeated.swift +++ b/Sources/Grape/Contents/Repeated.swift @@ -1,5 +1,5 @@ public struct Repeated -where Data: RandomAccessCollection, Content: GraphContent { +where Data: RandomAccessCollection, Content: GraphContent, NodeID: Hashable { @usableFromInline let data: Data From fd603f45a49e6800c8e1cb06459b9c6182c682b2 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 22:23:44 -0500 Subject: [PATCH 07/13] Add mermaid example --- .../project.pbxproj | 4 + .../ContentView.swift | 7 +- .../MermaidVisualization.swift | 88 ++++++++++++++++++ .../Grape/Contents/GraphContentBuilder.swift | 2 +- .../CreatingASimulationWithBuiltinForces.md | 70 ++++++++++++++ Sources/Grape/Grape.docc/Documentation.md | 75 +++++++++++++++ .../Resources/ForceDirectedGraph.png | Bin 0 -> 434284 bytes .../Resources/SimulationDiagram.svg | 18 ++++ .../Views/ForceDirectedGraph+Gesture.swift | 4 +- .../Grape/Views/ForceDirectedGraph+View.swift | 5 + .../Grape/Views/ForceDirectedGraphModel.swift | 5 +- 11 files changed, 273 insertions(+), 5 deletions(-) create mode 100644 Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift create mode 100644 Sources/Grape/Grape.docc/CreatingASimulationWithBuiltinForces.md create mode 100644 Sources/Grape/Grape.docc/Documentation.md create mode 100644 Sources/Grape/Grape.docc/Resources/ForceDirectedGraph.png create mode 100644 Sources/Grape/Grape.docc/Resources/SimulationDiagram.svg diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj index 089cab8..52f9ae0 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ B70B52AF2AF822FF00A1E6CD /* Grape in Frameworks */ = {isa = PBXBuildFile; productRef = B70B52AE2AF822FF00A1E6CD /* Grape */; }; B71759592AFBFC4B000DF006 /* Miserables.swift in Sources */ = {isa = PBXBuildFile; fileRef = B71759582AFBFC4B000DF006 /* Miserables.swift */; }; B717595B2AFBFDBD000DF006 /* Lattice.swift in Sources */ = {isa = PBXBuildFile; fileRef = B717595A2AFBFDBD000DF006 /* Lattice.swift */; }; + B762092F2B49FCD000476B93 /* MermaidVisualization.swift in Sources */ = {isa = PBXBuildFile; fileRef = B762092E2B49FCD000476B93 /* MermaidVisualization.swift */; }; B780DD7A2AF84ECB001C605F /* MyRing.swift in Sources */ = {isa = PBXBuildFile; fileRef = B780DD792AF84ECB001C605F /* MyRing.swift */; }; B7AFA55B2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7AFA55A2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift */; }; B7AFA55D2ADF4997009C7154 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7AFA55C2ADF4997009C7154 /* ContentView.swift */; }; @@ -23,6 +24,7 @@ /* Begin PBXFileReference section */ B71759582AFBFC4B000DF006 /* Miserables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Miserables.swift; sourceTree = ""; }; B717595A2AFBFDBD000DF006 /* Lattice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lattice.swift; sourceTree = ""; }; + B762092E2B49FCD000476B93 /* MermaidVisualization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MermaidVisualization.swift; sourceTree = ""; }; B780DD792AF84ECB001C605F /* MyRing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyRing.swift; sourceTree = ""; }; B7AFA5572ADF4997009C7154 /* ForceDirectedGraphExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ForceDirectedGraphExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; B7AFA55A2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForceDirectedGraphExampleApp.swift; sourceTree = ""; }; @@ -75,6 +77,7 @@ B7AFA56E2ADF49D6009C7154 /* Data.swift */, B71759582AFBFC4B000DF006 /* Miserables.swift */, B717595A2AFBFDBD000DF006 /* Lattice.swift */, + B762092E2B49FCD000476B93 /* MermaidVisualization.swift */, ); path = ForceDirectedGraphExample; sourceTree = ""; @@ -169,6 +172,7 @@ B780DD7A2AF84ECB001C605F /* MyRing.swift in Sources */, B7AFA55D2ADF4997009C7154 /* ContentView.swift in Sources */, B7AFA56F2ADF49D6009C7154 /* Data.swift in Sources */, + B762092F2B49FCD000476B93 /* MermaidVisualization.swift in Sources */, B71759592AFBFC4B000DF006 /* Miserables.swift in Sources */, B7AFA55B2ADF4997009C7154 /* ForceDirectedGraphExampleApp.swift in Sources */, ); diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ContentView.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ContentView.swift index fa418b2..f1a72af 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ContentView.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ContentView.swift @@ -71,8 +71,9 @@ enum ExampleKind { case ring case classicMiserable case lattice + case mermaid - static let list: [ExampleKind] = [.ring, .classicMiserable, .lattice] + static let list: [ExampleKind] = [.ring, .classicMiserable, .lattice, .mermaid] } extension ExampleKind { @@ -84,6 +85,8 @@ extension ExampleKind { return "Miserables" case .lattice: return "Lattice" + case .mermaid: + return "Mermaid visualization" } } } @@ -105,6 +108,8 @@ struct ContentView: View { MiserableGraph() case .lattice: Lattice() + case .mermaid: + MermaidVisualization() } } } diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift new file mode 100644 index 0000000..ac07680 --- /dev/null +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift @@ -0,0 +1,88 @@ +// +// MermaidVisualization.swift +// ForceDirectedGraphExample +// +// Created by li3zhen1 on 1/6/24. +// + +import SwiftUI +import RegexBuilder +import Grape + +let mermaidLinkRegex = Regex { + Capture( + OneOrMore(.word) + ) + OneOrMore(.whitespace) + ChoiceOf { + "-->" + "<--" + "—>" + "<—" + "->" + "<-" + } + + OneOrMore(.whitespace) + Capture( + OneOrMore(.word) + ) +} + +func parseMermaid( + _ text: String +) -> ([String], [(String, String)]) { + let links = text.split(separator: "\n") + .compactMap { + if let results = $0.matches(of: mermaidLinkRegex).first { + return (String(results.output.1), String(results.output.2)) + } + return nil + } + let nodes = Array(Set(links.flatMap { [$0.0, $0.1] })) + return (nodes, links) +} + +struct MermaidVisualization: View { + + @State private var text: String = """ + Alice --> Bob + Bob --> Cindy + Alice --> Dan + Alice --> Cindy + Tom --> Bob + """ + + var parsedGraph: ([String], [(String, String)]) { + parseMermaid(text) + } + + var body: some View { + ForceDirectedGraph { + Repeated(parsedGraph.0) { node in + NodeMark(id: node) + .label(alignment: .bottom) { + Text(node) + } + } + Repeated(parsedGraph.1) { link in + LinkMark(from: link.0, to: link.1) + } + } force: { + ManyBodyForce() + LinkForce(originalLength: .constant(70)) + CenterForce() + } + .inspector(isPresented: .constant(true)) { + VStack { + Text("Edit the mermaid syntaxes to update the graph") + .font(.title) + TextEditor(text: $text) + .fontDesign(.monospaced) + + }.padding(.top) + } + + + } +} diff --git a/Sources/Grape/Contents/GraphContentBuilder.swift b/Sources/Grape/Contents/GraphContentBuilder.swift index 732c9c2..eac8168 100644 --- a/Sources/Grape/Contents/GraphContentBuilder.swift +++ b/Sources/Grape/Contents/GraphContentBuilder.swift @@ -48,7 +48,7 @@ public struct GraphContentBuilder { /// MyComponent(i) /// } /// } - @available(*, deprecated, message: "Use ForEach instead. Swift cannot infer types when nested elements is decorated with a modifier. ") + @available(*, deprecated, message: "Use `Repeated` instead. ") @inlinable public static func buildArray(_ components: [T]) -> some Content where T: Content, T.NodeID == NodeID { diff --git a/Sources/Grape/Grape.docc/CreatingASimulationWithBuiltinForces.md b/Sources/Grape/Grape.docc/CreatingASimulationWithBuiltinForces.md new file mode 100644 index 0000000..fe98652 --- /dev/null +++ b/Sources/Grape/Grape.docc/CreatingASimulationWithBuiltinForces.md @@ -0,0 +1,70 @@ +# Creating a Simulation with Built-in Forces + + + +## Overview + + + +You can simply create simulations by using Simulation like this: + +```swift +import simd +import ForceSimulation + +// assuming you’re simulating 4 nodes +let nodeCount = 4 + +// Connect them +let links = [(0, 1), (1, 2), (2, 3), (3, 0)] + +/// Create a 2D force composited with 4 primitive forces. +let myForce = SealedForce2D { + // Forces are namespaced under `Kinetics` + // here we only use `Kinetics>`, i.e. `Kinetics2D` + Kinetics2D.ManyBodyForce(strength: -30) + Kinetics2D.LinkForce( + stiffness: .weightedByDegree(k: { _, _ in 1.0 }), + originalLength: .constant(35) + ) + Kinetics2D.CenterForce(center: .zero, strength: 1) + Kinetics2D.CollideForce(radius: .constant(3)) +} + +/// Create a simulation, the dimension is inferred from the force. +let mySimulation = Simulation( + nodeCount: nodeCount, + links: links.map { EdgeID(source: $0.0, target: $0.1) }, + forceField: myForce +) + +/// Force is ready to start! run `tick` to iterate the simulation. + +for mySimulation in 0..<120 { + mySimulation.tick() + let positions = mySimulation.kinetics.position.asArray() + /// Do something with the positions. +} +``` + +ForceSimulation module mainly contains 3 concepts, `Kinetics`, `ForceProtocol` and `Simulation`. + +@Image(source: "SimulationDiagram.svg", alt: "A diagram showing the relationships of `Kinetics`, `ForceProtocol` and `Simulation`. A `Simulation` contains a `Kinetics` and a `ForceProtocol`.") + +A diagram showing the relationships of `Kinetics`, `ForceProtocol` and `Simulation`. A `Simulation` contains a `Kinetics` and a `ForceProtocol`. + +- `Kinetics` describes all kinetic states of your system, i.e. position, velocity, link connections, and the variable alpha that describes how "active" your system is. `Vector` tells simulation how you decribe a coordinate in this space, it can be `SIMD2` or `SIMD3` or any other types conforming to `SimulatableVector`. + +- Forces are any types that conforms to `ForceProtocol`. This module provides most of the forces you will use in force directed graphs. And you can also create your own forces. They should be responsible for 2 tasks: + + - `bindKinetics(_ kinetics: Kinetics)`: binding to a Kinetics. In most cases the force should keep a reference of the Kinetics so they know what to mutate when apply is called. + + - `apply()`: Mutating the states of Kinetics. For example, a gravity force should add velocities on each node in this function. + +- Simulation is a shell class you interact with, which enables you to create any dimensional simulation with velocity Verlet integration. It manages a Kinetics and a force conforming to ``ForceProtocol``. Since Simulation only stores one force, you are responsible for compositing multiple forces into one. + +- Another data structure ``KDTree`` is used to accelerate the force simulation with Barnes-Hut Approximation. + +In this example, we run our simulation in a 2D space (`SIMD2`). We explicitly create a ``SealedForce2D`` to make sure the force is in the same dimension as the Kinetics. The `Vector` in `Simulation` is inferred from the force we pass. + +See [Examples](https://github.com/li3zhen1/Grape/tree/main/Examples) for example Xcode projects. \ No newline at end of file diff --git a/Sources/Grape/Grape.docc/Documentation.md b/Sources/Grape/Grape.docc/Documentation.md new file mode 100644 index 0000000..0d1838b --- /dev/null +++ b/Sources/Grape/Grape.docc/Documentation.md @@ -0,0 +1,75 @@ +# ``ForceSimulation`` + +Run force simulation within any number of dimensions. + +## Overview + +The `ForceSimulation` library enables you to create any dimensional simulation that uses velocity Verlet integration. + +If you’re looking for an out-of-the-box SwiftUI View to render force-directed graphs, please refer to [Grape | Documentation](https://li3zhen1.github.io/Grape/Grape/documentation/grape/). + + + +@Image(source: "ForceDirectedGraph.png", alt: "An example of 2D force directied graph.") + + +For more information on force simulations, read: [Force simulations - D3](https://d3js.org/d3-force/simulation). + + +## Topics + +### Creating a simulation + +* + +* ``Simulation`` +* ``Kinetics`` + +### Built-in forces + +* ``Kinetics/LinkForce`` +* ``Kinetics/ManyBodyForce`` +* ``Kinetics/CenterForce`` +* ``Kinetics/CollideForce`` +* ``Kinetics/PositionForce`` +* ``Kinetics/RadialForce`` +* ``Kinetics/EmptyForce`` + +### Utility forces for compositing a force field + +* ``ForceField`` +* ``CompositedForce`` +* ``SealedForce2D`` +* ``SealedForce3D`` + + + +### Spatial partitioning data structures + +- ``KDTree`` +- ``KDBox`` +- ``BufferedKDTree`` +- ``KDTreeDelegate`` + +### Deterministic randomness + + +- ``SimulatableFloatingPoint`` +- ``DeterministicRandomGenerator`` +- ``HasDeterministicRandomGenerator`` +- ``DoubleLinearCongruentialGenerator`` +- ``FloatLinearCongruentialGenerator`` + + +### Supporting protocols + +- ``ForceProtocol`` +- ``SimulatableVector`` + +### Utilities + +- ``UnsafeArray`` +- ``EdgeID`` +- ``AttributeDescriptor`` + + diff --git a/Sources/Grape/Grape.docc/Resources/ForceDirectedGraph.png b/Sources/Grape/Grape.docc/Resources/ForceDirectedGraph.png new file mode 100644 index 0000000000000000000000000000000000000000..774c6045fc62485d20d37a599db7ff0db082524b GIT binary patch literal 434284 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

fw)~M6!PPdaAOoZ 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

H+j)p7`Qo4ToyB+G6|m9}v~C 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%0A@lzSW(xe{ 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%0ACMA2)B-ccu&o9 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 literal 0 HcmV?d00001 diff --git a/Sources/Grape/Grape.docc/Resources/SimulationDiagram.svg b/Sources/Grape/Grape.docc/Resources/SimulationDiagram.svg new file mode 100644 index 0000000..39e6c2e --- /dev/null +++ b/Sources/Grape/Grape.docc/Resources/SimulationDiagram.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/Sources/Grape/Views/ForceDirectedGraph+Gesture.swift b/Sources/Grape/Views/ForceDirectedGraph+Gesture.swift index 4c29a24..4f9483c 100644 --- a/Sources/Grape/Views/ForceDirectedGraph+Gesture.swift +++ b/Sources/Grape/Views/ForceDirectedGraph+Gesture.swift @@ -24,7 +24,7 @@ extension ForceDirectedGraph { return } - if model.simulationContext.storage.kinetics.alpha > Self.minimumAlphaAfterDrag { + if model.simulationContext.storage.kinetics.alpha < Self.minimumAlphaAfterDrag { model.simulationContext.storage.kinetics.alpha = Self.minimumAlphaAfterDrag } @@ -54,7 +54,7 @@ extension ForceDirectedGraph { } return } - if model.simulationContext.storage.kinetics.alpha > Self.minimumAlphaAfterDrag { + if model.simulationContext.storage.kinetics.alpha < Self.minimumAlphaAfterDrag { model.simulationContext.storage.kinetics.alpha = Self.minimumAlphaAfterDrag } diff --git a/Sources/Grape/Views/ForceDirectedGraph+View.swift b/Sources/Grape/Views/ForceDirectedGraph+View.swift index c134a67..8471a2d 100644 --- a/Sources/Grape/Views/ForceDirectedGraph+View.swift +++ b/Sources/Grape/Views/ForceDirectedGraph+View.swift @@ -26,6 +26,11 @@ extension ForceDirectedGraph: View { self.model.stop() } } + .onAppear { + if self.isRunning { + self.model.start() + } + } } // #if DEBUG diff --git a/Sources/Grape/Views/ForceDirectedGraphModel.swift b/Sources/Grape/Views/ForceDirectedGraphModel.swift index fc706d4..3a7acb6 100644 --- a/Sources/Grape/Views/ForceDirectedGraphModel.swift +++ b/Sources/Grape/Views/ForceDirectedGraphModel.swift @@ -193,8 +193,11 @@ extension StrokeStyle { extension ForceDirectedGraphModel { @inlinable - func start() { + func start(minAlpha: Double = 0.6) { guard self.scheduledTimer == nil else { return } + if simulationContext.storage.kinetics.alpha < minAlpha { + simulationContext.storage.kinetics.alpha = minAlpha + } self.scheduledTimer = Timer.scheduledTimer( withTimeInterval: 1.0 / ticksPerSecond, repeats: true From a07185722291fc322d44f5a3f16020266f5d51f5 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 22:38:45 -0500 Subject: [PATCH 08/13] Add mermaid --- .../MermaidVisualization.swift | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift index ac07680..3adfdb5 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift @@ -8,6 +8,7 @@ import SwiftUI import RegexBuilder import Grape +import simd let mermaidLinkRegex = Regex { Capture( @@ -43,6 +44,14 @@ func parseMermaid( return (nodes, links) } +func getInitialPosition(id: String, r: Double) -> SIMD2 { + if let firstLetter = id.first?.unicodeScalars.first { + let deg = Double(firstLetter.value % 26) / 26 * 2 * .pi + return [cos(deg) * r, sin(deg) * r] + } + return .zero +} + struct MermaidVisualization: View { @State private var text: String = """ @@ -51,6 +60,9 @@ struct MermaidVisualization: View { Alice --> Dan Alice --> Cindy Tom --> Bob + Tom --> Kate + Kate --> Cindy + """ var parsedGraph: ([String], [(String, String)]) { @@ -61,7 +73,9 @@ struct MermaidVisualization: View { ForceDirectedGraph { Repeated(parsedGraph.0) { node in NodeMark(id: node) - .label(alignment: .bottom) { + .symbol(RoundedRectangle(cornerSize: CGSize(width: 3, height: 3))) + .symbolSize(radius: 6) + .label(alignment: .bottom, offset: [0, 4]) { Text(node) } } @@ -72,6 +86,8 @@ struct MermaidVisualization: View { ManyBodyForce() LinkForce(originalLength: .constant(70)) CenterForce() + } emittingNewNodesWithStates: { id in + KineticState(position: getInitialPosition(id: id, r: 100)) } .inspector(isPresented: .constant(true)) { VStack { From acbb496a7e83aee4d61b7fe6a633b02a901981d2 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 23:13:54 -0500 Subject: [PATCH 09/13] Add line utiles --- .../MermaidVisualization.swift | 32 ++++++++-- Sources/Grape/Utils/LinkShape.swift | 64 +++++++++++++++++++ 2 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 Sources/Grape/Utils/LinkShape.swift diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift index 3adfdb5..7234285 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift @@ -10,10 +10,29 @@ import RegexBuilder import Grape import simd +let multipleNodeRegex = Regex { + "{" + ZeroOrMore(.whitespace) + ZeroOrMore { + Capture (OneOrMore(.word)) + ZeroOrMore(.whitespace) + "," + ZeroOrMore(.whitespace) + } + Capture (OneOrMore(.word)) + ZeroOrMore(.whitespace) + "}" +} + +let singleNodeRegex = Regex { + Capture( OneOrMore(.word) ) +} + let mermaidLinkRegex = Regex { - Capture( - OneOrMore(.word) - ) + ChoiceOf { + singleNodeRegex + multipleNodeRegex + } OneOrMore(.whitespace) ChoiceOf { "-->" @@ -25,9 +44,10 @@ let mermaidLinkRegex = Regex { } OneOrMore(.whitespace) - Capture( - OneOrMore(.word) - ) + ChoiceOf { + singleNodeRegex + multipleNodeRegex + } } func parseMermaid( diff --git a/Sources/Grape/Utils/LinkShape.swift b/Sources/Grape/Utils/LinkShape.swift new file mode 100644 index 0000000..1f5e83a --- /dev/null +++ b/Sources/Grape/Utils/LinkShape.swift @@ -0,0 +1,64 @@ +import SwiftUI + +public protocol LinkShape { + @inlinable + func path(from: CGPoint, to: CGPoint) -> Path + + @inlinable + func decoration(from: CGPoint, to: CGPoint) -> Path? +} + +extension LinkShape { + @inlinable + public func decoration(from: CGPoint, to: CGPoint) -> Path? { nil } +} + +public protocol StraightLineLinkShape: LinkShape { } + +extension LinkShape where Self: StraightLineLinkShape { + @inlinable + public func path(from: CGPoint, to: CGPoint) -> Path { + Path { path in + path.move(to: from) + path.addLine(to: to) + } + } +} + +public struct PlainLineLink: LinkShape, StraightLineLinkShape { } + +public struct ArrowLineLink: LinkShape { + @usableFromInline + let arrowSize: CGSize + + @usableFromInline + let arrowAngle: CGFloat + + @usableFromInline + let arrowCornerRadius: CGFloat + + @inlinable + public func path(from: CGPoint, to: CGPoint) -> Path { + Path { + path in + let angle = atan2(to.y - from.y, to.x - from.x) + let arrowPoint = CGPoint( + x: to.x - arrowSize.width * cos(angle), + y: to.y - arrowSize.height * sin(angle) + ) + path.move(to: from) + path.addLine(to: arrowPoint) + path.addLine( + to: CGPoint( + x: arrowPoint.x - arrowSize.width * cos(angle + arrowAngle), + y: arrowPoint.y - arrowSize.height * sin(angle + arrowAngle) + )) + path.move(to: arrowPoint) + path.addLine( + to: CGPoint( + x: arrowPoint.x - arrowSize.width * cos(angle - arrowAngle), + y: arrowPoint.y - arrowSize.height * sin(angle - arrowAngle) + )) + } + } +} From 80701466cd6d0178dda88cdb3d0eb7e6a5d14c45 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 23:37:08 -0500 Subject: [PATCH 10/13] Update doc --- .../MermaidVisualization.swift | 14 ++-- Package.swift | 2 +- .../ForceSimulation.docc/theme-settings.json | 8 ++ Sources/Grape/Grape.docc/Documentation.md | 74 ++++--------------- Sources/Grape/Grape.docc/theme-settings.json | 8 ++ 5 files changed, 37 insertions(+), 69 deletions(-) create mode 100644 Sources/ForceSimulation/ForceSimulation.docc/theme-settings.json create mode 100644 Sources/Grape/Grape.docc/theme-settings.json diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift index 7234285..6f4fd10 100644 --- a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/MermaidVisualization.swift @@ -29,10 +29,11 @@ let singleNodeRegex = Regex { } let mermaidLinkRegex = Regex { - ChoiceOf { - singleNodeRegex - multipleNodeRegex - } + singleNodeRegex +// ChoiceOf { +// singleNodeRegex +// multipleNodeRegex +// } OneOrMore(.whitespace) ChoiceOf { "-->" @@ -44,10 +45,7 @@ let mermaidLinkRegex = Regex { } OneOrMore(.whitespace) - ChoiceOf { - singleNodeRegex - multipleNodeRegex - } + singleNodeRegex } func parseMermaid( diff --git a/Package.swift b/Package.swift index ad1a53d..d810128 100644 --- a/Package.swift +++ b/Package.swift @@ -27,7 +27,7 @@ let package = Package( ], dependencies: [ - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.1.0") + .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.3.0") ], targets: [ diff --git a/Sources/ForceSimulation/ForceSimulation.docc/theme-settings.json b/Sources/ForceSimulation/ForceSimulation.docc/theme-settings.json new file mode 100644 index 0000000..c3b5b09 --- /dev/null +++ b/Sources/ForceSimulation/ForceSimulation.docc/theme-settings.json @@ -0,0 +1,8 @@ +{ + "theme": { + "typography": { + "html-font": "system-ui, -apple-system, \"InterVar\"", + "html-font-mono": "ui-monospace, \"JetBrains Mono\", \"IBM Plex Mono\", monospace" + } + } +} \ No newline at end of file diff --git a/Sources/Grape/Grape.docc/Documentation.md b/Sources/Grape/Grape.docc/Documentation.md index 0d1838b..6be74ef 100644 --- a/Sources/Grape/Grape.docc/Documentation.md +++ b/Sources/Grape/Grape.docc/Documentation.md @@ -1,75 +1,29 @@ -# ``ForceSimulation`` +# ``Grape`` -Run force simulation within any number of dimensions. +Visualize force-directed graphs in SwiftUI. ## Overview -The `ForceSimulation` library enables you to create any dimensional simulation that uses velocity Verlet integration. +The `Grape` framework enables you to create a force simulation and visualize it in SwiftUI. It provides a set of handy interactions and styling options to help you visualize your graph-structured data. -If you’re looking for an out-of-the-box SwiftUI View to render force-directed graphs, please refer to [Grape | Documentation](https://li3zhen1.github.io/Grape/Grape/documentation/grape/). - - - -@Image(source: "ForceDirectedGraph.png", alt: "An example of 2D force directied graph.") - - -For more information on force simulations, read: [Force simulations - D3](https://d3js.org/d3-force/simulation). +If you’re looking for a more detailed control of force-directed laouts, please refer to [ForceSimulation | Documentation](https://li3zhen1.github.io/Grape/ForceSimulation/documentation/ForceSimulation/). ## Topics -### Creating a simulation - -* - -* ``Simulation`` -* ``Kinetics`` - -### Built-in forces - -* ``Kinetics/LinkForce`` -* ``Kinetics/ManyBodyForce`` -* ``Kinetics/CenterForce`` -* ``Kinetics/CollideForce`` -* ``Kinetics/PositionForce`` -* ``Kinetics/RadialForce`` -* ``Kinetics/EmptyForce`` - -### Utility forces for compositing a force field - -* ``ForceField`` -* ``CompositedForce`` -* ``SealedForce2D`` -* ``SealedForce3D`` - - - -### Spatial partitioning data structures - -- ``KDTree`` -- ``KDBox`` -- ``BufferedKDTree`` -- ``KDTreeDelegate`` - -### Deterministic randomness - - -- ``SimulatableFloatingPoint`` -- ``DeterministicRandomGenerator`` -- ``HasDeterministicRandomGenerator`` -- ``DoubleLinearCongruentialGenerator`` -- ``FloatLinearCongruentialGenerator`` - +### Creating a graph visualization -### Supporting protocols +* ``ForceDirectedGraph`` -- ``ForceProtocol`` -- ``SimulatableVector`` -### Utilities +### Describing a graph +* ``GraphContent`` +* ``NodeMark`` +* ``LinkMark`` +* ``Repeated`` +* ``GraphContent/foregroundStyle(_:)`` -- ``UnsafeArray`` -- ``EdgeID`` -- ``AttributeDescriptor`` +### Handling gestures and events +### Managing the states \ No newline at end of file diff --git a/Sources/Grape/Grape.docc/theme-settings.json b/Sources/Grape/Grape.docc/theme-settings.json new file mode 100644 index 0000000..c3b5b09 --- /dev/null +++ b/Sources/Grape/Grape.docc/theme-settings.json @@ -0,0 +1,8 @@ +{ + "theme": { + "typography": { + "html-font": "system-ui, -apple-system, \"InterVar\"", + "html-font-mono": "ui-monospace, \"JetBrains Mono\", \"IBM Plex Mono\", monospace" + } + } +} \ No newline at end of file From d333311f73ae2e61dcdc67faeaff2fca2d554f95 Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 23:48:58 -0500 Subject: [PATCH 11/13] Add new docs --- .../ForceDirectedGraph3D/ContentView.swift | 2 +- .../ForceDirectedLatticeView.swift | 223 ++++++++++++++++++ Sources/ForceSimulation/ForceProtocol.swift | 7 - .../ForceSimulation/Forces/CenterForce.swift | 7 - .../ForceSimulation/Forces/CollideForce.swift | 119 ---------- .../Forces/CompositedForce.swift | 7 +- .../ForceSimulation/Forces/EmptyForce.swift | 3 +- .../ForceSimulation/Forces/KDTreeForce.swift | 104 ++++++++ .../ForceSimulation/Forces/LinkForce.swift | 38 --- .../Forces/ManyBodyForce.swift | 80 +------ .../ForceSimulation/Forces/PackedForce.swift | 17 ++ .../Forces/PositionForce.swift | 12 - .../ForceSimulation/Forces/RadialForce.swift | 14 -- .../Forces/SealedForce2D.swift | 27 --- .../Forces/SealedForce3D.swift | 26 -- Tests/ForceSimulationTests/ForceTests.swift | 2 +- Tests/GrapeTests/ContentBuilderTests.swift | 63 +++++ .../GrapeTests/GraphContentBuilderTests.swift | 6 +- 18 files changed, 415 insertions(+), 342 deletions(-) create mode 100644 Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift create mode 100644 Sources/ForceSimulation/Forces/KDTreeForce.swift create mode 100644 Sources/ForceSimulation/Forces/PackedForce.swift create mode 100644 Tests/GrapeTests/ContentBuilderTests.swift diff --git a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift index 598fb90..ec6644f 100644 --- a/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift +++ b/Examples/ForceDirectedGraph3D/ForceDirectedGraph3D/ContentView.swift @@ -44,7 +44,7 @@ func buildSimulation() -> Simulation3D { forceField: My3DForce() ) - for i in 0..<720 { + for _ in 0..<720 { sim.tick() } return sim diff --git a/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift new file mode 100644 index 0000000..7133ae7 --- /dev/null +++ b/Examples/ForceDirectedGraphExample/ForceDirectedGraphExample/ForceDirectedLatticeView.swift @@ -0,0 +1,223 @@ +////// +////// ForceDirectedLatticeView.swift +////// ForceDirectedGraphExample +////// +////// Created by li3zhen1 on 10/18/23. +////// +//// +////import CoreGraphics +////import ForceSimulation +////import simd +////import SwiftUI +//// +////struct ForceDirectedLatticeView: View { +//// @State var points: [simd_double2]? = nil +//// +//<<<<<<< HEAD +// +//import CoreGraphics +//import ForceSimulation +//import simd +//import SwiftUI +// +//struct ForceDirectedLatticeView: View { +// @State var points: [simd_double2]? = nil +// +// private let sim: Simulation2D +// private let edgeIds: [(Int, Int)] +// private let nodeIds: [Int] +// private let canvasWidth: CGFloat = 800.0 +// let width = 36 +// +// init() { +// self.nodeIds = Array(0..<(width * width)) +// +// var edge = [(Int, Int)]() +// for i in 0.. +//// private let edgeIds: [(Int, Int)] +//// private let nodeIds: [Int] +//// private let canvasWidth: CGFloat = 800.0 +//// let width = 36 +//// +//// init() { +//// self.nodeIds = Array(0..<(width * width)) +//// +//// var edge = [(Int, Int)]() +//// for i in 0..>>>>>> protocol_force diff --git a/Sources/ForceSimulation/ForceProtocol.swift b/Sources/ForceSimulation/ForceProtocol.swift index 3975c99..74ef48f 100644 --- a/Sources/ForceSimulation/ForceProtocol.swift +++ b/Sources/ForceSimulation/ForceProtocol.swift @@ -4,13 +4,6 @@ public protocol ForceProtocol { associatedtype Vector where Vector: SimulatableVector & L2NormCalculatable - - - /// Takes a simulation state and modifies its node positions and velocities. - /// This is executed in each tick of the simulation. - // @inlinable func apply() - - /// Takes a simulation state and modifies its node positions and velocities. /// This is executed in each tick of the simulation. @inlinable func apply(to kinetics: inout Kinetics) diff --git a/Sources/ForceSimulation/Forces/CenterForce.swift b/Sources/ForceSimulation/Forces/CenterForce.swift index a2aa165..aeb0849 100644 --- a/Sources/ForceSimulation/Forces/CenterForce.swift +++ b/Sources/ForceSimulation/Forces/CenterForce.swift @@ -6,13 +6,6 @@ extension Kinetics { /// See [Collide Force - D3](https://d3js.org/d3-force/collide). public struct CenterForce: ForceProtocol { - // @usableFromInline var kinetics: Kinetics! = nil - - @inlinable - public func apply() { - fatalError() - } - @inlinable public func apply(to kinetics: inout Kinetics) { var meanPosition = Vector.zero diff --git a/Sources/ForceSimulation/Forces/CollideForce.swift b/Sources/ForceSimulation/Forces/CollideForce.swift index 8dbf115..07bb637 100644 --- a/Sources/ForceSimulation/Forces/CollideForce.swift +++ b/Sources/ForceSimulation/Forces/CollideForce.swift @@ -90,125 +90,6 @@ extension Kinetics { internal var tree: UnsafeMutablePointer>>! = nil - @inlinable - public func apply() { - fatalError() - // assert(self.kinetics != nil, "Kinetics not bound to force") - - // let strength = self.strength - // let calculatedRadius = self.calculatedRadius!.mutablePointer - // let positionBufferPointer = kinetics.position.mutablePointer - // let velocityBufferPointer = kinetics.velocity.mutablePointer - - // let tree = self.tree! - - // for _ in 0...cover(of: self.kinetics.position) - - // tree.pointee.reset( - // rootBox: coveringBox, - // rootDelegate: .init(radiusBufferPointer: calculatedRadius) - // ) - // assert(tree.pointee.validCount == 1) - - // for p in kinetics.range { - // tree.pointee.add(nodeIndex: p, at: positionBufferPointer[p]) - // } - - // for i in kinetics.range { - // let iOriginalPosition = positionBufferPointer[i] - // let iOriginalVelocity = velocityBufferPointer[i] - // let iR = calculatedRadius[i] - // let iR2 = iR * iR - // let iPosition = iOriginalPosition + iOriginalVelocity - // let random = kinetics.randomGenerator - - // tree.pointee.visit { t in - - // let maxRadiusOfQuad = t.delegate.maxNodeRadius - // let deltaR = maxRadiusOfQuad + iR - - // if var jNode = t.nodeIndices { - // while true { - // let j = jNode.index - // // print("\(i)<=>\(j)") - // // is leaf, make sure every collision happens once. - // if j > i { - - // let jR = calculatedRadius[j] - // let jOriginalPosition = positionBufferPointer[j] - // let jOriginalVelocity = velocityBufferPointer[j] - // var deltaPosition = - // iPosition - (jOriginalPosition + jOriginalVelocity) - // let l = (deltaPosition).lengthSquared() - - // let deltaR = iR + jR - // if l < deltaR * deltaR { - - // var l = /*simd_length*/ (deltaPosition.jiggled(by: random)) - // .length() - // l = (deltaR - l) / l * strength - - // let jR2 = jR * jR - - // let k = jR2 / (iR2 + jR2) - - // deltaPosition *= l - - // velocityBufferPointer[i] += deltaPosition * k - // velocityBufferPointer[j] -= deltaPosition * (1 - k) - // } - // } - // if jNode.next == nil { - // break - // } else { - // jNode = jNode.next!.pointee - // } - // } - // return false - // } - - // // TODO: SIMD mask - - // // for laneIndex in t.box.p0.indices { - // // let _v = t.box.p0[laneIndex] - // // if _v > iPosition[laneIndex] + deltaR /* True if no overlap */ { - // // return false - // // } - // // } - - // // for laneIndex in t.box.p1.indices { - // // let _v = t.box.p1[laneIndex] - // // if _v < iPosition[laneIndex] - deltaR /* True if no overlap */ { - // // return false - // // } - // // } - - // let p0Flag = t.box.p0 .> (iPosition + deltaR) - // let p1Flag = t.box.p1 .< (iPosition - deltaR) - // let flag = p0Flag .| p1Flag - - // for laneIndex in t.box.p0.indices { - // if flag[laneIndex] { - // return false - // } - // // let _v = t.box.p1[laneIndex] - // // if (t.box.p0[laneIndex] > iPosition[laneIndex] + deltaR) - // // || (t.box.p1[laneIndex] < iPosition[laneIndex] - // // - deltaR) /* True if no overlap */ - // // { - // // return false - // // } - // } - // return true - // } - // } - // } - } - - - @inlinable public func apply(to kinetics: inout Kinetics) { diff --git a/Sources/ForceSimulation/Forces/CompositedForce.swift b/Sources/ForceSimulation/Forces/CompositedForce.swift index 81f0b5c..25f454d 100644 --- a/Sources/ForceSimulation/Forces/CompositedForce.swift +++ b/Sources/ForceSimulation/Forces/CompositedForce.swift @@ -14,12 +14,7 @@ where self.force1 = force1 self.force2 = force2 } - // @inlinable - // public func apply() { - // self.force1?.apply() - // self.force2.apply() - // } - + @inlinable public func apply(to kinetics: inout Kinetics) { self.force1?.apply(to: &kinetics) diff --git a/Sources/ForceSimulation/Forces/EmptyForce.swift b/Sources/ForceSimulation/Forces/EmptyForce.swift index 2dec42a..740d85e 100644 --- a/Sources/ForceSimulation/Forces/EmptyForce.swift +++ b/Sources/ForceSimulation/Forces/EmptyForce.swift @@ -1,8 +1,7 @@ extension Kinetics { public struct EmptyForce: ForceProtocol { - @inlinable - public func apply() {} + @inlinable public func apply(to kinetics: inout Kinetics) {} diff --git a/Sources/ForceSimulation/Forces/KDTreeForce.swift b/Sources/ForceSimulation/Forces/KDTreeForce.swift new file mode 100644 index 0000000..d164967 --- /dev/null +++ b/Sources/ForceSimulation/Forces/KDTreeForce.swift @@ -0,0 +1,104 @@ +// public protocol KDTreeForce: ForceProtocol +// where +// Vector: SimulatableVector & L2NormCalculatable +// { +// associatedtype Delegate: KDTreeDelegate where Delegate.Vector == Vector, Delegate.NodeID == Int + +// var kinetics: Kinetics! { get set } + +// func epilogue() +// func buildDelegate() -> Delegate +// func visitForeignTree( +// tree: inout KDTree, getDelegate: (D) -> Delegate) +// } + +// public struct CompositedKDTreeDelegate: KDTreeDelegate +// where +// V: SimulatableVector & L2NormCalculatable, +// D1: KDTreeDelegate, D2: KDTreeDelegate +// { +// var d1: D1 +// var d2: D2 + +// mutating public func didAddNode(_ node: Int, at position: V) { +// d1.didAddNode(node, at: position) +// d2.didAddNode(node, at: position) +// } + +// mutating public func didRemoveNode(_ node: Int, at position: V) { +// d1.didRemoveNode(node, at: position) +// d2.didRemoveNode(node, at: position) +// } + +// public func spawn() -> CompositedKDTreeDelegate { +// return .init(d1: d1.spawn(), d2: d2.spawn()) +// } + +// } + +// extension Kinetics.ManyBodyForce: KDTreeForce { +// public typealias Delegate = MassCentroidKDTreeDelegate + +// public func epilogue() { + +// } + +// public func buildDelegate() -> MassCentroidKDTreeDelegate { +// return .init(massProvider: { self.precalculatedMass[$0] }) +// } + +// public func visitForeignTree( +// tree: inout KDTree, getDelegate: (D) -> MassCentroidKDTreeDelegate +// ) { + +// } +// } + +// extension Kinetics.CollideForce: KDTreeForce { +// public typealias Delegate = MaxRadiusNDTreeDelegate + +// public func epilogue() { + +// } + +// public func buildDelegate() -> MaxRadiusNDTreeDelegate { +// return .init(radiusProvider: { self.calculatedRadius[$0] }) +// } + +// public func visitForeignTree( +// tree: inout KDTree, getDelegate: (D) -> MaxRadiusNDTreeDelegate +// ) where D: KDTreeDelegate, Vector == D.Vector, D.NodeID == Int { + +// } +// } + +// public struct CompositedKDTreeForce: ForceProtocol +// where +// KF1: KDTreeForce, KF2: KDTreeForce, +// Vector: SimulatableVector & L2NormCalculatable, +// KF1.Vector == Vector, KF2.Vector == Vector, KF1.Vector == Vector +// { +// var force1: KF1 +// var force2: KF2 + +// public func apply() { +// force1.epilogue() +// force2.epilogue() + +// var tree = KDTree>( +// covering: force1.kinetics!.position, +// rootDelegate: CompositedKDTreeDelegate( +// d1: force1.buildDelegate(), +// d2: force2.buildDelegate() +// ) +// ) + +// force1.visitForeignTree(tree: &tree, getDelegate: \.d1) +// force2.visitForeignTree(tree: &tree, getDelegate: \.d2) +// } + +// public mutating func bindKinetics(_ kinetics: Kinetics) { + +// } + +// } diff --git a/Sources/ForceSimulation/Forces/LinkForce.swift b/Sources/ForceSimulation/Forces/LinkForce.swift index c757461..a04f88c 100644 --- a/Sources/ForceSimulation/Forces/LinkForce.swift +++ b/Sources/ForceSimulation/Forces/LinkForce.swift @@ -65,44 +65,6 @@ extension Kinetics { @usableFromInline var calculatedBias: [Vector.Scalar] = [] - @inlinable - public func apply() { - fatalError() - // let positionBufferPointer = kinetics.position.mutablePointer - // let velocityBufferPointer = kinetics.velocity.mutablePointer - // let random = kinetics.randomGenerator - // for _ in 0...cover(of: self.kinetics.position) - // tree.pointee.reset(rootBox: coveringBox, rootDelegate: .init(massProvider: precalculatedMass)) - // for p in kinetics.range { - // tree.pointee.add(nodeIndex: p, at: positionBufferPointer[p]) - // } - - // for i in self.kinetics.range { - // let pos = positionBufferPointer[i] - // var f = Vector.zero - // tree.pointee.visit { t in - - // guard t.delegate.accumulatedCount > 0 else { return false } - // let centroid = - // t.delegate.accumulatedMassWeightedPositions / t.delegate.accumulatedMass - - // let vec = centroid - pos - // let boxWidth = (t.box.p1 - t.box.p0)[0] - // var distanceSquared = - // (vec - // // .jiggled() - // .jiggled(by: random)).lengthSquared() - - // let farEnough: Bool = - // (distanceSquared * theta2) > (boxWidth * boxWidth) - - // if distanceSquared < distanceMin2 { - // distanceSquared = (distanceMin2 * distanceSquared).squareRoot() - // } - - // if farEnough { - - // guard distanceSquared < distanceMax2 else { return true } - - // /// Workaround for "The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions" - // let k: Vector.Scalar = - // strength * alpha * t.delegate.accumulatedMass - // / distanceSquared // distanceSquared.squareRoot() - - // f += vec * k - // return false - - // } else if t.childrenBufferPointer != nil { - // return true - // } - - // if t.isFilledLeaf { - - // if t.nodeIndices!.contains(i) { return false } - - // let massAcc = t.delegate.accumulatedMass - - // let k: Vector.Scalar = strength * alpha * massAcc / distanceSquared // distanceSquared.squareRoot() - // f += vec * k - // return false - // } else { - // return true - // } - // } - - // positionBufferPointer[i] += f / precalculatedMass[i] - // } - } - - + diff --git a/Sources/ForceSimulation/Forces/PackedForce.swift b/Sources/ForceSimulation/Forces/PackedForce.swift new file mode 100644 index 0000000..376a55a --- /dev/null +++ b/Sources/ForceSimulation/Forces/PackedForce.swift @@ -0,0 +1,17 @@ +// struct PackedForce: ForceProtocol where Vector: SIMD, Vector.Scalar: FloatingPoint, repeat each Force: ForceProtocol { +// let forces: (repeat each Force) + +// // var kinetics: Kinetics? + +// init(forces: repeat each Force) { +// self.forces = (repeat each forces) +// } + +// func apply() { +// repeat (each forces).apply() +// } + +// func bindKinetics(_ kinetics: Kinetics) { +// repeat (each forces).bindKinetics(kinetics) +// } +// } \ No newline at end of file diff --git a/Sources/ForceSimulation/Forces/PositionForce.swift b/Sources/ForceSimulation/Forces/PositionForce.swift index cd5f465..a64e0b1 100644 --- a/Sources/ForceSimulation/Forces/PositionForce.swift +++ b/Sources/ForceSimulation/Forces/PositionForce.swift @@ -24,18 +24,6 @@ extension Kinetics { public var targetOnDirection: TargetOnDirection public var calculatedTargetOnDirection: UnsafeArray! = nil - @inlinable - public func apply() { - // assert(self.kinetics != nil, "Kinetics not bound to force") - // let alpha = kinetics.alpha - // let lane = self.direction - // for i in kinetics.range { - // kinetics.velocity[i][lane] += - // (self.calculatedTargetOnDirection[i] - kinetics.position[i][lane]) - // * self.calculatedStrength[i] * alpha - // } - } - @inlinable public func apply(to kinetics: inout Kinetics) { let alpha = kinetics.alpha diff --git a/Sources/ForceSimulation/Forces/RadialForce.swift b/Sources/ForceSimulation/Forces/RadialForce.swift index dfb805b..729c99e 100644 --- a/Sources/ForceSimulation/Forces/RadialForce.swift +++ b/Sources/ForceSimulation/Forces/RadialForce.swift @@ -21,21 +21,7 @@ extension Kinetics { @usableFromInline var calculatedStrength: UnsafeArray! = nil - @inlinable - public func apply() { - // assert(self.kinetics != nil, "Kinetics not bound to force") - // let alpha = kinetics.alpha - // for i in kinetics.range { - // let nodeId = i - // let deltaPosition = (kinetics.position[i] - self.center).jiggled(by: kinetics.randomGenerator) //.jiggled() - // let r = (deltaPosition).length() - // let k = - // (self.calculatedRadius[nodeId] - // * self.calculatedStrength[nodeId] * alpha) / r - // kinetics.velocity[i] += deltaPosition * k - // } - } @inlinable public func apply(to kinetics: inout Kinetics) { diff --git a/Sources/ForceSimulation/Forces/SealedForce2D.swift b/Sources/ForceSimulation/Forces/SealedForce2D.swift index da39b46..3343c46 100644 --- a/Sources/ForceSimulation/Forces/SealedForce2D.swift +++ b/Sources/ForceSimulation/Forces/SealedForce2D.swift @@ -14,13 +14,6 @@ public struct SealedForce2D: Force2D { public var entries: [ForceEntry] = [] - @inlinable - public func apply() { - for force in self.entries { - force.apply() - } - } - @inlinable public func apply(to kinetics: inout Kinetics>) { for force in self.entries { @@ -79,26 +72,6 @@ public struct SealedForce2D: Force2D { case position(Kinetics2D.PositionForce) case empty - @inlinable - public func apply() { - switch self { - case .center(let force): - force.apply() - case .radial(let force): - force.apply() - case .manyBody(let force): - force.apply() - case .link(let force): - force.apply() - case .collide(let force): - force.apply() - case .position(let force): - force.apply() - default: - break - } - } - @inlinable public func dispose() { switch self { diff --git a/Sources/ForceSimulation/Forces/SealedForce3D.swift b/Sources/ForceSimulation/Forces/SealedForce3D.swift index 2a30afd..3077a2f 100644 --- a/Sources/ForceSimulation/Forces/SealedForce3D.swift +++ b/Sources/ForceSimulation/Forces/SealedForce3D.swift @@ -14,12 +14,6 @@ public struct SealedForce3D: Force3D { public var entries: [ForceEntry] = [] - @inlinable - public func apply() { - for force in self.entries { - force.apply() - } - } @inlinable public func apply(to kinetics: inout Kinetics>) { @@ -79,26 +73,6 @@ public struct SealedForce3D: Force3D { case position(Kinetics3D.PositionForce) case empty - @inlinable - public func apply() { - switch self { - case .center(let force): - force.apply() - case .radial(let force): - force.apply() - case .manyBody(let force): - force.apply() - case .link(let force): - force.apply() - case .collide(let force): - force.apply() - case .position(let force): - force.apply() - default: - break - } - } - @inlinable public func dispose() { switch self { diff --git a/Tests/ForceSimulationTests/ForceTests.swift b/Tests/ForceSimulationTests/ForceTests.swift index 4a95899..a6081b5 100644 --- a/Tests/ForceSimulationTests/ForceTests.swift +++ b/Tests/ForceSimulationTests/ForceTests.swift @@ -22,7 +22,7 @@ final class ForceTests: XCTestCase { forceField: myForce ) - for i in 0...10 { + for _ in 0...10 { simulation.tick() } diff --git a/Tests/GrapeTests/ContentBuilderTests.swift b/Tests/GrapeTests/ContentBuilderTests.swift new file mode 100644 index 0000000..928eb40 --- /dev/null +++ b/Tests/GrapeTests/ContentBuilderTests.swift @@ -0,0 +1,63 @@ + +import XCTest +import simd +import SwiftUI + +@testable import Grape + + + +final class ContentBuilderTests: XCTestCase { + func buildGraph( + @GraphContentBuilder _ builder: () -> some GraphContent + ) -> some GraphContent where NodeID: Hashable { + let result = builder() + return result + } + + func testForLoop() { + let _ = buildGraph { + Repeated(0..<10) { i in + NodeMark(id: i) + } + } + } + + func testMixed() { + let _ = buildGraph { + LinkMark(from: 0, to: 1) + + NodeMark(id: 3) + NodeMark(id: 4) + NodeMark(id: 5) + } + } + + func testConditional() { + // let _ = buildGraph { + // if true { + // NodeMark(id: 0) + // } else { + // NodeMark(id: 1) + // } + // } + } + + struct ID: Identifiable { + var id: Int + } + + func testForEach() { + let _ = [ + ID(id: 0), + ID(id: 1), + ID(id: 2), + ] + + // let _ = buildGraph { + // ForEach(data: arr) { i in + // NodeMark(id: i.id) + // } + // } + } +} \ No newline at end of file diff --git a/Tests/GrapeTests/GraphContentBuilderTests.swift b/Tests/GrapeTests/GraphContentBuilderTests.swift index 664998d..9c7eecf 100644 --- a/Tests/GrapeTests/GraphContentBuilderTests.swift +++ b/Tests/GrapeTests/GraphContentBuilderTests.swift @@ -25,20 +25,20 @@ final class GraphContentBuilderTests: XCTestCase { ID(id: 2), ] - let a = ForEach(arr) { i in + let a = Repeated(arr) { i in NodeMark(id: i.id) } let b = buildGraph { NodeMark(id: 0) - ForEach(arr) { i in + Repeated(arr) { i in NodeMark(id: i.id) } } let c = buildGraph { NodeMark(id: 0) - for i in 0..<10 { + Repeated(0..<10) { i in NodeMark(id: 0) } } From 686f473ec1b8d821e5328f272f0104fa9d2023fa Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 23:50:26 -0500 Subject: [PATCH 12/13] Remove Kinetics' disposable --- Sources/ForceSimulation/Kinetics.swift | 82 +----------------------- Sources/ForceSimulation/Simulation.swift | 1 + 2 files changed, 2 insertions(+), 81 deletions(-) diff --git a/Sources/ForceSimulation/Kinetics.swift b/Sources/ForceSimulation/Kinetics.swift index 72c24af..c40ca87 100644 --- a/Sources/ForceSimulation/Kinetics.swift +++ b/Sources/ForceSimulation/Kinetics.swift @@ -1,6 +1,6 @@ /// A class that holds the state of the simulation, which /// includes the positions, velocities of the nodes. -public struct Kinetics: Disposable +public struct Kinetics where Vector: SimulatableVector & L2NormCalculatable { /// The position of points stored in simulation. @@ -77,86 +77,6 @@ where Vector: SimulatableVector & L2NormCalculatable { self.randomGenerator = .init() } - // @inlinable - // init( - // links: [EdgeID], - // initialAlpha: Vector.Scalar, - // alphaMin: Vector.Scalar, - // alphaDecay: Vector.Scalar, - // alphaTarget: Vector.Scalar, - // velocityDecay: Vector.Scalar, - // position: consuming [Vector], - // velocity: consuming [Vector], - // fixation: consuming [Vector?], - // randomSeed: Vector.Scalar.Generator.OverflowingInteger - // ) { - // self.links = links - // self.initializedAlpha = initialAlpha - // self.alpha = initialAlpha - // self.alphaMin = alphaMin - // self.alphaDecay = alphaDecay - // self.alphaTarget = alphaTarget - // self.velocityDecay = velocityDecay - // let count = position.count - // self.validCount = count - - // self.position = UnsafeArray.createBuffer( - // withHeader: count, - // count: count, - // initialValue: .zero - // ) - - // self.velocity = UnsafeArray.createBuffer( - // withHeader: count, - // count: count, - // initialValue: .zero - // ) - // self.fixation = UnsafeArray.createBuffer( - // withHeader: count, - // count: count, - // initialValue: nil - // ) - - // self.randomGenerator = .allocate(capacity: 1) - // self.randomGenerator.initialize(to: .init(seed: randomSeed)) - // } - - // @inlinable - // internal func jigglePosition() { - // for i in range { - // position[i] = position[i].jiggled(by: self.randomGenerator) - // } - // } - - // @inlinable - // static func createZeros( - // links: [EdgeID], - // initialAlpha: Vector.Scalar, - // alphaMin: Vector.Scalar, - // alphaDecay: Vector.Scalar, - // alphaTarget: Vector.Scalar, - // velocityDecay: Vector.Scalar, - // count: Int - // ) -> Kinetics { - // return Kinetics( - // links: links, - // initialAlpha: initialAlpha, - // alphaMin: alphaMin, - // alphaDecay: alphaDecay, - // alphaTarget: alphaTarget, - // velocityDecay: velocityDecay, - - // position: Array(repeating: .zero, count: count), - // velocity: Array(repeating: .zero, count: count), - // fixation: Array(repeating: nil, count: count) - // ) - // } - - @inlinable - public func dispose() { - // self.randomGenerator.deinitialize(count: 1) - // self.randomGenerator.deallocate() - } } extension Kinetics { diff --git a/Sources/ForceSimulation/Simulation.swift b/Sources/ForceSimulation/Simulation.swift index 277ef4b..a0b1f5e 100644 --- a/Sources/ForceSimulation/Simulation.swift +++ b/Sources/ForceSimulation/Simulation.swift @@ -101,6 +101,7 @@ where Vector: SimulatableVector & L2NormCalculatable, ForceField: ForceProtocol< deinit { self.forceField.dispose() + self.kinetics.dispose() } } From a648adb66babf3763e57bb9593d1a1f30cf988bf Mon Sep 17 00:00:00 2001 From: "Li, Zhen" Date: Sat, 6 Jan 2024 23:50:48 -0500 Subject: [PATCH 13/13] Remove Kinetics' disposable --- Sources/ForceSimulation/Simulation.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/ForceSimulation/Simulation.swift b/Sources/ForceSimulation/Simulation.swift index a0b1f5e..277ef4b 100644 --- a/Sources/ForceSimulation/Simulation.swift +++ b/Sources/ForceSimulation/Simulation.swift @@ -101,7 +101,6 @@ where Vector: SimulatableVector & L2NormCalculatable, ForceField: ForceProtocol< deinit { self.forceField.dispose() - self.kinetics.dispose() } }

swift workflow - - swift package index - - - swift package index - - + swift package index + swift package index