From 4b98c7ce337851e28c8fab87937d33baf193d689 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Thu, 1 Apr 2021 11:18:03 +0200
Subject: [PATCH] First commit, init application

---
 .gitignore                                    |  37 ++
 .gitlab-ci.yml                                |  71 +++
 .metadata                                     |  10 +
 README.md                                     |  22 +-
 android/.gitignore                            |  11 +
 android/app/build.gradle                      |  87 +++
 android/app/src/debug/AndroidManifest.xml     |   7 +
 android/app/src/main/AndroidManifest.xml      |  30 +
 .../fluttercheckers/MainActivity.kt           |  12 +
 .../main/res/drawable/launch_background.xml   |  12 +
 .../src/main/res/mipmap-hdpi/ic_launcher.png  | Bin 0 -> 1913 bytes
 .../src/main/res/mipmap-mdpi/ic_launcher.png  | Bin 0 -> 1240 bytes
 .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2445 bytes
 .../main/res/mipmap-xxhdpi/ic_launcher.png    | Bin 0 -> 3866 bytes
 .../main/res/mipmap-xxxhdpi/ic_launcher.png   | Bin 0 -> 5358 bytes
 android/app/src/main/res/values/styles.xml    |   8 +
 android/app/src/profile/AndroidManifest.xml   |   7 +
 android/build.gradle                          |  31 ++
 android/gradle.properties                     |   6 +
 .../gradle/wrapper/gradle-wrapper.properties  |   6 +
 android/settings.gradle                       |  15 +
 icons/build_icons.sh                          |  51 ++
 icons/puissance4.svg                          |  24 +
 ios/.gitignore                                |  32 ++
 ios/Flutter/AppFrameworkInfo.plist            |  26 +
 ios/Flutter/Debug.xcconfig                    |   1 +
 ios/Flutter/Release.xcconfig                  |   1 +
 ios/Runner.xcodeproj/project.pbxproj          | 518 ++++++++++++++++++
 .../contents.xcworkspacedata                  |   7 +
 .../xcshareddata/xcschemes/Runner.xcscheme    |  91 +++
 .../contents.xcworkspacedata                  |   7 +
 ios/Runner/AppDelegate.swift                  |  13 +
 .../AppIcon.appiconset/Contents.json          | 122 +++++
 .../Icon-App-1024x1024@1x.png                 | Bin 0 -> 10932 bytes
 .../AppIcon.appiconset/Icon-App-20x20@1x.png  | Bin 0 -> 564 bytes
 .../AppIcon.appiconset/Icon-App-20x20@2x.png  | Bin 0 -> 1283 bytes
 .../AppIcon.appiconset/Icon-App-20x20@3x.png  | Bin 0 -> 1588 bytes
 .../AppIcon.appiconset/Icon-App-29x29@1x.png  | Bin 0 -> 1025 bytes
 .../AppIcon.appiconset/Icon-App-29x29@2x.png  | Bin 0 -> 1716 bytes
 .../AppIcon.appiconset/Icon-App-29x29@3x.png  | Bin 0 -> 1920 bytes
 .../AppIcon.appiconset/Icon-App-40x40@1x.png  | Bin 0 -> 1283 bytes
 .../AppIcon.appiconset/Icon-App-40x40@2x.png  | Bin 0 -> 1895 bytes
 .../AppIcon.appiconset/Icon-App-40x40@3x.png  | Bin 0 -> 2665 bytes
 .../AppIcon.appiconset/Icon-App-60x60@2x.png  | Bin 0 -> 2665 bytes
 .../AppIcon.appiconset/Icon-App-60x60@3x.png  | Bin 0 -> 3831 bytes
 .../AppIcon.appiconset/Icon-App-76x76@1x.png  | Bin 0 -> 1888 bytes
 .../AppIcon.appiconset/Icon-App-76x76@2x.png  | Bin 0 -> 3294 bytes
 .../Icon-App-83.5x83.5@2x.png                 | Bin 0 -> 3612 bytes
 .../LaunchImage.imageset/Contents.json        |  23 +
 .../LaunchImage.imageset/LaunchImage.png      | Bin 0 -> 68 bytes
 .../LaunchImage.imageset/LaunchImage@2x.png   | Bin 0 -> 68 bytes
 .../LaunchImage.imageset/LaunchImage@3x.png   | Bin 0 -> 68 bytes
 .../LaunchImage.imageset/README.md            |   5 +
 ios/Runner/Base.lproj/LaunchScreen.storyboard |  37 ++
 ios/Runner/Base.lproj/Main.storyboard         |  26 +
 ios/Runner/Info.plist                         |  45 ++
 ios/Runner/Runner-Bridging-Header.h           |   1 +
 lib/board.dart                                | 155 ++++++
 lib/coordinate.dart                           |  17 +
 lib/cpu.dart                                  | 116 ++++
 lib/cpu_level_page.dart                       |  90 +++
 lib/game_chip.dart                            |  33 ++
 lib/hole_painter.dart                         |  39 ++
 lib/home_page.dart                            |  85 +++
 lib/main.dart                                 |  37 ++
 lib/match_page.dart                           | 310 +++++++++++
 lib/player.dart                               |   7 +
 pubspec.lock                                  | 146 +++++
 pubspec.yaml                                  |  17 +
 web/icons/Icon-192.png                        | Bin 0 -> 5358 bytes
 web/icons/Icon-512.png                        | Bin 0 -> 17625 bytes
 web/index.html                                |  30 +
 web/manifest.json                             |  23 +
 73 files changed, 2506 insertions(+), 1 deletion(-)
 create mode 100644 .gitignore
 create mode 100644 .gitlab-ci.yml
 create mode 100644 .metadata
 create mode 100644 android/.gitignore
 create mode 100644 android/app/build.gradle
 create mode 100644 android/app/src/debug/AndroidManifest.xml
 create mode 100644 android/app/src/main/AndroidManifest.xml
 create mode 100644 android/app/src/main/kotlin/dev/benoitharrault/fluttercheckers/MainActivity.kt
 create mode 100644 android/app/src/main/res/drawable/launch_background.xml
 create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png
 create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png
 create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
 create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
 create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
 create mode 100644 android/app/src/main/res/values/styles.xml
 create mode 100644 android/app/src/profile/AndroidManifest.xml
 create mode 100644 android/build.gradle
 create mode 100644 android/gradle.properties
 create mode 100644 android/gradle/wrapper/gradle-wrapper.properties
 create mode 100644 android/settings.gradle
 create mode 100755 icons/build_icons.sh
 create mode 100644 icons/puissance4.svg
 create mode 100644 ios/.gitignore
 create mode 100644 ios/Flutter/AppFrameworkInfo.plist
 create mode 100644 ios/Flutter/Debug.xcconfig
 create mode 100644 ios/Flutter/Release.xcconfig
 create mode 100644 ios/Runner.xcodeproj/project.pbxproj
 create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
 create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
 create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata
 create mode 100644 ios/Runner/AppDelegate.swift
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
 create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
 create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
 create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
 create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
 create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
 create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
 create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard
 create mode 100644 ios/Runner/Base.lproj/Main.storyboard
 create mode 100644 ios/Runner/Info.plist
 create mode 100644 ios/Runner/Runner-Bridging-Header.h
 create mode 100644 lib/board.dart
 create mode 100644 lib/coordinate.dart
 create mode 100644 lib/cpu.dart
 create mode 100644 lib/cpu_level_page.dart
 create mode 100644 lib/game_chip.dart
 create mode 100644 lib/hole_painter.dart
 create mode 100644 lib/home_page.dart
 create mode 100644 lib/main.dart
 create mode 100644 lib/match_page.dart
 create mode 100644 lib/player.dart
 create mode 100644 pubspec.lock
 create mode 100644 pubspec.yaml
 create mode 100644 web/icons/Icon-192.png
 create mode 100644 web/icons/Icon-512.png
 create mode 100644 web/index.html
 create mode 100644 web/manifest.json

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ae1f183
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,37 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Exceptions to above rules.
+!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..a4a5781
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,71 @@
+image: cirrusci/flutter:latest
+
+stages:
+  - update
+  - build-debug
+  - build-release
+  - deploy
+
+update:
+  stage: update
+  script:
+    - flutter packages get
+    - flutter packages upgrade
+  interruptible: true
+
+android:build-debug:
+  stage: build-debug
+  script:
+    # Flutter local configuration
+    - echo flutter.sdk=$FLUTTER_PATH > android/local.properties
+    - echo sdk.dir=$ANDROID_SDK_PATH >> android/local.properties
+    - echo flutter.buildMode=debug >> android/local.properties
+    # Android signing
+    - echo "$ANDROID_DEBUG_KEYSTORE_FILE" | base64 -d > android/app/my.keystore
+    - echo storeFile=my.keystore > android/key.properties
+    - echo storePassword=$ANDROID_DEBUG_KEYSTORE_PASSWORD >> android/key.properties
+    - echo keyAlias=$ANDROID_DEBUG_KEY_ALIAS >> android/key.properties
+    - echo keyPassword=$ANDROID_DEBUG_KEY_PASSWORD >> android/key.properties
+    # build flutter app
+    - flutter build apk --debug
+    - ls -l build/app/outputs/flutter-apk
+    - md5sum build/app/outputs/flutter-apk/*
+  artifacts:
+    paths:
+    - build/app/outputs/flutter-apk
+    expire_in: 1 week
+  interruptible: true
+
+android:build-release:
+  stage: build-release
+  only:
+    - master
+  dependencies:
+    - android:build-debug
+  script:
+    # Flutter local configuration
+    - echo flutter.sdk=$FLUTTER_PATH > android/local.properties
+    - echo sdk.dir=$ANDROID_SDK_PATH >> android/local.properties
+    - echo flutter.buildMode=release >> android/local.properties
+    # Android signing
+    - echo "$ANDROID_KEYSTORE_FILE" | base64 -d > android/app/my.keystore
+    - echo storeFile=my.keystore > android/key.properties
+    - echo storePassword=$ANDROID_KEYSTORE_PASSWORD >> android/key.properties
+    - echo keyAlias=$ANDROID_KEY_ALIAS >> android/key.properties
+    - echo keyPassword=$ANDROID_KEY_PASSWORD >> android/key.properties
+    # build flutter app
+    - flutter build apk
+  # artifacts:
+  #   paths:
+  #   - build/app/outputs/apk/release
+  #   expire_in: 1 week
+  interruptible: true
+
+android:deploy:
+  stage: deploy
+  only:
+    - master
+  dependencies:
+    - android:build-release
+  script:
+    - wget ${REPOSITORY_UPDATE_WEBHOOK}?token=${REPOSITORY_TOKEN}
diff --git a/.metadata b/.metadata
new file mode 100644
index 0000000..4adf4bf
--- /dev/null
+++ b/.metadata
@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+  revision: f139b11009aeb8ed2a3a3aa8b0066e482709dde3
+  channel: stable
+
+project_type: app
diff --git a/README.md b/README.md
index 4a66e3e..aa41f0a 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,22 @@
-# puissance 4
+# Puissance4
 
+Four-in-a-row game in Flutter
+
+## Game modes
+
+-   Player vs Player (only local)
+-   Player vs Cpu
+    -   Dumb
+    -   Hard
+    -   Hardest
+-   Demo (Cpu Hard vs Cpu Hardest)
+
+## Getting Started
+
+Run the application to play :)
+
+`flutter run`
+
+## Contributions
+
+Contributions of any kind are more than welcome! Feel free to fork and improve the project in any way you want, make a pull request, or open an issue.
diff --git a/android/.gitignore b/android/.gitignore
new file mode 100644
index 0000000..0a741cb
--- /dev/null
+++ b/android/.gitignore
@@ -0,0 +1,11 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
diff --git a/android/app/build.gradle b/android/app/build.gradle
new file mode 100644
index 0000000..df8e916
--- /dev/null
+++ b/android/app/build.gradle
@@ -0,0 +1,87 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+    localPropertiesFile.withReader('UTF-8') { reader ->
+        localProperties.load(reader)
+    }
+}
+
+def gradleProperties = new Properties()
+def gradlePropertiesFile = rootProject.file('gradle.properties')
+if (gradlePropertiesFile.exists()) {
+    gradlePropertiesFile.withReader('UTF-8') { reader ->
+        gradleProperties.load(reader)
+    }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+    throw new FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def appVersionCode = gradleProperties.getProperty('app.versionCode')
+if (appVersionCode == null) {
+    appVersionCode = '1'
+}
+
+def appVersionName = gradleProperties.getProperty('app.versionName')
+if (appVersionName == null) {
+    appVersionName = '1.0'
+}
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
+android {
+    compileSdkVersion 28
+
+    sourceSets {
+        main.java.srcDirs += 'src/main/kotlin'
+    }
+
+    lintOptions {
+        disable 'InvalidPackage'
+    }
+
+    defaultConfig {
+        applicationId "org.benoitharrault.puissance4"
+        minSdkVersion 16
+        targetSdkVersion 28
+        versionCode appVersionCode.toInteger()
+        versionName appVersionName
+        archivesBaseName = "$applicationId" + "_" + "$versionCode"
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    signingConfigs {
+        release {
+            keyAlias keystoreProperties['keyAlias']
+            keyPassword keystoreProperties['keyPassword']
+            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+            storePassword keystoreProperties['storePassword']
+        }
+    }
+    buildTypes {
+        release {
+            signingConfig signingConfigs.release
+        }
+    }
+}
+
+flutter {
+    source '../..'
+}
+
+dependencies {
+    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'androidx.test:runner:1.1.1'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+}
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..11f0e99
--- /dev/null
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.benoitharrault.puissance4">
+    <!-- Flutter needs it to communicate with the running application
+         to allow setting breakpoints, to provide hot reload, etc.
+    -->
+    <uses-permission android:name="android.permission.INTERNET"/>
+</manifest>
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..2db8d6c
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.benoitharrault.puissance4">
+    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
+         calls FlutterMain.startInitialization(this); in its onCreate method.
+         In most cases you can leave this as-is, but you if you want to provide
+         additional functionality it is fine to subclass or reimplement
+         FlutterApplication and put your custom class here. -->
+    <application
+        android:name="io.flutter.app.FlutterApplication"
+        android:label="puissance4"
+        android:icon="@mipmap/ic_launcher">
+        <activity
+            android:name=".MainActivity"
+            android:launchMode="singleTop"
+            android:theme="@style/LaunchTheme"
+            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
+            android:hardwareAccelerated="true"
+            android:windowSoftInputMode="adjustResize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+        <!-- Don't delete the meta-data below.
+             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
+        <meta-data
+            android:name="flutterEmbedding"
+            android:value="2" />
+    </application>
+</manifest>
diff --git a/android/app/src/main/kotlin/dev/benoitharrault/fluttercheckers/MainActivity.kt b/android/app/src/main/kotlin/dev/benoitharrault/fluttercheckers/MainActivity.kt
new file mode 100644
index 0000000..c63f773
--- /dev/null
+++ b/android/app/src/main/kotlin/dev/benoitharrault/fluttercheckers/MainActivity.kt
@@ -0,0 +1,12 @@
+package org.benoitharrault.puissance4
+
+import androidx.annotation.NonNull;
+import io.flutter.embedding.android.FlutterActivity
+import io.flutter.embedding.engine.FlutterEngine
+import io.flutter.plugins.GeneratedPluginRegistrant
+
+class MainActivity: FlutterActivity() {
+    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
+        GeneratedPluginRegistrant.registerWith(flutterEngine);
+    }
+}
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..304732f
--- /dev/null
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Modify this file to customize your launch splash screen -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@android:color/white" />
+
+    <!-- You can insert your own image assets here -->
+    <!-- <item>
+        <bitmap
+            android:gravity="center"
+            android:src="@mipmap/launch_image" />
+    </item> -->
+</layer-list>
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ae54846b522bf3c03e558b3e5a6969a9d1cd9cb
GIT binary patch
literal 1913
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
VajcrxxY|J#p{J{#%Q~loCICfCj2Qp`

literal 0
HcmV?d00001

diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d344c1d18c48904fa2b9c703cfd8db2b9c84703
GIT binary patch
literal 1240
zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_I14-?iy0UsmVq$i?8^I*
z3=9mCC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NHH)l{toa7ab<vk1_p*u
z28Pg31_uWQ2L}gZV`FV??NDuPPZbph1qDkP8B0qUV`C{dJv|3)ZEJOPa}^a&6%`jH
zB?kos8(ld|Z5c~#ZFg;LXAKQ2Wo2g_MF(vKTTOXOH8lqn6+2~R2Mq-~b#*Hh6(<!H
z2W@2=4JB)J#RoxZ5B!w=6uJK?b^jQw^e<lTf1=)}V5O%4%FhFp|K-^I4O99Tru08t
z>3@XE^FRng`G17U|47yUQL6u=)c!}S|Buo5AEWs{R_lL)?*9b6|B3qllMMbR8U9Z(
z`k!L_Kh5lay7~Wfi~kvx|1&NBXIcNxwf~>*^uN&cf05h&V)y^mf&XiR|JR26uM7QO
zANIc?;(uf0|E8$_P0{~b;{LbB|8GzH-<SP=Lhk>m#s8<3{GV3(e@6NLSylh%HT<97
z@PB^e|Aj68S5NrAX43z)lmD-q@_+r*|Ldpy-!T3E#u@)N&iub=*8eSY{%@W8f5*cA
zI~V`ov;6<QRsRpH`G0uB|05g!pV;>Q<c|NRcKtuS`~R8U|Ih9Jf9df5OGo}+IsX6Z
ziT~G5{=aka|NX1~A6)zY@W%f~H~&Ar_5bnh|4;A!e|GQx^9TQ5Kl%Uq>Hjy+{=a?x
z|Lu$aAK(1{`1b#&cmF@V|NrH~|1Tf^fBp3T$JhTqzWx9C{r|6@|Ns2{|L4#DfB*jf
z|9?zJdm#e@gJnsOUoZnB6B9Et3kxe78#@OlCl@ylFCQPjfS{0&kg%Azgru~Ltb(Gl
zvWl8|U{G-IqsNb*Jbn7~@87?Fca{8Kz`(#H>FMGa;?cSH+Vk+s2_nZos^=OW6bsB+
zxkLS3FVl352QC4DcdDmb6)r60Kf)NYL62*T#;qsc(|;Xun{?&*$>N%a-(%11oL_ut
z&yMXqfA@<NzRQev5Dj}$E^ySo@Y59!%k3U1UKvfXYu03aU6a*n^v^EaW6{-BU!(RV
z^zy9WZ0`~|CJ}sPQ<h|a?RJ|N$vuXy-KQE)%~Y*BCK24V{B)!0X0@jWc`P@Sl)b!v
z@Lk1qhqNXCQ}?)XncV-|S+mn!_uc~^F$cYycjuZgr1(`g&S0$Bvt@F}3e9hv26|lw
zSIV5}t9rfi-?Yv<oPrrrjgp)HUnon+XlE#4DxY)zlU%`U{%!vcJlFNx@KyWRw!(v~
z4~%y1;+pfkN!=j&Zo>S|<1rujn%`9}GPzge$hEh1fw-ogghRZd$D;Y%_YzhJ@H{pZ
zw_)Mi^_-uPf5!uvg1fwV4Cy-;7&c#wJ@@ljzC_*wrd@0{>o=djzL#O0fV|1FhTp$_
z?3u@4XTrfCE5W+!TZDggJmXC>Ax5j2tozjaUb+0*ctm1?rC*Xm?t8`q9?N+dUflMN
zYcM;`zE<_a(puq4W~IL;&ZgVi`djl^+s$Ao*u;1<^e4NA-s7X!jKU5VCH&j+XBU5q
z*@=eUi$Pz%a|SVGryf|f;ML~7JD*Co&RZLwwtG*P*u2dNfvWpkKWjPF{hrIma(a<y
u)1rw&S4(e(u8o+mjFs!3O~uiF8{;=#+3+G|YjrTFobhz^b6Mw<&;$T)Ltk$I

literal 0
HcmV?d00001

diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..66985645d09ff2ddf16a8980040b8cde9dabd822
GIT binary patch
literal 2445
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
Uy7%H37#J8lUHx3vIVCg!0OTfiO#lD@

literal 0
HcmV?d00001

diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9c870678b3e390629b827e52a03c19e7547fe56
GIT binary patch
literal 3866
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

literal 0
HcmV?d00001

diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..704152c09c843a0a90437522ffe11f9b5f5eef04
GIT binary patch
literal 5358
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
K&t;ucLK6UAR_(k1

literal 0
HcmV?d00001

diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..00fa441
--- /dev/null
+++ b/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
+        <!-- Show a splash screen on the activity. Automatically removed when
+             Flutter draws its first frame -->
+        <item name="android:windowBackground">@drawable/launch_background</item>
+    </style>
+</resources>
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..11f0e99
--- /dev/null
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.benoitharrault.puissance4">
+    <!-- Flutter needs it to communicate with the running application
+         to allow setting breakpoints, to provide hot reload, etc.
+    -->
+    <uses-permission android:name="android.permission.INTERNET"/>
+</manifest>
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..3100ad2
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,31 @@
+buildscript {
+    ext.kotlin_version = '1.3.50'
+    repositories {
+        google()
+        jcenter()
+    }
+
+    dependencies {
+        classpath 'com.android.tools.build:gradle:3.5.0'
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+    }
+}
+
+allprojects {
+    repositories {
+        google()
+        jcenter()
+    }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+    project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+    project.evaluationDependsOn(':app')
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 0000000..51eb66b
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,6 @@
+org.gradle.jvmargs=-Xmx1536M
+android.enableR8=true
+android.useAndroidX=true
+android.enableJetifier=true
+app.versionName=1.0.0
+app.versionCode=1
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..296b146
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Jun 23 08:50:38 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
diff --git a/android/settings.gradle b/android/settings.gradle
new file mode 100644
index 0000000..5a2f14f
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1,15 @@
+include ':app'
+
+def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
+
+def plugins = new Properties()
+def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
+if (pluginsFile.exists()) {
+    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
+}
+
+plugins.each { name, path ->
+    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
+    include ":$name"
+    project(":$name").projectDir = pluginDirectory
+}
diff --git a/icons/build_icons.sh b/icons/build_icons.sh
new file mode 100755
index 0000000..4d4b438
--- /dev/null
+++ b/icons/build_icons.sh
@@ -0,0 +1,51 @@
+#! /bin/bash
+
+# Check dependencies
+command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
+command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
+command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
+command -v convert >/dev/null 2>&1 || { echo >&2 "I require convert (imagemagick) but it's not installed. Aborting."; exit 1; }
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+BASE_DIR="$(dirname "${CURRENT_DIR}")"
+
+SOURCE="${CURRENT_DIR}/puissance4.svg"
+OPTIPNG_OPTIONS="-preserve -quiet -o7"
+
+# optimize svg
+cp ${SOURCE} ${SOURCE}.tmp
+scour \
+    --remove-descriptive-elements \
+    --enable-id-stripping \
+    --enable-viewboxing \
+    --enable-comment-stripping \
+    --nindent=4 \
+    -i ${SOURCE}.tmp \
+    -o ${SOURCE}
+rm ${SOURCE}.tmp
+
+# build icons
+function build_icon() {
+  ICON_SIZE="$1"
+  TARGET="$2"
+
+  TARGET_PNG="${TARGET}.png"
+
+  inkscape \
+      --export-width=${ICON_SIZE} \
+      --export-height=${ICON_SIZE} \
+      --export-filename=${TARGET_PNG} \
+      ${SOURCE}
+
+  optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
+}
+
+
+build_icon  72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher
+build_icon  48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher
+build_icon  96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher
+build_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher
+build_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher
+
+build_icon 192 ${BASE_DIR}/web/icons/Icon-192
+build_icon 512 ${BASE_DIR}/web/icons/Icon-512
diff --git a/icons/puissance4.svg b/icons/puissance4.svg
new file mode 100644
index 0000000..f285de3
--- /dev/null
+++ b/icons/puissance4.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 28.747 28.747" xmlns="http://www.w3.org/2000/svg">
+    <defs>
+        <filter id="filter6206-7" color-interpolation-filters="sRGB">
+            <feGaussianBlur stdDeviation="0.658125"/>
+        </filter>
+    </defs>
+    <g transform="translate(0,-1093.8)">
+        <path transform="matrix(1.0781 0 0 1.0641 -.093733 2.7509)" d="m4.4177 1028.2v1.6051h-1.6052v18.192h1.6052v2.1402h18.192v-2.1402h2.1402v-18.192h-2.1402v-1.6051z" fill="#3e2723" filter="url(#filter6206-7)" opacity=".2"/>
+        <rect x="2.9987" y="1096.8" width="22.749" height="22.749" rx="1.1973" ry="1.1974" fill="#ff5722"/>
+        <path d="m4.1958 1096.8c-0.66332 0-1.1979 0.5346-1.1979 1.1979v0.3334c0-0.6634 0.53459-1.1979 1.1979-1.1979h20.354c0.66332 0 1.1979 0.5345 1.1979 1.1979v-0.3334c0-0.6633-0.5346-1.1979-1.1979-1.1979z" fill="#fff" opacity=".2"/>
+        <g transform="matrix(.37344 0 0 .37344 4.7333 1097.4)">
+            <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
+        </g>
+        <g transform="matrix(.36471 0 0 .36471 5.1356 1097.4)">
+            <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
+        </g>
+        <path d="m24.549 1119.5c0.66325 0 1.1979-0.5346 1.1979-1.1979v-0.3333c0 0.6632-0.53461 1.1978-1.1979 1.1978h-20.354c-0.66325 0-1.1979-0.5346-1.1979-1.1978v0.3333c0 0.6633 0.53461 1.1979 1.1979 1.1979z" fill="#3e2723" opacity=".2"/>
+    </g>
+    <g transform="matrix(.29602 0 0 .29602 6.7952 6.7952)" stroke-width="1.0667">
+        <path d="m0 0h51.2v51.2h-51.2z" fill="none"/>
+        <path d="m25.587 1.3672c-13.298 0-24.044 10.772-24.044 24.057s10.745 24.057 24.044 24.057 24.07-10.772 24.07-24.057-10.772-24.057-24.07-24.057zm0.01337 42.768c-10.331 0-18.711-8.3799-18.711-18.711 0-10.331 8.3799-18.711 18.711-18.711s18.711 8.3799 18.711 18.711c0 10.331-8.3665 18.711-18.711 18.711z" fill="#fff"/>
+    </g>
+</svg>
diff --git a/ios/.gitignore b/ios/.gitignore
new file mode 100644
index 0000000..e96ef60
--- /dev/null
+++ b/ios/.gitignore
@@ -0,0 +1,32 @@
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000..6b4c0f7
--- /dev/null
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>$(DEVELOPMENT_LANGUAGE)</string>
+  <key>CFBundleExecutable</key>
+  <string>App</string>
+  <key>CFBundleIdentifier</key>
+  <string>io.flutter.flutter.app</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>App</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1.0</string>
+  <key>MinimumOSVersion</key>
+  <string>8.0</string>
+</dict>
+</plist>
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
new file mode 100644
index 0000000..592ceee
--- /dev/null
+++ b/ios/Flutter/Debug.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
new file mode 100644
index 0000000..592ceee
--- /dev/null
+++ b/ios/Flutter/Release.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..8315dbd
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,518 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+		3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
+		3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+		9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
+		9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
+				9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
+			);
+			name = "Embed Frameworks";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
+		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
+		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
+		3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; };
+		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
+		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
+		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
+		9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; };
+		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		97C146EB1CF9000F007C117D /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
+				3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		9740EEB11CF90186004384FC /* Flutter */ = {
+			isa = PBXGroup;
+			children = (
+				3B80C3931E831B6300D905FE /* App.framework */,
+				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+				9740EEBA1CF902C7004384FC /* Flutter.framework */,
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+				9740EEB31CF90195004384FC /* Generated.xcconfig */,
+			);
+			name = Flutter;
+			sourceTree = "<group>";
+		};
+		97C146E51CF9000F007C117D = {
+			isa = PBXGroup;
+			children = (
+				9740EEB11CF90186004384FC /* Flutter */,
+				97C146F01CF9000F007C117D /* Runner */,
+				97C146EF1CF9000F007C117D /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		97C146EF1CF9000F007C117D /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				97C146EE1CF9000F007C117D /* Runner.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		97C146F01CF9000F007C117D /* Runner */ = {
+			isa = PBXGroup;
+			children = (
+				97C146FA1CF9000F007C117D /* Main.storyboard */,
+				97C146FD1CF9000F007C117D /* Assets.xcassets */,
+				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+				97C147021CF9000F007C117D /* Info.plist */,
+				97C146F11CF9000F007C117D /* Supporting Files */,
+				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+				74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+				74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+			);
+			path = Runner;
+			sourceTree = "<group>";
+		};
+		97C146F11CF9000F007C117D /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		97C146ED1CF9000F007C117D /* Runner */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+			buildPhases = (
+				9740EEB61CF901F6004384FC /* Run Script */,
+				97C146EA1CF9000F007C117D /* Sources */,
+				97C146EB1CF9000F007C117D /* Frameworks */,
+				97C146EC1CF9000F007C117D /* Resources */,
+				9705A1C41CF9048500538489 /* Embed Frameworks */,
+				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = Runner;
+			productName = Runner;
+			productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		97C146E61CF9000F007C117D /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 1020;
+				ORGANIZATIONNAME = "The Chromium Authors";
+				TargetAttributes = {
+					97C146ED1CF9000F007C117D = {
+						CreatedOnToolsVersion = 7.3.1;
+						LastSwiftMigration = 1100;
+					};
+				};
+			};
+			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 97C146E51CF9000F007C117D;
+			productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				97C146ED1CF9000F007C117D /* Runner */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		97C146EC1CF9000F007C117D /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "Thin Binary";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
+		};
+		9740EEB61CF901F6004384FC /* Run Script */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "Run Script";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		97C146EA1CF9000F007C117D /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				97C146FB1CF9000F007C117D /* Base */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				97C147001CF9000F007C117D /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		249021D3217E4FDB00AE95B9 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = 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_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_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = iphoneos;
+				SUPPORTED_PLATFORMS = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Profile;
+		};
+		249021D4217E4FDB00AE95B9 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.puissance4;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				SWIFT_VERSION = 5.0;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Profile;
+		};
+		97C147031CF9000F007C117D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = 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_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_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		97C147041CF9000F007C117D /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = 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_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_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = iphoneos;
+				SUPPORTED_PLATFORMS = iphoneos;
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		97C147061CF9000F007C117D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.puissance4;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Debug;
+		};
+		97C147071CF9000F007C117D /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.puissance4;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				SWIFT_VERSION = 5.0;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				97C147031CF9000F007C117D /* Debug */,
+				97C147041CF9000F007C117D /* Release */,
+				249021D3217E4FDB00AE95B9 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				97C147061CF9000F007C117D /* Debug */,
+				97C147071CF9000F007C117D /* Release */,
+				249021D4217E4FDB00AE95B9 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..1d526a1
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Runner.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..a28140c
--- /dev/null
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1020"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+               BuildableName = "Runner.app"
+               BlueprintName = "Runner"
+               ReferencedContainer = "container:Runner.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Profile"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..1d526a1
--- /dev/null
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Runner.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..70693e4
--- /dev/null
+++ b/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+  override func application(
+    _ application: UIApplication,
+    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+  ) -> Bool {
+    GeneratedPluginRegistrant.register(with: self)
+    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+  }
+}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..d36b1fa
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+  "images" : [
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "83.5x83.5",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-83.5x83.5@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "1024x1024",
+      "idiom" : "ios-marketing",
+      "filename" : "Icon-App-1024x1024@1x.png",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332
GIT binary patch
literal 10932
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
QlAxuUp00i_>zopr0K8b=b^rhX

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f
GIT binary patch
literal 564
zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4mJh`hTcwDUIqpR#^NA%Cx&(BWL`2bFuwD2
zaSX8#TsvjAw@jeOvGY5>_q|>h+1u6fBdexi<)tM8-3iJOH-6e{csS^|t`^`h%M4z^
zvrUsp%yCUni-1dr!HteCeu1-6sf(@4&z-gOX8TrnJhnM~hPD2_`!&xEoBNpM46ZP5
z>RM6Fs4Du%wQt&V4?nF#Au;N4dCxlR<XldO9-6?g%eZUVFOxLhq?If5795yX*H)3r
zcr-L!Dsz*&v#QSl(?&xbdB=-h`NEg}1Tfsq{4(uywXxqq5w)$a&)ne^j#c_lpTP8G
z*_&ovJMIUWi|u_Gk1ED$Xa95SQ_5@D^>EhFOs+Q*8UNIXwA$#oIyO8|+tqV&R#9*$
zUnSd|Hw&5HJe<YZ<N71*xK-Ib1>-|^3yuFWnr2?uxcNuK(*U^*-n;k6AAGamV&=3x
zQTjVJM+cmBEL?H-jDy2s*;QO>QThRLANE|lxz@Sy?+%4F#V^}4%*``0mhkR1xTsnd
zsl4K{bVpgeu!#g~y%YEC?D&;me>Lr&{KSK$>&ee#llSpUG=!hMOnEB&rtbEo$NBpo
ze0#XwfU{CPz~%7UQ+uQ}ChR*S%%W*wac<_u>)Jc^mA`9MySCxd!B^Kd#zy?>WBq3t
zA?<j7a@z02UrV#jFFU2SH1ENFaf?TqF86c<HRj3ddVAgxk5KwL|Js^`@zZL)>x*4_
W$LnK$#EXG}fx*+&&t;ucLK6TGg!*^@

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ccbfd967d9697cd4b83225558af2911e9571c9b
GIT binary patch
literal 1283
zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2y{PI<aGhE&WsI>R?dBvs;g
z{d;TUyFpPJ%eF4Kv7n|^zp=ULn1t;EM$XP7lUeld*i<WYMHn1eEM+Rk!LA?E!ztJy
zD8yIC>OAGhrAO=?vmAmpT<U+jYxid3dVb^0cemaCn{#@yPnp^KJ?}ry{%?H#%xAl{
z8!DE^W+>R*XMV$8#$?-Y`cDL-1XCS@pJejB8Rvppy6eq7etCUAujg?q<WvaP_dQE4
z{y3yycZjut%lnV#r5Q_NT~$>j6J!e{Uv#AAYb{|~a_aH522J@Q@fi&BOpfuWHHbGp
zf5x@0=W&%z;t#%xYZ_i1#tsY?XV=JR1*ru$Xe%q8GYMi`*I43cb15zIa$ef*g)OP`
zxn+8uo27Eb>{9r}R#PV@sJksCu`zk^$I#qqi)ZJWE@$GC^4#7iY9ct-)8d8n31bVb
zX;lK#VjdrPy!sZ;@og0)Rhw5$KOp&F-NcXuofoDxM?Z25Q1Tbd+xYNCT0eV~Php(s
z<cV5Oqt_M$Mm(3`W4LW2^O=pEcVCd0)6OHW!U}d3U4JIHF7H4Q=S9Q*f&ljpaicX$
z!zMRzPZfB&W>r(KmiUp+T6+&?C9dbVk>SLWbgX<w;Owuib8E8IxITQlYSWzjwe_o?
zU#jS)hV?5lUU-G>@7~0v#&fvx<GF_OUrTZeT5o(*zs?;a!Ie>}_S)%a@u$R+v$Lgb
zcLiOYf4R$3h^y$~8P-z=e?C;X^D^2|@K|_BOOua4qui|r8!K13nyLg|73lx<s9^v3
zvz!;@UdMXwyu6)h+Ey2blZUP~$h(=BrA$6PZRxgW&$lFPoN%IEU%xNr>rZXr*ju;F
zgx|erIDfsIxhjhHXMvIP?8enx7P6mu>*fc1c=y;ahGSjp;lGuBcQh{SzH#ApT49dK
z`Ang8Y6pT&Jlr#3(Hn0W*>~S9f3}}*)^yfuapkkQmiJL7h52FRWrLWr4F+59@QKX*
z&iiA|j)#}$b~)uf+UVL>vE{JpQwhGc<u`8Kl#sa+s53)ilYsTF7rV~0@BgWj-}_+F
z>;jIHlKqXlCF80s&R_HEmS6Euygc@5k7ASXhVP2g(|73{u6(F=?yx`%zx0!xh0k=>
z@2~H(ejI6YT%e^_^d0ZiKSyPK{bY7bNiOgy*`?Sx*{Rj0zP_&O%zjCcZ5wK1&7b$b
zS-4u+Re)>xxmODx+IoKSah(vkF4bmQOJ?4@n*L71#9h^eYmdsG-&9-ce|Um#?yRl}
zHz)kP-&6SUG5^IIEML~BMqVrRQjA}+dhu305AQAA`6pzU9W{1E>(0+>-l`ogtQT#4
zv{I4dqgB+-Pp<{^Wvq|eKaP}%{%owt&7)o~)wHF}A<4B|UA%w)kz-Te{&=aQJFhvL
zcU`h$Qee7tc-{WP?;gh+O*;8F!nyT<D)aZAC7TcAEpl@>Ed4_zXS=)6n^)GSALu(@
zFj_mOP`4*Na%-LC^ZU2XzIy6y&|qkMNLIl0d(*@(Mjs@LFW7h~w7dO(eCMgX;W}ey
z)$1FVT(;b{_T{serM4|X+iVsv?@3bGd0_hizGsX6s!a`EBIo^}j%A+F$3@YdzmBZj
z*|cUF%e7fvr+yyrOFrYjRQJK&Nt+6#ztwGP_&n*`Q6J-9SNuJG)iEwe+w485%%@SC
z)0^p~ht+}=x9!*b3^nYjoiqK*szo(3n7-R@emEuiR&Q1|0|Nttr>mdKI;Vst04OMA
Ap8x;=

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c
GIT binary patch
literal 1588
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
KKbLh*2~7ZftovC2

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..4cde12118dda48d71e01fcb589a74d069c5d7cb5
GIT binary patch
literal 1025
zcmeAS@N?(olHy`uVBq!ia0y~yV2}l24mJh`hOo)${0t1tCp=voLn`KMo$i|v6Do4N
z{`<b~Ml(xh`LD=b>FK#DR4OpQeBF{oZd^@ytAg%E#Qb2~b^X?|T}6qm0$PzPyj`7G
zy_Gu?Tvy63oEqf4uq)x$(ur!5kEj^Gzq`Ntx7tjVxiiC8v%gDvxBLB{bJyoo%T4N0
zVODtQ=;^K!J27NZ$iBu<udg*~FCT{NPxs`yB%kkH^y~kVxl@EEL=|Y%PVng3d}#8q
z<uOzJJgdYHcvLY+uqG)m@JPD6bPRpZxu$Va^MN0sr8bOC2?so^*lbvKh};Sgs%$+h
z%z0c-{RwkH(}6=il6kTD6)&fCJPV0F<;TF?Bk39J5G@vA`r&eC%fk5NqHDVarDk-x
z#vd$NV4viCPRBKQ>KQ4|sNM5<Z%F-|(6+L@mi2H#y-Rk8FvrT>|D|4BlJT3qaC^dy
z`Al<PiMy#~=q4m2sI}#?9&Y^C@l7N{dP<V>i+Wy`_(SF_GH?1bcJn2~W`yzIR&v&n
zHwq7(^p$5v+Sf3x^?C*FF4e(q*QF|>HkSQxN`4T-liuBTV8bK*O%EQdEA!sxwmOn=
z?UScxwmjbZIdxYN+ghe~{*9XrWo&{UU72!%^|WrmE}d^*TJBs<%zjqs`ZenD!Q0Wg
z)z!{jsrNI}RyWA{w*5T9?C;-wPVEGH0LQ{N4|eXGuy?QG!nJd+n?Brnto>zY-v1XL
z^bO0mMaTI!UQYe^r=s(u>x)yB0SOPXB<H>3tXO586LHe?cEZ!6=k?X@+|Imt;Z5WD
zy7))8PqyglPMaOg!<eMimcFg+%}dVdtM<*i@^<glqlSk1ah8#fj-)uHpW86uz%GZJ
zw`Vq2PrkAD=<^FRj+H0h?MwOaQ24{w`J9WV3-2mw+thra!*cfH?eczx7q&g<onjPw
zjQ4gzN^Pp$O<AJ~_apM$N(OAR^An%#UT;yE(la-|=fm|kN{yx}>(U-fn|rcqYiLo;
zi<r*s=eT9%pIz!-&S{>jtaq;Xd#<$P&F$UmocfM*F7Q)L-FK^}@kZzL?dBhoKEIE#
zDxCIWncWkao!4w0KVN51@IfQ|xfjc|2d{o4sfadyjXc04r0&GMzV4H7e%%jVlkmGw
zj<WvBzklLH_U;>ZE<P&GxmID5uF}h7ebPdivmo=ww_2NX?D2nmX7ukdOgxZNIPZ5^
z&a=hh@6uz7I}T1L(l)+SsQgm!fyQ-9UMtRQp6;h9NB3=Q+b^CRHOpyHfoAp9%MTXU
zxm(RSx3th|dD^5SsnY$cpWR!?W#DoBcVyz#M|0+{2w$IlV#1PuNwNR-ePFXu%k;VA
q^R|5R?a8lx23>mWT{!KG{qOgR*SIgbw=gg;FnGH9xvX<aXaWFyM)8~g

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658
GIT binary patch
literal 1716
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
V&a^duV_;xl@O1TaS?83{1OVHl_EP`=

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..dcdc2306c28505ebc0b6c3a359c4d252bf626b9f
GIT binary patch
literal 1920
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

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ccbfd967d9697cd4b83225558af2911e9571c9b
GIT binary patch
literal 1283
zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2y{PI<aGhE&WsI>R?dBvs;g
z{d;TUyFpPJ%eF4Kv7n|^zp=ULn1t;EM$XP7lUeld*i<WYMHn1eEM+Rk!LA?E!ztJy
zD8yIC>OAGhrAO=?vmAmpT<U+jYxid3dVb^0cemaCn{#@yPnp^KJ?}ry{%?H#%xAl{
z8!DE^W+>R*XMV$8#$?-Y`cDL-1XCS@pJejB8Rvppy6eq7etCUAujg?q<WvaP_dQE4
z{y3yycZjut%lnV#r5Q_NT~$>j6J!e{Uv#AAYb{|~a_aH522J@Q@fi&BOpfuWHHbGp
zf5x@0=W&%z;t#%xYZ_i1#tsY?XV=JR1*ru$Xe%q8GYMi`*I43cb15zIa$ef*g)OP`
zxn+8uo27Eb>{9r}R#PV@sJksCu`zk^$I#qqi)ZJWE@$GC^4#7iY9ct-)8d8n31bVb
zX;lK#VjdrPy!sZ;@og0)Rhw5$KOp&F-NcXuofoDxM?Z25Q1Tbd+xYNCT0eV~Php(s
z<cV5Oqt_M$Mm(3`W4LW2^O=pEcVCd0)6OHW!U}d3U4JIHF7H4Q=S9Q*f&ljpaicX$
z!zMRzPZfB&W>r(KmiUp+T6+&?C9dbVk>SLWbgX<w;Owuib8E8IxITQlYSWzjwe_o?
zU#jS)hV?5lUU-G>@7~0v#&fvx<GF_OUrTZeT5o(*zs?;a!Ie>}_S)%a@u$R+v$Lgb
zcLiOYf4R$3h^y$~8P-z=e?C;X^D^2|@K|_BOOua4qui|r8!K13nyLg|73lx<s9^v3
zvz!;@UdMXwyu6)h+Ey2blZUP~$h(=BrA$6PZRxgW&$lFPoN%IEU%xNr>rZXr*ju;F
zgx|erIDfsIxhjhHXMvIP?8enx7P6mu>*fc1c=y;ahGSjp;lGuBcQh{SzH#ApT49dK
z`Ang8Y6pT&Jlr#3(Hn0W*>~S9f3}}*)^yfuapkkQmiJL7h52FRWrLWr4F+59@QKX*
z&iiA|j)#}$b~)uf+UVL>vE{JpQwhGc<u`8Kl#sa+s53)ilYsTF7rV~0@BgWj-}_+F
z>;jIHlKqXlCF80s&R_HEmS6Euygc@5k7ASXhVP2g(|73{u6(F=?yx`%zx0!xh0k=>
z@2~H(ejI6YT%e^_^d0ZiKSyPK{bY7bNiOgy*`?Sx*{Rj0zP_&O%zjCcZ5wK1&7b$b
zS-4u+Re)>xxmODx+IoKSah(vkF4bmQOJ?4@n*L71#9h^eYmdsG-&9-ce|Um#?yRl}
zHz)kP-&6SUG5^IIEML~BMqVrRQjA}+dhu305AQAA`6pzU9W{1E>(0+>-l`ogtQT#4
zv{I4dqgB+-Pp<{^Wvq|eKaP}%{%owt&7)o~)wHF}A<4B|UA%w)kz-Te{&=aQJFhvL
zcU`h$Qee7tc-{WP?;gh+O*;8F!nyT<D)aZAC7TcAEpl@>Ed4_zXS=)6n^)GSALu(@
zFj_mOP`4*Na%-LC^ZU2XzIy6y&|qkMNLIl0d(*@(Mjs@LFW7h~w7dO(eCMgX;W}ey
z)$1FVT(;b{_T{serM4|X+iVsv?@3bGd0_hizGsX6s!a`EBIo^}j%A+F$3@YdzmBZj
z*|cUF%e7fvr+yyrOFrYjRQJK&Nt+6#ztwGP_&n*`Q6J-9SNuJG)iEwe+w485%%@SC
z)0^p~ht+}=x9!*b3^nYjoiqK*szo(3n7-R@emEuiR&Q1|0|Nttr>mdKI;Vst04OMA
Ap8x;=

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2
GIT binary patch
literal 1895
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
OVDNPHb6Mw<&;$VbO<Vi`

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22
GIT binary patch
literal 2665
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

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22
GIT binary patch
literal 2665
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

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680
GIT binary patch
literal 3831
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
U*#tT>FfcH9y85}Sb4q9e0QKHA1^@s6

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d
GIT binary patch
literal 1888
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
O7(8A5T-G@yGywok=Zg*i

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a84f41e14e27f4b11f16f9ee39279ac98f8d5ac
GIT binary patch
literal 3294
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

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0e1f58536026aebc4f1f70e481f6993c9ff088d
GIT binary patch
literal 3612
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

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..0bedcf2
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0y~yU|<Ac4i*LmhOII@ObiSR+@3CuAr*6yf1PJwU}9%v
Vnk8dc$iTqB;OXk;vd$@?2>@r242}Q*

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0y~yU|<Ac4i*LmhOII@ObiSR+@3CuAr*6yf1PJwU}9%v
Vnk8dc$iTqB;OXk;vd$@?2>@r242}Q*

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0y~yU|<Ac4i*LmhOII@ObiSR+@3CuAr*6yf1PJwU}9%v
Vnk8dc$iTqB;OXk;vd$@?2>@r242}Q*

literal 0
HcmV?d00001

diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000..89c2725
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..f2e259c
--- /dev/null
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
+                        <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
+                            </imageView>
+                        </subviews>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <constraints>
+                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
+                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
+                        </constraints>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+    <resources>
+        <image name="LaunchImage" width="168" height="185"/>
+    </resources>
+</document>
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..f3c2851
--- /dev/null
+++ b/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
+    </dependencies>
+    <scenes>
+        <!--Flutter View Controller-->
+        <scene sceneID="tne-QT-ifu">
+            <objects>
+                <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
+                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+            </objects>
+        </scene>
+    </scenes>
+</document>
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
new file mode 100644
index 0000000..59f3eda
--- /dev/null
+++ b/ios/Runner/Info.plist
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>puissance4</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>$(FLUTTER_BUILD_NAME)</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>$(FLUTTER_BUILD_NUMBER)</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UILaunchStoryboardName</key>
+	<string>LaunchScreen</string>
+	<key>UIMainStoryboardFile</key>
+	<string>Main</string>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UIViewControllerBasedStatusBarAppearance</key>
+	<false/>
+</dict>
+</plist>
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..7335fdf
--- /dev/null
+++ b/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
\ No newline at end of file
diff --git a/lib/board.dart b/lib/board.dart
new file mode 100644
index 0000000..36eaa4f
--- /dev/null
+++ b/lib/board.dart
@@ -0,0 +1,155 @@
+import 'package:puissance4/coordinate.dart';
+
+import 'match_page.dart';
+
+class Board {
+  List<List<Color>> _boxes = List.generate(
+    7,
+    (i) => List.generate(
+      7,
+      (i) => null,
+    ),
+  );
+
+  Board();
+
+  Board.from(List<List<Color>> boxes) {
+    _boxes = boxes;
+  }
+
+  Color getBox(Coordinate coordinate) => _boxes[coordinate.col][coordinate.row];
+
+  int getColumnTarget(int col) => _boxes[col].lastIndexOf(null);
+
+  void setBox(Coordinate coordinate, Color player) =>
+      _boxes[coordinate.col][coordinate.row] = player;
+
+  void reset() {
+    _boxes.forEach((r) => r.forEach((p) => p = null));
+  }
+
+  bool checkWinner(Coordinate coordinate, Color player) {
+    return checkHorizontally(coordinate, player) ||
+        checkVertically(coordinate, player) ||
+        checkDiagonally(coordinate, player);
+  }
+
+  bool checkHorizontally(Coordinate coordinate, Color player) {
+    var r = 0;
+    for (;
+        coordinate.col + r < 7 &&
+            r < 4 &&
+            getBox(coordinate.copyWith(col: coordinate.col + r)) == player;
+        ++r) {}
+    if (r >= 4) {
+      return true;
+    }
+
+    var l = 0;
+    for (;
+        coordinate.col - l >= 0 &&
+            l < 4 &&
+            getBox(coordinate.copyWith(col: coordinate.col - l)) == player;
+        ++l) {}
+    if (l >= 4 || l + r >= 5) {
+      return true;
+    }
+
+    return false;
+  }
+
+  bool checkDiagonally(Coordinate coordinate, Color player) {
+    var ur = 0;
+    for (;
+        coordinate.col + ur < 7 &&
+            coordinate.row + ur < 7 &&
+            ur < 4 &&
+            getBox(coordinate.copyWith(
+                  col: coordinate.col + ur,
+                  row: coordinate.row + ur,
+                )) ==
+                player;
+        ++ur) {}
+    if (ur >= 4) {
+      return true;
+    }
+    var dl = 0;
+    for (;
+        coordinate.col - dl >= 0 &&
+            coordinate.row - dl >= 0 &&
+            dl < 4 &&
+            getBox(coordinate.copyWith(
+                  col: coordinate.col - dl,
+                  row: coordinate.row - dl,
+                )) ==
+                player;
+        ++dl) {}
+    if (dl >= 4 || dl + ur >= 5) {
+      return true;
+    }
+
+    var dr = 0;
+    for (;
+        coordinate.col + dr < 7 &&
+            coordinate.row - dr >= 0 &&
+            dr < 4 &&
+            getBox(coordinate.copyWith(
+                  col: coordinate.col + dr,
+                  row: coordinate.row - dr,
+                )) ==
+                player;
+        ++dr) {}
+    if (dr >= 4) {
+      return true;
+    }
+
+    var ul = 0;
+    for (;
+        coordinate.col - ul >= 0 &&
+            coordinate.row + ul < 7 &&
+            ul < 4 &&
+            getBox(coordinate.copyWith(
+                  col: coordinate.col - ul,
+                  row: coordinate.row + ul,
+                )) ==
+                player;
+        ++ul) {}
+    if (ul >= 4 || dr + ul >= 5) {
+      return true;
+    }
+    return false;
+  }
+
+  bool checkVertically(Coordinate coordinate, Color player) {
+    var u = 0;
+    for (;
+        coordinate.row + u < 7 &&
+            u < 4 &&
+            getBox(coordinate.copyWith(
+                  row: coordinate.row + u,
+                )) ==
+                player;
+        ++u) {}
+    if (u >= 4) {
+      return true;
+    }
+    var d = 0;
+    for (;
+        coordinate.row - d >= 0 &&
+            d < 4 &&
+            getBox(coordinate.copyWith(
+                  row: coordinate.row - d,
+                )) ==
+                player;
+        ++d) {}
+    if (d >= 4 || d + u >= 5) {
+      return true;
+    }
+
+    return false;
+  }
+
+  Board clone() {
+    return Board.from(_boxes.map((c) => c.map((b) => b).toList()).toList());
+  }
+}
diff --git a/lib/coordinate.dart b/lib/coordinate.dart
new file mode 100644
index 0000000..c8cbca4
--- /dev/null
+++ b/lib/coordinate.dart
@@ -0,0 +1,17 @@
+class Coordinate {
+  final int row, col;
+
+  Coordinate(
+    this.col,
+    this.row,
+  );
+
+  Coordinate copyWith({
+    int col,
+    int row,
+  }) =>
+      Coordinate(
+        col ?? this.col,
+        row ?? this.row,
+      );
+}
diff --git a/lib/cpu.dart b/lib/cpu.dart
new file mode 100644
index 0000000..cd5af2c
--- /dev/null
+++ b/lib/cpu.dart
@@ -0,0 +1,116 @@
+import 'dart:math';
+
+import 'board.dart';
+import 'coordinate.dart';
+import 'match_page.dart';
+
+abstract class Cpu {
+  final Color color;
+  final Random _random = Random(DateTime.now().millisecond);
+
+  Cpu(this.color);
+
+  Color get otherPlayer => color == Color.RED ? Color.YELLOW : Color.RED;
+
+  Future<int> chooseCol(Board board);
+}
+
+class DumbCpu extends Cpu {
+  DumbCpu(Color player) : super(player);
+
+  Color get otherPlayer => color == Color.RED ? Color.YELLOW : Color.RED;
+
+  @override
+  Future<int> chooseCol(Board board) async {
+    await Future.delayed(Duration(seconds: _random.nextInt(2)));
+    int col = _random.nextInt(7);
+
+    return col;
+  }
+
+  @override
+  String toString() => 'DUMB CPU';
+}
+
+class HarderCpu extends Cpu {
+  HarderCpu(Color player) : super(player);
+
+  @override
+  Future<int> chooseCol(Board board) async {
+    final List<double> scores = List.filled(7, 0);
+
+    await Future.delayed(Duration(seconds: 1 + _random.nextInt(2)));
+    return _compute(board, 0, 1, scores);
+  }
+
+  int _compute(Board board, int step, int deepness, List<double> scores) {
+    for (var i = 0; i < 7; ++i) {
+      final boardCopy = board.clone();
+
+      final target = boardCopy.getColumnTarget(i);
+      if (target == -1) {
+        scores[i] = null;
+        continue;
+      }
+
+      final coordinate = Coordinate(i, target);
+
+      boardCopy.setBox(coordinate, color);
+      if (boardCopy.checkWinner(coordinate, color)) {
+        scores[i] += deepness / (step + 1);
+        continue;
+      }
+
+      for (var j = 0; j < 7; ++j) {
+        final target = boardCopy.getColumnTarget(j);
+        if (target == -1) {
+          continue;
+        }
+
+        final coordinate = Coordinate(j, target);
+
+        boardCopy.setBox(coordinate, otherPlayer);
+        if (boardCopy.checkWinner(coordinate, otherPlayer)) {
+          scores[i] -= deepness / (step + 1);
+          continue;
+        }
+
+        if (step + 1 < deepness) {
+          _compute(board, step + 1, deepness, scores);
+        }
+      }
+    }
+
+    return _getBestScoreIndex(scores);
+  }
+
+  int _getBestScoreIndex(List<double> scores) {
+    int bestScoreIndex = scores.indexWhere((s) => s != null);
+    scores.asMap().forEach((index, score) {
+      if (score != null &&
+          (score > scores[bestScoreIndex] ||
+              (score == scores[bestScoreIndex] && _random.nextBool()))) {
+        bestScoreIndex = index;
+      }
+    });
+    return bestScoreIndex;
+  }
+
+  @override
+  String toString() => 'HARDER CPU';
+}
+
+class HardestCpu extends HarderCpu {
+  HardestCpu(Color player) : super(player);
+
+  @override
+  Future<int> chooseCol(Board board) async {
+    final List<double> scores = List.filled(7, 0);
+
+    await Future.delayed(Duration(seconds: 2 + _random.nextInt(2)));
+    return _compute(board, 0, 4, scores);
+  }
+
+  @override
+  String toString() => 'HARDEST CPU';
+}
diff --git a/lib/cpu_level_page.dart b/lib/cpu_level_page.dart
new file mode 100644
index 0000000..f116346
--- /dev/null
+++ b/lib/cpu_level_page.dart
@@ -0,0 +1,90 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+import 'package:puissance4/cpu.dart';
+
+import 'match_page.dart';
+
+class CpuLevelPage extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        elevation: 0,
+      ),
+      backgroundColor: Colors.blue,
+      body: Center(
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          mainAxisSize: MainAxisSize.max,
+          children: <Widget>[
+            FlatButton(
+              color: Colors.yellow,
+              child: Text(
+                'DUMB',
+                style: Theme.of(context)
+                    .textTheme
+                    .display2
+                    .copyWith(color: Colors.black),
+              ),
+              onPressed: () {
+                Navigator.pushNamed(
+                  context,
+                  '/match',
+                  arguments: {
+                    'mode': Mode.PVC,
+                    'cpu':
+                        DumbCpu(Random().nextBool() ? Color.RED : Color.YELLOW),
+                  },
+                );
+              },
+            ),
+            FlatButton(
+              color: Colors.red,
+              child: Text(
+                'HARD',
+                style: Theme.of(context)
+                    .textTheme
+                    .display2
+                    .copyWith(color: Colors.white),
+              ),
+              onPressed: () {
+                Navigator.pushNamed(
+                  context,
+                  '/match',
+                  arguments: {
+                    'mode': Mode.PVC,
+                    'cpu': HarderCpu(
+                        Random().nextBool() ? Color.RED : Color.YELLOW),
+                  },
+                );
+              },
+            ),
+            FlatButton(
+              color: Colors.deepPurpleAccent,
+              child: Text(
+                'HARDEST',
+                style: Theme.of(context)
+                    .textTheme
+                    .display2
+                    .copyWith(color: Colors.white),
+              ),
+              onPressed: () {
+                Navigator.pushNamed(
+                  context,
+                  '/match',
+                  arguments: {
+                    'mode': Mode.PVC,
+                    'cpu': HardestCpu(
+                        Random().nextBool() ? Color.RED : Color.YELLOW),
+                  },
+                );
+              },
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/game_chip.dart b/lib/game_chip.dart
new file mode 100644
index 0000000..1c737c3
--- /dev/null
+++ b/lib/game_chip.dart
@@ -0,0 +1,33 @@
+import 'package:flutter/material.dart';
+
+import 'match_page.dart';
+
+class GameChip extends StatelessWidget {
+  const GameChip({
+    Key key,
+    this.translation,
+    @required this.color,
+  }) : super(key: key);
+
+  final Animation<double> translation;
+  final Color color;
+
+  @override
+  Widget build(BuildContext context) {
+    return Center(
+      child: Container(
+        transform: Matrix4.translationValues(
+          0,
+          ((translation?.value ?? 1) * 400) - 400,
+          0,
+        ),
+        height: 40,
+        width: 40,
+        child: Material(
+          shape: CircleBorder(),
+          color: color == Color.RED ? Colors.red : Colors.yellow,
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/hole_painter.dart b/lib/hole_painter.dart
new file mode 100644
index 0000000..ebabafb
--- /dev/null
+++ b/lib/hole_painter.dart
@@ -0,0 +1,39 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+
+class HolePainter extends CustomPainter {
+  @override
+  void paint(Canvas canvas, Size size) {
+    final paint = Paint();
+    paint.color = Colors.blue;
+    paint.style = PaintingStyle.fill;
+
+    final center = Offset(size.height / 2, size.width / 2);
+
+    final circleBounds = Rect.fromCircle(center: center, radius: 20);
+
+    final topPath = Path()
+      ..moveTo(-1, -1)
+      ..lineTo(-1, (size.height / 2) + 1)
+      ..arcTo(circleBounds, -pi, pi, false)
+      ..lineTo(size.width + 1, (size.height / 2) + 1)
+      ..lineTo(size.width + 1, -1)
+      ..close();
+    final bottomPath = Path()
+      ..moveTo(-1, size.height)
+      ..lineTo(-1, (size.height / 2) - 1)
+      ..arcTo(circleBounds, pi, -pi, false)
+      ..lineTo(size.width + 1, (size.height / 2) - 1)
+      ..lineTo(size.width + 1, size.height + 1)
+      ..close();
+
+    canvas.drawPath(topPath, paint);
+    canvas.drawPath(bottomPath, paint);
+  }
+
+  @override
+  bool shouldRepaint(CustomPainter oldDelegate) {
+    return false;
+  }
+}
diff --git a/lib/home_page.dart b/lib/home_page.dart
new file mode 100644
index 0000000..b9c4ffb
--- /dev/null
+++ b/lib/home_page.dart
@@ -0,0 +1,85 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+import 'package:puissance4/cpu.dart';
+
+import 'match_page.dart';
+
+class HomePage extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: Colors.blue,
+      body: Center(
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          mainAxisSize: MainAxisSize.max,
+          children: <Widget>[
+            FlatButton(
+              color: Colors.green,
+              child: Text(
+                'VS PLAYER',
+                style: Theme.of(context)
+                    .textTheme
+                    .display2
+                    .copyWith(color: Colors.white),
+              ),
+              onPressed: () {
+                Navigator.pushNamed(
+                  context,
+                  '/match',
+                  arguments: {
+                    'mode': Mode.PVP,
+                  },
+                );
+              },
+            ),
+            FlatButton(
+              color: Colors.black,
+              child: Text(
+                'VS CPU',
+                style: Theme.of(context)
+                    .textTheme
+                    .display2
+                    .copyWith(color: Colors.white),
+              ),
+              onPressed: () {
+                Navigator.pushNamed(
+                  context,
+                  '/cpu-level',
+                  arguments: {
+                    'mode': Mode.PVC,
+                  },
+                );
+              },
+            ),
+            FlatButton(
+              color: Colors.white,
+              child: Text(
+                'DEMO',
+                style: Theme.of(context)
+                    .textTheme
+                    .display2
+                    .copyWith(color: Colors.black),
+              ),
+              onPressed: () {
+                final harderCpu =
+                    HarderCpu(Random().nextBool() ? Color.RED : Color.YELLOW);
+                Navigator.pushNamed(
+                  context,
+                  '/match',
+                  arguments: {
+                    'mode': Mode.DEMO,
+                    'cpu': harderCpu,
+                    'cpu2': HardestCpu(harderCpu.otherPlayer),
+                  },
+                );
+              },
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/main.dart b/lib/main.dart
new file mode 100644
index 0000000..f6f5777
--- /dev/null
+++ b/lib/main.dart
@@ -0,0 +1,37 @@
+import 'package:flutter/material.dart';
+import 'package:puissance4/cpu_level_page.dart';
+import 'package:puissance4/home_page.dart';
+import 'package:puissance4/match_page.dart';
+
+void main() => runApp(MyApp());
+
+class MyApp extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return MaterialApp(
+      title: 'Flutter fiar',
+      theme: ThemeData(
+        primarySwatch: Colors.blue,
+      ),
+      home: HomePage(),
+      onGenerateRoute: (settings) {
+        final args = settings.arguments as Map<String, dynamic>;
+        if (settings.name == '/match') {
+          return MaterialPageRoute(
+            builder: (context) => MatchPage(
+              mode: args['mode'],
+              cpu: args['cpu'],
+              cpu2: args['cpu2'],
+            ),
+          );
+        } else if (settings.name == '/cpu-level') {
+          return MaterialPageRoute(
+            builder: (context) => CpuLevelPage(),
+          );
+        }
+
+        return null;
+      },
+    );
+  }
+}
diff --git a/lib/match_page.dart b/lib/match_page.dart
new file mode 100644
index 0000000..b1ea45a
--- /dev/null
+++ b/lib/match_page.dart
@@ -0,0 +1,310 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+import 'package:puissance4/coordinate.dart';
+
+import 'board.dart';
+import 'cpu.dart';
+import 'game_chip.dart';
+import 'hole_painter.dart';
+
+enum Color {
+  YELLOW,
+  RED,
+}
+
+enum Mode {
+  PVP,
+  PVC,
+  DEMO,
+}
+
+class MatchPage extends StatefulWidget {
+  final Mode mode;
+  final Cpu cpu;
+  final Cpu cpu2;
+
+  const MatchPage({
+    Key key,
+    this.mode,
+    this.cpu,
+    this.cpu2,
+  }) : super(key: key);
+
+  @override
+  _MatchPageState createState() => _MatchPageState();
+}
+
+class _MatchPageState extends State<MatchPage> with TickerProviderStateMixin {
+  final board = Board();
+  Color turn;
+  Color winner;
+
+  List<List<Animation<double>>> translations = List.generate(
+    7,
+    (i) => List.generate(
+      7,
+      (i) => null,
+    ),
+  );
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        elevation: 0,
+      ),
+      backgroundColor: Colors.blue,
+      body: Padding(
+        padding: const EdgeInsets.all(16.0),
+        child: Flex(
+          direction: Axis.vertical,
+          mainAxisSize: MainAxisSize.max,
+          children: <Widget>[
+            Flexible(
+              flex: 2,
+              child: Container(
+                constraints: BoxConstraints.loose(
+                  Size(
+                    500,
+                    532,
+                  ),
+                ),
+                child: Padding(
+                  padding: const EdgeInsets.only(top: 32.0),
+                  child: Stack(
+                    overflow: Overflow.clip,
+                    fit: StackFit.loose,
+                    children: <Widget>[
+                      Positioned.fill(
+                        child: Container(
+                          color: Colors.white,
+                        ),
+                      ),
+                      buildPieces(),
+                      buildBoard(),
+                    ],
+                  ),
+                ),
+              ),
+            ),
+            Flexible(
+              flex: 1,
+              child: Padding(
+                padding: const EdgeInsets.all(32.0),
+                child: winner != null
+                    ? Text(
+                        '${winner == Color.RED ? 'RED' : 'YELLOW'} WINS',
+                        textAlign: TextAlign.center,
+                        style: Theme.of(context)
+                            .textTheme
+                            .display3
+                            .copyWith(color: Colors.white),
+                      )
+                    : Column(
+                        children: <Widget>[
+                          Text(
+                            '${turn == Color.RED ? 'RED' : 'YELLOW'} SPEAKS',
+                            textAlign: TextAlign.center,
+                            style: Theme.of(context)
+                                .textTheme
+                                .title
+                                .copyWith(color: Colors.white),
+                          ),
+                          Padding(
+                            padding: const EdgeInsets.all(8.0),
+                            child: GameChip(color: turn),
+                          ),
+                          _buildPlayerName(context),
+                        ],
+                      ),
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Text _buildPlayerName(BuildContext context) {
+    String name;
+
+    if (widget.mode == Mode.PVC) {
+      if (turn == widget.cpu.color) {
+        name = 'CPU - ${widget.cpu.toString()}';
+      } else {
+        name = 'USER';
+      }
+    } else if (widget.mode == Mode.PVP) {
+      if (turn == Color.RED) {
+        name = 'PLAYER1';
+      } else {
+        name = 'PLAYER2';
+      }
+    } else {
+      if (turn == widget.cpu.color) {
+        name = 'CPU1 - ${widget.cpu.toString()}';
+      } else {
+        name = 'CPU2 - ${widget.cpu2.toString()}';
+      }
+    }
+    return Text(
+      name,
+      textAlign: TextAlign.center,
+      style: Theme.of(context).textTheme.title.copyWith(color: Colors.white),
+    );
+  }
+
+  @override
+  void initState() {
+    super.initState();
+    turn = widget.cpu?.otherPlayer ??
+        (Random().nextBool() ? Color.RED : Color.YELLOW);
+    if (widget.mode == Mode.PVC && turn == widget.cpu.color) {
+      cpuMove(widget.cpu);
+    } else if (widget.mode == Mode.DEMO) {
+      if (turn == widget.cpu.color) {
+        cpuMove(widget.cpu);
+      } else {
+        cpuMove(widget.cpu2);
+      }
+    }
+  }
+
+  GridView buildPieces() {
+    return GridView.custom(
+      padding: const EdgeInsets.all(0),
+      shrinkWrap: true,
+      physics: NeverScrollableScrollPhysics(),
+      gridDelegate:
+          SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 7),
+      childrenDelegate: SliverChildBuilderDelegate(
+        (context, i) {
+          final col = i % 7;
+          final row = i ~/ 7;
+
+          if (board.getBox(Coordinate(col, row)) == null) {
+            return SizedBox();
+          }
+
+          return GameChip(
+            translation: translations[col][row],
+            color: board.getBox(Coordinate(col, row)),
+          );
+        },
+        childCount: 49,
+      ),
+    );
+  }
+
+  GridView buildBoard() {
+    return GridView.custom(
+      padding: const EdgeInsets.all(0),
+      physics: NeverScrollableScrollPhysics(),
+      gridDelegate:
+          SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 7),
+      shrinkWrap: true,
+      childrenDelegate: SliverChildBuilderDelegate(
+        (context, i) {
+          final col = i % 7;
+
+          return GestureDetector(
+            onTap: () {
+              if (winner == null) {
+                userMove(col);
+              }
+            },
+            child: CustomPaint(
+              size: Size(50, 50),
+              willChange: false,
+              painter: HolePainter(),
+            ),
+          );
+        },
+        childCount: 49,
+      ),
+    );
+  }
+
+  void userMove(int col) {
+    putChip(col);
+    if (winner == null && widget.mode == Mode.PVC) {
+      cpuMove(widget.cpu);
+    }
+  }
+
+  void cpuMove(Cpu cpu) async {
+    int col = await cpu.chooseCol(board);
+    putChip(col);
+
+    if (winner == null && widget.mode == Mode.DEMO) {
+      if (turn == widget.cpu.color) {
+        cpuMove(widget.cpu);
+      } else {
+        cpuMove(widget.cpu2);
+      }
+    }
+  }
+
+  void putChip(int col) {
+    final target = board.getColumnTarget(col);
+    final player = turn;
+
+    if (target == -1) {
+      return;
+    }
+
+    final controller = AnimationController(
+      vsync: this,
+      duration: Duration(seconds: 1),
+    )..addListener(() {
+        if (mounted) {
+          setState(() {});
+        }
+      });
+
+    if (mounted) {
+      setState(() {
+        board.setBox(Coordinate(col, target), turn);
+        turn = turn == Color.RED ? Color.YELLOW : Color.RED;
+      });
+    }
+
+    translations[col][target] = Tween(
+      begin: 0.0,
+      end: 1.0,
+    ).animate(CurvedAnimation(
+      curve: Curves.bounceOut,
+      parent: controller,
+    ))
+      ..addStatusListener((status) {
+        if (status == AnimationStatus.completed) {
+          controller.dispose();
+        }
+      });
+
+    controller.forward().orCancel;
+
+    if (board.checkWinner(Coordinate(col, target), player)) {
+      showWinnerDialog(context, player);
+    }
+  }
+
+  void showWinnerDialog(BuildContext context, Color player) {
+    setState(() {
+      winner = player;
+    });
+
+    Future.delayed(
+      Duration(seconds: 5),
+      () => mounted ? Navigator.popUntil(context, (r) => r.isFirst) : null,
+    );
+  }
+
+  void resetBoard() {
+    setState(() {
+      winner = null;
+      board.reset();
+    });
+  }
+}
diff --git a/lib/player.dart b/lib/player.dart
new file mode 100644
index 0000000..f404ece
--- /dev/null
+++ b/lib/player.dart
@@ -0,0 +1,7 @@
+import 'package:puissance4/match_page.dart';
+
+abstract class Player {
+  final Color player;
+
+  Player(this.player);
+}
diff --git a/pubspec.lock b/pubspec.lock
new file mode 100644
index 0000000..9e492de
--- /dev/null
+++ b/pubspec.lock
@@ -0,0 +1,146 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+  async:
+    dependency: transitive
+    description:
+      name: async
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.5.0"
+  boolean_selector:
+    dependency: transitive
+    description:
+      name: boolean_selector
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  characters:
+    dependency: transitive
+    description:
+      name: characters
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
+  charcode:
+    dependency: transitive
+    description:
+      name: charcode
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.2.0"
+  clock:
+    dependency: transitive
+    description:
+      name: clock
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
+  collection:
+    dependency: transitive
+    description:
+      name: collection
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.15.0"
+  fake_async:
+    dependency: transitive
+    description:
+      name: fake_async
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.2.0"
+  flutter:
+    dependency: "direct main"
+    description: flutter
+    source: sdk
+    version: "0.0.0"
+  flutter_test:
+    dependency: "direct dev"
+    description: flutter
+    source: sdk
+    version: "0.0.0"
+  matcher:
+    dependency: transitive
+    description:
+      name: matcher
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.12.10"
+  meta:
+    dependency: transitive
+    description:
+      name: meta
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.3.0"
+  path:
+    dependency: transitive
+    description:
+      name: path
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.8.0"
+  sky_engine:
+    dependency: transitive
+    description: flutter
+    source: sdk
+    version: "0.0.99"
+  source_span:
+    dependency: transitive
+    description:
+      name: source_span
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.8.1"
+  stack_trace:
+    dependency: transitive
+    description:
+      name: stack_trace
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.10.0"
+  stream_channel:
+    dependency: transitive
+    description:
+      name: stream_channel
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  string_scanner:
+    dependency: transitive
+    description:
+      name: string_scanner
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
+  term_glyph:
+    dependency: transitive
+    description:
+      name: term_glyph
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.2.0"
+  test_api:
+    dependency: transitive
+    description:
+      name: test_api
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.19"
+  typed_data:
+    dependency: transitive
+    description:
+      name: typed_data
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.3.0"
+  vector_math:
+    dependency: transitive
+    description:
+      name: vector_math
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+sdks:
+  dart: ">=2.12.0-0.0 <3.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
new file mode 100644
index 0000000..f8cd312
--- /dev/null
+++ b/pubspec.yaml
@@ -0,0 +1,17 @@
+name: puissance4
+description: puissance4
+version: 1.0.0+1
+
+environment:
+  sdk: ">=2.2.2 <3.0.0"
+
+dependencies:
+  flutter:
+    sdk: flutter
+
+dev_dependencies:
+  flutter_test:
+    sdk: flutter
+
+flutter:
+  uses-material-design: true
diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png
new file mode 100644
index 0000000000000000000000000000000000000000..704152c09c843a0a90437522ffe11f9b5f5eef04
GIT binary patch
literal 5358
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
K&t;ucLK6UAR_(k1

literal 0
HcmV?d00001

diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png
new file mode 100644
index 0000000000000000000000000000000000000000..56ffa555e5f945d2ef5be231e3c684ce76de5aa9
GIT binary patch
literal 17625
zcmeAS@N?(olHy`uVBq!ia0y~yU}6Aa4mJh`hA$OYelajGa29w(7BeuieFkC1(47zE
z7#J8NOI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kz!zQN%M4Z45_&Fb}r`(
zk*hm596$2^p3D2QNt0gl=J|X#XlVA3QI>QtYG8CcxWPn;(KV)1h=pbQii{4a#hr#b
z7Ov>%IAZ(mSoiM0_2RwSUEDhuHyz%<UsGQn9Bh2mH1zIOW7DlA`|p3=<NrvRsn~Ds
z=e_Crnu;7v3WFLg;z%-QU^v0$IN=E+1B0c4#}5XE1_1$;S_TFOwhkx1U-uapIy5^N
z93QFAWM*K|;$abtdi4FzMSo@n4I?HI<|Yo6pW8J~F8A`<$H@?I;)eoz2ZP|uC+{sE
zUjD(z@JXCSKD9xi#`9mK@V@2!wpXXTdNt{;^h!2{4$I!!S;6zCuNU~Cz{GO#&6D@D
ze(Y7LvSManNDn-r$|{$_z^R}#;fJ)_=bQGwPMtdSpPeBfr($ALj?)BJmI(}p!WlnI
z`>|Q&Z;h0jtLxGIj0_?|x}wbHk{J(k7#u&H*Z*1V`{$?Hk15=LPoMfH%b=jQ<7?_!
zL6+l7nd;M-IVRN`yZz<M{<TwRpM2-uUAedO85vwy?Nbz|3+#9&dBRq@fki;q``=Hs
zy6Qvuy(w{9-|xH6#=tT8nm~JqoKZr&RKZMM2L=v*rU!~Yr(3Ai{r0%;z3Ke+jiK8z
zH?uQ1h<tRG*>tkucTdCTO%9ww4nHRSk?s3<b8`K<CG$-ehMT1(*w$LV->c5x5F?TC
za{ruPX6A_})R^O34ji7uz~u1hydHz!N&DL??%SPxKkdug&V7bE%gdJRTJ*@Cf#Fe4
z@&9WYT-WR_`f?O?G6*^RF#1*Q_s`e;uV3(Azs~!!zPvqoZ|%X7{QLjx85y`b?=(%&
zWQlV<kZE?nlgUPpUBFd?;jGs`zu>>$j@-A<oi_8sTq%$1n>M}Qaq<2k!OkP)j0}sM
z>Z9eSuGK%S#@1()5UI7HyCIx2L9F3}$*=E|{>*jz%iDS1>{hw=uWwJ@UE6SJ|M%|<
z439j_5(_3XsY`C?YM9Mpq04zgwIPy$<-p|^_cPDl_x`k9y{`JucJ<$Cz016BzyE5H
z@&EmE@6e<Bsu>wr9E*Rgh$%{#&bXU{XNxZH4c7yaOh*3f3XCfM_bmIjS+zd<k-7Po
zovL-qTjpCghF>X+Xy>zk!OS2ayyd*n@AWaC9;mQ{NuCgCe6yJ`ZaQ-Wm%>kL|G&|0
z|MRl{#ku|M>%4EYYr9%S_2ZR#`u`V-^XY5<7G!XkQSo;Do4<2H`J_@7crWAG(Rsk3
zU+6)JKf`7Q4u@$g|7X2Fx!*VK)Aqh!Ydi1H`*L^E-r&ctruqC6XK;`?smfC(c|wip
z+S0~0-zGkx2}$-04^@9!_x{UP<Fm-PeWXsg+{g0OB-wQNpVM!h{F`rZ)9&R7Y2R&r
zcAu85o&5X$meipCGu39R$yR<A<DRW1SJ^#v*5+SlH*HFE+8;f4h2cyN27zRqzcaJz
z(_f3Ptxa>QkNUp9_wU+o``zqop7^HikFoxFB73{<%lebkO62z?9hx}z^9}w629d{C
z{-0jCD*w9Q8|$R&R~E}nDrQ?Z<ue;61H+N|u`lgvuTNp*zvB0*{>}ZMmHE->OrI>I
zJVb82`2TtGueYk{-{<Q+pY(;1foondd!24@->#IGJLK-?KdWYRxifix*e)N*0=KFy
z`)9c^G6a+;Z76zv<zM=;$^YL~&f{`mO0s#o|MsfO)$cdIp0hZ9fgl5e$j?s)t}GT?
zBlEl4Op8(VrzeAvfH~uhnrjn7i{32|t@**gkZ^{L=U3M67CZaW8~hC%BBxH&ziv_f
zy;Qq;ar;WeiJrBt=iX=*-8%2$_jBcmlT#TO1lYHnzqYUX&-vbcF~7gu`TOse?0(Bl
z{@g4KnjKl6?%O0fTrW{wU%vKFai5vczfSh<9t~kjGe!o6)&qraU5=F*wmAH*D(Aeh
zqxO%W{p_@z(#O;V9XJko{5kc?v-bPy+dp51JPhvlnw=E>n0ets1_qIRJTKlfeEX|+
znsJx<fmBNd!4Bt3<`;WqcQ2Fsy6CaV|Mj~k|6pY33S~L>;^7{{f>RgINBFZVFdKUR
zc~-c8?qqhKjG%+Tzq;pK=wxGH2zb+DsWDfW%|x{E<X^w-_k<_7G6^(xsQ%yOb+aJr
zEB|HXzowE?tv+&0oY?b=kzv8SiBFHEIo`Hqymq>2Q;gJ;<pKh_zJFA|E>jEs9X~N}
zp>WmagZvB(vli`qxW-OWXhZR<!0F3^R_05kbTu5G*_f}u#He2X^mEA7?N9GGt~PS}
zr&7<raAKSO0W0Bxa|fnAyUqB`y=BwM27hl>mH#!u|F`_guFF>cYHyc(c7A3(1H*?+
zG6^?@1FFAGRQ6#sD4fN6qBxC#^MmzA|IIcpwS)VsmLzVsm;T4VpfJC;kyo9G%_hT6
z{mzdi8>Ut%dYF2%O=w8taF~1~-}hft&Ekg><!xUbXXj;L_*ro5A@6C1FvbG$##d`L
zGkZ9ko?L$|aR13~nt%B+cRXn?{>Q*D;d_w7?zU*=>wWLb3qXbZ%q=c#Q3^~d|8qL;
zN6cS&ulDy8#^hHl4*AuOoY@!}o)uJu&Skjb^W*4>f2pbe*G0G<@MN3QqQEbx;l-H|
z`N`i@tv>bmO=i8-#^!GS85k~1ifkxmKh<}Vxi0+fwzu1TI6r7H?@VKv&@fHq|CE`3
zq`4!x_m-UsynfyG*8z4O1_s@S=2wHPSKf~gWmt0~RpDtM%NuF7?pUT-bN{SeT$i1A
zeO~Ps*;0M`j~|&B9K0=F3f!zK`+qYu^mpCvtoY^}qX)h$M(;&3+E_#iKj|0x{YzVT
z-Ouus-?IOV3<vsC8*(SJoso^WnbzN!d+SZ$%wr;rIYtlEm^>Whm?q?Zy54lZGVT1$
znjH)b57=)X`@U;&{_}IyQg8OAr$({8I-$gT)8&9Vr^dY}`KDUgpTe__%T;O1>oPF>
zP-0Lo-MhB>_qYF%v4J1u)t2$_luTe;zO=DMWr0K*qmA$1YR`X~-k+{J-M3ryNX#yZ
zf#E~5?qaLEm$t5XW8Kx&5Xv^|3{Q$+<COnG0W2r)Z@O$B4pLl~^Yd)Y7LaSA`*Z6*
zgQ^bE-5e%U8+`;n=rPXx&MLBsrDE2va<6~iOzVw*&SuSty8cb@<V>)h(>w=0Y?{4#
z_m;nLR_CugRAUYkG?>mdCyjZJN5kQ|hNcLvjE^tw>;7C_nAw;w8+VF_fq~)2p=Ap@
zqgQEtySw_h<L~--!&HUY91-cvpC&dq&0{@b^=tk!XOP3JY&sbj7#i}KE-ZI$m)Fo@
zk~Dgt#B}Xu!!)l0TbRTdj>rE0=3Aea{qNe7^{jm$rSVsIe9x=`RSunsOrnvl3c*aX
z&aqg`<tw-)@}f|4fdPxc?REdT+MmR$GnAgJf4}R=`qq7_Qy++cT&2cvchbrKR(saG
zaqpVV5iy<Z)6|ADkqv8>GjaJd7`gqITlVknr2S%6pr-6T&I22ctgW@0`tI)XEhYJ)
zjKOS1t_$kS68;~%*^nbN;e3$8LLKHOdq3Z=yXb#x*M8NX(X0vD5S<P;*S442JUD(;
zH1~gWpyY<`hSL6qQqKcgjNf`2Z>BSD%Hz<fVLV~>>pGK6M&x(%$@|5AOiS#H1cx`f
zbeq~&wF72dp)9+uo#)tbmTiaU0f+Xb49_DQ&g^AyRb<G^{-3wFKKs*kCU*t~h6DQ7
z_<ir)+r6ho{-{9XUn!RZxn>HxS>Ehje%aNrRf}QX^?$)DL*8Aimsb9{+H>Z~{hRE5
zW;ZG`Ffcq=&hW)Y?fYsy?c3q13s%LktPx6>&%42^;kHggDASwG485lrR^HHO-jeZo
z{^gDK+b`}H`?f5RQ;wO5fgwJ^TE%j=yK7SYREE_YH>R_mxydk<;d4vF^~i=b)r?)C
z40qiA=ben_mSJRIV6bOhP=5Rpvq&(@oiyfI=a^Ew8Y-g`w(Vu$aOitkAI$LUI(LKI
z-U~0qbPHG*7#RK}ot^MR_NwfyZJ|;s3xXf#G=ws(+01ZlDZ~2B41K2=STz_d%l}))
z{>;ArGhhC1cH?y(-#f?LxfvMhI34;weR4Vf?XCA(p@g}-CnC5sw(7H*<Z-N7GoN)s
zyzrb{$pclI0e#yUxzfMa+g<+u?1enYh4HKj1xbF}H*H!nndOB~L#cnm=b!_2_64`O
z172>B+;GyaVbZb7pumq?{$JYte;Y#vEC@r?C#UX}R(a6i!?_`sr{tc%jS8g&^?j)f
zEDG%mH_ZRbPBYUn)dhPi<?4hZb8W5FZl!uTRJ(H)%x2wipL>EggV8s}BM}Tm`3xnN
z|MTttrLX&+?(@I=<eY!knbvzMf?{et!wjK>c)k~5`iyy-86;;j?oQETj__x;c*}fZ
z2fu>o{&L1B6^3i=^>eQMKl`%2_{;j%y@?So--1)rbcQc4CTN7eQdw|Fi;;cGuCq)j
z(QF&$vlZ+X-Jrp8;4PEF`q%%LF_id<TY%DU-Nqu1q`dXtmcCufbiw+#&Vh%r*4K2I
zGyIC8*iKZ-JN$j@z^clyGmoJ}n4$RB{fPhhbN;<=24&9mOaW%wckRh#-_5e)EYpqY
zj6RGPVnWp!V)wjdKJm?_;38MU<zM?P|MoL5FgRp$G+er?#OSw~A@4N9Gdpl_&9GLO
z%W@!>d4VQFR*ZC;svrXc!-rPU=E>z>bFQyTw(8t{j>%*Whlj*zhR|uL48QFdUb{J*
zS7+?<WH==w$FOSMkHBlZ4Zox&i+%f*c=9IL_sbb1gf3WcPuMBGpiWZZVu`%Ny55GP
zY7F;Js4_^pGpxSE6cD+y{W51m9R~vg!<J19ON!4lmN6Rivqnv4ob!z_BX3haOHP$?
z!c)0fuQ%EA%Ir61jM8B!4OhLza=?Z$fy?3Uul-_0$C>MTK;C-I(eT;G!Hn@mGs6}i
z2CHZ}hD}@!^M6S*fc%m%)we;5K{S>9RyxRNi#!&c+&df@wp<ya3}*|&7z_4sFX&)d
zkofohH>QN8PdOHRWpe<foG538UGfoO54Z6o+-INQ%OKUqbc<y{{$2))xhxJ0Z~Pgo
zIU4-7zF5W$Qv64xA<m5P#Z*^@GrbLM3?*kQxH3c={+Tguu;+~lVR}%-?!d>mL5|Ud
zfq`LxDeHpt-ON_sif(e;xLu^Ypi<<*N4*9cmIG55SQr>VJxrDb)iX=Q7VK#*RZcKt
zH0Wo##j5bxNP$H`pRr&UiwAc#s5oG-<8mlHp0fN*EyGNv1bfa2uk{#M7KpMqT#pd|
z#bNh)cJ=3$oDF|f8ZHMqKun&&?V!)jXpqn1!oVcZ5c8fv0hERqL?$xKxXu77p9Dl1
z4f2^?7(gay1R&TB3<3-wkAg^0-eqB6bYNg$0FfZ2L`X9*KzzplQrp0k=#xINbHBh&
z4b`HjE0xUWDHlC|s#HH;^V1ibiO=7O|9rlfE#FT4)3xrIIx!c1yq~|*{fT^er%l1!
z6SDiocmB(nXg^1%=wZM_&b_W~@*b7UObsBvG=6;jPHFmljiT2k6W#L!E5CA1^uH%~
zb4M6cf2p>s*nY)NpOlsO?<o|0W>vcE-aV&C<0}gX15*P7gGqOwtc#w6lF{dyiRx+H
zdwzF$oVDuoT_LmQYtxCt=F*$lpUdbL#aO=*g#<x{QSJK0&#V6>`5e!`t;8xGZQiL<
z75ikNwCg$>*C$JySCoVN$->ap^H|$uorUL<lh!W#{zP;cm0jzq`IQ&NktejXWXXvW
zMf<oR3b_RCE-<g&WoWvucD2B^8!^hCZUrBUYcj6-uovV&1qOlSWB+4P-pRYz#rrg!
zH{Wum#52W7f1ff$ds2hk<k|IGPh4_UDYQ?zt~Zfitn19bxhHmL?bC;-P}-LL|9rZX
z^beCn!L=&P*1bm8Hl>|sP+;I-U}9KkxN`l*)wPGCCKX@U_$_<!oBH6h<s9IkabS2+
zSti@~YKw_rZzSX1n+3l<Dk)E@nGXtZ4u&6RIOq0sS9X295hs)M^0%98@2eBvxj;r<
zaPqS~v*VSSpZQ18>NSyhbM{@}p7x`S5tMK~J$mBYlblgyH@74Gg*0bWdk5GZ4)3xn
z`HkHAXPZrM;8rzTWB4j0KjDcqJ1Fs<aG1Yi@9(UMv%adFX|lE4;FNOBRY|#W1_vlU
z94;Qu46AW#(wTOlcTRZE)7>B~4U3-MX;gZ@-_1$q+6C`cweO2%K_TgIvEbA~rSo@^
z=P0UoS(oLAS5_=5JTrM4BgoOLJ#mjV*O_+qXH=DZSamr=9^}h_f;n-iHs;;}Hy_RK
zmoj$QA_)r74ol@zE_u6MQckN)l76UL()MD#aHcg#y+E|z>#RG%{sLz^!{;05wJg$A
z1P8L=qgRD{F1c^9`EvE(>0=k>fn3hmaANWHy|#7Mo!uYw%ibF8TNx;u5f2G?70c%t
z6Q6o}M!38_qW-?)&$3x%ZQyWn;kvtJYpJnkSH|5Ndjg-Vx}2F0(edKN-go?WJ(84~
zVudc``}xnfz$OUFb`1g&;i{hwItfj({Zh6&G`_Ru*SZtY`W<_IluuMollFYw__}BM
z$0@h<O%47>{-66#>hD&4+nkuGtM|A6i~ChAG;?D?<B1#dFYrN3bFlnB{TScdB)?DI
z_k=6|F;4thFErCI^2wuzZ6aHbod~HvUwF62-ub`IU*q_SfRvZNm9|=UZI_#-D`>fz
z|E(Y+DEK&9?B{81+S;M_ZRJ|gpD*H-`tPb0y^T}~{?*;1(|^IpXXnTAOSKZaqW?YK
z-m|}WV~d>m-X9USRKXej!m1Z*>#Vc6?H|6@ZnZkK?}^34$H_kedjHMUm(Bdc^ZtMS
zL+*p$ax*PwJNyO}W-JUf&v%p^<Jb|9{FZAX>u1-0C2c2e=(UE||1y5*?8E&pY=^h`
zF3W;@p<6=1McV=Mx~p+drXJ_gPh1nN`RR$w#7yO`Z1<i2)>v)+cxA5A>u}Myy|2z6
z<zxgaU(nj~D&x&Iy(u@gxjxzX+g0!HRKwK=&-9)6a#890{roAu3tO%ke(eTF-j)YZ
z@wUgpI6fXtdb~om|MZUHM+cRR&ztwji8<~0XL6lg8Jt+oda-rK^_MeUINSAW-=F;U
zp!q+G9tI@eRDUOJCvK-~^vmIuFgPGT%=z<GBQhrWwAy2fJ3r<JPuF!l9iXq)^?Bp@
z?eR`b;6%pYfBd-JkNp*8UuI{!yqkUSZNb`up6wFmqIow(?$2bnd&VnP32dw0?!WhI
z^y=pBwsTsd{4bb)F<-RwUFU_@MUQ`cxcvG&lY8qH$br)UL-eQq+j;e|^Zy->Ra#!U
z^k37nE%Q77oWHBIyX@HO*%vSK$p}J1UdR1l$>x|jkLK2Q`A9n4Z9Qx0-o590)|q#l
zGradgGDfM5oweQE@7L#d$Jq8+bxT#9Ua&7pV)~4F(^7DPcbK^N{KaFBW?i4F<bPh+
za-ndk*wbp|l6nW3KE7955B^%E^cA8mu;{4g#}{j+>j~{l;P@)K+?vJizrnBjQ|(@^
zF?R||2WJuy(dV+le>dONQvV(&y>@x|!Qab*Y|SJ}58l}kmhwpOia0ohxgOfF>cxJJ
z?T?Hnb_ZPvy>qdBT3DUn+x*<0L67G#zv2c3eM6I*`{iGDHB+4ZRSIVMKQvgj`NU^_
zm*2CiU%SfjJAtaq1qUt`e-7+@d)p<?s^3a0WZi6;x8m$y#XMheLQF_Gw&X?GzSYw^
zV+>|kX_cIl&5(K8^Xeo+-wbes1Wb^9|84EXxplTXCs}EU`Tbm3I5Aix`7+x?&b=#@
z!D){xgE!3ls_WM<vv=wGhxTf`?OENjSi<|Bu;kT7D~KZ)F8n^f*y3*0`S=ymdW*WA
zRWtRUTa*V*86B4Oze-Kaf5%!k?rQv%|E1?eE?<b_-XxvUW>9K%@UdLn?s4{4M(LW_
z*)DpPeY+ZczPRnv72G`|>n+!}W#HOF!1>F`%jI!>VePAo7F|CQWdGpE&;24dH<(4;
ze<OW<+3lc7yBtA*q2P9Ap4{5LlD}FLSGou4PmryRtN8mWqjvXo|Alc7*Kj_rms?x?
z&-ADNEAPDx=4#)2r?I@KW?U}kwijX*^S`e(Th4{PmSwrZ{p9czMz=@3UVHv<ls17~
zdt~RoH!n(NS#cMBEO^B-tKE)q?QFNjLiILNtspKqWWL5VRd}l0>r2xgtPsz*__AT*
z#hnL()~~+iy>*2+I6QZJIR2LBtKZ{)jIUV!Jec+I;!d3xA8)VZ2TLj)%Ws#OKHWv}
zS&Un4!~Q#^sV4j0-in&2`4_5SQPDGd%}p=9W|U0uKfl;+L1{&ipUJ+D+v6AML43#&
zSo!Sx+2<~Oj}zrHRKGAP)>;~IeQci$)$f${rBO+HKhJ*Wn4hfImpQ#IzNC1u;%3p$
zpg10Ieo{#J;<{Jk&5!HScUJIoG=1*tJa)3dy3Riq5<Wue%iW!4o44H;yk{_VS3|?}
zy=v|M@8(A+8$DBa#RN`s0u?WgeXu^rTEAFML1td}fsNO9uU{qyb{)sBOY@x%*V~0&
zca&swjF@x5Gv(&;hx-dGzo}ng1?LOKPcPO!oZtRW*Z;TEi5J3$wpt&`<^CS$Z40qp
zV0pNt^!r0SKYePQLd*`u3Fk#$sI}N7-@Xe}=CdrgTKQyJf%TsL`)21-g2e@<{${kR
zogN9Qq8u2wWNLd{=HK8gel`Djtzy;-!;rsbhq-EZ{rKT`1=7A-dt&bNcI!)(AJ|?o
zEIN7Ey#2OW-p&bD5Tmy)vpVe>Rx29EzTA4<*JqBem=>M*DEjc8(2BRoE|OnC6?4s&
zwFlzW+pG`m{NwV9VbR&C%iC_dt+Sd7Ho@*z*n`RChhE<hvvdCGY*X>N^~0^seWyHS
zK|YgTyFSLi;!bb<<llkp0{m)UdB5j1taJ}#2Q?b(KG~PIUtefz)%~fx;^UDwA8ws~
zygm3ISSqe^*G{!P-hO_MCJ8@S^=3~WOW!LGu#rCwocVlM`s|D1!&exOOk`ijz5ect
zw%AvoCiQ}&HDA^X$XmU1`sr+QF@JkntVQngyWtx3EDVedVnyF3KI~0;_IKhZ_IsQe
zes6B68Z8um+RvcCaDnOFe8GEG&p2apxeT8lX+FH$>UW;p8BigR!I`+XeBJBiQ|v{K
zh#oXPoayW>9{3I9#Ir8)cR7{Ia>Om)rcbdKVSBu)C*P`P#+~V(+!+KIGT8X<O871R
zdd7B&t%%rpdx1-uv$8d+K@PEzoXGP&ak3_}M!km4mz@s`9(5m`V$0OP;NY|D|IX7g
zTvLzcZ{PuiJBI_$jQUcGxmUlY2Y(Bgai=8CA~)+?Dnzl|3lEzY7aj-wT4wc>pS61F
zw_^`(Uyare0y{1)-{5!WN2d4-AD_salH;1a{CR8fsy1s=P-?aL_}uvL%vD#^+coPo
zQuJiR{BH01ByviQ(ShLra}|&NiwnZ+Ri7F@wL96zZvMobb{(XNu|s3^bk_ThFXu8(
zu@yObw!xhJ{=R9t3-5qxwW5Nw^99Q^zRodu%73&$ue4S0&bm$p1%?Szv(G1$Fa>l>
z&-wfEI>gyx^L82k=zDoFa*DNxxc`}DbHP=afZ?=#@-@dz{#Kll?dsO{<Jvb@w{CI~
zC?pF&U7op&^Z(!96`2y^eoC&Z`yzW+&TXNb=+$=*x<-TILeEED_RorxhfJqryC&D$
z%GXrSHfw_Dc6iUjZ<V*ZrHK7jbi&(Qsi%Dm3Jebp6n`)N!@pocKl7{5BM^rP+tr%i
zIG1r+ZQ{hY8s!>(ZquZz6PWID{9prXNqFCLsk7p@S)3*_$E5Oj&Wg*qQM=ry1ik~=
zFQ)dLyUyy<y!`?10`A<gSN>6EzEB*Z?cuDC2g_Zm#Aa=3PkMGLxH-Q(e6HV4P+KKp
zMt$iA*^4{!rdW%ZC+^u>`26V<Yo-Q<hE~?k&2L+>t_410_@#H?S+5Om54e=>*z-4N
z!`umZb&KvWy4d~LpK$x0^!cD?U<XXo=iMe;Rb!UQx4_2K{KmHLN0Uy;Fgh?SnD_Wr
z=bIaHIqD_a=93t&82&ClxXre<*<rdII5jd@E@oF}U^w(>)#axA`sJld!4Y~X#=_(W
zpT~RI1#cK#mdT0M{I-5CaY~lafx+Rt(tM#B_7W%cQ?d>h(|0uYojw)-4ui~f^M!Jr
zZ>|$f<x6nwKguRqKi6X>$e&AQ7FTYV+iz#(vXj~5(@l1p!@XedaM)BhZ<yPE&(dKh
zvx(4`#SY)&yulh&ddv?s_e_^xc!qJ!o=+Cr8NpS$fZOxW5gX>74=xXS#*pas!<#?&
z8OZCIVtNU`1QmSbcIe$O`*ACHiX|v3&DtLKz|^S0VCHxCd(4o6j>AmhZk=W-U&7PA
z`<n&DA!YiHg2WAT&+Cc@J!1$<i<QZduK8cDSq#diCiC|Q=R7ZdY&pfUVd~81?6=v(
z_j`if*HXZFvd0r7{929uHrw<)?hs)Gh8SnA2`76RSQB3UhB)KUj#=g>b|h+nY+d%b
zDYsevZ?_RBRdXZ@KgicCZs_rC5NEy3Ccf7XY{rtx_n~r1j2x41UT)59e!s^DEc(LL
zL7(mR&od8|6dHKm?J~My_TyPG!~%|R#`~YePstoORcqXo+r0jNGuU{K&##0Jmf88A
zS$2kT%?swpJtsi<k;CDE&J6jS=bs<l*DPkx{$Ddi+!B<3895r;^LVy>zIeP{qrAbb
zBsgxuLT^5BVsyCsy2i2Xo;4_r7Kwjmk=$Gl@vTbF?w`#)TeUTc8MI%AvDL_aPXQ-5
zg|kzav)%p)DqUA8KjmA{V|O7#*zwp?^&m(p(ev_rVEB>al&r(dJLW&WmH*S%EC&bo
z<9fLo_L7?tr(_*=K3ekN_I*&s07vD-r%Kk@&2Jm>_B9l-2Y_Pf_U(<aDK3)W92Ri?
zlz!9O7P+0RM(hD{yLE4D+n&Rj3d-dP5ATLE?c;vndP+uN%C_USG8_y{3}N&3>fi9o
z_?vY~#^L4$wHw>Mf3X2O{6Lf41>ur8RT5A6j-GuPdT{&h%K9bX+@N!2hDeP&q->J5
z<rOZ8F`fr5Ts9bd)o@c{a5Vn!e{lP5&swlg7`PW(bzFJJu}wK@M?+Ejqi1KIH{}-J
z-rm`h;||XEH-7v%oM63pR_Pq~wnwh}|N2Td<rdH1;|!Lx`0(g{^ZdR!XG&B=G=te#
z?%$iYcRJXz0*C8Qn)_xx4}KRg=T1@Lhqt-sQXx^~@=m4xsUfK7yFTy96JBt8L-64f
z=cf8;A=e$g>N1^@@8bOXtU2!g{jI@Ijx=k6sv!pPeSb851fD#4ShHM1PtQ{CN7=WR
zyCDXOiJjr!mt6J03RD=k=ke^DYg@?<4(ti7(#zQH8|qf}7qvf1db#Mq?VDTEA!T5s
z#p?bRp*wzTM-Lr|Z@GNz+zZE>pzNQrdyY!xo-5)dFQ%@TVlTq{Jw~|Zchue<u%|v8
z@aAW~?^yed@hP8c(c@>29^Afe{2fxD$nD50vIw3s`FG&A18?is3f9|A-UP}z9}Z}?
zOQp9p^WBy7{pqau`NNq9x38XynmCzn;TuqDwprBQ#v=PVtVmNpL~nnV{-(On4{x(B
zzJ?U@a(C>N=d3)n`gq{CfEh1LY9tK*XMyWJ1%5rR*2|GEf4`VwFQW7-w_Wf#?;@~)
zpDg(z)Hap5ewaJ;ovp<G;#2Zm+<%uHz7hWU>+@q5<G@W11%0{svgbOUZoI8gy+HTp
zrj6g!z@{#ce4%Wcc;uSzvC}PA7)6+p>y<X823zF5ywf<v9+bL`^I2nlrdr5ej|~s{
z7a(z`w$vgw<7W^=GpkKiw#D4*vz{K?sQHTF(U}!|58o_(IMo-FVZ=V)UMLiGr%3TB
z|Ho(7G9PZ0-&+c4({<dv`&7!RNUB!hDZioY-*S=2y*6{Ueg1eGY-0oeosYjixEXG)
zcmK)!R_*?dpG>FZL3KZSiTl5AxerTHewlpaoV$X#L;QHT(YkGXuSL$zICq5+R5SVS
z`QuTsc;^1UGe5Og6rMMIxK(`KKUW3;2D_;EnRZrt_;PQHO*F0wU>D#&R%-0_F!5-s
z^GasWFx33_ED_%_E9Tzf<_}^Q;E$`(*i*LYOD)*u9~se&k>ah_H@>}<ddJ7Z)?v!U
zi`(l~Cm#Kp9t>(I9&o=cB|Tfq#cU1l`r_YDWG7C1yMnz#?N{zAbE&X`N-=PPUwf+7
zSmnx$V#`v7i%-s-KAbCE{NDlGU}U<`HRn_C#JACh?+REf6#vR_@zI%i5A*)qj!`z+
z#tm-ZayV#jPN>_VJhwdlVQ+DVSpHstyxA2cVx^E)7{i>a?n}0r-Qnw>eNI8^jE()B
zZ3~Qx_P_IkwcgL)lg?Ydy>#=5Bk=+J0(!e-mR^3Jc<k}^V197dndO9Jd-t0ga(Ty>
zTd%wMl_&AtulPT1KNkNl425+MK7X;{w3XY_Sk+K)Az%MZMTHvFVG^4eY!6kdta#Y8
zV6M{i-i3M!5npCs&euP4W0U8TDb6do!Tl?zM;~uK>~At#Co1{B_!U!=<NmF^*@yqX
zdq3Y1+QCsut`~auw&9xfg|Ew;Ua>??4wQAZtF!*|K6bv;vy<@<Q=V`0RuTI6=kFEP
zEuUUa|Gntr+T!P+RI0!*@h0!zo9q`~NIZ{qt#x>9@V@`zk7K25NiLFK8yOTBI2>GN
z*jY)<UA*szS+dbr#($rl8y~*^<@o9u-~e!$)_UH>ndwW)p`*ux<R9?QDmYy8|B#fv
zjYlo0m%t=&@$SVc=Xen(b2Yzr?sFYZ&$wbPH9N*M>ssfWYp_1(qBA>Vl!RZ0cly{g
zSv5YpU%c_t=@&KU&F4AKg&309m#zNkWAw$BCgHWIHdnpwI@rDVx=Y)x`&{`MZiqvU
zG!^&p{om@4UGtSQc=?05!F5`np1NQBS+_mcP)-)ww|_A2OIl0cvmLquMGF^6OjTZ+
zc4lu=6{I8VXTGddAo5e(7OSAx^QkJV>$3l~ck4t8t<5jH`1+Ww^c8+^YTW2l{_ype
z)G0}CuPX)r3O1k6nI{&zS10QJD!XsZ8zAkO=)C<QO5#;(UM~_UWo8rS6OG(&RdxSm
zkLMLg5pL*KuBRU(u=iZ3KKHI~I<J=B*jW|xC2gfiTxAbrU|@lOS=e8lS;{(l!%E-D
zub7|o^xWyig?sZS@70R$m{Vc!6*3ml_~Ey(OW8FqmB%-$d(-1qE?2s_VAi_Vte+SE
z)O~g43TrcLM1-eyrT(gqFL%ob>vVC~?dsI2Q{Hv|;hE1c`4amB+Wqd^KVLoDXcg=j
zE2=hKMtxIWYRUfn&)+Za19uZN5=wG|^PhERy)ZgjYiv;+>yZ(AuR6D6`T~<LzjCH6
zgedCz&1iPrV~O+f&iY{A*rT$s*M1fxZrN{oS7G&Zfk4PGt_W**Pw%yAM!$uViVlao
z(pnc&U-red_;=Vu?)JcNaIzASG@q-!vBP{`YKxe<-+H0Sw<llJhgb1@T`#;+ADp7Q
zrnILYb7tC>XZDWAqHizb#Cs{LcE4C`_v-mXd9VTp>$gUauWjDZ@{ZRcU*M~l=@!35
z`>y5p*57f3^h_9xemPA19^dW%eC_t*w#EG)OLV@9f6|@&(kkM^_KbTko{O#j-yEz4
zc8>#dvQ>A@7yZuA7a^PVxC?5u=iL5N!d3hESVgUI{@xSc!J{n<CW$%XkKOj|IQlEJ
z!yzI4*XiEUe=BV7zE&;ieAME1MG>5W9-Pp$7yX&E@rY4aZK_SZ%_`=vH>9dv|J5uz
z@oDMDKW5YROc%Q|KcF9Caai5m*e9>gt8QDke&^YFdZ0mzO-o;NRDOH^=&x<fx5g7E
zr(S^!0Y8XjT2zy|Vfu|Nj!zcOb~zRrIRC8W>HiOSl}ukh{>xkQiSHz+HV|MqF*}%F
zIP%xNBX(c-s_y<-8hqo;zjJnH?Q6H3u$LEIc~|g%)pg&s>atFI!O5B7?4u_o?7u$V
z4l-Cc`}&tese6(q_N@OuZ@)yf2AAr+I?pE+W`DqaJqBIpc!8KNyF_AMa2FKo>7UDP
zJO5(hznl8q_b>YUKmRlTnF|Lb2&9jPA9-B&JuOye%V`TGv;SF--K^(w=^x3i`kKDm
z`mb@_h6_JtavRQ@ciae)?Jj6#AL&0gsfmAY_=BInUDJGoEH|guy!QV8?w7I6^na1p
z*6O^m3SPMLwbv~TuoV|p-LX1*BO+X9W7^IWr~5nZly#oSZ+H7#u~6>%<^8k&$$ovm
ztE%$jm43UI)n_YiL4r_#BYd9HrqanGsV_2$kEScFw^c2=AKx4J%~kX9i#dK<w?8x4
z_fPUy`pfw%>$m-r{qjC&MewhkNr$5r+hk0J#8-pQOZ`nbodVY`zA&4pZ!cE)U36mj
ze1mIC-p@~r@mUi7;-0}(i@p^xb&DE*o;RPD{735VR{oguKihv*zj(iN|MGwLT#{dG
zy;{}OxD7G|)bgbxU|}Ag$|7lfn~WTvrM!?xQG9Q3{dmQrFDg2M=U1#X-Di4B7VK{U
z#dQ+en+kP3yE5ip@SdY5<7Mp(8fs)vs;>PYeSXp!j(X?sPIJy|-3M{+m+35DBIC@~
z3hMT*o!y(?S=I_F^cjwHZ0;9{+|{AtW}^RP)+5fnneLz(Q{c9Ci~QcLJM{RJqQtC<
zms~gM*IE7-Jc;zi^7)HHRiP6y=3a1LuJ&~)c#_V+abf?K7lL|wcTH7TvoW)I<F)t>
zenU`;gW-ztM~=sP%bG6yc)s|U=<zMQpuU{OqVFuz^i>(fvR{Pmn=a#S4H^h*coZY1
zVZN-clxv1Y-v#!XE$8~PkADYMzznYEGh<!<J<of*DtwVa@@=t+`_GG5eoWX0o@-=~
zPXA^SckuCzgoj7^-nz}*bPlX%g0L;uw?BV79Of)8YY%L<xycRcJxnkUX6xAV#lV}n
zaQ3VJ$75CMK<;6%|Hkph=gGYN9aq+<A9ORlwqC6Ah1;@UpgFrA84E=vZo8(u6IEJ0
zeR9EKq4-)Q&@}2|{wKd#z(vr4t?@EC!ZYn|?Qm&(+E`%rE%Ro!?2Fg^HIqSM$-%(V
z=V$p^^su&_vf=i!nx7j3uPv83RSs$xH840#Nn`C3k2Hu+c^oxqYy85~x}fQxhXMNx
zLGEH<Q0lv9RQ|DG;_-a(n;Y6x?#;RV>kG&Hxa&5Pq<@1(%mf%Zlowld#MC84v88qE
z{GRgUoyhL8PMym0H;%6V{<+v!A6&IEupZA}<(d|&v#Fr*#5Lcev%i$ibTR*Qw}Q|8
zJH!}`Lra@Z{&h*4m+w<q|F`m?+Mli3JuU0`Kh7~fal`naIcS!ofq~)5V)GlZ){ajO
zO1p^JDQ|kUdWP@w_a^fq>%MY6{<LJZpSfK0qC8Nr2{1I&=qvo{Jh4SkX|tYC<rA@q
zplOuN>m$V<ovmK&BDP=i(<kL)xAvY(iZO_I^26_nIK-s_C*HPzrksyPOq87Ln)cuC
z$v#OX|Ffc%PYWk*j}wXfvg^e0d}*ENq&txdjJdV<8~odUZ&~`k-{0eW|C{Se<SW=z
zwx8I0y$e(l#H)A3m>rAQq;L{4j>^CQi4g{H;s-520p||TZUT@5Inv;D1fbOfpa4SW
zz)gRk!eD!QyS^)flK_Km3}`{YA{B=A@;5({L2YaB3W1Du3>k@_1vmn%j4y5)UgQJK
z7c(qih_tk*oX+L&-G*hst~ELFED8yX7Y@0B)>CX{by)u2m+^uy!%h~3zxV$LFn;i4
zsFK<8|NC5)1Y3~r?6?~I{+H_;vp#6(+xzPJ|JN)EH#HdcT2GTp;BuJS&5-fVi6Mt6
z!HWT;I8eCZ*v0zWeCL=78Wb5ieHdR{URjbK%)qyq!@=r&?eT7g89xOXJ;cM7`Z8<@
zc+ItaE!P1?&^neMS`2qLb2z;J<=yaxX+iZR6ZNl}rD6^1I2_6t1Kuz#Xnm%_5Oo5i
za?3V`9e0^lFfCALn5E1R8tV4Ro#B%G9!*9qhPiK<E?g67s0FR6$OvV$*t6)3!)k^I
zbA~8?hLU1IhS*itVwOrX%w<`y*_GkUpLT{9Mh;W;m_yz@RAKmAVxGDy;B{a4m3Vg0
z!kC8mH35tTI~X*s%Q8GOJ>bW*p!((-rUjPgv=~;F$hk1YusCp^*JFqkWME*(2xZKe
zt;uk5nLEQ<rVFO+3=*&ZA5~`9{ZyzyO`7rc7EkU2{j)e6Kr37(Gf20o=09J|%D}Ln
z<$%oJ@0)u6-8ExK+s$%9i{aR>|M#l1`Znh?d{JQ7E!xYFp;%eTpKy3X5Gc0)++;Rb
zlCy3xgNpI;|FY%`*W?+`>|ou{UC8dB$GG7hV}J?Mg9;IYb_SCi79VjlP;}IBIZWRC
zf7;#ud6)l(F`n4LvZDL1&;ljV1}n}J!3<J*%&YEmRLuCQ0**U7?gq90@AQ}w-u>Gi
z$9QK0<A%wfIUCM+H|*hVm}$=K#Spaeiuq?jhS#1ATDRT6>wNwsfmVp!jlKR)_xOJ+
z$;<zb@iwrhtofgA&Gf>R!Ngr`ErUiG<AywzE$^6Dc&g?-hWdNgyL|tD&;Ej(mG}Dp
zGtP#_Y0?aL^%=FC7&mwwIPgoFaV^t>E&QMbJq-4&2V{QEmi|9$&EM<&|JLsQzxML~
zZ(l(+&18B|#~EP5df;{}gX%8+1uBnK9JKmt8Lp)^%vuOaDnHa2@=o4A{o=me-}kA^
z32h8hro72}c5>32at0TpC|8C%(-=WX<wLh=vv6_At^Ko~p4ngecz)%V_1jb5-mm(<
z|MJiOd(0TbW;1AL{$A|x(&^Glq1_B7^Vkfa8iN^3K1NTj&yW7J{#5dp{JH<upV{;;
z{shy8*|7{oahz*@GvsV$_-pLP9CGC>6DWf}n9acBc`s3|Zu`XjGyl9T|Nq?jS9#2T
z^Wv0c3~#~&m?pe+b69_x;aX&a?_r_spDr>nG{iF{^!?ha^8d`mde_Mp>&+MoYM2+O
z)a5g5iC}nhn&DaDfm6ROGc02XnZ>kW|3-0enC%CxcD!x%^u5X3{CB^$tNm}g`2U~Z
z;`-+=|4+Hh>Tpzx!S6J~&NRktJl<y>LE^-r|7WE8-+PnlKfC{z6lW0aW|;Av5wz~^
z9_IxYrd?b9%7GKq#=4A8WxjuA2LF?-f1~-cywL04x#|Bc>=|Y188a?sG8~U=IJImu
z!?Pf8lB(O7nDNQX_+xqg{`kWy?q{C0kN)(1*U$BV3|?jWQ=Yt!WY}ZFf5(FRLWw5W
z-S(^wlk40bt(X6r?)@(>_<vsbe>2&?(`z<ouqeFW%P{rWUWRW=8`iEoq6=Os$8LI9
zX!|YqKi7`r+rLX!tJ~gNKXq!H+y9y8|BJ0+NV&`NVw?DZeIf}{8+5_RL4(0hx$gCf
z``(|{&;C{J@o!!B|8q<mq7QO9OipE(zL(*qiUW7#O)Hy9V|mE(W@q8eCNFOb|4*D2
zxZm{WYu3`8lj^t4{r_$2e<z8*)j|z9)r@zhF|BcD-nw8WXl2*^Zwx$sXN)HAv%LC#
z%8$9`f3B+kH}jobzi#D!C#k>HlNj{XnTk9Qv?ZqIFtLCZrP?lebFJ>Hr+xGz&}NY1
zf6qLbpL_TI;dB2V2{UYuY?v~eWeNB1*9(_!{|rhB@-?MCMP;#<?%((LmDhQH-k-P9
z|L$D-Yy0kxJ_ln)Dd&$rGcH;G$Y5kRz(0-0>&!;Af2U+R@9(<j|LMCPgJnPKvq=n3
z|2B5+F5?3gKn>Ft?tF51@#$x`%)h64|M{j_|9i{+;7|F-HtxT{<?wGa!?eE)JHN5i
zSQr?V2Y2y{GcZIQJC?{9IYo@&`;vUmKap;KZ%(fFJT`fMtIe<cdpZtsLLUxZJZT-q
z^XxDyLxb45|NMTZ*qbM9eyd!YeW_gPWBTk*-!*?8k7B3+t--CSD0$R&v{`6VcR$Ez
zqrdhBiZ5%7l%p@5pZepo=fBHcDnFkKHKchTm~`;%GJP-Z1G^U19AIF$aOQFSOPNJG
zpL}-g%=GiTulw=2+}HHHAK7l7^f?$mm~cN(W6Yb)Je|)^ZvE76Ck@XqF)%p%d*jvr
z&t58p<3Rd;ADQP<KHQyD$9mG<gY(23-U!1Te-h?yyVw<dR)>Ls;mOHUif()tpFTO?
z?<q4y_vLQiueXKk?@p<I_vC+XlGnd^)0x%?O~^HS5Hgq5LT#g)w!dqFwL23d!vW>!
zAkLo$Wd6!ejxkj`?qR>+Nc;w-fJYzM&)Z2S+?3u>Q}Ah_>sQeqFAa~S@!91tFq|;`
zy8iU>w0}RU3Le=lpIG;9$$Oi-{-3@_GR?{n(9yhEo4o4nMtQ!hH7>TN4j$)aU|4t3
z{;YVj^yg#l&675jMI?Fb^SqyVB;WUsO8tD51G#1ozMe9x){&0cl{L|oX@@ie1H+w3
z|Bbvqg-_%6TlXh9e(&Y|KRxZ;AF2N|4`wRrI&duUr1#p*3|(Oc>dXub2deJ<KOLX;
ztn28@i~pBBd|UT=+p_#e)4tSt{c)ZC=kwHtyE0tc{FwH=*nFNpj88Xq^9eOZ?|#os
zh5`%>DbZSr-j^&7&QlNL_ghm_TF@?^qViXWd3(!y#h3NU=kJ7F*%)2ydSDLcjjEia
zJIjx&%nDg|>uyvZ2NQ$H+bREFDIW9OxUAX5mNTF%Xx-VGZ!PbWAL;*ka(~fHhRsUz
zJfm+vOI&*1Ds<DLXUqF-FDNiDbSZyaFP}DtulN+_u8;ZNtG=uZe!cu}@X9OZymuzo
zb=G^%Kk|M%OODi*_}L|s;{P2~c+O?s&-H4lqYf_vgUGXx|ECmB_9)ktm7I_8UG?R(
zsx#k@jkkZ*d46lTe`ksRr~I>f8E*$KZC@)r?amBeCLcRHw|-tJrwxj^U8aXitTb|4
zGc6ey8aO7uTfO!CwZMO?6psmh=(qXudzQ2rk8jQmlSO|Q=JkK^`E37i@{eXKO@);y
z?|Bb<W#5^`%)qeV#|7KO%*-1bQY$u1uibk;byvN)P(9Cmp$jt`)*co<ZExGwFUPRp
z#>Lu%=-|%O*+C~y9W(uZ?8$vD<vOJV!4o%xH@tdL`+cQs*smVDZyy+W85kD4xbU?u
zR%wOoyoy(w1>fE_S@U!GtiMk3p7wmkj9;hjuFlo6RLiZ?{#vBq!oaZL!^M4dl~y0$
zOU#Sd`}oEt&&R)~|E)gkTlen!*U2BaGt~~Pd2)2+|9=<H38r2y<I#`ZnzrI|s{jLo
z!22cZ(|=#jcw}$3v*`H7&hB~d<G(FFBmGZ`RpGp5z0x|S1UuzFDfiD+=Sjzz?J=9W
zV||&+ORc-EtClmAlsT;L_#?x>kkt6?rq!wIj&r{~-MaEp=&kMfKHoo<m+AiQ`<f{K
z+tvQ^r})q6kG6;yoYi9d%Culcxt;&&yx(i5I-lZO>8a|LCpm9NMfR#MuihRO-n@<1
z|IVr$Pu0BJVdtkMF5R9l6=oH^QZlN_-FMZOKHkG#&oy4RtG>H4Bkk{nBQdFWFC2;W
zy5;m-^YyDp<0W76CSPs#e*Qe^>Vr%B85vw=#{8YJ^?vZRtKYjzYm;l^Gr!I4`nFWM
zP4(G~zpKA(O}oE3BR=Qb>Dle7|F)z?JbF|j|7Z2ml_^hOoU48x3EJrMB{Kf#uT}AV
zz4a=8nS>kFm=;XU7iIWsafaX3e%7km?|;iuQ)k=$Dtoslz0~z+eTlC2?{k8kN6Ih%
ze^+hGckBP}TC0*Dj-{19`T6y=e+S-A`LutP_N{;4AIkFoDE$8I?d>mm`uCTo8|{qm
z?>h4DuGKWTfV&HGZ_j&sd-^vGeSeL;r%z3~dNL*Qd|zjoS3h58(bDSQm%i<NwNfwt
z_Cde%WpAyR7+eIG+ns)M{*2wZH=nos58k4G#V+vo@mGAZx4!v(pMER<+nXtO)`PkU
zZ@strU;Ve$fBB`oyO;isdRx5p|JqeI%JtuNZ;ik9&+_l<f5E?B?R$A7{^qi?a<|%N
zGfgOx`76yd;rKCorFTpTv0MgmWkxCv_I)9HSu8jk>SC6$yl@W>4cs_glkr#JH%;BU
zx2H6$`r^J?e!V8+UR|MtE{E+^oEy3tV%dDEo(eECG;Da0`g-x1y3=n?8wu6BCO>*V
zZQ`HXW-9eZXZ_jge|6v1{Mt{~?ZSV@y=@2W_n9ZoxS{{wYTf?d6?cBPi`<H9c*fOm
zS;t{6%M#wJGgxn|&l5YK#rVvp;dYLLtmrwT2Q8rj3=D@9qUBTHo?fF|SA6CDls~0U
z*4HlkHuu_-^~^fUFYf<#^sn)x`scP=@0(5DKbs+C=QD9ejVqB2IZO$$YzFo+e>>Q&
zc^<gOE3`m9dM?A8^_v-fze}CUAj<GNs3DeVP8ze1;D*x;u^bExi~4Ss-<(`$-hO0#
z$!6c*+M&}f?k|0HU*hlk&&<X@&8vUi-_0P<s>Sf_Y{R?F4Ar~OF@0IR;>Kw^P<{5R
z(fTagjno4%N(Pw|n!DT#85lZvwz=FtJMF{SCHcO8tR!AN+wg3D_N)6=zpn4QVf9P?
zg~2cXo6G;}GCfFqJ6~f-YD3I&My(vC2P%wzjlVIaoMTFv+|YKjp=IN_)VYEgB2CO*
zyhg1G(sy%u`4|>#{cuZPlJowH^J_fql|QOWFaLA)$b7@E@%F#+eg277KQ#umS=|`~
z8vgh*?>Ns?F_A%C&>)@VOmEX(*%pOho?FZeE>n)V<R6{)Wv)>D<0<vW+m77ddh*JC
z!(Zl;_t(C?FY~wh*5CJkZ^bXVFpaS&m+gxY_XAI+SN?1%!i{W_9%iQ+Jh%UHyKK$w
z2Xc<-iL3IZn^mi`51CKice!ML?Unnw$FJ0XcKff|^G}c=e>UUXG{!Z{nSNDIV0fL=
z5X-Xam2|^wfg2mSnHU^YJW|vum$&5m|9aMOf7Xw;(*O3T{y#SN|4z6691N!!D)ZUS
zY!jK_%d|%6!qzK4cC1xOn98_Yz@n3p!9ixj_vCAJ=idCDBecKv%6rwH&$oV?e}8qo
ziz0W!^s^0;n;BmA=PWpUmw{L4f@(0+n$3)o#!Pxf7c^LZZ{27nVIBH4JB@)Maq`;r
zo4)6!&A&e3hxcr?y5DW~+n?Mw`1*d+=lw5V+z(~2_#OXdGs9I?)!o097{3}b`YBED
zW%F6Xd&F0OfniZsuzcFv$8S9E&-?K;qxA3!d)pPCCjI#w`TKjtPyWD=%?zsNHZ$~j
zGx7-~+?SZ)&9cTQL9~g-aKmLz28E_6R>|+Luc@79`tr8${?aS==RA4;?Nz*-{(r%v
zY7EaN9(d-_@VBI4Hb+G20X>#7%?-)<J`4<jiqZE|-#>o?YFfQMvugU2_a<N82Qtj~
z=gu^19><AoA_;dzUZ^nUDJ8rU+;FPl=ZXo!-`toP1jOh3+M?xs=)A|TX)EiBkL0WU
zJHuN)_pi@C4hKQ*19|5*Go15gTqks4*;%=7%1vd0FW###Pn*f8eeKxADP2~-QYW%8
zG%R=#eqa5j@NU^^`}DW$XZKyy{TQwP>!kTl^Wrc43?koy9O{H7>{NN6$E0?R|DGP}
z%_j^D3VIe_v%j_6zkf-8R_#*TkF$gSJqxt|J!`-1&)vCyPA7vjPG;B=!t}<R&8o8@
zl<kev0~OZ19j00g4F(@>mEZhrvmKO)m}Q0RPtN~PDycA?Awu=QKEn&SW(V|`$|N^%
zH_nz|U^pVVyzbn*4{Njk@G94}zx<bT(*E`q`{4gBtGyZ~b3~*rD4g%GSir)wQQVV(
zp~GnBFVk%K8wQumGau`ItoHoZ^N&-XX@WD8SB$E{Yz|0fmYiYeJwcN#?@3k!1B2tE
zrT2}5_s)ECSEz2=k@>Z!?%V!+ZurZcp{rKxKp<0%0HeC(i5aRJ&WJooQebd!`EVtF
zYoXs4KTgmVa<{*E{eLF>=@dK5R57(7M=4=Cqq^b=RW=5O)|P1b7t_8JtJgi}t*`X^
zt<2!j;Ldqsqxk_XraWWjxT6dV3oaDAW`7GZM^<?M=_&tBCfPr1XGsxe{GHP<nP&&5
zqn;)MgGNZuw7LyS?w7t#`XTvKxQ@$V-eyK$*8{$6ca|LR6=Gm`<h8C&FIxWPmE~#P
ze^lxhnYtXfoa3M;c|w(C=ZX&(W-u@uTB2GzCwl+P>?7|d{P6tOvfh}nZ!_aMr3s46
z@0=b?mtkNy!l+-H=zPfE^7~plmAXmx7dNRg?&e6D+E}G{BAknXfouAtGb!^=U8?^z
z9b`cLX2!FV7{x6M76nQ$Ff8)l_D?5#Qn~jJJx}}lNBlpj*Gy&zmn;x!+Ow2_VS&et
zXP45a{QzlnS?%c%CV4`Qb?1U&h6X3k7dJIdp3PIKQ{q$F5Z$?*|5kV;14D<9?i=><
z&x}nRp)57inHd_G7McEvXzJJl>PvdgcVJ^+XgK1pz|6qla7cXu69dB}TSo;>1_qUK
g8l2405!U;kKP@3cWvbEPbD+&bp00i_>zopr05=Jm&Hw-a

literal 0
HcmV?d00001

diff --git a/web/index.html b/web/index.html
new file mode 100644
index 0000000..2947828
--- /dev/null
+++ b/web/index.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="UTF-8">
+  <meta content="IE=Edge" http-equiv="X-UA-Compatible">
+  <meta name="description" content="A new Flutter project.">
+
+  <!-- iOS meta tags & icons -->
+  <meta name="apple-mobile-web-app-capable" content="yes">
+  <meta name="apple-mobile-web-status-bar-style" content="black">
+  <meta name="apple-mobile-web-app-title" content="puissance4">
+  <link rel="apple-touch-icon" href="/icons/Icon-192.png">
+
+  <title>puissance4</title>
+  <link rel="manifest" href="/manifest.json">
+</head>
+<body>
+  <!-- This script installs service_worker.js to provide PWA functionality to
+       application. For more information, see:
+       https://developers.google.com/web/fundamentals/primers/service-workers -->
+  <script>
+    if ('serviceWorker' in navigator) {
+      window.addEventListener('load', function () {
+        navigator.serviceWorker.register('/flutter_service_worker.js');
+      });
+    }
+  </script>
+  <script src="main.dart.js" type="application/javascript"></script>
+</body>
+</html>
diff --git a/web/manifest.json b/web/manifest.json
new file mode 100644
index 0000000..63275bc
--- /dev/null
+++ b/web/manifest.json
@@ -0,0 +1,23 @@
+{
+    "name": "puissance4",
+    "short_name": "puissance4",
+    "start_url": ".",
+    "display": "minimal-ui",
+    "background_color": "#0175C2",
+    "theme_color": "#0175C2",
+    "description": "puissance4",
+    "orientation": "portrait-primary",
+    "prefer_related_applications": false,
+    "icons": [
+        {
+            "src": "icons/Icon-192.png",
+            "sizes": "192x192",
+            "type": "image/png"
+        },
+        {
+            "src": "icons/Icon-512.png",
+            "sizes": "512x512",
+            "type": "image/png"
+        }
+    ]
+}
-- 
GitLab