creek

The AI Image Editor of 2030
commit 2cecc5ea83303efc4d86fb0294f37a49f352a2ea
parent f9da70050ce82ec6ffec8e3365a7d099799c9223
Author: Sanjeebani Parida <sanjeebani14@gmail.com>
Date:   Thu, 27 Nov 2025 08:58:07 +0530

Merge branch 'main' of https://github.com/nilotpal-n7/adobe

Diffstat:

M.gitignore | 19++++++++++---------
MREADME.md | 39++++++++++++++++-----------------------
Mandroid/app/build.gradle.kts | 29+++++++++++------------------
Aandroid/app/proguard-rules.pro | 1+
Mandroid/app/src/main/kotlin/com/example/adobe/ImageAnalyzer.kt | 41+++++++++++++++++++++++++++++++++--------
Mandroid/app/src/main/kotlin/com/example/adobe/MainActivity.kt | 94+++++++++++++++++++++++++++++++++++++++----------------------------------------
Aandroid/app/src/main/python/analyze_layout.py | 248+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dandroid/app/src/main/python/analyzer.py | 250-------------------------------------------------------------------------------
Aandroid/app/src/main/python/color_style_infer.py | 204+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aandroid/app/src/main/python/color_style_model.joblib | 0
Mandroid/build.gradle.kts | 10+---------
Mandroid/settings.gradle.kts | 2+-
Aassets/fonts/GeneralSans-Extralight.otf | 0
Aassets/fonts/GeneralSans-Light.otf | 0
Aassets/fonts/GeneralSans-Medium.otf | 0
Aassets/fonts/GeneralSans-Regular.otf | 0
Aassets/fonts/GeneralSans-Semibold.otf | 0
Aassets/fonts/GeneralSans-Variable.ttf | 0
Aassets/style_embeddings.json | 2++
Aassets/texture_centroids.json | 6179+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/data/database.dart | 76+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Mlib/data/models/board_model.dart | 32++++++++++++++++++++++++++------
Alib/data/models/category_model.dart | 28++++++++++++++++++++++++++++
Alib/data/models/comment_model.dart | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/data/repos/board_category_repo.dart | 27+++++++++++++++++++++++++++
Mlib/data/repos/board_image_repo.dart | 23+++++++++++++++++++++++
Mlib/data/repos/board_repo.dart | 25+++++++++++++++++++++----
Alib/data/repos/comment_repo.dart | 34++++++++++++++++++++++++++++++++++
Mlib/data/repos/image_repo.dart | 15+++++++++++++++
Mlib/main.dart | 126++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
Alib/services/board_services.dart | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/services/color_analyzer_service.dart | 16++++++++++++++++
Mlib/services/download_service.dart | 21++++++++++-----------
Alib/services/embedding_analyzer_service.dart | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/services/image_analyzer_service.dart | 103+++++++++++++++++++++++++++++--------------------------------------------------
Mlib/services/image_service.dart | 50+++++++++++++++++++++++++++++++++++++++++++++-----
Mlib/services/instagram_download_service.dart | 66++++++++++++++++++++++--------------------------------------------
Alib/services/layout_analyzer_service.dart | 16++++++++++++++++
Alib/services/python_service.dart | 45+++++++++++++++++++++++++++++++++++++++++++++
Alib/services/texture_analyzer_service.dart | 152+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/services/theme_service.dart | 40++++++++++++++++++++++++++++++++++++++++
Alib/ui/pages/all_image_page.dart | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/ui/pages/board_detail_page.dart | 287+++++++++++++++++++++++--------------------------------------------------------
Alib/ui/pages/board_list_page.dart | 466+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/ui/pages/board_page.dart | 2--
Mlib/ui/pages/home_page.dart | 170+++----------------------------------------------------------------------------
Mlib/ui/pages/image_analysis_page.dart | 341+++++++++++++++++--------------------------------------------------------------
Alib/ui/pages/image_page.dart | 0
Mlib/ui/pages/image_picker_page.dart | 2--
Mlib/ui/pages/share_handler_page.dart | 258++++++++++++++++++++++---------------------------------------------------------
Alib/ui/widgets/analysis_dialog.dart | 151++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/utils/clip_image_processor.dart | 12+++++-------
Mlinux/flutter/generated_plugin_registrant.cc | 4++++
Mlinux/flutter/generated_plugins.cmake | 1+
Mmacos/Flutter/GeneratedPluginRegistrant.swift | 4++++
Mpubspec.lock | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
Mpubspec.yaml | 101++++++++++++++++++++++++-------------------------------------------------------
Dsetup_python_env.ps1 | 46----------------------------------------------
Dsetup_python_env.sh | 57---------------------------------------------------------
Dtest/widget_test.dart | 29-----------------------------
Mtriagebot.toml | 138+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Mwindows/flutter/generated_plugin_registrant.cc | 3+++
Mwindows/flutter/generated_plugins.cmake | 1+
63 files changed, 8947 insertions(+), 1651 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,4 +1,5 @@ # Miscellaneous +~* *.class *.log *.pyc @@ -12,13 +13,13 @@ .swiftpm/ migrate_working_dir/ -# IntelliJ related +# IntelliJ *.iml *.ipr *.iws .idea/ -# Flutter/Dart/Pub related +# Flutter/Dart/Pub **/doc/api/ **/ios/Flutter/.last_build_id .dart_tool/ @@ -29,16 +30,17 @@ migrate_working_dir/ /build/ .gradle -# Symbolication related +# Symbolication app.*.symbols - -# Obfuscation related app.*.map.json -# Android Studio artifacts +# Android Studio /android/app/debug /android/app/profile /android/app/release -# Python virtual environment + +# Python python_env/ -assets/clip_vitb32_image.onnx -\ No newline at end of file + +# AI Models +assets/*.onnx* diff --git a/README.md b/README.md @@ -1,56 +1,49 @@ # adobe -A Flutter project with Python image analysis using Chaquopy. +A Flutter project with AI-based image analysis ## Prerequisites - Flutter SDK -- Python 3.11 (for build-time) +- Python 3.8 +- Kotlin + Gradle +- JDK - Android SDK ## Setup -### 1. Install Python 3.11 +### 1. Setup Python + +#### A) Install Python 3.8 **macOS:** ```bash -brew install python@3.11 +brew install python@3.8 ``` **Linux:** ```bash -sudo apt-get install python3.11 python3.11-venv +sudo apt-get install python3.8 python3.8-venv ``` **Windows:** Download from [python.org](https://www.python.org/downloads/) -### 2. Set up Python Virtual Environment - -Run the setup script to create a Python virtual environment in the repository: +#### B) Set up Virtual Environment ```bash -./setup_python_env.sh +python -m venv python_env ``` -This creates a `python_env` directory with Python 3.11, which will be used by the build system. This ensures all developers use the same Python version. +### 3. AI Models -### 3. Build the APK +Download the models from [here](https://mega.nz/folder/WghwgRYA#byC4igRSImx0LRd9KW40hw) and place them under `assets` + +### 4. Build the APK ```bash +flutter clean flutter build apk --release ``` - -## Project Structure - -- `android/app/src/main/python/` - Python code (image analysis) -- `python_env/` - Python virtual environment (created by setup script) -- `lib/` - Flutter/Dart code - -## Notes - -- The Python runtime version (embedded in the app) is **3.8** (configured in `android/app/build.gradle.kts`) -- The build-time Python version is **3.11** (from the virtual environment) -- The virtual environment is used only during build, not at runtime diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts @@ -28,8 +28,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() + kotlin { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + } } defaultConfig { @@ -37,7 +39,7 @@ android { applicationId = "com.example.adobe" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion + minSdk = 24 targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName @@ -60,25 +62,16 @@ android { chaquopy { defaultConfig { version = "3.8" - - // Detect OS - val os = System.getProperty("os.name").lowercase() - val venvPath = file("../../python_env") - - // Choose correct python path - val pythonExe = if (os.contains("win")) { - File(venvPath, "Scripts/python.exe").absolutePath - } else { - File(venvPath, "bin/python").absolutePath - } - - buildPython(pythonExe) - + val isWindows = System.getProperty("os.name").lowercase().contains("windows") + val pythonFile = if (isWindows) file("../../python_env/Scripts/python.exe") else file("../../python_env/bin/python") + buildPython(pythonFile.absolutePath) pip { install("pillow") install("numpy") - install("opencv-python-headless") + install("opencv-contrib-python-headless") install("instaloader") + install("scikit-learn") + install("joblib") } } } diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro @@ -0,0 +1 @@ +-keep class ai.onnxruntime.** { *; } diff --git a/android/app/src/main/kotlin/com/example/adobe/ImageAnalyzer.kt b/android/app/src/main/kotlin/com/example/adobe/ImageAnalyzer.kt @@ -1,24 +1,50 @@ package com.example.adobe +import android.content.Context import com.chaquo.python.Python import com.chaquo.python.android.AndroidPlatform +import java.util.concurrent.CountDownLatch object ImageAnalyzer { - private var pythonInitialized = false + private val initLatch = CountDownLatch(1) + private var isInitializing = false - fun initializePython(context: android.content.Context) { - if (!pythonInitialized) { + fun initializePython(context: Context) { + if (!isInitializing) { + isInitializing = true if (!Python.isStarted()) { Python.start(AndroidPlatform(context)) } - pythonInitialized = true + initLatch.countDown() } } - fun analyzeImage(imagePath: String): String? { + private fun waitForPython() { + try { + initLatch.await() + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + + fun analyzeColorStyle(imagePath: String): String? { + waitForPython() + return try { + val py = Python.getInstance() + val module = py.getModule("color_style_infer") + val resultObj = module.callAttr("analyze_color_style", imagePath) + resultObj.toString() + } catch (e: Exception) { + e.printStackTrace() + null + } + } + + fun analyzeLayout(imagePath: String): String? { + waitForPython() return try { val py = Python.getInstance() - val module = py.getModule("analyzer") + val module = py.getModule("analyze_layout") val result = module.callAttr("analyze_single_image", imagePath) result.toString() } catch (e: Exception) { @@ -28,6 +54,7 @@ object ImageAnalyzer { } fun downloadInstagramImage(url: String, outputDir: String): String? { + waitForPython() return try { val py = Python.getInstance() val module = py.getModule("instagram_downloader") @@ -39,5 +66,3 @@ object ImageAnalyzer { } } } - - diff --git a/android/app/src/main/kotlin/com/example/adobe/MainActivity.kt b/android/app/src/main/kotlin/com/example/adobe/MainActivity.kt @@ -1,68 +1,66 @@ package com.example.adobe -import android.os.Bundle import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel -import org.json.JSONObject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class MainActivity : FlutterActivity() { - private val CHANNEL = "com.example.adobe/image_analyzer" - private val INSTAGRAM_CHANNEL = "com.example.adobe/instagram_downloader" + private val CHANNEL = "com.example.adobe/methods" + private val scope = CoroutineScope(Dispatchers.Default) override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) - - // Initialize Python - ImageAnalyzer.initializePython(this) - + + // Initialize Python immediately in the background + scope.launch(Dispatchers.IO) { + ImageAnalyzer.initializePython(context) + } + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> - when (call.method) { - "analyzeImage" -> { - val imagePath = call.argument<String>("imagePath") - if (imagePath != null) { - try { - val analysisResult = ImageAnalyzer.analyzeImage(imagePath) - if (analysisResult != null) { - result.success(analysisResult) - } else { - result.error("ANALYSIS_ERROR", "Failed to analyze image", null) - } - } catch (e: Exception) { - result.error("ANALYSIS_ERROR", e.message, null) + // Launch a new coroutine for every method call on the IO dispatcher for parallel execution + scope.launch(Dispatchers.IO) { + try { + val response: Any? = when (call.method) { + "analyzeLayout" -> { + val path = call.argument<String>("imagePath")!! + ImageAnalyzer.analyzeLayout(path) + } + "analyzeColorStyle" -> { + val path = call.argument<String>("imagePath")!! + ImageAnalyzer.analyzeColorStyle(path) + } + "downloadInstagramImage" -> { + val url = call.argument<String>("url")!! + val outputDir = call.argument<String>("outputDir")!! + ImageAnalyzer.downloadInstagramImage(url, outputDir) } - } else { - result.error("INVALID_ARGUMENT", "Image path is null", null) + else -> null } - } - else -> { - result.notImplemented() - } - } - } - - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, INSTAGRAM_CHANNEL).setMethodCallHandler { call, result -> - when (call.method) { - "downloadInstagramImage" -> { - val url = call.argument<String>("url") - val outputDir = call.argument<String>("outputDir") - if (url != null && outputDir != null) { - try { - val downloadResult = ImageAnalyzer.downloadInstagramImage(url, outputDir) - if (downloadResult != null) { - result.success(downloadResult) + + // Switch back to the Main Thread to send the result to Flutter + withContext(Dispatchers.Main) { + if (response != null) { + result.success(response) + } else { + if (call.method == "downloadInstagramImage") { + // Specific error handling for downloader if needed + result.error("ERROR", "Download returned null", null) + } else if (response == null && (call.method == "analyzeLayout" || call.method == "analyzeColorStyle")) { + // Python returned null (error inside script) + result.error("ANALYSIS_ERROR", "Python returned null", null) } else { - result.error("DOWNLOAD_ERROR", "Failed to download Instagram image", null) + result.notImplemented() } - } catch (e: Exception) { - result.error("DOWNLOAD_ERROR", e.message, null) } - } else { - result.error("INVALID_ARGUMENT", "URL or output directory is null", null) } - } - else -> { - result.notImplemented() + } catch (e: Exception) { + withContext(Dispatchers.Main) { + result.error("EXCEPTION", e.message, e.stackTraceToString()) + } } } } diff --git a/android/app/src/main/python/analyze_layout.py b/android/app/src/main/python/analyze_layout.py @@ -0,0 +1,248 @@ +import cv2 +import numpy as np +import os +import json +from math import hypot + +# ========================================== +# 1. HELPER FUNCTIONS +# ========================================== + +def resize_for_fast_processing(img, max_side=640): + h, w = img.shape[:2] + scale = max_side / max(h, w) if max(h, w) > max_side else 1.0 + if scale != 1.0: + img = cv2.resize(img, (int(w * scale), int(h * scale)), interpolation=cv2.INTER_AREA) + return img, scale + +def compute_saliency_gray(img): + sal = None + try: + salience = cv2.saliency.StaticSaliencySpectralResidual_create() + success, sal = salience.computeSaliency(img) + if not success: sal = None + except Exception: + sal = None + if sal is None: + # Fallback: Simple Gaussian Difference + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + blur1 = cv2.GaussianBlur(gray, (3, 3), 0) + blur2 = cv2.GaussianBlur(gray, (21, 21), 0) + sal = cv2.absdiff(blur1, blur2) + sal = sal.astype(np.float32) / (sal.max() + 1e-9) + else: + sal = sal.astype(np.float32) + if sal.max() > 0: sal /= sal.max() + return sal + +def saliency_centroid(sal): + h, w = sal.shape + M = sal.sum() + if M <= 1e-6: return (w / 2, h / 2) + ys, xs = np.indices(sal.shape) + cx = (xs * sal).sum() / M + cy = (ys * sal).sum() / M + return (float(cx), float(cy)) + +def detect_lines(gray, canny_thresh1=50, canny_thresh2=150, hough_thresh=50): + edges = cv2.Canny(gray, canny_thresh1, canny_thresh2) + lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi / 180, threshold=hough_thresh, + minLineLength=min(gray.shape) // 10, maxLineGap=10) + if lines is None: return edges, [] + lines = [tuple(l[0]) for l in lines] + return edges, lines + +# ========================================== +# 2. SCORING FUNCTIONS +# ========================================== + +def saturation_score(img_bgr): + hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV).astype(np.float32) + sat = hsv[:, :, 1] / 255.0 + return float(np.mean(sat)) + +def balance_score(img_bgr, sal): + img_lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB).astype(np.float32) + L = img_lab[:,:,0] / 255.0 + img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV).astype(np.float32) + S = img_hsv[:,:,1] / 255.0 + weight = sal * (L + 0.5 * S) + M = weight.sum() + h,w = sal.shape + if M <= 1e-6: return 0.0 + ys, xs = np.indices(sal.shape) + cx = (xs * weight).sum() / M + cy = (ys * weight).sum() / M + dx = abs(cx - w/2) / (w/2) + dy = abs(cy - h/2) / (h/2) + dist = np.sqrt(dx*dx + dy*dy) / np.sqrt(2) + return float(max(0.0, 1.0 - dist*1.4)) + +def depth_score(img_gray, sal): + mask = sal > 0.3 + if mask.sum() == 0: return 0.0 + ys,xs = np.where(mask) + minx, maxx = xs.min(), xs.max() + miny, maxy = ys.min(), ys.max() + lap = cv2.Laplacian(img_gray, cv2.CV_64F) + inside = lap[miny:maxy+1, minx:maxx+1] + outside_mask = np.ones_like(img_gray, dtype=bool) + outside_mask[miny:maxy+1, minx:maxx+1] = False + outside = lap[outside_mask] + var_in = float(np.var(inside)) if inside.size>0 else 0.0 + var_out = float(np.var(outside)) if outside.size>0 else 0.0 + diff = var_in - var_out + score = (diff / (abs(var_out) + 1e-6)) if var_out>1e-6 else (1.0 if diff>0 else 0.0) + score = np.tanh(score) + return float(max(0.0, min(1.0, (score+1)/2))) + +def diagonals_triangles_score(lines, contours, centroid, img_shape): + if not lines: + diag_strength = 0.0 + else: + angles = [] + for (x1,y1,x2,y2) in lines: + dx = x2 - x1; dy = y2 - y1 + ang = abs(np.arctan2(dy, dx)) + ang = min(ang, np.pi - ang) + angles.append(1.0 - abs(ang - np.pi/4) / (np.pi/4)) + diag_strength = float(np.mean(angles)) if angles else 0.0 + h,w = img_shape[0], img_shape[1] + cx,cy = int(centroid[0]), int(centroid[1]) + tri_score = 0.0 + for c in contours: + area = cv2.contourArea(c) + if area < 0.01*w*h: continue + peri = cv2.arcLength(c, True) + approx = cv2.approxPolyDP(c, 0.04 * peri, True) + if len(approx) == 3: + inside = cv2.pointPolygonTest(c, (cx,cy), False) + dist_to_centroid = 0 if inside>=0 else min([np.linalg.norm(np.array(pt[0]) - np.array([cx,cy])) for pt in approx]) + tri_score = max(tri_score, max(0.0, 1.0 - dist_to_centroid / max(w,h))) + combined = 0.6*diag_strength + 0.4*tri_score + return float(max(0.0, min(1.0, combined))) + +def symmetry_score(img_gray): + h,w = img_gray.shape + left = img_gray[:, :w//2] + right = img_gray[:, w - w//2:] + right_flipped = cv2.flip(right, 1) + if left.shape != right_flipped.shape: + right_flipped = cv2.resize(right_flipped, (left.shape[1], left.shape[0])) + leftf = left.astype(np.float32); rightf = right_flipped.astype(np.float32) + if leftf.std() < 1e-3 or rightf.std() < 1e-3: return 0.0 + corr = np.corrcoef(leftf.flatten(), rightf.flatten())[0,1] + return float(max(0.0, min(1.0, (corr + 1)/2))) + +def fill_frame_score(sal, threshold=0.5): + mask = sal > threshold + if mask.sum() == 0: return 0.0 + ys, xs = np.where(mask) + h,w = sal.shape + box_area = (xs.max()-xs.min()+1)*(ys.max()-ys.min()+1) + frac = box_area / (w*h) + return float(min(1.0, frac*2.0)) + +def negative_space_score(sal): + low = (sal < 0.15).sum() / sal.size + return float(min(1.0, low)) + +def thirds_score(sal, centroid): + h,w = sal.shape + cx, cy = centroid + thirds_pts = [(w/3, h/3), (w/3, 2*h/3), (2*w/3, h/3), (2*w/3, 2*h/3)] + dists = [hypot(cx-x, cy-y) for (x,y) in thirds_pts] + maxd = hypot(w, h) + score = 1.0 - min(dists)/maxd*1.2 + vline_dist = min(abs(cx - w/3), abs(cx - 2*w/3)) / w + hline_dist = min(abs(cy - h/3), abs(cy - 2*h/3)) / h + line_score = 1.0 - min(vline_dist, hline_dist) + return float(max(0.0, min(1.0, 0.6*score + 0.4*line_score))) + +def golden_ratio_score(sal, centroid): + h,w = sal.shape + gx = [0.382, 0.618]; gy = [0.382, 0.618] + cx, cy = centroid + pts = [(g*w, g2*h) for g in gx for g2 in gy] + dists = [hypot(cx-x, cy-y) for x,y in pts] + maxd = hypot(w, h) + return float(max(0.0, min(1.0, 1.0 - min(dists)/ (maxd*0.9)))) + +def center_score(sal, centroid): + h,w = sal.shape + cx, cy = centroid + dx = abs(cx - w/2) / (w/2) + dy = abs(cy - h/2) / (h/2) + dist = np.sqrt(dx*dx + dy*dy) / np.sqrt(2) + return float(max(0.0, 1.0 - dist*1.2)) + + +# ========================================== +# 3. SINGLE IMAGE ANALYZER +# ========================================== + +def analyze_single_image(img_path): + if not os.path.exists(img_path): + return json.dumps({ + "error": f"File not found at {img_path}", + "success": False + }) + + # Load Image + img_full = cv2.imread(img_path) + if img_full is None: + return json.dumps({ + "error": "Could not load image. Check format.", + "success": False + }) + + try: + # 1. Preprocessing + img, scale = resize_for_fast_processing(img_full, max_side=640) + h, w = img.shape[:2] + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + + # 2. Saliency Map + sal = compute_saliency_gray(img) + if sal.shape != gray.shape: + sal = cv2.resize(sal, (w, h), interpolation=cv2.INTER_LINEAR) + centroid = saliency_centroid(sal) + + # 3. Geometric Features (Lines & Contours) + edges, lines = detect_lines(gray) + _, thr = cv2.threshold((gray).astype(np.uint8), 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV) + contours, _ = cv2.findContours(thr, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + # 4. Calculate Scores + scores = { + 'Rule of Thirds': thirds_score(sal, centroid), + 'Golden Ratio': golden_ratio_score(sal, centroid), + 'Symmetry': symmetry_score(gray), + 'Fill Frame': fill_frame_score(sal, threshold=0.45), + 'Negative Space': negative_space_score(sal), + 'Center Composition': center_score(sal, centroid), + 'Visual Balance': balance_score(img, sal), + 'Depth': depth_score(gray, sal), + 'Saturation': saturation_score(img), + 'Diagonals & Triangles': diagonals_triangles_score(lines, contours, centroid, img.shape) + } + + # 5. Sort and get top 5 + sorted_features = sorted(scores.items(), key=lambda x: x[1], reverse=True) + top5 = [{"name": k, "score": v} for k, v in sorted_features[:5]] + + # 6. Return JSON result + result = { + "success": True, + "scores": {k: float(v) for k, v in scores.items()}, + "top5": top5, + "image_name": os.path.basename(img_path) + } + + return json.dumps(result) + + except Exception as e: + return json.dumps({ + "error": str(e), + "success": False + }) diff --git a/android/app/src/main/python/analyzer.py b/android/app/src/main/python/analyzer.py @@ -1,250 +0,0 @@ -import cv2 -import numpy as np -import os -import json -from math import hypot - -# ========================================== -# 1. HELPER FUNCTIONS -# ========================================== - -def resize_for_fast_processing(img, max_side=640): - h, w = img.shape[:2] - scale = max_side / max(h, w) if max(h, w) > max_side else 1.0 - if scale != 1.0: - img = cv2.resize(img, (int(w * scale), int(h * scale)), interpolation=cv2.INTER_AREA) - return img, scale - -def compute_saliency_gray(img): - sal = None - try: - salience = cv2.saliency.StaticSaliencySpectralResidual_create() - success, sal = salience.computeSaliency(img) - if not success: sal = None - except Exception: - sal = None - if sal is None: - # Fallback: Simple Gaussian Difference - gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - blur1 = cv2.GaussianBlur(gray, (3, 3), 0) - blur2 = cv2.GaussianBlur(gray, (21, 21), 0) - sal = cv2.absdiff(blur1, blur2) - sal = sal.astype(np.float32) / (sal.max() + 1e-9) - else: - sal = sal.astype(np.float32) - if sal.max() > 0: sal /= sal.max() - return sal - -def saliency_centroid(sal): - h, w = sal.shape - M = sal.sum() - if M <= 1e-6: return (w / 2, h / 2) - ys, xs = np.indices(sal.shape) - cx = (xs * sal).sum() / M - cy = (ys * sal).sum() / M - return (float(cx), float(cy)) - -def detect_lines(gray, canny_thresh1=50, canny_thresh2=150, hough_thresh=50): - edges = cv2.Canny(gray, canny_thresh1, canny_thresh2) - lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi / 180, threshold=hough_thresh, - minLineLength=min(gray.shape) // 10, maxLineGap=10) - if lines is None: return edges, [] - lines = [tuple(l[0]) for l in lines] - return edges, lines - -# ========================================== -# 2. SCORING FUNCTIONS -# ========================================== - -def saturation_score(img_bgr): - hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV).astype(np.float32) - sat = hsv[:, :, 1] / 255.0 - return float(np.mean(sat)) - -def balance_score(img_bgr, sal): - img_lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB).astype(np.float32) - L = img_lab[:,:,0] / 255.0 - img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV).astype(np.float32) - S = img_hsv[:,:,1] / 255.0 - weight = sal * (L + 0.5 * S) - M = weight.sum() - h,w = sal.shape - if M <= 1e-6: return 0.0 - ys, xs = np.indices(sal.shape) - cx = (xs * weight).sum() / M - cy = (ys * weight).sum() / M - dx = abs(cx - w/2) / (w/2) - dy = abs(cy - h/2) / (h/2) - dist = np.sqrt(dx*dx + dy*dy) / np.sqrt(2) - return float(max(0.0, 1.0 - dist*1.4)) - -def depth_score(img_gray, sal): - mask = sal > 0.3 - if mask.sum() == 0: return 0.0 - ys,xs = np.where(mask) - minx, maxx = xs.min(), xs.max() - miny, maxy = ys.min(), ys.max() - lap = cv2.Laplacian(img_gray, cv2.CV_64F) - inside = lap[miny:maxy+1, minx:maxx+1] - outside_mask = np.ones_like(img_gray, dtype=bool) - outside_mask[miny:maxy+1, minx:maxx+1] = False - outside = lap[outside_mask] - var_in = float(np.var(inside)) if inside.size>0 else 0.0 - var_out = float(np.var(outside)) if outside.size>0 else 0.0 - diff = var_in - var_out - score = (diff / (abs(var_out) + 1e-6)) if var_out>1e-6 else (1.0 if diff>0 else 0.0) - score = np.tanh(score) - return float(max(0.0, min(1.0, (score+1)/2))) - -def diagonals_triangles_score(lines, contours, centroid, img_shape): - if not lines: - diag_strength = 0.0 - else: - angles = [] - for (x1,y1,x2,y2) in lines: - dx = x2 - x1; dy = y2 - y1 - ang = abs(np.arctan2(dy, dx)) - ang = min(ang, np.pi - ang) - angles.append(1.0 - abs(ang - np.pi/4) / (np.pi/4)) - diag_strength = float(np.mean(angles)) if angles else 0.0 - h,w = img_shape[0], img_shape[1] - cx,cy = int(centroid[0]), int(centroid[1]) - tri_score = 0.0 - for c in contours: - area = cv2.contourArea(c) - if area < 0.01*w*h: continue - peri = cv2.arcLength(c, True) - approx = cv2.approxPolyDP(c, 0.04 * peri, True) - if len(approx) == 3: - inside = cv2.pointPolygonTest(c, (cx,cy), False) - dist_to_centroid = 0 if inside>=0 else min([np.linalg.norm(np.array(pt[0]) - np.array([cx,cy])) for pt in approx]) - tri_score = max(tri_score, max(0.0, 1.0 - dist_to_centroid / max(w,h))) - combined = 0.6*diag_strength + 0.4*tri_score - return float(max(0.0, min(1.0, combined))) - -def symmetry_score(img_gray): - h,w = img_gray.shape - left = img_gray[:, :w//2] - right = img_gray[:, w - w//2:] - right_flipped = cv2.flip(right, 1) - if left.shape != right_flipped.shape: - right_flipped = cv2.resize(right_flipped, (left.shape[1], left.shape[0])) - leftf = left.astype(np.float32); rightf = right_flipped.astype(np.float32) - if leftf.std() < 1e-3 or rightf.std() < 1e-3: return 0.0 - corr = np.corrcoef(leftf.flatten(), rightf.flatten())[0,1] - return float(max(0.0, min(1.0, (corr + 1)/2))) - -def fill_frame_score(sal, threshold=0.5): - mask = sal > threshold - if mask.sum() == 0: return 0.0 - ys, xs = np.where(mask) - h,w = sal.shape - box_area = (xs.max()-xs.min()+1)*(ys.max()-ys.min()+1) - frac = box_area / (w*h) - return float(min(1.0, frac*2.0)) - -def negative_space_score(sal): - low = (sal < 0.15).sum() / sal.size - return float(min(1.0, low)) - -def thirds_score(sal, centroid): - h,w = sal.shape - cx, cy = centroid - thirds_pts = [(w/3, h/3), (w/3, 2*h/3), (2*w/3, h/3), (2*w/3, 2*h/3)] - dists = [hypot(cx-x, cy-y) for (x,y) in thirds_pts] - maxd = hypot(w, h) - score = 1.0 - min(dists)/maxd*1.2 - vline_dist = min(abs(cx - w/3), abs(cx - 2*w/3)) / w - hline_dist = min(abs(cy - h/3), abs(cy - 2*h/3)) / h - line_score = 1.0 - min(vline_dist, hline_dist) - return float(max(0.0, min(1.0, 0.6*score + 0.4*line_score))) - -def golden_ratio_score(sal, centroid): - h,w = sal.shape - gx = [0.382, 0.618]; gy = [0.382, 0.618] - cx, cy = centroid - pts = [(g*w, g2*h) for g in gx for g2 in gy] - dists = [hypot(cx-x, cy-y) for x,y in pts] - maxd = hypot(w, h) - return float(max(0.0, min(1.0, 1.0 - min(dists)/ (maxd*0.9)))) - -def center_score(sal, centroid): - h,w = sal.shape - cx, cy = centroid - dx = abs(cx - w/2) / (w/2) - dy = abs(cy - h/2) / (h/2) - dist = np.sqrt(dx*dx + dy*dy) / np.sqrt(2) - return float(max(0.0, 1.0 - dist*1.2)) - - -# ========================================== -# 3. SINGLE IMAGE ANALYZER -# ========================================== - -def analyze_single_image(img_path): - if not os.path.exists(img_path): - return json.dumps({ - "error": f"File not found at {img_path}", - "success": False - }) - - # Load Image - img_full = cv2.imread(img_path) - if img_full is None: - return json.dumps({ - "error": "Could not load image. Check format.", - "success": False - }) - - try: - # 1. Preprocessing - img, scale = resize_for_fast_processing(img_full, max_side=640) - h, w = img.shape[:2] - gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - - # 2. Saliency Map - sal = compute_saliency_gray(img) - if sal.shape != gray.shape: - sal = cv2.resize(sal, (w, h), interpolation=cv2.INTER_LINEAR) - centroid = saliency_centroid(sal) - - # 3. Geometric Features (Lines & Contours) - edges, lines = detect_lines(gray) - _, thr = cv2.threshold((gray).astype(np.uint8), 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV) - contours, _ = cv2.findContours(thr, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) - - # 4. Calculate Scores - scores = { - 'Rule of Thirds': thirds_score(sal, centroid), - 'Golden Ratio': golden_ratio_score(sal, centroid), - 'Symmetry': symmetry_score(gray), - 'Fill Frame': fill_frame_score(sal, threshold=0.45), - 'Negative Space': negative_space_score(sal), - 'Center Composition': center_score(sal, centroid), - 'Visual Balance': balance_score(img, sal), - 'Depth': depth_score(gray, sal), - 'Saturation': saturation_score(img), - 'Diagonals & Triangles': diagonals_triangles_score(lines, contours, centroid, img.shape) - } - - # 5. Sort and get top 5 - sorted_features = sorted(scores.items(), key=lambda x: x[1], reverse=True) - top5 = [{"name": k, "score": v} for k, v in sorted_features[:5]] - - # 6. Return JSON result - result = { - "success": True, - "scores": {k: float(v) for k, v in scores.items()}, - "top5": top5, - "image_name": os.path.basename(img_path) - } - - return json.dumps(result) - - except Exception as e: - return json.dumps({ - "error": str(e), - "success": False - }) - - diff --git a/android/app/src/main/python/color_style_infer.py b/android/app/src/main/python/color_style_infer.py @@ -0,0 +1,204 @@ +import os +import sys +import json +import traceback +import numpy as np +import cv2 +import joblib + +# --- Global Cache --- +_MODEL_DATA = None + +class NumpyEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, (np.integer, int)): + return int(obj) + elif isinstance(obj, (np.floating, float)): + return float(obj) + elif isinstance(obj, np.ndarray): + return obj.tolist() + return super(NumpyEncoder, self).default(obj) + +def _load_model_if_needed(): + global _MODEL_DATA + if _MODEL_DATA is not None: + return _MODEL_DATA + + try: + base_dir = os.path.dirname(__file__) + model_path = os.path.join(base_dir, "color_style_model.joblib") + if os.path.exists(model_path): + _MODEL_DATA = joblib.load(model_path) + except Exception as e: + print(f"Error loading model: {e}") + return _MODEL_DATA + +# --- Feature Extraction Helpers --- +def compute_color_features(bgr): + hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV) + lab = cv2.cvtColor(bgr, cv2.COLOR_BGR2LAB) + H, S, V = cv2.split(hsv) + L, A, B = cv2.split(lab) + + def stats(x): + x = x.astype(np.float32) / 255.0 + return float(x.mean()), float(x.std()), float(np.percentile(x, 1)), float(np.percentile(x, 99)) + + color = {} + + # Lightness / brightness + mean_L, std_L, p1_L, p99_L = stats(L) + color.update({"mean_L": mean_L, "std_L": std_L, "p1_L": p1_L, "p99_L": p99_L}) + + # Saturation + mean_S, std_S, p1_S, p99_S = stats(S) + color.update({"mean_S": mean_S, "std_S": std_S, "p1_S": p1_S, "p99_S": p99_S}) + + # Value / luminance + mean_V, std_V, p1_V, p99_V = stats(V) + color.update({"mean_V": mean_V, "std_V": std_V, "p1_V": p1_V, "p99_V": p99_V}) + + # Hue stats + Hf = H.astype(np.float32) * 2.0 + rad = np.deg2rad(Hf) + sin_mean, cos_mean = np.sin(rad).mean(), np.cos(rad).mean() + hue_mean_deg = np.rad2deg(np.arctan2(sin_mean, cos_mean)) % 360 + R = np.sqrt(sin_mean**2 + cos_mean**2) + hue_dispersion = float(1 - R) + color.update({"hue_mean_deg": float(hue_mean_deg), "hue_dispersion": hue_dispersion}) + + # Colorfulness + rg = (bgr[:, :, 2].astype(np.float32) - bgr[:, :, 1].astype(np.float32)) + yb = 0.5 * (bgr[:, :, 2].astype(np.float32) + bgr[:, :, 1].astype(np.float32)) - bgr[:, :, 0].astype(np.float32) + sigma_rg, sigma_yb = rg.std(), yb.std() + mean_rg, mean_yb = rg.mean(), yb.mean() + colorfulness = np.sqrt(sigma_rg**2 + sigma_yb**2) + 0.3 * np.sqrt(mean_rg**2 + mean_yb**2) + color["colorfulness"] = float(colorfulness) + + # Palette + pixels = bgr.reshape(-1, 3).astype(np.float32) + K = 5 + criteria = (cv2.TermCriteria_EPS + cv2.TermCriteria_MAX_ITER, 20, 1.0) + _, _, centers = cv2.kmeans(pixels, K, None, criteria, 1, cv2.KMEANS_PP_CENTERS) + color["palette_bgr"] = centers.astype(int).tolist() + + return color + + +def compute_editing_features(bgr): + hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV) + lab = cv2.cvtColor(bgr, cv2.COLOR_BGR2LAB) + H, S, V = cv2.split(hsv) + L, A, B = cv2.split(lab) + + feats = {} + + def stats(x): + x = x.astype(np.float32) / 255.0 + return float(x.mean()), float(x.std()), float(np.percentile(x, 1)), float(np.percentile(x, 99)) + + mean_V, std_V, p1_V, p99_V = stats(V) + mean_S, std_S, p1_S, p99_S = stats(S) + + feats["brightness_mean"] = mean_V + feats["brightness_range"] = p99_V - p1_V + + gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY).astype(np.float32) / 255.0 + feats["contrast_rms"] = float(gray.std()) + feats["saturation_mean"] = mean_S + feats["saturation_range"] = p99_S - p1_S + feats["tint_a_mean"] = float(A.mean()) + feats["tint_b_mean"] = float(B.mean()) + + Hf = H.astype(np.float32) * 2.0 + rad = np.deg2rad(Hf) + sin_mean, cos_mean = np.sin(rad).mean(), np.cos(rad).mean() + hue_mean_deg = np.rad2deg(np.arctan2(sin_mean, cos_mean)) % 360 + R = np.sqrt(sin_mean**2 + cos_mean**2) + feats["hue_mean_deg"] = float(hue_mean_deg) + feats["hue_dispersion"] = float(1 - R) + + patch_std = [] + step, k = 16, 16 + for y in range(0, gray.shape[0] - k + 1, step): + for x in range(0, gray.shape[1] - k + 1, step): + patch = gray[y:y + k, x:x + k] + patch_std.append(patch.std()) + if len(patch_std) > 0: + patch_std = np.array(patch_std) + feats["local_contrast_mean"] = float(patch_std.mean()) + feats["local_contrast_std"] = float(patch_std.std()) + else: + feats["local_contrast_mean"] = 0.0 + feats["local_contrast_std"] = 0.0 + + return feats + + +def flatten_features(features_dict): + flat_values = [] + # 1. Color Features + color_feats = features_dict.get('color', {}) + for key, val in color_feats.items(): + if key == 'palette_bgr': + flat_values.extend(np.array(val).flatten()) + else: + flat_values.append(val) + # 2. Editing Features + edit_feats = features_dict.get('editing', {}) + for key, val in edit_feats.items(): + flat_values.append(val) + return np.array(flat_values) + + +# --- Public API --- + +def analyze_color_style(image_path): + try: + model_data = _load_model_if_needed() + if model_data is None: + return json.dumps({"success": False, "error": "Model failed to load"}) + + if not os.path.exists(image_path): + return json.dumps({"success": False, "error": f"Image not found at: {image_path}"}) + + img = cv2.imread(image_path) + if img is None: + return json.dumps({"success": False, "error": "CV2 could not read image"}) + + # Extract Features + raw_features = { + "color": compute_color_features(img), + "editing": compute_editing_features(img) + } + + flat_vector = flatten_features(raw_features) + + # Predict + clf = model_data['model'] + le = model_data['encoder'] + + probs = clf.predict_proba([flat_vector])[0] + classes = le.classes_ + + # Format Results + prediction = classes[np.argmax(probs)] + score = max(probs) + + results = [] + for c, p in zip(classes, probs): + results.append({"label": c, "score": p}) + + results = sorted(results, key=lambda x: x["score"], reverse=True)[:3] + + response = { + "success": True, + "predictions": results, + "top_label": prediction, + "top_score": score + } + + return json.dumps(response, cls=NumpyEncoder) + + except Exception as e: + return json.dumps({"success": False, "error": f"Python Exception: {str(e)} | {traceback.format_exc()}"}) diff --git a/android/app/src/main/python/color_style_model.joblib b/android/app/src/main/python/color_style_model.joblib Binary files differ. diff --git a/android/build.gradle.kts b/android/build.gradle.kts @@ -29,11 +29,4 @@ subprojects { compileOptions.javaClass.getMethod("setTargetCompatibility", JavaVersion::class.java).invoke(compileOptions, JavaVersion.VERSION_17) } } - - // Set Kotlin JVM target for all projects - tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach { - kotlinOptions { - jvmTarget = "17" - } - } -} -\ No newline at end of file +} diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts @@ -20,7 +20,7 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" id("com.android.application") version "8.7.0" apply false - id("org.jetbrains.kotlin.android") version "1.8.22" apply false + id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.chaquo.python") version "15.0.1" apply false } diff --git a/assets/fonts/GeneralSans-Extralight.otf b/assets/fonts/GeneralSans-Extralight.otf Binary files differ. diff --git a/assets/fonts/GeneralSans-Light.otf b/assets/fonts/GeneralSans-Light.otf Binary files differ. diff --git a/assets/fonts/GeneralSans-Medium.otf b/assets/fonts/GeneralSans-Medium.otf Binary files differ. diff --git a/assets/fonts/GeneralSans-Regular.otf b/assets/fonts/GeneralSans-Regular.otf Binary files differ. diff --git a/assets/fonts/GeneralSans-Semibold.otf b/assets/fonts/GeneralSans-Semibold.otf Binary files differ. diff --git a/assets/fonts/GeneralSans-Variable.ttf b/assets/fonts/GeneralSans-Variable.ttf Binary files differ. diff --git a/assets/style_embeddings.json b/assets/style_embeddings.json @@ -0,0 +1 @@ +{"centroids": [[0.037410713732242584, 0.01032846886664629, -0.006496666464954615, -0.0003397406544536352, 0.024825748056173325, -0.01326723676174879, 0.006402510683983564, -0.05088614299893379, 0.04047294333577156, -0.03631814569234848, 0.017434848472476006, 0.006250704638659954, 0.013715507462620735, -0.0295159462839365, 0.019124312326312065, 0.02967146411538124, 0.0261624027043581, -0.010533331893384457, -0.0696345791220665, 0.05644691362977028, 0.0021167858503758907, -0.0848107859492302, 0.04575641080737114, 0.02822055108845234, 0.009519659914076328, 0.015605765394866467, 0.025754733011126518, 0.05696411430835724, 0.004943086300045252, -0.005146179813891649, 0.05336252599954605, -0.04030131921172142, 0.006782590877264738, 0.026332497596740723, -0.04617471620440483, -0.01902235858142376, 0.03423511981964111, -0.028824735432863235, -0.025558089837431908, -0.010464509949088097, 0.018574386835098267, 0.001364825526252389, -0.0021406528539955616, 0.006535761058330536, 0.007381180301308632, -0.00013021125050727278, -0.0016936823958531022, -0.031437523663043976, 0.010273285210132599, -0.0026176453102380037, 0.009987170808017254, 0.024264123290777206, -0.005491625517606735, 0.023879708722233772, -0.00430209981277585, -0.027319326996803284, 0.045308247208595276, 0.007180051412433386, -0.04070817306637764, -0.022385921329259872, 0.006895426660776138, 0.005658823996782303, -0.027868220582604408, -0.038581620901823044, -0.003391060745343566, -0.001897052163258195, 0.01846497133374214, 0.004042943939566612, 0.012878543697297573, 0.016046034172177315, 0.005006573628634214, -0.015540322288870811, 0.002202065195888281, -9.654765744926408e-05, -0.015288256108760834, -0.01110653392970562, -0.023044710978865623, -0.059508245438337326, -0.03604498505592346, 0.07877076417207718, 0.05674578249454498, -0.015012387186288834, -0.028188906610012054, 0.024766268208622932, 0.004146892111748457, 0.046834565699100494, -0.008975096978247166, -0.005457403138279915, -0.014898395165801048, -0.012242256663739681, -0.02548826113343239, 0.02181020751595497, -0.11345333606004715, 0.030950963497161865, 0.0049123563803732395, 0.03324787691235542, 0.048487212508916855, 0.012917710468173027, 0.0496080256998539, -0.027249008417129517, -0.01546099130064249, -0.02110314927995205, -0.04533052071928978, 0.04701036214828491, 0.04316450282931328, -0.01791909523308277, -0.023697366937994957, -0.03891059011220932, 0.019209273159503937, 0.002729166764765978, -0.04566885530948639, -0.030635138973593712, -0.0076787215657532215, 0.008287240751087666, -0.024436531588435173, -0.03157305344939232, 0.0027014806400984526, 0.004855814855545759, -0.010503092780709267, 0.033999498933553696, 0.012360645458102226, -0.021879835054278374, 0.01284619327634573, -0.02835136279463768, 0.006650635506957769, -0.033078309148550034, 0.028153732419013977, 0.01671641506254673, 0.019417105242609978, 0.0026844479143619537, -0.051360152661800385, 0.034830331802368164, 0.0033212818671017885, 0.5232117772102356, 0.022300811484456062, 0.0282598789781332, -0.0149973900988698, -0.007168178912252188, 0.0043852729722857475, -0.006763983517885208, -0.036298662424087524, -0.04306979477405548, 0.012819684110581875, -0.015448123216629028, -0.0011913527268916368, 0.018202239647507668, -0.007421017624437809, 0.018340319395065308, 0.014805884100496769, 0.016212323680520058, -0.01329395454376936, -0.008656593039631844, 0.030233995988965034, 0.0027594107668846846, -0.017657294869422913, -0.00460516382008791, -0.0032492438331246376, 0.004282067064195871, -0.025267967954277992, 0.004713432397693396, 0.048128172755241394, -0.04164191335439682, -0.016997385770082474, -0.019986657425761223, 0.005985925439745188, -0.01987842284142971, -0.013096459209918976, -0.008029673248529434, -0.02530253306031227, -0.023611247539520264, -0.040966980159282684, -0.02175319194793701, 0.021029165014624596, 0.05179472267627716, 0.008932141587138176, 0.028899461030960083, -0.028533093631267548, -0.03714488074183464, -0.006160468328744173, -0.025249792262911797, -0.052030738443136215, -0.022433720529079437, -0.023283598944544792, -0.02452455274760723, -0.01342834997922182, 0.04164367914199829, -0.02202569879591465, -0.011885793879628181, -0.012355856597423553, -0.01265649776905775, 0.026357168331742287, 0.03063708357512951, 0.03692787140607834, 0.06460178643465042, -0.009061564691364765, -0.03352278843522072, -0.01777992583811283, -0.020970292389392853, 0.005023247562348843, -0.013349706307053566, -0.035641130059957504, 0.02720044180750847, 0.02239200659096241, 0.012869488447904587, -0.0042076800018548965, 0.031027909368276596, -0.004124437924474478, -0.00022051105042919517, 0.01988866925239563, 0.041411109268665314, -0.01219858881086111, 0.05260045826435089, -0.02415844425559044, -0.04173443093895912, -0.017547890543937683, -0.016914933919906616, -0.023353494703769684, -0.015603049658238888, 0.005613990593701601, 0.05111553519964218, -0.02235485427081585, -0.025986554101109505, 0.009550907649099827, 0.019490230828523636, 0.00724012590944767, -0.0016352052334696054, 0.012143071740865707, 0.02103673480451107, -0.00953464861959219, -0.03618163242936134, 0.015384632162749767, -0.011292234063148499, 0.017943283542990685, -0.025917716324329376, 0.02127181924879551, -0.02676658146083355, 0.009273132309317589, -0.018889183178544044, 0.01926407217979431, 0.0246219914406538, -0.004907393828034401, -0.01983683928847313, 0.021231746301054955, -0.0033689585980027914, -0.011587790213525295, -0.0825846865773201, 0.015574481338262558, -0.006047900766134262, -0.026276320219039917, 0.01826397515833378, 0.006601856090128422, 0.021142784506082535, 0.008319164626300335, 0.01089894212782383, -0.035005271434783936, 0.0003354668733663857, 0.02561628259718418, -0.015097608789801598, -0.024781184270977974, 0.013015863485634327, -0.05524958670139313, 0.026293346658349037, -0.02410956472158432, -0.03426988050341606, 0.029042188078165054, 0.0003588451654650271, 0.0006284788250923157, -0.004045679233968258, -0.01112219039350748, -0.001374667277559638, -0.014628454111516476, 0.03355111926794052, 0.023677898570895195, -0.034753479063510895, 0.00887521542608738, 0.05423279106616974, 0.037510622292757034, 0.027851471677422523, -0.012678317725658417, -0.06735516339540482, -0.020468728616833687, 0.002358426107093692, 0.04274429753422737, -0.026995213702321053, 0.0013762894086539745, 0.021631857380270958, -0.003202151507139206, 0.05077384039759636, 0.03191065415740013, -0.01349529530853033, -0.04175836965441704, 0.00750797288492322, -0.03684059530496597, -0.01207930501550436, 0.039858102798461914, -0.005784675478935242, -0.045890502631664276, -0.007670815102756023, -0.01904524676501751, -0.010026424191892147, -0.0003263940161559731, -0.01938413642346859, -0.02784254401922226, 0.029752124100923538, -0.051731180399656296, -0.009265216998755932, 0.03513171523809433, 0.022465351969003677, 0.041601162403821945, 0.001759807695634663, 0.02701178751885891, 0.016445724293589592, 0.5227997899055481, 0.03132687881588936, 0.026324167847633362, 0.02068282850086689, -0.005452713463455439, -0.004744421225041151, -0.058259591460227966, -0.01562958024442196, -0.04380205646157265, 0.03235064446926117, 0.00872054137289524, 0.043579403311014175, 0.029046444222331047, -0.024920910596847534, 0.0007605606806464493, -0.021900998428463936, -0.017712779343128204, -0.12246271222829819, -0.01145836990326643, -0.006484619807451963, 0.028364770114421844, -0.03449529781937599, -0.018325265496969223, -0.019376274198293686, 0.021924758329987526, -0.009872203692793846, 0.028080249205231667, 0.013415900990366936, 0.062498778104782104, -0.05340797081589699, -0.004005800001323223, -0.04520006477832794, -0.008580709807574749, 0.005856586620211601, -0.016005616635084152, -0.004282532259821892, 0.014539036899805069, 0.02085822820663452, 0.043785661458969116, 0.013677380047738552, -0.040216170251369476, 0.03707221522927284, 0.01446919608861208, 0.05159052833914757, -0.0021597545128315687, 0.11347007006406784, -0.0013401980977505445, -0.023136161267757416, -0.03591935336589813, 0.006534779444336891, 0.046190839260816574, -0.02464655227959156, -0.006844617892056704, 0.03350663557648659, 0.023543581366539, 0.06265909969806671, 0.0028432889375835657, -8.580148278269917e-05, -0.004256602376699448, 0.0313788577914238, 0.025648562237620354, -0.003941400442272425, -0.02275494672358036, -0.01248891931027174, 0.012138357385993004, 0.041810911148786545, 0.020746471360325813, -0.010049626231193542, 0.021673180162906647, -0.01188623532652855, 0.034074876457452774, 0.022021716460585594, -0.0399712398648262, 0.04551311582326889, 0.005339757539331913, 0.034303564578294754, -0.023698944598436356, 0.01780223660171032, -0.004163671284914017, -0.04117020219564438, -0.015284081920981407, -0.01356515847146511, 0.014417523518204689, -0.009426703676581383, 0.029483024030923843, 0.04544319212436676, 0.01919168420135975, -0.09643478691577911, 0.010055937804281712, 0.009528517723083496, -0.06143663823604584, -0.0748153105378151, 0.02407051809132099, 0.027309507131576538, 0.020372670143842697, 0.0226921234279871, 0.025631655007600784, -0.01770360767841339, 0.016384094953536987, 0.01738257147371769, 0.0047118570655584335, 0.009291504509747028, 0.05988151952624321, 0.06497792154550552, 0.006791621912270784, -0.022143028676509857, -0.030090652406215668, -0.01855473592877388, 0.02067888155579567, 0.008379623293876648, 0.021167611703276634, -0.03456636145710945, 0.07063309848308563, -0.03278357908129692, 0.054025162011384964, -0.02169189788401127, -0.029504824429750443, -0.017734302207827568, -0.01203332282602787, -0.01070831436663866, -0.0012728372821584344, 0.02086888626217842, -0.006912270560860634, 0.005421455949544907, -0.0005850991583429277, -0.04681694135069847, 0.03007456846535206, 0.0014756505843251944, 0.030354227870702744, -0.043840598315000534, -0.020019924268126488, 0.008031947538256645, 0.00790878664702177, -0.01287667267024517, -0.027642428874969482, 0.024407001212239265, 0.02969822660088539, -0.04719257727265358, 0.053395990282297134, -0.006507803685963154, -0.0030673881992697716, -0.011086225509643555, -0.008744019083678722, -0.012279792688786983, -0.009710564278066158, 0.036166638135910034, -0.007536657154560089, 0.026791585609316826, -0.042491983622312546, -0.019633738324046135, 0.027222733944654465, -0.0008411757298745215, 0.0002533466322347522, -0.0073923529125750065, -0.022976979613304138, -0.03449279069900513, -0.043482888489961624, 0.005592502187937498, 0.01991332694888115, 0.011892912909388542, 0.0010575674241408706, 0.0038265250623226166, 0.03460729494690895, -0.03620442748069763, 0.031897906213998795, 0.010054750367999077, -0.003854130394756794, 0.01985098607838154, -0.010316416621208191, -0.07913637906312943, 0.0052885860204696655, -0.014510845765471458, -0.030604051426053047, -0.027209531515836716, 0.04529355838894844, 0.06526952981948853, 0.015140795148909092, 0.0005161057342775166, 0.038817305117845535, -0.011654062196612358, -0.002180627081543207, -0.048891182988882065, 0.01870703138411045, 0.03734682872891426, 0.07203507423400879, -0.015120495110750198, -0.05519074201583862, -0.017234286293387413, 0.05196186527609825, -0.050165820866823196, -0.0034060298930853605, 0.03615344315767288, 0.06345420330762863, 0.040690094232559204, -0.04073847457766533, 0.026225928217172623, -0.05222254619002342, 0.01331678032875061, 0.009469930082559586, 0.012292101979255676], [0.03031017817556858, 0.003772064344957471, -0.01925901137292385, 0.016021892428398132, 0.018656492233276367, 0.01906748116016388, 0.009138047695159912, -0.10384673625230789, 0.008097794838249683, -0.012764150276780128, -0.002629209542647004, -0.029631856828927994, -0.0005294198053888977, -0.010203028097748756, -0.02353510633111, -0.001217370037920773, -0.052380505949258804, -0.012895128689706326, -0.015207689255475998, 0.011286127381026745, -0.0031798328272998333, -0.0326206237077713, -0.01433937344700098, 0.03505440056324005, 0.018878288567066193, -0.014718737453222275, 0.02435954660177231, 0.010592750273644924, 0.006366041023284197, -0.011766873300075531, -0.005748127121478319, -0.02469342015683651, 0.002005031332373619, -0.016186414286494255, -0.040734898298978806, 0.003674446837976575, -0.00037199098733253777, 0.0003329636820126325, 0.010019109584391117, -0.009837375953793526, 0.0011164043098688126, 0.013020896352827549, 0.002858115592971444, 0.016357621178030968, 0.027774248272180557, -0.00283757783472538, 0.02206784300506115, 0.0038688292261213064, 0.022538786754012108, -0.019281480461359024, 0.015875430777668953, 0.016159793362021446, -0.01889689266681671, -0.0066983927972614765, 0.03404176980257034, -0.009388389997184277, 0.009467605501413345, -0.028092842549085617, -0.005707880016416311, 0.009764657355844975, 0.004503472708165646, -0.004097378812730312, -0.03839082643389702, -0.01632123999297619, -0.03202224150300026, 0.01297234371304512, -0.02575189620256424, -0.008492843247950077, 0.013134824112057686, -0.008099472150206566, -0.012269151397049427, -0.04988400265574455, -0.002831502119079232, 0.029809370636940002, -0.026915453374385834, -0.01906720921397209, -0.001238022930920124, 0.002015950856730342, -0.021012691780924797, -0.004172201734036207, 0.030417244881391525, 0.0018862554570659995, 0.003440392203629017, 0.0002809988218359649, -0.02394227311015129, -0.014150856994092464, 0.024942215532064438, -0.03234626352787018, -0.04827762022614479, 0.014429883100092411, -0.02275073528289795, 0.024368859827518463, -0.1338188648223877, 0.03209424018859863, -0.005873536225408316, -0.0006299567758105695, -0.0012645634124055505, -0.014514627866446972, 0.010081607848405838, -0.021423842757940292, -0.03007981739938259, -0.011997468769550323, 0.03197193145751953, 0.020602772012352943, 0.023950202390551567, -0.012786639854311943, -0.010749035514891148, -0.020998463034629822, -0.0033172203693538904, 0.013253492303192616, 0.028241479769349098, 0.006425041705369949, 0.005481208208948374, -0.020252283662557602, 0.002796766348183155, 0.005371846724301577, -0.0007067007245495915, 0.02195177599787712, -0.004675078205764294, 0.0070988088846206665, -0.03463945537805557, -0.08457858860492706, -0.008519066497683525, -0.025224415585398674, -0.008936179801821709, 0.005841290112584829, -0.006937399040907621, 0.002655596937984228, 0.011674023233354092, -0.007740743923932314, 0.007385428063571453, -0.007403335999697447, -0.0033257959876209497, 0.6033134460449219, 0.022276341915130615, -0.009259791113436222, -0.007577573414891958, 0.0064185489900410175, 0.02690616436302662, -0.006733506452292204, 0.003412508172914386, -0.02538289502263069, -0.0027338615618646145, 0.0031638778746128082, -0.025113213807344437, 0.009718376211822033, -0.003696644678711891, 0.03079449199140072, -0.012814415618777275, 0.013803303241729736, 0.03092809021472931, 0.028743598610162735, 0.015710338950157166, -0.035926803946495056, -0.04153706133365631, 0.002597526181489229, 0.003989964257925749, -0.0119265615940094, 0.0024014802183955908, -0.0031910943798720837, 0.048586148768663406, -0.03165489062666893, -0.0016587685095146298, -0.013840069063007832, 0.00912699569016695, 0.010038544423878193, 0.0073748123832046986, 0.023831676691770554, -0.020645471289753914, -0.010554839856922626, 0.03612329438328743, -0.005672364495694637, 0.0009732737671583891, -0.0019155445042997599, 0.029561590403318405, 0.05135500431060791, -0.029990656301379204, 0.010907475836575031, -0.04402865469455719, -0.008811485953629017, 0.0019124742830172181, 0.021070603281259537, 0.00967821478843689, -0.008226676844060421, -0.008764900267124176, 0.037313077598810196, -0.010526169091463089, 0.030613675713539124, -0.009756824001669884, 0.006033033132553101, -0.011966465041041374, 0.009953517466783524, -0.012372217141091824, 0.025109943002462387, 0.008828788064420223, -0.000574419042095542, -0.018655771389603615, -0.013804194517433643, 0.014380195178091526, 0.024049192667007446, -0.04976560175418854, 0.025231966748833656, 0.006639933213591576, 0.016638854518532753, 0.0021467574406415224, -0.037179213017225266, 0.0007273247465491295, 0.02432619407773018, 0.0032530948519706726, 0.03668258711695671, 0.002616640878841281, 0.04077901318669319, -0.021002579480409622, 0.011417953297495842, 0.024194233119487762, -0.0033148336224257946, -0.008809120394289494, -0.007756021339446306, -0.027281034737825394, -0.0029106219299137592, -0.0035355279687792063, 0.018261775374412537, 0.00597873330116272, 0.00402927165850997, 0.0057289134711027145, 0.012457381002604961, 0.0003965076757594943, -0.038355398923158646, 0.013918092474341393, 0.016245625913143158, 0.03898319602012634, 0.01896345242857933, 0.002406959654763341, 0.004379018675535917, -0.014972804114222527, -0.023051297292113304, -0.0006045576301403344, 0.004852134734392166, -0.005957859568297863, -0.0002392019669059664, 0.03467458859086037, -0.005962852854281664, 0.03382980823516846, -0.02991565503180027, -0.007854009978473186, -0.0078211585059762, 0.001107633113861084, 0.01097781304270029, -0.0063378093764185905, 0.032942503690719604, -0.015371291898190975, -0.022632252424955368, 0.002174532739445567, 0.001611122745089233, 0.009482543915510178, -0.025067636743187904, 0.007097273133695126, -0.0459359735250473, -0.005304526537656784, 0.015698866918683052, -0.06190921738743782, -0.00011947964958380908, -0.01774481125175953, 0.026446659117937088, -0.0035635847598314285, 0.0017019533552229404, -0.0032884010579437017, -0.02990926429629326, 0.006852627266198397, -0.006040344946086407, 0.018473496660590172, 0.0042596543207764626, 0.0018536574207246304, -0.010870654135942459, -0.017601661384105682, 0.01260604988783598, -0.00451426487416029, 0.01077134720981121, -0.02709329128265381, 0.012248244136571884, 0.013321950100362301, 0.006227180361747742, 0.005303215701133013, -0.01773499697446823, -0.014293132349848747, 0.005421401001513004, -0.004972067195922136, -0.0032486794516444206, 0.004386891145259142, -0.013798646628856659, 0.03494562581181526, -0.014230780303478241, 0.025281984359025955, -0.0025685743894428015, -0.031835392117500305, -0.0029425891116261482, 0.01008155383169651, 0.04991317167878151, -0.03175535053014755, -0.03215315565466881, -0.017512457445263863, -0.053242430090904236, 0.007224107626825571, 0.018469806760549545, -0.010953172110021114, -0.06122879311442375, 0.01952657662332058, 0.04072542488574982, 0.008905299939215183, -0.006967355031520128, -0.00023512582993134856, -0.026601066812872887, 0.6030700206756592, -0.04751219227910042, -0.002767801284790039, 0.017200859263539314, -0.006087110843509436, 0.0016499515622854233, -0.02673514559864998, -0.058766528964042664, 0.011329932138323784, 0.04776838794350624, 0.0012944270856678486, 0.02169836312532425, -0.0024299577344208956, 0.0010368963703513145, 0.02783837728202343, 0.006308907177299261, -0.03651265799999237, -0.18319325149059296, 0.018000943586230278, -0.004616449121385813, -0.008238089270889759, 0.0024203050415962934, 0.01933569833636284, -0.0037900530733168125, -0.0016605419805273414, -0.019559480249881744, 0.003180677769705653, -0.025184478610754013, -0.0023948370944708586, -0.03619061037898064, 0.021625321358442307, -0.014113699086010456, 0.02107633277773857, -0.01694829948246479, -0.006577892228960991, 0.004541223403066397, -0.005149617325514555, 0.018420949578285217, 0.0016741291619837284, 0.0018841922283172607, -0.015156186185777187, 0.007037563249468803, -0.016230151057243347, -0.024630079045891762, 0.01688217744231224, 0.03128354623913765, 0.02151934988796711, 0.015278826467692852, -0.02944568358361721, -0.004244236275553703, -0.01681852713227272, -0.027254920452833176, 0.012483173981308937, 0.02172999270260334, 0.012694732286036015, 0.018853679299354553, 0.03499864414334297, -0.017972609028220177, 0.008247097954154015, 0.015587332658469677, 0.010118161328136921, 0.01650450937449932, -0.008939521387219429, -0.021828895434737206, -0.005029082763940096, -0.003841023426502943, 0.012267322279512882, -0.04526376724243164, 0.009192761033773422, -0.018650703132152557, -0.008746271952986717, 0.0072367810644209385, -0.022193044424057007, 0.00792016088962555, -0.02244798094034195, 0.023249948397278786, -0.005512881558388472, 0.022820577025413513, -0.01827750913798809, 0.006156323477625847, -0.019614893943071365, 0.013747034594416618, 0.019070398062467575, 0.007297032978385687, -0.024012532085180283, 0.001278209500014782, 0.000657521013636142, -0.04042152687907219, -0.012215755879878998, 0.045596953481435776, 0.0016542740631848574, -0.01918775402009487, 0.011005218140780926, -0.012462482787668705, -0.004437974188476801, 0.009125916287302971, -0.012187838554382324, -0.010800890624523163, 0.010756059549748898, -0.0028964935336261988, -0.012593462131917477, -0.0132194384932518, 0.008057422004640102, -0.02351078763604164, 0.017366817221045494, -0.05025062337517738, 0.008975686505436897, -0.0011617616983130574, -0.01363988034427166, 0.014182419516146183, -0.013709223829209805, -0.0060568321496248245, 0.004793649073690176, 0.0019597315695136786, 0.0007618284435011446, -0.0006197469774633646, 0.03448833152651787, -0.023110106587409973, -0.034667495638132095, -0.007537752389907837, -0.0016614508349448442, 0.012071373872458935, -0.017868641763925552, -0.005578906740993261, 0.03443489968776703, 0.014871196821331978, 0.0025937743484973907, -0.011503975838422775, -0.02605261467397213, 0.03208661079406738, -0.010943817906081676, 0.00326544139534235, 0.009768372401595116, -0.01855475641787052, 0.012355130165815353, -0.016352178528904915, -0.017621785402297974, 0.007926012389361858, 0.025725876912474632, -0.04225248470902443, 0.0028693489730358124, 0.01538810133934021, 0.0018533198162913322, -0.008155464194715023, -0.013953212648630142, -0.029505418613553047, -0.03852150961756706, -0.003965397831052542, -0.03174592927098274, -0.01879529282450676, -0.004027382470667362, 0.022573305293917656, -0.022148648276925087, -0.0005579032585956156, -0.01763378456234932, 0.015442680567502975, -0.054170265793800354, 0.012555111199617386, 0.006456234958022833, 0.020120831206440926, -0.002279622247442603, -0.017039315775036812, -0.0005402888054959476, -0.00895125512033701, -0.010815692134201527, -0.0016670820768922567, -0.01729024201631546, -0.020336061716079712, -0.010885326191782951, -0.061801787465810776, -0.0008533827494829893, 0.025971654802560806, -0.007952038198709488, -0.018886107951402664, -0.005250845104455948, 0.014241201803088188, -0.01842091977596283, 0.02006908319890499, 0.029321584850549698, 0.00826600007712841, 0.009085357189178467, -0.03256640583276749, 0.0030669039115309715, -0.026570366695523262, 0.023906707763671875, -0.013587875291705132, 0.005351357627660036, 0.001983310328796506, 0.012833653949201107, -0.017021894454956055, -0.004267803858965635, -0.0032208224292844534, 0.049077119678258896, 0.029634667560458183, 0.017398636788129807, 0.009475273080170155, -0.007412636186927557, -0.025646541267633438, 0.00852864421904087, -0.0078419866040349], [-0.016118476167321205, 0.03525414690375328, 0.030023183673620224, -0.012535737827420235, -0.013592477887868881, -0.018477579578757286, -0.029164927080273628, -0.06716088950634003, -0.023466145619750023, -0.0608450248837471, 0.03892980515956879, -0.052522651851177216, 0.06273166090250015, 0.05340185388922691, 0.0386057086288929, 0.003153979079797864, 0.030348455533385277, 0.04635295271873474, 0.0006761173717677593, 0.04573250189423561, 0.08070293068885803, -0.05984729900956154, 0.053431376814842224, 0.017821166664361954, 0.01492235902696848, 0.0004333130200393498, -0.009035860188305378, 0.019419563934206963, 0.0011468288721516728, 0.02026042528450489, 0.000437511334894225, -0.03925817832350731, -0.013792525045573711, 0.03565289452672005, -0.06472668051719666, -0.0006283044349402189, 0.0036237116437405348, -0.07189226150512695, 0.030118843540549278, -0.007928530685603619, -0.04107515513896942, 0.02067538909614086, -0.013322888873517513, -0.009904399514198303, 0.0031114749144762754, -0.0026399248745292425, -0.003174590179696679, 0.021715804934501648, 0.0142805902287364, -0.03455399349331856, 0.016365896910429, -0.038613539189100266, -0.005307645536959171, 0.057321492582559586, 0.025594932958483696, -0.01624998264014721, 0.02511945739388466, -0.025493185967206955, 4.3417061533546075e-05, -0.05350480228662491, -0.023207729682326317, -0.03872767090797424, -0.02635589987039566, -0.04333474114537239, 0.006785559467971325, -0.011483859270811081, -0.05649936944246292, -0.04651936516165733, 0.01588154397904873, -0.025316547602415085, -0.03445493057370186, -0.01551226619631052, -0.04535253718495369, 0.0542788989841938, -0.015410315245389938, 0.024118825793266296, -0.017165621742606163, 0.00802858266979456, 0.01945919170975685, 0.0038686534389853477, 0.045066725462675095, -0.014061007648706436, 0.007244354113936424, 0.03735731542110443, 5.73094621358905e-05, 0.005005256272852421, 0.03963949903845787, 0.0015335927018895745, -0.003377623623237014, 0.062002670019865036, -0.03133242204785347, 0.04285992309451103, -0.1263001412153244, 0.006806034594774246, 0.030798928812146187, 0.09201467037200928, -0.008116050623357296, 0.002348989713937044, -0.018606938421726227, -0.05013395845890045, -0.027163896709680557, -0.019037792459130287, -0.018820930272340775, 0.05880332365632057, 0.034679561853408813, -0.03019639290869236, 0.024776412174105644, -0.020577935501933098, -0.03870287165045738, 0.003237304510548711, -0.03152821213006973, -0.0004649482434615493, 0.011617034673690796, 0.012827510945498943, -0.007115793414413929, -0.0018824496073648334, -0.08724746853113174, -0.022542336955666542, 0.0038469366263598204, 0.00777969416230917, 0.015011179260909557, -0.056664854288101196, 0.001891700434498489, -0.002600576262921095, -0.004096915479749441, -0.01873360574245453, 0.0003733910562004894, 0.05558834224939346, 0.050856757909059525, 0.012054326944053173, -0.045252688229084015, -0.05832674726843834, -0.03574545681476593, 0.46622952818870544, 0.04375232756137848, 0.010977141559123993, 0.011635543778538704, 0.019589917734265327, 0.043860096484422684, -0.001685303752310574, -0.011686784215271473, -0.03684359788894653, -0.0650176852941513, 0.03734200447797775, -0.0017910139868035913, -0.029342858120799065, -0.04304971545934677, 0.002799003152176738, -0.014821202494204044, 0.017036709934473038, 0.008914908394217491, -0.020247874781489372, 0.022364836186170578, -0.003251002635806799, 0.0009533052798360586, 0.026047339662909508, 0.01949702762067318, 0.049032919108867645, 0.004926182795315981, 0.02042219787836075, 0.05741773545742035, -0.036013513803482056, 0.025394754484295845, -0.04833575338125229, -0.023614972829818726, -0.018786616623401642, -0.02756415493786335, -0.04448189213871956, -0.03477172181010246, 0.03339013084769249, -0.015363835729658604, -0.02811569906771183, 0.04770625755190849, 0.021029774099588394, 0.03147071227431297, 0.09319295734167099, 0.06999755650758743, -0.014453031122684479, 0.04128510132431984, -0.03612804785370827, -0.04419340193271637, -0.009333593770861626, 0.018223557621240616, -0.00857781246304512, -0.08785386383533478, -0.020994633436203003, -0.004498437512665987, 0.001039232243783772, 0.01701689139008522, -0.03886491805315018, 0.008572671562433243, 0.00524159986525774, 0.002047780202701688, 0.03640175238251686, 0.037109993398189545, -0.07623186707496643, -0.01015933696180582, 0.009964949451386929, -0.0327308289706707, -0.04471072927117348, 0.025909360498189926, -0.029491273686289787, 0.044092193245887756, 0.0367145836353302, 0.03440726548433304, -0.023636072874069214, 0.030885562300682068, -0.05186591297388077, 0.023484554141759872, 0.004092852119356394, 0.013380833901464939, 0.018981097266077995, -0.03862594813108444, 0.007432880345731974, 0.06438041478395462, 0.035232774913311005, 0.025228211656212807, 0.008738364093005657, -0.05950428172945976, 0.035635411739349365, -0.03571013733744621, 0.01458212360739708, -0.0144762322306633, 0.00235859677195549, -0.03164582699537277, 0.006897503510117531, 0.02640208788216114, 0.0250175129622221, 0.005776703357696533, 0.013375338166952133, 0.04122842848300934, 0.023395312950015068, 0.01622658595442772, 0.009159608744084835, 0.012581094168126583, -0.017072824761271477, 0.00913540180772543, 0.0781998559832573, 0.0285600908100605, 0.0017220416339114308, -0.05632787197828293, 0.049112893640995026, -0.02195623144507408, -0.02428084798157215, -0.0040430594235658646, -0.02223479375243187, 0.025887373834848404, 0.0670253112912178, 0.004468827974051237, -0.03817892447113991, -0.04893019050359726, 0.0020335144363343716, -0.005185242742300034, 0.02404254488646984, -0.027849672362208366, -0.003037403803318739, 0.03325731307268143, 0.0508219413459301, 0.010838701389729977, 0.05491700768470764, -0.012518711388111115, 0.018944082781672478, 0.003463809145614505, -0.038613058626651764, -0.011719499714672565, -0.014551862142980099, -0.03385321423411369, -0.09895329922437668, 0.027129797264933586, -0.011420179158449173, -0.03133784607052803, 0.10121776163578033, -0.015570075251162052, -0.0005761964130215347, 0.02995767816901207, 0.0579550638794899, -0.013704630546271801, 0.03187679871916771, 0.02715368941426277, -0.067116379737854, -0.050668541342020035, 0.03749101981520653, -0.009692398831248283, -0.03624672442674637, 0.01648051291704178, -0.023247037082910538, -0.036427974700927734, 0.024152971804142, 0.002376578515395522, 0.019971124827861786, -0.023374665528535843, -0.015695156529545784, -0.014729078859090805, -0.060204051434993744, 0.04586914926767349, -0.0295425895601511, 0.014250174164772034, 0.06793253868818283, -0.04055492579936981, -0.024042747914791107, 0.0189135130494833, -0.023448258638381958, 0.0015218821354210377, -0.03552394360303879, 0.010325176641345024, -0.007448164280503988, 0.0330871120095253, -0.0017051525646820664, -0.02026754431426525, -0.046777114272117615, 0.04858855903148651, -0.012861612252891064, 0.46476849913597107, -0.04406032711267471, -0.04198991134762764, -0.012833897955715656, -0.0012725215638056397, -0.0038558763917535543, -0.0065175797790288925, -0.042254287749528885, -0.010897914879024029, 0.05693164840340614, 0.01086596678942442, -0.0198401790112257, 0.012839704751968384, 0.009213793091475964, -0.008687982335686684, 0.004068995825946331, -0.06503339111804962, -0.13420966267585754, 0.02321995235979557, -0.04514085128903389, 0.03148326277732849, -0.00618134718388319, -0.01303158514201641, 0.033904921263456345, 0.023357583209872246, -0.01801125891506672, -0.015320772305130959, 0.01710420288145542, 0.0663241297006607, -0.02883569709956646, -0.011955645866692066, 0.029136138036847115, -0.056841425597667694, -0.014904113486409187, -0.05602693930268288, 0.017799530178308487, -0.019846143200993538, 0.032423701137304306, -0.02027987875044346, -0.012755315750837326, 0.014014370739459991, 0.021424664184451103, -0.036549896001815796, 0.014921351335942745, 0.015289908275008202, -0.02319781668484211, -0.023570401594042778, 4.6293669583974406e-05, -0.020400509238243103, 0.00378371961414814, 0.012042660266160965, 0.05310080945491791, 0.0005096003296785057, 0.04763529822230339, -0.016468022018671036, 0.0236540324985981, -0.022227676585316658, -0.0045745763927698135, 0.017229529097676277, 0.012594801373779774, -0.006504995282739401, -0.038657691329717636, -0.002736319089308381, -0.013856245204806328, 0.021706413477659225, 0.022054346278309822, 0.0054890806786715984, -0.027167463675141335, 0.03344027325510979, -0.04621878266334534, -0.011954190209507942, 0.05978483334183693, 0.0014211887028068304, 0.0029883161187171936, -0.0153061393648386, 0.047941576689481735, -0.02744784764945507, 0.02454964630305767, -0.025118039920926094, -0.014070019125938416, -0.006772700231522322, -0.0054458994418382645, 0.05435870960354805, 0.019730502739548683, -0.00353748700581491, 0.004874334204941988, -0.02636466547846794, -0.0248678307980299, -0.019527345895767212, -0.005181924905627966, 0.021253038197755814, -0.025810029357671738, -0.05394763499498367, -0.030379239469766617, 0.03731131553649902, -0.02980314940214157, -0.03585134819149971, 0.04751079902052879, 0.03700133040547371, 0.029705224558711052, -0.007161816582083702, 0.030940541997551918, -0.021204767748713493, 0.0038957332726567984, 0.015421618707478046, 0.020732205361127853, 0.012829640880227089, -0.026687024161219597, 0.09665924310684204, -0.0073928325437009335, 0.02469080686569214, -0.0210860688239336, -0.01577470824122429, -0.006551211699843407, 0.0238595400005579, 0.00020845509425271302, 0.015782857313752174, 0.012560347095131874, -0.02612830325961113, -0.013376881368458271, 0.010323773138225079, -0.0315667949616909, -0.044810011982917786, 0.011149092577397823, -0.02140761725604534, 0.05838964134454727, -0.044604767113924026, 0.018658874556422234, 0.0071725365705788136, -0.031521160155534744, 0.007259842474013567, 0.06130126118659973, 0.011143524199724197, 0.0018257183255627751, -0.008707058615982533, 0.007136696018278599, 0.004847605712711811, -0.010375610552728176, -0.041393011808395386, 0.02203412726521492, -0.028752615675330162, -0.020311705768108368, -0.0004856020968873054, 0.0017110614571720362, 0.03754043951630592, -0.04783855006098747, -0.031409695744514465, -0.01844971999526024, -0.0242890864610672, -0.030842142179608345, 0.016220977529883385, 0.0017443689284846187, 0.038401294499635696, 0.04462083429098129, -0.009766570292413235, -0.026112712919712067, -0.06548815965652466, -0.012029009871184826, 0.013300655409693718, -0.0007520035142078996, -0.014705251902341843, -0.025087730959057808, -0.021365929394960403, -0.04295801371335983, 0.04547141119837761, 0.02773354761302471, 0.018095480278134346, 0.006353707984089851, -0.00241548172198236, -0.04969313368201256, 0.047813527286052704, -0.023604227229952812, -0.025023316964507103, -0.055725160986185074, -0.021841613575816154, 0.009655971080064774, 0.007655453402549028, 0.01504610013216734, -0.008652467280626297, -0.0022194974590092897, -0.028209656476974487, -0.020251281559467316, 0.04454166069626808, -0.034854378551244736, -0.022140977904200554, -0.00851311907172203, 0.01758282259106636, -0.03456619754433632, 0.02411358617246151, 0.0052682277746498585, 0.010283255018293858, -0.027404729276895523, 0.12191605567932129, -0.015876388177275658, 0.0010830826358869672, 3.8251342630246654e-05, -0.004546088632196188, 0.0002007520670304075, 0.05072282254695892, 0.009762818925082684], [0.013040420599281788, -0.00894211046397686, 0.026292523369193077, 0.003715941682457924, 0.006277810782194138, -0.007450217846781015, -0.021593937650322914, -0.0362769290804863, 0.03543732315301895, -0.002025255234912038, 0.005628637969493866, -0.02647302858531475, 0.0006302876281552017, -0.01386018842458725, 0.019685374572873116, -0.003333643078804016, -0.023688847199082375, -0.02729947678744793, -0.056557752192020416, 0.011062552221119404, 0.0060674273408949375, -0.02616601437330246, 0.013463414274156094, 0.039730191230773926, 0.019791608676314354, -0.02057267166674137, 0.028912696987390518, 0.014579040929675102, 0.010591799393296242, -0.04775562137365341, -0.023178353905677795, 0.02078949846327305, 0.042090386152267456, -0.0005400040536187589, -0.021702030673623085, -0.03297305107116699, -0.045823872089385986, -0.03911866620182991, -0.010700666345655918, -0.01920968107879162, 0.02009686455130577, 0.02181893214583397, -0.007172240410000086, -0.0031245097052305937, 0.008354496210813522, 0.0005325533566065133, -0.015348267741501331, -0.03647374361753464, -0.014520861208438873, 0.020344318822026253, -0.00941123440861702, -0.02491665817797184, -0.03929893672466278, -0.04819481819868088, 0.026543905958533287, 0.04212798923254013, 0.008184543810784817, -0.02018124610185623, -0.002988839754834771, 0.003412860445678234, 0.015897616744041443, 0.0037469046656042337, 0.005509970244020224, -0.03011104092001915, 0.034772541373968124, -0.019585466012358665, -0.023169051855802536, -0.0396529957652092, 0.015051567927002907, -0.017966357991099358, -0.002061910228803754, -0.02431276999413967, -0.0032238003332167864, 0.028010400012135506, -0.027999890968203545, 0.04833967238664627, 0.0036214387509971857, -0.0067162103950977325, -0.018308427184820175, -0.012861284427344799, 0.04697756469249725, 0.016850195825099945, -0.006626426242291927, 0.07307395339012146, -0.0023923537228256464, 0.007947870530188084, 0.05130768194794655, -0.012143866159021854, -0.04327036067843437, 0.02467217482626438, 0.007994978688657284, 0.03054869920015335, -0.09722352027893066, 0.04519173502922058, -0.006235778797417879, -0.015732018277049065, 0.055560749024152756, -0.0006253089522942901, 0.0032235223334282637, -0.06808524578809738, 0.009151928126811981, -0.022914115339517593, 0.01884232833981514, 0.01773509941995144, 0.010472715832293034, -0.017960036173462868, -0.029430635273456573, -0.016343094408512115, 0.012132823467254639, -0.016397040337324142, -0.034044165164232254, 0.0016391209792345762, 0.019742326810956, 0.012202024459838867, -0.05364321172237396, -0.02209409512579441, -0.023330647498369217, 0.03189085051417351, -0.039214957505464554, -0.03556102514266968, -0.06712622940540314, 0.02507990598678589, 0.010683178901672363, -0.015443230979144573, 0.021996725350618362, -0.031617023050785065, -0.013926289975643158, 0.003018730552867055, -0.021445592865347862, 0.0010755980620160699, -0.0004852635902352631, -0.00824220385402441, 0.016964714974164963, 0.5328371524810791, 0.05022958293557167, -0.04839461296796799, 0.022172056138515472, 0.027774006128311157, -0.033242881298065186, 0.0398092195391655, -0.06976941227912903, -0.029295820742845535, 0.0024811718612909317, 0.06276796013116837, -0.055283449590206146, 0.014318701811134815, -0.007341079413890839, 0.039004627615213394, -0.01023054774850607, -0.007116563618183136, 0.046750377863645554, -0.008130539208650589, 0.0537201426923275, -0.009087866172194481, 0.03187644109129906, -0.023783650249242783, -0.031012585386633873, 0.002592670265585184, -9.372911881655455e-05, 0.014875131659209728, 0.015191965736448765, -0.015978844836354256, -0.003088122932240367, -0.048265017569065094, 0.024976443499326706, 0.015066915191709995, 0.050487689673900604, -0.006999818608164787, -0.029358699917793274, 0.01794193685054779, -0.0051066200248897076, -0.005054342560470104, -0.010239744558930397, -0.01789955422282219, 0.021148433908820152, 0.02655920386314392, 0.02225572057068348, -0.06190655380487442, -0.015459687449038029, -0.03162379190325737, 0.005053404252976179, -0.015691688284277916, 0.0006894526886753738, -0.0034111880231648684, -0.032344575971364975, 0.02448558621108532, -0.0412173718214035, -0.04283226281404495, -0.02768610790371895, -0.029740922152996063, -0.030456354841589928, -0.00728527782484889, -0.025385739281773567, -0.01779031939804554, -0.0016328277997672558, -0.010755687952041626, -0.014713902957737446, 0.014948268420994282, -0.014143779873847961, -0.011077414266765118, 0.006154373753815889, 0.004698753356933594, 0.014602591283619404, -0.01595327816903591, -0.005532861687242985, 0.0408354215323925, 0.01385110430419445, 0.04800708219408989, 0.030776172876358032, -0.00023692150716669858, 0.003865725127980113, 0.08995991945266724, 0.01424238458275795, -0.013152076862752438, -0.01725212298333645, -0.006426556035876274, -0.021393101662397385, 0.005702534690499306, 0.019585052505135536, -0.002314569428563118, 0.011631802655756474, -0.07351666688919067, 0.037953756749629974, 0.05523473024368286, -0.0031008184887468815, 0.012529641389846802, 0.016978630796074867, 0.018115952610969543, -0.020204603672027588, 0.01384587399661541, 0.046615708619356155, 0.044003333896398544, -0.01508465874940157, -0.013799091801047325, 0.0017463016556575894, -0.030835047364234924, 0.06465823203325272, -0.003986529540270567, 0.029217742383480072, -0.010881712660193443, 0.023111436516046524, 0.02105637826025486, 0.023199820891022682, -0.009540789760649204, -0.010790431872010231, -0.01980530470609665, 0.013043470680713654, 0.025919049978256226, -0.01777999848127365, -0.008075372315943241, 0.004094244446605444, 0.006561603397130966, 0.003566985484212637, -0.017045730724930763, -0.029178112745285034, -0.03411838039755821, 0.05773971602320671, 0.015709269791841507, -0.0023845545947551727, -0.030404767021536827, -0.04487460106611252, -0.01409180462360382, -0.04428263381123543, 0.03418665751814842, 0.061424195766448975, 0.013850687071681023, -0.010200941003859043, 0.011566974222660065, -0.012564790435135365, 0.03631443902850151, -0.02857353538274765, 0.021931564435362816, -0.021471673622727394, -0.04595328867435455, -0.0014892627950757742, 0.01898336224257946, 0.02821497991681099, 0.0014511214103549719, 0.012941036373376846, -0.018802301958203316, 0.01740996167063713, 0.0333748422563076, -0.03019014373421669, 0.011894701980054379, -0.05483539402484894, -0.01693672314286232, -0.004866957198828459, 0.051380790770053864, 0.0129797188565135, -0.02572743222117424, 0.00987662747502327, 0.027110420167446136, -0.0350852832198143, -0.02858896367251873, 0.00848806370049715, -0.049327507615089417, -0.011307275854051113, 0.010468872264027596, -0.027621246874332428, -0.03231022134423256, 0.006853804923593998, -0.021032707765698433, 0.009668847545981407, 0.028677988797426224, -0.028214123100042343, -0.07544815540313721, 0.012696384452283382, 0.01421381626278162, -0.03580331802368164, -0.03867179900407791, 0.033270400017499924, 0.01041555404663086, 0.5332968235015869, -0.048968952149152756, -0.022937269881367683, 0.0004498873313423246, -0.006035167258232832, -0.005637164227664471, -0.020693989470601082, -0.10341805964708328, -0.026613906025886536, 0.06819343566894531, 0.020573535934090614, 0.04938734695315361, 0.024404561147093773, 0.014852792955935001, 0.009133943356573582, -0.018326420336961746, -0.012316393665969372, -0.08333174884319305, 0.00035492127062752843, -0.022403964772820473, -0.031713034957647324, -0.030854061245918274, 2.68817093456164e-05, -0.028995925560593605, 0.010634979233145714, 0.008400077931582928, 0.06620575487613678, 0.03457202762365341, -0.053923286497592926, -0.014708010479807854, -0.006527520250529051, 0.024519504979252815, 0.009307336993515491, -0.02131301537156105, 0.025308877229690552, 0.0004007700481452048, -0.004462966695427895, 0.02598273940384388, -0.0058334884233772755, -0.001268085092306137, -0.01885555498301983, 0.005539348814636469, 0.013045547530055046, -0.05144296959042549, 0.015583662316203117, 0.007240846287459135, -0.005956033710390329, -0.02111188881099224, -0.03154385834932327, -0.022429946810007095, 0.03144962340593338, 0.012544953264296055, 0.021557791158556938, 0.02785472385585308, -0.0024922722950577736, 0.056822121143341064, -0.01951712556183338, -0.0009086495265364647, -0.0073135020211339, -0.010397636331617832, 0.05557175353169441, -0.023506801575422287, 0.020083116367459297, -0.056982509791851044, -0.006305252201855183, -0.021910663694143295, -0.032622627913951874, -0.029382534325122833, -0.04684341698884964, -0.012617243453860283, 0.027638429775834084, 0.0138862868770957, 0.012267556972801685, 0.04911418259143829, -0.010961854830384254, -0.007722540758550167, 0.04104230925440788, 0.025793034583330154, -0.03159213438630104, 0.009984513744711876, 0.017221152782440186, 0.01812029629945755, 0.011627835221588612, -0.017689699307084084, 0.0004060888313688338, 0.016028638929128647, -0.03231409564614296, 0.04302690178155899, -0.0007529432186856866, -0.004014038480818272, 0.0013167037395760417, -0.03578190878033638, -0.012448206543922424, 0.037754207849502563, -0.0007396828150376678, -0.026823731139302254, -0.024081973358988762, -0.0077987066470086575, 0.056351806968450546, 0.012416990473866463, 0.009113496169447899, -0.017428431659936905, 0.03459795564413071, 0.007581021636724472, -0.033192068338394165, -0.03258974850177765, 0.020453721284866333, 0.03509867191314697, 0.03175351396203041, -0.005730434320867062, -0.0321245938539505, -0.0827910304069519, 0.06772317737340927, -0.015382311306893826, -0.006790716666728258, 0.02541343681514263, -0.05044237896800041, 0.015140093863010406, -0.010001325979828835, -0.008856451138854027, 0.003701302455738187, 0.02285422757267952, -0.063135527074337, -0.01816830039024353, 0.037998516112565994, -0.0190683975815773, -0.007836132310330868, 0.0006990356487222016, -0.001168513554148376, 0.06400838494300842, 0.01600850559771061, 0.006624859292060137, -0.030216345563530922, -0.013935762457549572, -0.0392833948135376, -0.02373402938246727, -0.017727207392454147, -0.023110855370759964, 0.03219439834356308, -0.037322189658880234, 0.0032846666872501373, 0.0028122272342443466, 0.01388214249163866, -0.012601098045706749, -0.023408031091094017, -0.03610959276556969, -0.03906716778874397, 0.004217039328068495, 0.0015974933048710227, 0.0155791612342, 0.018704257905483246, 0.020325638353824615, 0.004189294297248125, 0.01608756184577942, 0.05336036905646324, 0.03372928872704506, -0.019342998042702675, -0.002343131694942713, -0.018858259543776512, 0.02387215569615364, -0.020409250631928444, 0.014176215045154095, 0.016300957649946213, -0.03746277838945389, -0.028154321014881134, 0.0466395802795887, 0.020232845097780228, 0.01008191704750061, -0.003565944964066148, -0.022117221727967262, 0.011922018602490425, -0.0040704417042434216, -0.033461712300777435, -0.06632939726114273, -0.001841590623371303, 0.001982341054826975, -0.02184685319662094, 0.026055218651890755, 0.04344284534454346, 0.011626813560724258, -0.0037696415092796087, 0.05531943589448929, 0.04860570281744003, 0.016503721475601196, 0.024022819474339485, 0.05384412035346031, 0.008572762832045555, -0.004483712371438742, -0.00922626443207264, -0.05103300139307976, 0.035079292953014374, -0.026243528351187706, 0.08585371822118759, 0.053787194192409515, -0.018739301711320877, 0.036117080599069595, -0.025712117552757263, -0.020930195227265358, 0.024972377344965935, 0.004427390173077583], [0.027300873771309853, 0.005753474310040474, 0.016366021707654, 0.016107376664876938, 0.0020866324193775654, -0.007116836495697498, -0.0015652356669306755, -0.10640285909175873, 0.04797656461596489, 0.019690286368131638, 0.02436782792210579, -0.028132660314440727, 0.016706490889191628, 0.0034672501496970654, -0.01221761666238308, -0.010202448815107346, -0.02679206058382988, 0.007058858871459961, -0.029018158093094826, 0.04632405564188957, 0.0005615152767859399, -0.01649481989443302, 0.04057314991950989, 0.049789391458034515, 0.027949513867497444, -0.03095272183418274, 0.015792110934853554, 0.011050865054130554, 0.0061834328807890415, -0.02513120137155056, 0.012229149229824543, -0.018116818740963936, 0.007053344044834375, -0.012119767256081104, -0.0810445100069046, 0.03267557919025421, 0.013158248737454414, -0.0097313541918993, -0.002174561144784093, -0.015031960792839527, 0.013622170314192772, 0.008793468587100506, 0.008588062599301338, 0.03754635155200958, 0.0014493759954348207, -0.019699865952134132, 0.009592035785317421, 0.002113883150741458, 0.0390588603913784, -0.025216128677129745, 0.03314250335097313, 0.03050824999809265, -0.007079915143549442, 0.04023800045251846, 0.012241464108228683, -0.016391409561038017, -0.02561894804239273, 0.005585060454905033, -0.0245595071464777, -0.0015272897435352206, -0.0017855813493952155, -0.023287340998649597, -0.01570195145905018, -0.026394741609692574, 0.01063281949609518, -0.0025744831655174494, -0.007315638940781355, -0.020554212853312492, 0.015728091821074486, 0.03282925859093666, 0.02497103624045849, -0.024952640756964684, 0.0025453753769397736, -0.030010787770152092, 0.006101483013480902, -0.02129623107612133, 0.018026202917099, -0.008326945826411247, -0.000975721690338105, 0.018673107028007507, 0.04809616133570671, -0.012755188159644604, 0.004771644715219736, -0.005184173583984375, -0.021407030522823334, -0.015731755644083023, 0.0008520859992131591, 0.0052251433953642845, -0.02438606694340706, 0.014147712849080563, 0.011748861521482468, 0.00332842068746686, -0.12318044155836105, 0.04108092561364174, 0.028286512941122055, -0.0025018425658345222, 0.02547573857009411, -0.0014422492822632194, 0.039612818509340286, -0.012877428904175758, 0.01265651360154152, -0.0018058870919048786, -0.009885823354125023, 0.004064810462296009, 0.02968737669289112, -0.010700035840272903, -0.003535922383889556, -0.04817190021276474, 0.008480280637741089, 0.00979270227253437, -0.006010776851326227, -0.010603283531963825, 0.0054296157322824, 0.012802439741790295, -0.012595823965966702, -0.019291553646326065, 0.013678736984729767, 0.018388696014881134, -0.005443690810352564, 0.0010097051272168756, -0.024616437032818794, -0.07672206312417984, 0.010449022985994816, -0.013864845037460327, 0.008813965134322643, -0.00843750685453415, 0.004471906926482916, 0.026876505464315414, 0.013090445660054684, 0.036076538264751434, 0.013674605637788773, -0.0290130116045475, -0.018224820494651794, 0.5710437893867493, 0.018811674788594246, -0.0019053611904382706, 0.013297485187649727, -0.0004774911212734878, 0.04550329968333244, -0.0046614897437393665, 0.03299148380756378, -0.005207020323723555, -0.003944035619497299, -0.004832540173083544, 0.006728133652359247, -0.006030392367392778, 0.015000512823462486, -0.006854366976767778, -0.009085578843951225, 0.010251149535179138, -0.0027415058575570583, -0.012127197347581387, 0.011394534260034561, -0.010263288393616676, -0.014593706466257572, 0.017241019755601883, -0.00855525117367506, 0.011771955527365208, 0.002941716695204377, 0.015313026495277882, 0.06263888627290726, -0.013762498274445534, 0.015756184235215187, -0.008135468699038029, -0.022858818992972374, 0.002721440279856324, 0.016389034688472748, 0.041332393884658813, -0.024440959095954895, 0.005853971000760794, 0.026965947821736336, -0.005141803063452244, -0.0009992837440222502, 0.005176398903131485, 0.01652856543660164, 0.013234966434538364, -0.011078854091465473, -0.020689355209469795, -0.033732473850250244, -0.010739673860371113, -0.04615406692028046, 0.000748671474866569, 0.00043150701094418764, 0.002703502308577299, -0.02509436011314392, 0.016722094267606735, 0.017742671072483063, 0.0064240447245538235, -0.01686975359916687, 0.0004883469664491713, -0.024540098384022713, 0.06064113602042198, -0.0026075670029968023, -0.011151856742799282, -0.033418942242860794, 0.011597638949751854, -0.042010195553302765, -0.0031383540481328964, -0.011735604144632816, 0.028888702392578125, -0.011839840561151505, 0.0012203734368085861, 0.011905218474566936, 0.007669895421713591, 0.030236929655075073, 0.008966067805886269, 0.016641084104776382, 0.018791059032082558, 0.034168776124715805, 0.051711555570364, -0.024119529873132706, 0.05127768963575363, 0.0035232382360845804, 0.009977368637919426, -0.03340575471520424, 0.010089392773807049, -0.012589575722813606, -0.005758968181908131, -0.009870718233287334, -0.003765700152143836, -0.012325653806328773, 0.008892948739230633, 0.005127841606736183, 0.038621485233306885, -0.02715180814266205, 0.029569530859589577, -0.004766964353621006, -0.06349552422761917, 0.005072455853223801, 0.013084239326417446, 0.037864137440919876, -0.0033301820512861013, -0.023480424657464027, 0.013685557059943676, 0.0370488241314888, -0.016664769500494003, -0.004307041876018047, 0.035745806992053986, 0.018171628937125206, 0.035256724804639816, -0.004155254457145929, -0.021057579666376114, 0.01158246211707592, 0.0039266059175133705, -0.010807373560965061, -0.03507295995950699, 0.03370008245110512, 0.008547378703951836, -0.024961693212389946, 0.022217225283384323, -0.014271569438278675, 0.04252849519252777, 0.014807512052357197, 0.03173074871301651, -0.02516164816915989, 0.0002035806974163279, -0.04865686222910881, -0.019905919209122658, -0.004357464611530304, 0.005489866249263287, -0.04256596788764, 0.030753416940569878, -0.02486853487789631, -0.03752008453011513, -0.03270106390118599, -0.002457740716636181, -0.011954359710216522, -0.019886037334799767, 0.02351643703877926, 0.02168109640479088, 0.009222069755196571, 0.004848811309784651, -0.0005550986970774829, -0.02625495009124279, 0.008174970746040344, 0.013901536352932453, 0.0216838289052248, -0.004663333296775818, 0.009176530875265598, -0.004982782527804375, -0.023450367152690887, -0.017981236800551414, 0.03122386708855629, 0.0032772356644272804, -0.01776224933564663, -0.01860618218779564, -0.02498576231300831, 0.0303789135068655, 0.010558465495705605, -0.0531044565141201, -0.015238087624311447, -0.0173761248588562, -0.021924519911408424, 0.007326819002628326, 0.035791363567113876, -0.01408730074763298, 0.007436086889356375, -0.013102277182042599, -0.0010849250247702003, -0.003606304293498397, 0.0010412416886538267, -0.0018565369537100196, 0.008142126724123955, 0.011506076902151108, -0.02849731221795082, -0.032805513590574265, 0.002175315748900175, 0.04393366351723671, 0.010225821286439896, -0.013252083212137222, 0.007295494433492422, -0.022012101486325264, 0.5703805685043335, -0.023938948288559914, 0.020502232015132904, -0.022525792941451073, -0.026442790403962135, -0.00026765145594254136, -0.013239088468253613, -0.041247859597206116, -0.0028777464758604765, 0.018044650554656982, -0.012932179495692253, 0.029783237725496292, -0.007816947065293789, -0.008801337331533432, 0.003650443395599723, 0.012567223981022835, -0.03419860079884529, -0.1654411405324936, -0.012713446281850338, -0.0034593939781188965, -0.008821419440209866, -0.029874589294195175, 0.058012478053569794, -0.03525478392839432, 0.014416682533919811, -0.023636039346456528, -0.00913316011428833, -0.030203578993678093, 0.01932498626410961, -0.02291179448366165, -0.022884247824549675, -0.026534080505371094, 0.017739539965987206, -0.00930221937596798, -0.004171912558376789, 0.02180798351764679, -0.0047842152416706085, 0.024279383942484856, 0.05577089264988899, -0.017438631504774094, -0.0018698094645515084, 0.006250833626836538, -0.006026583723723888, -0.005469766445457935, 0.0013801667373627424, 0.05571877956390381, 0.00028895726427435875, -0.01073678769171238, -0.007101190742105246, 0.01770888641476631, -0.0065619866363704205, -0.021671589463949203, -0.010333243757486343, 0.05472331494092941, -0.003928002901375294, 0.047011811286211014, 0.002321997657418251, 0.035029660910367966, -0.004897499457001686, -0.02939439006149769, 0.01569237932562828, 0.04575662687420845, -0.024004854261875153, 0.011937885545194149, 0.030705787241458893, 0.01129768043756485, 0.004615704528987408, -0.019749142229557037, -0.01823771931231022, 0.007431140635162592, 0.005952625535428524, 0.007425888907164335, -0.00040549098048359156, 0.03515953943133354, -0.020578019320964813, 0.047985535115003586, 0.005300847813487053, 0.029453787952661514, -0.03708969056606293, -0.0026912433095276356, -0.018661994487047195, 0.04294590651988983, 0.04135861620306969, 0.011034438386559486, -0.04200749471783638, -0.016379140317440033, 0.024034958332777023, -0.1128721684217453, 0.030223781242966652, 0.04226674139499664, 0.029269101098179817, -0.050812993198633194, -0.003293586429208517, 0.016659049317240715, 0.0032923324033617973, 0.009479762986302376, 0.01943157985806465, 0.013529006391763687, -0.005062815733253956, 0.007727895397692919, -0.009812134318053722, -0.003343436401337385, -0.004626359324902296, 0.00843752920627594, 0.014287980273365974, -0.024438507854938507, 0.012497023679316044, 0.017357124015688896, 0.0033405344001948833, 0.025987664237618446, 0.025185221806168556, 0.008532376028597355, -0.021463584154844284, -0.03650325909256935, 0.041514620184898376, 0.0028481250628829002, 0.016038378700613976, 0.009896354749798775, -0.039434295147657394, -0.02240990474820137, 0.03485363349318504, 0.011775798164308071, -0.012688793241977692, -0.034993287175893784, 0.01987912319600582, -0.010189540684223175, 0.002773898420855403, -0.00768314627930522, -0.01091709453612566, -0.014880790375173092, -0.02970099076628685, -0.015786275267601013, -0.004251421894878149, -0.018536731600761414, 0.003020321950316429, 0.024207105860114098, 0.009572026319801807, 0.004537790548056364, 0.015607607550919056, 7.413231651298702e-05, 0.003401823341846466, -0.0008978367550298572, 0.014846243895590305, 0.001048538601025939, -0.014061792753636837, 0.0017712160479277372, -0.0375223271548748, -0.028582090511918068, -0.042567409574985504, -0.026150817051529884, 0.0002765297540463507, 0.005897443741559982, 0.00019537543994374573, 0.032799504697322845, -0.06291738152503967, -0.035481490194797516, -0.04276695102453232, -0.010497690178453922, 0.03793304041028023, 0.03362535685300827, -0.003514449344947934, -0.007069690618664026, 0.01912878081202507, -0.0006346026784740388, 0.02695811353623867, 0.0025256562512367964, 0.008403842337429523, -0.034231964498758316, -0.015625350177288055, -0.07327952235937119, 0.02722042053937912, 0.013571728952229023, 0.010842898860573769, -0.010809529572725296, 0.005654549226164818, 0.054771795868873596, -0.03657945245504379, -0.001745251240208745, 0.04274848476052284, 0.021183332428336143, -0.00023093074560165405, -0.07427909225225449, 0.026316087692975998, -0.026602962985634804, 0.0003484297776594758, -0.02042623981833458, -0.01762203685939312, 0.010884266346693039, 0.047154318541288376, -0.010972301475703716, -0.011158192530274391, 0.018090229481458664, 0.07727902382612228, 0.026412444189190865, 0.010182015597820282, -0.028245531022548676, 0.015751419588923454, -0.045132335275411606, 0.021739399060606956, -0.031586479395627975], [0.03347896784543991, -0.029303891584277153, -0.0371248833835125, 0.007216338999569416, -0.0018783558625727892, -0.09042258560657501, 0.013774752616882324, -0.013722271658480167, 0.00484932167455554, 0.016982650384306908, -0.009409673511981964, 0.03753095865249634, -0.000523553928360343, 0.0402117557823658, 0.012903301976621151, 0.011819902807474136, -0.0028227076400071383, 0.03934255242347717, 0.05047040805220604, 0.07606534659862518, -0.002091849222779274, -0.04787537455558777, 0.00722488621249795, 0.0022484571672976017, 0.1228267252445221, -0.02103901468217373, 0.011417333036661148, 0.01588493213057518, 0.007559448014944792, -0.01983450911939144, 0.004627678077667952, 0.01024018693715334, 0.02514703758060932, 0.026096796616911888, -0.07929249107837677, 0.006069712806493044, -0.02917441911995411, -0.03430214896798134, -0.01264896709471941, 0.032834239304065704, 0.04380635917186737, -0.011033276095986366, -0.030034465715289116, 0.039532847702503204, -0.0047770896926522255, -0.02867225930094719, 0.01763847842812538, 0.015578710474073887, 0.01865457557141781, -0.034491170197725296, 0.026436666026711464, 0.012289348989725113, -0.0027854423969984055, -0.0001521459489595145, 0.034275855869054794, 0.019747721031308174, 0.03203916922211647, 0.021931873634457588, 0.0028855560813099146, -0.02098594792187214, -0.016183242201805115, -0.029687780886888504, 0.014613736420869827, -0.030425459146499634, -0.00924990326166153, 0.009742901660501957, -0.025692839175462723, -0.018521320074796677, -0.04104159399867058, 0.02562985010445118, 0.02451007068157196, -0.05578506365418434, -0.010398550890386105, 0.02210705541074276, -0.042451560497283936, -0.015351816080510616, 0.028013620525598526, -0.0255375187844038, -0.013901105150580406, 0.036156926304101944, 0.03914690762758255, -0.04729554429650307, 0.006840975023806095, -0.04584360495209694, 0.024805188179016113, -0.01829386129975319, -0.052260156720876694, -0.02253241278231144, -0.0016619394300505519, -0.01549280621111393, -0.0006145139341242611, 0.05048920586705208, -0.0724589005112648, 0.0289897583425045, 0.02344481088221073, 0.005518350284546614, 0.027544235810637474, -0.017639145255088806, 0.04827277362346649, -0.0489245168864727, -0.005648147780448198, -0.011306113563477993, -0.028411325067281723, 0.017429424449801445, 0.04128600284457207, -0.030926603823900223, -0.025695087388157845, -0.02259371429681778, 0.03448096662759781, -0.004300672560930252, -0.03836895525455475, -0.04231520742177963, -0.008905398659408092, 0.006410603411495686, -0.018448911607265472, -0.008575488813221455, 0.00067806092556566, 0.006213895510882139, -0.009462317451834679, -0.016812169924378395, -0.04176460579037666, -0.07250488549470901, 0.023450138047337532, -0.0003329260798636824, 0.032317060977220535, -0.03849292919039726, -0.05005710572004318, 0.028537679463624954, 0.0049812328070402145, 0.009581747464835644, 0.004111694637686014, -0.007824026048183441, -0.04088351130485535, 0.4722900092601776, -0.05616721883416176, -0.00846286490559578, 0.02347724698483944, 0.06699783354997635, 0.02334795892238617, 0.05143876001238823, -0.00018376403022557497, 0.0032585328444838524, 0.021938759833574295, 0.0407714918255806, -0.01607700064778328, -0.0004965462139807642, 0.038481514900922775, 0.013819913379848003, 0.06772829592227936, -0.03488795831799507, 0.06674213707447052, -0.07289692014455795, 0.02190522477030754, 0.01695762388408184, -0.025592021644115448, 0.005164384376257658, -0.02163885347545147, 0.01947653479874134, -0.02008669078350067, 0.0383351631462574, 0.06778871268033981, -0.017369700595736504, 0.01808975450694561, -0.026445219293236732, 0.0035051729064434767, -0.007584050763398409, -0.02853679098188877, -0.027755241841077805, -0.045692749321460724, -0.010681931860744953, -0.02096039056777954, -0.07533234357833862, 0.006896250415593386, 0.030986692756414413, 0.030665069818496704, -0.03629405423998833, 0.007683624979108572, 0.04473436623811722, 0.021165935322642326, -0.04162570834159851, -0.05283833295106888, 0.019588688388466835, 0.04121522605419159, -0.04305722936987877, -0.048511113971471786, 0.009592251852154732, -0.047060560435056686, 0.02738117426633835, 0.0006635390454903245, 0.014891287311911583, -0.0021721096709370613, 0.03659162297844887, 0.023482199758291245, -0.008617524988949299, -0.054339274764060974, 0.02236919291317463, -0.019988546147942543, 0.00016259808035101742, 0.012596562504768372, -0.04205821454524994, -0.008416984230279922, -0.01731976307928562, 0.09226135164499283, 0.06196478754281998, -0.010642195120453835, 0.04997590556740761, 0.06290242820978165, -0.0149827366694808, -0.0003445388865657151, -0.00037044112104922533, -0.05129105970263481, 0.08891261368989944, -0.04871685430407524, -0.0038160551339387894, -0.03846121206879616, 0.01645796373486519, -0.014631696976721287, -0.03201453015208244, -0.020722253248095512, 0.034268129616975784, -0.022784924134612083, -0.002026479924097657, 0.017992468550801277, -0.020921537652611732, 0.016408734023571014, 0.01554892584681511, 0.011636662296950817, -0.022842327132821083, -0.009121078997850418, -0.044692374765872955, -0.002000032924115658, 0.013355830684304237, 0.016179587692022324, -0.031259603798389435, 0.021263275295495987, -0.01528845727443695, -0.005450467113405466, 0.03112313523888588, 0.06346980482339859, 0.02659902535378933, 0.01778840459883213, -0.029691291972994804, 0.006165704689919949, 0.007729599718004465, 0.005646439269185066, -0.052926160395145416, 0.0746118575334549, 0.01713431067764759, -0.020959651097655296, 0.008435234427452087, -0.01882035844027996, 0.03171443194150925, -0.003832815680652857, -0.028286010026931763, -0.021201791241765022, 0.01558168325573206, 0.03026149608194828, -0.013996227644383907, -0.004560729023069143, -0.04208142310380936, -0.07351014763116837, 0.03591930493712425, 0.01836635172367096, -0.0330037921667099, 0.008849558420479298, 0.04842099919915199, -0.030682574957609177, -0.030762234702706337, 0.008230950683355331, 0.004950270988047123, -0.02679104171693325, 0.03291703015565872, 0.021599452942609787, -0.021985279396176338, 0.044839903712272644, 0.04877052456140518, 0.003523739520460367, 0.024288196116685867, 0.039117466658353806, -0.044720739126205444, -0.015933597460389137, 0.03688972815871239, 0.031102126464247704, 0.022853080183267593, 0.04637385159730911, -0.02057790197432041, -0.03833836317062378, 0.02457265928387642, -0.06855271756649017, -0.0050185490399599075, -0.04856470599770546, -0.0492921881377697, -0.028229648247361183, -0.062182556837797165, -0.006149569526314735, 0.01145079918205738, 0.0006612377474084496, -0.009376415982842445, 0.0001603635319042951, -0.018215131014585495, -0.0162659864872694, -0.014351236633956432, 0.03488374501466751, -0.017280949279665947, -0.004603289999067783, -0.037318646907806396, 0.025948310270905495, 0.04362855851650238, -0.007203477900475264, -0.007495886646211147, 0.009594744071364403, -0.030637668445706367, 0.4722139537334442, -0.013637738302350044, 0.05399719253182411, -0.013217087835073471, -0.06054713949561119, 0.06336849927902222, -0.007051138207316399, -0.07015134394168854, -0.03320276364684105, 0.06601928174495697, -0.042715903371572495, 0.010985435917973518, -0.010276873596012592, -9.883381426334381e-05, -0.004828618373721838, -0.021663721650838852, -0.023862570524215698, 0.0228937566280365, -0.0075507694855332375, -0.03214440122246742, -0.039591651409864426, -0.007008695043623447, 0.03052658960223198, 0.015416738577187061, 0.020303864032030106, 0.03679801896214485, -0.03453236445784569, -0.040897659957408905, 0.0001294295652769506, 0.02090541087090969, -0.028476186096668243, 0.024960244074463844, 0.01131182350218296, -0.000661292695440352, 0.013485334813594818, 0.044014520943164825, -0.037158526480197906, 0.0039466856978833675, 0.017566021531820297, 0.03673241659998894, -0.015475253574550152, 0.016206668689846992, 0.013859258964657784, -0.0007020216435194016, 0.04909609630703926, 0.04074700549244881, -0.021673534065485, -0.058451272547245026, -0.06424053013324738, 0.02291453629732132, -0.021970979869365692, 0.011181232519447803, -0.045296717435121536, 0.05534161999821663, 0.003101994749158621, 0.07994972169399261, -0.01670357771217823, -0.001505782245658338, -0.01508860383182764, 0.03194848448038101, -0.0027650226838886738, 0.013911441899836063, -0.023121582344174385, -0.0346379391849041, 0.07043900340795517, 0.024119341745972633, 0.014237825758755207, -0.05236978083848953, 0.03114989772439003, 0.01053917221724987, -0.05116131901741028, 0.0307912677526474, -0.03277432918548584, 0.018559860065579414, -0.05201395973563194, 0.017358822748064995, -0.007817673496901989, 0.04477090388536453, -0.022572603076696396, -0.03608592972159386, 0.002392332535237074, 0.03492632880806923, 0.048619866371154785, 0.038596395403146744, -0.02776186726987362, 0.005449140910059214, 0.03910620138049126, -0.14470228552818298, 0.005361670162528753, 0.011633283458650112, 0.036266956478357315, -0.024673957377672195, -0.033510081470012665, 0.004468133207410574, -0.022851716727018356, 0.004681405145674944, -0.032015111297369, -0.03571874275803566, -2.3240352675202303e-05, 0.004230824764817953, 0.009095863439142704, -0.0036537263076752424, 0.0013633685884997249, 0.03043522872030735, -0.01734619215130806, -0.009978223592042923, 0.027891643345355988, 0.001356927095912397, 0.0030471994541585445, 0.05413098633289337, 0.0006595025770366192, -0.030577542260289192, 0.042336683720350266, -0.004169655963778496, 0.058455564081668854, 0.02797105722129345, -0.01204766146838665, -0.05941466987133026, -0.028651511296629906, -0.013382033444941044, 0.013435590080916882, -0.05389859154820442, -0.06854777783155441, -0.006551059894263744, 0.02466602809727192, -0.007336106617003679, 0.010725267231464386, -0.029621969908475876, -0.05436570197343826, -0.02090717852115631, -0.022526035085320473, 0.05551379173994064, -0.01683282107114792, -0.01722327060997486, -0.024290474131703377, 0.014885926619172096, -0.05213414877653122, 0.008277210406959057, 0.05118875205516815, 0.005935112480074167, -0.0029063860420137644, 0.025989558547735214, 0.017697574570775032, 0.011507609859108925, -0.046375446021556854, 0.032727327197790146, -0.03913835808634758, 0.01293960027396679, -0.031746573746204376, -0.0215141698718071, -0.005939001217484474, 0.031747233122587204, -0.016580503433942795, 0.0187531691044569, -0.016807803884148598, 0.01239665038883686, -0.05406622961163521, 0.018059013411402702, 0.03583855926990509, -0.03135759010910988, -0.013571257703006268, -0.02522573247551918, 0.041230976581573486, 0.0209946446120739, -0.01174780260771513, 0.023425649851560593, 0.015733353793621063, -0.02208634279668331, 0.004506212193518877, -0.07470449805259705, -0.02052905410528183, -0.0073958151042461395, -0.03519800305366516, -0.03587888181209564, -0.030430490151047707, 0.05623743310570717, 0.009698846377432346, 0.021887391805648804, 0.04510489106178284, 0.02285621501505375, -0.014836997725069523, -0.0127424206584692, -0.0024685035459697247, 0.03878132253885269, 0.040373075753450394, -0.044544562697410583, 0.012686836533248425, 0.014281507581472397, 0.057310085743665695, -0.01982073113322258, -3.527217131704674e-06, -0.02164365164935589, 0.08124569803476334, -0.02991693653166294, -0.008706280961632729, 0.0067467112094163895, 0.014611570164561272, -0.06190470978617668, 0.007504696026444435, 0.005838044453412294]], "classes": ["pop-art", "surreal", "vintage", "minimal", "collage", "retro-paint"]} +\ No newline at end of file diff --git a/assets/texture_centroids.json b/assets/texture_centroids.json @@ -0,0 +1,6178 @@ +{ + "bokeh_background": [ + -0.05304056778550148, + 0.06377968937158585, + -0.0002798729983624071, + -0.045152947306632996, + 0.01280086487531662, + -0.00873692985624075, + 0.05070324242115021, + -0.032611601054668427, + 0.03020446188747883, + 0.1432860791683197, + 0.058410048484802246, + 0.0009358075330965221, + 0.038862165063619614, + -0.02262054570019245, + -0.07788904756307602, + 0.02487620897591114, + -0.04728463664650917, + -0.008343187160789967, + -0.07515961676836014, + 0.056019604206085205, + 0.011129382066428661, + -0.015899959951639175, + 0.0428767204284668, + -0.041791804134845734, + -0.03079083189368248, + -0.019130365923047066, + 0.005619710776954889, + 0.02117886207997799, + 0.01782023347914219, + 0.004207897465676069, + -0.01150031853467226, + -0.03554045036435127, + -0.01922103390097618, + -0.02183329127728939, + 0.03941500186920166, + 0.02670198120176792, + -0.1001029759645462, + -0.1401338428258896, + 0.03832172229886055, + 0.0510379932820797, + -0.029637213796377182, + 0.016365399584174156, + -0.1144828051328659, + 0.03375279903411865, + -0.010666871443390846, + 0.02159806713461876, + 0.022589629516005516, + 0.08549639582633972, + 0.021334208548069, + 0.09474246203899384, + -0.02201000601053238, + 0.05043148621916771, + 0.02522183768451214, + -0.06373196095228195, + -0.06058589741587639, + 0.02863694168627262, + 0.012668495066463947, + -0.035886190831661224, + 0.019244272261857986, + 0.019082743674516678, + 0.003446398302912712, + 0.0006660092622041702, + 0.01914982683956623, + 0.040509190410375595, + -0.06020212918519974, + 0.07392596453428268, + 0.05056275799870491, + 0.03836110606789589, + 0.040752071887254715, + 0.024884410202503204, + 0.02608015201985836, + -0.03974723443388939, + -0.0679665133357048, + -0.07781966775655746, + 0.06034163758158684, + -0.05324803292751312, + 0.07394631952047348, + 0.023535778746008873, + -0.059846047312021255, + -0.012170109897851944, + 0.018061239272356033, + -0.07512573897838593, + -0.08673109114170074, + 0.1092318519949913, + -0.032107483595609665, + -0.04550045356154442, + -0.002054481999948621, + -0.052972253412008286, + -0.11902175098657608, + -0.01847389154136181, + 0.05887103080749512, + 0.03445986658334732, + 0.07436211407184601, + -0.09311660379171371, + 0.09636406600475311, + 0.015922967344522476, + 0.04448762536048889, + 0.012221988290548325, + 0.01780276745557785, + -0.06902821362018585, + -0.04501372575759888, + 0.06736446171998978, + 0.023832404986023903, + 0.10150036960840225, + 0.0213983952999115, + 0.03422592207789421, + -0.06872224807739258, + -0.07615470141172409, + 0.12258021533489227, + 0.07979023456573486, + -0.011249505914747715, + -0.054393380880355835, + 0.014559132978320122, + 0.07753779739141464, + -0.021063625812530518, + -0.051920849829912186, + 0.015346845611929893, + 0.005256411153823137, + -0.02403176575899124, + 0.03538854047656059, + 0.04610848426818848, + 0.02914019115269184, + -0.05518253892660141, + 0.045516710728406906, + -0.029698560014367104, + -0.05451392009854317, + -0.0263968612998724, + 0.04317518323659897, + 0.014504261314868927, + -0.011562063358724117, + 0.02966504730284214, + 0.006941596977412701, + -0.038970544934272766, + 0.013920683413743973, + 0.0016487188404425979, + 0.11622012406587601, + -0.03930585831403732, + 0.0018156020669266582, + 0.048222701996564865, + 0.042804569005966187, + 0.038748517632484436, + 0.04868559166789055, + 0.0054826089181005955, + -0.00828875508159399, + -0.03194297105073929, + -0.003910984843969345, + -0.06110720336437225, + 0.04399746656417847, + 0.0251325611025095, + -0.04369321092963219, + -0.05059041827917099, + 0.017627811059355736, + -0.014784727245569229, + 0.05618732422590256, + -0.026818182319402695, + -0.05936888977885246, + 0.06716670095920563, + -0.010274690575897694, + 0.1293066442012787, + -0.07372095435857773, + -0.07943373918533325, + -0.04254836589097977, + -0.1174183189868927, + 0.05150844529271126, + 0.0678095743060112, + 0.020642755553126335, + 0.0172925665974617, + -0.0063040591776371, + -0.08873633295297623, + -0.014830350875854492, + -0.010386047884821892, + 0.04846583306789398, + 0.02589772827923298, + 0.008598553016781807, + -0.0028593584429472685, + -0.050428204238414764, + 0.006541570648550987, + -0.03931077569723129, + 0.005784640554338694, + 0.017214477062225342, + 0.053180795162916183, + -0.06217314675450325, + -0.0349525548517704, + 0.029787717387080193, + -0.03862530365586281, + -0.005297507159411907, + 0.02346723899245262, + 0.006556123960763216, + -0.008892613463103771, + 0.03141995146870613, + 0.017458191141486168, + 0.04030768200755119, + 0.011718385852873325, + -0.06220288202166557, + -0.09878391772508621, + 0.04071585461497307, + 0.09651216119527817, + -0.09383136034011841, + -0.0959426760673523, + -0.035403743386268616, + 0.04120970517396927, + -0.01623058319091797, + 0.022472184151411057, + -0.02055579237639904, + 0.042379993945360184, + -0.027245404198765755, + 0.06788881123065948, + -0.11328231543302536, + 0.1347808539867401, + -0.04790538176894188, + 0.014838890172541142, + -0.006782994139939547, + 0.020465850830078125, + -0.006853749975562096, + -0.022601785138249397, + 0.07002047449350357, + -0.002020439365878701, + -0.010131126269698143, + 0.018371140584349632, + 0.045189980417490005, + -0.03753485903143883, + -0.00932732317596674, + 0.03652185946702957, + 0.06370329111814499, + -0.09916817396879196, + 0.06146726384758949, + 0.042726363986730576, + -0.06443677842617035, + -0.015535698272287846, + 0.013324902392923832, + 0.024613598361611366, + -0.060368143022060394, + 0.029180077835917473, + 0.03597418963909149, + -0.057333629578351974, + -0.08347825706005096, + 0.07343040406703949, + 0.018040290102362633, + -0.024605056270956993, + -0.0716017335653305, + 0.03259403631091118, + -0.04107779264450073, + 0.006991053465753794, + -0.017972460016608238, + -0.01795000024139881, + 0.027887506410479546, + 0.04510737955570221, + 0.007615851238369942, + -0.06469191610813141, + -0.08535753190517426, + 0.059186216443777084, + 0.028612807393074036, + -0.014923331327736378, + 0.030370980501174927, + 0.0757007971405983, + -0.013139072805643082, + 0.054491475224494934, + -0.0144564313814044, + 0.023853300139307976, + 0.05942147597670555, + -0.014090016484260559, + -0.04565282538533211, + 0.030990969389677048, + 0.07223841547966003, + 0.0028729767072945833, + -0.014075005427002907, + -0.02988065965473652, + -0.018622444942593575, + 0.04027850925922394, + -0.056724436581134796, + -0.004553487058728933, + -0.11284208297729492, + -0.005732973571866751, + -0.04463539272546768, + -0.0811852514743805, + 0.09727156162261963, + -0.0902126207947731, + 0.0015869297785684466, + -0.0051834965124726295, + 0.00041595048969611526, + 0.03772157430648804, + -0.0659453347325325, + 0.0016856779111549258, + -0.07099732011556625, + 0.005763255059719086, + -0.019119717180728912, + -0.014575694687664509, + 0.04628664255142212, + -0.1399410218000412, + 0.017472675070166588, + -0.11909434199333191, + -0.059136293828487396, + 0.161117821931839, + -0.08626890927553177, + -0.029701368883252144, + -0.013153365813195705, + -0.00404642429202795, + -0.0357881598174572, + 0.05068858340382576, + -0.008655676618218422, + 0.06617563217878342, + 0.022287314757704735, + -0.02499314583837986, + -0.012132195755839348, + -0.004483244847506285, + 0.02520282194018364, + 0.047597505152225494, + 0.05891220644116402, + -0.06165752932429314, + 0.03837316855788231, + -0.018893489614129066, + -0.07894571870565414, + -0.05534305423498154, + -0.024992194026708603, + -0.005843141116201878, + 0.0012007799232378602, + -0.0012651643482968211, + 0.06815648078918457, + -0.03739194944500923, + -0.06136716529726982, + 0.03792509436607361, + 0.017919331789016724, + 0.026787009090185165, + -0.0028529337141662836, + -0.11703692376613617, + -0.002535698702558875, + 0.07055787742137909, + 0.019643446430563927, + -0.05929950997233391, + 0.011971230618655682, + 0.07576459646224976, + 0.004252552520483732, + 0.03047943115234375, + -0.032663751393556595, + 0.0681491568684578, + -0.009271455928683281, + -0.023189416155219078, + -0.06724556535482407, + 0.0232730470597744, + 0.026372957974672318, + -0.014855221845209599, + 0.0029715716373175383, + -0.056399039924144745, + -0.0012664031237363815, + -0.0029005855321884155, + 0.024264615029096603, + 0.06221234053373337, + -0.023099413141608238, + 0.008736742660403252, + 0.04598463326692581, + -0.011401918716728687, + 0.036174092441797256, + 0.08423400670289993, + -0.03949103504419327, + -0.0149916997179389, + 0.036155566573143005, + 0.042408429086208344, + 0.0658508837223053, + 0.020614037290215492, + 0.03442907705903053, + 0.017377447336912155, + -0.08438339829444885, + 0.04439766705036163, + 0.01857139728963375, + 0.01941867731511593, + 0.005853601731359959, + -0.025771068409085274, + 0.018169784918427467, + -0.04319700226187706, + 0.12097549438476562, + -0.040695227682590485, + 0.0721881240606308, + -0.017607852816581726, + 0.04464004933834076, + -0.06059405580163002, + -0.03031267039477825, + 0.06006855145096779, + -0.008164244703948498, + -0.0017760179471224546, + 0.03009612485766411, + -0.06914753466844559, + 0.0085725337266922, + -0.11266422271728516, + 0.06813317537307739 + ], + "brick": [ + 0.022411489859223366, + -0.006388071458786726, + 0.003398654982447624, + 0.012671695090830326, + -0.03529048338532448, + -0.00507620582357049, + 0.07706838846206665, + -0.0064772386103868484, + 0.022781383246183395, + 0.01565530151128769, + 0.028629474341869354, + -0.04981952905654907, + 0.06937558203935623, + -0.07100827246904373, + -0.009145552292466164, + 0.037860602140426636, + -0.04576640948653221, + -0.009867727756500244, + -0.007361655589193106, + -0.031334955245256424, + -0.002639048732817173, + 0.007629829924553633, + -0.05169650912284851, + 0.06420731544494629, + 0.027187064290046692, + 0.02637524902820587, + 0.020996201783418655, + -0.036548685282468796, + 0.012083618901669979, + 0.018014779314398766, + -0.05413062497973442, + 0.049566175788640976, + -0.02246924117207527, + 0.018034791573882103, + 0.012658851221203804, + -0.10728900879621506, + -0.048973653465509415, + -0.03414938598871231, + 0.010951437056064606, + -0.04578633978962898, + -0.04909230396151543, + 0.04307728260755539, + 0.09889686852693558, + -0.01856725849211216, + 0.01917395181953907, + 0.0463000126183033, + -0.018219759687781334, + 0.001627671648748219, + -0.047972895205020905, + 0.08664784580469131, + 0.004351957235485315, + -0.04373796284198761, + 0.059879034757614136, + -0.01897970587015152, + -0.031456414610147476, + -0.048172544687986374, + 0.009391195140779018, + 0.005709032993763685, + -0.08357510715723038, + -0.05158863961696625, + 0.10636524856090546, + -0.11343179643154144, + 0.02398810349404812, + 0.06956448405981064, + -0.007078575436025858, + 0.04300796985626221, + 0.06338618695735931, + -0.014018637128174305, + 0.06994646787643433, + 0.005612554959952831, + 0.06249009072780609, + 0.08588878810405731, + 0.023009788244962692, + 0.05843792110681534, + 0.029589222744107246, + -0.044547904282808304, + 0.04218154400587082, + 0.027947787195444107, + 0.012645447626709938, + -0.024972187355160713, + -0.016609786078333855, + 0.005186192691326141, + -0.006657174322754145, + -0.0721188560128212, + -0.017012083902955055, + 0.005712415557354689, + -0.045519765466451645, + 0.035128675401210785, + 0.02309003658592701, + -0.05426527559757233, + -0.058621883392333984, + -0.025242146104574203, + -0.00543524045497179, + 0.04437128081917763, + 0.0333913192152977, + 0.004464858677238226, + 0.06264067441225052, + 0.029622891917824745, + -0.06867377460002899, + 0.007860841229557991, + -0.012138919904828072, + 0.02542438730597496, + 0.05416459962725639, + 0.059095364063978195, + 0.0277597326785326, + -0.08201297372579575, + -0.04028704762458801, + 0.02953234128654003, + 0.10368280857801437, + 0.03806634247303009, + 0.10403052717447281, + -0.058575186878442764, + -0.03296855464577675, + 0.011101695708930492, + 0.06124204769730568, + 0.04059397429227829, + 0.05568821728229523, + -0.007605580613017082, + 0.023422401398420334, + 0.029568323865532875, + 0.059666264802217484, + -0.04972556605935097, + 0.03687547892332077, + 0.0054500652477145195, + 0.04064231365919113, + 0.05211067572236061, + 0.025096142664551735, + 0.035714853554964066, + 0.024975460022687912, + 0.16350682079792023, + -0.005374317057430744, + 0.040938813239336014, + 0.003738494124263525, + -0.005865576211363077, + -0.03479617089033127, + 0.027442611753940582, + 0.025904234498739243, + -0.07008824497461319, + 0.040577054023742676, + -0.01198069378733635, + 0.09640470147132874, + 0.040878333151340485, + -0.029941517859697342, + -0.022063426673412323, + -0.033779487013816833, + -0.007873167283833027, + -0.05912754684686661, + -0.0007784021436236799, + 0.030024709179997444, + -0.04180440679192543, + 0.024842243641614914, + -0.018259583041071892, + 0.04188302159309387, + 0.05823853611946106, + 0.0036654153373092413, + 0.05040852352976799, + -0.09665834158658981, + 0.036270953714847565, + 0.02916007675230503, + 0.06780464202165604, + -0.02314434014260769, + 0.011615583673119545, + 0.02904939465224743, + 0.017812352627515793, + 0.03289756923913956, + 0.03883729875087738, + -0.09198317676782608, + 0.013445157557725906, + -0.05218401551246643, + -0.0007336541311815381, + 0.025871245190501213, + 0.022522279992699623, + 0.0823342353105545, + 0.10972538590431213, + 0.022857751697301865, + 0.07160501182079315, + -0.05734509602189064, + 0.05143379420042038, + 0.03409932553768158, + 0.12905442714691162, + 0.033260464668273926, + -0.04974120110273361, + -0.031851209700107574, + 0.0010389366652816534, + -0.007528404705226421, + -0.060624994337558746, + -0.08817020803689957, + 0.013616738840937614, + -0.04796634241938591, + -0.0210825577378273, + 0.02730860561132431, + 0.003347028512507677, + 0.05645099654793739, + 0.004759625066071749, + 0.019631022587418556, + -0.005406601820141077, + 0.010612299665808678, + -0.04655548185110092, + 0.012662067078053951, + 0.03434573486447334, + 0.015617244876921177, + 0.0009642514050938189, + 0.06485375761985779, + 0.037995968014001846, + -0.0021707918494939804, + -0.04959398880600929, + 0.022626806050539017, + -0.05343681946396828, + -0.004482559859752655, + 0.02380429580807686, + -0.0906020775437355, + -0.02196098491549492, + -0.0030838646925985813, + 0.002287412527948618, + -0.027312209829688072, + 0.06238618493080139, + 0.02254912257194519, + -0.001097006374038756, + 0.04148168861865997, + 0.01940988563001156, + -0.05198466777801514, + -0.00452093780040741, + -0.04104356840252876, + 0.006829306948930025, + -0.10641028732061386, + -0.04461478814482689, + 0.0518205426633358, + 0.05949459969997406, + -0.08040112257003784, + -0.005825658794492483, + -0.02331540733575821, + 0.0028888897504657507, + -0.022357193753123283, + -0.06840422749519348, + -0.06492969393730164, + -0.0270419679582119, + -0.10733896493911743, + -0.019380992278456688, + -0.07073299586772919, + -0.029985133558511734, + 0.007278343662619591, + 0.0380750335752964, + 0.001409862656146288, + -0.05394266918301582, + -0.021817786619067192, + -0.03268275037407875, + 0.03286552429199219, + 0.0022064053919166327, + -0.10734134912490845, + 0.06080144643783569, + -0.03605171665549278, + -0.04410967975854874, + 0.02408669888973236, + 0.04097569361329079, + 0.02056809701025486, + -0.14467553794384003, + 0.03687049821019173, + -0.17916126549243927, + 0.07152624428272247, + 0.047351814806461334, + 0.04146914556622505, + -0.014936944469809532, + -0.00820540077984333, + -0.0048624384216964245, + 0.020087847486138344, + -0.005660888738930225, + 0.06811433285474777, + -0.0858272910118103, + -0.032085370272397995, + -0.06303989142179489, + 0.0060318829491734505, + 0.003690558485686779, + 0.1344659924507141, + 0.0058861407451331615, + 0.011487843468785286, + 0.013173120096325874, + 0.03688347339630127, + 0.0373050682246685, + 0.003059525741264224, + -0.01746355928480625, + -0.019865205511450768, + -0.043849822133779526, + -0.041643064469099045, + -0.01597703993320465, + 0.07695778459310532, + 0.02933030016720295, + 0.017547626048326492, + 0.08101077377796173, + 0.025545727461576462, + -0.03809809684753418, + -0.004774225410073996, + 0.01389901340007782, + -0.058604832738637924, + 0.11340286582708359, + -0.12450626492500305, + 0.05340339243412018, + 0.04372476041316986, + -0.09624023735523224, + 0.06142362579703331, + 0.02263827435672283, + -0.09417270123958588, + 0.017151860520243645, + 0.11218120902776718, + 0.04023011401295662, + -0.07212091982364655, + -0.04105360433459282, + -0.007589534856379032, + -0.0320703387260437, + -0.0064919982105493546, + 0.031509824097156525, + 0.023221049457788467, + 0.0021645359229296446, + -0.026990581303834915, + -0.004300849977880716, + -0.08492399752140045, + -0.013422384858131409, + -0.06296157091856003, + 0.016923073679208755, + -0.035854458808898926, + 0.07572687417268753, + 0.005300397984683514, + -0.11392172425985336, + -0.061019960790872574, + -0.04211874678730965, + 0.03572085499763489, + 0.04539014399051666, + -0.0213740486651659, + -0.10671211034059525, + 0.038062240928411484, + 0.03632497414946556, + -0.07614148408174515, + -0.04535622522234917, + -0.09321796894073486, + 0.033631082624197006, + -0.035924553871154785, + -0.05332489311695099, + 0.039649926126003265, + -0.03619712218642235, + -0.016589902341365814, + -0.07464073598384857, + -0.006974715739488602, + 0.018304472789168358, + -0.015851451084017754, + -0.07715540379285812, + -0.002388283144682646, + 0.017956983298063278, + -0.018967611715197563, + -0.009061666205525398, + 0.008669727481901646, + -0.01733049936592579, + 0.015495606698095798, + -0.023275019600987434, + 0.009462126530706882, + 0.025051504373550415, + -0.10185768455266953, + 0.034394387155771255, + 0.061900775879621506, + 0.02800249494612217, + 0.1316300928592682, + -0.008628436364233494, + -0.09394216537475586, + -0.08292486518621445, + 0.02285294234752655, + 0.01936524547636509, + -0.02594301477074623, + -0.01884327456355095, + -0.05480154603719711, + 0.12453437596559525, + -0.04578489810228348, + 0.06971794366836548, + -0.02194623462855816, + 0.09091197699308395, + -0.03217623755335808, + 0.05164652317762375, + -0.03900863975286484, + -0.04950059950351715, + 0.025978920981287956, + -0.05956234782934189, + -0.17535865306854248, + -0.021235991269350052, + -0.08291760832071304, + 0.0026621082797646523, + 0.034366242587566376, + 0.0653790757060051 + ], + "concrete": [ + 0.06618253886699677, + 0.05729840695858002, + 0.06180189177393913, + -0.11915908753871918, + -0.05913557857275009, + 0.016456324607133865, + 0.03669000789523125, + -0.06273866444826126, + -0.0432397685945034, + 0.04016882926225662, + 0.03569934144616127, + -0.041413355618715286, + 0.008604861795902252, + -0.012269105762243271, + -0.09389550983905792, + -0.027940329164266586, + -0.03904493525624275, + -0.029753636568784714, + -0.015754589810967445, + -0.017888860777020454, + -0.07320861518383026, + 0.10729213804006577, + 0.005133556202054024, + 0.014599454589188099, + 0.023504463955760002, + 0.013476688414812088, + -0.05617910251021385, + -0.013392812572419643, + 0.015757525339722633, + -0.009632030501961708, + -0.02841503918170929, + 0.05065193399786949, + -0.08311934024095535, + -0.013879498466849327, + -0.07367584854364395, + -0.08952625095844269, + -0.022074298933148384, + -0.03125481680035591, + -0.0656154528260231, + 0.06229767948389053, + 0.03416939824819565, + -0.04153000935912132, + 0.0731411799788475, + 0.04616888239979744, + -0.03804262354969978, + 0.022022966295480728, + -0.008906997740268707, + 0.03182378038764, + -0.017853116616606712, + 0.0666925236582756, + 0.040072619915008545, + -0.013412593863904476, + -0.004767110571265221, + 0.04518958181142807, + 0.0065054879523813725, + -0.049075476825237274, + 0.05266694724559784, + 0.08427087217569351, + -0.042646922171115875, + -0.11468862742185593, + 0.10598644614219666, + -0.043669119477272034, + -0.04116133227944374, + 0.10273472219705582, + -0.010848849080502987, + -0.036586157977581024, + 0.053652551025152206, + 0.045677587389945984, + 0.13030055165290833, + 0.01964842900633812, + 0.0004773410619236529, + 0.017026608809828758, + -0.04772967845201492, + -0.035827577114105225, + -0.06744884699583054, + -0.023276235908269882, + 0.08958835899829865, + 0.08819899708032608, + -0.0173870250582695, + -0.04337337985634804, + 0.010235035791993141, + -0.0165458582341671, + -0.0658063292503357, + -0.013964537531137466, + 0.04150664433836937, + -0.028213713318109512, + 0.012835264205932617, + 0.0905991941690445, + 0.006395384669303894, + -0.04620075970888138, + -0.03270186111330986, + -0.06469892710447311, + 0.05380720645189285, + 0.012093682773411274, + 0.03354184702038765, + 0.026550142094492912, + 0.07657729834318161, + 0.08893771469593048, + -0.09290194511413574, + 0.023123251274228096, + 0.07007662206888199, + -0.03282711282372475, + -0.01822972483932972, + 0.11779823154211044, + -0.015663722530007362, + -0.08665836602449417, + 0.035506442189216614, + -0.03714258223772049, + 0.10006195306777954, + -0.007586171850562096, + 0.008318479172885418, + -0.0020731950644403696, + -0.08704426139593124, + 0.0032585076987743378, + -0.010491658933460712, + -0.020678693428635597, + 0.06939399987459183, + 0.007313038222491741, + -0.007888550870120525, + -0.010799489915370941, + -0.018505524843931198, + -0.016931207850575447, + 0.05618327856063843, + 0.038335468620061874, + -0.013618921861052513, + -0.019097808748483658, + -0.033366333693265915, + 0.012270830571651459, + 0.008074918761849403, + 0.08036254346370697, + -0.007736585568636656, + 0.039563801139593124, + -0.10791298002004623, + -0.056704338639974594, + -0.019515231251716614, + 0.02498466707766056, + 0.013366613537073135, + -0.03598025441169739, + 0.03538589924573898, + -0.030851028859615326, + 0.009939417243003845, + 0.061271291226148605, + -0.07045988738536835, + 0.023471705615520477, + 0.010970903560519218, + 0.030937131494283676, + -0.041762158274650574, + -0.050731562077999115, + -0.0014705120120197535, + -0.0508526936173439, + -0.009571434929966927, + -0.013402286916971207, + -0.01860515959560871, + 0.014456474222242832, + 0.0005699261673726141, + -0.03070315718650818, + 0.0539633110165596, + 0.06708988547325134, + -0.024470368400216103, + 0.09942010790109634, + -0.017540236935019493, + 0.05281804874539375, + 0.06362403929233551, + 0.05373099818825722, + 0.04326895624399185, + 0.01671021059155464, + -0.011684552766382694, + -0.017527736723423004, + -0.012732564471662045, + 0.009494923986494541, + -0.033647261559963226, + 0.004117061849683523, + -0.011433341540396214, + 0.07647701352834702, + 0.0099214818328619, + 0.06430426985025406, + -0.0005734823062084615, + -0.10423319786787033, + -0.020547328516840935, + 0.028472857549786568, + 0.013746396638453007, + -0.01449284516274929, + -0.05630016326904297, + 0.022632000967860222, + 0.04600898548960686, + 0.041158683598041534, + 0.0167520884424448, + -0.02564976178109646, + -0.023222656920552254, + 0.015723368152976036, + 0.07513853907585144, + 0.01881822943687439, + -0.000301410531392321, + -0.04929006099700928, + 0.006642999593168497, + -0.022908348590135574, + 0.01547310035675764, + -0.037336789071559906, + 0.008423893712460995, + 0.09352461993694305, + 0.09344856441020966, + 0.01671692542731762, + 0.08229927718639374, + 0.005505494307726622, + 0.02363959513604641, + 0.01142614334821701, + 0.0019896284211426973, + -0.05603865906596184, + 0.08556142449378967, + 0.015630517154932022, + 0.007710548583418131, + -0.03910312056541443, + -0.08448004722595215, + 0.04756717383861542, + 0.02678423933684826, + -0.024255461990833282, + 0.08054766058921814, + -0.06714635342359543, + -0.03497880697250366, + 0.10993073880672455, + -0.020960401743650436, + 0.05817870795726776, + -0.048471931368112564, + 0.08338908851146698, + -0.09086616337299347, + 0.003714638063684106, + 0.005115330684930086, + 0.06436367332935333, + -0.0348588190972805, + 0.016163406893610954, + 0.02065489999949932, + -0.049580562859773636, + -0.01384348887950182, + -0.03096136823296547, + -0.013475661166012287, + -0.013996852561831474, + -0.001259153475984931, + 0.014726370573043823, + 0.08527547121047974, + -0.08060135692358017, + 0.003571263048797846, + 0.12237583100795746, + -0.015578892081975937, + -0.008021854795515537, + -0.06320586055517197, + -0.054301850497722626, + 0.04084262624382973, + -0.050943516194820404, + -0.03648567199707031, + -0.012324131093919277, + -0.06423870474100113, + -0.038198817521333694, + -0.005029013846069574, + 0.03516972437500954, + -0.06627346575260162, + -0.053110621869564056, + 0.01841798797249794, + -0.021132007241249084, + 0.06192135438323021, + 0.05557103455066681, + -0.03281623497605324, + -0.01415228471159935, + 0.0029197901021689177, + 0.03444616496562958, + 0.05315540358424187, + 0.047242190688848495, + 0.10028158873319626, + -0.0808650478720665, + 0.012197182513773441, + -0.06351376324892044, + -0.049403972923755646, + -0.07885157316923141, + 0.11490099877119064, + 0.050970401614904404, + -0.024405689910054207, + 0.0007612864137627184, + -0.004989911336451769, + -0.033769577741622925, + -0.008993401192128658, + -0.024653665721416473, + -0.023518521338701248, + -0.043947961181402206, + -0.0007809250382706523, + -0.07484302669763565, + 0.014050877653062344, + 0.041112903505563736, + 0.0855272188782692, + 0.11608532816171646, + 0.011358968913555145, + -0.05027574300765991, + -0.005382440518587828, + -0.03608931601047516, + -0.02224617637693882, + 0.07058325409889221, + -0.027571670711040497, + 0.021946586668491364, + -0.001228793291375041, + -0.06655804067850113, + 0.04765729978680611, + 0.027181455865502357, + -0.04386257380247116, + 0.01888946071267128, + 0.07475104182958603, + 0.003110665362328291, + -0.06587164103984833, + -0.005997644737362862, + -0.1363179236650467, + -0.010368946008384228, + 0.028613271191716194, + -0.036462217569351196, + -0.04159608483314514, + 0.04098827391862869, + 0.025018328800797462, + -0.028148949146270752, + -0.11256810277700424, + -0.11765743792057037, + 0.05786532536149025, + 0.06249826028943062, + -0.07922599464654922, + -0.058137137442827225, + 0.03141649812459946, + -0.08809314668178558, + -0.04362347722053528, + -0.02847343124449253, + -0.06680501997470856, + -0.0023502628318965435, + 0.055500347167253494, + -0.007151239551603794, + -0.006807387340813875, + 0.07058040797710419, + -0.014055872336030006, + 0.06885150074958801, + -0.025669680908322334, + -0.025724200531840324, + 0.0018565688515082002, + 0.02833600528538227, + 0.09369789063930511, + -0.0034512763377279043, + -0.05399215593934059, + 0.06397028267383575, + -0.005628828890621662, + -0.10881611704826355, + 0.001485323766246438, + -0.03695705160498619, + 0.05129345878958702, + 0.046299777925014496, + 0.06188718602061272, + -0.044773418456315994, + -0.04096617549657822, + 0.05593656376004219, + -0.028769545257091522, + -0.07660544663667679, + 0.048834096640348434, + -0.042405448853969574, + 0.0748816505074501, + 0.03274735063314438, + -0.0007707230979576707, + -0.046392716467380524, + 0.1457080841064453, + 0.02120988629758358, + -0.07640448957681656, + 0.02899998612701893, + -0.0483982115983963, + 0.039375510066747665, + -0.017248090356588364, + -0.0713324174284935, + 0.018253423273563385, + -0.0046891383826732635, + 0.0806514099240303, + 0.01977408304810524, + -0.006873524282127619, + 0.02555900812149048, + 0.0031694367062300444, + 0.06444817781448364, + 0.0071490611881017685, + -0.10160622000694275, + 0.09226339310407639, + -0.014600387774407864, + -0.07976652681827545, + -0.007742490153759718, + -0.05054473504424095, + -0.013780102133750916, + -0.01436188817024231, + 0.07294977456331253 + ], + "denim": [ + 0.0842488631606102, + 0.06152305752038956, + 0.02483254484832287, + -0.05376383289694786, + 0.009813765995204449, + 0.01388089545071125, + 0.03970523551106453, + -0.0614946074783802, + -0.016228515654802322, + -0.060792937874794006, + -0.0198541060090065, + 0.0008545234450139105, + -0.02190171554684639, + 0.06826604902744293, + -0.08401595056056976, + -0.030468115583062172, + -0.024695903062820435, + 0.018926110118627548, + -0.05210311710834503, + -0.02787267416715622, + -0.020079806447029114, + 0.03504583239555359, + -0.034752655774354935, + 0.05372479930520058, + 0.02965681441128254, + -0.04197929427027702, + 0.01000132504850626, + 0.05973595380783081, + 0.04618719220161438, + -0.03867577016353607, + -0.05332900956273079, + 3.63557137461612e-06, + -0.0762457475066185, + 0.004944803658872843, + -0.07021145522594452, + -0.06400702893733978, + -0.0063789463602006435, + -0.042921438813209534, + -0.05028894543647766, + -0.014141670428216457, + 0.07171903550624847, + -0.06553091108798981, + 0.04433094337582588, + 0.017407245934009552, + -0.02569892629981041, + 0.007319738622754812, + -0.04043850302696228, + -0.006310432683676481, + 0.010589552111923695, + 0.07694372534751892, + 0.05581502616405487, + 0.05314069613814354, + -0.08018533140420914, + 0.058281075209379196, + -0.027725640684366226, + 0.043107178062200546, + -0.011495392769575119, + 0.013227691873908043, + 0.0017587330657988787, + -0.030893394723534584, + 0.0028156384360045195, + -0.0635281652212143, + -0.05832233279943466, + 0.10831230878829956, + -0.015068375505506992, + 0.015242630615830421, + -0.02642468735575676, + -0.010936854407191277, + 0.06691189855337143, + 0.01340329647064209, + -0.005994997452944517, + 0.06200277432799339, + -0.04056534171104431, + -0.08062704652547836, + -0.12319168448448181, + 0.04104358330368996, + -0.0019478691974654794, + 0.045680150389671326, + 0.01702725701034069, + -0.07857657223939896, + 0.010211712680757046, + -0.019301870837807655, + -0.08310496062040329, + -0.021787414327263832, + 0.05907926335930824, + 0.010419964790344238, + 0.012841559015214443, + 0.014354625716805458, + -0.002240053378045559, + -0.09120290726423264, + -0.06012740731239319, + 0.008616460487246513, + -0.002618432743474841, + -0.045952629297971725, + -0.005756244529038668, + 0.068382129073143, + -0.01113741286098957, + 0.06713477522134781, + -0.031139373779296875, + -0.027176329866051674, + 0.10260376334190369, + 0.024996064603328705, + 0.003306071273982525, + 0.1244664341211319, + 0.03678067401051521, + -0.07252426445484161, + -0.03741425648331642, + -0.002730994252488017, + 0.05800699442625046, + 0.04057813435792923, + 0.014724490232765675, + -0.02871137112379074, + -0.08695243299007416, + 0.029352594166994095, + 0.012343740090727806, + -0.005040069576352835, + 0.03250482305884361, + 0.03770403563976288, + 0.0580151230096817, + 0.07152043282985687, + 0.04297172278165817, + 0.030548229813575745, + -0.02276463620364666, + 0.03891846165060997, + -0.01947055384516716, + 0.005957489833235741, + -0.020401712507009506, + -0.008813144639134407, + -0.08240053802728653, + 0.09015292674303055, + 0.05531027168035507, + 0.01541165541857481, + -0.014481337741017342, + -0.013956539332866669, + -0.04916239157319069, + 0.09904423356056213, + -0.0026826581452041864, + 0.01587229035794735, + 0.07248309999704361, + 0.07178200781345367, + 0.01089036837220192, + 0.07078934460878372, + 0.02538047544658184, + 0.04897463694214821, + -0.02953033335506916, + -0.06128023564815521, + -0.05131600424647331, + 0.12150663882493973, + 0.00213452591560781, + 0.010372831486165524, + 0.054631296545267105, + -0.02861015312373638, + 0.08093179762363434, + -0.011232846416532993, + 0.0537690632045269, + -0.04982193559408188, + 0.018318576738238335, + 0.0018021541181951761, + -0.02440035156905651, + 0.012185590341687202, + 0.052406445145606995, + 0.03713677078485489, + 0.1009339988231659, + 0.034968480467796326, + -0.06929163634777069, + -0.015902269631624222, + -0.05777668207883835, + -0.04151416942477226, + 0.009856157936155796, + -0.028543034568428993, + 0.050026439130306244, + -0.019000444561243057, + -0.04806869477033615, + 0.057035233825445175, + 0.03397997468709946, + 0.022320758551359177, + 0.0051482063718140125, + -0.1240738034248352, + -0.04486457630991936, + 0.10886749625205994, + -0.015217576175928116, + 0.04097587615251541, + -0.02850840613245964, + 0.011466886848211288, + 0.006600463762879372, + 0.05306299403309822, + 0.05839334428310394, + 0.037351444363594055, + -0.07250187546014786, + 0.027072858065366745, + -0.00766350794583559, + -0.05478180572390556, + 0.007928397506475449, + 0.015368014574050903, + 0.0016326780896633863, + 0.006285819690674543, + 0.10409125685691833, + -0.008473415859043598, + 0.030381537973880768, + 0.05595111846923828, + 0.018701085820794106, + 0.0017987191677093506, + 0.07734771072864532, + -0.00028569198912009597, + -0.0980905145406723, + 0.028921188786625862, + -0.08029721677303314, + -0.07489954680204391, + 0.03295169398188591, + 0.03661675378680229, + -0.0851266011595726, + -0.12005683779716492, + -0.004159965086728334, + 0.0897216722369194, + 0.024698704481124878, + -0.04040771350264549, + -0.01689288020133972, + -0.004146492574363947, + -0.09999624639749527, + 0.06257544457912445, + -0.0534338504076004, + 0.035888463258743286, + 0.02969256602227688, + 0.07668158411979675, + -0.06007657200098038, + -0.007007327862083912, + 0.04156321659684181, + 0.03744486719369888, + -0.1276710331439972, + 0.010430693626403809, + -0.05328243970870972, + -0.05084953084588051, + -0.07864820212125778, + 0.009967908263206482, + 0.014704238623380661, + 0.04297374561429024, + -0.035740505903959274, + -0.03596220165491104, + -0.07446423172950745, + 0.048216793686151505, + -0.0419626459479332, + 0.05159102752804756, + -0.03522755950689316, + -0.09123240411281586, + -0.03090495988726616, + 0.02506893314421177, + 0.07307431846857071, + 0.0038963081315159798, + -0.03144746646285057, + -0.07263118028640747, + -0.0834382027387619, + -0.027556465938687325, + 0.05697183310985565, + -0.001360918628051877, + -0.08284606039524078, + -0.11514345556497574, + 0.07516928017139435, + -0.004940537735819817, + -0.011135593988001347, + 0.03687010332942009, + -0.020412640646100044, + 0.0062720756977796555, + 0.05608634650707245, + 0.07231975346803665, + 0.0246446393430233, + 0.04009857401251793, + 0.0835895836353302, + -0.025906817987561226, + -0.054551851004362106, + -0.1033114567399025, + -0.0085797980427742, + -0.012684262357652187, + 0.035364311188459396, + 0.047527384012937546, + -0.017641833052039146, + -0.012111329473555088, + 0.033436451107263565, + -0.033249836415052414, + -0.0012277925852686167, + 0.07283645123243332, + -0.03507639840245247, + 0.07574012130498886, + -0.02825072966516018, + 0.014297758229076862, + 0.001907077501527965, + 0.08029995113611221, + 0.0609305277466774, + -0.0075829774141311646, + -0.03522833064198494, + -0.039270635694265366, + -0.04193706810474396, + 0.005747754592448473, + -0.08965117484331131, + -0.021270493045449257, + -0.03441765159368515, + 0.04521637782454491, + 0.05195516347885132, + -0.06448975205421448, + 0.12546654045581818, + 0.022016610950231552, + 2.4118202418321744e-05, + 0.03595927357673645, + 0.14319342374801636, + -0.04711024835705757, + -0.04943351075053215, + 0.021115636453032494, + -0.08240824192762375, + 0.05699923634529114, + -0.018748732283711433, + 0.056340936571359634, + 0.05242636054754257, + -0.05574057996273041, + 0.09484188258647919, + -0.017589062452316284, + -0.029352599754929543, + -0.032852623611688614, + -0.003676692256703973, + 0.08387073874473572, + -0.08009722828865051, + -0.15559639036655426, + 0.0586940236389637, + -0.04584849998354912, + 0.012769648805260658, + -0.07639460265636444, + 0.053172506392002106, + 0.009795092046260834, + 0.080616295337677, + -0.021122673526406288, + 0.052458323538303375, + 0.06291675567626953, + -0.03692745417356491, + 0.04819094017148018, + -0.0013193173799663782, + 0.0011317252647131681, + -0.02851824276149273, + -0.03425440937280655, + 0.004141365643590689, + -0.04991627484560013, + -0.058050476014614105, + 0.03463590145111084, + 0.004833540413528681, + -0.014944684691727161, + -0.02204197086393833, + 0.0035058557987213135, + -0.006942824926227331, + 0.005420313682407141, + 0.06298866868019104, + 0.026065772399306297, + -0.008227290585637093, + -0.040799014270305634, + -0.03485683724284172, + -0.043419141322374344, + 0.027895605191588402, + -0.0025005966890603304, + 0.01397471223026514, + -0.034584175795316696, + 0.025773391127586365, + -0.06752585619688034, + 0.11727812141180038, + 0.006354862824082375, + -0.06212491914629936, + 0.004329875111579895, + 0.022250300273299217, + 0.08980004489421844, + -0.0761917307972908, + -0.007328053005039692, + -0.005089267622679472, + -0.013290517032146454, + 0.028593827039003372, + -0.0197872556746006, + 0.0688864067196846, + 0.03130345791578293, + -0.03433161973953247, + 0.0695779100060463, + -0.020213034003973007, + -0.07512648403644562, + -0.03843109682202339, + 0.014664591290056705, + 0.0397040955722332, + -0.03870577737689018, + 0.006173028610646725, + -0.019213592633605003, + 0.033137544989585876, + 0.10418512672185898 + ], + "fabric": [ + 0.04022671654820442, + 0.0726233422756195, + 0.029113760218024254, + -0.0412459596991539, + -0.014815262518823147, + 0.025008637458086014, + 0.020817600190639496, + -0.050394147634506226, + 0.005915543530136347, + -0.05416133999824524, + 0.002148185856640339, + -0.02388409897685051, + -0.0892065241932869, + 0.016452275216579437, + -0.08682606369256973, + -0.10178954154253006, + 0.028920605778694153, + 0.013291784562170506, + -0.021289676427841187, + -0.014373146928846836, + -0.027653172612190247, + 0.0797826424241066, + -0.04834069684147835, + 0.05239395797252655, + 0.04141605645418167, + -0.055332884192466736, + -0.008205777034163475, + 0.06377483159303665, + 0.04544973745942116, + -0.03422117978334427, + -0.04537447914481163, + 0.03452558442950249, + -0.061220016330480576, + 0.0442412793636322, + -0.09150265902280807, + -0.07544542104005814, + -0.02757304348051548, + -0.07142744213342667, + -0.07303526997566223, + 0.008994021452963352, + 0.025927644222974777, + -0.035356104373931885, + 0.06847184151411057, + 0.0652473121881485, + 0.0015105155762284994, + -0.05599614232778549, + -0.030943000689148903, + -0.0412096232175827, + 0.0031819473952054977, + 0.0886785238981247, + 0.05134497955441475, + 0.09168346226215363, + -0.07037494331598282, + 0.03789260983467102, + -0.03570227697491646, + -0.053235843777656555, + 0.011145999655127525, + -0.007863594219088554, + 0.021155226975679398, + -0.03706707805395126, + 0.03939255699515343, + -0.04103575274348259, + -0.02367040328681469, + 0.11471232026815414, + -0.007856344804167747, + 0.009450668469071388, + -0.008230828680098057, + 0.014741373248398304, + 0.07098428905010223, + 0.01120174489915371, + -0.02639898471534252, + 0.06997869908809662, + -0.00992406252771616, + -0.06086473912000656, + -0.08738058805465698, + -0.01263551414012909, + -0.005341562908142805, + 0.062167391180992126, + -0.0008425041451118886, + -0.07484929263591766, + 0.02956913784146309, + -0.0150253651663661, + -0.047269679605960846, + -0.05118342116475105, + 0.09931831061840057, + -0.015476521104574203, + 0.08457118272781372, + 0.023314785212278366, + 0.0012517849681898952, + -0.0679696798324585, + -0.06403637677431107, + -0.0003578584874048829, + 0.04786897078156471, + -0.009794708341360092, + 0.05306906998157501, + 0.05503196269273758, + 0.000292815180728212, + 0.030949117615818977, + 0.013520164415240288, + -0.051683586090803146, + 0.10098762065172195, + 0.02625943161547184, + -0.011279381811618805, + 0.07744129747152328, + 0.015807131305336952, + -0.06131835654377937, + -0.08778907358646393, + 0.023984750732779503, + 0.13062913715839386, + 0.008126853033900261, + 0.03381693363189697, + -0.06627047806978226, + -0.11401396989822388, + -0.01547704916447401, + -0.03628017008304596, + -0.018791284412145615, + 0.026360075920820236, + 0.029958613216876984, + 0.030400274321436882, + 0.08286066353321075, + 0.011954162269830704, + 0.009903322905302048, + -0.008093039505183697, + 0.02181374467909336, + -0.06120451167225838, + 0.009873942472040653, + -0.024824945256114006, + -0.025242434814572334, + -0.05386384576559067, + 0.08729337900876999, + 0.02828654646873474, + 0.026520680636167526, + -0.020081844180822372, + -0.04832884296774864, + -0.05519011989235878, + 0.07901137322187424, + 0.028618166223168373, + 0.0358266718685627, + 0.08763831853866577, + 0.019393574446439743, + 0.01747874543070793, + 0.06518317759037018, + -0.05299670249223709, + 0.0223675724118948, + -0.0312240831553936, + 0.0435887910425663, + -0.06836020201444626, + 0.06646726280450821, + -0.02486449107527733, + 0.010057039558887482, + -0.010645311325788498, + -0.023341022431850433, + 0.06985751539468765, + -0.031590163707733154, + 0.03134722635149956, + -0.0409107431769371, + 0.08716661483049393, + 0.041551921516656876, + -0.012063587084412575, + 0.09975884109735489, + -0.0022412098478525877, + 0.018724417313933372, + 0.052140090614557266, + 0.03793790936470032, + -0.029554098844528198, + 0.007974129170179367, + -0.08496458828449249, + 0.008048849180340767, + 0.03880949318408966, + -0.07622238248586655, + 0.04817876219749451, + -0.021405216306447983, + -0.014822266064584255, + 0.0880448967218399, + -0.0005635732668451965, + 0.10282503068447113, + 0.011551530100405216, + -0.05673399940133095, + -0.031259506940841675, + 0.06851685792207718, + -0.0018718588398769498, + 0.017250075936317444, + -0.012582956813275814, + 0.06414914131164551, + 0.03903774917125702, + 0.04999661073088646, + 0.04696609824895859, + 0.02694045566022396, + -0.07784979045391083, + 0.012963278219103813, + 0.01643841341137886, + -0.026309221982955933, + 0.01276329904794693, + 0.01919673942029476, + 0.02372111938893795, + 0.017588092014193535, + 0.06722602993249893, + 0.012480467557907104, + -0.03283777832984924, + 0.034905917942523956, + -0.0008730936679057777, + 0.008859067223966122, + 0.06606718897819519, + 0.00868182722479105, + -0.05463418364524841, + 0.00127131468616426, + -0.08724703639745712, + -0.0549706406891346, + 0.030141044408082962, + 0.03424917906522751, + -0.08691635727882385, + -0.0777139738202095, + -0.054993852972984314, + 0.028585463762283325, + -0.0011911171022802591, + -0.022673264145851135, + 0.07966813445091248, + -0.025255242362618446, + -0.07715528458356857, + 0.06984687596559525, + -0.047421228140592575, + 0.06319712102413177, + -0.03304411098361015, + 0.057352643460035324, + -0.035836391150951385, + -0.0015437062829732895, + -0.003166736802086234, + 0.014549309387803078, + -0.12271220237016678, + 0.012660237960517406, + -0.040423326194286346, + -0.022890781983733177, + -0.07494497299194336, + -0.02524017170071602, + 0.039852604269981384, + 0.028504926711320877, + -0.019446169957518578, + -0.012277099303901196, + -0.059016067534685135, + 0.039595793932676315, + -0.04294425994157791, + 0.08623988181352615, + -0.06322108209133148, + -0.010856774635612965, + -0.0068716006353497505, + 0.04028792306780815, + 0.06994418799877167, + 0.03795143589377403, + -0.04971927031874657, + -0.035351596772670746, + -0.060985591262578964, + -0.012090520933270454, + -0.02036415785551071, + 0.04034171253442764, + -0.036371055990457535, + -0.12787316739559174, + 0.007236231118440628, + -0.03661723434925079, + -0.015653936192393303, + 0.03538444638252258, + -0.013584883883595467, + -0.0310567244887352, + 0.017704255878925323, + 0.0476711168885231, + 0.06968444585800171, + 0.03217848390340805, + 0.12310481816530228, + 0.03570319712162018, + -0.024451591074466705, + -0.11460335552692413, + 0.004219691269099712, + 0.028205523267388344, + 0.051109325140714645, + 0.015765376389026642, + -0.01966382935643196, + -0.07593289762735367, + 0.02602102980017662, + -0.029282083734869957, + -0.012497078627347946, + 0.019845349714159966, + -0.03336833789944649, + 0.023164089769124985, + -0.004006910137832165, + 0.012773677706718445, + -0.032302066683769226, + 0.06540600210428238, + 0.09258963167667389, + -0.0010124765103682876, + 0.011328273452818394, + 0.006873129401355982, + -0.021141761913895607, + 0.021756744012236595, + -0.04557245597243309, + -0.008382829837501049, + -0.10101574659347534, + 0.07871700078248978, + 0.023555127903819084, + -0.10592306405305862, + 0.13524307310581207, + 0.08068637549877167, + -0.003223631763830781, + 0.044350430369377136, + 0.11755090951919556, + -0.03714999556541443, + -0.016425834968686104, + 0.032490234822034836, + -0.13949304819107056, + -0.005453848745673895, + 0.013425597921013832, + 0.03845817223191261, + 0.00034098263131454587, + -0.07799743115901947, + 0.0669681653380394, + 0.00037062258343212306, + -0.06048005819320679, + -0.05328736454248428, + -0.018740728497505188, + 0.08421767503023148, + -0.10529134422540665, + -0.11339284479618073, + 0.01028177049010992, + -0.0600421279668808, + -0.060164764523506165, + -0.011322235688567162, + 0.02772013656795025, + 0.028285186737775803, + 0.05381191521883011, + -0.01197640411555767, + 0.049909960478544235, + 0.05231485515832901, + -0.08633965253829956, + 0.031179655343294144, + -0.06709063798189163, + 0.00834294781088829, + 0.008329452946782112, + -0.029312485828995705, + 0.06545441597700119, + -0.05530732497572899, + -0.007568742148578167, + 0.06727412343025208, + 0.005384786520153284, + -0.013981045223772526, + -0.029869895428419113, + 0.01753835938870907, + -0.0015499312430620193, + 0.04033096134662628, + 0.05329558253288269, + 0.036428872495889664, + 0.0014173209201544523, + -0.050562258809804916, + -0.040415797382593155, + -0.04728066921234131, + -0.009595599956810474, + 0.0018626248929649591, + 0.0663733184337616, + 0.06649548560380936, + 0.04535624384880066, + -0.023804403841495514, + 0.12218139320611954, + 0.004523099400103092, + -0.10786772519350052, + 0.04649047926068306, + 0.022001422941684723, + 0.11611230671405792, + -0.04517092555761337, + -0.03526290878653526, + -0.02073245868086815, + -0.002637770026922226, + 0.04173924773931503, + -0.04340929538011551, + 0.077951580286026, + -0.01444941945374012, + -0.011738084256649017, + 0.016350843012332916, + -0.02821272611618042, + -0.07418119162321091, + 0.036476895213127136, + 0.02890392392873764, + 0.034054312855005264, + -0.045462511479854584, + 0.030400564894080162, + -0.02606666460633278, + 0.007741464767605066, + 0.1018223688006401 + ], + "glossy": [ + 0.060154736042022705, + 0.08533789962530136, + 0.033569544553756714, + -0.012701665982604027, + -0.0498223677277565, + -0.05736184120178223, + -0.018096113577485085, + 0.009652498178184032, + 0.009271644055843353, + 0.028019879013299942, + 0.028042009100317955, + 0.04014558717608452, + -0.13800282776355743, + 0.0404091440141201, + -0.09934942424297333, + 0.01293362956494093, + -0.027361461892724037, + -0.01402292400598526, + 0.01828772947192192, + 0.006478488445281982, + -0.05362239480018616, + 0.0809641107916832, + -0.03967078775167465, + -0.0062112207524478436, + 0.040801022201776505, + -0.06429138034582138, + -0.047462817281484604, + 0.03357694298028946, + -0.02524060569703579, + 0.00587424635887146, + -0.045851364731788635, + 0.03689055144786835, + -0.045519888401031494, + 0.007283284794539213, + 0.025257978588342667, + -0.023151181638240814, + 0.010622529312968254, + 0.032997965812683105, + -0.0346563383936882, + 0.07962298393249512, + 0.06442735344171524, + -0.016528120264410973, + -0.07576880604028702, + 0.060518402606248856, + 0.0007006390951573849, + -0.011372862383723259, + -0.08082349598407745, + 0.012794633395969868, + 0.09076425433158875, + -0.04021921008825302, + 0.06366147845983505, + 0.031114231795072556, + 0.11088187992572784, + 0.006749344989657402, + 0.025182019919157028, + -0.1133197695016861, + 0.013218598440289497, + -0.023537088185548782, + 0.07947453111410141, + 0.10422122478485107, + -0.002517216606065631, + 0.007326444145292044, + -0.02447952888906002, + 0.062429655343294144, + -0.015930715948343277, + -0.005151879042387009, + 0.031198643147945404, + -0.042888343334198, + 0.0019035086734220386, + 0.05402040109038353, + -0.06657073646783829, + -0.015449069440364838, + -0.058933429419994354, + -0.040310706943273544, + -0.012016067281365395, + 0.01257658377289772, + -0.0026539936661720276, + -0.02022591233253479, + -0.03143983334302902, + -0.05181380361318588, + 0.005008750129491091, + 0.02162773348391056, + -0.0516168475151062, + 0.01810383051633835, + 0.002318276558071375, + -0.023675251752138138, + 0.09523730725049973, + 0.0072965193539857864, + -0.03125558793544769, + 0.019376302137970924, + -0.06411618739366531, + -0.028963308781385422, + 0.06660420447587967, + -0.06451711058616638, + 0.13020282983779907, + 0.008149391040205956, + 0.05532445013523102, + 0.11213424056768417, + 0.015785375609993935, + 0.012866668403148651, + 0.03181066736578941, + -0.08560623973608017, + 0.03104279935359955, + 0.0027125482447445393, + -0.06350955367088318, + -0.02578955702483654, + -0.06887464970350266, + 0.04811936616897583, + 0.051246482878923416, + 0.003996230661869049, + 0.017583442851901054, + -0.05338769406080246, + 0.035798314958810806, + -0.1070295050740242, + -0.01854553632438183, + 0.02111685834825039, + 0.028462650254368782, + -0.006104608997702599, + 0.02396257035434246, + 0.020163357257843018, + 0.0594087690114975, + -0.02189681865274906, + -0.052842967212200165, + -0.0186598040163517, + -0.047427479177713394, + 0.006142558064311743, + 0.006979815661907196, + 0.045313719660043716, + 0.00033231425913982093, + -0.01917521469295025, + -0.06984928995370865, + -0.048757489770650864, + 0.010634922422468662, + -0.08178139477968216, + -0.010875852778553963, + 0.0638146847486496, + 0.005301911383867264, + -0.01339513249695301, + 0.2042466551065445, + -0.03525276109576225, + -0.005775311030447483, + -0.003693214850500226, + -0.014073983766138554, + -0.002923194319009781, + -0.006543876603245735, + 0.019990824162960052, + -0.01822894625365734, + -0.015624135732650757, + -0.018094932660460472, + -0.024057136848568916, + -0.08301185816526413, + -0.06995057314634323, + -0.0023056576028466225, + 0.0723307654261589, + -0.03417950123548508, + 0.027693623676896095, + 0.06080335006117821, + -0.04189009219408035, + 0.04347400739789009, + 0.14411553740501404, + 0.03103816695511341, + -0.0610186867415905, + 0.023776624351739883, + 0.020577505230903625, + -0.01327629666775465, + 0.0070142014883458614, + -0.05293341353535652, + 0.01778777316212654, + 0.006855097599327564, + 0.025642704218626022, + -0.05313191935420036, + 0.0452687032520771, + -0.030300315469503403, + -0.026775525882840157, + 0.0957181304693222, + 0.06212526187300682, + -0.041773803532123566, + -0.0026443481910973787, + -0.019996488466858864, + 0.06407878547906876, + -0.032889124006032944, + 0.07807302474975586, + -0.04144753888249397, + 0.03255735710263252, + -0.008665758185088634, + 0.026566334068775177, + 0.005787806585431099, + 0.009441769681870937, + -0.044236212968826294, + -0.05831688269972801, + -0.015898752957582474, + -0.03681717813014984, + -0.07638680189847946, + -0.01455080695450306, + -0.00161119201220572, + 0.11711399257183075, + 0.027824198827147484, + -0.03148743882775307, + -0.03531557321548462, + 0.05555395036935806, + 0.0824461504817009, + -0.0832773968577385, + -0.011755123734474182, + -0.0005548509652726352, + -0.016833152621984482, + 0.04692007973790169, + 0.0696694403886795, + 0.022980406880378723, + 0.20351271331310272, + 0.04178481921553612, + 0.023865366354584694, + -0.06326982378959656, + -0.107477106153965, + -0.055669549852609634, + -0.038878314197063446, + 0.03433717042207718, + 0.04100291058421135, + -0.08616053313016891, + -0.027582883834838867, + 0.13720205426216125, + 0.05576290190219879, + 0.07386591285467148, + 0.04570447653532028, + -0.0669466182589531, + -0.016371404752135277, + -0.04817456379532814, + 0.03265739232301712, + -0.01900528371334076, + -0.048291854560375214, + 0.050657160580158234, + 0.003020623465999961, + 0.013690686784684658, + -0.04168596863746643, + -0.025721419602632523, + -0.04057775065302849, + -0.008050547912716866, + 0.05188095197081566, + 0.02351834997534752, + 0.007819002494215965, + -0.01115109957754612, + -0.04179292544722557, + 0.03379577398300171, + -0.02401113510131836, + -0.053588397800922394, + 0.018920576199889183, + -0.01567169837653637, + -0.014650925062596798, + -0.09853095561265945, + -4.550955418380909e-05, + -0.08704118430614471, + -0.06592918932437897, + -0.013174871914088726, + -0.05078490823507309, + 0.016347112134099007, + -0.057022787630558014, + -0.04817096143960953, + 0.05366382747888565, + -0.026950988918542862, + -0.037109293043613434, + -0.017761366441845894, + 0.04210381209850311, + -0.0025933925062417984, + 0.1004629135131836, + 0.03940294682979584, + -0.03213484212756157, + 0.013420026749372482, + -0.03457289934158325, + -0.014236695133149624, + -0.0883551612496376, + -0.058152057230472565, + -0.03436831012368202, + 0.004927194677293301, + 0.04529852047562599, + 0.07074601203203201, + -0.012319697998464108, + -0.06676844507455826, + -0.059384383261203766, + -0.02694157138466835, + 0.042900342494249344, + -0.039692871272563934, + 0.02879127487540245, + 0.009455949068069458, + 0.07087209075689316, + -0.05771515518426895, + 0.07975685596466064, + 0.035922519862651825, + 0.10890401899814606, + 0.036362726241350174, + 0.03737914562225342, + -0.059196069836616516, + -0.0214198250323534, + -0.08353257924318314, + 0.02718154713511467, + -0.09122172743082047, + -0.05382608249783516, + 0.06808143109083176, + 0.010326515883207321, + -0.04422950744628906, + -0.008973573334515095, + -0.0005458188825286925, + 0.0031226291321218014, + 0.04460557922720909, + -0.005467702634632587, + -0.007175861392170191, + 0.10796919465065002, + 0.04284355789422989, + -0.0450420081615448, + -0.005607293918728828, + -0.00015818125393707305, + -0.029221344739198685, + -0.04474037140607834, + 0.028690239414572716, + 0.01186591200530529, + -0.07047420740127563, + -0.03418532758951187, + -0.058613453060388565, + -0.029313188046216965, + 0.03970452770590782, + -0.06477820128202438, + 0.022382449358701706, + -0.0013798155123367906, + -0.05621080845594406, + -0.06229844316840172, + 0.03217052295804024, + -0.09853524714708328, + -0.08367181569337845, + 0.1601882129907608, + -0.03253716230392456, + -0.03714299947023392, + 0.04180009663105011, + 0.015215354971587658, + -0.0370190367102623, + -0.01980636641383171, + 0.025614440441131592, + 0.0685674175620079, + -0.046587713062763214, + 0.09860341250896454, + -0.04747471585869789, + -0.05282321944832802, + 0.019415058195590973, + 0.03747162967920303, + 0.09760946780443192, + -0.023909656330943108, + 0.02927570417523384, + -0.07317514717578888, + 0.10144384205341339, + 0.033807042986154556, + -0.01580367237329483, + -0.057983122766017914, + 0.010575938038527966, + -0.02287779375910759, + 0.020698031410574913, + -0.02694709785282612, + -0.014440704137086868, + 0.044471703469753265, + 0.0777192935347557, + 0.022571977227926254, + -0.04818308725953102, + 0.040575362741947174, + 0.02879553847014904, + -0.08417551964521408, + 0.006865909323096275, + 0.012164310552179813, + -0.007677756249904633, + -0.034034255892038345, + -0.04447271302342415, + -0.008311030454933643, + -0.027247069403529167, + 0.07688016444444656, + -0.0006173572037369013, + 0.007649889215826988, + 0.008232240565121174, + 0.010134922340512276, + 0.013474002480506897, + 0.04651389271020889, + -0.03604676574468613, + 0.01582069881260395, + -0.01623271033167839, + 0.06320947408676147, + -0.03831561282277107, + -0.0476020872592926, + -0.004052466247230768, + 0.07461541146039963, + 0.03792937844991684 + ], + "grid": [ + -0.08996465057134628, + 0.05544624477624893, + -0.029747702181339264, + 0.007057216018438339, + -0.049469489604234695, + 0.011049894616007805, + 0.03819899633526802, + -0.014956858940422535, + -0.03229490667581558, + 0.021401122212409973, + 0.030403506010770798, + -0.036418672651052475, + -0.047938212752342224, + 0.04605652391910553, + -0.008698077872395515, + -0.06991394609212875, + 0.03302299976348877, + -0.03236499801278114, + -0.05294905602931976, + -0.04409412294626236, + -0.02987891063094139, + 0.11125178635120392, + -0.03158320114016533, + 0.006500073242932558, + 0.06673514097929001, + -0.020826438441872597, + 0.014057189226150513, + 0.062376320362091064, + 0.003183112246915698, + 0.036116790026426315, + -0.031301237642765045, + 0.02659975178539753, + -0.04447450488805771, + 0.04603062570095062, + -0.058205168694257736, + -0.009866650216281414, + -0.036146290600299835, + -0.06061572954058647, + 0.014791734516620636, + 0.06452886015176773, + -0.06894003599882126, + 0.06335780024528503, + -0.021418506279587746, + 0.0856797844171524, + -0.016928017139434814, + 0.05611872300505638, + -0.04446101188659668, + 0.001302622607909143, + 0.0030989227816462517, + 0.09748135507106781, + 0.017161386087536812, + 0.08334074914455414, + -0.0165488850325346, + 0.07888181507587433, + -0.05288855358958244, + -0.029345637187361717, + -0.0393645279109478, + -0.044845737516880035, + -0.05232848972082138, + -0.048096492886543274, + 0.05182375758886337, + -0.125209778547287, + -0.007454974111169577, + 0.10576524585485458, + 0.021430358290672302, + 0.034876689314842224, + 0.07178150117397308, + 0.017472466453909874, + 0.07398948073387146, + -0.0768171101808548, + -0.05143553391098976, + 0.027178864926099777, + -0.04064926505088806, + -0.032377757132053375, + -0.03868548199534416, + -0.04686243459582329, + -0.04557862877845764, + 0.07577836513519287, + -0.010236373171210289, + -0.03900910168886185, + 0.008479252457618713, + 0.0023958003148436546, + -0.021734319627285004, + -0.009323842823505402, + 0.07021304219961166, + -0.018053855746984482, + 0.08093862980604172, + -0.004495362285524607, + 0.04249515011906624, + -0.02770521678030491, + -0.006321779917925596, + 0.023762935772538185, + -0.0007912360597401857, + -0.07416291534900665, + 0.09074593335390091, + 0.09841288626194, + 0.017643820494413376, + 0.06737524271011353, + -0.02000756375491619, + -0.05503440648317337, + -0.011025963351130486, + 0.042059965431690216, + 0.045525357127189636, + 0.03917381539940834, + 0.034736160188913345, + -0.029967954382300377, + -0.041904017329216, + -0.04176989197731018, + 0.08763794600963593, + 0.023622049018740654, + -0.048927243798971176, + -0.0946134403347969, + -0.08695477247238159, + -0.1059894934296608, + 0.0436587855219841, + -0.01983490400016308, + -0.04970456659793854, + -0.024505769833922386, + 0.059394318610429764, + 0.10824192315340042, + 0.023466095328330994, + -0.02933882549405098, + -0.0671204924583435, + -0.027219947427511215, + -0.048731353133916855, + 0.04029042646288872, + 0.0420275442302227, + -0.01118133869022131, + -0.04015098884701729, + 0.0812743678689003, + 0.047330744564533234, + -0.03666729852557182, + 0.02388565056025982, + -0.06458459794521332, + 0.022877782583236694, + 0.13100619614124298, + 0.0018927458440884948, + -0.02770761027932167, + 0.1254718154668808, + -0.001499571604654193, + 0.038017675280570984, + 0.02418004348874092, + -0.05457921326160431, + -0.04198676720261574, + -0.03581877052783966, + 0.039861224591732025, + -0.04792574793100357, + 0.08271530270576477, + 0.0022950172424316406, + 0.036720555275678635, + 0.013636152260005474, + -0.021203255280852318, + 0.051947757601737976, + 0.007781386375427246, + 0.013551129028201103, + -0.0021804440766572952, + -0.03452613204717636, + -0.0021649813279509544, + 0.011681381613016129, + 0.039823248982429504, + 0.006269250065088272, + -0.031496766954660416, + 0.01921043172478676, + 0.027409804984927177, + -0.06288072466850281, + -0.07664734870195389, + -0.05265416204929352, + -0.027243200689554214, + 0.02901189588010311, + -0.0139412060379982, + 0.06233195215463638, + 0.00953582301735878, + -0.0022000870667397976, + 0.09255164861679077, + 0.006045535672456026, + 0.08402462303638458, + -0.02546098455786705, + -0.0954408347606659, + 0.0030101551674306393, + 0.07994820177555084, + 0.04911069571971893, + -0.010661538690328598, + 0.01394062489271164, + 0.05240366607904434, + 0.02189914509654045, + -0.03236356005072594, + 0.01960652880370617, + 0.11515902727842331, + -0.07988154143095016, + 0.04349218308925629, + 0.06006408855319023, + -0.015580479986965656, + -0.011301622726023197, + 0.05375545471906662, + 0.019465388730168343, + 0.04201547056436539, + 0.07715008407831192, + 0.013171298429369926, + -0.011209431104362011, + -0.014054358936846256, + -0.03999698534607887, + -0.021724656224250793, + 0.10176973789930344, + 0.005688061006367207, + -0.05052461847662926, + 0.01755744032561779, + -0.04384921118617058, + -0.10002605617046356, + -0.003353829961270094, + 0.04733388125896454, + -0.09442728757858276, + -0.06449863314628601, + -0.04715629667043686, + -0.005385273601859808, + 0.036408524960279465, + -0.02729957550764084, + 0.08525028824806213, + 0.002218051813542843, + -0.05685310438275337, + 0.04369648918509483, + -0.009151685051620007, + 0.06213318184018135, + -0.04875229671597481, + -0.007614464033395052, + -0.05238485336303711, + -0.03408971056342125, + 0.002016419777646661, + 0.04614174738526344, + -0.06261635571718216, + 0.06229805573821068, + 0.012016874738037586, + 0.042706266045570374, + -0.005869431421160698, + 0.007912290282547474, + -0.016499843448400497, + -0.004193949047476053, + 0.02008959837257862, + -0.04196067526936531, + -0.016576526686549187, + 0.07083979994058609, + -0.013429677113890648, + 0.011951213702559471, + -0.0399598553776741, + -0.03600612282752991, + -0.05570850893855095, + 0.02711721695959568, + 0.05370675027370453, + -0.03549708425998688, + -0.004805784672498703, + -0.06728216260671616, + 0.0086430124938488, + -0.008048474788665771, + -0.004283658694475889, + 0.05588369816541672, + -0.018373308703303337, + -0.022884361445903778, + -0.027681952342391014, + -0.04968412593007088, + 0.033061251044273376, + 0.03150920197367668, + -0.03245365619659424, + -0.09734535217285156, + 0.030329596251249313, + 0.02100476622581482, + 0.07982616126537323, + 0.02786947600543499, + 0.04151443392038345, + -0.029709694907069206, + 0.030062707141041756, + -0.19008851051330566, + -0.0041314042173326015, + -0.016211451962590218, + 0.006238438654690981, + 0.023901961743831635, + -0.007381814531981945, + -0.07346324622631073, + -0.04040761664509773, + -0.05698871985077858, + -0.009625596925616264, + -0.030059972777962685, + 0.011095616966485977, + -0.025354430079460144, + -0.05413312837481499, + -0.042953141033649445, + 0.021395506337285042, + 0.014510517939925194, + 0.04829621687531471, + 0.015794938430190086, + -0.0443200059235096, + -0.0012612134451046586, + -0.011199063621461391, + 0.0029668661300092936, + -0.033484071493148804, + -0.04598843678832054, + -0.13305094838142395, + 0.05494624748826027, + 0.05683092772960663, + -0.012516125105321407, + 0.09336680173873901, + -0.017688969150185585, + -0.05948951095342636, + 0.0720624327659607, + 0.07203776389360428, + -0.02683134563267231, + -0.040591441094875336, + -0.09756894409656525, + -0.029370563104748726, + -0.05296679213643074, + 0.05850924178957939, + 0.003297054208815098, + 0.08997602015733719, + 2.084570269289543e-06, + -0.01628471538424492, + 0.07414565235376358, + 0.03881780430674553, + 0.021925393491983414, + -0.09618111699819565, + 0.06751496344804764, + -0.12908007204532623, + 0.002815085230395198, + 0.018672475591301918, + 0.010501613840460777, + -0.018220851197838783, + 0.06259410083293915, + -0.03824344649910927, + -0.05426185578107834, + 0.04839714989066124, + -0.034673091024160385, + 0.09922116249799728, + -0.007121141534298658, + -0.013677875511348248, + 0.10158124566078186, + -0.0473092719912529, + -0.038089822977781296, + -0.04282771050930023, + -0.05297226831316948, + 0.10615932941436768, + 0.014481288380920887, + -0.038639143109321594, + -0.02359744906425476, + -0.012522131204605103, + 0.026072176173329353, + 0.0336894653737545, + 0.11236108839511871, + 0.012549513950943947, + 0.03575387969613075, + -0.005554910749197006, + 0.1021021232008934, + -0.06782333552837372, + 0.07123206555843353, + -0.0964195504784584, + -0.007771934382617474, + 0.040421247482299805, + -0.0031950133852660656, + -0.0016965992981567979, + 0.07262427359819412, + 0.04527685418725014, + 0.04751613363623619, + 0.04129098355770111, + -0.003233914263546467, + -0.08441159129142761, + 0.02501511014997959, + -0.043516606092453, + 0.028718193992972374, + -0.04905638471245766, + -0.056111399084329605, + -0.046004652976989746, + 0.04136606305837631, + 0.03014753945171833, + -0.028636042028665543, + 0.00033323615207336843, + -0.052830398082733154, + -0.12880565226078033, + 0.04914989322423935, + 0.01002976018935442, + -0.06514012068510056, + 0.04823059216141701, + 0.004152931738644838, + -0.022031618282198906, + -0.03020881675183773, + -0.04872800409793854, + -0.05224093049764633, + -0.008907613344490528, + 0.0973784327507019 + ], + "ground": [ + 0.012447567656636238, + 0.027601270005106926, + 0.04028629884123802, + 0.056269630789756775, + 0.04054536297917366, + -0.01381603628396988, + 0.0527622327208519, + -0.021470004692673683, + -0.07006213814020157, + -0.01632983796298504, + -0.010934926569461823, + -0.06862214207649231, + 0.04207506403326988, + 0.006441849283874035, + -0.07572019100189209, + -0.0064660473726689816, + 0.0031322729773819447, + 0.06059642881155014, + 0.053517989814281464, + -0.06641895323991776, + -0.0008380539366044104, + 0.028014779090881348, + -0.06619280576705933, + 2.0387267795740627e-05, + -0.030952101573348045, + 0.06141596660017967, + -0.06696569174528122, + 0.027704564854502678, + 0.009909795597195625, + -0.04084113985300064, + -0.01738656498491764, + 0.02370854839682579, + -0.05821293592453003, + 0.02737143263220787, + -0.021184388548135757, + -0.05487682297825813, + 0.052908916026353836, + -0.1384277045726776, + 0.11321544647216797, + 0.0029317731969058514, + -0.016240395605564117, + -0.06680845469236374, + 0.06618484854698181, + -0.007886393927037716, + -0.0649939775466919, + 0.0037159493658691645, + -0.049117572605609894, + -0.0244990773499012, + -0.09984549134969711, + 0.05103789642453194, + -0.0003624824748840183, + -0.014203189872205257, + -0.08436793833971024, + 0.043181560933589935, + -0.015900814905762672, + -0.06304318457841873, + 0.02746134251356125, + -0.0986785888671875, + -0.001206062501296401, + -0.06420614570379257, + 0.13345663249492645, + -0.08748689293861389, + 0.0060928380116820335, + 0.03732724115252495, + -0.006835715379565954, + -0.004612995311617851, + 0.06653370708227158, + -0.01706203818321228, + 0.020309867337346077, + -0.025816630572080612, + -0.0034848207142204046, + 0.004381198901683092, + -0.02502303197979927, + -0.030350159853696823, + 0.006989767774939537, + 0.06079094484448433, + 0.0585770308971405, + 0.03343351185321808, + -0.040209803730249405, + -0.008489149622619152, + 0.029934562742710114, + -0.047530900686979294, + 0.024743428453803062, + -0.048293713480234146, + -0.024337852373719215, + 0.013213141821324825, + 0.036500975489616394, + 0.02885965257883072, + 0.07463441789150238, + -0.0646408423781395, + 0.044041071087121964, + -0.034185636788606644, + 0.09289232641458511, + -0.006544333416968584, + 0.030474690720438957, + -0.01049406360834837, + -0.02151503972709179, + 0.08896273374557495, + -0.06813815981149673, + -0.0009063875768333673, + -0.0757393166422844, + -0.022811461240053177, + -0.05745590478181839, + 0.16925068199634552, + 0.033127572387456894, + -0.041106995195150375, + 0.03339711204171181, + -0.040136925876140594, + 0.0728173553943634, + -0.025145946070551872, + 0.023379921913146973, + -0.00867360457777977, + 0.01238414365798235, + -0.005271656438708305, + 0.009584984742105007, + 0.0037776241078972816, + 0.027125654742121696, + -0.036508653312921524, + -0.057949937880039215, + -0.049443382769823074, + -0.03529148921370506, + 0.01771567016839981, + 0.014018398709595203, + 0.10100419819355011, + 0.019640691578388214, + 0.0333905965089798, + 0.0022881212644279003, + -0.0008684016647748649, + -0.07215306162834167, + 0.001387369935400784, + 0.01145150139927864, + 0.04301244392991066, + -0.01751326024532318, + -0.10189062356948853, + -0.07423166185617447, + -0.024995630607008934, + 0.031044796109199524, + -0.05990709736943245, + 0.01717708446085453, + 0.02723785676062107, + -0.018947197124361992, + 0.087871253490448, + -0.013852259144186974, + -0.04225348308682442, + 0.012467687018215656, + 0.053118690848350525, + -0.03592332452535629, + -0.07141855359077454, + 0.029748747125267982, + 0.04350320249795914, + -0.004690630827099085, + 0.009069474413990974, + 0.013253187760710716, + 0.09476643800735474, + 0.0019270546035841107, + 0.08054520934820175, + 0.0596337765455246, + 0.0067295050248503685, + -0.005652544088661671, + 0.06246189400553703, + -0.051878757774829865, + 0.11506824195384979, + 0.07097980380058289, + 0.021011319011449814, + -0.025125155225396156, + -0.03268668055534363, + 0.017618868499994278, + -0.08479616791009903, + -0.026795467361807823, + 0.022225171327590942, + -0.046367861330509186, + 0.057738326489925385, + -0.08311695605516434, + -0.012012859806418419, + 0.07581409066915512, + -0.03392718359827995, + -0.005051637999713421, + -0.12278726696968079, + -0.007456931285560131, + 0.04116043448448181, + 0.06209054961800575, + -0.06877344846725464, + -0.06184417009353638, + -0.01737714558839798, + 0.014009100385010242, + -0.049620699137449265, + -0.015889734029769897, + -0.03689277917146683, + 0.016403133049607277, + 0.028020694851875305, + 0.008338402025401592, + 0.03645610809326172, + -0.07485008984804153, + 0.0224491897970438, + 0.07455930858850479, + -0.022505998611450195, + 0.0319439098238945, + 0.02781231328845024, + -0.009790679439902306, + 0.0746873989701271, + 0.08381633460521698, + -0.019948823377490044, + 0.017496667802333832, + -0.008605383336544037, + -0.041755612939596176, + 0.045411366969347, + -0.0024086509365588427, + 0.04114095866680145, + 0.07371153682470322, + 0.01626248098909855, + -0.03205333650112152, + -0.08255186676979065, + -0.07631444931030273, + -0.09632321447134018, + 0.05826864019036293, + 0.06877773255109787, + 0.08769573271274567, + 0.02448124624788761, + 0.01110091619193554, + 0.07729580998420715, + 0.017919322475790977, + 0.029398230835795403, + -0.0007627659942954779, + 0.07034365832805634, + 0.010709851048886776, + -0.07137464731931686, + -0.04641061648726463, + 0.005702163092792034, + 0.02863530069589615, + -0.02636139653623104, + 0.014101698994636536, + 0.01360323652625084, + -0.017145080491900444, + -0.07454085350036621, + -0.004525430966168642, + -0.04442666098475456, + -0.005350535735487938, + 0.021993488073349, + 0.002744788769632578, + -0.09734324365854263, + -0.017902962863445282, + 0.0018501667072996497, + -0.0003043406759388745, + -0.005978699773550034, + -0.1396002471446991, + -0.1474817842245102, + 0.0956442579627037, + 0.0010374252451583743, + -0.0207804087549448, + 0.009184218943119049, + -0.05365526303648949, + -0.016505908221006393, + 0.036910466849803925, + -0.04286288097500801, + -0.09005171060562134, + 0.04319458827376366, + -0.0684288740158081, + -0.03365826606750488, + -0.01243425253778696, + -0.06979302316904068, + -0.0068334126845002174, + -0.07799714803695679, + -0.0025654537603259087, + 0.03785328567028046, + 0.010106734931468964, + 0.12500058114528656, + 0.006220660638064146, + -0.07863771170377731, + -0.019074922427535057, + 0.00477673439309001, + -0.040583766996860504, + 0.04200981557369232, + 0.08347702771425247, + 0.03885028138756752, + -0.057702235877513885, + 0.009070662781596184, + -0.05679375305771828, + -0.07436080276966095, + -0.0052923783659935, + 0.012499532662332058, + -0.01940043829381466, + -0.015340679325163364, + 0.06075511500239372, + -0.009365197271108627, + -0.014665632508695126, + 0.01602691039443016, + -0.04717525839805603, + 0.028595170006155968, + 0.03913401812314987, + -0.07643098384141922, + -0.016189321875572205, + -0.0014797165058553219, + -0.013286719098687172, + 0.09952569752931595, + 0.07629731297492981, + -0.004301862791180611, + 0.02783847786486149, + -0.011403021402657032, + 0.009626324288547039, + -0.007460935972630978, + 0.010545357130467892, + 0.09316273033618927, + -0.040521226823329926, + 0.04143534600734711, + -0.04755184426903725, + -0.029146665707230568, + -0.08523350208997726, + 0.05492215231060982, + -0.01930825039744377, + -0.08175326138734818, + -0.018342332914471626, + 0.027963602915406227, + 0.03179757297039032, + 0.04832486808300018, + -0.01591568998992443, + -0.05224691703915596, + -0.0850040540099144, + 0.09460650384426117, + -0.025021560490131378, + -0.00347131653688848, + 0.000641133519820869, + 0.025818929076194763, + 0.012574657797813416, + 0.03189991042017937, + 0.008937353268265724, + 0.024681884795427322, + 0.0106726735830307, + -0.053707584738731384, + -0.014984003268182278, + 0.0023978985846042633, + 0.03848233073949814, + 0.021612610667943954, + -0.03016996569931507, + 0.014823496341705322, + 0.06934694200754166, + 0.013653463684022427, + 0.12191987037658691, + -0.0931914746761322, + 0.0005211264360696077, + 0.05293168127536774, + -0.00734009500592947, + -0.062498848885297775, + -0.0020882494281977415, + 0.08107707649469376, + 0.028985556215047836, + 0.0008253339328803122, + 0.06567247211933136, + -0.09229053556919098, + 0.037482667714357376, + 0.046421632170677185, + -0.0338444784283638, + 0.008065742440521717, + -0.010739571414887905, + 0.03862018138170242, + 0.09967438131570816, + -0.03891880810260773, + -0.06708218902349472, + -0.05396187677979469, + 0.11527178436517715, + 0.039416126906871796, + 0.00022448867093771696, + -0.04091356694698334, + 0.017033513635396957, + 0.046821653842926025, + -0.011018183082342148, + 0.012828405946493149, + 0.027159756049513817, + 0.031219730153679848, + 0.031239453703165054, + 0.04955548048019409, + 0.01376020535826683, + 0.0036639359313994646, + 0.03500424697995186, + 0.1352614164352417, + -0.0356224849820137, + -0.03876589238643646, + 0.07215803861618042, + 0.0056271301582455635, + -0.11081207543611526, + 0.028768043965101242, + -0.1496909260749817, + -0.020431730896234512, + -0.016210848465561867, + 0.05180063843727112 + ], + "matte": [ + 0.05677774176001549, + 0.06790140271186829, + 0.02642800472676754, + -0.03378962352871895, + -0.0041438001208007336, + -0.003141143824905157, + 0.015454016625881195, + -0.026056885719299316, + -0.03376428782939911, + -0.02045852318406105, + 0.023683035746216774, + 0.013477811589837074, + -0.016325615346431732, + 0.002192540094256401, + -0.08288177847862244, + -0.04788602516055107, + -0.002987857209518552, + -0.04149135947227478, + -0.02793269418179989, + -0.06079958379268646, + -0.010049857199192047, + 0.031886518001556396, + -0.04488971084356308, + 0.030343635007739067, + 0.025063933804631233, + -0.0554380938410759, + 0.0009574907599017024, + -0.005733060650527477, + 0.07006616145372391, + -0.0011502306442707777, + -0.03987772762775421, + 0.06098717451095581, + -0.10279392451047897, + -0.027562715113162994, + -0.062340930104255676, + -0.08741395175457001, + -0.012201962992548943, + -0.03063131682574749, + -0.08296898007392883, + 0.02450956590473652, + 0.0035658180713653564, + -0.061241116374731064, + -0.002972289687022567, + 0.07982293516397476, + -0.053462132811546326, + 0.01805894635617733, + 1.5240194443322252e-05, + 0.02859685756266117, + -0.017203504219651222, + 0.08305250853300095, + 0.020822063088417053, + 0.04192794859409332, + -0.024343477562069893, + -0.005528399720788002, + 0.014826850965619087, + -0.003028527833521366, + -0.02069772593677044, + 0.008043411187827587, + -0.04543522000312805, + -0.034504104405641556, + 0.047469284385442734, + -0.09214282035827637, + -0.0013453932479023933, + 0.06385751068592072, + -0.027392910793423653, + -0.024756411090493202, + 0.006064486224204302, + 0.033013977110385895, + 0.0859304741024971, + 0.03393259644508362, + -0.0338212214410305, + 0.08117599785327911, + -0.040065109729766846, + -0.026629352942109108, + -0.06478722393512726, + -0.003059784648939967, + 0.032127831131219864, + 0.08191493153572083, + -0.05296386778354645, + -0.06269729882478714, + 0.032741934061050415, + -0.01979932002723217, + -0.05548931285738945, + 0.003606744110584259, + 0.12687216699123383, + -0.018311023712158203, + 0.025997383520007133, + -0.006187920458614826, + 0.014498149044811726, + -0.08392633497714996, + -0.0009356400114484131, + -0.07410939037799835, + 0.10446394234895706, + -0.05681790038943291, + 0.028593573719263077, + 0.09496618807315826, + 0.0553118959069252, + 0.11553147435188293, + -0.040533483028411865, + -0.08217649161815643, + 0.06301609426736832, + 0.0004494334280025214, + 0.023505503311753273, + 0.15231548249721527, + 0.05129591375589371, + -0.048071883618831635, + -0.039681147783994675, + 0.02526329830288887, + 0.08805950731039047, + -0.010221357457339764, + -0.0031206305138766766, + -0.08127640932798386, + -0.10507197678089142, + -0.05414459481835365, + -0.020306110382080078, + -0.009749924764037132, + -0.019513428211212158, + 0.024966569617390633, + 0.022053517401218414, + 0.034484051167964935, + -0.012840848416090012, + 0.012395701371133327, + -0.011062287725508213, + 0.0023573695216327906, + -0.005904282908886671, + 0.005685324314981699, + -0.042059581726789474, + 0.08140422403812408, + -0.029932906851172447, + 0.07136133313179016, + 0.018551351502537727, + 0.02272268757224083, + -0.009023324586451054, + -0.031219609081745148, + -0.007436866872012615, + 0.08801934868097305, + 0.05354844406247139, + -0.0072994413785636425, + 0.11728928238153458, + 0.06224428862333298, + 0.06280343979597092, + 0.05225785821676254, + 0.00787340011447668, + 0.06717284768819809, + -0.047198858112096786, + -0.008464678190648556, + -0.01114348229020834, + 0.012340676970779896, + 0.029102874919772148, + 0.03415577858686447, + -0.01554018072783947, + -0.04138149321079254, + 0.09962973743677139, + 0.01810004562139511, + 0.0042559062130749226, + -0.009588470682501793, + 0.025634201243519783, + 0.02719966694712639, + -0.02257823571562767, + 0.052777525037527084, + 0.0597229041159153, + 0.03726571425795555, + 0.023877866566181183, + 0.0020380474161356688, + -0.06282168626785278, + -0.0005903742276132107, + -0.05498757213354111, + -0.042985256761312485, + -0.007394254673272371, + 0.0032165739685297012, + 0.045070767402648926, + -0.06169750913977623, + -0.07144647091627121, + 0.0785713642835617, + -0.0034671237226575613, + 0.07098401337862015, + -0.017562691122293472, + -0.05496378615498543, + -0.04400768131017685, + 0.06848155707120895, + 0.019675347954034805, + 0.017103400081396103, + 0.015557424165308475, + 0.03826833516359329, + 0.03680448979139328, + 0.035652000457048416, + 0.06706095486879349, + 0.019735049456357956, + -0.056950394064188004, + 0.078133225440979, + -0.011149155907332897, + 0.0050000837072730064, + -0.029467040672898293, + 0.002507955301553011, + 0.043175745755434036, + 0.02640513703227043, + 0.09363362938165665, + -0.060871049761772156, + -0.0486612394452095, + 0.0037788390181958675, + -0.019757743924856186, + -0.0145772285759449, + 0.054709918797016144, + 0.01853889785706997, + -0.04109306260943413, + 0.044041313230991364, + -0.042112283408641815, + -0.08121941238641739, + 0.09746620059013367, + 0.026242895051836967, + -0.02236482873558998, + -0.14895066618919373, + -0.03820030018687248, + -0.008835257962346077, + 0.04844843968749046, + -0.024475449696183205, + 0.05273905396461487, + -0.0361483171582222, + -0.08028635382652283, + 0.07717041671276093, + 0.00921087060123682, + 0.05199715495109558, + -0.006754404865205288, + 0.07826559245586395, + -0.010295163840055466, + 0.019860100001096725, + 0.0430150032043457, + 0.005662097129970789, + -0.031477220356464386, + 0.007133574690669775, + 0.018828408792614937, + -0.023962436243891716, + -0.0660979151725769, + -0.03178681805729866, + -0.03749123215675354, + -0.008618960157036781, + -0.009592823684215546, + 0.010180940851569176, + -0.03554060682654381, + 0.0679197683930397, + 0.007629824336618185, + 0.03516768291592598, + -0.022999748587608337, + -0.014649941585958004, + -0.044303905218839645, + 0.012390739284455776, + 0.08969084173440933, + 0.004109618719667196, + -0.03233394771814346, + -0.1411127895116806, + -0.03490646928548813, + 0.020957639440894127, + 0.022913921624422073, + 0.03521016985177994, + -0.0872362032532692, + -0.030332058668136597, + 0.04367036744952202, + -0.021569903939962387, + -0.0024088381323963404, + 0.06347610801458359, + -0.054268814623355865, + -0.04992283880710602, + 0.08224305510520935, + 0.07098803669214249, + 0.08773016929626465, + 0.05762976408004761, + 0.05383521690964699, + -0.03291699290275574, + -0.024653255939483643, + -0.12871716916561127, + -0.05509485676884651, + 0.02965119667351246, + 0.07753453403711319, + 0.013367095962166786, + -0.048644423484802246, + -0.006918754428625107, + -0.0686531662940979, + -0.049944695085287094, + 0.0037780404090881348, + 0.06937573850154877, + -0.03754395246505737, + -0.038229573518037796, + -0.06842686980962753, + 0.019770633429288864, + 0.058232784271240234, + 0.04046858474612236, + 0.056756455451250076, + 0.041114840656518936, + -0.07065974920988083, + -0.12976638972759247, + -0.030673982575535774, + -0.00620458647608757, + -0.039491619914770126, + -0.04979180544614792, + -0.006223493721336126, + 0.01955915056169033, + 0.025782376527786255, + -0.03817707300186157, + 0.08919309079647064, + -0.02706209383904934, + -0.026129672303795815, + 0.06263326108455658, + 0.13219624757766724, + -0.03777729347348213, + -0.05295513942837715, + -0.02476007677614689, + -0.0805424153804779, + 0.02778695523738861, + 0.03175567835569382, + -0.005843702703714371, + 0.08454214781522751, + -0.006742848549038172, + 0.08786158263683319, + -0.03574468195438385, + -0.007904413156211376, + -0.06234198808670044, + -0.07960177212953568, + 0.10692490637302399, + -0.1088334321975708, + -0.07617156207561493, + 0.03756754472851753, + -0.03745752200484276, + -0.04664669558405876, + -0.06890343874692917, + -0.045720331370830536, + 0.0021505600307136774, + 0.10398466885089874, + -0.008875459432601929, + 0.01923261769115925, + 0.09474301338195801, + 0.021631130948662758, + 0.023689983412623405, + 0.016738850623369217, + -0.023632580414414406, + 0.016950655728578568, + -0.06163690984249115, + 0.05820518732070923, + -0.05654032900929451, + -0.04915877431631088, + 0.0010624350979924202, + -0.03196188062429428, + -0.04742853716015816, + -0.014242795296013355, + -0.0009930486558005214, + -0.02470376156270504, + 0.04612528160214424, + -0.00899250153452158, + 0.016650158911943436, + -0.00916963815689087, + -0.014878565445542336, + -0.039362527430057526, + -0.06309202313423157, + -0.013765682466328144, + 0.021396927535533905, + 0.0373225100338459, + 0.007970106787979603, + 0.027568330988287926, + -0.09281304478645325, + 0.10025259107351303, + 0.07231961935758591, + -0.08290497213602066, + -0.0031850296072661877, + -0.06744234263896942, + 0.09865806251764297, + -0.07614970207214355, + -0.024648256599903107, + 0.016355253756046295, + 0.04543190076947212, + 0.04236937314271927, + -0.0005907545564696193, + 0.07162480801343918, + 0.030422896146774292, + 0.010477876290678978, + 0.07814664393663406, + 0.00872852373868227, + -0.05312221869826317, + 0.01306833978742361, + 0.030473409220576286, + -0.02129390463232994, + -0.02998058870434761, + -0.017326900735497475, + -0.048028357326984406, + 0.06352806836366653, + 0.12988577783107758 + ], + "mettalic": [ + 0.048885785043239594, + 0.0947771817445755, + 0.013311401009559631, + -0.04224319010972977, + -0.05694546923041344, + -0.05245720595121384, + -0.017000459134578705, + -0.08924317359924316, + 0.08646305650472641, + 0.06570880115032196, + -0.028774656355381012, + 0.024160584434866905, + -0.10387840867042542, + 0.07216048985719681, + -0.09300558269023895, + 0.05527951195836067, + -0.01784764789044857, + -0.024784041568636894, + -0.02754868008196354, + 0.016855059191584587, + 0.044382184743881226, + 0.06325194239616394, + -0.02507593296468258, + 0.001648048171773553, + -0.018890783190727234, + -0.03173987567424774, + -0.01663263328373432, + 0.033704258501529694, + -0.014547524973750114, + 0.04916687682271004, + -0.027574891224503517, + -0.041957538574934006, + -0.04461665078997612, + 0.024940745905041695, + -0.03922424837946892, + -0.012247418984770775, + 0.015512892976403236, + 0.08080749213695526, + -0.06766309589147568, + 0.12427002936601639, + 0.06532137840986252, + 0.057066451758146286, + -0.057812947779893875, + 0.04555647820234299, + 0.0015209022676572204, + -0.028905978426337242, + -0.06600746512413025, + 0.05030011385679245, + 0.05719854310154915, + 0.03132264316082001, + 0.02226225659251213, + 0.004697217606008053, + 0.08240807056427002, + -0.021853599697351456, + 0.012260522693395615, + 0.002074182266369462, + 0.0007692596991546452, + -0.00635044788941741, + -0.010949754156172276, + 0.062120258808135986, + 0.006188275758177042, + -0.04631456732749939, + 0.023842593654990196, + 0.036653704941272736, + -0.05959964543581009, + -0.031551774591207504, + 0.05817413330078125, + 0.05684022232890129, + 0.027695151045918465, + 0.0481182336807251, + -0.030558409169316292, + 0.0025320365093648434, + -0.06844142824411392, + -0.06526008993387222, + -0.07051394134759903, + 0.061194222420454025, + 0.03182906657457352, + 0.08179405331611633, + -0.0613589845597744, + -0.07266861945390701, + 0.034495290368795395, + 0.04198307543992996, + -0.12580005824565887, + -0.03951525688171387, + -0.05569855868816376, + -0.03966834768652916, + 0.04981766268610954, + -0.028669709339737892, + -0.08300522714853287, + -0.007084006443619728, + -0.024872835725545883, + 0.043599482625722885, + 0.07988826185464859, + -0.0009266814449802041, + 0.17185968160629272, + 0.02831583470106125, + 0.06965837627649307, + 0.08180239051580429, + -0.04880659654736519, + -0.04004892706871033, + -0.06558424234390259, + -0.002173371147364378, + -0.0017113464418798685, + -0.00031819907599128783, + -0.028561493381857872, + 0.0034814041573554277, + 0.043029721826314926, + 0.03803316131234169, + 0.020458728075027466, + 0.0013285877648741007, + 0.02398589439690113, + -0.08832524716854095, + -0.0007636211230419576, + -0.0927746593952179, + 0.03339652717113495, + -0.036640871316194534, + 0.010091504082083702, + 0.008517456240952015, + 0.0364934466779232, + 0.059830594807863235, + 0.007546588312834501, + -8.359080675290897e-05, + -0.04281909391283989, + -0.009490239433944225, + -0.03020884096622467, + 0.038858603686094284, + 0.06336264312267303, + -0.0027884289156645536, + 0.005106039810925722, + -0.0065256450325250626, + -0.040111854672431946, + 0.011942705139517784, + 0.0822954997420311, + -0.00044459811761043966, + -0.010773958638310432, + 0.07628713548183441, + 0.03791853412985802, + 0.04340364411473274, + 0.1566469669342041, + 0.010617117397487164, + 0.01648222841322422, + 0.005008050240576267, + -0.05695222318172455, + -0.0019096144242212176, + -0.07922794669866562, + -0.03230699896812439, + -0.007623487617820501, + 0.01923545077443123, + 0.0033016824163496494, + -0.00045758677879348397, + -0.09064874798059464, + -0.02476893737912178, + -0.016868285834789276, + 0.07498562335968018, + -0.0017383312806487083, + -0.07793164253234863, + -0.03901716694235802, + -0.004772206302732229, + 0.08136679232120514, + 0.05925562232732773, + -0.022112317383289337, + -0.021421203389763832, + 0.03271150216460228, + 0.02904707007110119, + -0.05012056231498718, + -0.048104606568813324, + -0.029431983828544617, + -0.05218476429581642, + -0.0084584541618824, + 0.029259979724884033, + -0.05567964166402817, + 0.04196525365114212, + -0.030931321904063225, + -0.09136303514242172, + 0.022805683314800262, + -0.020491797477006912, + -0.02582441084086895, + -0.007006452884525061, + -0.04086484760046005, + 0.12545138597488403, + -0.04175461456179619, + 0.028527861461043358, + -0.012227555736899376, + 0.10454993695020676, + -0.03497890383005142, + -0.04173542559146881, + -0.019480518996715546, + 0.0695955827832222, + -0.04651910811662674, + 0.0034042159095406532, + 0.04737062379717827, + -0.040250200778245926, + -0.015464804135262966, + -0.08463646471500397, + 0.0518595352768898, + 0.09266404807567596, + -0.053875405341386795, + -0.07023565471172333, + -0.07482368499040604, + 0.01468590646982193, + -0.007462977431714535, + -0.09433092176914215, + -0.0027003823779523373, + -0.01224434282630682, + 0.046193961054086685, + 0.10648015886545181, + 0.06664197891950607, + -0.04241771250963211, + 0.14096954464912415, + -0.05075686424970627, + 0.03210696578025818, + -0.03461587801575661, + -0.047565970569849014, + -0.00937251653522253, + -0.07611504197120667, + 0.05037828907370567, + -0.03935624659061432, + -0.043075282126665115, + -0.0653543621301651, + 0.09102343022823334, + 0.06842184066772461, + 0.022587517276406288, + -0.039527278393507004, + 0.004147373605519533, + -0.010267896577715874, + 0.04572155699133873, + 0.019994348287582397, + -0.08653867244720459, + -0.016694165766239166, + -0.01939624734222889, + -0.05726363882422447, + 0.012869386002421379, + -0.04782801866531372, + 0.04146504029631615, + 0.012286007404327393, + 0.02310718223452568, + 0.05752898007631302, + 0.031292688101530075, + -0.00503202760592103, + 0.00784264411777258, + 0.006804784294217825, + -0.012786357663571835, + -0.0421622060239315, + -0.06399321556091309, + 0.020898515358567238, + 0.04953819513320923, + 0.008311894722282887, + -0.05329243093729019, + -0.08721936494112015, + -0.009666508994996548, + -0.10029755532741547, + -0.06818433851003647, + -0.045697614550590515, + -0.015128378756344318, + 0.005183191504329443, + -0.022418156266212463, + 0.07964178174734116, + -0.0390392430126667, + -0.01040792278945446, + -0.010793174616992474, + 0.024584077298641205, + -0.009723758324980736, + 0.10727012902498245, + 0.029110398143529892, + -0.00292646000161767, + -0.03201951086521149, + -0.027794837951660156, + 0.009870595298707485, + -0.09681548178195953, + -0.012293531559407711, + -0.02633897215127945, + -0.019911251962184906, + -0.02171327918767929, + -0.005513808690011501, + -0.019333407282829285, + -0.13216744363307953, + -0.03373103588819504, + 0.02164163440465927, + 0.0170917846262455, + -0.02314002439379692, + 0.04168752580881119, + -0.019580623134970665, + 0.1195710226893425, + -0.04522235691547394, + -0.025578264147043228, + 0.013225121423602104, + 0.05037492886185646, + 0.060273345559835434, + 0.022061243653297424, + -0.057637471705675125, + -0.04606528580188751, + -0.029762553051114082, + 0.09191885590553284, + -0.08925280719995499, + -0.06097186729311943, + 0.06841730326414108, + 0.018249670043587685, + -0.03085044026374817, + 0.01731141284108162, + 0.037370748817920685, + 0.015761325135827065, + 0.011541027575731277, + -0.050027672201395035, + -0.0012642068322747946, + 0.09030623733997345, + 0.05842607468366623, + -0.005486940499395132, + 0.001983982976526022, + -0.073365218937397, + -0.015962427482008934, + -0.09497378766536713, + 0.005260702222585678, + 0.052444782108068466, + -0.021696340292692184, + -0.024337291717529297, + -0.04281696677207947, + -0.043569497764110565, + -0.01773841865360737, + -0.010579859837889671, + 0.009322969242930412, + 0.04647219553589821, + -0.014636140316724777, + -0.04067506641149521, + -0.03183770924806595, + -0.10679633170366287, + -0.09145130962133408, + 0.12912005186080933, + 0.0156899094581604, + -0.023600297048687935, + 0.15211565792560577, + 0.05928000435233116, + 0.010244602337479591, + -0.045443885028362274, + -0.004550014156848192, + 0.12022192031145096, + -0.051041822880506516, + 0.06174638494849205, + 0.009975169785320759, + -0.03563617542386055, + 0.03526156395673752, + 0.0727091059088707, + 0.09494659304618835, + 0.010986818000674248, + -0.034420445561409, + -0.05797479674220085, + 0.08177398890256882, + 0.06298187375068665, + -0.029414653778076172, + -0.0074639697559177876, + -0.024607639759778976, + -0.006824813783168793, + 0.002268759533762932, + 0.020782748237252235, + 0.015589283779263496, + 0.007049550302326679, + 0.06751492619514465, + 0.034420378506183624, + 0.05387337505817413, + 0.050181541591882706, + 0.023675033822655678, + -0.049392275512218475, + -0.016717705875635147, + -0.010593081824481487, + 0.040220070630311966, + -0.021315835416316986, + -0.020352426916360855, + 0.03699672967195511, + 0.0466080978512764, + -0.01574813202023506, + 0.004401805344969034, + -0.019135920330882072, + 0.03760595992207527, + -0.034172914922237396, + -0.03708239272236824, + -0.013567098416388035, + -0.04808829352259636, + -0.04434261471033096, + -0.006392742041498423, + 0.054303959012031555, + -0.03235076740384102, + -0.04290453717112541, + -0.03515966609120369, + 0.07407588511705399, + 0.04183264076709747 + ], + "motif": [ + -0.03474989905953407, + 0.012432035990059376, + -0.014226065017282963, + -0.08834631741046906, + -0.052452217787504196, + -0.008599359542131424, + 0.07525976002216339, + 0.024448055773973465, + 0.023565463721752167, + 0.07275179028511047, + 0.000939949881285429, + 0.03434528410434723, + -0.034513991326093674, + -0.008409302681684494, + -0.03869951143860817, + -0.049837108701467514, + 0.02047623321413994, + -0.02736395038664341, + 0.02909904159605503, + -0.03276321664452553, + -0.04203737899661064, + 0.06954126060009003, + 0.08300098776817322, + 0.01600818708539009, + 0.06707730889320374, + -0.04543910175561905, + 0.08062276244163513, + -0.03940257430076599, + 0.02761165425181389, + 0.055325947701931, + -0.03426172584295273, + -0.008152990601956844, + -0.03648500517010689, + 0.07972494512796402, + -0.04735947027802467, + -0.055006593465805054, + -0.11820714175701141, + -0.01570478454232216, + -0.08606969565153122, + 0.09356927871704102, + -0.04718221724033356, + 0.029773855581879616, + -0.004765782505273819, + 0.12948644161224365, + 0.009700101800262928, + -0.0210715401917696, + 0.031352557241916656, + -0.04406868666410446, + 0.021541571244597435, + 0.012072078883647919, + -0.032257650047540665, + 0.038700416684150696, + -0.013165314681828022, + 0.09368633478879929, + -0.008959519676864147, + 0.007886938750743866, + -0.03011283650994301, + -0.05103744566440582, + -0.026667574420571327, + -0.00387030141428113, + 0.0857936218380928, + -0.10494901984930038, + 0.024429375305771828, + 0.02907113917171955, + -0.037606168538331985, + 0.05458996817469597, + 0.03612985834479332, + -0.04927417263388634, + 0.07959704846143723, + -0.04007327929139137, + 0.07217444479465485, + 0.024459529668092728, + -0.010240903124213219, + -0.029023123905062675, + -0.10056449472904205, + -0.1058715432882309, + 0.04876768961548805, + 0.06272672861814499, + -0.11591833084821701, + 0.02135210856795311, + 0.02603442780673504, + -0.05193491280078888, + 0.0065357559360563755, + 0.02006712183356285, + -0.007108659017831087, + -0.04358016327023506, + 0.04148884862661362, + -0.036309368908405304, + 0.01810668222606182, + 0.016383612528443336, + 0.042219437658786774, + 0.040476199239492416, + -0.00209407159127295, + -0.029646247625350952, + 0.018899552524089813, + 0.014518708921968937, + 0.04497788846492767, + 0.039635926485061646, + -0.04803718626499176, + -0.04392003268003464, + -0.030865579843521118, + 0.016945496201515198, + 0.09943758696317673, + 0.0359184704720974, + 0.0026411539874970913, + 0.0158174280077219, + 0.015195905230939388, + 0.0406377799808979, + 0.0030538137070834637, + -0.016817843541502953, + 0.07947787642478943, + -0.02773382142186165, + -0.08822863548994064, + -0.14340519905090332, + -0.004214374348521233, + 0.054486360400915146, + -0.020404517650604248, + -0.04401213675737381, + 0.03371177613735199, + 0.0004406567895784974, + 0.048528943210840225, + -0.033141277730464935, + 0.06492669135332108, + -0.015424526296555996, + 0.024625638499855995, + 0.022776667028665543, + 0.06295355409383774, + 0.06753894686698914, + -0.008547847159206867, + -0.02678562141954899, + 0.0159606896340847, + 0.016521437093615532, + 0.012257135473191738, + -0.040285397320985794, + -0.05417870357632637, + 0.13562649488449097, + -0.005645011551678181, + 0.03846253082156181, + 0.07150884717702866, + -0.03384092077612877, + 0.0685906782746315, + -0.007040539290755987, + -0.051602259278297424, + -0.06145695969462395, + 0.01944107934832573, + 0.055542729794979095, + 0.04320985823869705, + -0.08226870745420456, + -0.03755646571516991, + -0.007631633430719376, + -0.05258486792445183, + -0.06429900228977203, + 0.05085759982466698, + 0.00192300567869097, + -0.0047936527989804745, + 0.015425336547195911, + 0.015764381736516953, + -0.023656561970710754, + -0.05755612999200821, + 0.05362076684832573, + -0.03243749216198921, + 0.08534888178110123, + -0.020675454288721085, + 0.04195242375135422, + -0.04211623594164848, + -0.0872185230255127, + -0.037689220160245895, + 0.03543021157383919, + 0.021739231422543526, + -0.005236051511019468, + 0.028107034042477608, + -0.00378972664475441, + 0.011679285205900669, + 0.09396737068891525, + 0.06878001242876053, + -0.026608578860759735, + -0.014949307776987553, + -0.01709100604057312, + -0.011867317371070385, + 0.054931845515966415, + 0.06630878150463104, + -0.026321325451135635, + -0.05820285528898239, + 0.061081115156412125, + 0.07996837049722672, + -0.05326690897345543, + 0.013254247605800629, + 0.046188823878765106, + -0.0680432990193367, + -0.015346681699156761, + -0.009805060923099518, + 0.008968360722064972, + -0.007906202226877213, + 0.016717977821826935, + -0.04304440692067146, + 0.034451570361852646, + 0.05247189849615097, + -0.07262805849313736, + -0.060421671718358994, + -0.01003330573439598, + -0.02584553323686123, + -0.05910603702068329, + 0.07579110562801361, + 0.006064590532332659, + -0.007785773370414972, + 0.001827661064453423, + -0.042250946164131165, + -0.13838915526866913, + 0.015260889194905758, + 0.027333440259099007, + -0.06188596412539482, + -0.01355245616286993, + -0.037790849804878235, + -0.012196323834359646, + -0.06148739159107208, + -0.09502068161964417, + 0.04457530006766319, + -0.034141719341278076, + 0.01832137629389763, + -0.007561741396784782, + 0.06446646898984909, + -0.039695851504802704, + -0.00616454379633069, + 0.030846992507576942, + -0.010817382484674454, + -0.03832174092531204, + 0.010519406758248806, + 0.027993276715278625, + -0.019997425377368927, + -0.022922208532691002, + 0.06288689374923706, + 0.014547573402523994, + 0.03210025653243065, + 0.08862093091011047, + -0.011572971008718014, + -0.008652961812913418, + 0.020410895347595215, + -0.03935837373137474, + 0.010945991612970829, + 0.008237098343670368, + -0.0003920197195839137, + -0.017952851951122284, + -0.01709233969449997, + -0.0034809887874871492, + -0.10495095700025558, + -0.01892232336103916, + 0.05398595705628395, + -0.021743079647421837, + -0.033929940313100815, + -0.03563513979315758, + 0.08784005045890808, + 0.013913287781178951, + -0.05541366711258888, + 0.07337899506092072, + 0.02356909215450287, + 0.015926135703921318, + -0.021246759220957756, + 0.014618313871324062, + 0.06915534287691116, + -0.04110218584537506, + -0.058576054871082306, + -0.12190120667219162, + 0.054672930389642715, + -0.004012781661003828, + -0.0354161262512207, + 0.07168091088533401, + -0.04673217609524727, + -0.019775355234742165, + -0.01194850541651249, + -0.04846157133579254, + -0.00748575059697032, + -0.01956232264637947, + -0.017471089959144592, + 0.019659293815493584, + -0.01226590946316719, + -0.07449975609779358, + -0.0540035255253315, + -0.07476548850536346, + -0.007481382694095373, + -0.1216122955083847, + -0.009973126463592052, + -0.10827195644378662, + -0.008881330490112305, + -0.11822433024644852, + 0.010778574272990227, + -0.10710543394088745, + 0.011340916156768799, + -0.05685362219810486, + 0.016070537269115448, + 0.011460008099675179, + -0.05818825587630272, + 0.01844593696296215, + 0.0604386031627655, + -0.04675782099366188, + -0.05531831085681915, + 0.09547159075737, + 0.024907631799578667, + -0.031022971495985985, + -0.020335709676146507, + -0.040019579231739044, + -0.02556944638490677, + 0.05656911060214043, + 0.09433779865503311, + 0.01166454330086708, + 0.004737890791147947, + -0.002207431010901928, + -0.01901192218065262, + -0.03655916452407837, + 0.07749556005001068, + -0.05837954953312874, + 0.0663309395313263, + 0.004834428429603577, + -0.014498697593808174, + -0.0011689402163028717, + 0.009770077653229237, + -0.012977484613656998, + 0.01054565142840147, + 0.013697241432964802, + -0.1340380758047104, + 0.009499051608145237, + 0.08072409778833389, + 0.07659167796373367, + 0.027117792516946793, + 0.02892310544848442, + -0.0989302471280098, + -0.058771491050720215, + 0.07333356142044067, + -0.0014418550999835134, + 0.04804405942559242, + -0.07131768018007278, + 0.009257637895643711, + 0.08970355987548828, + -0.005172141827642918, + 0.017094727605581284, + 0.019468780606985092, + -0.004174945410341024, + 0.10818822681903839, + 0.06233759969472885, + 0.0018424316076561809, + 0.05242333561182022, + 0.023234020918607712, + 0.0018348228186368942, + 0.09616968780755997, + 0.07455619424581528, + -0.03018486127257347, + 0.0976373627781868, + 0.05808872729539871, + 0.016479993239045143, + -0.044590357691049576, + 0.011846822686493397, + -0.06776212155818939, + -0.025618597865104675, + -0.030901053920388222, + -0.04674725979566574, + -0.02137877605855465, + -0.0001319981092819944, + -0.021666502580046654, + -0.025488553568720818, + 0.06086568906903267, + -0.03539128601551056, + -0.002097723539918661, + -0.08248084783554077, + -0.09498461335897446, + 0.03869272395968437, + -0.0684313252568245, + -0.0020309104584157467, + 0.05458642914891243, + -0.0033866125158965588, + 0.03557244688272476, + 0.05742476508021355, + -0.02736487425863743, + 0.03830499202013016, + -0.11710196733474731, + 0.12238282710313797, + 0.10816042870283127, + -0.04404744505882263, + -0.01659701019525528, + -0.013501140289008617, + -0.021271366626024246, + -0.02672078274190426, + 0.08104258030653, + 0.00568224024027586, + 0.08479490131139755, + 0.08877354860305786 + ], + "newspaper": [ + -0.009079361334443092, + 0.04190576449036598, + -0.006121438462287188, + -0.017507852986454964, + 0.006718299351632595, + 0.036871537566185, + -0.007166637107729912, + -0.024541251361370087, + 0.05504072085022926, + -0.07251834124326706, + -0.004752871580421925, + -0.035148944705724716, + 0.029654160141944885, + -0.0071069663390517235, + 0.007301792502403259, + -0.0946420356631279, + -0.044651445001363754, + -0.05416714772582054, + 0.01574917882680893, + 0.02553141489624977, + -0.042415324598550797, + 0.06442513316869736, + 0.11241183429956436, + -0.07662705332040787, + -0.009310496039688587, + 0.03722451254725456, + -0.06709016859531403, + -0.010651493445038795, + 0.010024153627455235, + -0.02885780669748783, + 0.05134251341223717, + 0.026942076161503792, + 0.03587755188345909, + 0.03158626705408096, + 0.014509639702737331, + 0.01900448650121689, + 0.011899297125637531, + -0.04121396690607071, + -0.030313408002257347, + -0.04411185160279274, + 0.03396761044859886, + 0.04588797688484192, + -0.1188376322388649, + 0.09109315276145935, + -0.00818344671279192, + 0.008641737513244152, + -0.02213793806731701, + -0.005207286216318607, + -0.04592195525765419, + 0.10457469522953033, + -0.011268015950918198, + 0.02116924338042736, + -0.08589429408311844, + 0.04355128854513168, + 0.0677543580532074, + 0.0410984642803669, + -0.007536428049206734, + -0.04697260633111, + -0.015475771389901638, + -0.12490624934434891, + 0.06068037822842598, + 0.046063072979450226, + 0.01695609837770462, + 0.009038189426064491, + -0.04921850562095642, + 0.06342455744743347, + 0.042364299297332764, + -0.026185810565948486, + 0.03433733433485031, + -0.024664664641022682, + -0.07175752520561218, + 0.06249258294701576, + -0.01062704250216484, + -0.041421208530664444, + -0.012913521379232407, + 0.01991943269968033, + -0.03377380222082138, + -0.05695198476314545, + -0.02937743440270424, + -0.020659150555729866, + 0.02710641175508499, + -0.05722226947546005, + 0.07671394944190979, + -0.04374019056558609, + 0.03214186057448387, + 0.03148019686341286, + 0.1098327562212944, + 0.03922794386744499, + -0.0026358466129750013, + -0.050657693296670914, + -0.02205796167254448, + -0.04332399368286133, + 0.06580764800310135, + -0.03777134418487549, + 0.04367316886782646, + 0.03396172076463699, + 0.01490612979978323, + 0.0729541927576065, + -0.026581106707453728, + -0.024348828941583633, + 0.10505703836679459, + -0.08431343734264374, + -0.051219433546066284, + -0.0047652460634708405, + 0.01743321679532528, + 0.042637281119823456, + -0.007995765656232834, + -0.009103214368224144, + 0.09118592739105225, + -0.09679161012172699, + 0.06366285681724548, + -0.04235444217920303, + -0.02444559894502163, + 0.04506595432758331, + -0.06735868006944656, + -0.048848655074834824, + -0.044183533638715744, + -0.040096864104270935, + -0.04398489370942116, + -0.0554719977080822, + 0.09061364829540253, + 0.05414731055498123, + 0.047019634395837784, + 0.05570634454488754, + -0.03628009930253029, + 0.042274441570043564, + 0.008040549233555794, + 0.026120610535144806, + 0.07912591844797134, + -0.0018712683813646436, + 0.006626339163631201, + -0.01431954838335514, + 0.00852985866367817, + -0.036094751209020615, + -0.037610772997140884, + 0.006487816572189331, + -0.0049804686568677425, + -0.04464762657880783, + -0.0077760303393006325, + 0.01226841565221548, + -0.03457629680633545, + -0.03947657346725464, + -0.033149562776088715, + -0.008200324140489101, + -0.031189998611807823, + -0.023898594081401825, + -0.03747494891285896, + -0.06444074958562851, + -0.023768223822116852, + -0.029070468619465828, + -0.03651442378759384, + 0.04101692885160446, + -0.04423290491104126, + -0.04120289906859398, + -0.015696637332439423, + -0.097943976521492, + -0.023529497906565666, + 0.010669868439435959, + 0.034177470952272415, + 0.08194275945425034, + 0.055968161672353745, + 0.033962175250053406, + 0.03244146332144737, + -0.049974408000707626, + 0.13030149042606354, + 0.010118859820067883, + -0.0262344591319561, + -0.038852132856845856, + 0.1245456263422966, + -0.060704026371240616, + 0.024461163207888603, + -0.0388847179710865, + -0.014906618744134903, + -0.11149393022060394, + 0.037240490317344666, + -0.001886072801426053, + -0.03477679565548897, + -0.0015449794009327888, + 0.02846379764378071, + 0.003854637499898672, + -0.04902663826942444, + -0.013006196357309818, + -0.015524552203714848, + -0.021133944392204285, + 0.12497464567422867, + 0.050913386046886444, + -0.0571787990629673, + 0.09456650912761688, + 0.05760369077324867, + -0.027549531310796738, + -0.007971996441483498, + 0.027380598708987236, + -0.024784866720438004, + 0.030044032260775566, + -0.030702732503414154, + 0.056303471326828, + 0.07659557461738586, + 0.1148674413561821, + 0.035389360040426254, + -0.02052742801606655, + 0.00805245153605938, + -0.003337929490953684, + 0.12432394921779633, + 0.011126241646707058, + 0.0019057251047343016, + 0.05085352435708046, + 0.002842516638338566, + 0.04186595231294632, + 0.003683192888274789, + 0.04351867362856865, + -0.059275396168231964, + -0.009917715564370155, + 0.03879644349217415, + -0.02665223553776741, + 0.08448183536529541, + -0.05284561589360237, + -0.06773406267166138, + -0.012316870503127575, + -0.05204806476831436, + 0.07053281366825104, + -0.013589122332632542, + 0.06965143233537674, + -0.09176735579967499, + 0.024832651019096375, + -0.014509247615933418, + 0.08434990793466568, + 0.02719736471772194, + 0.05389062687754631, + -0.009830976836383343, + -0.03315947949886322, + 0.02797677554190159, + -0.03851786255836487, + -0.023196913301944733, + 0.09778694063425064, + -0.0055779567919671535, + 0.04231208190321922, + 0.029852760955691338, + 0.0017855941550806165, + -0.0525759682059288, + 0.023132581263780594, + -0.0006571707781404257, + 0.09509805589914322, + -0.06598810106515884, + 0.03303198888897896, + -0.10390118509531021, + -0.0018277616472914815, + 0.03357187286019325, + 0.03996898606419563, + -0.027058586478233337, + -0.03298289328813553, + -0.0039776768535375595, + -0.09321484714746475, + 0.00322647369466722, + -0.0369933657348156, + 0.014627235941588879, + 0.06841035932302475, + 0.007107713259756565, + 0.06958073377609253, + 0.059725482016801834, + 0.04128408059477806, + 0.002895173616707325, + 0.020932478830218315, + -0.07304114103317261, + 0.01949762925505638, + 0.02108636498451233, + -0.04729221761226654, + 0.02754022367298603, + -0.06764145195484161, + 0.05411805585026741, + 0.01126315351575613, + -0.02964559942483902, + -0.02547081746160984, + -0.01828211173415184, + 0.09226855635643005, + 0.0023210719227790833, + -0.07113654911518097, + 0.04297342896461487, + 0.02694803662598133, + -0.023280398920178413, + -0.02828444354236126, + 0.02258303016424179, + -0.03262476250529289, + -0.11638136208057404, + -0.09879472851753235, + 0.04019073396921158, + -0.10648062080144882, + 0.027737408876419067, + 0.04710666462779045, + 0.05606786906719208, + 0.029259534552693367, + 0.020913146436214447, + 0.027934763580560684, + 0.026149552315473557, + 0.008658667095005512, + -0.08783934265375137, + -0.03582543507218361, + -0.07654731720685959, + 0.028344519436359406, + -0.0852106586098671, + 0.04871422052383423, + 0.037018295377492905, + 0.03829452022910118, + 0.040888845920562744, + 0.00860335398465395, + -0.04906453564763069, + -0.024484459310770035, + -0.07868625223636627, + 0.08040503412485123, + -0.005347603932023048, + -0.00552275450900197, + -0.021022941917181015, + 0.06848882883787155, + 0.10916850715875626, + 0.02535291761159897, + -0.007508859969675541, + 0.013757220469415188, + 0.06550341099500656, + 0.09316211193799973, + -0.02613707073032856, + -0.032831355929374695, + -0.07448451966047287, + -0.03419250249862671, + 0.008207215927541256, + 0.03711491450667381, + -0.06272044777870178, + 0.017750918865203857, + 0.0551636666059494, + -0.04496853053569794, + -0.06083911284804344, + -0.05004173517227173, + -0.0019868402741849422, + -0.04989911988377571, + -0.08109752088785172, + -0.06185980141162872, + -0.047454409301280975, + 0.009592736139893532, + 0.0681178942322731, + 0.0006317983497865498, + -0.007566703483462334, + -0.027272740378975868, + -0.0036837770603597164, + -0.062285881489515305, + 0.04083551838994026, + -0.06275233626365662, + 0.03767996281385422, + -0.031053466722369194, + 0.09155397117137909, + 0.07274516671895981, + -0.04548705741763115, + 0.08259417116641998, + -0.06469879299402237, + 0.11815518885850906, + -0.09549421072006226, + -0.04878702387213707, + 0.03205930069088936, + 0.06966427713632584, + 0.09251110255718231, + -0.08511578291654587, + 0.055801209062337875, + -0.01260301098227501, + -0.029406776651740074, + -0.02116323448717594, + -0.06432213634252548, + -0.018110547214746475, + 0.025666551664471626, + 0.002041842555627227, + -0.008411139249801636, + -0.11730849742889404, + 0.014621344394981861, + -0.07418686151504517, + 0.08161121606826782, + 0.12823714315891266, + -0.046674877405166626, + -0.04901742935180664, + -0.016864152625203133, + -0.021811097860336304, + 0.07889820635318756, + 0.0022832558024674654, + -0.012785496190190315, + -0.0429796427488327, + 0.02225433848798275, + 0.01999765820801258, + -0.018803689628839493, + 0.0131020937114954 + ], + "organic": [ + 0.05684012174606323, + 0.01868739165365696, + -0.07734381407499313, + 0.0332140289247036, + -0.02971629425883293, + 0.023197883740067482, + 0.13694290816783905, + -0.0692109540104866, + -0.05301350727677345, + 0.08613661676645279, + -0.011205591261386871, + -0.08634225279092789, + -0.0178360678255558, + 0.052691392600536346, + -0.03817485272884369, + -0.03499879688024521, + -0.043060317635536194, + 0.024535251781344414, + 0.015451788902282715, + -0.003380694892257452, + -0.04627378284931183, + 0.09831301122903824, + -0.017854774370789528, + -0.004330070223659277, + -0.019055157899856567, + -0.04522857069969177, + 0.032549548894166946, + -0.02153339982032776, + -0.03497865051031113, + -0.02570696733891964, + 0.001988604199141264, + -0.07053177803754807, + -0.1261599063873291, + -0.06924285739660263, + 0.04646560177206993, + 0.00031446194043383, + -0.006658872123807669, + -0.05004129186272621, + -0.05467967316508293, + 0.05717236548662186, + 0.05480281263589859, + 0.020793044939637184, + -0.03128187358379364, + 0.009377761743962765, + -0.07535097748041153, + 0.06561844050884247, + -0.03121560625731945, + -0.0895947515964508, + -0.060316767543554306, + 0.09724585711956024, + -0.09208379685878754, + 0.01567961648106575, + 0.12619905173778534, + 0.1190420538187027, + -0.041844431310892105, + 0.0490804947912693, + 0.020807240158319473, + -0.09028707444667816, + -0.060619570314884186, + 0.0023791813291609287, + 0.07039600610733032, + -0.034530725330114365, + 0.018249131739139557, + 0.025610556825995445, + -0.032391078770160675, + -0.031504809856414795, + -0.04400625824928284, + 0.010331645607948303, + 0.052132412791252136, + -0.06902246922254562, + -0.05302080884575844, + 0.09118595719337463, + -0.05947753041982651, + 0.008103515021502972, + -0.05004687234759331, + -0.002975921146571636, + 0.022709423676133156, + 0.0009685612749308348, + -0.12023928761482239, + 0.03607131540775299, + -0.1105974018573761, + -0.027301616966724396, + -0.021726813167333603, + 0.08745401352643967, + 0.0009392178035341203, + -0.011640975251793861, + -0.00967591442167759, + 0.06185402721166611, + -0.0260138139128685, + -0.08559617400169373, + -0.02967739664018154, + -0.03805854916572571, + -0.03738204017281532, + 0.004023072775453329, + 0.0449390709400177, + 0.04492704197764397, + 0.041836950927972794, + 0.06696244329214096, + -0.003046069759875536, + -0.042355600744485855, + -0.03147587180137634, + -0.01830485090613365, + 0.06092904508113861, + 0.05745689198374748, + 0.02558843418955803, + 0.027072815224528313, + -0.03312340006232262, + 0.06764887273311615, + 0.0334949865937233, + 0.05880666896700859, + 0.044355135411024094, + -0.034775711596012115, + -0.043966539204120636, + 0.047868549823760986, + 0.04677702113986015, + -0.03579377755522728, + -0.027741000056266785, + 0.0037852104287594557, + -0.018235376104712486, + -0.04133988544344902, + -0.017271101474761963, + -0.044809263199567795, + -0.07758435606956482, + 0.07704520970582962, + -0.026149295270442963, + 0.008172658272087574, + -0.06658760458230972, + -0.002203171607106924, + 0.001544340280815959, + 0.04391075298190117, + 0.012203220278024673, + 0.012848291546106339, + 0.009786521084606647, + 0.035634104162454605, + 0.04808063432574272, + 0.0990963876247406, + 0.027070796117186546, + 0.018874505534768105, + -0.04659455642104149, + 0.03071025386452675, + 0.012907718308269978, + 0.0862252339720726, + 0.07427537441253662, + 0.0022514478769153357, + 0.06765347719192505, + -0.02278868295252323, + -0.015303714200854301, + -0.04340066760778427, + 0.018784018233418465, + -0.011352820321917534, + -0.03171999752521515, + -0.044684261083602905, + 0.018686724826693535, + -0.024343959987163544, + -0.012735104188323021, + -0.02799200266599655, + -0.01137540489435196, + -0.07212626188993454, + -0.05040842667222023, + 0.012746508233249187, + -0.031825777143239975, + 0.0056260996498167515, + -0.03215797618031502, + -0.0019319546408951283, + -0.022544855251908302, + 0.0033279501367360353, + 0.057575441896915436, + 0.020125290378928185, + 0.0418504923582077, + -0.07391665875911713, + 0.07203514128923416, + 0.044942934066057205, + -0.044789619743824005, + -0.042605310678482056, + -0.019581075757741928, + -0.06517572700977325, + 0.021035393700003624, + 0.010113513097167015, + 0.037775736302137375, + -0.01673632487654686, + 0.017039133235812187, + -0.036744892597198486, + 0.07387453317642212, + 0.025156468152999878, + -0.05689005181193352, + 0.0032738693989813328, + -0.008722230792045593, + 0.16412046551704407, + -0.03891916200518608, + 0.005032393150031567, + -0.004982871934771538, + 0.018325336277484894, + -0.12315879017114639, + 0.07460524886846542, + -0.047714147716760635, + -0.024987082928419113, + 0.03323628380894661, + -0.05166230723261833, + -0.009733550250530243, + 0.04939703270792961, + -0.016193177551031113, + -0.058539099991321564, + 0.09751035273075104, + -0.04314286634325981, + -0.06062791496515274, + 0.015260634012520313, + -0.06005644425749779, + 0.10566996783018112, + 0.15911510586738586, + 0.07402337342500687, + -0.041688937693834305, + -0.03734232485294342, + -0.014482438564300537, + -0.00949107762426138, + -0.0017208759672939777, + -0.12163762748241425, + -0.030294613912701607, + -0.07778635621070862, + -0.06217002123594284, + 0.019274335354566574, + 0.03578169271349907, + -0.04674640670418739, + 0.044701460748910904, + 0.017352798953652382, + 0.015704171732068062, + -0.03568834438920021, + 0.10121122747659683, + 0.05971987918019295, + -0.03835349902510643, + -0.04800766333937645, + 0.006051609758287668, + 0.03634459897875786, + -0.017973238602280617, + 0.044110510498285294, + -0.04872618243098259, + 0.03731941059231758, + -0.030733654275536537, + -0.08423522859811783, + 0.03240012004971504, + 0.0318760983645916, + 0.059297896921634674, + -0.016736259683966637, + 0.025025727227330208, + -0.07069375365972519, + -0.06566522270441055, + -0.048258885741233826, + 0.020015742629766464, + 0.04866822808980942, + -0.06488161534070969, + -0.009271115064620972, + -0.07118745148181915, + 0.04487285017967224, + 0.01630823314189911, + -0.004935814067721367, + -0.036040134727954865, + -0.004864412359893322, + -0.0461280457675457, + 0.013640047051012516, + 0.0195134449750185, + -0.07713446021080017, + 0.041158903390169144, + -0.01751285418868065, + -0.012948288582265377, + 0.03857267275452614, + 0.07522616535425186, + 0.023630086332559586, + -0.053310979157686234, + 0.037029560655355453, + -0.0013721790164709091, + -0.036884501576423645, + -0.0033211777918040752, + -0.10126103460788727, + 0.07160475850105286, + 0.03156282752752304, + 0.06893045455217361, + -0.030613861978054047, + -0.005860229022800922, + -0.01884492300450802, + -0.002098067430779338, + 0.09343386441469193, + 0.06879694014787674, + -0.052384551614522934, + -0.0884869322180748, + 0.00568155013024807, + -0.024921134114265442, + -0.02364499680697918, + -0.0011527151800692081, + 0.01006465032696724, + 0.04553055390715599, + -0.03482445701956749, + -0.009402446448802948, + -0.05380098894238472, + 0.038170453161001205, + -0.001728392206132412, + -0.09252110868692398, + 0.03546397387981415, + -0.08095324039459229, + -0.014410316944122314, + -0.010192192159593105, + 0.029148122295737267, + 0.01821570284664631, + -0.08524356037378311, + 0.06755630671977997, + -0.04215063154697418, + 0.04789014533162117, + 0.021538421511650085, + -0.02985175885260105, + -0.00108575657941401, + 0.021713895723223686, + -0.015039678663015366, + 0.023976637050509453, + -0.03888426721096039, + 0.04687229543924332, + 0.007691007573157549, + -0.06868520379066467, + 0.015396185219287872, + 0.0490826852619648, + 0.0898049995303154, + -0.10383500158786774, + -0.0120094558224082, + -0.030559340491890907, + -0.03357167914509773, + 0.06683934479951859, + 0.004376350902020931, + -0.006851810030639172, + 0.0027335297781974077, + 0.04763934388756752, + 0.09695187956094742, + 0.009604914113879204, + -0.03451433777809143, + 0.04730526730418205, + 0.06410042196512222, + 0.08251741528511047, + 0.040045108646154404, + 0.11541613936424255, + 0.03310026973485947, + -0.032023366540670395, + 0.037549957633018494, + -0.01949799805879593, + -0.015467983670532703, + 0.07576502114534378, + 0.05737782642245293, + 0.10945995897054672, + 0.03145134076476097, + 0.02877352014183998, + 0.053950775414705276, + 0.023316144943237305, + 0.03326236829161644, + -0.07658562809228897, + 0.04251435771584511, + -0.007724551483988762, + 0.013622963801026344, + 0.013455988839268684, + -0.06465975940227509, + -0.004663725849241018, + 0.10202128440141678, + -0.06508080661296844, + 0.004900338128209114, + -0.023094002157449722, + -0.03448917716741562, + 0.11716750264167786, + 0.03391142562031746, + -0.05676233768463135, + 0.048830319195985794, + 0.026935741305351257, + 0.00972687266767025, + -0.023488318547606468, + -0.033238768577575684, + 0.025597989559173584, + -0.010334867052733898, + -0.06294135749340057, + 0.013993313536047935, + -0.07057523727416992, + -0.023044655099511147, + 0.04178290441632271, + -0.06430216133594513, + -0.011793863028287888, + -0.023544255644083023, + 0.010762806050479412, + 0.07558904588222504, + -0.06262743473052979, + -0.04750477150082588, + 0.03331455588340759, + 0.08397788554430008 + ], + "stone": [ + 0.027667099609971046, + -0.04401538521051407, + -0.04265187308192253, + 0.047954365611076355, + -0.0633636936545372, + 0.026571698486804962, + 0.027073267847299576, + -0.019735412672162056, + -0.0026663856115192175, + 0.09195486456155777, + 0.07007216662168503, + -0.012130746617913246, + 0.0487210713326931, + 0.06705065816640854, + -0.02890606038272381, + 0.0604097917675972, + 0.008933641016483307, + 0.0008320841589011252, + 0.0008318366017192602, + -0.017096593976020813, + -0.0009691559826023877, + -0.0031604240648448467, + -0.0009540612809360027, + -0.0018396852537989616, + 0.0117826908826828, + 0.01977456919848919, + -0.061562906950712204, + -0.00796504132449627, + 0.006342625245451927, + 0.004376542754471302, + 0.021712753921747208, + 0.016660479828715324, + -0.021775493398308754, + 0.08919264376163483, + -0.0029705939814448357, + -0.0265798419713974, + 0.01619018241763115, + -0.11690877377986908, + -0.0011047368170693517, + -0.043451543897390366, + 0.041862037032842636, + -0.06301061809062958, + -0.03340772166848183, + 0.03022880293428898, + 0.03432716801762581, + 0.01271613035351038, + -0.05239680036902428, + 0.0028394199907779694, + 0.0023252780083566904, + 0.10559505224227905, + 0.06753773242235184, + -0.033602796494960785, + -0.0399678610265255, + 0.10646042227745056, + 0.008185647428035736, + -0.03354969993233681, + -0.06724240630865097, + -0.06205543130636215, + -0.0017597053665667772, + -0.06623787432909012, + 0.10539732128381729, + -0.0046001304872334, + -0.006839400622993708, + 0.017382385209202766, + 0.050582997500896454, + -0.060903649777173996, + 0.04241117462515831, + -0.011612477712333202, + -0.029514644294977188, + -0.023401577025651932, + -0.08478420227766037, + -0.008132805116474628, + 0.08652681857347488, + -0.03267892450094223, + 0.005670506972819567, + 0.06637817621231079, + 0.0808669775724411, + -0.015620346181094646, + -0.010255838744342327, + 0.028296496719121933, + 0.018760165199637413, + -0.02210995927453041, + -0.12908905744552612, + -0.07028605043888092, + -0.0754459872841835, + 0.000746112666092813, + 0.028762035071849823, + -0.03105958364903927, + 0.020377852022647858, + -0.04337518662214279, + 0.06697949767112732, + 0.016875997185707092, + -0.018586046993732452, + 0.02724177949130535, + 0.03762321174144745, + -0.010915886610746384, + -0.0054028695449233055, + 0.0260092094540596, + -0.08933629840612411, + 0.019494973123073578, + -0.0710323229432106, + -0.020684760063886642, + -0.1128072440624237, + 0.05481155216693878, + 0.004528528079390526, + -0.0824773907661438, + 0.06492521613836288, + -0.07975198328495026, + 0.12412887066602707, + 0.1648966521024704, + -0.015296720899641514, + -0.03444397822022438, + -0.004695562180131674, + -0.0026889974251389503, + 0.11688324064016342, + 0.004380747210234404, + 0.02521488443017006, + 0.036351725459098816, + -0.055732350796461105, + -0.028951125219464302, + 0.006925245281308889, + -0.012700480408966541, + -0.009698580950498581, + 0.04800881817936897, + 0.025878392159938812, + 0.07316785305738449, + -0.06416775286197662, + 0.02393941394984722, + -0.0320887416601181, + 0.09162252396345139, + 0.05605602636933327, + 0.03296680748462677, + -0.02292702905833721, + -0.025579914450645447, + -0.03362761437892914, + 0.03283121809363365, + -0.017628952860832214, + -0.08462613821029663, + -0.07322114706039429, + -0.022399960085749626, + -0.03747870773077011, + 0.035391196608543396, + -0.0573270283639431, + 0.038565851747989655, + -0.009016776457428932, + 0.03414874151349068, + -0.03998498618602753, + -0.059246376156806946, + 0.059066206216812134, + 0.008361042477190495, + 0.042235251516103745, + -0.03553669899702072, + 0.022434141486883163, + 0.0317530483007431, + -0.0770588219165802, + 0.04231401905417442, + 0.030723508447408676, + 0.024655550718307495, + -0.039501819759607315, + -0.01087364461272955, + 0.017331987619400024, + 0.011167796328663826, + 0.020656758919358253, + 0.10722742229700089, + 0.014612455852329731, + -0.031007511541247368, + 0.06957295536994934, + -0.044043466448783875, + -0.0044427295215427876, + 0.004796476103365421, + 0.02778894454240799, + 0.0006408423068933189, + -0.04108791425824165, + -0.06199098750948906, + 0.03426716476678848, + 0.022363143041729927, + -0.00025730542256496847, + -0.0630214661359787, + -0.019820882007479668, + 0.06839337944984436, + -0.009135192260146141, + -0.01684366911649704, + 0.042258020490407944, + 0.02361518144607544, + -0.02343905344605446, + -0.0607726089656353, + -0.017700454220175743, + -0.017912497743964195, + 0.03175467625260353, + -0.015021822415292263, + 0.08459305763244629, + -0.023131391033530235, + -0.09041939675807953, + 0.009993104264140129, + 0.04215414077043533, + -0.00571886170655489, + 0.021114859730005264, + -0.04609086737036705, + 0.0313403382897377, + 0.11032720655202866, + 0.06849402189254761, + -0.05235743522644043, + 0.05161228030920029, + -0.024161795154213905, + 0.015436945483088493, + -0.043123308569192886, + -0.03591713681817055, + -0.049711644649505615, + 0.06890425831079483, + 0.0038716348353773355, + 0.012368512339890003, + -0.007441588677465916, + -0.08344146609306335, + 0.004213368985801935, + 0.05124390497803688, + -0.01655787043273449, + 0.05309009179472923, + -0.02668171375989914, + 0.015744026750326157, + -0.00063262355979532, + 0.026666894555091858, + -0.015300581231713295, + 0.0397893451154232, + -0.06487532705068588, + 0.12204199284315109, + -0.010915708728134632, + 0.008942102082073689, + 0.001019179355353117, + -0.018138183280825615, + 0.04979131370782852, + -0.05143476650118828, + -0.007948488928377628, + 0.02426036261022091, + -0.0299973264336586, + 0.09026095271110535, + -0.07183568179607391, + -0.050144899636507034, + -0.03405177220702171, + -0.037878770381212234, + -0.12570452690124512, + 0.027478793635964394, + 0.024358920753002167, + -0.05344630777835846, + -0.024128422141075134, + -0.11190911382436752, + -0.05839163437485695, + 0.07558386027812958, + 0.01614498160779476, + -0.0387808233499527, + 0.07928691059350967, + -0.05439707636833191, + 0.02263440005481243, + 0.07449573278427124, + -0.043794985860586166, + -0.0344494991004467, + -0.04445687308907509, + 0.025971826165914536, + -0.07871384918689728, + -0.0005018856027163565, + -0.06970460712909698, + 0.00993739441037178, + -0.08474388718605042, + 0.05416864901781082, + -0.018632691353559494, + -0.02273886650800705, + 0.04488591104745865, + -0.025327157229185104, + -0.04351969435811043, + -0.14189118146896362, + 0.0037896770518273115, + 0.011688584461808205, + -0.003881410462781787, + 0.09145206958055496, + 0.0811314731836319, + -0.07476100325584412, + -0.04479147866368294, + 0.017256224527955055, + -0.04846983030438423, + 0.00587126100435853, + 0.08234483748674393, + 0.0074830930680036545, + -0.059283629059791565, + 0.09738726913928986, + -0.08896145224571228, + 0.05473093315958977, + -0.0026998568791896105, + -0.0329415537416935, + 0.01721005327999592, + 0.053728558123111725, + -0.12680138647556305, + 0.028766458854079247, + 0.02860751375555992, + -0.03259171545505524, + 0.10426140576601028, + -0.0038644839078187943, + 0.016039257869124413, + -0.02265683375298977, + 0.006448930595070124, + -0.010648111812770367, + -0.023164846003055573, + 0.0643683671951294, + 0.01749233901500702, + -0.07080870866775513, + -0.0332631878554821, + -0.03823026269674301, + 0.01324198953807354, + -0.014995120465755463, + 0.03156600892543793, + -0.013025034219026566, + -0.0020155333913862705, + 0.0641125813126564, + 0.02569405548274517, + 0.019469300284981728, + 0.04891601949930191, + -0.018413392826914787, + -0.03838471323251724, + -0.07189647108316422, + 0.1193707212805748, + -0.026441341266036034, + 0.017086781561374664, + 0.03442489355802536, + 0.02681080624461174, + -0.031018797308206558, + 0.028345849364995956, + -0.004553093109279871, + 0.007022642530500889, + 0.038036517798900604, + -0.03995175287127495, + -0.05966855585575104, + 0.011432807892560959, + 0.08550947904586792, + 0.005495575722306967, + -0.06120804697275162, + 0.00024139265588019043, + 0.07419818639755249, + -0.011010677553713322, + -0.0007687490433454514, + 0.004286383278667927, + -0.03566105291247368, + 0.042017459869384766, + -0.014625074341893196, + -0.014040612615644932, + -0.06380520015954971, + 0.12837061285972595, + 0.06998027116060257, + 0.01993410661816597, + 0.059209391474723816, + -0.04460659250617027, + -0.046126507222652435, + 0.1069633737206459, + -0.09254363924264908, + -0.007828164845705032, + 0.006921980530023575, + -0.015582194551825523, + 0.053289834409952164, + -0.019020885229110718, + -0.07436361163854599, + -0.015680216252803802, + 0.06416343152523041, + 0.03610239923000336, + 0.02402625046670437, + 0.010443881154060364, + -0.09462401270866394, + 0.06831786036491394, + 0.018405279144644737, + 0.013643169775605202, + 0.10765419155359268, + 0.01385869923979044, + -0.010564599186182022, + 0.07216870784759521, + -0.003993019461631775, + -0.06738925725221634, + 0.04855732247233391, + 0.13176386058330536, + -0.012597976252436638, + -0.055884018540382385, + -0.020947469398379326, + -0.08668363839387894, + -0.07995819300413132, + 0.006192062050104141, + -0.1156880110502243, + -0.0025364982429891825, + -0.06329771876335144, + 0.027655381709337234 + ], + "studio_backdrop": [ + 0.004713576287031174, + 0.047672875225543976, + 0.02060076780617237, + -0.08834981918334961, + -0.028048688545823097, + 0.011402547359466553, + 0.023346982896327972, + -0.07568226754665375, + -0.034441590309143066, + 0.08197049051523209, + -0.03656947985291481, + 0.0076360879465937614, + -0.018131226301193237, + 0.0011207720963284373, + -0.06102318316698074, + -0.07154500484466553, + -0.0710281953215599, + -0.02663443610072136, + -0.07402916252613068, + -0.04933291673660278, + -0.054614849388599396, + -0.004694113973528147, + -0.0021630264818668365, + -0.010911816731095314, + 0.03437637537717819, + 0.01164873968809843, + -0.008974459953606129, + -0.005592078901827335, + -0.010099101811647415, + -0.013327945955097675, + -0.07281146943569183, + 0.010031784884631634, + -0.0584111362695694, + 0.05116596445441246, + 0.025245986878871918, + -0.056787751615047455, + -0.024105161428451538, + -0.012686326168477535, + -0.09487222135066986, + 0.03577622026205063, + -0.009526398964226246, + 0.01234335359185934, + -0.000764048658311367, + 0.08533323556184769, + -0.018246512860059738, + -0.024427281692624092, + -0.07809118926525116, + 0.03214165195822716, + 0.053312066942453384, + 0.06651551276445389, + 0.03163933381438255, + 0.01187288947403431, + 0.0011045511346310377, + -0.07432281970977783, + 0.022705398499965668, + -0.08102601021528244, + 0.03710804879665375, + 0.17245124280452728, + 0.00619006110355258, + -0.09984415769577026, + 0.11390789598226547, + -0.06697195023298264, + 0.05293913558125496, + 0.08366984874010086, + -0.005514917429536581, + 0.027908651158213615, + 0.03962433338165283, + -0.02772950567305088, + 0.04938366264104843, + 0.013650272972881794, + -0.03431767225265503, + 0.012957122176885605, + -0.10637058317661285, + -0.02325712889432907, + -0.02685004472732544, + 0.01708655245602131, + 0.0901499092578888, + 0.09358107298612595, + -0.014254936017096043, + -0.07295294851064682, + 0.011482502333819866, + -0.058610498905181885, + -0.11018045246601105, + 0.035706739872694016, + 0.005730760283768177, + -0.04644559696316719, + -0.03700491413474083, + 0.08455847948789597, + -0.048034828156232834, + -0.057805128395557404, + -0.007018015719950199, + -0.04473773390054703, + -0.0047005475498735905, + -0.08888114243745804, + 0.07247244566679001, + -0.032762348651885986, + 0.09190452843904495, + 0.11064382642507553, + -0.12754999101161957, + 0.01862705685198307, + 0.0540178157389164, + -0.04375508427619934, + 0.027926884591579437, + 0.11797015368938446, + -0.04984849691390991, + -0.05335147678852081, + 0.008845796808600426, + -0.04151599109172821, + 0.0424342043697834, + -0.013724613934755325, + 0.013813951052725315, + 0.010978709906339645, + -0.06523913145065308, + 0.031197084113955498, + 0.01297800149768591, + -0.03690006956458092, + 0.019407816231250763, + 0.014223436824977398, + 0.018997548148036003, + -0.0066730487160384655, + -0.024647165089845657, + -0.05970847234129906, + 0.08154717087745667, + -0.007575986906886101, + -0.01704893633723259, + -0.027296369895339012, + -0.04351215809583664, + 0.04701610282063484, + -0.029054027050733566, + 0.07701386511325836, + -0.020653467625379562, + 0.044867753982543945, + -0.0426979623734951, + -0.03776874393224716, + -0.009185061790049076, + 0.09177242964506149, + 0.0034370911307632923, + 0.00843900814652443, + 0.11458335071802139, + -0.010396206751465797, + 0.05847615376114845, + 0.036251697689294815, + 0.01410186942666769, + 0.06395165622234344, + 0.011526981368660927, + -0.002170230494812131, + -0.05521424487233162, + 0.02209276705980301, + 0.03626168891787529, + -0.03776723891496658, + -0.014463798142969608, + -0.06099238619208336, + -0.05286522954702377, + 0.035462770611047745, + 0.016587983816862106, + -0.05057377740740776, + 0.08899537473917007, + 0.033880483359098434, + -0.004889517091214657, + 0.05572095885872841, + 0.008994639851152897, + 0.015289564616978168, + 0.01869165524840355, + 0.03533397242426872, + 0.0495879240334034, + -0.014899993315339088, + -0.06318064779043198, + -0.0023930196184664965, + -0.00775979645550251, + 0.012882689945399761, + -0.02362624928355217, + 0.012181181460618973, + -0.0030443049035966396, + 0.08494081348180771, + -0.017047854140400887, + 0.06075897812843323, + -0.0034389749635010958, + -0.03634635731577873, + -0.060715314000844955, + 0.019164610654115677, + -0.011757354252040386, + -0.003044652985408902, + 0.014158744364976883, + -0.0063375490717589855, + 0.019263850525021553, + 0.059193313121795654, + -9.500979649601504e-05, + 0.09103640913963318, + -0.02739868499338627, + 0.04524952918291092, + 0.07293316721916199, + 0.03733304515480995, + 0.05131099373102188, + -0.08405006676912308, + -0.06535651534795761, + 0.016617698594927788, + 0.021877380087971687, + 0.007660198491066694, + -0.03163274750113487, + 0.05815739184617996, + 0.11809400469064713, + -0.043580062687397, + 0.0850505605340004, + 0.014674253761768341, + -0.047429099678993225, + 0.08078379184007645, + 0.04782892018556595, + -0.1098145991563797, + 0.15573401749134064, + -0.05991516634821892, + 0.015288477763533592, + -0.0050620753318071365, + -0.0596027672290802, + 0.042259331792593, + 0.02196737751364708, + 0.019401660189032555, + 0.03244911506772041, + -0.03336380422115326, + 0.007975696586072445, + 0.1485852599143982, + -0.01353510282933712, + -0.03448064625263214, + -0.07231979072093964, + 0.07172682136297226, + -0.06745433062314987, + -0.005238600540906191, + 0.03803684189915657, + 0.005957901943475008, + -0.024814806878566742, + 0.05212416499853134, + 0.05090494081377983, + -0.11012756824493408, + -0.03912706300616264, + -0.0040209549479186535, + -0.030394038185477257, + -0.0020914252381771803, + -0.012633290141820908, + -0.035762712359428406, + 0.01630351133644581, + -0.00038642558502033353, + 0.022380409762263298, + 0.10236593335866928, + -0.04994852840900421, + 0.014821670018136501, + -0.007597094401717186, + 0.03116542659699917, + 0.006808702368289232, + -0.08147827535867691, + -0.024422818794846535, + -0.016646353527903557, + -0.03707480803132057, + 0.011190720833837986, + -0.027678385376930237, + 0.02715691551566124, + -0.03535936772823334, + -0.022164782509207726, + -0.011506347917020321, + 0.025860486552119255, + 0.015724871307611465, + -0.0067488932982087135, + -0.044326283037662506, + -0.03957006335258484, + 0.033768996596336365, + 0.01620802842080593, + 0.02636563405394554, + 0.041447676718235016, + 0.032853398472070694, + -0.07204622775316238, + -0.03390182927250862, + -0.030012985691428185, + -0.03691333159804344, + -0.08147229254245758, + 0.08361286669969559, + 0.07175999879837036, + -0.059425320476293564, + 0.0425751768052578, + -0.06343521922826767, + 0.031501926481723785, + -0.00026748806703835726, + -0.05745294317603111, + 0.003146988106891513, + -0.026069849729537964, + 0.06019383668899536, + -0.047581855207681656, + 0.0543900802731514, + 0.06450977921485901, + 0.10264860838651657, + 0.034797001630067825, + -0.004876922816038132, + -0.031200958415865898, + -0.13317617774009705, + -0.004727868363261223, + 0.058640096336603165, + -0.029722105711698532, + -0.001568361185491085, + 0.035027507692575455, + -0.001456685597077012, + -0.08663405478000641, + 0.038676805794239044, + -0.0032247526105493307, + -0.04321112856268883, + 0.01636350527405739, + 0.06702519953250885, + -0.02176065929234028, + 0.010015654377639294, + 0.029369618743658066, + -0.06709727644920349, + -0.00740194134414196, + -0.0022201621904969215, + 0.015174247324466705, + -0.01361064799129963, + 0.016569627448916435, + 0.05984758213162422, + -0.0010446119122207165, + -0.040253885090351105, + -0.10211064666509628, + 0.07145866006612778, + 0.05795211344957352, + -0.09727427363395691, + -0.06251198798418045, + -0.0032855060417205095, + -0.02943744882941246, + 0.0031099990010261536, + -0.0742584764957428, + -0.058215223252773285, + -0.022145627066493034, + 0.02295558899641037, + -0.043747760355472565, + 0.01713067851960659, + 0.03557942435145378, + -0.02827391028404236, + 0.06565190106630325, + 0.006101143080741167, + -0.039293237030506134, + 0.06604539602994919, + -0.06778224557638168, + 0.0051705180667340755, + 0.017954394221305847, + -0.0033745961263775826, + 0.03942953050136566, + 0.0464339517056942, + -0.15558576583862305, + 0.01854521967470646, + -0.029700329527258873, + -0.009703017771244049, + 0.09263889491558075, + 0.021355662494897842, + 0.011448069475591183, + -0.032596148550510406, + 0.026044167578220367, + 0.033555883914232254, + -0.02649623341858387, + 0.07783141732215881, + -0.05434258654713631, + 0.024307731539011, + -0.026938699185848236, + 0.07230599224567413, + -0.003672444261610508, + 0.1475100815296173, + 0.02026384323835373, + -0.1145307645201683, + -0.02403733879327774, + -0.09138785302639008, + 0.006117932498455048, + -0.04555574804544449, + -0.027661489322781563, + 0.007357700727880001, + 0.05793919786810875, + 0.03375536948442459, + -0.025243371725082397, + 0.033918075263500214, + 0.022980868816375732, + 0.03892751783132553, + 0.014008759520947933, + 0.028262564912438393, + -0.08523834496736526, + 0.050972554832696915, + 0.011212287470698357, + 0.011392220854759216, + -0.02040238305926323, + -0.01047125831246376, + -0.04496145620942116, + -0.025316540151834488, + 0.04517495632171631 + ], + "wood": [ + -0.007327019236981869, + 0.03359239920973778, + 0.015640676021575928, + -0.049978211522102356, + 0.03936345502734184, + 0.012440040707588196, + 0.01716373860836029, + -0.03780866786837578, + -0.023415828123688698, + -0.03026646375656128, + 0.03705279901623726, + -0.09719844162464142, + 0.010701404884457588, + -0.00420126598328352, + -0.015842093154788017, + 0.029876958578824997, + -0.023395542055368423, + -0.014628002420067787, + -0.017145661637187004, + -0.031987376511096954, + 0.029079385101795197, + 0.01320571731775999, + 0.02449403516948223, + 0.06059710308909416, + 0.009540765546262264, + 0.045689646154642105, + 0.06270039826631546, + 0.015222557820379734, + -0.0023776458110660315, + -0.02694789506494999, + -0.025434700772166252, + -0.00045613470138050616, + -0.02149318717420101, + 0.049560096114873886, + 0.0807131752371788, + -0.10160423070192337, + 0.06219850480556488, + 0.00710212392732501, + -0.10140008479356766, + 0.0520407110452652, + -0.02273610234260559, + -0.0008965881424956024, + 0.1314610093832016, + 0.00719567621126771, + -0.032964229583740234, + -0.032583802938461304, + 0.048362091183662415, + 0.029228046536445618, + 0.03078666515648365, + 0.024380536749958992, + 0.026151299476623535, + -0.022193443030118942, + 0.044313132762908936, + -0.009687736630439758, + 0.03352898731827736, + 0.04718131944537163, + 0.09573737531900406, + 0.018412301316857338, + -0.08129772543907166, + -0.021113354712724686, + 0.07593537867069244, + -0.06405386328697205, + 0.011255433782935143, + 0.0799877941608429, + -0.008074838668107986, + 0.06462111324071884, + 0.0347934365272522, + -0.0560201071202755, + 0.0006418607663363218, + 0.03203703463077545, + -0.042507510632276535, + -0.012990695424377918, + -0.012283186428248882, + -0.03700774535536766, + -0.007036860566586256, + -0.000988500309176743, + 0.040788087993860245, + -0.016043931245803833, + -0.12050480395555496, + -0.06052997335791588, + 0.05377458035945892, + -0.025710834190249443, + -0.0006917585851624608, + -0.030726218596100807, + 0.01260488759726286, + -0.06300307810306549, + 0.012060686945915222, + -0.012600342743098736, + -0.0618380568921566, + -0.06488128751516342, + -0.021050209179520607, + -0.009374218992888927, + 0.02954350970685482, + 0.03437398001551628, + 0.06482488662004471, + 0.05051431059837341, + 0.07218361645936966, + 0.009767305105924606, + -0.006885621231049299, + -0.05781703069806099, + -0.07855171710252762, + -0.038619425147771835, + 0.0009576783049851656, + 0.011620480567216873, + -0.07747909426689148, + -0.06193976476788521, + -0.10192994773387909, + 0.03215625882148743, + 0.08257508277893066, + 0.0365242138504982, + 0.06607367098331451, + -0.0493491105735302, + -0.0006639044731855392, + -0.0284745953977108, + 0.11385058611631393, + 0.022907860577106476, + 0.05461271107196808, + 0.031302887946367264, + 0.018660064786672592, + 0.05187161639332771, + 0.016939016059041023, + -0.06589142978191376, + 0.044995106756687164, + 0.02045929804444313, + 0.02777835540473461, + -0.03309449180960655, + 0.012052732519805431, + 0.06672210991382599, + -0.028555186465382576, + 0.07473155111074448, + -0.030629238113760948, + 0.08760374784469604, + -0.013096842914819717, + -0.07985107600688934, + 0.004882371984422207, + -0.008626488968729973, + 0.08072049915790558, + -0.03456002473831177, + 0.04602756351232529, + 0.04311910644173622, + 0.09692531824111938, + -0.034079693257808685, + -0.07057651877403259, + 0.04166999086737633, + -0.008991241455078125, + 0.052408576011657715, + -0.03821423649787903, + -0.006289302371442318, + -0.05793294683098793, + -0.01845632866024971, + -0.06517515331506729, + -0.005369227845221758, + 0.09261643886566162, + -0.016890885308384895, + -0.03511369973421097, + -0.07673615217208862, + -0.04373879358172417, + 0.0431683212518692, + -0.018842389807105064, + 0.06557493656873703, + -0.08273100852966309, + -0.04730463773012161, + 0.041314464062452316, + 0.016358420252799988, + -0.02922891080379486, + 0.011430379934608936, + -0.11527885496616364, + -0.040248285979032516, + 0.04874251037836075, + -0.031790416687726974, + -0.11344021558761597, + -0.06316525489091873, + 0.006637968122959137, + 0.11615781486034393, + 0.05947064235806465, + -0.019032524898648262, + 0.03152797743678093, + 0.06650713831186295, + 0.0585298128426075, + 0.05657711625099182, + -0.005140867084264755, + -0.036951784044504166, + 0.04858691617846489, + 0.03570060804486275, + 0.05551580339670181, + 0.03130553290247917, + 0.011102805845439434, + 0.001884021214209497, + -0.029521703720092773, + 0.009612367488443851, + 0.05163494497537613, + -0.07609627395868301, + 0.04122823104262352, + 0.005245354492217302, + 0.05638058856129646, + 0.009436331689357758, + -0.03022133558988571, + -0.054926685988903046, + 0.02178499475121498, + -0.0019517758628353477, + 0.036007363349199295, + -0.03636981546878815, + 0.05343467369675636, + -0.014161147177219391, + -0.015493460930883884, + -0.027016224339604378, + -0.11294754594564438, + -0.0403422974050045, + 0.06151122227311134, + 0.015040741302073002, + 0.06175743043422699, + -0.052252981811761856, + -0.04291455075144768, + 0.07618483901023865, + 0.007945447228848934, + -0.031068172305822372, + 0.03857528045773506, + 0.04297307878732681, + 0.06307797133922577, + 0.012750869616866112, + -0.0073368968442082405, + -0.02827686443924904, + 0.026579171419143677, + 0.053086694329977036, + 0.009035507217049599, + -0.07998541742563248, + 0.06503323465585709, + 0.007848650217056274, + -0.06316440552473068, + -0.06237823888659477, + -0.008863520808517933, + -0.020336560904979706, + -0.04670053347945213, + -0.005312871653586626, + 0.04482229799032211, + -0.007838323712348938, + 0.020939644426107407, + -0.0267772376537323, + -0.05029188469052315, + -0.020427361130714417, + 0.010133571922779083, + 0.060256920754909515, + -0.031483400613069534, + -0.03230693191289902, + 0.03710454702377319, + -0.001619298243895173, + 0.032147299498319626, + 0.00040725659346207976, + -0.03183484822511673, + 0.09961576014757156, + 0.0543840266764164, + -0.09811200201511383, + 0.004776870831847191, + 0.0307688619941473, + -0.09965451806783676, + -0.05462448298931122, + 0.025558823719620705, + -0.1026885062456131, + 0.03938523679971695, + 0.001190026174299419, + -0.010230365209281445, + -0.04648004099726677, + 0.022165639325976372, + 0.0551476888358593, + 0.02732393890619278, + 0.09041853249073029, + 0.13184413313865662, + -0.04277326166629791, + 0.0303896926343441, + 0.036024484783411026, + 0.01574757695198059, + -0.13572275638580322, + 0.06310609728097916, + -0.035782523453235626, + 0.0397065244615078, + 0.025466233491897583, + 0.002733515575528145, + 0.006339057814329863, + -0.01069291029125452, + 0.004363148473203182, + -0.056203797459602356, + 0.0776812955737114, + 0.1144879087805748, + -0.07629851996898651, + -0.01958921179175377, + 0.0564647875726223, + 0.06833837181329727, + 0.03948815166950226, + 0.016158144921064377, + 0.033780843019485474, + 0.010164187289774418, + -0.031413447111845016, + -0.03084489516913891, + -0.007911428809165955, + -0.09975708276033401, + 0.04080219939351082, + 0.03836435452103615, + -0.02439408004283905, + 0.03290648013353348, + 0.05713827535510063, + -0.07764016091823578, + 0.01340060867369175, + 0.014950785785913467, + 0.06380461901426315, + 0.02360980585217476, + -0.08367625623941422, + -0.01830575428903103, + -0.11594187468290329, + -0.02944462187588215, + -0.04755818471312523, + -0.08259796351194382, + -0.05010896176099777, + 0.007552167400717735, + -0.02237243577837944, + -0.09545204043388367, + -0.07881216704845428, + 0.04193469509482384, + 0.1016058623790741, + -0.020242802798748016, + 0.02153684012591839, + 0.0536288283765316, + 0.002376577351242304, + -0.07795802503824234, + -0.09001991152763367, + -0.07788999378681183, + 0.020792460069060326, + -0.0012428245972841978, + 0.039782460778951645, + -0.006664233282208443, + -0.012827488593757153, + -0.08426947146654129, + -0.007307529915124178, + -0.07541503012180328, + -0.020194383338093758, + -0.005268547218292952, + 0.028347846120595932, + 0.02518446370959282, + -0.024277370423078537, + -0.00616319477558136, + -0.029663030058145523, + 0.03897194564342499, + -0.06025001406669617, + 0.07204943150281906, + -0.10075213015079498, + -0.057655349373817444, + 0.070869080722332, + 0.06916193664073944, + -0.006557384040206671, + 0.009928086772561073, + -0.09080831706523895, + -0.012706415727734566, + -0.07491294294595718, + 0.03327986225485802, + 0.049302879720926285, + -0.017477329820394516, + -0.06484489887952805, + -0.0545976348221302, + 0.10047679394483566, + 0.00457547465339303, + 0.0482061430811882, + -0.14925187826156616, + -0.036028239876031876, + 0.028770161792635918, + 0.10484170913696289, + -0.006335897836834192, + -0.09019771218299866, + -0.0215150099247694, + -0.04131471738219261, + 0.008083293214440346, + 0.04629502817988396, + 0.018520262092351913, + 0.12120276689529419, + -0.026279373094439507, + 0.0070840721018612385, + 0.023909524083137512, + -0.04206177592277527, + 0.04204293340444565, + -0.0681426078081131, + -0.02564515545964241, + 0.0010934724705293775, + 0.010854550637304783, + 0.014885160140693188, + 0.05128965899348259, + 0.043478406965732574 + ] +} +\ No newline at end of file diff --git a/lib/data/database.dart b/lib/data/database.dart @@ -1,5 +1,3 @@ -// lib/data/database.dart - import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; @@ -17,8 +15,9 @@ class AppDatabase { return await openDatabase( path, - version: 2, // Incremented version to trigger migration + version: 4, // Incremented to 4 for Comments table onCreate: (db, version) async { + // 1. Images Table await db.execute(''' CREATE TABLE images ( id TEXT PRIMARY KEY, @@ -28,14 +27,27 @@ class AppDatabase { ) '''); + // 2. Categories Table await db.execute(''' - CREATE TABLE boards ( + CREATE TABLE board_categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, createdAt TEXT ) '''); + // 3. Boards Table + await db.execute(''' + CREATE TABLE boards ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT, + category_id INTEGER, + createdAt TEXT, + FOREIGN KEY (category_id) REFERENCES board_categories (id) + ) + '''); + + // 4. Junction Table await db.execute(''' CREATE TABLE board_images ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -44,23 +56,56 @@ class AppDatabase { createdAt TEXT ) '''); + + // 5. Comments Table (New) + await db.execute(''' + CREATE TABLE comments ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + image_id TEXT, + content TEXT, + comment_type TEXT, + createdAt TEXT, + FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE + ) + '''); }, onUpgrade: (db, oldVersion, newVersion) async { - // Migrate from version 1 to version 2: Add analysis_data column + // ... Previous migrations (v1->v2, v2->v3) ... if (oldVersion < 2) { - // Check if column exists before adding - final tableInfo = await db.rawQuery('PRAGMA table_info(images)'); - final hasAnalysisData = tableInfo.any( - (column) => column['name'] == 'analysis_data', - ); + final tableInfo = await db.rawQuery('PRAGMA table_info(images)'); + if (!tableInfo.any((c) => c['name'] == 'analysis_data')) { + await db.execute('ALTER TABLE images ADD COLUMN analysis_data TEXT'); + } + } - if (!hasAnalysisData) { - await db.execute(''' - ALTER TABLE images ADD COLUMN analysis_data TEXT - '''); + if (oldVersion < 3) { + await db.execute(''' + CREATE TABLE IF NOT EXISTS board_categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT, + createdAt TEXT + ) + '''); + final tableInfo = await db.rawQuery('PRAGMA table_info(boards)'); + if (!tableInfo.any((c) => c['name'] == 'category_id')) { + await db.execute('ALTER TABLE boards ADD COLUMN category_id INTEGER'); } } + + // Migration v3 -> v4 (Comments) + if (oldVersion < 4) { + await db.execute(''' + CREATE TABLE IF NOT EXISTS comments ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + image_id TEXT, + content TEXT, + comment_type TEXT, + createdAt TEXT, + FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE + ) + '''); + } }, ); } -} +} +\ No newline at end of file diff --git a/lib/data/models/board_model.dart b/lib/data/models/board_model.dart @@ -1,12 +1,31 @@ -// lib/data/models/board_model.dart - class Board { final int id; final String name; + final String createdAt; + final int? categoryId; // Added categoryId + + Board({ + required this.id, + required this.name, + required this.createdAt, + this.categoryId, // Added categoryId to constructor + }); - Board({required this.id, required this.name}); + factory Board.fromMap(Map<String, dynamic> map) { + return Board( + id: map['id'], + name: map['name'], + createdAt: map['createdAt'], + categoryId: map['category_id'], // Map category_id from DB + ); + } - factory Board.fromMap(Map<String, dynamic> m) { - return Board(id: m['id'], name: m['name']); + Map<String, dynamic> toMap() { + return { + 'id': id, + 'name': name, + 'createdAt': createdAt, + 'category_id': categoryId, // Include category_id in map + }; } -} +} +\ No newline at end of file diff --git a/lib/data/models/category_model.dart b/lib/data/models/category_model.dart @@ -0,0 +1,27 @@ +class BoardCategory { + final int id; + final String name; + final String createdAt; + + BoardCategory({ + required this.id, + required this.name, + required this.createdAt, + }); + + factory BoardCategory.fromMap(Map<String, dynamic> map) { + return BoardCategory( + id: map['id'], + name: map['name'], + createdAt: map['createdAt'], + ); + } + + Map<String, dynamic> toMap() { + return { + 'id': id, + 'name': name, + 'createdAt': createdAt, + }; + } +} +\ No newline at end of file diff --git a/lib/data/models/comment_model.dart b/lib/data/models/comment_model.dart @@ -0,0 +1,56 @@ +enum CommentType { + illustrations, + layout, + motif, + typography, + colour, + font, + vibe, + other +} + +class Comment { + final int? id; // Database ID + final String imageId; // Foreign key to the Image + final String content; // The text content + final CommentType type; // The category of comment + final String createdAt; // Timestamp + + Comment({ + this.id, + required this.imageId, + required this.content, + required this.type, + required this.createdAt, + }); + + // Convert from Map (Database) to Model + factory Comment.fromMap(Map<String, dynamic> map) { + return Comment( + id: map['id'] as int?, + imageId: map['image_id'] as String, + content: map['content'] as String, + type: _parseType(map['comment_type'] as String), + createdAt: map['createdAt'] as String, + ); + } + + // Convert from Model to Map (Database) + Map<String, dynamic> toMap() { + return { + 'id': id, + 'image_id': imageId, + 'content': content, + 'comment_type': type.name, // Stores as string e.g., "illustrations" + 'createdAt': createdAt, + }; + } + + // Helper to parse string to Enum safely + static CommentType _parseType(String typeString) { + return CommentType.values.firstWhere( + (e) => e.name == typeString, + orElse: () => CommentType.other, + ); + } +} +\ No newline at end of file diff --git a/lib/data/repos/board_category_repo.dart b/lib/data/repos/board_category_repo.dart @@ -0,0 +1,26 @@ +import 'package:adobe/data/database.dart'; + +class BoardCategoryRepository { + Future<int> createCategory(String name) async { + final db = await AppDatabase.db; + return await db.insert('board_categories', { + 'name': name, + 'createdAt': DateTime.now().toIso8601String(), + }); + } + + Future<List<Map<String, dynamic>>> getAllCategories() async { + final db = await AppDatabase.db; + return await db.query('board_categories', orderBy: 'createdAt DESC'); + } + + Future<List<Map<String, dynamic>>> getBoardsByCategory(int categoryId) async { + final db = await AppDatabase.db; + return await db.query( + 'boards', + where: 'category_id = ?', + whereArgs: [categoryId], + orderBy: 'createdAt DESC', + ); + } +} +\ No newline at end of file diff --git a/lib/data/repos/board_image_repo.dart b/lib/data/repos/board_image_repo.dart @@ -23,4 +23,27 @@ class BoardImageRepository { WHERE board_images.board_id = ? ''', [boardId]); } + + Future<void> removeImageFromBoard(int boardId, String imageId) async { + final db = await AppDatabase.db; + await db.delete( + "board_images", + where: "board_id = ? AND image_id = ?", + whereArgs: [boardId, imageId], + ); + } + + Future<List<String>> getBoardPreviewImages(int boardId) async { + final db = await AppDatabase.db; + final result = await db.rawQuery(''' + SELECT images.filePath + FROM images + JOIN board_images ON images.id = board_images.image_id + WHERE board_images.board_id = ? + ORDER BY board_images.createdAt DESC + LIMIT 4 + ''', [boardId]); + + return result.map((e) => e['filePath'] as String).toList(); + } } diff --git a/lib/data/repos/board_repo.dart b/lib/data/repos/board_repo.dart @@ -1,18 +1,35 @@ -// lib/data/repos/board_repo.dart - import 'package:adobe/data/database.dart'; class BoardRepository { - Future<int> createBoard(String name) async { + // Updated to accept optional categoryId + Future<int> createBoard(String name, {int? categoryId}) async { final db = await AppDatabase.db; return await db.insert("boards", { "name": name, + "category_id": categoryId, // Save the category link "createdAt": DateTime.now().toString() }); } Future<List<Map<String, dynamic>>> getBoards() async { final db = await AppDatabase.db; - return await db.query("boards"); + return await db.query("boards", orderBy: "createdAt DESC"); + } + + Future<void> updateBoardName(int id, String newName) async { + final db = await AppDatabase.db; + await db.update( + "boards", + {"name": newName}, + where: "id = ?", + whereArgs: [id], + ); + } + + Future<void> deleteBoard(int id) async { + final db = await AppDatabase.db; + await db.delete("boards", where: "id = ?", whereArgs: [id]); + // Remove associations (images stay in "All Images", but link to board is gone) + await db.delete("board_images", where: "board_id = ?", whereArgs: [id]); } } diff --git a/lib/data/repos/comment_repo.dart b/lib/data/repos/comment_repo.dart @@ -0,0 +1,33 @@ +import 'package:adobe/data/database.dart'; +import 'package:adobe/data/models/comment_model.dart'; + +class CommentRepository { + // Add a new comment to the database + Future<int> addComment(Comment comment) async { + final db = await AppDatabase.db; + return await db.insert('comments', comment.toMap()); + } + + // Retrieve all comments for a specific image + Future<List<Comment>> getCommentsForImage(String imageId) async { + final db = await AppDatabase.db; + final result = await db.query( + 'comments', + where: 'image_id = ?', + whereArgs: [imageId], + orderBy: 'createdAt DESC', // Most recent comments first + ); + + return result.map((e) => Comment.fromMap(e)).toList(); + } + + // Optional: Delete a comment + Future<int> deleteComment(int id) async { + final db = await AppDatabase.db; + return await db.delete( + 'comments', + where: 'id = ?', + whereArgs: [id], + ); + } +} +\ No newline at end of file diff --git a/lib/data/repos/image_repo.dart b/lib/data/repos/image_repo.dart @@ -31,4 +31,19 @@ class ImageRepository { final db = await AppDatabase.db; return await db.query("images"); } + + Future<void> deleteImage(String id) async { + final db = await AppDatabase.db; + // Delete from images table + await db.delete("images", where: "id = ?", whereArgs: [id]); + // Also delete any connections to boards + await db.delete("board_images", where: "image_id = ?", whereArgs: [id]); + } + + Future<String?> getImagePath(String id) async { + final db = await AppDatabase.db; + final res = await db.query("images", columns: ["filePath"], where: "id = ?", whereArgs: [id]); + if (res.isNotEmpty) return res.first["filePath"] as String; + return null; + } } diff --git a/lib/main.dart b/lib/main.dart @@ -1,12 +1,14 @@ -// lib/main.dart - import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:adobe/services/theme_service.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:adobe/ui/pages/home_page.dart'; import 'package:adobe/ui/pages/share_handler_page.dart'; void main() { + WidgetsFlutterBinding.ensureInitialized(); + // Removed await calls here to prevent startup freeze. + // Initialization logic is now handled inside MyApp. runApp(const MyApp()); } @@ -20,47 +22,72 @@ class MyApp extends StatefulWidget { class _MyAppState extends State<MyApp> { late StreamSubscription _intentSub; final _navigatorKey = GlobalKey<NavigatorState>(); + + // Controls the loading screen + bool _isReady = false; @override void initState() { super.initState(); + _initApp(); + } - // 1. LISTEN: App is running in memory - _intentSub = ReceiveSharingIntent.instance.getMediaStream().listen( - (List<SharedMediaFile> value) { - if (value.isNotEmpty) { - // The URL, Text, or file path is inside the 'path' property - _navigateToSharePage(value.first.path); - } - }, - onError: (err) { - debugPrint("Share Error: $err"); - }, - ); + Future<void> _initApp() async { + // 1. Load Theme (Wrapped in try-catch to be safe) + try { + await themeService.loadTheme(); + } catch (e) { + debugPrint("⚠️ Theme load error (ignoring): $e"); + } - // 2. LISTEN: App is closed and opened via Share - ReceiveSharingIntent.instance.getInitialMedia().then(( - List<SharedMediaFile> value, - ) { - if (value.isNotEmpty) { - _navigateToSharePage(value.first.path); + // 2. Setup Sharing Intent Listener + try { + // Listen for shared files while app is running + _intentSub = ReceiveSharingIntent.instance.getMediaStream().listen( + (List<SharedMediaFile> value) { + if (value.isNotEmpty) { + _navigateToSharePage(value.first.path); + } + }, + onError: (err) { + debugPrint("⚠️ Share stream error: $err"); + }, + ); - // Optional: Clear the intent so it doesn't re-trigger on reload + // Check if the app was launched via a share action (Cold Start) + final initialMedia = await ReceiveSharingIntent.instance.getInitialMedia(); + if (initialMedia.isNotEmpty) { + _navigateToSharePage(initialMedia.first.path); ReceiveSharingIntent.instance.reset(); } - }); + } catch (e) { + debugPrint("⚠️ Share intent error: $e"); + } + + // Listen for theme changes to rebuild the UI dynamically + themeService.addListener(_updateTheme); + + if (mounted) { + setState(() { + _isReady = true; + }); + } + } + + void _updateTheme() { + if (mounted) setState(() {}); } @override void dispose() { - _intentSub.cancel(); + try { _intentSub.cancel(); } catch (_) {} + themeService.removeListener(_updateTheme); super.dispose(); } void _navigateToSharePage(String sharedText) { - // Navigate to the Share Handler Page - // Use a microtask to ensure the navigator is ready - Future.delayed(Duration.zero, () { + // Wait for the frame to render before pushing the route + WidgetsBinding.instance.addPostFrameCallback((_) { _navigatorKey.currentState?.push( MaterialPageRoute( builder: (_) => ShareHandlerPage(sharedText: sharedText), @@ -71,9 +98,56 @@ class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { + // Show a loading spinner until essential services are initialized + if (!_isReady) { + return const MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + backgroundColor: Colors.white, + body: Center(child: CircularProgressIndicator()), + ), + ); + } + return MaterialApp( navigatorKey: _navigatorKey, debugShowCheckedModeBanner: false, + + // Connect the ThemeService mode (Light / Dark / System) + themeMode: themeService.mode, + + // Light Theme Definition + theme: ThemeData( + fontFamily: 'GeneralSans', + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.blue, + brightness: Brightness.light + ), + useMaterial3: true, + scaffoldBackgroundColor: Colors.white, + appBarTheme: const AppBarTheme( + backgroundColor: Colors.white, + foregroundColor: Colors.black, + surfaceTintColor: Colors.transparent, + ), + ), + + // Dark Theme Definition + darkTheme: ThemeData( + fontFamily: 'GeneralSans', + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.blue, + brightness: Brightness.dark + ), + useMaterial3: true, + scaffoldBackgroundColor: Colors.grey[900], + appBarTheme: AppBarTheme( + backgroundColor: Colors.grey[900], + foregroundColor: Colors.white, + surfaceTintColor: Colors.transparent, + ), + ), + home: const HomePage(), ); } diff --git a/lib/services/board_services.dart b/lib/services/board_services.dart @@ -0,0 +1,67 @@ +// lib/services/board_services.dart + +import '../data/repos/board_repo.dart'; +import '../data/repos/board_image_repo.dart'; +import '../data/repos/image_repo.dart'; +import 'dart:io'; + +class BoardService { + final _boardRepo = BoardRepository(); + final _boardImgRepo = BoardImageRepository(); + final _imgRepo = ImageRepository(); + + Future<void> renameBoard(int boardId, String newName) async { + if (newName.trim().isEmpty) return; + await _boardRepo.updateBoardName(boardId, newName.trim()); + } + + // Option A: Just delete the board (Images stay in "All Images") + Future<void> deleteBoardOnly(int boardId) async { + await _boardRepo.deleteBoard(boardId); + } + + // Option B: Delete Board AND all images inside it (Physical delete) + Future<void> deleteBoardAndContent(int boardId) async { + // 1. Get all images in this board + final images = await _boardImgRepo.getImagesOfBoard(boardId); + + // 2. Loop through and delete them physically + for (var img in images) { + final String id = img['id']; + final String path = img['filePath']; + + // Delete file + final file = File(path); + if (await file.exists()) { + await file.delete(); + } + + // Delete from DB (images table) + await _imgRepo.deleteImage(id); + } + + // 3. Finally delete the board itself + await _boardRepo.deleteBoard(boardId); + } + + Future<void> copyAllImages(int sourceBoardId, int targetBoardId) async { + // 1. Get all images from source + final images = await _boardImgRepo.getImagesOfBoard(sourceBoardId); + + // 2. Add them to target (Repo handles duplicates usually, or simple insert) + for (var img in images) { + await _boardImgRepo.saveToBoard(targetBoardId, img['id']); + } + } + + Future<void> moveAllImages(int sourceBoardId, int targetBoardId) async { + // 1. Copy first + await copyAllImages(sourceBoardId, targetBoardId); + + // 2. Remove from source + final images = await _boardImgRepo.getImagesOfBoard(sourceBoardId); + for (var img in images) { + await _boardImgRepo.removeImageFromBoard(sourceBoardId, img['id']); + } + } +} +\ No newline at end of file diff --git a/lib/services/color_analyzer_service.dart b/lib/services/color_analyzer_service.dart @@ -0,0 +1,16 @@ +import 'package:flutter/foundation.dart'; +import 'python_service.dart'; + +class ColorAnalyzerService { + final PythonService _pythonService = PythonService(); + + Future<Map<String, dynamic>?> analyze(String imagePath) async { + try { + debugPrint("Starting Color Style Analysis..."); + return await _pythonService.analyzeColorStyle(imagePath); + } catch (e) { + debugPrint("Color Analysis Exception: $e"); + return {'success': false, 'error': e.toString()}; + } + } +} diff --git a/lib/services/download_service.dart b/lib/services/download_service.dart @@ -54,13 +54,13 @@ class DownloadService { } var contentType = response.headers['content-type']; - debugPrint("🔹 Type: $contentType"); + debugPrint("Type: $contentType"); // CASE A → HTML webpage (NOT a direct image) if (contentType != null && !contentType.startsWith('image/')) { - debugPrint("📄 It's a website. Extracting real image..."); + debugPrint("It's a website. Extracting real image..."); final document = parser.parse(response.body); @@ -76,8 +76,8 @@ class DownloadService { // Force highest resolution cdn = _unescapeUrl(cdn); - cdn = cdn.split("=").first + "=s0"; - debugPrint("📸 Google Photos Image Found: $cdn"); + cdn = "${cdn.split("=").first}=s0"; + debugPrint("Google Photos Image Found: $cdn"); return downloadAndSaveImage(cdn); } @@ -110,7 +110,7 @@ class DownloadService { if (viewerMatch != null) { String imgUrl = viewerMatch.group(1)!; imgUrl = _unescapeUrl(imgUrl); - debugPrint("🖼️ Google Viewer Direct Image: $imgUrl"); + debugPrint("Google Viewer Direct Image: $imgUrl"); return downloadAndSaveImage(imgUrl); } @@ -123,13 +123,13 @@ class DownloadService { String? ogImg = meta.attributes['content']; if (ogImg != null) { ogImg = _unescapeUrl(ogImg); - debugPrint("🎯 OG Image Found: $ogImg"); + debugPrint("OG Image Found: $ogImg"); return downloadAndSaveImage(ogImg); } } } - debugPrint("❌ No valid image found inside this page."); + debugPrint("No valid image found inside this page."); return null; } @@ -162,11 +162,11 @@ class DownloadService { await _repo.insertImage(imageId, filePath); - debugPrint("✅ Saved Successfully! → $filePath"); + debugPrint("Saved Successfully! → $filePath"); return imageId; } catch (e) { - debugPrint("❌ Error: $e"); + debugPrint("Error: $e"); return null; } } -} -\ No newline at end of file +} diff --git a/lib/services/embedding_analyzer_service.dart b/lib/services/embedding_analyzer_service.dart @@ -0,0 +1,123 @@ +import 'dart:convert'; +import 'dart:math'; +import 'dart:io'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_onnxruntime/flutter_onnxruntime.dart'; +import 'package:path_provider/path_provider.dart'; +import '../utils/clip_image_processor.dart'; + +class EmbeddingAnalyzerService { + static OrtSession? _session; + static List<List<double>>? _centroids; + static List<String>? _classes; + + static Future<void> initialize() async { + if (_session != null) return; + + try { + debugPrint("Initializing Embeddings (Dino/CLIP)..."); + + final rawAsset = await rootBundle.load('assets/clip_image_encoder.onnx'); + final dir = await getTemporaryDirectory(); + final modelFile = File('${dir.path}/clip_model.onnx'); + + if (!await modelFile.exists()) { + await modelFile.writeAsBytes(rawAsset.buffer.asUint8List()); + } + + // Initialize runtime + final ort = OnnxRuntime(); + _session = await ort.createSession(modelFile.path); + + final jsonString = await rootBundle.loadString('assets/style_embeddings.json'); + final jsonData = json.decode(jsonString); + + _classes = List<String>.from(jsonData['classes']); + _centroids = (jsonData['centroids'] as List).map((e) => List<double>.from(e)).toList(); + } catch (e) { + debugPrint("Embeddings Init Error: $e"); + } + } + + static Future<Map<String, dynamic>?> analyze(String imagePath) async { + if (_session == null) await initialize(); + + OrtValue? inputOrt; + OrtValue? outputOrt; + + try { + final float32Input = await ClipImageProcessor.preprocess(imagePath); + if (float32Input == null) return null; + + // Create Tensor + // Note: ensure ClipImageProcessor returns a flat List<double> + inputOrt = await OrtValue.fromList( + float32Input, + [1, 3, 224, 224] + ); + + // Run Inference + // 'image' is the input name for CLIP. Check your model if it differs (e.g. 'input') + final outputs = await _session!.run({"image": inputOrt}); + + // Get Output + outputOrt = outputs['output']; // or outputs['image_features'] depending on model + // If outputOrt is null, try iterating outputs.values.first + final resultOrt = outputOrt ?? outputs.values.first; + + if (resultOrt == null) throw Exception("No output from model"); + + // Flatten Output + final List<dynamic> rawList = await resultOrt.asList(); + final List<double> imgFeat = []; + + void flatten(dynamic data) { + if (data is num) imgFeat.add(data.toDouble()); + else if (data is List) for (var item in data) flatten(item); + } + flatten(rawList); + + // Normalize & Compare + final normFeat = _l2Normalize(imgFeat); + List<Map<String, dynamic>> scores = []; + + for (int i = 0; i < _classes!.length; i++) { + double score = _dotProduct(normFeat, _centroids![i]); + scores.add({"name": _classes![i], "score": score * 100.0}); + } + + scores.sort((a, b) => (b['score'] as double).compareTo(a['score'] as double)); + + return { + "success": true, + "label": scores.first['name'], + "top5": scores.take(5).toList(), + }; + + } catch (e) { + debugPrint("Embeddings Analysis Error: $e"); + return null; + } finally { + inputOrt?.dispose(); + outputOrt?.dispose(); + } + } + + static List<double> _l2Normalize(List<double> vec) { + double sum = vec.fold(0, (p, c) => p + c * c); + double norm = sqrt(sum); + if (norm == 0) return vec; + return vec.map((v) => v / norm).toList(); + } + + static double _dotProduct(List<double> a, List<double> b) { + double sum = 0; + // Ensure lengths match to avoid range errors + int len = min(a.length, b.length); + for (int i = 0; i < len; i++) { + sum += a[i] * b[i]; + } + return sum; + } +} diff --git a/lib/services/image_analyzer_service.dart b/lib/services/image_analyzer_service.dart @@ -1,82 +1,53 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; import 'dart:convert'; +import 'package:flutter/foundation.dart'; + +// Import the segregated services +import 'layout_analyzer_service.dart'; +import 'color_analyzer_service.dart'; +import 'texture_analyzer_service.dart'; +import 'embedding_analyzer_service.dart'; import 'emotional_embeddings_service.dart'; import 'lighting_service.dart'; class ImageAnalyzerService { - // Channel for Python/Chaquopy (OpenCV) - static const MethodChannel _channel = MethodChannel( - 'com.example.adobe/image_analyzer', - ); + /// Runs all 4 analysis tools in parallel and returns a combined JSON Map. + static Future<Map<String, dynamic>> analyzeFullSuite(String imagePath) async { + // 1. Instantiate services + final layoutService = LayoutAnalyzerService(); + final colorService = ColorAnalyzerService(); + final textureService = TextureAnalyzerService(); + // EmbeddingService is static - static Future<Map<String, dynamic>?> analyzeImage(String imagePath) async { try { - // 1. Run BOTH analyzers in parallel (Faster performance) + // 2. Run in parallel for performance final results = await Future.wait([ - // Task A: Python OpenCV (Composition, Colors, Geometry) - _channel.invokeMethod('analyzeImage', {'imagePath': imagePath}), - - // Task C: Emotion detection - EmotionalEmbeddingsService.analyzeImage(imagePath), - - // Task D: Lighting style detection - LightingEmbeddingsService.analyzeImage(imagePath), - - + layoutService.analyze(imagePath), // Index 0: Layout + colorService.analyze(imagePath), // Index 1: Color + textureService.analyze(imagePath), // Index 2: Texture + EmbeddingAnalyzerService.analyze(imagePath) // Index 3: Embeddings ]); - // 2. Extract Results - final String? pyResultJson = results[0] as String?; - final Map<String, dynamic>? emotionMap = - results[1] as Map<String, dynamic>?; - final Map<String, dynamic>? lightingMap = - results[2] as Map<String, dynamic>?; - // 3. Parse Python Result (This is the Base) - Map<String, dynamic> finalResult = {}; - - if (pyResultJson != null) { - try { - finalResult = json.decode(pyResultJson); - } catch (e) { - debugPrint("Error decoding Python JSON: $e"); - // Continue even if python fails, so we can try to show AI results - finalResult = { - 'success': true, - 'error_partial': 'Python analysis failed', - }; - } - } else { - finalResult = {'success': true}; - } - - // 4. Merge AI Style Result into the Base JSON - if (emotionMap != null && emotionMap['success'] == true) { - finalResult['emotion_label'] = emotionMap['label']; - finalResult['emotion_scores'] = - emotionMap['scores']; // Map of style probabilities - } - - if (lightingMap != null && lightingMap['success'] == true) { - finalResult['lighting_label'] = lightingMap['label']; - finalResult['lighting_scores'] = - lightingMap['scores']; // Map of style probabilities - } + // 3. Construct Unified Result + final Map<String, dynamic> combinedResult = { + 'success': true, + 'timestamp': DateTime.now().toIso8601String(), + 'layout': results[0], + 'color': results[1], + 'texture': results[2], // This is a List + 'embedding': results[3], + }; - debugPrint( - "Platform analyzing image finalResult[\"emotion_label\"]: ${finalResult["emotion_label"]}, finalResult[\"emotion_scores\"]: ${finalResult["emotion_scores"]}", - ); - debugPrint( - "Platform analyzing image finalResult[\"lighting_label\"]: ${finalResult["lighting_label"]}, finalResult[\"lighting_scores\"]: ${finalResult["lighting_scores"]}", - ); + return combinedResult; - return finalResult; - } on PlatformException catch (e) { - debugPrint("Platform Error analyzing image: ${e.message}"); - return {'success': false, 'error': e.message ?? 'Unknown error'}; } catch (e) { - debugPrint("Unexpected error: $e"); - return {'success': false, 'error': e.toString()}; + debugPrint("Master Analysis Failed: $e"); + return { + 'success': false, + 'error': e.toString(), + }; + } finally { + // 4. Cleanup heavy resources + textureService.dispose(); } } } diff --git a/lib/services/image_service.dart b/lib/services/image_service.dart @@ -4,26 +4,65 @@ import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'package:uuid/uuid.dart'; import '../data/repos/image_repo.dart'; +import '../data/repos/board_image_repo.dart'; class ImageService { - final _repo = ImageRepository(); + final _imgRepo = ImageRepository(); + final _boardImgRepo = BoardImageRepository(); Future<String> saveImage(File file) async { final dir = await getApplicationDocumentsDirectory(); final folder = Directory("${dir.path}/images"); if (!await folder.exists()) { - await folder.create(); + await folder.create(recursive: true); } final id = const Uuid().v4(); - final ext = file.path.split('.').last; + // Handle cases where file might not have an extension + String ext = 'jpg'; + if (file.path.contains('.')) { + ext = file.path.split('.').last; + } final newPath = "${folder.path}/$id.$ext"; final savedFile = await file.copy(newPath); - await _repo.insertImage(id, savedFile.path); + await _imgRepo.insertImage(id, savedFile.path); return id; } -} + + // 1. DELETE IMAGE (Completely removes file and DB entries) + Future<void> deleteImagePermanently(String imageId) async { + // A. Get path to delete physical file + final path = await _imgRepo.getImagePath(imageId); + if (path != null) { + final file = File(path); + if (await file.exists()) { + await file.delete(); + } + } + // B. Delete from DB (Repo handles cascade to board_images) + await _imgRepo.deleteImage(imageId); + } + + // 2. COPY TO BOARD (Keep in old board, add to new board) + Future<void> copyImageToBoard(String imageId, int targetBoardId) async { + // Just add a new entry in the mapping table + await _boardImgRepo.saveToBoard(targetBoardId, imageId); + } + + // 3. MOVE TO BOARD (Remove from old board, add to new board) + Future<void> moveImage(String imageId, int currentBoardId, int targetBoardId) async { + // A. Add to new + await _boardImgRepo.saveToBoard(targetBoardId, imageId); + // B. Remove from old + await _boardImgRepo.removeImageFromBoard(currentBoardId, imageId); + } + + // 4. REMOVE FROM BOARD (But keep file in "All Images") + Future<void> removeImageFromSpecificBoard(String imageId, int boardId) async { + await _boardImgRepo.removeImageFromBoard(boardId, imageId); + } +} +\ No newline at end of file diff --git a/lib/services/instagram_download_service.dart b/lib/services/instagram_download_service.dart @@ -1,74 +1,52 @@ import 'dart:io'; -import 'dart:convert'; -import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; import 'package:uuid/uuid.dart'; import 'package:adobe/data/repos/image_repo.dart'; +import 'python_service.dart'; class InstagramDownloadService { - static const MethodChannel _channel = MethodChannel( - 'com.example.adobe/instagram_downloader', - ); + final _pythonService = PythonService(); final _repo = ImageRepository(); final _uuid = const Uuid(); Future<List<String>?> downloadInstagramImage(String url) async { try { - // Get output directory final dir = await getApplicationDocumentsDirectory(); + + // Create directories final instagramDir = Directory('${dir.path}/instagram_downloads'); - if (!await instagramDir.exists()) { - await instagramDir.create(recursive: true); - } + if (!await instagramDir.exists()) await instagramDir.create(recursive: true); - // Call Python function - final String? result = await _channel.invokeMethod( - 'downloadInstagramImage', - {'url': url, 'outputDir': instagramDir.path}, - ); + final imagesDir = Directory('${dir.path}/images'); + if (!await imagesDir.exists()) await imagesDir.create(recursive: true); - if (result != null) { - final Map<String, dynamic> jsonResult = json.decode(result); + // Call Python Service + final jsonResult = await _pythonService.downloadInstagramImage(url, instagramDir.path); - if (jsonResult['success'] == true) { - final List<dynamic> paths = jsonResult['file_paths']; - final List<String> savedImageIds = []; + if (jsonResult != null && jsonResult['success'] == true) { + final List<dynamic> paths = jsonResult['file_paths']; + final List<String> savedImageIds = []; - final imagesDir = Directory('${dir.path}/images'); - if (!await imagesDir.exists()) { - await imagesDir.create(recursive: true); - } + // Save downloaded files to app storage and DB + for (var path in paths) { + final String sourcePath = path as String; + final File sourceFile = File(sourcePath); - // Iterate through all downloaded files - for (var path in paths) { - final String sourcePath = path as String; - + if (await sourceFile.exists()) { final String imageId = _uuid.v4(); final extension = sourcePath.split('.').last; final String targetPath = '${imagesDir.path}/$imageId.$extension'; - // Copy file - final sourceFile = File(sourcePath); - if (await sourceFile.exists()) { - await sourceFile.copy(targetPath); - - // Save to database - await _repo.insertImage(imageId, targetPath); - - savedImageIds.add(imageId); - } + await sourceFile.copy(targetPath); + await _repo.insertImage(imageId, targetPath); + savedImageIds.add(imageId); } - - return savedImageIds.isNotEmpty ? savedImageIds : null; - } else { - throw Exception(jsonResult['error'] ?? 'Unknown error'); } + return savedImageIds.isNotEmpty ? savedImageIds : null; } return null; - } on PlatformException catch (e) { - throw Exception("Error downloading Instagram image: ${e.message}"); } catch (e) { - throw Exception("Unexpected error: $e"); + throw Exception("Download failed: $e"); } } } diff --git a/lib/services/layout_analyzer_service.dart b/lib/services/layout_analyzer_service.dart @@ -0,0 +1,16 @@ +import 'package:flutter/foundation.dart'; +import 'python_service.dart'; + +class LayoutAnalyzerService { + final PythonService _pythonService = PythonService(); + + Future<Map<String, dynamic>?> analyze(String imagePath) async { + try { + debugPrint("Starting Layout Analysis..."); + return await _pythonService.analyzeLayout(imagePath); + } catch (e) { + debugPrint("Layout Analysis Exception: $e"); + return {'success': false, 'error': e.toString()}; + } + } +} diff --git a/lib/services/python_service.dart b/lib/services/python_service.dart @@ -0,0 +1,45 @@ +import 'dart:convert'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +class PythonService { + static const MethodChannel _channel = MethodChannel('com.example.adobe/methods'); + + /// 1. Layout Analysis (OpenCV) + Future<Map<String, dynamic>> analyzeLayout(String imagePath) async { + try { + final String? result = await _channel.invokeMethod('analyzeLayout', {'imagePath': imagePath}); + if (result == null) return {'success': false, 'error': 'Null response'}; + return json.decode(result); + } catch (e) { + debugPrint("Layout Analysis Error: $e"); + return {'success': false, 'error': e.toString()}; + } + } + + /// 2. Color Style Analysis (Scikit-Learn) + Future<Map<String, dynamic>> analyzeColorStyle(String imagePath) async { + try { + final String? result = await _channel.invokeMethod('analyzeColorStyle', {'imagePath': imagePath}); + if (result == null) return {'success': false, 'error': 'Null response'}; + return json.decode(result); + } catch (e) { + debugPrint("Color Analysis Error: $e"); + return {'success': false, 'error': e.toString()}; + } + } + + /// 3. Instagram Downloader + Future<Map<String, dynamic>?> downloadInstagramImage(String url, String outputDir) async { + try { + final String? result = await _channel.invokeMethod('downloadInstagramImage', { + 'url': url, + 'outputDir': outputDir + }); + return result != null ? json.decode(result) : null; + } catch (e) { + debugPrint("Instagram Download Error: $e"); + return null; + } + } +} diff --git a/lib/services/texture_analyzer_service.dart b/lib/services/texture_analyzer_service.dart @@ -0,0 +1,152 @@ +import 'dart:io'; +import 'dart:math'; +import 'dart:convert'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:image/image.dart' as img; +import 'package:flutter_onnxruntime/flutter_onnxruntime.dart'; +import 'package:path_provider/path_provider.dart'; + +class TextureAnalyzerService { + OrtSession? _session; + Map<String, List<double>>? _centroids; + + static const int INPUT_SIZE = 224; + static const int EMBED_DIM = 384; + static const int MAX_COUNT = 5; + static const double RELATIVE_THRESH = 0.85; + static const double ABSOLUTE_FLOOR = 0.15; + + Future<void> _loadResources() async { + if (_session != null) return; + + try { + debugPrint("Initializing Texture Service..."); + final dir = await getApplicationDocumentsDirectory(); + final modelFile = File('${dir.path}/dinov2.onnx'); + final dataFile = File('${dir.path}/dinov2.onnx.data'); + + if (!await modelFile.exists()) { + final data = await rootBundle.load('assets/dinov2.onnx'); + await modelFile.writeAsBytes(data.buffer.asUint8List(), flush: true); + } + + // Check for external data file + if (!await dataFile.exists()) { + try { + final data = await rootBundle.load('assets/dinov2.onnx.data'); + await dataFile.writeAsBytes(data.buffer.asUint8List(), flush: true); + } catch (_) { + // External data might not exist for all models + } + } + + _session = await OnnxRuntime().createSession(modelFile.path); + + final jsonStr = await rootBundle.loadString('assets/texture_centroids.json'); + final Map<String, dynamic> jsonMap = json.decode(jsonStr); + _centroids = {}; + jsonMap.forEach((k, v) => _centroids![k] = List<double>.from(v)); + + } catch (e) { + debugPrint("Texture Service Init Error: $e"); + } + } + + Future<List<Map<String, dynamic>>> analyze(String path) async { + await _loadResources(); + if (_session == null || _centroids == null) return []; + + OrtValue? inputOrt; + OrtValue? outputOrt; + + try { + // 1. Preprocess + final bytes = await File(path).readAsBytes(); + final image = img.decodeImage(bytes); + if (image == null) return []; + + final resized = img.copyResize(image, width: INPUT_SIZE, height: INPUT_SIZE); + + // 2. Normalize (ImageNet stats) + final List<double> inputFloats = List.filled(1 * 3 * INPUT_SIZE * INPUT_SIZE, 0.0); + int pixelIndex = 0; + for (int y = 0; y < INPUT_SIZE; y++) { + for (int x = 0; x < INPUT_SIZE; x++) { + final pixel = resized.getPixel(x, y); + inputFloats[pixelIndex] = ((pixel.r / 255.0) - 0.485) / 0.229; + inputFloats[pixelIndex + (INPUT_SIZE * INPUT_SIZE)] = ((pixel.g / 255.0) - 0.456) / 0.224; + inputFloats[pixelIndex + (2 * INPUT_SIZE * INPUT_SIZE)] = ((pixel.b / 255.0) - 0.406) / 0.225; + pixelIndex++; + } + } + + // 3. Inference + inputOrt = await OrtValue.fromList(inputFloats, [1, 3, INPUT_SIZE, INPUT_SIZE]); + final outputs = await _session!.run({"input": inputOrt}); + outputOrt = outputs['output']; + + if (outputOrt == null) throw Exception("Output tensor missing"); + + // Flatten output + final dynamic outputRaw = await outputOrt.asList(); + final List<double> rawOutput = []; + void flatten(dynamic data) { + if (data is num) rawOutput.add(data.toDouble()); + else if (data is List) for (var item in data) flatten(item); + } + flatten(outputRaw); + + // 4. Scoring (Cosine Similarity) + Map<String, double> rawScores = {}; + _centroids!.forEach((name, centroid) { + double sumSim = 0.0; + int patches = 256; + for (int i = 0; i < patches; i++) { + int start = i * EMBED_DIM; + if (start + EMBED_DIM <= rawOutput.length) { + sumSim += _cosineSim(rawOutput.sublist(start, start + EMBED_DIM), centroid); + } + } + rawScores[name] = sumSim / patches; + }); + + // 5. Filter & Sort + var sorted = rawScores.entries.toList()..sort((a, b) => b.value.compareTo(a.value)); + List<Map<String, dynamic>> finalResults = []; + + if (sorted.isNotEmpty) { + double topScore = sorted.first.value; + for (var entry in sorted) { + if (finalResults.length >= MAX_COUNT) break; + if (entry.value < ABSOLUTE_FLOOR) continue; + if (entry.value < (topScore * RELATIVE_THRESH)) break; + + finalResults.add({'name': entry.key, 'score': entry.value}); + } + } + return finalResults; + + } catch (e) { + debugPrint("Texture Analysis Failed: $e"); + return []; + } finally { + inputOrt?.dispose(); + outputOrt?.dispose(); + } + } + + double _cosineSim(List<double> a, List<double> b) { + double dot = 0.0, nA = 0.0, nB = 0.0; + for (int i = 0; i < a.length; i++) { + dot += a[i] * b[i]; + nA += a[i] * a[i]; + nB += b[i] * b[i]; + } + return (nA == 0 || nB == 0) ? 0.0 : dot / (sqrt(nA) * sqrt(nB)); + } + + void dispose() { + _session?.close(); + } +} diff --git a/lib/services/theme_service.dart b/lib/services/theme_service.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +// Global instance for easy access +final themeService = ThemeService(); + +class ThemeService with ChangeNotifier { + ThemeMode _mode = ThemeMode.system; + ThemeMode get mode => _mode; + + Future<void> loadTheme() async { + final prefs = await SharedPreferences.getInstance(); + final String? saved = prefs.getString('theme_mode'); + + if (saved == 'light') { + _mode = ThemeMode.light; + } else if (saved == 'dark') { + _mode = ThemeMode.dark; + } else { + _mode = ThemeMode.system; + } + + notifyListeners(); + } + + Future<void> toggleTheme() async { + final prefs = await SharedPreferences.getInstance(); + + if (_mode == ThemeMode.dark) { + _mode = ThemeMode.light; + await prefs.setString('theme_mode', 'light'); + } else { + _mode = ThemeMode.dark; + await prefs.setString('theme_mode', 'dark'); + } + + notifyListeners(); + } +} +\ No newline at end of file diff --git a/lib/ui/pages/all_image_page.dart b/lib/ui/pages/all_image_page.dart @@ -0,0 +1,126 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:adobe/data/repos/image_repo.dart'; +import 'package:adobe/services/image_service.dart'; +import 'package:adobe/services/theme_service.dart'; +import 'package:adobe/data/models/image_model.dart'; // Import Model +import '../widgets/analysis_dialog.dart'; // Import Dialog + +class AllImagesPage extends StatefulWidget { + const AllImagesPage({super.key}); + + @override + State<AllImagesPage> createState() => _AllImagesPageState(); +} + +class _AllImagesPageState extends State<AllImagesPage> { + final _imageRepo = ImageRepository(); + final _imageService = ImageService(); + late Future<List<Map<String, dynamic>>> _imagesFuture; + + @override + void initState() { + super.initState(); + _refreshImages(); + } + + void _refreshImages() { + setState(() { + _imagesFuture = _imageRepo.getAllImages(); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("All Images", style: TextStyle(fontWeight: FontWeight.bold)), + Text("Tap for analysis • Long press for options", style: TextStyle(fontSize: 12)), + ], + ), + centerTitle: true, + leading: IconButton( + icon: Icon(themeService.mode == ThemeMode.dark ? Icons.light_mode : Icons.dark_mode), + onPressed: () { themeService.toggleTheme(); }, + ), + ), + body: FutureBuilder<List<Map<String, dynamic>>>( + future: _imagesFuture, + builder: (context, snapshot) { + if (!snapshot.hasData) return const Center(child: CircularProgressIndicator()); + + final imagesData = snapshot.data!; + if (imagesData.isEmpty) return const Center(child: Text("No images saved yet.")); + + return GridView.builder( + padding: const EdgeInsets.all(8), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, crossAxisSpacing: 8, mainAxisSpacing: 8, + ), + itemCount: imagesData.length, + itemBuilder: (context, index) { + // Convert raw Map to ImageModel for the dialog + final imgModel = ImageModel.fromMap(imagesData[index]); + final file = File(imgModel.filePath); + + return GestureDetector( + // ADDED: Tap to view analysis + onTap: () { + showDialog( + context: context, + builder: (c) => AnalysisDialog(image: imgModel), + ); + }, + onLongPress: () => _confirmDeleteForever(imgModel.id), + child: Stack( + fit: StackFit.expand, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(12), + child: Image.file(file, fit: BoxFit.cover, errorBuilder: (_,__,___) => const Icon(Icons.broken_image)), + ), + // ADDED: Icon indicator if analysis exists + if (imgModel.analysisData != null) + Positioned( + top: 8, right: 8, + child: Container( + padding: const EdgeInsets.all(4), + decoration: const BoxDecoration(color: Colors.black54, shape: BoxShape.circle), + child: const Icon(Icons.analytics, size: 14, color: Colors.white), + ), + ) + ], + ), + ); + }, + ); + }, + ), + ); + } + + void _confirmDeleteForever(String imageId) { + showDialog( + context: context, + builder: (c) => AlertDialog( + title: const Text("Delete Permanently?"), + content: const Text("This will remove the image from your device and ALL boards."), + actions: [ + TextButton(onPressed: () => Navigator.pop(c), child: const Text("Cancel")), + ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.red), + onPressed: () async { + await _imageService.deleteImagePermanently(imageId); + if (c.mounted) Navigator.pop(c); + _refreshImages(); + }, + child: const Text("Delete"), + ), + ], + ), + ); + } +} diff --git a/lib/ui/pages/board_detail_page.dart b/lib/ui/pages/board_detail_page.dart @@ -1,5 +1,3 @@ -// lib/ui/pages/board_detail_page.dart - import 'dart:io'; import 'dart:convert'; import 'package:flutter/material.dart'; @@ -10,11 +8,14 @@ import 'package:adobe/data/models/board_model.dart'; import 'package:adobe/data/models/image_model.dart'; import 'package:adobe/data/repos/board_image_repo.dart'; import 'package:adobe/data/repos/image_repo.dart'; -import 'package:adobe/services/image_analyzer_service.dart'; +import 'package:adobe/data/repos/board_repo.dart'; +import 'package:adobe/services/image_service.dart'; +import 'package:adobe/services/theme_service.dart'; +import 'package:adobe/services/image_analyzer_service.dart'; // Master Service +import '../widgets/analysis_dialog.dart'; // Dialog Widget class BoardDetailPage extends StatefulWidget { final Board board; - const BoardDetailPage({super.key, required this.board}); @override @@ -24,8 +25,11 @@ class BoardDetailPage extends StatefulWidget { class _BoardDetailPageState extends State<BoardDetailPage> { final _boardImageRepo = BoardImageRepository(); final _imageRepo = ImageRepository(); + final _boardRepo = BoardRepository(); + final _imageService = ImageService(); final _imagePicker = ImagePicker(); final _uuid = const Uuid(); + late Future<List<ImageModel>> _imagesFuture; @override @@ -41,17 +45,12 @@ class _BoardDetailPageState extends State<BoardDetailPage> { Future<void> _pickImageFromGallery() async { try { - final XFile? image = await _imagePicker.pickImage( - source: ImageSource.gallery, - ); + final XFile? image = await _imagePicker.pickImage(source: ImageSource.gallery); if (image == null) return; - // Copy to images directory final dir = await getApplicationDocumentsDirectory(); final imagesDir = Directory('${dir.path}/images'); - if (!await imagesDir.exists()) { - await imagesDir.create(recursive: true); - } + if (!await imagesDir.exists()) await imagesDir.create(recursive: true); final extension = image.path.split('.').last; final imageId = _uuid.v4(); @@ -64,155 +63,79 @@ class _BoardDetailPageState extends State<BoardDetailPage> { // Trigger analysis _analyzeImage(imageId, targetPath); - if (mounted) { - setState(() { - _imagesFuture = _fetchImages(); - }); - } + if (mounted) setState(() { _imagesFuture = _fetchImages(); }); } catch (e) { - if (mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Error picking image: $e'))); - } + if (mounted) ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error: $e'))); } } Future<void> _analyzeImage(String imageId, String imagePath) async { try { - final result = await ImageAnalyzerService.analyzeImage(imagePath); - if (result != null && result['success'] == true) { + // Changed to use Master Runner + final result = await ImageAnalyzerService.analyzeFullSuite(imagePath); + if (result['success'] == true) { await _imageRepo.updateImageAnalysis(imageId, json.encode(result)); - if (mounted) { - setState(() { - _imagesFuture = _fetchImages(); - }); - } + if (mounted) setState(() { _imagesFuture = _fetchImages(); }); } } catch (e) { - debugPrint('Error analyzing image: $e'); + debugPrint('Analysis Error: $e'); } } void _showAnalysisDialog(ImageModel image) { - if (image.analysisData == null) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Analysis not available for this image')), - ); - return; - } - - try { - final analysis = json.decode(image.analysisData!); - if (analysis['success'] != true) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Analysis failed for this image')), - ); - return; - } - - final scores = analysis['scores'] as Map<String, dynamic>; - final top5 = analysis['top5'] as List; + showDialog( + context: context, + builder: (context) => AnalysisDialog(image: image), + ); + } - showDialog( - context: context, - builder: - (context) => Dialog( - child: Container( - padding: const EdgeInsets.all(16), - constraints: const BoxConstraints( - maxWidth: 400, - maxHeight: 600, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Image Analysis', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 16), - const Text( - 'Top 5 Features:', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - const SizedBox(height: 8), - Expanded( - child: ListView.builder( - shrinkWrap: true, - itemCount: top5.length, - itemBuilder: (context, index) { - final item = top5[index]; - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(item['name']), - Text( - '${(item['score'] * 100).toStringAsFixed(1)}%', - style: const TextStyle( - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ); - }, - ), - ), - const SizedBox(height: 16), - const Text( - 'All Scores:', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - const SizedBox(height: 8), - Expanded( - child: ListView.builder( - shrinkWrap: true, - itemCount: scores.length, - itemBuilder: (context, index) { - final entry = scores.entries.elementAt(index); - return Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(entry.key), - Text( - '${(entry.value * 100).toStringAsFixed(1)}%', - ), - ], - ), - ); - }, - ), - ), - const SizedBox(height: 16), - TextButton( - onPressed: () => Navigator.pop(context), - child: const Text('Close'), - ), - ], - ), - ), + void _showImageOptionsDialog(ImageModel img) { + showModalBottomSheet( + context: context, + builder: (context) => Container( + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: const Icon(Icons.remove_circle_outline, color: Colors.orange), + title: const Text("Remove from this Board"), + onTap: () async { + await _imageService.removeImageFromSpecificBoard(img.id, widget.board.id); + if (context.mounted) Navigator.pop(context); + setState(() { _imagesFuture = _fetchImages(); }); + }, ), - ); - } catch (e) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Error displaying analysis: $e'))); - } + ListTile( + leading: const Icon(Icons.delete_forever, color: Colors.red), + title: const Text("Delete Completely"), + onTap: () { Navigator.pop(context); _confirmDeleteForever(img.id); }, + ), + ], + ), + ), + ); + } + + void _confirmDeleteForever(String imageId) { + showDialog( + context: context, + builder: (c) => AlertDialog( + title: const Text("Delete Permanently?"), + actions: [ + TextButton(onPressed: () => Navigator.pop(c), child: const Text("Cancel")), + ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.red), + onPressed: () async { + await _imageService.deleteImagePermanently(imageId); + if (c.mounted) Navigator.pop(c); + setState(() { _imagesFuture = _fetchImages(); }); + }, + child: const Text("Delete"), + ), + ], + ), + ); } @override @@ -220,36 +143,25 @@ class _BoardDetailPageState extends State<BoardDetailPage> { return Scaffold( appBar: AppBar( title: Text(widget.board.name), + leading: IconButton( + icon: Icon(themeService.mode == ThemeMode.dark ? Icons.light_mode : Icons.dark_mode), + onPressed: () { themeService.toggleTheme(); }, + ), actions: [ - IconButton( - icon: const Icon(Icons.photo_library), - onPressed: _pickImageFromGallery, - tooltip: 'Add from Gallery', - ), + IconButton(icon: const Icon(Icons.photo_library), onPressed: _pickImageFromGallery), ], ), body: FutureBuilder<List<ImageModel>>( future: _imagesFuture, builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } - - if (!snapshot.hasData || snapshot.data!.isEmpty) { - return const Center( - child: Text("No images saved to this board yet."), - ); - } - + if (!snapshot.hasData) return const Center(child: CircularProgressIndicator()); final images = snapshot.data!; + if (images.isEmpty) return const Center(child: Text("No images.")); return GridView.builder( padding: const EdgeInsets.all(8), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 8, - mainAxisSpacing: 8, - childAspectRatio: 0.8, // Taller for images + crossAxisCount: 2, crossAxisSpacing: 8, mainAxisSpacing: 8, childAspectRatio: 0.8, ), itemCount: images.length, itemBuilder: (context, index) { @@ -258,51 +170,20 @@ class _BoardDetailPageState extends State<BoardDetailPage> { return GestureDetector( onTap: () => _showAnalysisDialog(img), + onLongPress: () => _showImageOptionsDialog(img), child: Stack( + fit: StackFit.expand, children: [ ClipRRect( borderRadius: BorderRadius.circular(12), - child: - file.existsSync() - ? Image.file( - file, - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Container( - color: Colors.grey[300], - alignment: Alignment.center, - child: const Icon( - Icons.broken_image, - color: Colors.grey, - ), - ); - }, - ) - : Container( - color: Colors.grey[300], - child: const Icon( - Icons.error, - color: Colors.red, - ), - ), + child: Image.file(file, fit: BoxFit.cover, errorBuilder: (_,__,___) => const Icon(Icons.error)), ), if (img.analysisData != null) - Positioned( - top: 8, - right: 8, - child: Container( - padding: const EdgeInsets.all(6), - decoration: BoxDecoration( - color: Colors.green.withValues(alpha: 0.8), - shape: BoxShape.circle, - ), - child: const Icon( - Icons.analytics, - color: Colors.white, - size: 16, - ), - ), - ), + Positioned(top: 8, right: 8, child: Container( + padding: const EdgeInsets.all(4), + decoration: const BoxDecoration(color: Colors.black54, shape: BoxShape.circle), + child: const Icon(Icons.analytics, color: Colors.white, size: 16), + )), ], ), ); diff --git a/lib/ui/pages/board_list_page.dart b/lib/ui/pages/board_list_page.dart @@ -0,0 +1,466 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import '../../data/repos/board_repo.dart'; +import '../../data/repos/board_category_repo.dart'; +import '../../data/repos/board_image_repo.dart'; +import '../../data/models/board_model.dart'; +import '../../data/models/category_model.dart'; +import 'board_detail_page.dart'; +import 'image_analysis_page.dart'; + +class BoardListPage extends StatefulWidget { + const BoardListPage({super.key}); + + @override + State<BoardListPage> createState() => _BoardListPageState(); +} + +class _BoardListPageState extends State<BoardListPage> { + final _categoryRepo = BoardCategoryRepository(); + final _boardRepo = BoardRepository(); + final _boardImageRepo = BoardImageRepository(); + + Map<BoardCategory, List<Board>> _categorizedBoards = {}; + Map<int, List<String>> _boardPreviews = {}; + bool _isLoading = true; + + @override + void initState() { + super.initState(); + _loadData(); + } + + Future<void> _loadData() async { + setState(() => _isLoading = true); + try { + final categoriesRaw = await _categoryRepo.getAllCategories(); + final categories = + categoriesRaw.map((e) => BoardCategory.fromMap(e)).toList(); + + final Map<BoardCategory, List<Board>> newCategorizedBoards = {}; + final Map<int, List<String>> newPreviews = {}; + + for (final category in categories) { + final boardsRaw = await _categoryRepo.getBoardsByCategory(category.id); + final boards = boardsRaw.map((e) => Board.fromMap(e)).toList(); + newCategorizedBoards[category] = boards; + + for (final board in boards) { + final imagesRaw = await _boardImageRepo.getImagesOfBoard(board.id); + final paths = + imagesRaw.map((e) => e['filePath'] as String).take(5).toList(); + newPreviews[board.id] = paths; + } + } + + if (mounted) { + setState(() { + _categorizedBoards = newCategorizedBoards; + _boardPreviews = newPreviews; + _isLoading = false; + }); + } + } catch (e) { + debugPrint('Error loading boards: $e'); + if (mounted) setState(() => _isLoading = false); + } + } + + Future<void> _createCategoryDialog() async { + final nameController = TextEditingController(); + if (!mounted) return; + await showDialog( + context: context, + builder: + (c) => AlertDialog( + title: const Text("Create Category"), + content: TextField( + controller: nameController, + decoration: const InputDecoration(hintText: "Category Name"), + autofocus: true, + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(c), + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: () async { + if (nameController.text.isNotEmpty) { + await _categoryRepo.createCategory(nameController.text); + if (c.mounted) Navigator.pop(c); + _loadData(); + } + }, + child: const Text("Create"), + ), + ], + ), + ); + } + + Future<void> _createBoardDialog({BoardCategory? preSelectedCategory}) async { + final nameController = TextEditingController(); + final categories = _categorizedBoards.keys.toList(); + BoardCategory? selectedCategory = + preSelectedCategory ?? + (categories.isNotEmpty ? categories.first : null); + if (!mounted) return; + await showDialog( + context: context, + builder: + (c) => StatefulBuilder( + builder: + (context, setState) => AlertDialog( + title: const Text("Create New Board"), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: nameController, + decoration: const InputDecoration( + hintText: "Board Name", + ), + autofocus: true, + ), + const SizedBox(height: 16), + if (categories.isNotEmpty) + DropdownButton<BoardCategory>( + value: selectedCategory, + isExpanded: true, + hint: const Text("Select Category"), + items: + categories + .map( + (cat) => DropdownMenuItem( + value: cat, + child: Text(cat.name), + ), + ) + .toList(), + onChanged: + (val) => setState(() => selectedCategory = val), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(c), + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: () async { + if (nameController.text.isNotEmpty && + selectedCategory != null) { + await _boardRepo.createBoard( + nameController.text, + categoryId: selectedCategory!.id, + ); + if (c.mounted) Navigator.pop(c); + _loadData(); + } + }, + child: const Text("Create"), + ), + ], + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0, + title: const Text( + "Cookie point", + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.w600, + fontSize: 24, + fontFamily: 'GeneralSans', + ), + ), + actions: [ + IconButton( + icon: const Icon(Icons.hexagon_outlined, color: Colors.black), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (_) => const ImageAnalysisPage()), + ); + }, + ), + ], + ), + body: + _isLoading + ? const Center(child: CircularProgressIndicator()) + : Column( + children: [ + // Header Controls + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 12.0, + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: const [ + Text( + "Global", + style: TextStyle( + fontWeight: FontWeight.w500, + fontFamily: 'GeneralSans', + color: Colors.black87, + ), + ), + SizedBox(width: 8), + Icon( + Icons.keyboard_arrow_down, + size: 20, + color: Colors.black87, + ), + ], + ), + ), + const Spacer(), + const Icon( + Icons.splitscreen_outlined, + size: 24, + color: Colors.black87, + ), + const SizedBox(width: 12), + const Icon( + Icons.grid_view, + size: 24, + color: Colors.black87, + ), + ], + ), + ), + + // Main Content + Expanded( + child: + _categorizedBoards.isEmpty + ? Center( + child: ElevatedButton( + onPressed: _createCategoryDialog, + child: const Text("Create Your First Category"), + ), + ) + : ListView.builder( + padding: const EdgeInsets.only(bottom: 40), + itemCount: _categorizedBoards.length, + itemBuilder: (context, index) { + final category = _categorizedBoards.keys + .elementAt(index); + final boards = _categorizedBoards[category]!; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Category Header + Padding( + padding: const EdgeInsets.fromLTRB( + 20, + 0, + 20, + 8, + ), + child: Row( + children: [ + Expanded( + child: Text( + category.name, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w500, + color: Color.fromARGB( + 255, + 38, + 56, + 255, + ), + fontFamily: 'GeneralSans', + ), + ), + ), + ], + ), + ), + + if (boards.isEmpty) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20, + ), + child: GestureDetector( + onTap: + () => _createBoardDialog( + preSelectedCategory: category, + ), + child: const Text( + "+ Add Board", + style: TextStyle( + color: Colors.blue, + fontWeight: FontWeight.w500, + ), + ), + ), + ) + else + ...boards.map( + (board) => _buildBoardPreviewCard( + board, + category.name, + ), + ), + + const SizedBox(height: 12), + ], + ); + }, + ), + ), + ], + ), + floatingActionButton: FloatingActionButton( + onPressed: _createCategoryDialog, + child: const Icon(Icons.add), + ), + ); + } + + Widget _buildBoardPreviewCard(Board board, String categoryName) { + final previewImages = _boardPreviews[board.id] ?? []; + + return GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (_) => BoardDetailPage(board: board)), + ).then((_) => _loadData()); + }, + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + // Clip behavior for the MAIN card corners + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + border: Border.all(color: Colors.grey.shade200), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header inside (with padding) + Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + children: [ + Text( + board.name, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + fontFamily: 'GeneralSans', + ), + ), + const Spacer(), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => BoardDetailPage(board: board), + ), + ).then((_) => _loadData()); + }, + child: const Icon(Icons.add, color: Colors.black, size: 24), + ), + const SizedBox(width: 8), + const Icon( + Icons.chevron_right, + color: Colors.black, + size: 24, + ), + ], + ), + ), + + // Images List + SizedBox( + height: 140, + child: ListView.separated( + padding: EdgeInsets.zero, + scrollDirection: Axis.horizontal, + itemCount: previewImages.isEmpty ? 1 : previewImages.length, + // FIXED: Changed VerticalDivider to a Container to ensure it renders visible + separatorBuilder: + (_, __) => Container( + width: 1, + color: const Color.fromARGB( + 255, + 169, + 169, + 169, + ), // Visible grey divider + ), + itemBuilder: (context, index) { + if (previewImages.isEmpty) { + return Container( + width: 100, + color: Colors.grey[50], + child: const Center( + child: Text( + "Empty", + style: TextStyle(color: Colors.grey), + ), + ), + ); + } + + final imagePath = previewImages[index]; + return SizedBox( + width: 110, + // ADDED: ClipRRect for "very small image radius" + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), // Small radius + child: Image.file( + File(imagePath), + fit: BoxFit.cover, + errorBuilder: + (c, e, s) => Container( + color: Colors.grey[100], + child: const Icon( + Icons.broken_image, + color: Colors.grey, + ), + ), + ), + ), + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/ui/pages/board_page.dart b/lib/ui/pages/board_page.dart @@ -1,5 +1,3 @@ -// lib/ui/pages/board_page.dart - import 'dart:io'; import 'package:flutter/material.dart'; diff --git a/lib/ui/pages/home_page.dart b/lib/ui/pages/home_page.dart @@ -1,171 +1,12 @@ -// lib/ui/pages/home_page.dart - import 'package:flutter/material.dart'; -import 'package:adobe/data/repos/board_repo.dart'; -import 'package:adobe/data/models/board_model.dart'; -import 'package:adobe/ui/pages/board_detail_page.dart'; -import 'package:adobe/ui/pages/image_analysis_page.dart'; +import 'package:adobe/ui/pages/board_list_page.dart'; -class HomePage extends StatefulWidget { +class HomePage extends StatelessWidget { const HomePage({super.key}); @override - State<HomePage> createState() => _HomePageState(); -} - -class _HomePageState extends State<HomePage> { - final _boardRepo = BoardRepository(); - late Future<List<Board>> _boardsFuture; - - @override - void initState() { - super.initState(); - _refreshBoards(); - } - - void _refreshBoards() { - setState(() { - _boardsFuture = _boardRepo.getBoards().then((data) { - return data.map((e) => Board.fromMap(e)).toList(); - }); - }); - } - - @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text("My Boards"), - centerTitle: true, - actions: [ - IconButton( - icon: const Icon(Icons.analytics), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute(builder: (_) => const ImageAnalysisPage()), - ); - }, - tooltip: 'Image Analysis', - ), - ], - ), - floatingActionButton: FloatingActionButton( - onPressed: _showCreateBoardDialog, - child: const Icon(Icons.add), - ), - // Pull to Refresh allows you to update the list after sharing an image - body: RefreshIndicator( - onRefresh: () async => _refreshBoards(), - child: FutureBuilder<List<Board>>( - future: _boardsFuture, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } - - if (!snapshot.hasData || snapshot.data!.isEmpty) { - return ListView( - children: const [ - SizedBox(height: 200), - Center(child: Text("No boards yet. Create one!")), - ], - ); - } - - final boards = snapshot.data!; - - return GridView.builder( - padding: const EdgeInsets.all(12), - itemCount: boards.length, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 12, - mainAxisSpacing: 12, - childAspectRatio: 1.2, // Rectangular cards - ), - itemBuilder: (context, index) { - final board = boards[index]; - return _buildBoardCard(board); - }, - ); - }, - ), - ), - ); - } - - Widget _buildBoardCard(Board board) { - return GestureDetector( - onTap: () { - // Navigate to the details of this board - Navigator.push( - context, - MaterialPageRoute(builder: (_) => BoardDetailPage(board: board)), - ).then((_) => _refreshBoards()); // Refresh when coming back - }, - child: Container( - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(16), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.05), - blurRadius: 5, - offset: const Offset(0, 4), - ), - ], - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon(Icons.dashboard, size: 40, color: Colors.grey), - const SizedBox(height: 8), - Text( - board.name, - style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - textAlign: TextAlign.center, - ), - const SizedBox(height: 4), - const Text( - "Tap to view", - style: TextStyle(fontSize: 12, color: Colors.grey), - ), - ], - ), - ), - ); - } - - void _showCreateBoardDialog() { - final controller = TextEditingController(); - showDialog( - context: context, - builder: - (c) => AlertDialog( - title: const Text("New Board"), - content: TextField( - controller: controller, - decoration: const InputDecoration(hintText: "Board Name"), - autofocus: true, - ), - actions: [ - TextButton( - onPressed: () => Navigator.pop(c), - child: const Text("Cancel"), - ), - ElevatedButton( - onPressed: () async { - if (controller.text.isNotEmpty) { - await _boardRepo.createBoard(controller.text); - if (c.mounted) Navigator.pop(c); - _refreshBoards(); - } - }, - child: const Text("Create"), - ), - ], - ), - ); + // Directly return the BoardListPage, which has its own Scaffold and AppBar + return const BoardListPage(); } -} +} +\ No newline at end of file diff --git a/lib/ui/pages/image_analysis_page.dart b/lib/ui/pages/image_analysis_page.dart @@ -1,8 +1,11 @@ import 'dart:io'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:path_provider/path_provider.dart'; import 'package:adobe/services/image_analyzer_service.dart'; +import 'package:adobe/data/models/image_model.dart'; +import '../widgets/analysis_dialog.dart'; class ImageAnalysisPage extends StatefulWidget { const ImageAnalysisPage({super.key}); @@ -13,79 +16,53 @@ class ImageAnalysisPage extends StatefulWidget { class _ImageAnalysisPageState extends State<ImageAnalysisPage> { File? _selectedImage; - Map<String, dynamic>? _analysisResult; + Map<String, dynamic>? _fullResult; bool _isAnalyzing = false; String? _errorMessage; - Future<void> _pickImage() async { + Future<void> _pickImage(ImageSource source) async { try { final ImagePicker picker = ImagePicker(); - final XFile? image = await picker.pickImage(source: ImageSource.gallery); - - if (image != null) { - setState(() { - _selectedImage = File(image.path); - _analysisResult = null; - _errorMessage = null; - }); - } - } catch (e) { - setState(() { - _errorMessage = 'Error picking image: $e'; - }); - } - } - - Future<void> _takePhoto() async { - try { - final ImagePicker picker = ImagePicker(); - final XFile? image = await picker.pickImage(source: ImageSource.camera); - + final XFile? image = await picker.pickImage(source: source); if (image != null) { setState(() { _selectedImage = File(image.path); - _analysisResult = null; + _fullResult = null; _errorMessage = null; }); } } catch (e) { - setState(() { - _errorMessage = 'Error taking photo: $e'; - }); + setState(() => _errorMessage = 'Error: $e'); } } - Future<void> _analyzeImage() async { + Future<void> _runAnalysis() async { if (_selectedImage == null) return; setState(() { _isAnalyzing = true; _errorMessage = null; - _analysisResult = null; }); try { - // Copy image to a location accessible by the Python script final appDir = await getApplicationDocumentsDirectory(); final fileName = _selectedImage!.path.split('/').last; final targetPath = '${appDir.path}/$fileName'; - await _selectedImage!.copy(targetPath); - final result = await ImageAnalyzerService.analyzeImage(targetPath); + // Use the centralized master runner + final result = await ImageAnalyzerService.analyzeFullSuite(targetPath); - setState(() { - _isAnalyzing = false; - if (result != null && result['success'] == true) { - _analysisResult = result; - } else { - _errorMessage = result?['error'] ?? 'Failed to analyze image'; - } - }); + if (mounted) { + setState(() { + _isAnalyzing = false; + _fullResult = result; + }); + } } catch (e) { setState(() { _isAnalyzing = false; - _errorMessage = 'Error analyzing image: $e'; + _errorMessage = 'Analysis Error: $e'; }); } } @@ -93,254 +70,78 @@ class _ImageAnalysisPageState extends State<ImageAnalysisPage> { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Image Composition Analyzer'), - centerTitle: true, - ), + appBar: AppBar(title: const Text('Image Analysis')), body: SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - // Image Selection Section - if (_selectedImage == null) - Container( - height: 200, - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(12), - border: Border.all(color: Colors.grey[300]!), - ), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.image, size: 64, color: Colors.grey[400]), - const SizedBox(height: 16), - Text( - 'No image selected', - style: TextStyle(color: Colors.grey[600]), - ), - ], - ), - ), - ) - else - ClipRRect( + Container( + height: 250, + decoration: BoxDecoration( + color: Colors.grey[200], borderRadius: BorderRadius.circular(12), - child: Image.file( - _selectedImage!, - height: 300, - fit: BoxFit.cover, - ), + image: _selectedImage != null + ? DecorationImage(image: FileImage(_selectedImage!), fit: BoxFit.cover) + : null ), - - const SizedBox(height: 16), - - // Action Buttons - Row( - children: [ - Expanded( - child: OutlinedButton.icon( - onPressed: _pickImage, - icon: const Icon(Icons.photo_library), - label: const Text('Gallery'), - ), - ), - const SizedBox(width: 12), - Expanded( - child: OutlinedButton.icon( - onPressed: _takePhoto, - icon: const Icon(Icons.camera_alt), - label: const Text('Camera'), - ), - ), - ], + child: _selectedImage == null + ? const Center(child: Icon(Icons.image, size: 50, color: Colors.grey)) + : null, ), - const SizedBox(height: 16), - - // Analyze Button - ElevatedButton( - onPressed: - _selectedImage != null && !_isAnalyzing - ? _analyzeImage - : null, - style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 16), + + Row(children: [ + Expanded(child: OutlinedButton.icon( + onPressed: () => _pickImage(ImageSource.gallery), + icon: const Icon(Icons.photo), label: const Text("Gallery")) ), - child: - _isAnalyzing - ? const Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ), - SizedBox(width: 12), - Text('Analyzing...'), - ], - ) - : const Text('Analyze Image'), + const SizedBox(width: 10), + Expanded(child: OutlinedButton.icon( + onPressed: () => _pickImage(ImageSource.camera), + icon: const Icon(Icons.camera_alt), label: const Text("Camera")) + ), + ]), + const SizedBox(height: 16), + + ElevatedButton( + onPressed: (_selectedImage != null && !_isAnalyzing) ? _runAnalysis : null, + style: ElevatedButton.styleFrom(padding: const EdgeInsets.all(16)), + child: _isAnalyzing + ? const SizedBox(height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2)) + : const Text("Analyze Image"), ), - - // Error Message + if (_errorMessage != null) Padding( - padding: const EdgeInsets.only(top: 16), - child: Container( - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.red[50], - borderRadius: BorderRadius.circular(8), - border: Border.all(color: Colors.red[200]!), - ), - child: Row( - children: [ - Icon(Icons.error_outline, color: Colors.red[700]), - const SizedBox(width: 8), - Expanded( - child: Text( - _errorMessage!, - style: TextStyle(color: Colors.red[700]), - ), - ), - ], - ), - ), + padding: const EdgeInsets.only(top:16), + child: Text(_errorMessage!, style: const TextStyle(color: Colors.red)), ), - // Analysis Results - if (_analysisResult != null) ...[ - const SizedBox(height: 24), - const Divider(), - const SizedBox(height: 16), - Text( - 'Analysis Results', - style: Theme.of(context).textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 16), - - // Top 5 Features - if (_analysisResult!['top5'] != null) ...[ - Text( - '🏆 Top 5 Features', - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 12), - ...(_analysisResult!['top5'] as List).map((feature) { - return _buildFeatureCard( - feature['name'] as String, - feature['score'] as double, + const SizedBox(height: 24), + + // Re-use the AnalysisDialog logic by mocking an ImageModel + if (_fullResult != null) + // We wrap the result in a dummy ImageModel to reuse the visualization widget + LayoutBuilder( + builder: (context, constraints) { + // Mocking the data format stored in DB + final mockImage = ImageModel( + id: 'temp', + filePath: _selectedImage!.path, + analysisData: json.encode(_fullResult) ); - }), - const SizedBox(height: 24), - ], - - // All Scores - Text( - 'All Scores', - style: Theme.of( - context, - ).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold), - ), - const SizedBox(height: 12), - if (_analysisResult!['scores'] != null) - ...(_analysisResult!['scores'] as Map<String, dynamic>).entries - .map((entry) { - return _buildScoreCard(entry.key, entry.value as double); - }), - ], - ], - ), - ), - ); - } - - Widget _buildFeatureCard(String name, double score) { - return Card( - margin: const EdgeInsets.only(bottom: 8), - child: Padding( - padding: const EdgeInsets.all(12), - child: Row( - children: [ - Expanded( - child: Text( - name, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ), - ), - Text( - '${(score * 100).toStringAsFixed(1)}%', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: _getScoreColor(score), - ), - ), - const SizedBox(width: 8), - SizedBox( - width: 100, - child: LinearProgressIndicator( - value: score, - backgroundColor: Colors.grey[200], - valueColor: AlwaysStoppedAnimation<Color>( - _getScoreColor(score), - ), - ), - ), - ], - ), - ), - ); - } - - Widget _buildScoreCard(String name, double score) { - return Card( - margin: const EdgeInsets.only(bottom: 8), - child: Padding( - padding: const EdgeInsets.all(12), - child: Row( - children: [ - Expanded(child: Text(name, style: const TextStyle(fontSize: 14))), - Text( - score.toStringAsFixed(3), - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: _getScoreColor(score), - ), - ), - const SizedBox(width: 8), - SizedBox( - width: 80, - child: LinearProgressIndicator( - value: score, - backgroundColor: Colors.grey[200], - valueColor: AlwaysStoppedAnimation<Color>( - _getScoreColor(score), - ), - ), - ), + + // Display the content of AnalysisDialog inline + return SizedBox( + height: 600, + child: AnalysisDialog(image: mockImage), + ); + }, + ) ], ), ), ); } - - Color _getScoreColor(double score) { - if (score >= 0.7) return Colors.green; - if (score >= 0.4) return Colors.orange; - return Colors.red; - } } - diff --git a/lib/ui/pages/image_page.dart b/lib/ui/pages/image_page.dart diff --git a/lib/ui/pages/image_picker_page.dart b/lib/ui/pages/image_picker_page.dart @@ -1,5 +1,3 @@ -// lib/ui/pages/image_picker_page.dart - import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; diff --git a/lib/ui/pages/share_handler_page.dart b/lib/ui/pages/share_handler_page.dart @@ -1,6 +1,5 @@ -// lib/ui/pages/share_handler_page.dart - import 'dart:io'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; import 'package:uuid/uuid.dart'; @@ -9,11 +8,10 @@ import 'package:adobe/services/instagram_download_service.dart'; import 'package:adobe/data/repos/board_repo.dart'; import 'package:adobe/data/repos/board_image_repo.dart'; import 'package:adobe/data/repos/image_repo.dart'; -import 'package:adobe/services/image_analyzer_service.dart'; -import 'dart:convert'; +import 'package:adobe/services/image_analyzer_service.dart'; // Master Runner class ShareHandlerPage extends StatefulWidget { - final String sharedText; // The URL passed from Android + final String sharedText; const ShareHandlerPage({super.key, required this.sharedText}); @@ -42,14 +40,10 @@ class _ShareHandlerPageState extends State<ShareHandlerPage> { } void _startProcess() async { - // 1. Start loading boards immediately _boards = await _boardRepo.getBoards(); - - // 2. Check if it's a file path (direct image share) or URL final sharedPath = widget.sharedText.trim(); if (File(sharedPath).existsSync()) { - // Direct image file - copy it to our images directory try { final id = await _handleDirectImage(sharedPath); if (mounted) { @@ -63,82 +57,47 @@ class _ShareHandlerPageState extends State<ShareHandlerPage> { }); } } catch (e) { - if (mounted) { - setState(() { - _hasError = true; - _errorMessage = "Error: $e"; - _isDownloading = false; - }); - } + if (mounted) setState(() { _hasError = true; _errorMessage = "$e"; _isDownloading = false; }); } } else { - // It's a URL - check if it's Instagram + // URL Handling final urlRegExp = RegExp(r'(https?://\S+)'); final match = urlRegExp.firstMatch(sharedPath); if (match != null) { final url = match.group(0)!; - - // Check if it's an Instagram URL - if (url.contains('instagram.com')) { - try { + try { + if (url.contains('instagram.com')) { final ids = await _instagramService.downloadInstagramImage(url); - if (mounted) { - setState(() { - if (ids != null) _downloadedImageIds = ids; - _isDownloading = false; - if (ids == null || ids.isEmpty) { - _hasError = true; - _errorMessage = "Failed to download from Instagram"; - } - }); - } - } catch (e) { - if (mounted) { - setState(() { - _hasError = true; - _errorMessage = "Error: $e"; - _isDownloading = false; - }); - } - } - } else { - // Regular URL - use existing download service - final id = await _downloadService.downloadAndSaveImage(url); - if (mounted) { - setState(() { - if (id != null) _downloadedImageIds = [id]; // Wrap single ID in list - _isDownloading = false; - if (id == null) { - _hasError = true; - _errorMessage = "Failed to download image"; - } + if (mounted) setState(() { + _downloadedImageIds = ids ?? []; + _isDownloading = false; + if (_downloadedImageIds.isEmpty) { _hasError = true; _errorMessage = "Insta download failed"; } + }); + } else { + final id = await _downloadService.downloadAndSaveImage(url); + if (mounted) setState(() { + if (id != null) _downloadedImageIds = [id]; + _isDownloading = false; + if (id == null) { _hasError = true; _errorMessage = "Download failed"; } }); } + } catch (e) { + if (mounted) setState(() { _hasError = true; _errorMessage = "$e"; _isDownloading = false; }); } } else { - if (mounted) { - setState(() { - _hasError = true; - _errorMessage = "Invalid URL or file path"; - _isDownloading = false; - }); - } + if (mounted) setState(() { _hasError = true; _errorMessage = "Invalid URL"; _isDownloading = false; }); } } } Future<String?> _handleDirectImage(String filePath) async { - // Import needed packages final file = File(filePath); if (!await file.exists()) return null; - // Copy to images directory final dir = await getApplicationDocumentsDirectory(); final imagesDir = Directory('${dir.path}/images'); - if (!await imagesDir.exists()) { - await imagesDir.create(recursive: true); - } + if (!await imagesDir.exists()) await imagesDir.create(recursive: true); final extension = filePath.split('.').last; final imageId = _uuid.v4(); @@ -146,7 +105,6 @@ class _ShareHandlerPageState extends State<ShareHandlerPage> { await file.copy(targetPath); await _imageRepo.insertImage(imageId, targetPath); - return imageId; } @@ -160,49 +118,36 @@ class _ShareHandlerPageState extends State<ShareHandlerPage> { final images = await _imageRepo.getAllImages(); for (final id in _downloadedImageIds) { - final imageData = images.firstWhere( - (img) => img['id'] == id, - orElse: () => <String, dynamic>{}, - ); - + final imageData = images.firstWhere((img) => img['id'] == id, orElse: () => <String, dynamic>{}); if (imageData.isNotEmpty && imageData['filePath'] != null) { - _analyzeImageInBackground( - id, - imageData['filePath'] as String, - ); + // Trigger Background Analysis + _analyzeImageInBackground(id, imageData['filePath'] as String); } } if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text("Saved ${_downloadedImageIds.length} image(s) to board! Analysis running."), - ), + SnackBar(content: Text("Saved ${_downloadedImageIds.length} image(s)! Analysis running.")), ); - - // Close the app or go back to main screen Navigator.popUntil(context, (route) => route.isFirst); } - Future<void> _analyzeImageInBackground( - String imageId, - String imagePath, - ) async { + Future<void> _analyzeImageInBackground(String imageId, String imagePath) async { try { - final result = await ImageAnalyzerService.analyzeImage(imagePath); - if (result != null && result['success'] == true) { + // Changed to use Master Runner + final result = await ImageAnalyzerService.analyzeFullSuite(imagePath); + if (result['success'] == true) { await _imageRepo.updateImageAnalysis(imageId, json.encode(result)); } } catch (e) { - debugPrint('Error analyzing image in background: $e'); + debugPrint('Background Analysis Error: $e'); } } @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text("Save to Board")), + appBar: AppBar(title: const Text("Save to Board")), body: _buildBody(), ); } @@ -214,85 +159,31 @@ class _ShareHandlerPageState extends State<ShareHandlerPage> { mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon(Icons.error, color: Colors.red, size: 48), - const SizedBox(height: 16), - Text( - _errorMessage ?? "Could not process image", - style: const TextStyle(fontSize: 16), - textAlign: TextAlign.center, - ), - const SizedBox(height: 16), - ElevatedButton( - onPressed: () => Navigator.pop(context), - child: const Text("Go Back"), - ), + Text(_errorMessage ?? "Error"), + ElevatedButton(onPressed: () => Navigator.pop(context), child: const Text("Back")) ], ), ); } - - // While downloading, show loader but ALSO show boards (disabled or overlay) - // Or just show loader as per your request - if (_isDownloading) { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CircularProgressIndicator(), - SizedBox(height: 16), - Text("Downloading image(s)..."), - ], - ), - ); - } - - // Once downloaded, allow selection - return Column( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Text( - "Select a board", - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - if (_downloadedImageIds.length > 1) - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Text( - "(${_downloadedImageIds.length} images found)", - style: TextStyle(color: Colors.grey[600]), - ), - ), - ], - ), - ), - Expanded( - child: ListView.builder( - itemCount: _boards.length + 1, // +1 for "Create Board" - itemBuilder: (context, index) { - // "Create New Board" Option - if (index == 0) { - return ListTile( - leading: Icon(Icons.add_box, color: Colors.red), - title: Text("Create New Board"), - onTap: () { - // Call your create board dialog logic here - _showCreateBoardDialog(); - }, - ); - } - - final board = _boards[index - 1]; - return ListTile( - leading: Icon(Icons.dashboard), - title: Text(board['name']), - onTap: () => _saveToBoard(board['id']), - ); - }, - ), - ), - ], + if (_isDownloading) return const Center(child: CircularProgressIndicator()); + + return ListView.builder( + itemCount: _boards.length + 2, + itemBuilder: (context, index) { + if (index == 0) return const Padding(padding: EdgeInsets.all(16), child: Text("Select a Board")); + if (index == 1) return ListTile( + leading: const Icon(Icons.add_box, color: Colors.red), + title: const Text("Create New Board"), + onTap: _showCreateBoardDialog, + ); + + final board = _boards[index - 2]; + return ListTile( + leading: const Icon(Icons.dashboard), + title: Text(board['name']), + onTap: () => _saveToBoard(board['id']), + ); + }, ); } @@ -300,33 +191,24 @@ class _ShareHandlerPageState extends State<ShareHandlerPage> { final controller = TextEditingController(); showDialog( context: context, - builder: - (c) => AlertDialog( - title: Text("New Board"), - content: TextField( - controller: controller, - decoration: InputDecoration(hintText: "Name"), - ), - actions: [ - TextButton( - onPressed: () => Navigator.pop(c), - child: Text("Cancel"), - ), - ElevatedButton( - onPressed: () async { - if (controller.text.isNotEmpty) { - // Create board - final newId = await _boardRepo.createBoard(controller.text); - if (!c.mounted) return; - Navigator.pop(c); // Close dialog - // Save image to new board - _saveToBoard(newId); - } - }, - child: Text("Create"), - ), - ], + builder: (c) => AlertDialog( + title: const Text("New Board"), + content: TextField(controller: controller, decoration: const InputDecoration(hintText: "Name")), + actions: [ + TextButton(onPressed: () => Navigator.pop(c), child: const Text("Cancel")), + ElevatedButton( + onPressed: () async { + if (controller.text.isNotEmpty) { + final newId = await _boardRepo.createBoard(controller.text); + if (!c.mounted) return; + Navigator.pop(c); + _saveToBoard(newId); + } + }, + child: const Text("Create"), ), + ], + ), ); } } diff --git a/lib/ui/widgets/analysis_dialog.dart b/lib/ui/widgets/analysis_dialog.dart @@ -0,0 +1,151 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import '../../data/models/image_model.dart'; + +class AnalysisDialog extends StatelessWidget { + final ImageModel image; + + const AnalysisDialog({super.key, required this.image}); + + @override + Widget build(BuildContext context) { + if (image.analysisData == null) { + return const AlertDialog(content: Text("No analysis data available.")); + } + + Map<String, dynamic> data; + try { + data = json.decode(image.analysisData!); + } catch (e) { + return const AlertDialog(content: Text("Corrupt analysis data.")); + } + + return Dialog( + insetPadding: const EdgeInsets.all(16), + child: Container( + constraints: const BoxConstraints(maxWidth: 500, maxHeight: 700), + padding: const EdgeInsets.all(16), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text("Image Intelligence", style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), + IconButton(icon: const Icon(Icons.close), onPressed: () => Navigator.pop(context)), + ], + ), + const Divider(), + Expanded( + child: ListView( + children: [ + // 1. Layout + if (data['layout'] != null && data['layout']['top5'] != null) + _buildSection( + "Composition", + Icons.grid_goldenratio, + Colors.blue, + _buildList(data['layout']['top5']), + ), + + // 2. Texture + if (data['texture'] != null && (data['texture'] as List).isNotEmpty) + _buildSection( + "Texture", + Icons.texture, + Colors.orange, + Wrap( + spacing: 8, + children: (data['texture'] as List).map((t) => Chip( + label: Text("${t['name']} ${(t['score']*100).toInt()}%"), + backgroundColor: Colors.orange.shade50, + avatar: const CircleAvatar(radius: 8, backgroundColor: Colors.orange), + )).toList(), + ), + ), + + // 3. Color + if (data['color'] != null) + _buildSection( + "Color Style", + Icons.palette, + Colors.purple, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + (data['color']['top_label'] ?? 'Unknown').toString().toUpperCase(), + style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w900, color: Colors.purple), + ), + LinearProgressIndicator( + value: (data['color']['top_score'] as num?)?.toDouble() ?? 0.0, + color: Colors.purple, + backgroundColor: Colors.purple.shade50, + ), + ], + ), + ), + + // 4. Embeddings + if (data['embedding'] != null) + _buildSection( + "AI Style", + Icons.auto_awesome, + Colors.indigo, + Wrap( + spacing: 6, + children: (data['embedding']['top5'] as List? ?? []).map<Widget>((e) => Chip( + label: Text(e['name'], style: const TextStyle(fontSize: 10)), + visualDensity: VisualDensity.compact, + )).toList(), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } + + Widget _buildSection(String title, IconData icon, Color color, Widget content) { + return Card( + margin: const EdgeInsets.only(bottom: 16), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: BorderSide(color: color.withOpacity(0.2)) + ), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(children: [ + Icon(icon, color: color, size: 20), + const SizedBox(width: 8), + Text(title, style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: color)), + ]), + const SizedBox(height: 12), + content, + ], + ), + ), + ); + } + + Widget _buildList(List items) { + return Column( + children: items.map((item) => Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(item['name'], style: const TextStyle(fontWeight: FontWeight.w500)), + Text("${(item['score'] * 100).toStringAsFixed(1)}%", style: const TextStyle(color: Colors.grey)), + ], + ), + )).toList(), + ); + } +} diff --git a/lib/utils/clip_image_processor.dart b/lib/utils/clip_image_processor.dart @@ -1,5 +1,3 @@ -// lib/utils/clip_image_processor.dart - import 'dart:typed_data'; import 'dart:io'; import 'package:image/image.dart' as img; @@ -13,14 +11,14 @@ class ClipImageProcessor { static Future<Float32List?> preprocess(String filePath) async { final bytes = await File(filePath).readAsBytes(); final image = img.decodeImage(bytes); - + if (image == null) return null; // 1. Resize (Shortest side to 224) int w = image.width; int h = image.height; int target = 224; - + img.Image resized; if (w < h) { resized = img.copyResize(image, width: target); @@ -34,7 +32,7 @@ class ClipImageProcessor { // 3. Convert to Float32 List (NCHW format: Batch, Channels, Height, Width) // Size: 1 * 3 * 224 * 224 = 150,528 float values final Float32List inputData = Float32List(1 * 3 * 224 * 224); - + int pixelIndex = 0; // Iterate pixels and separate channels // Planar format (RRRR... GGGG... BBBB...) @@ -45,7 +43,7 @@ class ClipImageProcessor { for (var y = 0; y < 224; y++) { for (var x = 0; x < 224; x++) { final pixel = cropped.getPixel(x, y); - + // Normalize: (Value/255 - Mean) / Std double r = (pixel.r / 255.0 - mean[0]) / std[0]; double g = (pixel.g / 255.0 - mean[1]) / std[1]; @@ -54,7 +52,7 @@ class ClipImageProcessor { inputData[rOffset + pixelIndex] = r; inputData[gOffset + pixelIndex] = g; inputData[bOffset + pixelIndex] = b; - + pixelIndex++; } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc @@ -7,9 +7,13 @@ #include "generated_plugin_registrant.h" #include <file_selector_linux/file_selector_plugin.h> +#include <flutter_onnxruntime/flutter_onnxruntime_plugin.h> void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_onnxruntime_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterOnnxruntimePlugin"); + flutter_onnxruntime_plugin_register_with_registrar(flutter_onnxruntime_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_linux + flutter_onnxruntime ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,11 +6,15 @@ import FlutterMacOS import Foundation import file_selector_macos +import flutter_onnxruntime import path_provider_foundation +import shared_preferences_foundation import sqflite_darwin func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FlutterOnnxruntimePlugin.register(with: registry.registrar(forPlugin: "FlutterOnnxruntimePlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/pubspec.lock b/pubspec.lock @@ -9,14 +9,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.7" + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" async: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: @@ -97,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" file_selector_linux: dependency: transitive description: @@ -150,6 +166,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_onnxruntime: + dependency: "direct main" + description: + name: flutter_onnxruntime + sha256: "55842e69293ec52c07f3065049ff7641e94e8a6cca3f659a913d5401a3994424" + url: "https://pub.dev" + source: hosted + version: "1.6.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -268,26 +292,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "11.0.2" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.10" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.1" lints: dependency: transitive description: @@ -316,10 +340,10 @@ packages: dependency: transitive description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.16.0" mime: dependency: transitive description: @@ -328,6 +352,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" onnxruntime: dependency: "direct main" description: @@ -396,10 +428,10 @@ packages: dependency: transitive description: name: petitparser - sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "6.1.0" platform: dependency: transitive description: @@ -424,6 +456,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.3" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" receive_sharing_intent: dependency: "direct main" description: @@ -432,6 +472,62 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.1" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: bd14436108211b0d4ee5038689a56d4ae3620fd72fd6036e113bf1345bc74d9e + url: "https://pub.dev" + source: hosted + version: "2.4.13" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -529,10 +625,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.4" typed_data: dependency: transitive description: @@ -553,18 +649,18 @@ packages: dependency: transitive description: name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.1.4" vm_service: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.0" web: dependency: transitive description: @@ -585,10 +681,10 @@ packages: dependency: transitive description: name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "6.6.1" + version: "6.5.0" sdks: - dart: ">=3.8.0 <4.0.0" + dart: ">=3.7.2 <4.0.0" flutter: ">=3.29.0" diff --git a/pubspec.yaml b/pubspec.yaml @@ -1,39 +1,15 @@ name: adobe -description: "A new Flutter project." -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. +description: "AI-based image editor" +publish_to: "none" version: 1.0.0+1 - environment: sdk: ^3.7.2 -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 + sqflite: ^2.4.2 path_provider: ^2.1.5 path: ^1.9.1 @@ -42,6 +18,13 @@ dependencies: receive_sharing_intent: ^1.8.1 http: ^1.6.0 html: ^0.15.6 + shared_preferences: ^2.5.3 + provider: ^6.1.5+1 + image: ^4.5.4 + flutter_onnxruntime: ^1.6.0 + + onnxruntime: ^1.2.0 + image: ^4.5.4 onnxruntime: ^1.2.0 image: ^4.5.4 @@ -50,22 +33,9 @@ dev_dependencies: flutter_test: sdk: flutter - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. flutter_lints: ^5.0.0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. uses-material-design: true assets: @@ -73,33 +43,24 @@ flutter: - assets/emotion_centroids.json - assets/lighting_centroids.json - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package + assets: + - assets/fonts/ + - assets/dinov2.onnx + - assets/dinov2.onnx.data + - assets/texture_centroids.json + - assets/clip_image_encoder.onnx + - assets/style_embeddings.json + + fonts: + - family: GeneralSans + fonts: + - asset: assets/fonts/GeneralSans-Extralight.otf + weight: 200 + - asset: assets/fonts/GeneralSans-Light.otf + weight: 300 + - asset: assets/fonts/GeneralSans-Regular.otf + weight: 400 + - asset: assets/fonts/GeneralSans-Medium.otf + weight: 500 + - asset: assets/fonts/GeneralSans-Semibold.otf + weight: 600 diff --git a/setup_python_env.ps1 b/setup_python_env.ps1 @@ -1,46 +0,0 @@ -$ErrorActionPreference = "Stop" - -$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path -$VenvDir = Join-Path $ScriptDir "python_env" - -Write-Host "Setting up Python virtual environment..." - -# Detect Python 3.11 using Python launcher -$PythonCmd = $null - -try { - $v = & py -3.11 --version 2>$null - if ($LASTEXITCODE -eq 0 -and $v -like "Python 3.11*") { - $PythonCmd = @("py", "-3.11") - } -} -catch {} - -if (-not $PythonCmd) { - Write-Host "ERROR: Python 3.11 is required but not found" -ForegroundColor Red - exit 1 -} - -# Print Python version -$ver = & $PythonCmd[0] $PythonCmd[1] --version -Write-Host ("Using Python: " + $ver) - -# Create venv -if (-not (Test-Path $VenvDir)) { - Write-Host ("Creating virtual environment at " + $VenvDir + "...") - & $PythonCmd[0] $PythonCmd[1] -m venv $VenvDir - Write-Host "Virtual environment created successfully" -} else { - Write-Host ("Virtual environment already exists at " + $VenvDir) -} - -# Validate -$VenvPython = Join-Path $VenvDir "Scripts\python.exe" - -if (Test-Path $VenvPython) { - $v = & $VenvPython --version - Write-Host ("Virtual environment Python version: " + $v) -} else { - Write-Host "ERROR: Failed to create virtual environment" -ForegroundColor Red - exit 1 -} diff --git a/setup_python_env.sh b/setup_python_env.sh @@ -1,57 +0,0 @@ -#!/bin/bash - -# Setup script for Python virtual environment -# This ensures all developers use the same Python version for builds - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -VENV_DIR="$SCRIPT_DIR/python_env" - -echo "Setting up Python virtual environment for Chaquopy builds..." - -# Check if Python 3.11 is available -if command -v python3.11 &> /dev/null; then - PYTHON_CMD="python3.11" -elif command -v python3 &> /dev/null; then - PYTHON_VERSION=$(python3 --version | cut -d' ' -f2 | cut -d'.' -f1,2) - if [ "$PYTHON_VERSION" = "3.11" ]; then - PYTHON_CMD="python3" - else - echo "Error: Python 3.11 is required but not found." - echo "Please install Python 3.11:" - echo " macOS: brew install python@3.11" - echo " Linux: sudo apt-get install python3.11 python3.11-venv" - echo " Or download from https://www.python.org/downloads/" - exit 1 - fi -else - echo "Error: Python 3.11 is required but not found." - echo "Please install Python 3.11 first." - exit 1 -fi - -echo "Using Python: $($PYTHON_CMD --version)" - -# Create virtual environment if it doesn't exist -if [ ! -d "$VENV_DIR" ]; then - echo "Creating virtual environment at $VENV_DIR..." - $PYTHON_CMD -m venv "$VENV_DIR" - echo "Virtual environment created successfully!" -else - echo "Virtual environment already exists at $VENV_DIR" -fi - -# Verify the venv -if [ -f "$VENV_DIR/bin/python" ]; then - VENV_PYTHON_VERSION=$("$VENV_DIR/bin/python" --version) - echo "Virtual environment Python version: $VENV_PYTHON_VERSION" - echo "" - echo "✓ Python virtual environment is ready!" - echo " Location: $VENV_DIR" - echo "" - echo "The build system will automatically use this Python environment." -else - echo "Error: Failed to create virtual environment" - exit 1 -fi diff --git a/test/widget_test.dart b/test/widget_test.dart @@ -1,29 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:adobe/ui/pages/home_page.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MaterialApp(home: HomePage())); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/triagebot.toml b/triagebot.toml @@ -1,9 +1,17 @@ ############################################### -# TRIAGEBOT CONFIG FOR adobe +# TRIAGEBOT CONFIG FOR adobe (Flutter + Python) ############################################### # ───────────────────────────────────────────── -# RELABEL +# GENERAL REPO SETTINGS +# ───────────────────────────────────────────── + +[include] +# Paths triagebot should watch (all by default) +paths = ["*"] + +# ───────────────────────────────────────────── +# RELABEL: Allow contributors to relabel issues # ───────────────────────────────────────────── [relabel] allow-unauthenticated = [ @@ -15,46 +23,96 @@ allow-unauthenticated = [ ] # ───────────────────────────────────────────── -# ASSIGN / CLAIM +# CLAIM / ASSIGN: Allow contributors to self-assign # ───────────────────────────────────────────── [assign] -allow-unauthenticated = true auto_assign_on_mention = true warn_on_unused_assign = true + +# Optional, define who is auto-assignable: assignable = [ - "nilotpal-n7", - "aditya-samal" + "nilotpal-n7", # ← replace with your GitHub username + "aditya-samal", ] # ───────────────────────────────────────────── -# PING GROUPS +# REVIEWERS: Auto reviewer assignment groups +# ───────────────────────────────────────────── +[reviewers] +# reviewers = ["user1", "user2"] # optional root list + +# group: flutter +[reviewers.groups.flutter] +reviewers = ["nilotpal-n7"] + +# group: android +[reviewers.groups.android] +reviewers = ["nilotpal-n7"] + +# group: python +[reviewers.groups.python] +reviewers = ["nilotpal-n7"] + +# group: ci +[reviewers.groups.ci] +reviewers = ["nilotpal-n7"] + +# Path → reviewer group routing +[reviewers.paths."lib/**"] +groups = ["flutter"] + +[reviewers.paths."android/**"] +groups = ["android"] + +[reviewers.paths."ios/**"] +groups = ["flutter"] + +[reviewers.paths."web/**"] +groups = ["flutter"] + +[reviewers.paths."python_env/**"] +groups = ["python"] + +[reviewers.paths."build/**"] +groups = ["ci"] + +# Auto-assign reviewers when PR touches certain paths +paths."lib/**" = ["flutter"] +paths."android/**" = ["android"] +paths."ios/**" = ["flutter"] +paths."web/**" = ["flutter"] +paths."python_env/**" = ["python"] +paths."build/**" = ["ci"] + +# ───────────────────────────────────────────── +# PING SYSTEM: Easily notify groups # ───────────────────────────────────────────── [ping] -allowed_users = ["nilotpal-n7", "aditya-samal"] +allowed_users = ["nilotpal-n7"] [ping.flutter] -aliases = ["flutter-team"] -user_list = ["nilotpal-n7", "aditya-samal"] message = """\ -Flutter: please review this issue/PR. +Flutter team: please review this issue/PR. """ +aliases = ["flutter-team"] +user_list = ["nilotpal-n7"] [ping.python] -aliases = ["python-team"] -user_list = ["nilotpal-n7", "aditya-samal"] message = """\ -Python/WASM team ping. +Python/WASM integration group ping. """ +aliases = ["python-team"] +user_list = ["nilotpal-n7"] [ping.android] -aliases = ["android-team"] -user_list = ["nilotpal-n7", "aditya-samal"] message = """\ -Android integration team ping. +Android integration maintainers ping. """ +aliases = ["android-team"] +user_list = ["nilotpal-n7"] # ───────────────────────────────────────────── -# MAJOR CHANGE PROCESS +# MAJOR CHANGE PROCESS (MCP) # ───────────────────────────────────────────── [major-change] enabling_label = "major-change" @@ -65,18 +123,22 @@ accept_label = "major-change-accepted" waiting_period = 1 auto_closing = true +# Optional: Replace with your zulip/discord stream ID zulip_stream = 1 zulip_ping = "team" +# ───────────────────────────────────────────── +# MCP: Tracking issue template (auto-generated) +# ───────────────────────────────────────────── [major-change.tracking-issue-template] repository = "adobe" title = "Tracking issue for MCP#${mcp_number}" -labels = ["major-change", "tracking"] body = """ -Tracking issue for MCP ${mcp_issue}: ${mcp_title} +This issue tracks MCP ${mcp_issue}: ${mcp_title} Created by ${mcp_author} """ +labels = ["major-change", "tracking"] # ───────────────────────────────────────────── # CONCERN SYSTEM @@ -85,41 +147,19 @@ Created by ${mcp_author} labels = ["has-concerns"] # ───────────────────────────────────────────── -# NOTE SYSTEM +# NOTE SYSTEM: Allows @bot note "text" # ───────────────────────────────────────────── [note] # ───────────────────────────────────────────── -# REVIEW CHANGES SINCE +# REVIEW-CHANGES-SINCE # ───────────────────────────────────────────── [review-changes-since] # ───────────────────────────────────────────── -# AUTO LABEL -# ───────────────────────────────────────────── -[autolabel."lib/**"] -labels = ["flutter"] - -[autolabel."android/**"] -labels = ["android"] - -[autolabel."python_env/**"] -labels = ["python"] - -[autolabel."build/**"] -labels = ["ci"] - -# ───────────────────────────────────────────── -# ZULIP NOTIFY ON LABELS +# AUTO-NOTIFY LABELS (Optional) # ───────────────────────────────────────────── -[notify-zulip.labels.flutter] -zulip_stream = 1 -topic = "flutter" - -[notify-zulip.labels.python] -zulip_stream = 1 -topic = "python" - -[notify-zulip.labels.ci] -zulip_stream = 1 -topic = "ci" +[labels.notify] +"flutter" = ["nilotpal-n7"] +"python" = ["nilotpal-n7"] +"ci" = ["nilotpal-n7"] diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc @@ -7,8 +7,11 @@ #include "generated_plugin_registrant.h" #include <file_selector_windows/file_selector_windows.h> +#include <flutter_onnxruntime/flutter_onnxruntime_plugin.h> void RegisterPlugins(flutter::PluginRegistry* registry) { FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); + FlutterOnnxruntimePluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterOnnxruntimePlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_windows + flutter_onnxruntime ) list(APPEND FLUTTER_FFI_PLUGIN_LIST