{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 🧠 HRHUB v2.1 - Enhanced with LLM (FREE VERSION)\n", "\n", "## 📘 Project Overview\n", "\n", "**Bilateral HR Matching System with LLM-Powered Intelligence**\n", "\n", "### What's New in v2.1:\n", "- ✅ **FREE LLM**: Using Hugging Face Inference API (no cost)\n", "- ✅ **Job Level Classification**: Zero-shot & few-shot learning\n", "- ✅ **Structured Skills Extraction**: Pydantic schemas\n", "- ✅ **Match Explainability**: LLM-generated reasoning\n", "- ✅ **Flexible Data Loading**: Upload OR Google Drive\n", "\n", "### Tech Stack:\n", "```\n", "Embeddings: sentence-transformers (local, free)\n", "LLM: Hugging Face Inference API (free tier)\n", "Schemas: Pydantic\n", "Platform: Google Colab → VS Code\n", "```\n", "\n", "---\n", "\n", "**Master's Thesis - Aalborg University** \n", "*Business Data Science Program* \n", "*December 2025*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 1: Install Dependencies" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ All packages installed!\n" ] } ], "source": [ "# Install required packages\n", "#!pip install -q sentence-transformers huggingface-hub pydantic plotly pyvis nbformat scikit-learn pandas numpy\n", "\n", "print(\"✅ All packages installed!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 2: Import Libraries" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Environment variables loaded from .env\n", "✅ All libraries imported!\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import json\n", "import os\n", "from typing import List, Dict, Optional, Literal\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "# ML & NLP\n", "from sentence_transformers import SentenceTransformer\n", "from sklearn.metrics.pairwise import cosine_similarity\n", "\n", "# LLM Integration (FREE)\n", "from huggingface_hub import InferenceClient\n", "from pydantic import BaseModel, Field\n", "\n", "# Visualization\n", "import plotly.graph_objects as go\n", "from IPython.display import HTML, display\n", "\n", "# Configuration Settings\n", "from dotenv import load_dotenv\n", "\n", "# Carrega variáveis do .env\n", "load_dotenv()\n", "print(\"✅ Environment variables loaded from .env\")\n", "\n", "print(\"✅ All libraries imported!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 3: Configuration" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Configuration loaded!\n", "🧠 Embedding model: all-MiniLM-L6-v2\n", "🤖 LLM model: meta-llama/Llama-3.2-3B-Instruct\n", "🔑 HF Token configured: Yes ✅\n", "📂 Data path: ../csv_files/\n" ] } ], "source": [ "class Config:\n", " \"\"\"Centralized configuration for VS Code\"\"\"\n", " \n", " # Paths - VS Code structure\n", " CSV_PATH = '../csv_files/'\n", " PROCESSED_PATH = '../processed/'\n", " RESULTS_PATH = '../results/'\n", " \n", " # Embedding Model\n", " EMBEDDING_MODEL = 'all-MiniLM-L6-v2'\n", " \n", " # LLM Settings (FREE - Hugging Face)\n", " HF_TOKEN = os.getenv('HF_TOKEN', '') # ✅ Pega do .env\n", " LLM_MODEL = 'meta-llama/Llama-3.2-3B-Instruct'\n", " \n", " LLM_MAX_TOKENS = 1000\n", " \n", " # Matching Parameters\n", " TOP_K_MATCHES = 10\n", " SIMILARITY_THRESHOLD = 0.5\n", " RANDOM_SEED = 42\n", "\n", "np.random.seed(Config.RANDOM_SEED)\n", "\n", "print(\"✅ Configuration loaded!\")\n", "print(f\"🧠 Embedding model: {Config.EMBEDDING_MODEL}\")\n", "print(f\"🤖 LLM model: {Config.LLM_MODEL}\")\n", "print(f\"🔑 HF Token configured: {'Yes ✅' if Config.HF_TOKEN else 'No ⚠️'}\")\n", "print(f\"📂 Data path: {Config.CSV_PATH}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 4: Load All Datasets" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "📂 Loading all datasets...\n", "\n", "======================================================================\n", "✅ Candidates: 9,544 rows × 35 columns\n", "✅ Companies (base): 24,473 rows\n", "✅ Company industries: 24,375 rows\n", "✅ Company specialties: 169,387 rows\n", "✅ Employee counts: 35,787 rows\n", "✅ Postings: 123,849 rows × 31 columns\n", "✅ Job skills: 213,768 rows\n", "✅ Job industries: 164,808 rows\n", "\n", "======================================================================\n", "✅ All datasets loaded successfully!\n", "\n" ] } ], "source": [ "print(\"📂 Loading all datasets...\\n\")\n", "print(\"=\" * 70)\n", "\n", "# Load main datasets\n", "candidates = pd.read_csv(f'{Config.CSV_PATH}resume_data.csv')\n", "print(f\"✅ Candidates: {len(candidates):,} rows × {len(candidates.columns)} columns\")\n", "\n", "companies_base = pd.read_csv(f'{Config.CSV_PATH}companies.csv')\n", "print(f\"✅ Companies (base): {len(companies_base):,} rows\")\n", "\n", "company_industries = pd.read_csv(f'{Config.CSV_PATH}company_industries.csv')\n", "print(f\"✅ Company industries: {len(company_industries):,} rows\")\n", "\n", "company_specialties = pd.read_csv(f'{Config.CSV_PATH}company_specialities.csv')\n", "print(f\"✅ Company specialties: {len(company_specialties):,} rows\")\n", "\n", "employee_counts = pd.read_csv(f'{Config.CSV_PATH}employee_counts.csv')\n", "print(f\"✅ Employee counts: {len(employee_counts):,} rows\")\n", "\n", "postings = pd.read_csv(f'{Config.CSV_PATH}postings.csv', on_bad_lines='skip', engine='python')\n", "print(f\"✅ Postings: {len(postings):,} rows × {len(postings.columns)} columns\")\n", "\n", "# Optional datasets\n", "try:\n", " job_skills = pd.read_csv(f'{Config.CSV_PATH}job_skills.csv')\n", " print(f\"✅ Job skills: {len(job_skills):,} rows\")\n", "except:\n", " job_skills = None\n", " print(\"⚠️ Job skills not found (optional)\")\n", "\n", "try:\n", " job_industries = pd.read_csv(f'{Config.CSV_PATH}job_industries.csv')\n", " print(f\"✅ Job industries: {len(job_industries):,} rows\")\n", "except:\n", " job_industries = None\n", " print(\"⚠️ Job industries not found (optional)\")\n", "\n", "print(\"\\n\" + \"=\" * 70)\n", "print(\"✅ All datasets loaded successfully!\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 5: Merge & Enrich Company Data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🔗 Merging company data...\n", "\n", "✅ Aggregated industries for 24,365 companies\n", "✅ Aggregated specialties for 17,780 companies\n", "\n", "✅ Base company merge complete: 35,787 companies\n", "\n" ] } ], "source": [ "print(\"🔗 Merging company data...\\n\")\n", "\n", "# Aggregate industries\n", "company_industries_agg = company_industries.groupby('company_id')['industry'].apply(\n", " lambda x: ', '.join(map(str, x.tolist()))\n", ").reset_index()\n", "company_industries_agg.columns = ['company_id', 'industries_list']\n", "print(f\"✅ Aggregated industries for {len(company_industries_agg):,} companies\")\n", "\n", "# Aggregate specialties\n", "company_specialties_agg = company_specialties.groupby('company_id')['speciality'].apply(\n", " lambda x: ' | '.join(x.astype(str).tolist())\n", ").reset_index()\n", "company_specialties_agg.columns = ['company_id', 'specialties_list']\n", "print(f\"✅ Aggregated specialties for {len(company_specialties_agg):,} companies\")\n", "\n", "# Merge all company data\n", "companies_merged = companies_base.copy()\n", "companies_merged = companies_merged.merge(company_industries_agg, on='company_id', how='left')\n", "companies_merged = companies_merged.merge(company_specialties_agg, on='company_id', how='left')\n", "companies_merged = companies_merged.merge(employee_counts, on='company_id', how='left')\n", "\n", "print(f\"\\n✅ Base company merge complete: {len(companies_merged):,} companies\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 6: Enrich with Job Postings" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🌉 Enriching companies with job posting data...\n", "\n", "======================================================================\n", "KEY INSIGHT: Postings = 'Requirements Language Bridge'\n", "======================================================================\n", "\n", "✅ Enriched 35,787 companies with posting data\n", "\n" ] } ], "source": [ "print(\"🌉 Enriching companies with job posting data...\\n\")\n", "print(\"=\" * 70)\n", "print(\"KEY INSIGHT: Postings = 'Requirements Language Bridge'\")\n", "print(\"=\" * 70 + \"\\n\")\n", "\n", "postings = postings.fillna('')\n", "postings['company_id'] = postings['company_id'].astype(str)\n", "\n", "# Aggregate postings per company\n", "postings_agg = postings.groupby('company_id').agg({\n", " 'title': lambda x: ' | '.join(x.astype(str).tolist()[:10]),\n", " 'description': lambda x: ' '.join(x.astype(str).tolist()[:5]),\n", " 'skills_desc': lambda x: ' | '.join(x.dropna().astype(str).tolist()),\n", " 'formatted_experience_level': lambda x: ' | '.join(x.dropna().unique().astype(str)),\n", "}).reset_index()\n", "\n", "postings_agg.columns = ['company_id', 'posted_job_titles', 'posted_descriptions', 'required_skills', 'experience_levels']\n", "\n", "companies_merged['company_id'] = companies_merged['company_id'].astype(str)\n", "companies_full = companies_merged.merge(postings_agg, on='company_id', how='left').fillna('')\n", "\n", "print(f\"✅ Enriched {len(companies_full):,} companies with posting data\\n\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
company_idnamedescriptioncompany_sizestatecountrycityzip_codeaddressurlindustries_listspecialties_listemployee_countfollower_counttime_recordedposted_job_titlesposted_descriptionsrequired_skillsexperience_levels
01009IBMAt IBM, we do more than work. We create. We cr...7.0NYUSArmonk, New York10504International Business Machines Corp.https://www.linkedin.com/company/ibmIT Services and IT ConsultingCloud | Mobile | Cognitive | Security | Resear...314102162536251712378162
11009IBMAt IBM, we do more than work. We create. We cr...7.0NYUSArmonk, New York10504International Business Machines Corp.https://www.linkedin.com/company/ibmIT Services and IT ConsultingCloud | Mobile | Cognitive | Security | Resear...313142163094641713392385
21009IBMAt IBM, we do more than work. We create. We cr...7.0NYUSArmonk, New York10504International Business Machines Corp.https://www.linkedin.com/company/ibmIT Services and IT ConsultingCloud | Mobile | Cognitive | Security | Resear...313147163099851713402495
31009IBMAt IBM, we do more than work. We create. We cr...7.0NYUSArmonk, New York10504International Business Machines Corp.https://www.linkedin.com/company/ibmIT Services and IT ConsultingCloud | Mobile | Cognitive | Security | Resear...311223163148461713501255
41016GE HealthCareEvery day millions of people feel the impact o...7.00USChicago0-https://www.linkedin.com/company/gehealthcareHospitals and Health CareHealthcare | Biotechnology5687321853681712382540
\n", "
" ], "text/plain": [ " company_id name \\\n", "0 1009 IBM \n", "1 1009 IBM \n", "2 1009 IBM \n", "3 1009 IBM \n", "4 1016 GE HealthCare \n", "\n", " description company_size state \\\n", "0 At IBM, we do more than work. We create. We cr... 7.0 NY \n", "1 At IBM, we do more than work. We create. We cr... 7.0 NY \n", "2 At IBM, we do more than work. We create. We cr... 7.0 NY \n", "3 At IBM, we do more than work. We create. We cr... 7.0 NY \n", "4 Every day millions of people feel the impact o... 7.0 0 \n", "\n", " country city zip_code address \\\n", "0 US Armonk, New York 10504 International Business Machines Corp. \n", "1 US Armonk, New York 10504 International Business Machines Corp. \n", "2 US Armonk, New York 10504 International Business Machines Corp. \n", "3 US Armonk, New York 10504 International Business Machines Corp. \n", "4 US Chicago 0 - \n", "\n", " url \\\n", "0 https://www.linkedin.com/company/ibm \n", "1 https://www.linkedin.com/company/ibm \n", "2 https://www.linkedin.com/company/ibm \n", "3 https://www.linkedin.com/company/ibm \n", "4 https://www.linkedin.com/company/gehealthcare \n", "\n", " industries_list \\\n", "0 IT Services and IT Consulting \n", "1 IT Services and IT Consulting \n", "2 IT Services and IT Consulting \n", "3 IT Services and IT Consulting \n", "4 Hospitals and Health Care \n", "\n", " specialties_list employee_count \\\n", "0 Cloud | Mobile | Cognitive | Security | Resear... 314102 \n", "1 Cloud | Mobile | Cognitive | Security | Resear... 313142 \n", "2 Cloud | Mobile | Cognitive | Security | Resear... 313147 \n", "3 Cloud | Mobile | Cognitive | Security | Resear... 311223 \n", "4 Healthcare | Biotechnology 56873 \n", "\n", " follower_count time_recorded posted_job_titles posted_descriptions \\\n", "0 16253625 1712378162 \n", "1 16309464 1713392385 \n", "2 16309985 1713402495 \n", "3 16314846 1713501255 \n", "4 2185368 1712382540 \n", "\n", " required_skills experience_levels \n", "0 \n", "1 \n", "2 \n", "3 \n", "4 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "companies_full.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================================================================================\n", "🔍 DUPLICATE DETECTION REPORT\n", "================================================================================\n", "\n", "┌─ 📊 resume_data.csv (Candidates)\n", "│ Primary Key: Resume_ID\n", "│ Total rows: 9,544\n", "│ Unique rows: 9,544\n", "│ Duplicates: 0\n", "│ Status: ✅ CLEAN\n", "└─\n", "\n", "┌─ 📊 companies.csv (Companies Base)\n", "│ Primary Key: company_id\n", "│ Total rows: 24,473\n", "│ Unique rows: 24,473\n", "│ Duplicates: 0\n", "│ Status: ✅ CLEAN\n", "└─\n", "\n", "┌─ 📊 company_industries.csv\n", "│ Primary Key: company_id + industry\n", "│ Total rows: 24,375\n", "│ Unique rows: 24,375\n", "│ Duplicates: 0\n", "│ Status: ✅ CLEAN\n", "└─\n", "\n", "┌─ 📊 company_specialities.csv\n", "│ Primary Key: company_id + speciality\n", "│ Total rows: 169,387\n", "│ Unique rows: 169,387\n", "│ Duplicates: 0\n", "│ Status: ✅ CLEAN\n", "└─\n", "\n", "┌─ 📊 employee_counts.csv\n", "│ Primary Key: company_id\n", "│ Total rows: 35,787\n", "│ Unique rows: 24,473\n", "│ Duplicates: 11,314\n", "│ Status: 🔴 HAS DUPLICATES\n", "└─\n", "\n", "┌─ 📊 postings.csv (Job Postings)\n", "│ Primary Key: job_id\n", "│ Total rows: 123,849\n", "│ Unique rows: 123,849\n", "│ Duplicates: 0\n", "│ Status: ✅ CLEAN\n", "└─\n", "\n", "┌─ 📊 companies_full (After Enrichment)\n", "│ Primary Key: company_id\n", "│ Total rows: 35,787\n", "│ Unique rows: 24,473\n", "│ Duplicates: 11,314\n", "│ Status: 🔴 HAS DUPLICATES\n", "│\n", "│ Top duplicate company_ids:\n", "│ - 33242739 (Confidential): 13 times\n", "│ - 5235 (LHH): 13 times\n", "│ - 79383535 (Akkodis): 12 times\n", "│ - 1681 (Robert Half): 12 times\n", "│ - 220336 (Hyatt Hotels Corporation): 11 times\n", "└─\n", "\n", "================================================================================\n", "📊 SUMMARY\n", "================================================================================\n", "\n", "✅ Clean datasets: 5/7\n", "🔴 Datasets with duplicates: 2/7\n", "🗑️ Total duplicates found: 22,628 rows\n", "\n", "⚠️ DUPLICATES DETECTED!\n", "================================================================================\n" ] } ], "source": [ "## 🔍 Data Quality Check - Duplicate Detection\n", "\n", "\"\"\"\n", "Checking for duplicates in all datasets based on primary keys.\n", "This cell only REPORTS duplicates, does not modify data.\n", "\"\"\"\n", "\n", "print(\"=\" * 80)\n", "print(\"🔍 DUPLICATE DETECTION REPORT\")\n", "print(\"=\" * 80)\n", "print()\n", "\n", "# Define primary keys for each dataset\n", "duplicate_report = []\n", "\n", "# 1. Candidates\n", "print(\"┌─ 📊 resume_data.csv (Candidates)\")\n", "print(f\"│ Primary Key: Resume_ID\")\n", "cand_total = len(candidates)\n", "cand_unique = candidates['Resume_ID'].nunique() if 'Resume_ID' in candidates.columns else len(candidates)\n", "cand_dups = cand_total - cand_unique\n", "print(f\"│ Total rows: {cand_total:,}\")\n", "print(f\"│ Unique rows: {cand_unique:,}\")\n", "print(f\"│ Duplicates: {cand_dups:,}\")\n", "print(f\"│ Status: {'✅ CLEAN' if cand_dups == 0 else '🔴 HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Candidates', cand_total, cand_unique, cand_dups))\n", "\n", "# 2. Companies Base\n", "print(\"┌─ 📊 companies.csv (Companies Base)\")\n", "print(f\"│ Primary Key: company_id\")\n", "comp_total = len(companies_base)\n", "comp_unique = companies_base['company_id'].nunique()\n", "comp_dups = comp_total - comp_unique\n", "print(f\"│ Total rows: {comp_total:,}\")\n", "print(f\"│ Unique rows: {comp_unique:,}\")\n", "print(f\"│ Duplicates: {comp_dups:,}\")\n", "print(f\"│ Status: {'✅ CLEAN' if comp_dups == 0 else '🔴 HAS DUPLICATES'}\")\n", "if comp_dups > 0:\n", " dup_ids = companies_base[companies_base.duplicated('company_id', keep=False)]['company_id'].value_counts().head(3)\n", " print(f\"│ Top duplicates:\")\n", " for cid, count in dup_ids.items():\n", " print(f\"│ - company_id={cid}: {count} times\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Companies Base', comp_total, comp_unique, comp_dups))\n", "\n", "# 3. Company Industries\n", "print(\"┌─ 📊 company_industries.csv\")\n", "print(f\"│ Primary Key: company_id + industry\")\n", "ci_total = len(company_industries)\n", "ci_unique = len(company_industries.drop_duplicates(subset=['company_id', 'industry']))\n", "ci_dups = ci_total - ci_unique\n", "print(f\"│ Total rows: {ci_total:,}\")\n", "print(f\"│ Unique rows: {ci_unique:,}\")\n", "print(f\"│ Duplicates: {ci_dups:,}\")\n", "print(f\"│ Status: {'✅ CLEAN' if ci_dups == 0 else '🔴 HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Company Industries', ci_total, ci_unique, ci_dups))\n", "\n", "# 4. Company Specialties\n", "print(\"┌─ 📊 company_specialities.csv\")\n", "print(f\"│ Primary Key: company_id + speciality\")\n", "cs_total = len(company_specialties)\n", "cs_unique = len(company_specialties.drop_duplicates(subset=['company_id', 'speciality']))\n", "cs_dups = cs_total - cs_unique\n", "print(f\"│ Total rows: {cs_total:,}\")\n", "print(f\"│ Unique rows: {cs_unique:,}\")\n", "print(f\"│ Duplicates: {cs_dups:,}\")\n", "print(f\"│ Status: {'✅ CLEAN' if cs_dups == 0 else '🔴 HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Company Specialties', cs_total, cs_unique, cs_dups))\n", "\n", "# 5. Employee Counts\n", "print(\"┌─ 📊 employee_counts.csv\")\n", "print(f\"│ Primary Key: company_id\")\n", "ec_total = len(employee_counts)\n", "ec_unique = employee_counts['company_id'].nunique()\n", "ec_dups = ec_total - ec_unique\n", "print(f\"│ Total rows: {ec_total:,}\")\n", "print(f\"│ Unique rows: {ec_unique:,}\")\n", "print(f\"│ Duplicates: {ec_dups:,}\")\n", "print(f\"│ Status: {'✅ CLEAN' if ec_dups == 0 else '🔴 HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Employee Counts', ec_total, ec_unique, ec_dups))\n", "\n", "# 6. Postings\n", "print(\"┌─ 📊 postings.csv (Job Postings)\")\n", "print(f\"│ Primary Key: job_id\")\n", "if 'job_id' in postings.columns:\n", " post_total = len(postings)\n", " post_unique = postings['job_id'].nunique()\n", " post_dups = post_total - post_unique\n", "else:\n", " post_total = len(postings)\n", " post_unique = len(postings.drop_duplicates())\n", " post_dups = post_total - post_unique\n", "print(f\"│ Total rows: {post_total:,}\")\n", "print(f\"│ Unique rows: {post_unique:,}\")\n", "print(f\"│ Duplicates: {post_dups:,}\")\n", "print(f\"│ Status: {'✅ CLEAN' if post_dups == 0 else '🔴 HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Postings', post_total, post_unique, post_dups))\n", "\n", "# 7. Companies Full (After Merge)\n", "print(\"┌─ 📊 companies_full (After Enrichment)\")\n", "print(f\"│ Primary Key: company_id\")\n", "cf_total = len(companies_full)\n", "cf_unique = companies_full['company_id'].nunique()\n", "cf_dups = cf_total - cf_unique\n", "print(f\"│ Total rows: {cf_total:,}\")\n", "print(f\"│ Unique rows: {cf_unique:,}\")\n", "print(f\"│ Duplicates: {cf_dups:,}\")\n", "print(f\"│ Status: {'✅ CLEAN' if cf_dups == 0 else '🔴 HAS DUPLICATES'}\")\n", "if cf_dups > 0:\n", " dup_ids = companies_full[companies_full.duplicated('company_id', keep=False)]['company_id'].value_counts().head(5)\n", " print(f\"│\")\n", " print(f\"│ Top duplicate company_ids:\")\n", " for cid, count in dup_ids.items():\n", " comp_name = companies_full[companies_full['company_id'] == cid]['name'].iloc[0]\n", " print(f\"│ - {cid} ({comp_name}): {count} times\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Companies Full', cf_total, cf_unique, cf_dups))\n", "\n", "# Summary\n", "print(\"=\" * 80)\n", "print(\"📊 SUMMARY\")\n", "print(\"=\" * 80)\n", "print()\n", "\n", "total_dups = sum(r[3] for r in duplicate_report)\n", "clean_datasets = sum(1 for r in duplicate_report if r[3] == 0)\n", "dirty_datasets = len(duplicate_report) - clean_datasets\n", "\n", "print(f\"✅ Clean datasets: {clean_datasets}/{len(duplicate_report)}\")\n", "print(f\"🔴 Datasets with duplicates: {dirty_datasets}/{len(duplicate_report)}\")\n", "print(f\"🗑️ Total duplicates found: {total_dups:,} rows\")\n", "print()\n", "\n", "if dirty_datasets > 0:\n", " print(\"⚠️ DUPLICATES DETECTED!\")\n", "else:\n", " print(\"✅ All datasets are clean! No duplicates found.\")\n", "\n", "print(\"=\" * 80)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🧹 CLEANING DUPLICATES...\n", "\n", "================================================================================\n", "✅ companies_base: Already clean\n", "\n", "✅ company_industries: Already clean\n", "\n", "✅ company_specialties: Already clean\n", "\n", "✅ employee_counts:\n", " Removed 11,314 duplicates\n", " 35,787 → 24,473 rows\n", "\n", "✅ postings: Already clean\n", "\n", "✅ companies_full:\n", " Removed 11,314 duplicates\n", " 35,787 → 24,473 rows\n", "\n", "================================================================================\n", "✅ DATA CLEANING COMPLETE!\n", "================================================================================\n", "\n", "📊 Total duplicates removed: 22,628 rows\n", "\n", "Cleaned datasets:\n", " - employee_counts: 35,787 → 24,473\n", " - companies_full: 35,787 → 24,473\n" ] } ], "source": [ "\"\"\"\n", "## 🧹 Data Cleaning - Remove Duplicates\n", "\n", "Based on the report above, removing duplicates from datasets.\n", "\"\"\"\n", "\n", "print(\"🧹 CLEANING DUPLICATES...\\n\")\n", "print(\"=\" * 80)\n", "\n", "# Store original counts\n", "original_counts = {}\n", "\n", "# 1. Clean Companies Base (if needed)\n", "if len(companies_base) != companies_base['company_id'].nunique():\n", " original_counts['companies_base'] = len(companies_base)\n", " companies_base = companies_base.drop_duplicates(subset=['company_id'], keep='first')\n", " removed = original_counts['companies_base'] - len(companies_base)\n", " print(f\"✅ companies_base:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['companies_base']:,} → {len(companies_base):,} rows\\n\")\n", "else:\n", " print(f\"✅ companies_base: Already clean\\n\")\n", "\n", "# 2. Clean Company Industries (if needed)\n", "if len(company_industries) != len(company_industries.drop_duplicates(subset=['company_id', 'industry'])):\n", " original_counts['company_industries'] = len(company_industries)\n", " company_industries = company_industries.drop_duplicates(subset=['company_id', 'industry'], keep='first')\n", " removed = original_counts['company_industries'] - len(company_industries)\n", " print(f\"✅ company_industries:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['company_industries']:,} → {len(company_industries):,} rows\\n\")\n", "else:\n", " print(f\"✅ company_industries: Already clean\\n\")\n", "\n", "# 3. Clean Company Specialties (if needed)\n", "if len(company_specialties) != len(company_specialties.drop_duplicates(subset=['company_id', 'speciality'])):\n", " original_counts['company_specialties'] = len(company_specialties)\n", " company_specialties = company_specialties.drop_duplicates(subset=['company_id', 'speciality'], keep='first')\n", " removed = original_counts['company_specialties'] - len(company_specialties)\n", " print(f\"✅ company_specialties:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['company_specialties']:,} → {len(company_specialties):,} rows\\n\")\n", "else:\n", " print(f\"✅ company_specialties: Already clean\\n\")\n", "\n", "# 4. Clean Employee Counts (if needed)\n", "if len(employee_counts) != employee_counts['company_id'].nunique():\n", " original_counts['employee_counts'] = len(employee_counts)\n", " employee_counts = employee_counts.drop_duplicates(subset=['company_id'], keep='first')\n", " removed = original_counts['employee_counts'] - len(employee_counts)\n", " print(f\"✅ employee_counts:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['employee_counts']:,} → {len(employee_counts):,} rows\\n\")\n", "else:\n", " print(f\"✅ employee_counts: Already clean\\n\")\n", "\n", "# 5. Clean Postings (if needed)\n", "if 'job_id' in postings.columns:\n", " if len(postings) != postings['job_id'].nunique():\n", " original_counts['postings'] = len(postings)\n", " postings = postings.drop_duplicates(subset=['job_id'], keep='first')\n", " removed = original_counts['postings'] - len(postings)\n", " print(f\"✅ postings:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['postings']:,} → {len(postings):,} rows\\n\")\n", " else:\n", " print(f\"✅ postings: Already clean\\n\")\n", "\n", "# 6. Clean Companies Full (if needed)\n", "if len(companies_full) != companies_full['company_id'].nunique():\n", " original_counts['companies_full'] = len(companies_full)\n", " companies_full = companies_full.drop_duplicates(subset=['company_id'], keep='first')\n", " removed = original_counts['companies_full'] - len(companies_full)\n", " print(f\"✅ companies_full:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['companies_full']:,} → {len(companies_full):,} rows\\n\")\n", "else:\n", " print(f\"✅ companies_full: Already clean\\n\")\n", "\n", "print(\"=\" * 80)\n", "print(\"✅ DATA CLEANING COMPLETE!\")\n", "print(\"=\" * 80)\n", "print()\n", "\n", "# Summary\n", "if original_counts:\n", " total_removed = sum(original_counts[k] - globals()[k].shape[0] if k in globals() else 0 \n", " for k in original_counts.keys())\n", " print(f\"📊 Total duplicates removed: {total_removed:,} rows\")\n", " print()\n", " print(\"Cleaned datasets:\")\n", " for dataset, original in original_counts.items():\n", " current = len(globals()[dataset]) if dataset in globals() else 0\n", " print(f\" - {dataset}: {original:,} → {current:,}\")\n", "else:\n", " print(\"✅ No duplicates found - all datasets were already clean!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 7: Load Embedding Model & Pre-computed Vectors" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🧠 Loading embedding model...\n", "\n", "✅ Model loaded: all-MiniLM-L6-v2\n", "📐 Embedding dimension: ℝ^384\n", "\n", "📂 Loading pre-computed embeddings...\n", "✅ Loaded from ../processed/\n", "📊 Candidate vectors: (9544, 384)\n", "📊 Company vectors: (35787, 384)\n", "\n" ] } ], "source": [ "print(\"🧠 Loading embedding model...\\n\")\n", "model = SentenceTransformer(Config.EMBEDDING_MODEL)\n", "embedding_dim = model.get_sentence_embedding_dimension()\n", "print(f\"✅ Model loaded: {Config.EMBEDDING_MODEL}\")\n", "print(f\"📐 Embedding dimension: ℝ^{embedding_dim}\\n\")\n", "\n", "print(\"📂 Loading pre-computed embeddings...\")\n", "\n", "try:\n", " # Try to load from processed folder\n", " cand_vectors = np.load(f'{Config.PROCESSED_PATH}candidate_embeddings.npy')\n", " comp_vectors = np.load(f'{Config.PROCESSED_PATH}company_embeddings.npy')\n", " \n", " print(f\"✅ Loaded from {Config.PROCESSED_PATH}\")\n", " print(f\"📊 Candidate vectors: {cand_vectors.shape}\")\n", " print(f\"📊 Company vectors: {comp_vectors.shape}\\n\")\n", " \n", "except FileNotFoundError:\n", " print(\"⚠️ Pre-computed embeddings not found!\")\n", " print(\" Embeddings will need to be generated (takes ~5-10 minutes)\")\n", " print(\" This is normal if running for the first time.\\n\")\n", " \n", " # You can add embedding generation code here if needed\n", " # For now, we'll skip to keep notebook clean\n", " cand_vectors = None\n", " comp_vectors = None" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 8: Core Matching Function" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Safe matching function loaded!\n", "\n", "📊 DIAGNOSTICS:\n", " Candidate vectors: 9,544\n", " Company vectors: 35,787\n", " Companies dataset: 24,473\n", "\n", "⚠️ INDEX MISMATCH DETECTED!\n", " Embeddings: 35,787\n", " Dataset: 24,473\n", " Missing rows: 11,314\n", "\n", "💡 CAUSE: Embeddings generated BEFORE deduplication\n", "\n", "🎯 SOLUTIONS:\n", " A. Safe functions active (current) ✅\n", " B. Regenerate embeddings after dedup\n", " C. Run collaborative filtering step\n" ] } ], "source": [ "# ============================================================================\n", "# CORE MATCHING FUNCTION (SAFE VERSION)\n", "# ============================================================================\n", "\n", "def find_top_matches(candidate_idx: int, top_k: int = 10) -> list:\n", " \"\"\"\n", " Find top K company matches for a candidate.\n", " \n", " SAFE VERSION: Handles index mismatches between embeddings and dataset\n", " \n", " Args:\n", " candidate_idx: Index of candidate in candidates DataFrame\n", " top_k: Number of top matches to return\n", " \n", " Returns:\n", " List of tuples: [(company_idx, similarity_score), ...]\n", " \"\"\"\n", " \n", " # Validate candidate index\n", " if candidate_idx >= len(cand_vectors):\n", " print(f\"❌ Candidate index {candidate_idx} out of range\")\n", " return []\n", " \n", " # Get candidate vector\n", " cand_vec = cand_vectors[candidate_idx].reshape(1, -1)\n", " \n", " # Calculate similarities with all company vectors\n", " similarities = cosine_similarity(cand_vec, comp_vectors)[0]\n", " \n", " # CRITICAL FIX: Only use indices that exist in companies_full\n", " max_valid_idx = len(companies_full) - 1\n", " \n", " # Truncate similarities to valid range\n", " valid_similarities = similarities[:max_valid_idx + 1]\n", " \n", " # Get top K indices from valid range\n", " top_indices = np.argsort(valid_similarities)[::-1][:top_k]\n", " \n", " # Return (index, score) tuples\n", " results = [(int(idx), float(valid_similarities[idx])) for idx in top_indices]\n", " \n", " return results\n", "\n", "# Test function and show diagnostics\n", "print(\"✅ Safe matching function loaded!\")\n", "print(f\"\\n📊 DIAGNOSTICS:\")\n", "print(f\" Candidate vectors: {len(cand_vectors):,}\")\n", "print(f\" Company vectors: {len(comp_vectors):,}\")\n", "print(f\" Companies dataset: {len(companies_full):,}\")\n", "\n", "if len(comp_vectors) > len(companies_full):\n", " print(f\"\\n⚠️ INDEX MISMATCH DETECTED!\")\n", " print(f\" Embeddings: {len(comp_vectors):,}\")\n", " print(f\" Dataset: {len(companies_full):,}\")\n", " print(f\" Missing rows: {len(comp_vectors) - len(companies_full):,}\")\n", " print(f\"\\n💡 CAUSE: Embeddings generated BEFORE deduplication\")\n", " print(f\"\\n🎯 SOLUTIONS:\")\n", " print(f\" A. Safe functions active (current) ✅\")\n", " print(f\" B. Regenerate embeddings after dedup\")\n", " print(f\" C. Run collaborative filtering step\")\n", "else:\n", " print(f\"\\n✅ Embeddings and dataset are aligned!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 9: Initialize FREE LLM (Hugging Face)\n", "\n", "### Get your FREE token: https://huggingface.co/settings/tokens" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Hugging Face client initialized (FREE)\n", "🤖 Model: meta-llama/Llama-3.2-3B-Instruct\n", "💰 Cost: $0.00 (completely free!)\n", "\n", "✅ LLM helper functions ready\n" ] } ], "source": [ "# Initialize Hugging Face Inference Client (FREE)\n", "if Config.HF_TOKEN:\n", " try:\n", " hf_client = InferenceClient(token=Config.HF_TOKEN)\n", " print(\"✅ Hugging Face client initialized (FREE)\")\n", " print(f\"🤖 Model: {Config.LLM_MODEL}\")\n", " print(\"💰 Cost: $0.00 (completely free!)\\n\")\n", " LLM_AVAILABLE = True\n", " except Exception as e:\n", " print(f\"⚠️ Failed to initialize HF client: {e}\")\n", " LLM_AVAILABLE = False\n", "else:\n", " print(\"⚠️ No Hugging Face token configured\")\n", " print(\" LLM features will be disabled\")\n", " print(\"\\n📝 To enable:\")\n", " print(\" 1. Go to: https://huggingface.co/settings/tokens\")\n", " print(\" 2. Create a token (free)\")\n", " print(\" 3. Set: Config.HF_TOKEN = 'your-token-here'\\n\")\n", " LLM_AVAILABLE = False\n", " hf_client = None\n", "\n", "def call_llm(prompt: str, max_tokens: int = 1000) -> str:\n", " \"\"\"\n", " Generic LLM call using Hugging Face Inference API (FREE).\n", " \"\"\"\n", " if not LLM_AVAILABLE:\n", " return \"[LLM not available - check .env file for HF_TOKEN]\"\n", " \n", " try:\n", " response = hf_client.chat_completion( # ✅ chat_completion\n", " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " model=Config.LLM_MODEL,\n", " max_tokens=max_tokens,\n", " temperature=0.7\n", " )\n", " return response.choices[0].message.content # ✅ Extrai conteúdo\n", " except Exception as e:\n", " return f\"[Error: {str(e)}]\"\n", "\n", "print(\"✅ LLM helper functions ready\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 10: Pydantic Schemas for Structured Output" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Pydantic schemas defined\n" ] } ], "source": [ "class JobLevelClassification(BaseModel):\n", " \"\"\"Job level classification result\"\"\"\n", " level: Literal['Entry', 'Mid', 'Senior', 'Executive']\n", " confidence: float = Field(ge=0.0, le=1.0)\n", " reasoning: str\n", "\n", "class SkillsTaxonomy(BaseModel):\n", " \"\"\"Structured skills extraction\"\"\"\n", " technical_skills: List[str] = Field(default_factory=list)\n", " soft_skills: List[str] = Field(default_factory=list)\n", " certifications: List[str] = Field(default_factory=list)\n", " languages: List[str] = Field(default_factory=list)\n", "\n", "class MatchExplanation(BaseModel):\n", " \"\"\"Match reasoning\"\"\"\n", " overall_score: float = Field(ge=0.0, le=1.0)\n", " match_strengths: List[str]\n", " skill_gaps: List[str]\n", " recommendation: str\n", " fit_summary: str = Field(max_length=200)\n", "\n", "print(\"✅ Pydantic schemas defined\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 11: Job Level Classification (Zero-Shot)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🧪 Testing zero-shot classification...\n", "\n", "📊 Classification Result:\n", "{\n", " \"level\": \"Entry\",\n", " \"confidence\": 0.85,\n", " \"reasoning\": \"The job posting requires a Marketing Coordinator with some experience in graphic design, indicating a junior role with limited technical leadership responsibilities.\"\n", "}\n" ] } ], "source": [ "def classify_job_level_zero_shot(job_description: str) -> Dict:\n", " \"\"\"\n", " Zero-shot job level classification.\n", " \n", " Returns classification as: Entry, Mid, Senior, or Executive\n", " \"\"\"\n", " \n", " prompt = f\"\"\"Classify this job posting into ONE seniority level.\n", "\n", "Levels:\n", "- Entry: 0-2 years experience, junior roles\n", "- Mid: 3-5 years experience, independent work\n", "- Senior: 6-10 years experience, technical leadership\n", "- Executive: 10+ years, strategic leadership, C-level\n", "\n", "Job Posting:\n", "{job_description[:500]}\n", "\n", "Return ONLY valid JSON:\n", "{{\n", " \"level\": \"Entry|Mid|Senior|Executive\",\n", " \"confidence\": 0.85,\n", " \"reasoning\": \"Brief explanation\"\n", "}}\n", "\"\"\"\n", " \n", " response = call_llm(prompt)\n", " \n", " try:\n", " # Extract JSON\n", " json_str = response.strip()\n", " if '```json' in json_str:\n", " json_str = json_str.split('```json')[1].split('```')[0].strip()\n", " elif '```' in json_str:\n", " json_str = json_str.split('```')[1].split('```')[0].strip()\n", " \n", " # Find JSON in response\n", " if '{' in json_str and '}' in json_str:\n", " start = json_str.index('{')\n", " end = json_str.rindex('}') + 1\n", " json_str = json_str[start:end]\n", " \n", " result = json.loads(json_str)\n", " return result\n", " except:\n", " return {\n", " \"level\": \"Unknown\",\n", " \"confidence\": 0.0,\n", " \"reasoning\": \"Failed to parse response\"\n", " }\n", "\n", "# Test if LLM available and data loaded\n", "if LLM_AVAILABLE and len(postings) > 0:\n", " print(\"🧪 Testing zero-shot classification...\\n\")\n", " sample = postings.iloc[0]['description']\n", " result = classify_job_level_zero_shot(sample)\n", " \n", " print(\"📊 Classification Result:\")\n", " print(json.dumps(result, indent=2))\n", "else:\n", " print(\"⚠️ Skipped - LLM not available or no data\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 12: Few-Shot Learning" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🧪 Comparing Zero-Shot vs Few-Shot...\n", "\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[15]\u001b[39m\u001b[32m, line 56\u001b[39m\n\u001b[32m 53\u001b[39m sample = postings.iloc[\u001b[32m0\u001b[39m][\u001b[33m'\u001b[39m\u001b[33mdescription\u001b[39m\u001b[33m'\u001b[39m]\n\u001b[32m 55\u001b[39m zero = classify_job_level_zero_shot(sample)\n\u001b[32m---> \u001b[39m\u001b[32m56\u001b[39m few = \u001b[43mclassify_job_level_few_shot\u001b[49m\u001b[43m(\u001b[49m\u001b[43msample\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 58\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33m📊 Comparison:\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 59\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mZero-shot: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mzero[\u001b[33m'\u001b[39m\u001b[33mlevel\u001b[39m\u001b[33m'\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m (confidence: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mzero[\u001b[33m'\u001b[39m\u001b[33mconfidence\u001b[39m\u001b[33m'\u001b[39m]\u001b[38;5;132;01m:\u001b[39;00m\u001b[33m.2f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m)\u001b[39m\u001b[33m\"\u001b[39m)\n", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[15]\u001b[39m\u001b[32m, line 33\u001b[39m, in \u001b[36mclassify_job_level_few_shot\u001b[39m\u001b[34m(job_description)\u001b[39m\n\u001b[32m 2\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 3\u001b[39m \u001b[33;03m Few-shot classification with examples.\u001b[39;00m\n\u001b[32m 4\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m 6\u001b[39m prompt = \u001b[33mf\u001b[39m\u001b[33m\"\"\"\u001b[39m\u001b[33mClassify this job posting using examples.\u001b[39m\n\u001b[32m 7\u001b[39m \n\u001b[32m 8\u001b[39m \u001b[33mEXAMPLES:\u001b[39m\n\u001b[32m (...)\u001b[39m\u001b[32m 30\u001b[39m \u001b[38;5;130;01m}}\u001b[39;00m\n\u001b[32m 31\u001b[39m \u001b[33m\"\"\"\u001b[39m\n\u001b[32m---> \u001b[39m\u001b[32m33\u001b[39m response = \u001b[43mcall_llm\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 35\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 36\u001b[39m json_str = response.strip()\n", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[12]\u001b[39m\u001b[32m, line 30\u001b[39m, in \u001b[36mcall_llm\u001b[39m\u001b[34m(prompt, max_tokens)\u001b[39m\n\u001b[32m 27\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33m[LLM not available - check .env file for HF_TOKEN]\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 29\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m30\u001b[39m response = \u001b[43mhf_client\u001b[49m\u001b[43m.\u001b[49m\u001b[43mchat_completion\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# ✅ chat_completion\u001b[39;49;00m\n\u001b[32m 31\u001b[39m \u001b[43m \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43m{\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mrole\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43muser\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcontent\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m}\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 32\u001b[39m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m=\u001b[49m\u001b[43mConfig\u001b[49m\u001b[43m.\u001b[49m\u001b[43mLLM_MODEL\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 33\u001b[39m \u001b[43m \u001b[49m\u001b[43mmax_tokens\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmax_tokens\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 34\u001b[39m \u001b[43m \u001b[49m\u001b[43mtemperature\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0.7\u001b[39;49m\n\u001b[32m 35\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 36\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m response.choices[\u001b[32m0\u001b[39m].message.content \u001b[38;5;66;03m# ✅ Extrai conteúdo\u001b[39;00m\n\u001b[32m 37\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/huggingface_hub/inference/_client.py:915\u001b[39m, in \u001b[36mInferenceClient.chat_completion\u001b[39m\u001b[34m(self, messages, model, stream, frequency_penalty, logit_bias, logprobs, max_tokens, n, presence_penalty, response_format, seed, stop, stream_options, temperature, tool_choice, tool_prompt, tools, top_logprobs, top_p, extra_body)\u001b[39m\n\u001b[32m 887\u001b[39m parameters = {\n\u001b[32m 888\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mmodel\u001b[39m\u001b[33m\"\u001b[39m: payload_model,\n\u001b[32m 889\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mfrequency_penalty\u001b[39m\u001b[33m\"\u001b[39m: frequency_penalty,\n\u001b[32m (...)\u001b[39m\u001b[32m 906\u001b[39m **(extra_body \u001b[38;5;129;01mor\u001b[39;00m {}),\n\u001b[32m 907\u001b[39m }\n\u001b[32m 908\u001b[39m request_parameters = provider_helper.prepare_request(\n\u001b[32m 909\u001b[39m inputs=messages,\n\u001b[32m 910\u001b[39m parameters=parameters,\n\u001b[32m (...)\u001b[39m\u001b[32m 913\u001b[39m api_key=\u001b[38;5;28mself\u001b[39m.token,\n\u001b[32m 914\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m915\u001b[39m data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_inner_post\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest_parameters\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 917\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m stream:\n\u001b[32m 918\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m _stream_chat_completion_response(data) \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/huggingface_hub/inference/_client.py:260\u001b[39m, in \u001b[36mInferenceClient._inner_post\u001b[39m\u001b[34m(self, request_parameters, stream)\u001b[39m\n\u001b[32m 257\u001b[39m request_parameters.headers[\u001b[33m\"\u001b[39m\u001b[33mAccept\u001b[39m\u001b[33m\"\u001b[39m] = \u001b[33m\"\u001b[39m\u001b[33mimage/png\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 259\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m260\u001b[39m response = \u001b[43mget_session\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpost\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 261\u001b[39m \u001b[43m \u001b[49m\u001b[43mrequest_parameters\u001b[49m\u001b[43m.\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 262\u001b[39m \u001b[43m \u001b[49m\u001b[43mjson\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest_parameters\u001b[49m\u001b[43m.\u001b[49m\u001b[43mjson\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 263\u001b[39m \u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest_parameters\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 264\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest_parameters\u001b[49m\u001b[43m.\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 265\u001b[39m \u001b[43m \u001b[49m\u001b[43mcookies\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcookies\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 266\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 267\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 268\u001b[39m \u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 269\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 270\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTimeoutError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m error:\n\u001b[32m 271\u001b[39m \u001b[38;5;66;03m# Convert any `TimeoutError` to a `InferenceTimeoutError`\u001b[39;00m\n\u001b[32m 272\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m InferenceTimeoutError(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mInference call timed out: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrequest_parameters.url\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01merror\u001b[39;00m \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/requests/sessions.py:637\u001b[39m, in \u001b[36mSession.post\u001b[39m\u001b[34m(self, url, data, json, **kwargs)\u001b[39m\n\u001b[32m 626\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpost\u001b[39m(\u001b[38;5;28mself\u001b[39m, url, data=\u001b[38;5;28;01mNone\u001b[39;00m, json=\u001b[38;5;28;01mNone\u001b[39;00m, **kwargs):\n\u001b[32m 627\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33mr\u001b[39m\u001b[33;03m\"\"\"Sends a POST request. Returns :class:`Response` object.\u001b[39;00m\n\u001b[32m 628\u001b[39m \n\u001b[32m 629\u001b[39m \u001b[33;03m :param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 634\u001b[39m \u001b[33;03m :rtype: requests.Response\u001b[39;00m\n\u001b[32m 635\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m637\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mPOST\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mjson\u001b[49m\u001b[43m=\u001b[49m\u001b[43mjson\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/requests/sessions.py:589\u001b[39m, in \u001b[36mSession.request\u001b[39m\u001b[34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[39m\n\u001b[32m 584\u001b[39m send_kwargs = {\n\u001b[32m 585\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mtimeout\u001b[39m\u001b[33m\"\u001b[39m: timeout,\n\u001b[32m 586\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mallow_redirects\u001b[39m\u001b[33m\"\u001b[39m: allow_redirects,\n\u001b[32m 587\u001b[39m }\n\u001b[32m 588\u001b[39m send_kwargs.update(settings)\n\u001b[32m--> \u001b[39m\u001b[32m589\u001b[39m resp = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 591\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/requests/sessions.py:703\u001b[39m, in \u001b[36mSession.send\u001b[39m\u001b[34m(self, request, **kwargs)\u001b[39m\n\u001b[32m 700\u001b[39m start = preferred_clock()\n\u001b[32m 702\u001b[39m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m703\u001b[39m r = \u001b[43madapter\u001b[49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 705\u001b[39m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[32m 706\u001b[39m elapsed = preferred_clock() - start\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/huggingface_hub/utils/_http.py:95\u001b[39m, in \u001b[36mUniqueRequestIdAdapter.send\u001b[39m\u001b[34m(self, request, *args, **kwargs)\u001b[39m\n\u001b[32m 93\u001b[39m logger.debug(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mSend: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m_curlify(request)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m 94\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m95\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 96\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m requests.RequestException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 97\u001b[39m request_id = request.headers.get(X_AMZN_TRACE_ID)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/requests/adapters.py:644\u001b[39m, in \u001b[36mHTTPAdapter.send\u001b[39m\u001b[34m(self, request, stream, timeout, verify, cert, proxies)\u001b[39m\n\u001b[32m 641\u001b[39m timeout = TimeoutSauce(connect=timeout, read=timeout)\n\u001b[32m 643\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m644\u001b[39m resp = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 645\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 646\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m=\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 647\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 648\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 649\u001b[39m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 650\u001b[39m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 651\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 652\u001b[39m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 653\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 654\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 655\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 656\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 658\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[32m 659\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(err, request=request)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/urllib3/connectionpool.py:787\u001b[39m, in \u001b[36mHTTPConnectionPool.urlopen\u001b[39m\u001b[34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[39m\n\u001b[32m 784\u001b[39m response_conn = conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 786\u001b[39m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m787\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 788\u001b[39m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 789\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 790\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 791\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 792\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 793\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 794\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 795\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 796\u001b[39m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m=\u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 797\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 798\u001b[39m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 799\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 800\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 802\u001b[39m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[32m 803\u001b[39m clean_exit = \u001b[38;5;28;01mTrue\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/urllib3/connectionpool.py:534\u001b[39m, in \u001b[36mHTTPConnectionPool._make_request\u001b[39m\u001b[34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[39m\n\u001b[32m 532\u001b[39m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[32m 533\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m534\u001b[39m response = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 535\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 536\u001b[39m \u001b[38;5;28mself\u001b[39m._raise_timeout(err=e, url=url, timeout_value=read_timeout)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/urllib3/connection.py:565\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 562\u001b[39m _shutdown = \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m.sock, \u001b[33m\"\u001b[39m\u001b[33mshutdown\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 564\u001b[39m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m565\u001b[39m httplib_response = \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 567\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 568\u001b[39m assert_header_parsing(httplib_response.msg)\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/http/client.py:1428\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1426\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1427\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1428\u001b[39m \u001b[43mresponse\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1429\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[32m 1430\u001b[39m \u001b[38;5;28mself\u001b[39m.close()\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/http/client.py:331\u001b[39m, in \u001b[36mHTTPResponse.begin\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 329\u001b[39m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[32m 330\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m331\u001b[39m version, status, reason = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 332\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m status != CONTINUE:\n\u001b[32m 333\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/http/client.py:292\u001b[39m, in \u001b[36mHTTPResponse._read_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 291\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m--> \u001b[39m\u001b[32m292\u001b[39m line = \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfp\u001b[49m\u001b[43m.\u001b[49m\u001b[43mreadline\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_MAXLINE\u001b[49m\u001b[43m \u001b[49m\u001b[43m+\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m)\u001b[49m, \u001b[33m\"\u001b[39m\u001b[33miso-8859-1\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 293\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) > _MAXLINE:\n\u001b[32m 294\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[33m\"\u001b[39m\u001b[33mstatus line\u001b[39m\u001b[33m\"\u001b[39m)\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/socket.py:707\u001b[39m, in \u001b[36mSocketIO.readinto\u001b[39m\u001b[34m(self, b)\u001b[39m\n\u001b[32m 705\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m 706\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m707\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sock\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 708\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[32m 709\u001b[39m \u001b[38;5;28mself\u001b[39m._timeout_occurred = \u001b[38;5;28;01mTrue\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/ssl.py:1252\u001b[39m, in \u001b[36mSSLSocket.recv_into\u001b[39m\u001b[34m(self, buffer, nbytes, flags)\u001b[39m\n\u001b[32m 1248\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m flags != \u001b[32m0\u001b[39m:\n\u001b[32m 1249\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1250\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mnon-zero flags not allowed in calls to recv_into() on \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m %\n\u001b[32m 1251\u001b[39m \u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m1252\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnbytes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1253\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1254\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m().recv_into(buffer, nbytes, flags)\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/ssl.py:1104\u001b[39m, in \u001b[36mSSLSocket.read\u001b[39m\u001b[34m(self, len, buffer)\u001b[39m\n\u001b[32m 1102\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1103\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m buffer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1104\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sslobj\u001b[49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1105\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1106\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._sslobj.read(\u001b[38;5;28mlen\u001b[39m)\n", "\u001b[31mKeyboardInterrupt\u001b[39m: " ] } ], "source": [ "def classify_job_level_few_shot(job_description: str) -> Dict:\n", " \"\"\"\n", " Few-shot classification with examples.\n", " \"\"\"\n", " \n", " prompt = f\"\"\"Classify this job posting using examples.\n", "\n", "EXAMPLES:\n", "\n", "Example 1 (Entry):\n", "\"Recent graduate wanted. Python basics. Mentorship provided.\"\n", "→ Entry level (learning focus, 0-2 years)\n", "\n", "Example 2 (Senior):\n", "\"5+ years backend. Lead team of 3. System architecture.\"\n", "→ Senior level (technical leadership, 6-10 years)\n", "\n", "Example 3 (Executive):\n", "\"CTO position. 15+ years. Define technical strategy.\"\n", "→ Executive level (C-level, strategic)\n", "\n", "NOW CLASSIFY:\n", "{job_description[:500]}\n", "\n", "Return JSON:\n", "{{\n", " \"level\": \"Entry|Mid|Senior|Executive\",\n", " \"confidence\": 0.0-1.0,\n", " \"reasoning\": \"Explain\"\n", "}}\n", "\"\"\"\n", " \n", " response = call_llm(prompt)\n", " \n", " try:\n", " json_str = response.strip()\n", " if '```json' in json_str:\n", " json_str = json_str.split('```json')[1].split('```')[0].strip()\n", " \n", " if '{' in json_str and '}' in json_str:\n", " start = json_str.index('{')\n", " end = json_str.rindex('}') + 1\n", " json_str = json_str[start:end]\n", " \n", " result = json.loads(json_str)\n", " return result\n", " except:\n", " return {\"level\": \"Unknown\", \"confidence\": 0.0, \"reasoning\": \"Parse error\"}\n", "\n", "# Compare zero-shot vs few-shot\n", "if LLM_AVAILABLE and len(postings) > 0:\n", " print(\"🧪 Comparing Zero-Shot vs Few-Shot...\\n\")\n", " sample = postings.iloc[0]['description']\n", " \n", " zero = classify_job_level_zero_shot(sample)\n", " few = classify_job_level_few_shot(sample)\n", " \n", " print(\"📊 Comparison:\")\n", " print(f\"Zero-shot: {zero['level']} (confidence: {zero['confidence']:.2f})\")\n", " print(f\"Few-shot: {few['level']} (confidence: {few['confidence']:.2f})\")\n", "else:\n", " print(\"⚠️ Skipped\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 13: Structured Skills Extraction" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🔍 Testing skills extraction...\n", "\n", "📊 Extracted Skills:\n", "{\n", " \"technical_skills\": [\n", " \"Adobe Creative Cloud\",\n", " \"Microsoft Office Suite\"\n", " ],\n", " \"soft_skills\": [\n", " \"Communication\",\n", " \"Leadership\",\n", " \"Organization\",\n", " \"Problem-solving\",\n", " \"Time management\",\n", " \"Positive attitude\",\n", " \"Respect\",\n", " \"Responsibility\",\n", " \"Proactivity\"\n", " ],\n", " \"certifications\": [\n", " \"AWS Certified\"\n", " ],\n", " \"languages\": [\n", " \"English\"\n", " ]\n", "}\n" ] } ], "source": [ "def extract_skills_taxonomy(job_description: str) -> Dict:\n", " \"\"\"\n", " Extract structured skills using LLM + Pydantic validation.\n", " \"\"\"\n", " \n", " prompt = f\"\"\"Extract skills from this job posting.\n", "\n", "Job Posting:\n", "{job_description[:800]}\n", "\n", "Return ONLY valid JSON:\n", "{{\n", " \"technical_skills\": [\"Python\", \"Docker\", \"AWS\"],\n", " \"soft_skills\": [\"Communication\", \"Leadership\"],\n", " \"certifications\": [\"AWS Certified\"],\n", " \"languages\": [\"English\", \"Danish\"]\n", "}}\n", "\"\"\"\n", " \n", " response = call_llm(prompt, max_tokens=800)\n", " \n", " try:\n", " json_str = response.strip()\n", " if '```json' in json_str:\n", " json_str = json_str.split('```json')[1].split('```')[0].strip()\n", " \n", " if '{' in json_str and '}' in json_str:\n", " start = json_str.index('{')\n", " end = json_str.rindex('}') + 1\n", " json_str = json_str[start:end]\n", " \n", " data = json.loads(json_str)\n", " # Validate with Pydantic\n", " validated = SkillsTaxonomy(**data)\n", " return validated.model_dump()\n", " except:\n", " return {\n", " \"technical_skills\": [],\n", " \"soft_skills\": [],\n", " \"certifications\": [],\n", " \"languages\": []\n", " }\n", "\n", "# Test extraction\n", "if LLM_AVAILABLE and len(postings) > 0:\n", " print(\"🔍 Testing skills extraction...\\n\")\n", " sample = postings.iloc[0]['description']\n", " skills = extract_skills_taxonomy(sample)\n", " \n", " print(\"📊 Extracted Skills:\")\n", " print(json.dumps(skills, indent=2))\n", "else:\n", " print(\"⚠️ Skipped\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 14: Match Explainability" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "💡 Testing match explainability...\n", "\n", "📊 Match Explanation:\n", "{\n", " \"overall_score\": 0.7028058171272278,\n", " \"match_strengths\": [\n", " \"Top 3-5 matching factors\"\n", " ],\n", " \"skill_gaps\": [\n", " \"Missing skills\"\n", " ],\n", " \"recommendation\": \"What candidate should do\",\n", " \"fit_summary\": \"This candidate has a strong technical background, with skills relevant to big data and analytics, but may need to improve their skills to align with TeachTown's specific needs.\"\n", "}\n" ] } ], "source": [ "def explain_match(candidate_idx: int, company_idx: int, similarity_score: float) -> Dict:\n", " \"\"\"\n", " Generate LLM explanation for why candidate matches company.\n", " \"\"\"\n", " \n", " cand = candidates.iloc[candidate_idx]\n", " comp = companies_full.iloc[company_idx]\n", " \n", " cand_skills = str(cand.get('skills', 'N/A'))[:300]\n", " cand_exp = str(cand.get('positions', 'N/A'))[:300]\n", " comp_req = str(comp.get('required_skills', 'N/A'))[:300]\n", " comp_name = comp.get('name', 'Unknown')\n", " \n", " prompt = f\"\"\"Explain why this candidate matches this company.\n", "\n", "Candidate:\n", "Skills: {cand_skills}\n", "Experience: {cand_exp}\n", "\n", "Company: {comp_name}\n", "Requirements: {comp_req}\n", "\n", "Similarity Score: {similarity_score:.2f}\n", "\n", "Return JSON:\n", "{{\n", " \"overall_score\": {similarity_score},\n", " \"match_strengths\": [\"Top 3-5 matching factors\"],\n", " \"skill_gaps\": [\"Missing skills\"],\n", " \"recommendation\": \"What candidate should do\",\n", " \"fit_summary\": \"One sentence summary\"\n", "}}\n", "\"\"\"\n", " \n", " response = call_llm(prompt, max_tokens=1000)\n", " \n", " try:\n", " json_str = response.strip()\n", " if '```json' in json_str:\n", " json_str = json_str.split('```json')[1].split('```')[0].strip()\n", " \n", " if '{' in json_str and '}' in json_str:\n", " start = json_str.index('{')\n", " end = json_str.rindex('}') + 1\n", " json_str = json_str[start:end]\n", " \n", " data = json.loads(json_str)\n", " return data\n", " except:\n", " return {\n", " \"overall_score\": similarity_score,\n", " \"match_strengths\": [\"Unable to generate\"],\n", " \"skill_gaps\": [],\n", " \"recommendation\": \"Review manually\",\n", " \"fit_summary\": f\"Match score: {similarity_score:.2f}\"\n", " }\n", "\n", "# Test explainability\n", "if LLM_AVAILABLE and cand_vectors is not None and len(candidates) > 0:\n", " print(\"💡 Testing match explainability...\\n\")\n", " matches = find_top_matches(0, top_k=1)\n", " if matches:\n", " comp_idx, score = matches[0]\n", " explanation = explain_match(0, comp_idx, score)\n", " \n", " print(\"📊 Match Explanation:\")\n", " print(json.dumps(explanation, indent=2))\n", "else:\n", " print(\"⚠️ Skipped - requirements not met\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 16: Detailed Match Visualization" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🔍 DETAILED MATCH ANALYSIS\n", "====================================================================================================\n", "\n", "🎯 CANDIDATE #0\n", "Resume ID: N/A\n", "Category: N/A\n", "Skills: ['Big Data', 'Hadoop', 'Hive', 'Python', 'Mapreduce', 'Spark', 'Java', 'Machine Learning', 'Cloud', 'Hdfs', 'YARN', 'Core Java', 'Data Science', 'C++'...\n", "\n", "🔗 TOP 5 MATCHES:\n", "\n", "#1. TeachTown (Score: 0.7028)\n", " Industries: E-Learning Providers...\n", "#2. Wolverine Power Systems (Score: 0.7026)\n", " Industries: Renewable Energy Semiconductor Manufacturing...\n", "#3. Mariner (Score: 0.7010)\n", " Industries: Financial Services...\n", "#4. Primavera School (Score: 0.6827)\n", " Industries: Education Administration Programs...\n", "#5. OM1, Inc. (Score: 0.6776)\n", " Industries: Pharmaceutical Manufacturing...\n", "\n", "====================================================================================================\n" ] }, { "data": { "text/plain": [ "[(9418, 0.7028058171272278),\n", " (9417, 0.7025721669197083),\n", " (9416, 0.7010321021080017),\n", " (13786, 0.6826589107513428),\n", " (16864, 0.6776158213615417)]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ============================================================================\n", "# 🔍 DETAILED MATCH EXAMPLE\n", "# ============================================================================\n", "\n", "def show_detailed_match_example(candidate_idx=0, top_k=5):\n", " print(\"🔍 DETAILED MATCH ANALYSIS\")\n", " print(\"=\" * 100)\n", " \n", " if candidate_idx >= len(candidates):\n", " print(f\"❌ ERROR: Candidate {candidate_idx} out of range\")\n", " return None\n", " \n", " cand = candidates.iloc[candidate_idx]\n", " \n", " print(f\"\\n🎯 CANDIDATE #{candidate_idx}\")\n", " print(f\"Resume ID: {cand.get('Resume_ID', 'N/A')}\")\n", " print(f\"Category: {cand.get('Category', 'N/A')}\")\n", " print(f\"Skills: {str(cand.get('skills', 'N/A'))[:150]}...\\n\")\n", " \n", " matches = find_top_matches(candidate_idx, top_k=top_k)\n", " \n", " print(f\"🔗 TOP {len(matches)} MATCHES:\\n\")\n", " \n", " for rank, (comp_idx, score) in enumerate(matches, 1):\n", " if comp_idx >= len(companies_full):\n", " continue\n", " \n", " company = companies_full.iloc[comp_idx]\n", " print(f\"#{rank}. {company.get('name', 'N/A')} (Score: {score:.4f})\")\n", " print(f\" Industries: {str(company.get('industries_list', 'N/A'))[:60]}...\")\n", " \n", " print(\"\\n\" + \"=\" * 100)\n", " return matches\n", "\n", "# Test\n", "show_detailed_match_example(candidate_idx=0, top_k=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 17: Bridging Concept Analysis" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🌉 THE BRIDGING CONCEPT\n", "==========================================================================================\n", "\n", "📊 DATA REALITY:\n", " Total companies: 24,473\n", " WITH postings: 0 (0.0%)\n", " WITHOUT postings: 24,473\n", "\n", "🎯 THE PROBLEM:\n", " Companies: 'We are in TECH INDUSTRY'\n", " Candidates: 'I know PYTHON, AWS'\n", " → Different languages! 🚫\n", "\n", "🌉 THE SOLUTION (BRIDGING):\n", " 1. Extract from postings: 'Need PYTHON developers'\n", " 2. Enrich company profile with skills\n", " 3. Now both speak SKILLS LANGUAGE! ✅\n", "\n", "==========================================================================================\n" ] }, { "data": { "text/plain": [ "(Empty DataFrame\n", " Columns: [company_id, name, description, company_size, state, country, city, zip_code, address, url, industries_list, specialties_list, employee_count, follower_count, time_recorded, posted_job_titles, posted_descriptions, required_skills, experience_levels]\n", " Index: [],\n", " company_id name \\\n", " 0 1009 IBM \n", " 4 1016 GE HealthCare \n", " 14 1025 Hewlett Packard Enterprise \n", " 18 1028 Oracle \n", " 23 1033 Accenture \n", " ... ... ... \n", " 35782 103463217 JRC Services \n", " 35783 103466352 Centent Consulting LLC \n", " 35784 103467540 Kings and Queens Productions, LLC \n", " 35785 103468936 WebUnite \n", " 35786 103472979 BlackVe \n", " \n", " description company_size \\\n", " 0 At IBM, we do more than work. We create. We cr... 7.0 \n", " 4 Every day millions of people feel the impact o... 7.0 \n", " 14 Official LinkedIn of Hewlett Packard Enterpris... 7.0 \n", " 18 We’re a cloud technology company that provides... 7.0 \n", " 23 Accenture is a leading global professional ser... 7.0 \n", " ... ... ... \n", " 35782 2.0 \n", " 35783 Centent Consulting LLC is a reputable human re... \n", " 35784 We are a small but mighty collection of thinke... \n", " 35785 Our mission at WebUnite is to offer experience... \n", " 35786 1.0 \n", " \n", " state country city zip_code \\\n", " 0 NY US Armonk, New York 10504 \n", " 4 0 US Chicago 0 \n", " 14 Texas US Houston 77389 \n", " 18 Texas US Austin 78741 \n", " 23 0 IE Dublin 2 0 \n", " ... ... ... ... ... \n", " 35782 0 0 0 0 \n", " 35783 0 0 0 0 \n", " 35784 0 0 0 0 \n", " 35785 Pennsylvania US Southampton 18966 \n", " 35786 0 0 0 0 \n", " \n", " address \\\n", " 0 International Business Machines Corp. \n", " 4 - \n", " 14 1701 E Mossy Oaks Rd Spring \n", " 18 2300 Oracle Way \n", " 23 Grand Canal Harbour \n", " ... ... \n", " 35782 0 \n", " 35783 0 \n", " 35784 0 \n", " 35785 720 2nd Street Pike \n", " 35786 0 \n", " \n", " url \\\n", " 0 https://www.linkedin.com/company/ibm \n", " 4 https://www.linkedin.com/company/gehealthcare \n", " 14 https://www.linkedin.com/company/hewlett-packa... \n", " 18 https://www.linkedin.com/company/oracle \n", " 23 https://www.linkedin.com/company/accenture \n", " ... ... \n", " 35782 https://www.linkedin.com/company/jrcservices \n", " 35783 https://www.linkedin.com/company/centent-consu... \n", " 35784 https://www.linkedin.com/company/kings-and-que... \n", " 35785 https://www.linkedin.com/company/webunite \n", " 35786 https://www.linkedin.com/company/blackve \n", " \n", " industries_list \\\n", " 0 IT Services and IT Consulting \n", " 4 Hospitals and Health Care \n", " 14 IT Services and IT Consulting \n", " 18 IT Services and IT Consulting \n", " 23 Business Consulting and Services \n", " ... ... \n", " 35782 Facilities Services \n", " 35783 Business Consulting and Services \n", " 35784 Broadcast Media Production and Distribution \n", " 35785 Business Consulting and Services \n", " 35786 Defense and Space Manufacturing \n", " \n", " specialties_list employee_count \\\n", " 0 Cloud | Mobile | Cognitive | Security | Resear... 314102 \n", " 4 Healthcare | Biotechnology 56873 \n", " 14 79528 \n", " 18 enterprise | software | applications | databas... 192099 \n", " 23 Management Consulting | Systems Integration an... 574664 \n", " ... ... ... \n", " 35782 0 \n", " 35783 0 \n", " 35784 0 \n", " 35785 0 \n", " 35786 0 \n", " \n", " follower_count time_recorded posted_job_titles posted_descriptions \\\n", " 0 16253625 1712378162 \n", " 4 2185368 1712382540 \n", " 14 3586194 1712870106 \n", " 18 9465968 1712642952 \n", " 23 11864908 1712641699 \n", " ... ... ... ... ... \n", " 35782 21 1713552037 \n", " 35783 0 1713550651 \n", " 35784 12 1713554225 \n", " 35785 1 1713535939 \n", " 35786 0 1713539379 \n", " \n", " required_skills experience_levels \n", " 0 \n", " 4 \n", " 14 \n", " 18 \n", " 23 \n", " ... ... ... \n", " 35782 \n", " 35783 \n", " 35784 \n", " 35785 \n", " 35786 \n", " \n", " [24473 rows x 19 columns])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ============================================================================\n", "# 🌉 BRIDGING CONCEPT ANALYSIS\n", "# ============================================================================\n", "\n", "def show_bridging_concept_analysis():\n", " print(\"🌉 THE BRIDGING CONCEPT\")\n", " print(\"=\" * 90)\n", " \n", " companies_with = companies_full[companies_full['required_skills'] != '']\n", " companies_without = companies_full[companies_full['required_skills'] == '']\n", " \n", " print(f\"\\n📊 DATA REALITY:\")\n", " print(f\" Total companies: {len(companies_full):,}\")\n", " print(f\" WITH postings: {len(companies_with):,} ({len(companies_with)/len(companies_full)*100:.1f}%)\")\n", " print(f\" WITHOUT postings: {len(companies_without):,}\\n\")\n", " \n", " print(\"🎯 THE PROBLEM:\")\n", " print(\" Companies: 'We are in TECH INDUSTRY'\")\n", " print(\" Candidates: 'I know PYTHON, AWS'\")\n", " print(\" → Different languages! 🚫\\n\")\n", " \n", " print(\"🌉 THE SOLUTION (BRIDGING):\")\n", " print(\" 1. Extract from postings: 'Need PYTHON developers'\")\n", " print(\" 2. Enrich company profile with skills\")\n", " print(\" 3. Now both speak SKILLS LANGUAGE! ✅\\n\")\n", " \n", " print(\"=\" * 90)\n", " return companies_with, companies_without\n", "\n", "# Test\n", "show_bridging_concept_analysis()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 18: Export Results to CSV" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "💾 Exporting 50 candidates (top 5 each)...\n", "\n", " Processing 1/50...\n", "\n", "✅ Exported 250 matches\n", "📄 File: ../results/hrhub_matches.csv\n", "\n" ] } ], "source": [ "# ============================================================================\n", "# 💾 EXPORT MATCHES TO CSV\n", "# ============================================================================\n", "\n", "def export_matches_to_csv(num_candidates=100, top_k=10):\n", " print(f\"💾 Exporting {num_candidates} candidates (top {top_k} each)...\\n\")\n", " \n", " results = []\n", " \n", " for i in range(min(num_candidates, len(candidates))):\n", " if i % 50 == 0:\n", " print(f\" Processing {i+1}/{num_candidates}...\")\n", " \n", " matches = find_top_matches(i, top_k=top_k)\n", " cand = candidates.iloc[i]\n", " \n", " for rank, (comp_idx, score) in enumerate(matches, 1):\n", " if comp_idx >= len(companies_full):\n", " continue\n", " \n", " company = companies_full.iloc[comp_idx]\n", " \n", " results.append({\n", " 'candidate_id': i,\n", " 'candidate_category': cand.get('Category', 'N/A'),\n", " 'company_id': company.get('company_id', 'N/A'),\n", " 'company_name': company.get('name', 'N/A'),\n", " 'match_rank': rank,\n", " 'similarity_score': round(float(score), 4)\n", " })\n", " \n", " results_df = pd.DataFrame(results)\n", " output_file = f'{Config.RESULTS_PATH}hrhub_matches.csv'\n", " results_df.to_csv(output_file, index=False)\n", " \n", " print(f\"\\n✅ Exported {len(results_df):,} matches\")\n", " print(f\"📄 File: {output_file}\\n\")\n", " \n", " return results_df\n", "\n", "# Export sample\n", "matches_df = export_matches_to_csv(num_candidates=50, top_k=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Interactive Visualization 1: t-SNE Vector Space\n", "\n", "Project embeddings from ℝ³⁸⁴ → ℝ² to visualize candidates and companies" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🎨 VECTOR SPACE VISUALIZATION\n", "\n", "======================================================================\n", "📊 Visualizing:\n", " • 500 candidates\n", " • 2000 companies\n", " • From ℝ^384 → ℝ² (t-SNE)\n", "\n", "🔄 Running t-SNE (2-3 minutes)...\n", "\n", "✅ t-SNE complete!\n" ] } ], "source": [ "# ============================================================================\n", "# 🎨 T-SNE VECTOR SPACE VISUALIZATION\n", "# ============================================================================\n", "\n", "from sklearn.manifold import TSNE\n", "\n", "print(\"🎨 VECTOR SPACE VISUALIZATION\\n\")\n", "print(\"=\" * 70)\n", "\n", "# Sample for visualization\n", "n_cand_viz = min(500, len(candidates))\n", "n_comp_viz = min(2000, len(companies_full))\n", "\n", "print(f\"📊 Visualizing:\")\n", "print(f\" • {n_cand_viz} candidates\")\n", "print(f\" • {n_comp_viz} companies\")\n", "print(f\" • From ℝ^384 → ℝ² (t-SNE)\\n\")\n", "\n", "# Sample vectors\n", "cand_sample = cand_vectors[:n_cand_viz]\n", "comp_sample = comp_vectors[:n_comp_viz]\n", "all_vectors = np.vstack([cand_sample, comp_sample])\n", "\n", "print(\"🔄 Running t-SNE (2-3 minutes)...\")\n", "tsne = TSNE(\n", " n_components=2,\n", " perplexity=30,\n", " random_state=42,\n", " n_iter=1000\n", ")\n", "\n", "vectors_2d = tsne.fit_transform(all_vectors)\n", "cand_2d = vectors_2d[:n_cand_viz]\n", "comp_2d = vectors_2d[n_cand_viz:]\n", "\n", "print(\"\\n✅ t-SNE complete!\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hovertemplate": "%{text}", "marker": { "color": "#ff6b6b", "opacity": 0.6, "size": 6 }, "mode": "markers", "name": "Companies", "text": [ "Company: IBM", "Company: GE HealthCare", "Company: Hewlett Packard Enterprise", "Company: Oracle", "Company: Accenture", "Company: Microsoft", "Company: Deloitte", "Company: Siemens", "Company: PwC", "Company: AT&T", "Company: Intel Corporation", "Company: Ericsson", "Company: Cisco", "Company: Motorola Mobility (a Lenovo Co", "Company: JPMorgan Chase & Co.", "Company: Nokia", "Company: EY", "Company: KPMG US", "Company: NXP Semiconductors", "Company: Philips", "Company: Verizon", "Company: SAP", "Company: Procter & Gamble", "Company: Bank of America", "Company: Elite Technology", "Company: BT Group", "Company: Pfizer", "Company: Johnson & Johnson", "Company: UBS", "Company: US Army Corps of Engineers", "Company: Wells Fargo", "Company: Unilever", "Company: Sony", "Company: Sony Electronics", "Company: Sony Pictures Entertainment", "Company: Atos", "Company: Deutsche Bank", "Company: DWS Group", "Company: Chubb", "Company: Shell", "Company: American Express", "Company: Unisys", "Company: Infosys", "Company: Yahoo", "Company: The Walt Disney Company", "Company: Fidelity Investments", "Company: Wipro", "Company: LinkedIn", "Company: Air Force Research Laboratory", "Company: Honeywell", "Company: Tata Consultancy Services", "Company: National Security Agency", "Company: National Computer Systems", "Company: McKinsey & Company", "Company: Xerox", "Company: Fujitsu Network Communications", "Company: Goldman Sachs", "Company: Boeing", "Company: bp", "Company: T-Mobile", "Company: Nestlé", "Company: GSK", "Company: Thomson Reuters", "Company: Booz Allen Hamilton", "Company: Novartis", "Company: Northrop Grumman", "Company: CGI", "Company: Capital One", "Company: Barclays", "Company: PepsiCo", "Company: Google", "Company: Electronic Arts (EA)", "Company: SUSE", "Company: ADP", "Company: CDK Global", "Company: Teradata", "Company: SLB", "Company: General Motors", "Company: Ally", "Company: Adobe", "Company: eBay", "Company: PayPal", "Company: Ford Motor Company", "Company: Merck", "Company: SAS", "Company: Avaya", "Company: AMD", "Company: MIT Lincoln Laboratory", "Company: Raytheon", "Company: BNP Paribas", "Company: Mondelēz International", "Company: Eastman Kodak Company", "Company: Carestream", "Company: UPS", "Company: Agilent Technologies", "Company: The Home Depot", "Company: Amdocs", "Company: Mars", "Company: Kaiser Permanente", "Company: Amazon", "Company: BMC Software", "Company: Roche", "Company: AstraZeneca", "Company: Abbott", "Company: SAIC", "Company: Dignity Health", "Company: Owens & Minor", "Company: Stanford Children's Health | L", "Company: Boston Scientific", "Company: Sanofi", "Company: Harvard Medical School", "Company: Harvard University", "Company: Harvard Law School", "Company: Dana-Farber Cancer Institute", "Company: Boston Children's Hospital", "Company: Beth Israel Deaconess Medical ", "Company: L'Oréal", "Company: Eli Lilly and Company", "Company: Intuit", "Company: FedEx Ground", "Company: FedEx Services", "Company: Ogilvy", "Company: Gap Inc.", "Company: Banana Republic", "Company: Cognizant", "Company: Robert Half", "Company: ExxonMobil", "Company: Societe Generale", "Company: The Coca-Cola Company", "Company: Comcast", "Company: Nielsen", "Company: HCLTech", "Company: AIG", "Company: BBC", "Company: State Street", "Company: Bristol Myers Squibb", "Company: Boston Consulting Group (BCG)", "Company: SLAC National Accelerator Labo", "Company: Stanford University School of ", "Company: Stanford University", "Company: ManpowerGroup", "Company: RBC", "Company: TotalEnergies", "Company: NBC News", "Company: NBCUniversal", "Company: CNBC", "Company: Allstate", "Company: Medtronic", "Company: Prudential Financial", "Company: Charles Schwab", "Company: 3M", "Company: Capco Energy Solutions", "Company: Marsh", "Company: Autodesk", "Company: BAE Systems, Inc.", "Company: Nickelodeon", "Company: Bayer", "Company: McKesson", "Company: General Dynamics Information T", "Company: General Dynamics Land Systems", "Company: General Dynamics Mission Syste", "Company: Philip Morris International", "Company: McCann Worldgroup", "Company: MRM", "Company: UM Worldwide", "Company: The Adecco Group", "Company: PTC", "Company: Thales", "Company: Sogeti", "Company: Rabobank", "Company: Mavenir", "Company: NASA - National Aeronautics an", "Company: Qualcomm", "Company: Applied Materials", "Company: Western Union", "Company: Nike", "Company: Spectrum Enterprise", "Company: Coldwell Banker Realty", "Company: Aon", "Company: CNN", "Company: TE Connectivity", "Company: Amgen", "Company: Gartner", "Company: Volvo Group", "Company: Volvo Penta", "Company: Volvo Buses", "Company: Mack Trucks", "Company: Volvo Construction Equipment", "Company: NetApp", "Company: Toyota North America", "Company: Bain & Company", "Company: Avis Budget Group", "Company: Best Buy", "Company: Pearson", "Company: Infineon Technologies", "Company: TEKsystems", "Company: Allegis Group", "Company: DuPont", "Company: Cadence Design Systems", "Company: Cardinal Health", "Company: Department for Transport (DfT)", "Company: Visa", "Company: Chevron", "Company: Canon Solutions America", "Company: Bosch Security and Safety Syst", "Company: LexisNexis", "Company: MetLife", "Company: Halliburton", "Company: KBR, Inc.", "Company: Keller Williams Realty, Inc.", "Company: Novo Nordisk", "Company: Hanesbrands Inc.", "Company: Danone", "Company: Juniper Networks", "Company: Johnson Controls", "Company: Victoria’s Secret & Co.", "Company: Bath & Body Works", "Company: Spherion", "Company: Starbucks", "Company: Delta Air Lines", "Company: Genentech", "Company: Flex", "Company: The Wall Street Journal", "Company: Dow Jones", "Company: Macy's", "Company: Insight", "Company: Kelly", "Company: Marriott International", "Company: CBRE", "Company: Randstad", "Company: Schneider Electric", "Company: Nationwide", "Company: Baxter International Inc.", "Company: United Airlines", "Company: State Farm", "Company: Dun & Bradstreet", "Company: Mercer", "Company: Pratt & Whitney", "Company: Carrier HVAC", "Company: Grant Thornton LLP (US)", "Company: Alstom", "Company: Northwestern Mutual", "Company: Hilton", "Company: Oliver Wyman", "Company: Synopsys Inc", "Company: Zurich North America", "Company: Digitas North America", "Company: The Hartford", "Company: UCLA Health", "Company: Children's Hospital Los Angele", "Company: UCLA", "Company: Wolters Kluwer", "Company: Cigna Healthcare", "Company: Bloomberg", "Company: Diageo", "Company: Rockwell Automation", "Company: Michigan Medicine", "Company: University of Michigan", "Company: U.S. Bank", "Company: Experian", "Company: iHeartMedia", "Company: Clear Channel Outdoor", "Company: Whirlpool Corporation", "Company: Dow", "Company: Ingram Micro", "Company: Crédit Agricole CIB", "Company: University of Washington", "Company: Momentum Worldwide", "Company: Eaton", "Company: Tetra Pak", "Company: Panasonic Automotive North Ame", "Company: Panasonic North America", "Company: Panasonic Avionics Corporation", "Company: Caterpillar Inc.", "Company: Columbia University Irving Med", "Company: Columbia University", "Company: BASF", "Company: American Airlines", "Company: Citrix", "Company: Walmart", "Company: University of Illinois Chicago", "Company: University of Illinois Urbana-", "Company: Caltrans", "Company: County of San Diego", "Company: CalPERS", "Company: California Department of Justi", "Company: Valeo", "Company: McDonald's", "Company: Cargill", "Company: John Hancock", "Company: Manulife", "Company: Liberty Mutual Insurance", "Company: OpenText", "Company: KLA", "Company: BOMBARDIER", "Company: RR Donnelley", "Company: Acxiom", "Company: IKEA", "Company: Colgate-Palmolive", "Company: Expedia Group", "Company: Emerson", "Company: TD", "Company: Andersen Corporation", "Company: Federal Reserve Board", "Company: Federal Reserve Bank of San Fr", "Company: Federal Reserve Bank of Boston", "Company: Sage", "Company: Publicis", "Company: General Mills", "Company: BlackBerry", "Company: Mary Kay Global", "Company: University of California, Sant", "Company: University of California, Davi", "Company: UC Davis Health", "Company: Commonwealth Bank", "Company: BDO USA", "Company: Visteon Corporation", "Company: Seagate Technology", "Company: Canon Business Process Service", "Company: ITT Inc.", "Company: Aerotek", "Company: Brigham and Women's Hospital", "Company: Massachusetts General Hospital", "Company: Newton-Wellesley Hospital", "Company: NYC Department of Education", "Company: Albertsons Companies", "Company: Shaw's Supermarkets", "Company: Acme Markets", "Company: The Save Mart Companies", "Company: Teradyne", "Company: S&P Global", "Company: Teacher Retirement System of T", "Company: Texas Health and Human Service", "Company: Texas Workforce Commission", "Company: Texas Attorney General", "Company: Allianz Life", "Company: Lexmark", "Company: Saint-Gobain", "Company: CSAA Insurance Group, a AAA In", "Company: CertainTeed", "Company: VMware", "Company: Transportation Security Admini", "Company: FEMA", "Company: U.S. Customs and Border Protec", "Company: Universal Music Group", "Company: Fifth Third Bank", "Company: Mastercard", "Company: Staples", "Company: Elsevier", "Company: University of California, San ", "Company: UCSF Health", "Company: Ameriprise Financial Services,", "Company: Sony Music Entertainment", "Company: Alcoa", "Company: University of Phoenix", "Company: Accor", "Company: Tech Mahindra", "Company: Broadcom", "Company: Kforce Inc", "Company: Thermo Fisher Scientific", "Company: University of Southern Califor", "Company: Travelers", "Company: Check Point Software Technolog", "Company: Reckitt", "Company: U.S. Department of State", "Company: BD", "Company: Office Depot", "Company: Lionbridge", "Company: Edwards Vacuum", "Company: FIS", "Company: The HEINEKEN Company", "Company: Hyatt Regency", "Company: Levi Strauss & Co.", "Company: Scotiabank", "Company: Freddie Mac", "Company: Stop & Shop", "Company: Software Engineering Institute", "Company: NYU Stern School of Business", "Company: The University of Texas at Aus", "Company: Penn Medicine, University of P", "Company: University of Pennsylvania", "Company: The Ohio State University Wexn", "Company: The Ohio State University", "Company: Ohio Department of Education a", "Company: Ingersoll Rand", "Company: JLL", "Company: University of Minnesota", "Company: Salesforce", "Company: Mallinckrodt Pharmaceuticals", "Company: Northwestern University", "Company: Mattel, Inc.", "Company: AkzoNobel", "Company: Agfa", "Company: Boehringer Ingelheim", "Company: Farmers Insurance", "Company: International Paper", "Company: CNA Insurance", "Company: KeyBank", "Company: Aegon", "Company: Danfoss", "Company: Progressive Insurance", "Company: DHL Supply Chain", "Company: Stryker", "Company: Physio", "Company: Bechtel Corporation", "Company: Ricoh USA, Inc.", "Company: Avery Dennison", "Company: Cox Communications", "Company: CDW", "Company: Textron", "Company: Textron Systems", "Company: Kaplan", "Company: Fiserv", "Company: Nordstrom", "Company: UC San Diego", "Company: UC San Diego Health", "Company: IDC", "Company: Celestica", "Company: FICO", "Company: Sodexo", "Company: Pizza Hut", "Company: Taco Bell", "Company: Yum! Brands", "Company: Georgia-Pacific LLC", "Company: New York Life Insurance Compan", "Company: Kimberly-Clark", "Company: Peace Corps", "Company: Analog Devices", "Company: UPMC", "Company: UPMC Health Plan", "Company: Electrolux Group", "Company: Holcim", "Company: Michael Page", "Company: Hays", "Company: IDEMIA", "Company: Conagra Brands", "Company: Progress", "Company: Safeway", "Company: Weill Cornell Medicine", "Company: Cornell University", "Company: Johns Hopkins Hospital", "Company: The Johns Hopkins University", "Company: Continental", "Company: Edelman", "Company: Macquarie Group", "Company: Red Hat", "Company: IHG Hotels & Resorts", "Company: Boston University", "Company: Georgia Tech Research Institut", "Company: Georgia Institute of Technolog", "Company: Hughes", "Company: Arrow Electronics", "Company: Computacenter", "Company: Mphasis", "Company: The Princeton Group", "Company: Walgreens", "Company: ESPN", "Company: NVIDIA", "Company: Cummins Inc.", "Company: HCA Healthcare", "Company: HCA Healthcare Physician Servi", "Company: MassMutual", "Company: Compucom", "Company: University of Maryland", "Company: Lenovo", "Company: Penn State University", "Company: Penn State Health", "Company: H&R Block", "Company: CACI International Inc", "Company: Franklin Templeton", "Company: Edward Jones", "Company: Corning Incorporated", "Company: Fluor Corporation", "Company: Mastech Digital", "Company: JCPenney", "Company: Micron Technology", "Company: United States Postal Service", "Company: Equifax", "Company: Lear Corporation", "Company: The Reynolds and Reynolds Comp", "Company: the LEGO Group", "Company: ArcelorMittal", "Company: Korn Ferry", "Company: RSM US LLP", "Company: ZF Group", "Company: adidas", "Company: University of North Carolina a", "Company: Discover Financial Services", "Company: GroupM", "Company: University of Colorado", "Company: University of Colorado Boulder", "Company: Marvell Technology", "Company: Epsilon", "Company: Iron Mountain", "Company: John Deere", "Company: AllianceBernstein", "Company: Air Liquide", "Company: Northern Trust", "Company: Swiss Re", "Company: MITRE", "Company: DS Smith", "Company: Informatica", "Company: WebMD", "Company: Grainger", "Company: FedEx Office", "Company: Rolls-Royce", "Company: University of Chicago", "Company: Emory Healthcare", "Company: Emory University", "Company: ASML", "Company: Pacific Gas and Electric Compa", "Company: Framatome", "Company: The Goodyear Tire & Rubber Com", "Company: U.S. House of Representatives", "Company: Akamai Technologies", "Company: Hillsborough County Public Sch", "Company: Clifford Chance", "Company: Baker McKenzie", "Company: Ciena", "Company: Biogen", "Company: Heidrick & Struggles", "Company: Houghton Mifflin Harcourt", "Company: WTW", "Company: Aflac", "Company: Syngenta", "Company: American Cancer Society", "Company: Capital Group", "Company: Jacobs", "Company: Bose Corporation", "Company: FMC Corporation", "Company: TIAA", "Company: Invesco US", "Company: IQVIA", "Company: The Estée Lauder Companies Inc", "Company: Cushman & Wakefield", "Company: Faurecia", "Company: Duke Energy Corporation", "Company: Yale School of Medicine", "Company: Sun Life", "Company: DreamWorks Animation", "Company: Tata Communications", "Company: American Honda Motor Company, ", "Company: University of Wisconsin-Madiso", "Company: Starcom", "Company: Michelin", "Company: Solvay", "Company: Pottery Barn", "Company: Williams-Sonoma, Inc.", "Company: Forrester", "Company: SGS", "Company: Lowe's Companies, Inc.", "Company: Pirelli", "Company: Air Products", "Company: CareerBuilder", "Company: PNC", "Company: Norsk Hydro", "Company: Gannett | USA TODAY NETWORK", "Company: Raymond James", "Company: Embraer", "Company: Ohio Department of Transportat", "Company: Ohio Department of Health", "Company: TTEC", "Company: Regions Bank", "Company: EMD Serono, Inc.", "Company: Paychex", "Company: CAE", "Company: Humana", "Company: Rutgers University", "Company: Vestas", "Company: UF Health Jacksonville", "Company: Arizona State University", "Company: AMC Networks", "Company: DISH Network", "Company: UVA Health", "Company: University of Virginia", "Company: Lincoln Financial Group", "Company: TransUnion", "Company: Logitech", "Company: Baker Hughes", "Company: Skanska", "Company: FleishmanHillard", "Company: GfK - An NIQ Company", "Company: Sanmina", "Company: Manhattan Associates", "Company: Weber Shandwick", "Company: Coloplast", "Company: Assurant", "Company: Principal Financial Group", "Company: Cemex", "Company: DNV", "Company: Paramount Pictures", "Company: Primerica", "Company: Barnes & Noble, Inc.", "Company: UCI Health", "Company: DLA Piper", "Company: Aquent", "Company: Nomura", "Company: Aspen Technology", "Company: Parexel", "Company: Ryder System, Inc.", "Company: Diebold Nixdorf", "Company: Weyerhaeuser", "Company: USAA", "Company: Scholastic", "Company: Anheuser-Busch", "Company: UMass Chan Medical School", "Company: Campbell's", "Company: Hearst Magazines", "Company: Hearst", "Company: Houston Methodist", "Company: Nous Infosystems", "Company: Kuehne+Nagel", "Company: National Football League (NFL)", "Company: San Francisco 49ers", "Company: Indianapolis Colts", "Company: Texas A&M University", "Company: PerkinElmer", "Company: Vanderbilt University Medical ", "Company: Vanderbilt University", "Company: Lundbeck", "Company: Parker Aerospace", "Company: Parker Hannifin", "Company: SKF Group", "Company: Western Digital", "Company: Southwest Airlines", "Company: Allen & Overy", "Company: Washington University in St. L", "Company: Massachusetts Department of Pu", "Company: Epicor", "Company: CNH Industrial", "Company: The George Washington Universi", "Company: American Family Insurance", "Company: FDA", "Company: Birlasoft", "Company: The North Face", "Company: Nautica", "Company: VF Corporation", "Company: Exelon", "Company: CVS Health", "Company: Takeda Oncology", "Company: Ralph Lauren", "Company: Spirent Communications", "Company: Brown Brothers Harriman", "Company: The Church of Jesus Christ of ", "Company: Ecolab", "Company: Pacific Northwest National Lab", "Company: UL Solutions", "Company: Mayo Clinic", "Company: Quest Diagnostics", "Company: NICE", "Company: UScellular", "Company: Social Security Administration", "Company: Lazard", "Company: BlackRock", "Company: Deluxe", "Company: Freshfields Bruckhaus Deringer", "Company: IFC - International Finance Co", "Company: Apex Systems", "Company: Smith+Nephew", "Company: Hallmark Cards", "Company: Atlas Copco", "Company: North Carolina State Universit", "Company: DB Schenker", "Company: SEI", "Company: JTI (Japan Tobacco Internation", "Company: Konica Minolta Business Soluti", "Company: U.S. Department of Commerce", "Company: F5", "Company: Jabil", "Company: EF Education First", "Company: PPG", "Company: Skadden, Arps, Slate, Meagher ", "Company: Harvard Business School", "Company: UNICEF", "Company: Pulte Mortgage", "Company: PulteGroup", "Company: University of Utah Health", "Company: Blue Shield of California", "Company: Parsons Corporation", "Company: Specialty Equipment Market Ass", "Company: Kroger", "Company: Metso", "Company: White & Case LLP", "Company: Internal Revenue Service", "Company: Otis Elevator Co.", "Company: Latham & Watkins", "Company: Hasbro", "Company: Reebok", "Company: Porter Novelli", "Company: Bankers Trust", "Company: AMERICAN EAGLE OUTFITTERS INC.", "Company: EPAM Systems", "Company: Temple Health – Temple Univers", "Company: Phoenix Technologies", "Company: Lawrence Livermore National La", "Company: Cartier", "Company: CNO Financial Group", "Company: Bankers Life", "Company: University of Rochester Medica", "Company: University of Rochester", "Company: News Corp", "Company: Persistent Systems", "Company: Federal Aviation Administratio", "Company: USAID", "Company: Cintas", "Company: KONE", "Company: Alfa Laval", "Company: Sophos", "Company: Ketchum", "Company: Intelsat", "Company: CHEP", "Company: Dana Incorporated", "Company: Southern Company", "Company: Jones Day", "Company: Ticketmaster", "Company: aramco", "Company: Lam Research", "Company: Acer", "Company: Navistar Inc", "Company: Constellation", "Company: The TJX Companies, Inc.", "Company: Nasdaq", "Company: Anritsu", "Company: Virtusa", "Company: IGT", "Company: Vestcom", "Company: Jefferies", "Company: Trimble Inc.", "Company: Morningstar", "Company: Los Angeles Times", "Company: Sandvik", "Company: Sandvik Coromant", "Company: Bausch + Lomb", "Company: Ascensus", "Company: GRUNDFOS", "Company: L.E.K. Consulting", "Company: Teleperformance", "Company: Nalco Water, An Ecolab Company", "Company: Colliers", "Company: Rackspace Technology", "Company: LHH", "Company: ZS", "Company: HCLTech - SAP Practice", "Company: DSV - Global Transport and Log", "Company: McMaster-Carr", "Company: SRI", "Company: Northeastern University", "Company: Alcon", "Company: Rent.", "Company: LPL Financial", "Company: Luxoft", "Company: Esri", "Company: Owens Corning", "Company: Tenet Healthcare", "Company: MFS Investment Management", "Company: ALTEN", "Company: Los Alamos National Laboratory", "Company: H&M", "Company: Blizzard Entertainment", "Company: Sysco", "Company: Softtek", "Company: Connection", "Company: GSA", "Company: G4S", "Company: UC Santa Barbara", "Company: VELUX", "Company: Sandia National Laboratories", "Company: The Hanover Insurance Group", "Company: Abercrombie & Fitch Co.", "Company: University of Missouri Health ", "Company: University of Missouri-Columbi", "Company: Hess Corporation", "Company: ManTech", "Company: Ashland", "Company: Capco", "Company: GALLO", "Company: Ferrero", "Company: Takeda", "Company: Mercatus Center at George Maso", "Company: George Mason University", "Company: CME Group", "Company: Consilio LLC", "Company: Crowe", "Company: Morrison Foerster", "Company: FTI Consulting", "Company: Concurrent Technologies Corpor", "Company: Southern Methodist University", "Company: KPIT", "Company: Westfield Insurance", "Company: Premera Blue Cross", "Company: ADM", "Company: The Standard", "Company: Plexus Corp.", "Company: Allied Telesis", "Company: Group Lotus", "Company: Nintendo", "Company: Forbes", "Company: USANA Health Sciences", "Company: Mercury Systems", "Company: Capella University", "Company: Greenberg Traurig, LLP", "Company: Cirrus Logic", "Company: Coach", "Company: Herbalife", "Company: McClatchy", "Company: Varian", "Company: Memorial Sloan Kettering Cance", "Company: Huntsman Corporation", "Company: Cleveland Clinic", "Company: Dominion Energy", "Company: LyondellBasell", "Company: Kohler Co.", "Company: Cooper University Health Care", "Company: CJ", "Company: Netia", "Company: U.S. Department of Labor", "Company: ACCO Brands", "Company: Santander Bank, N.A.", "Company: Sasol", "Company: University of Denver", "Company: Ball Corporation", "Company: Kirkland & Ellis", "Company: Morgan, Lewis & Bockius LLP", "Company: ICF", "Company: Kohl's", "Company: CPS, Inc.", "Company: Huron", "Company: Penske Logistics", "Company: Penske Truck Leasing", "Company: SPX Cooling Tech, LLC", "Company: Viasat", "Company: Turner Construction Company", "Company: Univision", "Company: Louis Vuitton", "Company: Kerry", "Company: Cobham Satcom", "Company: Gensler", "Company: Moss Adams", "Company: RTI International", "Company: Tommy Hilfiger", "Company: Hogan Lovells", "Company: Fairfax County Public Schools", "Company: ICON plc", "Company: Orrick, Herrington & Sutcliffe", "Company: Omron Automation", "Company: Arcadis", "Company: Johns Manville", "Company: Tennessee Valley Authority", "Company: Valassis Marketing Solutions", "Company: Federal Highway Administration", "Company: U.S. Department of Transportat", "Company: IFF", "Company: Smithsonian Enterprises", "Company: MKS Instruments", "Company: Motion Recruitment", "Company: TDS Telecommunications LLC", "Company: Cubic Corporation", "Company: National Grid", "Company: O'Melveny & Myers LLP", "Company: University of Nebraska Foundat", "Company: University of Nebraska-Lincoln", "Company: Flowserve Corporation", "Company: Quadrangle", "Company: Autoliv", "Company: Boston Public Schools", "Company: Armstrong World Industries", "Company: Chr. Hansen", "Company: FM Global", "Company: Fresenius Medical Care North A", "Company: Union Pacific Railroad", "Company: W. L. Gore & Associates", "Company: University of Kentucky", "Company: Cooley LLP", "Company: Michaels Stores", "Company: Yoh, A Day & Zimmermann Compan", "Company: Mayer Brown", "Company: Choice Hotels International", "Company: Rensselaer Polytechnic Institu", "Company: Advantage Technical", "Company: CBIZ", "Company: Lands'​ End", "Company: AppleOne Employment Services", "Company: UNSW", "Company: NYU Langone Health", "Company: Atlanticus", "Company: NetSuite", "Company: Agilysys", "Company: County of Santa Clara", "Company: Icahn School of Medicine at Mo", "Company: Match", "Company: 7-Eleven", "Company: Zions Bancorporation", "Company: Schindler Group", "Company: Schindler Elevator Corporation", "Company: Brunswick Corporation", "Company: ePlus inc.", "Company: Brady Corporation", "Company: FUJIFILM Holdings America Corp", "Company: Fresche Solutions", "Company: AMS", "Company: Thrivent", "Company: Schwan's Company", "Company: Baylor Scott & White Health", "Company: The Herbert Wertheim UF Scripp", "Company: CSX", "Company: Crain Communications", "Company: Oklahoma State University", "Company: Infogain", "Company: QuinStreet", "Company: Landis+Gyr", "Company: Safety-Kleen", "Company: Paul Hastings", "Company: Reed Smith LLP", "Company: Sutherland", "Company: Marcus & Millichap", "Company: Georgia State University", "Company: National Institute of Standard", "Company: NewYork-Presbyterian Hospital", "Company: Dräger", "Company: Tata Technologies", "Company: Russell Investments", "Company: MSCI Inc.", "Company: Axis Communications", "Company: Federal Bureau of Investigatio", "Company: Oregon Department of Transport", "Company: Altria", "Company: HARMAN International", "Company: Kofax", "Company: Zimmer Biomet", "Company: ERM", "Company: Fortinet", "Company: Loyola Medicine", "Company: Loyola University Chicago", "Company: Microchip Technology Inc.", "Company: Greyhound Lines, Inc.", "Company: DaVita Kidney Care", "Company: Tetra Tech", "Company: 24 Hour Fitness", "Company: UT Southwestern Medical Center", "Company: Airlines Reporting Corporation", "Company: Select Medical", "Company: Boston Globe Media", "Company: Ansys", "Company: Connexity, Inc. ", "Company: Gallagher", "Company: SoftServe", "Company: Sappi", "Company: UMB Bank", "Company: Advocate Health Care", "Company: Shure Incorporated", "Company: Gucci", "Company: MSA - The Safety Company", "Company: Norfolk Southern", "Company: Live Nation Entertainment", "Company: dunnhumby", "Company: AMERICAN SYSTEMS", "Company: HOK", "Company: Gibson Dunn ", "Company: Marathon Oil Corporation", "Company: Pro Staff", "Company: Eisai US", "Company: Worley", "Company: Hollister Incorporated", "Company: Rockstar Games", "Company: ClubCorp", "Company: CAS", "Company: Enbridge", "Company: Pall Corporation", "Company: MSNBC", "Company: J.Crew", "Company: WVU Medicine", "Company: Philadelphia Housing Authority", "Company: Austin Independent School Dist", "Company: Incyte", "Company: Premier Inc.", "Company: B. Braun Medical Inc. (US)", "Company: MultiPlan", "Company: Sirva", "Company: Tulane University", "Company: SEPHORA", "Company: Southern Glazer's Wine & Spiri", "Company: Bitdefender", "Company: Milliken & Company", "Company: State of Indiana", "Company: Highmark Inc.", "Company: AEG", "Company: Devon Energy", "Company: Dice", "Company: Simpson Thacher & Bartlett LLP", "Company: Marriott Vacations Worldwide", "Company: Vertex Pharmaceuticals", "Company: Align Technology", "Company: Hennepin County", "Company: American Residential Services", "Company: Delta Dental Ins.", "Company: American Institutes for Resear", "Company: BJC HealthCare", "Company: Florida International Universi", "Company: RITE AID", "Company: The Depository Trust & Clearin", "Company: Strategic Staffing Solutions", "Company: Akin Gump Strauss Hauer & Feld", "Company: Holland & Knight LLP", "Company: Hibu", "Company: InterSystems", "Company: Benchmark", "Company: Jack Henry", "Company: Federal Deposit Insurance Corp", "Company: Carnival Corporation", "Company: Intertek", "Company: Baird", "Company: Indotronix International Corpo", "Company: International SOS", "Company: Columbia Sportswear Company", "Company: CoStar Group", "Company: Ross Stores, Inc.", "Company: IEEE", "Company: Response Companies", "Company: Rohde & Schwarz", "Company: Mercy", "Company: State of Tennessee", "Company: Ruder Finn", "Company: Meijer", "Company: American Medical Association", "Company: Auburn University", "Company: RS", "Company: SGK", "Company: Tag", "Company: Spectrum Brands, Inc", "Company: Nature Portfolio", "Company: NRG Energy", "Company: American Bar Association", "Company: NYS Department of Transportati", "Company: The University of Texas at San", "Company: Fred Hutch", "Company: PDS Tech Commercial, Inc.", "Company: Plastic Omnium", "Company: Gates Corporation", "Company: Acuity Brands", "Company: CEI", "Company: Bekaert", "Company: Norton Rose Fulbright", "Company: Jostens", "Company: CHS Inc.", "Company: Publix Super Markets", "Company: The Johns Hopkins University A", "Company: Mott MacDonald", "Company: University of New Hampshire", "Company: Ultimate Staffing", "Company: Brown-Forman", "Company: Planview", "Company: Sonoco", "Company: Academy of Art University", "Company: Sunrise Senior Living", "Company: Essendant", "Company: Mizuho", "Company: TC Transcontinental", "Company: Fordham University", "Company: Linedata", "Company: Orica", "Company: Huxley", "Company: Blue Cross Blue Shield of Mich", "Company: Comscore, Inc.", "Company: Domino's", "Company: The Leukemia & Lymphoma Societ", "Company: Crane Aerospace & Electronics", "Company: The Carlyle Group", "Company: CSL", "Company: TEAM LEWIS", "Company: Xcel Energy", "Company: TC Energy", "Company: AutoZone", "Company: Boston Medical Center (BMC)", "Company: NETGEAR", "Company: Woodward, Inc.", "Company: UHY LLP, Certified Public Acco", "Company: Brown & Brown Insurance", "Company: Vishay Intertechnology, Inc.", "Company: Priceline", "Company: Davis Polk & Wardwell LLP", "Company: Dillard's Inc.", "Company: Lonza", "Company: FirstEnergy", "Company: GM Financial", "Company: Oakley", "Company: D.R. Horton", "Company: RUSH University Medical Center", "Company: Barry Callebaut Group", "Company: Bulgari", "Company: Cedars-Sinai", "Company: Illumina", "Company: Inova Health", "Company: Maryland State Highway Adminis", "Company: Horizon Blue Cross Blue Shield", "Company: Lockton", "Company: Nexans", "Company: ECCO", "Company: Itron, Inc.", "Company: Newsweek", "Company: Sam's Club", "Company: Corestaff Services", "Company: McDermott International, Ltd", "Company: Lennox", "Company: Aurora Health Care", "Company: Daiichi Sankyo US", "Company: St. Jude Children's Research H", "Company: State of North Carolina", "Company: The Timken Company", "Company: University of Louisville", "Company: Johnson Matthey", "Company: Vistage Worldwide, Inc.", "Company: Cirque du Soleil Entertainment", "Company: Habitat for Humanity Internati", "Company: SS&C Technologies", "Company: Zones, LLC", "Company: Scientific Research Corporatio", "Company: University of California, Rive", "Company: National General", "Company: Emmis Corporation", "Company: GEODIS", "Company: Presidio", "Company: University of Arkansas", "Company: EBSCO Information Services", "Company: NVR, Inc.", "Company: AlixPartners", "Company: DICK'S Sporting Goods", "Company: Petco", "Company: Riverbed Technology", "Company: Nelson Connects", "Company: Space Dynamics Laboratory", "Company: Stevens Institute of Technolog", "Company: Blackstone", "Company: University of Maryland Baltimo", "Company: OUTFRONT Media", "Company: STERIS", "Company: Model N", "Company: TRC Companies, Inc.", "Company: BorgWarner", "Company: Proskauer Rose LLP", "Company: International Rescue Committee", "Company: Land O'Lakes, Inc.", "Company: Merkle", "Company: Texas Health Resources", "Company: The Children's Place", "Company: Popular Bank", "Company: IDEXX", "Company: PIMCO", "Company: Sword Group", "Company: Entrust", "Company: Exelixis", "Company: GHX", "Company: The Lubrizol Corporation", "Company: Milliman", "Company: State of Missouri", "Company: DAT Freight & Analytics", "Company: Mount Sinai Health System", "Company: Life Time Inc.", "Company: Culver Careers (CulverCareers.", "Company: GES - Global Experience Specia", "Company: Guy Carpenter", "Company: Mintz", "Company: AMETEK", "Company: Littler", "Company: Subway", "Company: Acosta", "Company: American Tower", "Company: Bentley University", "Company: Church & Dwight Co., Inc.", "Company: Deutsche Bahn", "Company: The Judge Group", "Company: Unit4", "Company: Huber Engineered Materials", "Company: Globant", "Company: Orkin", "Company: Master Electronics", "Company: Staffmark", "Company: Cartus", "Company: Quad", "Company: James Hardie", "Company: tms", "Company: Transocean", "Company: Dollar General", "Company: Callaway Golf", "Company: Equinix", "Company: Pactiv Evergreen Inc.", "Company: Procom", "Company: Fish & Richardson P.C.", "Company: New Balance", "Company: O-I", "Company: QIAGEN", "Company: Urban Outfitters", "Company: Anthropologie", "Company: Leonardo DRS", "Company: Talbots", "Company: ATR International", "Company: Banner Health", "Company: Charles River Laboratories", "Company: Husky Technologies", "Company: Altair", "Company: Sumitomo Mitsui Banking Corpor", "Company: University of Alaska Fairbanks", "Company: Alston & Bird", "Company: Munich Re", "Company: Dyson", "Company: The Guitar Center Company", "Company: MoneyGram International", "Company: Douglas Elliman Real Estate", "Company: Teleflex", "Company: Levi, Ray & Shoup, Inc. (LRS)", "Company: JSI", "Company: Municipality of Anchorage", "Company: OhioHealth", "Company: BJ's Wholesale Club", "Company: The Toro Company", "Company: CEVA Logistics", "Company: GKN Automotive", "Company: Bowling Green State University", "Company: CITGO", "Company: COUNTRY Financial®", "Company: Flagstar Bank", "Company: National Car Rental", "Company: Alamo Rent A Car", "Company: Boral", "Company: Molson Coors Beverage Company", "Company: Syniverse", "Company: YASH Technologies", "Company: Calix", "Company: Mandarin Oriental Hotel Group", "Company: Ipsen", "Company: Entegris", "Company: Lectra", "Company: Lionsgate", "Company: University of Rhode Island", "Company: Federated Hermes", "Company: Lifespan", "Company: Qualys", "Company: Briggs & Stratton", "Company: California State University, F", "Company: Gulfstream Aerospace", "Company: Colonial Life", "Company: Huhtamaki", "Company: SWAROVSKI", "Company: Brother USA", "Company: National MS Society", "Company: Tate & Lyle", "Company: Kemper", "Company: University of the Pacific", "Company: Fermilab", "Company: Univar Solutions", "Company: Duane Morris LLP", "Company: The Port Authority of New York", "Company: Associated Bank", "Company: Konami Digital Entertainment", "Company: Infoblox", "Company: Penn Mutual", "Company: University of Vermont", "Company: athenahealth", "Company: Info-Tech Research Group", "Company: Sectra", "Company: City of Fort Worth", "Company: Bill & Melinda Gates Foundatio", "Company: City of Atlanta", "Company: designory", "Company: The Bolton Group", "Company: Digitas Health", "Company: TruTeam", "Company: Prologis", "Company: Plante Moran", "Company: UChicago Medicine", "Company: Cboe Global Markets", "Company: City and County of Denver", "Company: GP Strategies Corporation", "Company: Ghirardelli Chocolate Company", "Company: State of Iowa - Executive Bran", "Company: Des Moines Public Schools", "Company: ARA", "Company: The Rockefeller University", "Company: TSMC", "Company: Imerys", "Company: National Hockey League (NHL)", "Company: Polaris Inc.", "Company: California State University, L", "Company: FORVIA HELLA", "Company: Western & Southern Financial G", "Company: Echo Global Logistics", "Company: Greenspun Media Group", "Company: Consumer Reports", "Company: Henry Ford Health", "Company: Premier Health Partners", "Company: The Mount Sinai Hospital", "Company: SHI International Corp.", "Company: Newmark", "Company: Nuveen, a TIAA company", "Company: Macmillan", "Company: Clark County School District", "Company: U.S. Chamber of Commerce", "Company: Nilfisk", "Company: Proforma", "Company: Belden Inc.", "Company: Southwest Research Institute", "Company: FlightSafety International", "Company: Laerdal Medical", "Company: Airgas", "Company: Florida Atlantic University", "Company: World Wide Technology", "Company: Covestro", "Company: Shaw Industries", "Company: Brenntag", "Company: Advantage Solutions", "Company: Universal Technical Institute,", "Company: Porsche Cars North America", "Company: TÜV Rheinland North America", "Company: University of Missouri-Kansas ", "Company: H.B. Fuller", "Company: SES Satellites", "Company: GAF", "Company: The University of Southern Mis", "Company: Advance Auto Parts", "Company: Bright Horizons", "Company: King & Wood Mallesons", "Company: Indiana University Health", "Company: PACSUN", "Company: Ropes & Gray LLP", "Company: Netsmart", "Company: American Water", "Company: Big Lots", "Company: Fairview Health Services", "Company: Garmin", "Company: Lord, Abbett & Co. LLC", "Company: Sheppard Mullin Richter & Hamp", "Company: CareFirst BlueCross BlueShield", "Company: Symetra", "Company: National Journal", "Company: Medical College of Wisconsin", "Company: Brainlab", "Company: Redwood Software", "Company: University of Maryland Global ", "Company: Dallas College", "Company: Savills North America", "Company: VSP Vision Care", "Company: Medline Industries, LP", "Company: Old Dominion University", "Company: Genesis10", "Company: Donaldson", "Company: EPCOR", "Company: J. Paul Getty Trust", "Company: Symrise AG", "Company: TriNet", "Company: Braskem", "Company: The Venetian Resort Las Vegas", "Company: Novelis", "Company: Perkins&Will", "Company: Belk", "Company: Tyler Technologies", "Company: VHB", "Company: EY-Parthenon", "Company: Yara International", "Company: Simon-Kucher", "Company: Intuitive", "Company: Miratech", "Company: Peraton", "Company: Neurocrine Biosciences", "Company: Element Fleet Management", "Company: Amica Insurance", "Company: Kiewit", "Company: William & Mary", "Company: Guidewire Software", "Company: Miami-Dade County Public Schoo", "Company: Trintech", "Company: Ameren", "Company: Benjamin Moore", "Company: Design Within Reach", "Company: ITW", "Company: Liberty University", "Company: Solix Technologies, Inc.", "Company: U.S. Office of Personnel Manag", "Company: VNS Health", "Company: Hill's Pet Nutrition", "Company: X-Rite", "Company: Commonwealth Financial Network", "Company: Centene Corporation", "Company: VSE Corporation", "Company: The Exchange", "Company: Novant Health", "Company: Pella Corporation", "Company: Babcock & Wilcox", "Company: Houston Chronicle", "Company: Howard Hughes Medical Institut", "Company: Kimball International", "Company: Kimley-Horn", "Company: Ansell", "Company: The Metropolitan Museum of Art", "Company: Kennesaw State University", "Company: The City of San Diego", "Company: Mercury Insurance", "Company: Dewberry", "Company: Direct Supply", "Company: Eastridge Workforce Solutions", "Company: Wood", "Company: Iridium", "Company: Crate and Barrel", "Company: Aveda", "Company: Brembo", "Company: Broadspire", "Company: Levy Restaurants", "Company: Rakuten Advertising", "Company: Mintel", "Company: Arkema", "Company: Eastern Michigan University", "Company: Siegel+Gale", "Company: Wright State University", "Company: Bolloré Logistics", "Company: Vicor Corporation", "Company: California State University, C", "Company: RealPage, Inc.", "Company: Protective Life", "Company: Art Institute of Chicago", "Company: Lexar", "Company: Milestone Systems", "Company: ORIX Corporation USA", "Company: Chevron Phillips Chemical Comp", "Company: Hempel A/S", "Company: HUB International", "Company: AMN Healthcare", "Company: Belcan", "Company: Children's Health", "Company: DSA", "Company: Hyland", "Company: Momentive", "Company: Eversource Energy", "Company: StubHub", "Company: Arch Insurance Group Inc.", "Company: Giant Eagle, Inc.", "Company: Medica", "Company: PPL Corporation", "Company: Uponor", "Company: Coinstar", "Company: CSC", "Company: Caleres, Inc.", "Company: Groupe Clarins", "Company: Rocket Software", "Company: Alkermes", "Company: Bracco", "Company: Brooks Brothers", "Company: Famous Footwear", "Company: Creighton University", "Company: Qlik", "Company: Baker Tilly US", "Company: Ivy Tech Community College", "Company: NOVA Chemicals", "Company: Lexicon Pharmaceuticals, Inc.", "Company: PNM Resources", "Company: Stifel Financial Corp.", "Company: Videojet Technologies", "Company: DLC", "Company: HNTB", "Company: GHD", "Company: JDRF International", "Company: Konecranes", "Company: Pep Boys", "Company: Subaru of America", "Company: QinetiQ US", "Company: IONOS", "Company: Sherpa | Recruiting, Staffing ", "Company: New York Institute of Technolo", "Company: Lamar Advertising Company", "Company: Cable ONE", "Company: LCRA", "Company: Accuray", "Company: BankUnited", "Company: Nordson Corporation", "Company: Giorgio Armani", "Company: Minuteman Press", "Company: Swisslog", "Company: Tecan", "Company: Shook, Hardy & Bacon L.L.P.", "Company: Webster Bank", "Company: CooperVision", "Company: Games Workshop Ltd", "Company: BRP", "Company: BART", "Company: Gilbane Building Company", "Company: Mace", "Company: CARFAX", "Company: Genuine Parts Company", "Company: New York City Police Departmen", "Company: NBCUniversal Telemundo Enterpr", "Company: BayCare Health System", "Company: Meta", "Company: Fragomen", "Company: Everi Holdings Inc.", "Company: Securian Financial", "Company: ESR", "Company: Vulcan Materials Company", "Company: American Psychological Associa", "Company: Paradise Valley Hospital", "Company: CarsDirect.com", "Company: Promega Corporation ", "Company: Steptoe LLP", "Company: (USTA) United States Tennis As", "Company: BAI", "Company: Chick-fil-A Corporate Support ", "Company: CHRISTUS Health", "Company: Rent-A-Center", "Company: SNI Financial", "Company: Cooper Standard", "Company: eInfochips (An Arrow Company)", "Company: Fresenius Kabi USA", "Company: Converse", "Company: NORC at the University of Chic", "Company: ACT", "Company: Butler Aerospace & Defense", "Company: City of Phoenix", "Company: David's Bridal", "Company: Quinnox", "Company: Crowell & Moring", "Company: The Wonderful Company", "Company: POM Wonderful", "Company: FIJI Water", "Company: Semtech", "Company: U.S. Xpress, Inc.", "Company: Brookfield Properties", "Company: GKN Aerospace", "Company: Alzheimer's Association®", "Company: Swagelok", "Company: The J.M. Smucker Co.", "Company: Turner & Townsend", "Company: EverBank", "Company: Heartland", "Company: Insight Global", "Company: Liebherr Group", "Company: Pinnacle Group, Inc.", "Company: Starkey Hearing", "Company: Swissport", "Company: University of Mississippi", "Company: Orlando Health", "Company: Terminix", "Company: Westat", "Company: ESCO Group LLC", "Company: Infinite Computer Solutions", "Company: KSB Company", "Company: New York Post", "Company: Nova Ltd.", "Company: Tom James Company", "Company: Berry Global, Inc.", "Company: Douglas County", "Company: Kinder Morgan, Inc.", "Company: HSB - Hartford Steam Boiler", "Company: Venable LLP", "Company: Environmental Defense Fund", "Company: FUJIFILM Healthcare Americas C", "Company: Hill International, Inc.", "Company: Matson, Inc.", "Company: Matson Logistics", "Company: Shiseido", "Company: Travis County", "Company: Vaco", "Company: Burlington Stores, Inc.", "Company: Tarkett", "Company: UAMS - University of Arkansas ", "Company: Yazaki North America", "Company: Girl Scouts of the USA", "Company: Graco", "Company: Hillel International", "Company: Leggett & Platt", "Company: SHRM", "Company: National Renewable Energy Labo", "Company: Prysmian", "Company: Clark Construction Group", "Company: Marlabs LLC", "Company: Children's National Hospital", "Company: ANDRITZ", "Company: Austin Community College", "Company: Hologic, Inc.", "Company: XTRA Lease LLC", "Company: General Atomics", "Company: Ingenio", "Company: Janney Montgomery Scott LLC", "Company: NCDOT", "Company: Almac Group", "Company: Citi", "Company: Siemens Gamesa", "Company: PGA TOUR", "Company: MGIC", "Company: Onward Technologies Limited", "Company: SageNet", "Company: Wood Mackenzie", "Company: Arlington County Government", "Company: O.C. Tanner", "Company: PVH Corp.", "Company: Bartech Staffing", "Company: Woodside Energy", "Company: BDS Connected Solutions, LLC.", "Company: NFP", "Company: Navy Federal Credit Union", "Company: TriWest Healthcare Alliance", "Company: AAAS", "Company: Hormel Foods", "Company: Mainline Information Systems", "Company: Midcontinent Independent Syste", "Company: WEX", "Company: Barings", "Company: BioMarin Pharmaceutical Inc.", "Company: C&S Wholesale Grocers", "Company: Open Systems Technologies", "Company: SolomonEdwards", "Company: AAA-The Auto Club Group", "Company: Institute for Defense Analyses", "Company: MAC Cosmetics", "Company: Markel", "Company: Proofpoint", "Company: Rich Products Corporation", "Company: Combined, a Chubb Company", "Company: Leonardo", "Company: Freedom Mortgage", "Company: Oceaneering", "Company: Trinity College-Hartford", "Company: Tennant Company", "Company: Wesco", "Company: OneAmerica Financial", "Company: Strayer University", "Company: Zilliant", "Company: Medical Mutual", "Company: Atlantic Health System", "Company: Baptist Health", "Company: Trader Joe's", "Company: Avature", "Company: Bank of Hawaii", "Company: Boise State University", "Company: Broadridge", "Company: Keypath Education", "Company: Arby's", "Company: Barrick Gold Corporation", "Company: Centric Consulting", "Company: ITR Group", "Company: Main Line Health", "Company: Myriad Genetics", "Company: Boost Mobile", "Company: Cambridge Health Alliance", "Company: Novanta Inc.", "Company: Virginia Mason Franciscan Heal", "Company: Wilson Elser", "Company: Epiq", "Company: Griffith Foods", "Company: Buchanan Ingersoll & Rooney PC", "Company: Sg2", "Company: UT Health San Antonio", "Company: Medidata Solutions", "Company: Park Nicollet Health Services", "Company: Ocean Spray Cranberries", "Company: Pratt Institute", "Company: BENTELER Group", "Company: Towson University", "Company: Ionis Pharmaceuticals, Inc.", "Company: Paladin Consulting", "Company: STV", "Company: OpenTable", "Company: Republican National Committee", "Company: Safelite", "Company: Tradeweb", "Company: Advantage Resourcing", "Company: Bon Secours", "Company: Denver Public Schools", "Company: Farm Bureau Financial Services", "Company: Audible", "Company: University of Missouri-Saint L", "Company: La-Z-Boy Incorporated", "Company: MedImpact Healthcare Systems, ", "Company: Day & Zimmermann", "Company: Graphic Packaging Internationa", "Company: Idaho National Laboratory", "Company: Rose International", "Company: National Federation of Indepen", "Company: Culligan International", "Company: Sentry", "Company: SICK Sensor Intelligence", "Company: Trapeze Group", "Company: University of Richmond", "Company: Welch's", "Company: Miami Dade College", "Company: Americold Logistics, LLC.", "Company: Atlas Air", "Company: Circle K", "Company: EQT Corporation", "Company: Mimeo", "Company: FCS Software Solutions Ltd", "Company: Leica Microsystems", "Company: Leviton", "Company: Conservation International", "Company: Cracker Barrel", "Company: DPR Construction", "Company: PAR Technology", "Company: UNOPS", "Company: Granite Construction", "Company: General Dynamics Electric Boat", "Company: Markem-Imaje", "Company: PDF Solutions", "Company: Pilgrim's", "Company: Uline", "Company: Yardi", "Company: ASQ - World Headquarters", "Company: CompHealth", "Company: Sensient Technologies Corporat", "Company: Windstream", "Company: Food Lion", "Company: Brookhaven National Laboratory", "Company: Copyright Clearance Center (CC", "Company: Crum & Forster", "Company: UST", "Company: Detroit Medical Center", "Company: Children's Hospital of Michiga", "Company: Exclusive Resorts", "Company: Federal Bureau of Prisons - Ca", "Company: Montclair State University", "Company: Altec", "Company: Scooter's Coffee", "Company: Holland & Hart LLP", "Company: Sargent & Lundy", "Company: Sierra Nevada Corporation", "Company: Cabela's", "Company: Burns & McDonnell", "Company: ChristianaCare", "Company: 2K", "Company: Viking", "Company: HealthFitness", "Company: Hexcel Corporation", "Company: HMSHost", "Company: IREX", "Company: Pernod Ricard", "Company: CuraScript SD by Evernorth", "Company: Genmab", "Company: Loomis, Sayles & Company", "Company: Boys & Girls Clubs of America", "Company: SMX", "Company: Hendrickson", "Company: Rittal North America LLC", "Company: Sinclair Inc.", "Company: Smith Hanley Associates", "Company: eHealth, Inc.", "Company: Mercy Health", "Company: MultiCare Health System", "Company: New Resources Consulting", "Company: Orange County Government", "Company: Biotage", "Company: Harris County", "Company: PENN Entertainment, Inc", "Company: HurixDigital", "Company: Mindteck", "Company: Aggreko", "Company: Aston Carter", "Company: Beam Suntory", "Company: Constant Contact", "Company: Acronis", "Company: Adventist HealthCare", "Company: Management Sciences for Health", "Company: City of Indianapolis", "Company: Empire Today", "Company: Kao Corporation", "Company: Modine Manufacturing Company", "Company: Optiver", "Company: Frost", "Company: Hiscox", "Company: Nexon America", "Company: Parkland Health", "Company: Accruent", "Company: TransPerfect", "Company: Systems Planning & Analysis", "Company: Albany International Corp.", "Company: Conair LLC", "Company: Integra LifeSciences", "Company: Ledgent", "Company: McLane Company, Inc.", "Company: St. Joseph Health", "Company: Zimmerman Advertising", "Company: HKS, Inc.", "Company: Skechers", "Company: ELEKS", "Company: Cambrex", "Company: Children's Minnesota", "Company: Constellation Brands", "Company: Opportunity International", "Company: Regeneron", "Company: Leadership Institute", "Company: ValueLabs", "Company: Contra Costa County", "Company: Devereux Advanced Behavioral H", "Company: Gordon Rees Scully Mansukhani,", "Company: Harris Computer", "Company: Greif", "Company: CohnReznick LLP", "Company: Excelacom", "Company: World Learning", "Company: Signet Jewelers", "Company: Brose Group", "Company: Jackson Lewis P.C.", "Company: MarketAxess", "Company: Oakland University", "Company: Portland General Electric", "Company: Chamberlain Group", "Company: TranSystems", "Company: Trigyn Technologies", "Company: ArisGlobal", "Company: CoBank", "Company: Magna International", "Company: Stepan Company", "Company: ZOLL Medical Corporation", "Company: WiseTech Global", "Company: ABF Freight", "Company: Spirit AeroSystems", "Company: Williams College", "Company: PING", "Company: Prime Therapeutics", "Company: United States Olympic & Paraly", "Company: Burns & Levinson LLP", "Company: Community Health Network", "Company: Eliassen Group", "Company: Freudenberg Sealing Technologi", "Company: Lesley University", "Company: Marathon Petroleum Corporation", "Company: Ballard Spahr LLP", "Company: Bluegreen Vacations", "Company: Zegna", "Company: Hach", "Company: International Atomic Energy Ag", "Company: Apex IT", "Company: Mortenson", "Company: Mozilla", "Company: expand group", "Company: BECU", "Company: Wheels, Inc.", "Company: Zillow", "Company: Expro", "Company: Builders FirstSource", "Company: CES", "Company: Dematic", "Company: Western Governors University", "Company: LensCrafters", "Company: The Mars Agency", "Company: Prosum", "Company: RadNet", "Company: SANS Institute", "Company: Volvo Financial Services", "Company: Under Armour", "Company: Softworld, a Kelly Company", "Company: AvalonBay Communities", "Company: Aéropostale", "Company: Carters Inc.", "Company: Dallas Fort Worth Internationa", "Company: CJ Logistics America", "Company: Wiley Rein LLP", "Company: VisitBritain", "Company: Lhoist", "Company: Printpack", "Company: Academy Sports + Outdoors", "Company: Cascades", "Company: Staff Management | SMX", "Company: Wildlife Conservation Society", "Company: Solomon Page", "Company: RWJBarnabas Health", "Company: Guaranteed Rate", "Company: KARL STORZ United States", "Company: GIA (Gemological Institute of ", "Company: Papa Johns", "Company: Clean Harbors", "Company: Denver Health", "Company: CSI", "Company: Transurban", "Company: American Modern Insurance Grou", "Company: Perry Ellis International", "Company: P.F. Chang's", "Company: East West Bank", "Company: Newegg", "Company: Armanino LLP", "Company: AVEVA", "Company: Susan G. Komen", "Company: Zeno Group", "Company: EMCOR Group, Inc.", "Company: Avangrid", "Company: Erie Insurance Group", "Company: Tommy Bahama", "Company: Eastern Bank", "Company: iCIMS", "Company: Comrise", "Company: McLean Hospital", "Company: Movado Group, Inc", "Company: Jefferson Health", "Company: Peterson's", "Company: Selective Insurance", "Company: Batesville", "Company: Butler University", "Company: Profiles", "Company: Renaissance Learning", "Company: Scripps Health", "Company: Tampa Electric", "Company: Inditex", "Company: Universal Instruments Corporat", "Company: Jockey International, Inc.", "Company: Metropolitan State University ", "Company: Trinity Industries, Inc.", "Company: EDB", "Company: Hannaford Supermarkets", "Company: HealthStream", "Company: Performance Food Group", "Company: Baptist Health", "Company: City of Palo Alto", "Company: Ansira", "Company: RED Global", "Company: FUJIFILM Sonosite, Inc.", "Company: Tripadvisor", "Company: Kimpton Hotels & Restaurants", "Company: Humanscale", "Company: Designit", "Company: Dimensional Fund Advisors", "Company: Delaware North", "Company: Westgate Resorts", "Company: Graham Packaging", "Company: Innovative Systems Group", "Company: ENGIE North America Inc.", "Company: Pacific International Executiv", "Company: Formica Group North America", "Company: AmeriGas", "Company: Arriva Group", "Company: Hilton Grand Vacations", "Company: Texas Tech University Health S", "Company: JELD-WEN, Inc.", "Company: Kleinfelder", "Company: Ontex", "Company: Acushnet Company", "Company: Ambu A/S", "Company: DISYS", "Company: Neudesic, an IBM Company", "Company: FreshDirect", "Company: Hong Kong Trade Development Co", "Company: 1-800 CONTACTS", "Company: Molina Healthcare", "Company: LA Fitness", "Company: Boingo Wireless", "Company: Boston Technology Corporation", "Company: Copart", "Company: Choate, Hall & Stewart LLP", "Company: SPS Commerce", "Company: Downstate Health Sciences Univ", "Company: The Hunter Group Associates", "Company: University of Advancing Techno", "Company: Windward Consulting", "Company: Miracle Software Systems, Inc", "Company: Mount Carmel Health System", "Company: U.S. International Development", "Company: Colorado School of Mines", "Company: Tractor Supply Company", "Company: Prosegur", "Company: LivaNova", "Company: Gresham Smith", "Company: La Petite Academy", "Company: Learning Care Group", "Company: Bodycote", "Company: Spirit Airlines", "Company: Synechron", "Company: Percepta", "Company: Pima County", "Company: Schweitzer Engineering Laborat", "Company: Micro Center", "Company: Ambient Consulting", "Company: AngloGold Ashanti", "Company: Tesla", "Company: Abiomed", "Company: GTT", "Company: SEGULA Technologies", "Company: Colonial Pipeline Company", "Company: Crunch Fitness", "Company: AECOM", "Company: Wesleyan University", "Company: Telesat", "Company: Total Quality Logistics", "Company: Interstate Batteries", "Company: Evotec", "Company: Extra Space Storage", "Company: Trammell Crow Residential", "Company: Buckman", "Company: PCL Construction", "Company: Protegrity", "Company: Rinker Materials", "Company: Sartorius", "Company: Page", "Company: Liberty Tax", "Company: Stericycle", "Company: Detroit Public Schools Communi", "Company: Guggenheim Partners", "Company: Unishippers", "Company: Wellstar Health System", "Company: Akerman LLP", "Company: Atmos Energy", "Company: Nitto Avecia", "Company: LanguageLine Solutions", "Company: EDF Trading", "Company: Missouri State University", "Company: National Association of Manufa", "Company: Questex", "Company: Temasek", "Company: The Brattle Group" ], "type": "scatter", "x": [ 8.424368858337402, 8.40195369720459, 8.385270118713379, 8.42382526397705, -38.597190856933594, -38.74054718017578, -39.00513458251953, -38.19382858276367, -38.68928527832031, -39.055809020996094, -38.23733139038086, -38.41060256958008, -38.13452911376953, -38.96975326538086, 6.241576671600342, 6.2457356452941895, 6.244972229003906, 6.242238521575928, 10.229446411132812, 10.233492851257324, 10.243219375610352, 10.251922607421875, 10.23974323272705, 31.32158660888672, 31.50520133972168, 31.074567794799805, 31.456283569335938, 30.952003479003906, 31.256980895996094, 31.037574768066406, -1.6884390115737915, -2.029571771621704, -1.8245515823364258, -1.5695979595184326, -2.1955161094665527, -2.2359817028045654, -1.5817874670028687, -1.9934055805206299, 9.939101219177246, 10.179327011108398, 10.028629302978516, 9.859413146972656, 9.736146926879883, 9.666458129882812, 10.146087646484375, -29.77255630493164, -29.772802352905273, -29.772052764892578, 11.10151481628418, 1.3300023078918457, 1.4360734224319458, 1.0943334102630615, 1.0356072187423706, 1.1802235841751099, 1.674535870552063, 1.6853547096252441, 1.534334659576416, 0.6285699605941772, 0.6299970149993896, -1.206727385520935, -1.2102998495101929, -1.2111252546310425, 9.724861145019531, 9.326569557189941, 9.39232349395752, 9.622916221618652, 9.931135177612305, 10.042128562927246, 9.491296768188477, 9.992659568786621, 17.54332733154297, -0.3671700656414032, -0.1433565318584442, -0.4733661115169525, 0.06999942660331726, 0.059171970933675766, -0.11598870903253555, -0.3749028742313385, 0.8832989931106567, 20.084917068481445, 19.9399356842041, 20.446205139160156, 19.928754806518555, 19.841358184814453, 20.449960708618164, 20.274831771850586, 20.507068634033203, 15.08704948425293, 15.08784294128418, -0.7731616497039795, -47.88224792480469, -47.88972091674805, -47.74959945678711, -47.638980865478516, -47.61027526855469, -47.826072692871094, 3.918015480041504, 3.207364082336426, 3.330911636352539, 3.8493354320526123, 3.581437826156616, 3.3239355087280273, 3.5372464656829834, 3.7747905254364014, 5.4841485023498535, 5.485290050506592, 5.483107089996338, 5.468288421630859, -44.50997543334961, -44.509490966796875, 7.004449367523193, 6.9461259841918945, 7.7173566818237305, 7.457833766937256, 7.205479145050049, 7.674495697021484, 7.453052997589111, 7.798208713531494, 7.186491966247559, 16.148298263549805, 0.6788679361343384, -49.96831130981445, -49.9749870300293, -49.96926498413086, -49.98001480102539, -49.96370315551758, -53.66045379638672, -53.32814407348633, -53.1112060546875, -53.563846588134766, -53.72007369995117, -53.32570266723633, -53.33319854736328, -53.064266204833984, -1.7918540239334106, -1.5103708505630493, -1.656924843788147, -1.6139615774154663, -1.7948498725891113, -1.4628288745880127, -9.233979225158691, 0.8506536483764648, 0.9188241958618164, 0.33622848987579346, 0.21550366282463074, 0.6105638742446899, 0.5068449974060059, 0.2981937825679779, 0.8420239686965942, -34.76046371459961, -34.761802673339844, -0.3214055895805359, -0.5830390453338623, -0.5855518579483032, 27.71541404724121, 27.715551376342773, 27.715723037719727, 14.501453399658203, 14.501948356628418, 3.622316837310791, 3.619067430496216, 3.1090145111083984, -17.84478187561035, -17.845779418945312, -20.269529342651367, -2.39193058013916, -2.976329803466797, -2.819875717163086, -2.6543285846710205, -2.212239980697632, -2.162963628768921, -2.6436922550201416, -2.315013885498047, -2.870589017868042, 11.093473434448242, 11.16355037689209, 11.144811630249023, 11.154312133789062, 11.164909362792969, 20.428001403808594, 20.588680267333984, 20.027498245239258, 20.71439552307129, 20.362051010131836, 20.088254928588867, 20.595109939575195, 20.118406295776367, 6.959162712097168, 6.957623481750488, 6.957989692687988, 6.953879356384277, 21.536287307739258, 21.5371150970459, 21.539447784423828, 2.2849104404449463, 2.247946262359619, 2.2560007572174072, 2.2936506271362305, 2.273634433746338, 24.611116409301758, 24.024993896484375, 23.83722496032715, 23.802955627441406, 24.56348991394043, 24.356430053710938, 24.07606315612793, 23.74015235900879, 24.34441566467285, 24.691028594970703, -35.44540786743164, -35.44083786010742, -35.440086364746094, -35.442039489746094, -35.441978454589844, -11.628639221191406, -11.632146835327148, -11.631753921508789, -6.116138935089111, -5.735315322875977, -6.1684651374816895, -6.031317234039307, -5.350306510925293, -5.881524562835693, -5.453628063201904, -5.593273162841797, -5.3303542137146, 27.172494888305664, 27.05206871032715, 26.476150512695312, 26.975811004638672, 26.16529655456543, 26.405893325805664, 26.11762809753418, 26.70223617553711, 26.230031967163086, 27.16168975830078, 26.780899047851562, 41.57117462158203, 9.093786239624023, 7.729669094085693, -9.199989318847656, -9.200115203857422, -9.199707984924316, 3.275583505630493, 0.6109403967857361, 0.8323028087615967, 1.0309841632843018, 0.5399081707000732, 0.9001272916793823, 0.40024876594543457, 0.3644936978816986, 1.0575400590896606, -10.868709564208984, -11.195327758789062, -11.202178955078125, -10.839980125427246, -10.687455177307129, -10.656292915344238, -11.074051856994629, -19.25959587097168, -19.64748191833496, -19.830839157104492, -19.55939292907715, -19.510013580322266, -19.771268844604492, -19.477453231811523, 21.014442443847656, 21.01875877380371, 21.014751434326172, 21.02218246459961, 21.018726348876953, -34.7541389465332, -34.75838088989258, -44.35215759277344, -44.35417938232422, -44.35533142089844, -44.3489990234375, 23.116308212280273, 23.116008758544922, 23.13246726989746, 23.128582000732422, 23.128738403320312, -3.268699884414673, -3.276209831237793, -2.9686436653137207, -3.0327906608581543, -3.078014373779297, -2.992126226425171, -54.45542907714844, -54.45764923095703, -54.45448303222656, -5.214994430541992, -5.324438571929932, -5.1812825202941895, -5.841780185699463, -5.588702201843262, -5.81018590927124, -5.992255210876465, -5.4504523277282715, -5.917391300201416, 19.516084671020508, 19.53639030456543, 19.516597747802734, 19.517608642578125, 19.536191940307617, 4.3879923820495605, 4.643431663513184, 4.874138832092285, 4.80661678314209, 4.386302471160889, 4.539963245391846, 5.081382751464844, 5.046562671661377, 4.029664516448975, 4.032876014709473, -33.696231842041016, -34.20162582397461, -33.813697814941406, -33.68760299682617, -34.37712097167969, -33.885520935058594, -34.1035041809082, -34.528079986572266, -34.40664291381836, -3.97928786277771, -4.002251625061035, -3.9830708503723145, -3.9774272441864014, -3.9920456409454346, 0.6240297555923462, 0.6299149394035339, 0.6245612502098083, 14.754414558410645, 14.753911018371582, -10.065768241882324, -10.527876853942871, -10.335932731628418, -9.57887077331543, -9.763535499572754, -9.999625205993652, -9.6849946975708, -9.566462516784668, -10.2764892578125, -10.45286750793457, -5.479043960571289, -5.477899551391602, -5.478900909423828, -5.48048210144043, 12.779082298278809, -17.70671844482422, -17.744197845458984, -17.702316284179688, -17.742536544799805, -17.707124710083008, -20.93585777282715, -20.93665313720703, -20.633319854736328, -20.759273529052734, -20.69408416748047, -20.39215660095215, 15.015809059143066, 15.015778541564941, 15.02795124053955, 15.029789924621582, 15.031014442443848, 3.425910472869873, 3.4152750968933105, 3.408923387527466, 3.4254536628723145, 3.414301633834839, 3.9991567134857178, 3.99899959564209, 3.9927053451538086, 25.70205307006836, 25.701370239257812, 25.7038631439209, 25.716358184814453, -22.74942970275879, -22.6746768951416, -23.296579360961914, -23.007549285888672, -23.232913970947266, -23.03936004638672, -22.744829177856445, -23.363330841064453, -46.83793258666992, -46.51192855834961, -46.38588333129883, -46.4818000793457, -46.73876190185547, -46.61268997192383, -46.87735366821289, 12.541228294372559, 12.545148849487305, 12.542488098144531, 5.525738716125488, -0.666083037853241, -0.6896097660064697, -0.6464848518371582, -0.6849004030227661, -6.837101936340332, -6.837188720703125, -12.867753982543945, -12.870448112487793, -12.87316608428955, -12.863214492797852, -12.860433578491211, 4.128572463989258, -40.68437194824219, -41.17593002319336, -41.00885772705078, -40.91557693481445, -41.13207244873047, -40.776947021484375, -40.61848449707031, -33.27201843261719, -33.27245330810547, -33.27284622192383, -57.87062072753906, -9.34343147277832, -9.344001770019531, -9.340361595153809, -9.339327812194824, -47.296974182128906, -47.30055618286133, -37.84874725341797, -37.848854064941406, 3.0902435779571533, 1.7777507305145264, 1.6145280599594116, 1.7982213497161865, 1.51969313621521, 1.507896065711975, 1.6925978660583496, -52.13357162475586, -52.12623596191406, -52.13442611694336, -52.119266510009766, -52.1289176940918, 0.03377633914351463, 0.44756683707237244, 0.9032312631607056, 0.15730483829975128, 0.7627853155136108, 0.4680038094520569, 0.7006529569625854, 0.9010390043258667, -0.04280976951122284, 0.2129075825214386, 9.040034294128418, -58.03909683227539, -58.02412796020508, -58.02774429321289, -58.032772064208984, -52.453792572021484, -52.45466613769531, -52.455265045166016, -52.45302200317383, -64.5255355834961, -65.22887420654297, -64.8541259765625, -64.60836029052734, -65.15137481689453, -65.38077545166016, -64.71974182128906, -65.00115966796875, -65.38782501220703, 4.057638168334961, 4.056006908416748, 4.052893161773682, -55.83613967895508, -25.252897262573242, -25.25307846069336, -65.19004821777344, -65.1804428100586, -65.1854019165039, -65.1884536743164, -56.89091873168945, -56.89566421508789, -49.766849517822266, -49.776668548583984, -49.76902770996094, -49.79204559326172, -49.73958206176758, -60.75355911254883, -60.77012634277344, -60.67805099487305, -60.68153381347656, -60.67255783081055, -70.58096313476562, -70.56818389892578, -70.49311828613281, -70.45633697509766, -70.55171966552734, -71.75516510009766, -48.498043060302734, -67.8709945678711, -68.06137084960938, -67.869140625, -67.62189483642578, -67.38013458251953, -68.04399871826172, -67.56253814697266, -67.39675903320312, -63.39543533325195, -63.396156311035156, -47.06116485595703, -50.60409164428711, -50.60587692260742, -50.601593017578125, 6.235417366027832, -15.089536666870117, -14.96912956237793, -15.012476921081543, -15.332449913024902, -15.543253898620605, -15.413955688476562, -15.729859352111816, -15.62963581085205, -14.592277526855469, -14.593019485473633, -26.06534194946289, -38.52705764770508, -38.51149368286133, 21.112993240356445, 21.182252883911133, 20.90458869934082, 21.464303970336914, 21.588134765625, 20.741323471069336, 20.869428634643555, 21.384780883789062, 21.652090072631836, 32.56788635253906, 32.32442092895508, 32.82233810424805, 32.58119201660156, 33.00376892089844, 33.009517669677734, 32.874454498291016, 31.839994430541992, 31.822965621948242, 32.25719451904297, 31.995155334472656, 32.0140380859375, -21.0692081451416, 12.000478744506836, 11.998671531677246, -28.225128173828125, -28.22435188293457, -28.223079681396484, -28.21302032470703, -28.22294807434082, 26.650436401367188, 26.71042251586914, 26.541561126708984, 26.360599517822266, 26.018096923828125, 25.916732788085938, 26.0217227935791, 26.201248168945312, 26.79701042175293, 22.952205657958984, 9.003768920898438, 8.91420841217041, 8.65842342376709, 8.48921012878418, 8.727873802185059, 8.454588890075684, 8.81289005279541, 24.353986740112305, 24.353757858276367, 24.353864669799805, 24.144853591918945, 5.315511703491211, 5.3551812171936035, 5.345043182373047, 5.407382965087891, 5.339136123657227, -46.514156341552734, -47.360450744628906, -47.14832305908203, -46.87432861328125, -47.2081184387207, -46.96484375, -46.68968963623047, -47.336238861083984, -46.59156799316406, 10.548131942749023, 10.559576034545898, 10.368062973022461, 10.648305892944336, 10.286441802978516, 10.402506828308105, -16.5687198638916, -63.4290771484375, -63.42229080200195, -58.20360565185547, -58.17733383178711, -58.1947021484375, -58.16459655761719, -58.17775344848633, -3.7078065872192383, -4.323894500732422, -4.020966529846191, -3.4456288814544678, -4.229516506195068, -3.656536102294922, -3.9565958976745605, -3.4085915088653564, -4.262689590454102, -3.4956657886505127, 9.03604507446289, 9.044646263122559, 9.046369552612305, 9.060202598571777, 9.042214393615723, -22.461328506469727, -22.450204849243164, -22.4620361328125, -22.47696304321289, 21.704755783081055, 22.654081344604492, 22.87489128112793, 22.837860107421875, 22.682125091552734, 23.008441925048828, 22.685321807861328, 22.971527099609375, 22.319419860839844, -11.821859359741211, -11.4562406539917, -11.430265426635742, -11.802940368652344, -11.55270004272461, -11.346612930297852, -11.634156227111816, -55.61581802368164, -56.44009780883789, -56.55924987792969, -56.459171295166016, -55.809165954589844, -55.99927520751953, -55.95399475097656, -56.11747741699219, -55.57479476928711, -56.44060516357422, -3.503048896789551, -3.6055238246917725, -3.818509578704834, -3.767317295074463, -3.6996099948883057, -3.514622449874878, 3.8653600215911865, -27.51788902282715, -27.517377853393555, -10.292840957641602, -10.293699264526367, -4.3271379470825195, -4.328660488128662, -6.150954723358154, -6.146858215332031, -6.1473164558410645, -6.151699542999268, -7.847476959228516, -7.846634864807129, -7.847339153289795, -7.846627235412598, 22.062091827392578, -42.20407485961914, -42.21059036254883, -42.205562591552734, -42.2010383605957, -42.17451095581055, -54.45176315307617, -54.45507049560547, -54.44932174682617, -54.437103271484375, -54.458099365234375, 0.11311550438404083, 0.11269814521074295, -0.3183369040489197, -0.31079035997390747, -0.08086839318275452, -0.07864727824926376, -0.40902724862098694, -8.530174255371094, -8.875421524047852, -8.878767013549805, -8.87488079071045, -41.6385383605957, -41.63814926147461, 10.075909614562988, 13.474474906921387, 3.3136630058288574, 3.3146092891693115, -5.984489440917969, -5.942331314086914, -5.65389347076416, -5.974327087402344, -5.733998775482178, -5.71707820892334, -10.246761322021484, -10.247757911682129, 11.465141296386719, 16.85576820373535, 16.85823631286621, 16.855016708374023, 16.859519958496094, 11.282685279846191, 11.284430503845215, 11.282645225524902, 10.005130767822266, -10.744911193847656, -10.747952461242676, 2.1230387687683105, 2.279825210571289, 2.297940731048584, 2.254340410232544, 1.9931429624557495, 2.446924924850464, 1.924859642982483, -23.303342819213867, 0.5535921454429626, 0.556233286857605, 0.5561249256134033, -39.5833625793457, -39.5936164855957, -39.60243225097656, -39.60811233520508, -39.64350128173828, 21.599185943603516, 21.599828720092773, 21.600046157836914, 9.1586275100708, 5.82058572769165, 5.842195987701416, 5.822265148162842, 5.836764335632324, 5.831743240356445, 24.477479934692383, 24.477523803710938, 3.4941024780273438, 3.5356369018554688, 3.805636405944824, 3.662766933441162, 3.6072356700897217, 3.785088300704956, -52.43108367919922, -52.432403564453125, -52.434940338134766, -29.51155662536621, -29.511749267578125, -29.512527465820312, -29.513591766357422, -29.512319564819336, -26.14444351196289, -26.14342498779297, -26.1442928314209, -26.144636154174805, -25.476295471191406, -26.19039535522461, -20.268325805664062, -20.267528533935547, -26.666950225830078, 13.385660171508789, 13.392659187316895, 13.391640663146973, 13.394041061401367, -19.978500366210938, -19.98379135131836, -19.978111267089844, 8.24605655670166, 8.247496604919434, 8.25313949584961, 5.33571195602417, 1.570122241973877, 1.56509268283844, -50.80742263793945, -50.81294631958008, -50.81252670288086, -50.81089401245117, 3.611614227294922, 3.6118197441101074, 23.973388671875, 24.076915740966797, 24.42821502685547, 24.45101547241211, 24.34916114807129, 24.315494537353516, 24.02821922302246, 24.565372467041016, -26.899677276611328, -26.903812408447266, -26.903318405151367, 14.372613906860352, 14.367293357849121, 14.367090225219727, 14.371456146240234, -61.98445510864258, -62.25145721435547, -62.47407913208008, -62.25614929199219, -61.860660552978516, -62.614986419677734, -62.49680709838867, -62.014583587646484, -18.111356735229492, 22.44692039489746, 22.447153091430664, 22.442472457885742, 22.44460678100586, -20.74327278137207, -20.745454788208008, 12.831258773803711, 12.830989837646484, 12.831042289733887, -5.251822471618652, 16.589445114135742, -7.01567268371582, -6.808887958526611, -6.946660995483398, -6.7887067794799805, -7.075699329376221, -6.86447286605835, -17.10204315185547, -17.101015090942383, -17.10253143310547, -17.102405548095703, -17.099790573120117, -7.8117289543151855, -7.814805030822754, -7.818292617797852, -7.8097147941589355, 10.708316802978516, -57.271305084228516, -57.26393508911133, -57.27133560180664, -57.271034240722656, -57.27096176147461, -43.27741622924805, -43.27329635620117, -44.94085693359375, -44.941097259521484, -44.939422607421875, -44.94015121459961, 0.41917937994003296, 0.42184415459632874, 0.42084866762161255, -22.90757179260254, -22.90688133239746, -22.902053833007812, -43.78087615966797, -43.784114837646484, -43.79555130004883, -43.8066520690918, -43.784976959228516, -48.05199432373047, -48.004432678222656, -47.818328857421875, -47.98826217651367, -48.12126541137695, -47.817039489746094, 0.24960333108901978, 0.24967969954013824, 0.2483009696006775, -36.90621566772461, -36.90498733520508, -36.90475845336914, -36.89705276489258, -9.339715957641602, -9.337632179260254, -9.334293365478516, -9.333635330200195, -50.4771614074707, -50.47110366821289, -50.47177505493164, -50.45993423461914, -50.468021392822266, -16.25105857849121, -16.249670028686523, -16.253883361816406, -16.240957260131836, 23.78154754638672, 22.668743133544922, -47.52705001831055, -46.826332092285156, -47.363277435302734, -46.66850662231445, -47.09300994873047, -47.45309829711914, -46.578468322753906, -46.5025520324707, -46.94593048095703, -47.17988586425781, 16.074325561523438, 15.986766815185547, 16.02914810180664, 15.979602813720703, -9.244939804077148, -9.459209442138672, -9.525348663330078, -9.197150230407715, -9.53021240234375, -8.741883277893066, -8.908061981201172, -8.695394515991211, -8.926861763000488, -31.140836715698242, -31.142518997192383, -31.14365577697754, -31.142181396484375, -31.145404815673828, 11.921862602233887, 12.160572052001953, 12.029277801513672, 12.316140174865723, 12.281342506408691, 12.100750923156738, -7.097792148590088, -7.1051812171936035, -7.119196891784668, -7.1125311851501465, -7.107389450073242, -17.501123428344727, -10.500753402709961, -10.497730255126953, -10.49947738647461, -51.95438003540039, -52.382293701171875, -51.78439712524414, -51.761043548583984, -52.12165832519531, -52.0570068359375, -52.146820068359375, -13.595605850219727, -14.100326538085938, -14.241900444030762, -13.86053466796875, -13.590537071228027, -13.747114181518555, -13.999796867370605, -14.268654823303223, -17.36631965637207, -17.19453239440918, -17.48020362854004, -17.363676071166992, -17.15692901611328, -17.120025634765625, 15.651924133300781, 15.652823448181152, 1.3848296403884888, 1.3827440738677979, -15.755619049072266, -15.746484756469727, -15.74909496307373, -15.750643730163574, -15.750755310058594, -18.4794979095459, 11.25140380859375, -15.106375694274902, -6.372767925262451, -6.519701957702637, -6.875925540924072, -6.731739044189453, -6.736457347869873, -6.904006004333496, -6.435727119445801, -27.11993980407715, -26.51466941833496, -26.44937515258789, -26.837587356567383, -26.962995529174805, -27.03318214416504, -26.39188575744629, -26.698883056640625, 4.984915256500244, 11.247806549072266, 11.13890266418457, 11.491522789001465, 11.357682228088379, 11.654806137084961, 11.601849555969238, 11.094734191894531, -11.371184349060059, -11.371822357177734, -11.360681533813477, -11.361397743225098, -11.354806900024414, 3.5660488605499268, -10.614304542541504, -10.614241600036621, -10.62957763671875, -56.6731071472168, -54.925315856933594, -54.9257698059082, -60.83208465576172, -60.83211898803711, 28.312219619750977, 28.312278747558594, 28.311586380004883, 28.312294006347656, -55.093116760253906, 18.950105667114258, 18.942703247070312, 18.94816780090332, 18.95065689086914, 18.94476890563965, -31.00737953186035, -31.005002975463867, -19.790851593017578, -19.789791107177734, -19.789403915405273, -19.797624588012695, -60.712493896484375, -60.71503829956055, -60.713287353515625, -57.738651275634766, -57.724151611328125, -57.72794723510742, -57.73098373413086, 8.475144386291504, 8.315611839294434, 8.373150825500488, 8.164812088012695, 8.155284881591797, 8.444578170776367, 14.958893775939941, 14.968539237976074, 14.96784496307373, 14.964698791503906, 18.776565551757812, 18.775903701782227, 15.890573501586914, 15.890604019165039, -37.54127883911133, -37.546539306640625, -29.707714080810547, -29.77176284790039, -29.841392517089844, -29.863513946533203, -29.845125198364258, 12.486668586730957, 12.488693237304688, 12.489386558532715, 12.490241050720215, 6.677422046661377, -60.37477111816406, -26.067602157592773, -25.742372512817383, -25.74478530883789, -34.2813835144043, -34.280460357666016, -5.410487174987793, -5.484710216522217, -6.743513584136963, -6.746727466583252, -16.344520568847656, -15.843527793884277, -16.029876708984375, -16.311504364013672, -16.25292205810547, -15.997291564941406, -15.816859245300293, -68.20844268798828, -68.20467376708984, -68.20362854003906, -68.20428466796875, -68.20951843261719, -63.59611129760742, -33.69157409667969, -33.57405471801758, -33.616943359375, -33.975257873535156, -34.09513473510742, -34.031028747558594, -33.83718490600586, -10.965885162353516, -10.981391906738281, -10.699649810791016, -10.824625968933105, -10.782798767089844, -10.638372421264648, 9.29180908203125, -38.729251861572266, -38.570945739746094, -38.71137619018555, -38.21712875366211, -38.035316467285156, -38.431522369384766, -38.0672721862793, -38.39033126831055, -64.2486343383789, -64.2483901977539, -64.24852752685547, -64.24834442138672, -63.52492141723633, -63.382774353027344, -63.62936019897461, -63.69843673706055, -63.355098724365234, -63.65897750854492, -45.643898010253906, -45.64356231689453, -45.6444091796875, -6.111186504364014, -6.110682487487793, -23.565807342529297, -23.565982818603516, -48.05550765991211, -48.058753967285156, -12.51508903503418, -12.514734268188477, -33.91090393066406, -33.577415466308594, -34.107025146484375, -34.18293762207031, -33.85030746459961, -34.22393798828125, -33.686614990234375, -33.519405364990234, -37.65353775024414, -37.6534309387207, 3.740062713623047, 3.7442400455474854, 3.744046211242676, 4.14409875869751, -8.994057655334473, 18.659725189208984, -22.356401443481445, -22.357711791992188, -22.354808807373047, -10.963913917541504, 8.224335670471191, 8.223245620727539, 8.21993637084961, 10.15271282196045, 10.151826858520508, 10.15285587310791, -28.508148193359375, -28.72815704345703, -28.928924560546875, -28.620750427246094, -28.41084098815918, -28.178300857543945, -28.23463249206543, -28.87276268005371, -41.52851104736328, -41.52909469604492, -2.694683074951172, -2.697195053100586, -15.884135246276855, -15.802911758422852, -15.909880638122559, -15.8931884765625, -15.85837173461914, 12.1902437210083, 12.315624237060547, 12.097739219665527, 12.210334777832031, 11.979430198669434, 12.087703704833984, -31.50810432434082, -31.50511932373047, -31.5111141204834, -31.511566162109375, -31.50833511352539, 9.788679122924805, 10.110432624816895, 9.954949378967285, 14.9107084274292, 13.252981185913086, 13.252169609069824, 13.254631042480469, -35.92222213745117, -35.9213981628418, 10.167903900146484, -42.39931106567383, -42.399864196777344, -42.400142669677734, -60.82884216308594, -59.594913482666016, -59.59376525878906, -59.31385803222656, 6.677526950836182, 6.677916526794434, 13.84874153137207, 13.850943565368652, 13.84062385559082, 13.84172534942627, 13.84252643585205, -4.282179355621338, -4.282599449157715, 0.3869257867336273, 12.832763671875, -7.454047679901123, -7.449394226074219, -7.457730293273926, -7.4590253829956055, -15.222578048706055, -15.212117195129395, -15.160901069641113, -15.182815551757812, -15.175369262695312, -61.024513244628906, -63.69906234741211, -63.71110153198242, -63.70718002319336, -63.71381378173828, -63.949058532714844, -60.58774948120117, -60.6015625, -60.32884216308594, -60.61634063720703, -60.332279205322266, -60.329647064208984, -42.887001037597656, -42.936134338378906, -42.907081604003906, -42.89353942871094, -42.91228485107422, -39.551353454589844, -39.551639556884766, -39.55238342285156, -39.5519905090332, -43.45033645629883, -43.45110321044922, -43.44938659667969, -43.45255661010742, -36.511451721191406, -36.51188278198242, 0.2971312999725342, 0.29829561710357666, 19.549253463745117, 19.08359146118164, 19.741037368774414, 19.35431671142578, 19.013877868652344, 19.427513122558594, 19.675180435180664, 19.10927391052246, -50.96442413330078, -50.067161560058594, -50.167598724365234, -35.48662185668945, -10.021904945373535, 10.931439399719238, -31.322214126586914, -31.318532943725586, -12.73622989654541, -31.678556442260742, 11.203988075256348, 11.203958511352539, 11.227036476135254, 11.235265731811523, -6.904852867126465, -6.905430793762207, -6.905808448791504, -7.9446539878845215, -7.944716453552246, -7.945710182189941, -7.944148540496826, -8.191888809204102, -8.192843437194824, 2.678701877593994, 7.625016212463379, 7.628201484680176, 7.636503219604492, 7.630942344665527, 23.330265045166016, 23.332908630371094, 23.33187484741211, 23.332874298095703, -21.119800567626953, -21.138242721557617, -21.146650314331055, -21.133689880371094, -21.143014907836914, -39.742923736572266, -60.10016632080078, -60.06216049194336, -60.07659149169922, -60.078941345214844, -60.079627990722656, -63.87070083618164, -63.82933044433594, -64.08505249023438, -64.13878631591797, -63.88064193725586, -64.05622100830078, 7.359988212585449, 7.358536720275879, 7.359809875488281, 1.0549017190933228, 1.058767557144165, -16.96685791015625, -58.71111297607422, -58.70831298828125, -25.61821174621582, -25.855731964111328, -25.862937927246094, -25.42840576171875, -25.63933753967285, -25.422956466674805, -25.96933364868164, 21.871400833129883, 21.882171630859375, 21.8466854095459, 21.876964569091797, 21.86018943786621, 2.08731746673584, 2.084014654159546, 10.558155059814453, -53.51179885864258, -54.048458099365234, -54.05021286010742, -53.85361099243164, -53.892642974853516, -53.58709716796875, -53.63858413696289, -64.06803131103516, -63.908626556396484, -63.68824768066406, -63.51429748535156, -63.99873733520508, -63.77212905883789, -63.56523132324219, -14.23972225189209, -14.240264892578125, -14.242884635925293, 10.333036422729492, 10.333346366882324, -38.038490295410156, -38.03743362426758, -11.941420555114746, -56.69660949707031, -56.43345642089844, -56.61713790893555, -57.05439376831055, -56.94187545776367, -56.89845657348633, -56.38780975341797, -56.300106048583984, 13.6294584274292, -2.2375152111053467, -22.587581634521484, -22.58746337890625, 14.323687553405762, 14.331825256347656, 14.354517936706543, 14.348875045776367, 14.395720481872559, -39.51643371582031, -29.00905990600586, -28.725196838378906, -28.77578353881836, -28.775949478149414, -28.996015548706055, -28.814306259155273, -42.3772087097168, -42.37689208984375, -42.37672805786133, -42.37638473510742, 10.325542449951172, 10.32380485534668, -6.758334159851074, -6.761075496673584, -6.760504245758057, -6.76297664642334, -40.606712341308594, -40.60508346557617, -40.61124801635742, -4.945362091064453, -61.06270980834961, -52.90327072143555, -52.90538787841797, -52.906925201416016, -57.89860153198242, -57.90040588378906, -57.916629791259766, -57.90595626831055, -69.11897277832031, -69.12520599365234, -69.12963104248047, -69.14383697509766, -58.713809967041016, -58.7151985168457, -58.71522903442383, -56.7585334777832, -56.15938949584961, -21.997802734375, -21.83837127685547, -22.03680419921875, -21.775232315063477, -21.825849533081055, -22.09166145324707, 10.477498054504395, 10.400519371032715, 10.262097358703613, 10.503884315490723, 10.273590087890625, 10.445274353027344, -66.8909683227539, -66.8964614868164, -66.89068603515625, 9.131399154663086, 9.227867126464844, 9.608245849609375, 9.560931205749512, 9.306675910949707, 9.066203117370605, 9.438796997070312, -48.08914566040039, -62.206844329833984, -62.200286865234375, -62.200225830078125, -14.774711608886719, -14.770051956176758, -14.786432266235352, -14.782983779907227, -14.774290084838867, -31.653705596923828, -36.980125427246094, -44.349693298339844, -44.34103012084961, -44.35206604003906, -44.33806610107422, -17.752960205078125, -17.75241470336914, -17.757099151611328, -17.747058868408203, -28.952077865600586, -28.945486068725586, -28.956897735595703, -28.956375122070312, -15.358386039733887, -15.353671073913574, -15.361281394958496, -15.351487159729004, -15.343894004821777, 4.714502811431885, 4.9887003898620605, 4.804062843322754, 5.15646505355835, 4.923381328582764, 4.962911605834961, -3.091036558151245, -3.090825319290161, -18.099483489990234, -18.112123489379883, -18.09318733215332, -18.111907958984375, -14.688825607299805, -14.538540840148926, -14.299317359924316, -14.337711334228516, -14.815533638000488, -14.975482940673828, -14.466683387756348, -14.952736854553223, -13.293607711791992, -13.042061805725098, -12.775985717773438, -13.634769439697266, -13.521761894226074, -13.263656616210938, -12.952322006225586, -13.563087463378906, -12.813916206359863, -46.36420440673828, -46.368350982666016, -46.36145782470703, -46.36210250854492, -46.36933517456055, -56.07087707519531, -12.314374923706055, -12.314844131469727, 12.398545265197754, -25.324207305908203, -25.32459831237793, -25.32564926147461, 23.649797439575195, 23.64925765991211, 23.64340591430664, 7.435271263122559, 7.4091668128967285, 7.414517402648926, 7.409411430358887, -10.784873962402344, -10.7341947555542, -38.71002197265625, -38.71083068847656, -38.70957565307617, -38.71027374267578, 16.548364639282227, 16.553056716918945, 16.556907653808594, -40.726871490478516, -40.41619873046875, -40.20418167114258, -40.87351608276367, -40.61463928222656, -40.970252990722656, -40.734188079833984, -40.26972198486328, -60.970394134521484, -60.97218704223633, -61.686397552490234, -61.67934799194336, 17.61966896057129, -12.593852043151855, -12.59571361541748, -12.606873512268066, -12.598134994506836, 22.108257293701172, -33.103172302246094, -32.26847457885742, -33.500396728515625, -33.379940032958984, -31.56306266784668, -31.559171676635742, -31.563657760620117, -31.55913543701172, -7.861734390258789, -7.914711952209473, -7.903069496154785, -7.8621392250061035, -7.859370708465576, -37.925540924072266, -37.9260139465332, -37.925296783447266, -37.92491149902344, -2.920363187789917, -2.92573618888855, -2.923532009124756, 6.63681697845459, 6.6368088722229, -73.71869659423828, -74.39083862304688, -73.89617919921875, -73.83633422851562, -74.16877746582031, -74.4381103515625, -73.79354095458984, -74.25989532470703, -74.5290298461914, -29.44828987121582, -29.44973373413086, -29.452014923095703, -23.69202995300293, -23.694538116455078, -23.69133758544922, -23.69902229309082, -23.665298461914062, 26.732439041137695, 26.255809783935547, 26.72085189819336, 27.006927490234375, 26.98185157775879, 27.17838478088379, 27.184123992919922, 26.255008697509766, 26.433942794799805, 26.398193359375, -1.4631564617156982, -2.0807673931121826, -2.109511375427246, -2.034956693649292, -1.643190860748291, -1.098846673965454, -1.2552950382232666, -1.0877041816711426, -1.1651872396469116, -1.711522102355957, -1.8688719272613525, -34.13358688354492, -34.131935119628906, -32.48831558227539, -32.4871711730957, -32.483943939208984, 11.574583053588867, -44.878883361816406, -44.680580139160156, -44.54521560668945, -44.510921478271484, -44.757198333740234, -44.76645278930664, -70.60704040527344, -70.4699478149414, -58.79962158203125, -68.65261840820312, -68.69153594970703, -68.68538665771484, -68.63492584228516, -68.66101837158203, -18.63035774230957, -18.630281448364258, -18.632183074951172, 9.23144245147705, 9.234416961669922, 6.9486565589904785, 6.951380252838135, 6.948786735534668, 12.324705123901367, 12.32500171661377, -26.295886993408203, -26.293813705444336, -67.51423645019531, -67.50902557373047, -67.51679992675781, -13.990531921386719, -13.990288734436035, -13.99067211151123, -74.88426971435547, -75.06077575683594, -74.64924621582031, -74.60863494873047, -74.75909423828125, -75.1240463256836, -75.17537689208984, 1.8373706340789795, -2.3988356590270996, -2.3978402614593506, -2.3997175693511963, -2.403235912322998, 15.508713722229004, 15.503201484680176, 15.518051147460938, 19.19660758972168, 19.207592010498047, 19.191099166870117, 19.194103240966797, -2.014946937561035, -51.42313766479492, -51.48221206665039, -51.50404739379883, -51.718772888183594, -51.392723083496094, -51.656829833984375, 24.34108543395996, -1.947666883468628, -1.9471527338027954, -1.9479432106018066, -1.9480937719345093, -13.688237190246582, -13.902804374694824, -13.869246482849121, -13.867380142211914, -13.714706420898438, -14.013772010803223, -69.97193908691406, -69.59896850585938, -69.76571655273438, -69.88774108886719, -70.2620620727539, -69.55244445800781, -70.21824645996094, -70.18151092529297, -69.48090362548828, -68.66361236572266, -0.6842813491821289, -0.681919276714325, -0.6847624182701111, 12.793574333190918, -64.030029296875, -64.0291519165039, -64.02894592285156, 18.78449821472168, 18.759483337402344, 18.749286651611328, 18.70789337158203, 18.734590530395508, -66.60057067871094, -66.60079956054688, -71.56140899658203, -71.56015014648438, -71.55998992919922, -16.42772102355957, -16.70086097717285, -16.430152893066406, -16.610769271850586, -16.706754684448242, -16.49740219116211, 6.9606852531433105, 7.0034894943237305, 7.035506248474121, 6.7987847328186035, 6.725658893585205, 6.733903408050537, 9.696547508239746, 9.696070671081543, 9.69472599029541, 20.120067596435547, 19.9486026763916, 19.97699737548828, 19.874601364135742, 19.847043991088867, 20.13687515258789, -29.880834579467773, -13.434200286865234, -13.21408462524414, -13.079896926879883, -13.198468208312988, -13.180018424987793, -13.31921672821045, 12.88471794128418, 12.884405136108398, 12.888836860656738, 12.885273933410645, -31.919118881225586, 1.7155766487121582, 1.7177070379257202, 1.7088819742202759, 1.7074626684188843, 1.7065359354019165, -3.832618236541748, 23.17136573791504, 23.166664123535156, 23.162588119506836, 23.153064727783203, -23.753393173217773, -23.75490379333496, -23.760515213012695, -23.75670623779297, -26.812911987304688, -26.81266212463379, -25.151025772094727, -31.25493621826172, -31.25486946105957, 4.614198684692383, 4.35776424407959, 4.537964344024658, 4.382148265838623, 4.6024169921875, 4.3679914474487305, 15.136275291442871, 15.192586898803711, 14.60908317565918, 14.515890121459961, 14.918002128601074, 14.824934959411621, 14.55881118774414, 15.123894691467285, -21.82978057861328, -21.828632354736328, -21.829904556274414, -38.527156829833984, -38.52360534667969, -38.5373420715332, -66.375, 14.80654525756836, 14.527073860168457, 14.681469917297363, 14.626154899597168, 14.903265953063965, 14.803765296936035, 10.511466026306152, -62.85231399536133, -62.854312896728516, -62.84885025024414, -62.843990325927734, -65.01849365234375, -65.04086303710938, -65.02104949951172, -65.00076293945312, -65.0142822265625, 3.5364906787872314, 3.537658214569092, 7.743208885192871, 7.730005264282227, 7.733132362365723, 7.725170135498047, 7.736743450164795, 15.357967376708984, -21.674589157104492, -21.673192977905273, -21.67369270324707, 6.22451114654541, 6.223665237426758, -26.414087295532227, -26.412384033203125, 10.984674453735352, 11.031102180480957, 10.97566032409668, 11.019796371459961, 11.01504898071289, -11.826008796691895, 15.758673667907715, 15.758585929870605, 15.758808135986328, -26.26375961303711, 13.19601058959961, 13.195222854614258, -40.1959342956543, -20.548673629760742, -20.533201217651367, -20.545686721801758, -20.540372848510742, -20.545082092285156, -16.21440315246582, -16.21455192565918, -15.51506233215332, -15.51744556427002, -15.495964050292969, -15.51413345336914, -63.41346740722656, -63.41600799560547, -74.71138763427734, -74.71638488769531, -74.7139892578125, -74.71527099609375, -74.7126235961914, -73.77288818359375, -73.77259063720703, -73.77193450927734, -31.162431716918945, -30.882938385009766, -31.050857543945312, -31.102458953857422, -30.92737579345703, -30.824872970581055, -23.274465560913086, -23.27474594116211, -23.273426055908203, -29.317319869995117, -29.318452835083008, -29.317399978637695, -32.490543365478516, -32.59402084350586, -32.42753219604492, -32.55759811401367, -32.37129592895508, -32.69107437133789, -12.106900215148926, 5.268308162689209, 5.285607814788818, 5.299559593200684, -60.29117965698242, 8.361554145812988, 8.36322021484375, 8.10783863067627, 6.807921886444092, 6.809138298034668, 6.807848930358887, -50.65309524536133, -50.655147552490234, -50.65590286254883, 4.168941497802734, -51.677894592285156, 3.550462007522583, 4.13480281829834, 3.296396493911743, 3.7737202644348145, 4.032591819763184, 4.033749580383301, 3.304417610168457, 3.472301483154297, 3.7310631275177, 0.2156933695077896, 0.21454402804374695, 0.21309591829776764, -37.844032287597656, -37.84381103515625, -37.85132598876953, -48.83259582519531, -48.829410552978516, 0.6048681735992432, 0.602332353591919, 0.6024385690689087, 0.6032942533493042, -10.460880279541016, -10.465855598449707, -10.46719741821289, -26.53402328491211, -26.533193588256836, -39.14055633544922, -39.141517639160156, -39.143577575683594, -4.630090236663818, -4.636085033416748, -4.634174346923828, 5.97052001953125, -36.777931213378906, -36.77778625488281, -36.7770881652832, -36.77738571166992, -36.778255462646484, -47.05340576171875, -47.06605529785156, -47.059024810791016, -47.04941940307617, -47.03755187988281, 14.94761848449707, 14.920146942138672, 14.507064819335938, 14.228759765625, 14.727867126464844, 14.42956829071045, 14.182744026184082, 14.775954246520996, 14.116118431091309, -26.917078018188477, -21.612327575683594, -21.61187744140625, -21.612274169921875, -63.586483001708984, -5.423588752746582, 21.541709899902344, 23.06288719177246, -26.22901153564453, -26.222148895263672, -59.94818115234375, -59.92826843261719, -59.94501495361328, -59.94598388671875, -59.972293853759766, 6.338867664337158, 6.336419105529785, 6.340895652770996, -29.89619255065918, -29.90003204345703, -28.70121955871582, -32.03236389160156, -32.03085708618164, -48.773258209228516, -48.77297592163086, -48.772762298583984, -48.773162841796875, 4.502254009246826, -3.0169200897216797, -3.016517162322998, -3.0156655311584473, -3.014995574951172, -30.852481842041016, -30.807783126831055, -31.358808517456055, -31.13585662841797, -31.322595596313477, -31.149080276489258, -30.759552001953125, -31.477121353149414, -29.491474151611328, -19.08061408996582, -19.069759368896484, -4.164778232574463, 1.7760272026062012, 1.7821723222732544, 1.7835849523544312, 1.7815669775009155, -24.41427230834961, -24.40819549560547, -24.398540496826172, -24.39463996887207, -24.390335083007812, 31.716354370117188, 31.716712951660156, -6.247402191162109, -5.967007637023926, -5.938083171844482, -6.112759113311768, -6.252727031707764, -6.086130142211914, -1.3094497919082642, -55.55604553222656, -55.96192169189453, 25.658832550048828, 15.13271713256836, 15.12988567352295, 15.128801345825195, 15.128372192382812, -47.60731887817383, -10.182089805603027, -10.1725492477417, -10.171238899230957, -8.196640014648438, -8.196233749389648, -15.613466262817383, -15.662379264831543, -15.525261878967285, -16.14585304260254, -16.16933822631836, -15.879556655883789, -16.257312774658203, -15.892128944396973, -67.68579864501953, -21.02730941772461, -21.025123596191406, -21.031599044799805, -21.03111457824707, -52.023780822753906, -60.5666618347168, -60.56923294067383, -60.568721771240234, 21.38077735900879, 21.379133224487305, 26.983030319213867, 26.983373641967773, 26.98339080810547, 26.983129501342773, -58.92685317993164 ], "y": [ 19.615699768066406, 19.578353881835938, 19.56269073486328, 19.608068466186523, 41.28982162475586, 41.35234451293945, 41.655216217041016, 41.66573715209961, 42.25960159301758, 41.800071716308594, 42.088436126708984, 42.234275817871094, 41.50304412841797, 42.188907623291016, 29.378488540649414, 29.379528045654297, 29.378686904907227, 29.380535125732422, 17.270790100097656, 17.33060646057129, 17.28412628173828, 17.26725959777832, 17.24688148498535, 23.120615005493164, 23.29633903503418, 23.15921974182129, 23.550708770751953, 23.33256721496582, 23.668794631958008, 23.599817276000977, 16.278268814086914, 16.911842346191406, 16.963712692260742, 16.47856903076172, 16.458641052246094, 16.707019805908203, 16.769603729248047, 16.26326560974121, -18.072223663330078, -17.714962005615234, -17.611141204833984, -17.51753807067871, -17.974977493286133, -17.78512954711914, -18.114604949951172, 39.314910888671875, 39.31538391113281, 39.31454849243164, 5.45222282409668, 17.783935546875, 18.538698196411133, 18.445417404174805, 18.214054107666016, 17.962711334228516, 18.11878204345703, 18.053421020507812, 18.524438858032227, 33.58551788330078, 33.587310791015625, 28.048828125, 28.00119400024414, 28.022733688354492, 36.26835250854492, 36.57929229736328, 36.8087158203125, 36.9649772644043, 36.9301872253418, 36.678043365478516, 36.300228118896484, 36.44358444213867, 32.12184143066406, -53.52337646484375, -53.4671516418457, -53.76904296875, -53.64047622680664, -53.86141586303711, -54.027496337890625, -53.958831787109375, 26.282405853271484, 14.230093955993652, 14.095026969909668, 13.578433990478516, 13.552642822265625, 13.811094284057617, 14.0676851272583, 13.559479713439941, 13.972908973693848, -17.911563873291016, -17.911212921142578, 30.242389678955078, 17.14500617980957, 17.169950485229492, 17.0700740814209, 17.319496154785156, 17.16207504272461, 17.397430419921875, 21.870765686035156, 21.913341522216797, 22.118587493896484, 22.063289642333984, 22.190187454223633, 21.575468063354492, 21.52533721923828, 21.555145263671875, 14.247730255126953, 14.246955871582031, 14.2372407913208, 14.252955436706543, -19.202116012573242, -19.202844619750977, -51.182559967041016, -51.025917053222656, -51.28550338745117, -51.47473907470703, -51.44845962524414, -50.77499008178711, -50.671966552734375, -51.05278396606445, -50.71173095703125, 15.883289337158203, 26.978958129882812, 23.916189193725586, 23.89486312866211, 23.955957412719727, 23.879182815551758, 23.879444122314453, 21.103492736816406, 21.021989822387695, 21.358562469482422, 21.620197296142578, 21.34636878967285, 20.984487533569336, 21.7039737701416, 21.543445587158203, -39.02962112426758, -39.046173095703125, -38.7376823425293, -39.11378860473633, -38.85429000854492, -38.84651565551758, 10.438827514648438, -58.41144943237305, -58.660247802734375, -58.96452713012695, -58.7503662109375, -59.05216979980469, -58.3015022277832, -58.45181655883789, -58.9362678527832, -13.338593482971191, -13.333050727844238, 9.964539527893066, 10.185064315795898, 10.184954643249512, 1.5900442600250244, 1.5900211334228516, 1.5900081396102905, 21.485576629638672, 21.487709045410156, -51.81793975830078, -51.81572341918945, -51.60102844238281, -38.643516540527344, -38.64380645751953, 19.485759735107422, -25.054697036743164, -25.613727569580078, -25.90918731689453, -25.15110969543457, -25.414566040039062, -25.731201171875, -25.952638626098633, -25.9692440032959, -25.342546463012695, 22.265003204345703, 22.304595947265625, 22.266159057617188, 22.26791000366211, 22.315412521362305, 21.797143936157227, 21.703685760498047, 21.46921730041504, 21.40131187438965, 21.06464958190918, 21.195098876953125, 21.155073165893555, 21.68206214904785, 8.656951904296875, 8.66891098022461, 8.667092323303223, 8.657218933105469, 2.797476053237915, 2.795121908187866, 2.7751567363739014, -35.326114654541016, -35.33585739135742, -35.34679412841797, -35.35205841064453, -35.324642181396484, 22.31337547302246, 21.588685989379883, 22.371187210083008, 21.798524856567383, 21.74531364440918, 22.491037368774414, 22.532258987426758, 22.097257614135742, 21.59651756286621, 22.01993179321289, 24.93752670288086, 24.907100677490234, 24.94779396057129, 24.94810676574707, 24.912691116333008, 38.61061096191406, 38.6085090637207, 38.60810089111328, 50.59627914428711, 51.2478141784668, 50.88981246948242, 51.13763427734375, 50.611083984375, 50.398887634277344, 51.14272689819336, 50.400489807128906, 50.86909484863281, 26.62944221496582, 26.34125328063965, 26.240768432617188, 27.190793991088867, 27.013992309570312, 27.211650848388672, 26.68583869934082, 27.269569396972656, 26.422161102294922, 26.938817977905273, 26.24526596069336, -22.084138870239258, 20.964096069335938, -13.321735382080078, 23.128860473632812, 23.129323959350586, 23.129138946533203, 28.859342575073242, -49.30814743041992, -49.970123291015625, -49.795372009277344, -49.95668411254883, -49.338253021240234, -49.486568450927734, -49.75401306152344, -49.573848724365234, 31.59119415283203, 31.7225341796875, 31.703258514404297, 32.05325698852539, 31.7069034576416, 31.841228485107422, 32.039852142333984, 18.4599666595459, 18.084314346313477, 18.391223907470703, 18.657838821411133, 18.088529586791992, 18.38131332397461, 18.57831573486328, 43.139923095703125, 43.138587951660156, 43.14003372192383, 43.137229919433594, 43.13914489746094, -16.596200942993164, -16.59531593322754, 22.172283172607422, 22.176353454589844, 22.179351806640625, 22.168785095214844, -7.328705310821533, -7.326674461364746, -7.347386360168457, -7.326251029968262, -7.369787216186523, 20.111957550048828, 20.24652862548828, 20.217517852783203, 20.018869400024414, 20.006141662597656, 20.252830505371094, 27.96617889404297, 27.966535568237305, 27.9635009765625, 37.933528900146484, 38.431209564208984, 38.159400939941406, 38.4959831237793, 38.541900634765625, 37.74867630004883, 38.17307662963867, 37.69267272949219, 37.86213684082031, 17.426687240600586, 17.419557571411133, 17.423786163330078, 17.44196319580078, 17.42070198059082, -47.633663177490234, -47.87929916381836, -47.8117561340332, -47.18286895751953, -47.43963623046875, -47.19351577758789, -47.56377029418945, -47.33882141113281, -54.38703918457031, -54.37321090698242, -19.587642669677734, -19.73521614074707, -19.085710525512695, -19.237403869628906, -19.12386703491211, -19.793624877929688, -18.917041778564453, -19.28270721435547, -19.675552368164062, 13.466168403625488, 13.485111236572266, 13.475837707519531, 13.496359825134277, 13.46780014038086, 12.39631175994873, 12.400782585144043, 12.39777946472168, 29.72053337097168, 29.721115112304688, -23.193052291870117, -23.515684127807617, -23.351829528808594, -23.490182876586914, -23.345279693603516, -24.227420806884766, -24.129987716674805, -23.8349609375, -24.070886611938477, -23.968381881713867, 8.533242225646973, 8.532602310180664, 8.533222198486328, 8.537431716918945, 16.43352699279785, 15.081089973449707, 14.996771812438965, 15.039948463439941, 15.039217948913574, 15.013532638549805, 10.377174377441406, 10.415907859802246, 10.244771003723145, 10.217440605163574, 10.399816513061523, 10.205963134765625, -45.74216842651367, -45.74730682373047, -45.741817474365234, -45.740562438964844, -45.740760803222656, 10.377479553222656, 10.38703727722168, 10.392452239990234, 10.370540618896484, 10.392964363098145, 1.64154052734375, 1.6382131576538086, 1.6315724849700928, -26.38961410522461, -26.39211654663086, -26.38745880126953, -26.37983512878418, 7.973665237426758, 8.174388885498047, 8.041230201721191, 7.890689373016357, 8.534941673278809, 8.620923042297363, 8.478525161743164, 8.24081802368164, 24.613622665405273, 24.952003479003906, 24.790090560913086, 24.449861526489258, 24.480419158935547, 25.047170639038086, 24.84228515625, 14.366753578186035, 14.355749130249023, 14.349175453186035, 19.448162078857422, 31.79884147644043, 31.780868530273438, 31.823060989379883, 31.799461364746094, 45.0407829284668, 45.040771484375, 42.43040084838867, 42.41851806640625, 42.42902374267578, 42.42851257324219, 42.42464828491211, -52.53044509887695, -3.155938148498535, -2.8796818256378174, -2.692490339279175, -3.250364065170288, -3.1285879611968994, -2.6988611221313477, -2.908132314682007, 33.11275863647461, 33.112552642822266, 33.11207962036133, 18.52277374267578, -6.003015995025635, -6.003298759460449, -6.001523971557617, -6.0045976638793945, 20.889053344726562, 20.88602066040039, -29.078540802001953, -29.07904052734375, 18.078266143798828, -3.4970993995666504, -3.5381932258605957, -3.327721118927002, -3.271939992904663, -3.46517014503479, -3.2104032039642334, 11.029948234558105, 11.06947135925293, 11.062063217163086, 11.059599876403809, 11.057565689086914, 3.3656105995178223, 3.9214415550231934, 3.4019882678985596, 4.011246204376221, 3.0866987705230713, 3.073415517807007, 3.9658164978027344, 3.6711747646331787, 3.669630527496338, 3.1245009899139404, 17.559486389160156, 27.181766510009766, 27.178281784057617, 27.178625106811523, 27.184091567993164, 25.574501037597656, 25.576852798461914, 25.564151763916016, 25.580490112304688, 30.692625045776367, 30.44162368774414, 31.179794311523438, 31.03142547607422, 31.177473068237305, 30.684043884277344, 30.470535278320312, 30.34078025817871, 30.98609733581543, 38.46847152709961, 38.46990966796875, 38.47005081176758, 8.65318775177002, -32.61669921875, -32.61686325073242, 10.71679973602295, 10.71477222442627, 10.712583541870117, 10.719389915466309, 20.42066764831543, 20.420419692993164, 20.376850128173828, 20.35725212097168, 20.379533767700195, 20.37837028503418, 20.389883041381836, 15.15091323852539, 15.169249534606934, 15.278226852416992, 15.268529891967773, 15.309466361999512, -3.4194695949554443, -3.413484573364258, -3.441138505935669, -3.459097385406494, -3.4275295734405518, -3.5362589359283447, 12.4593505859375, 13.846491813659668, 13.352869987487793, 13.135689735412598, 13.131237030029297, 13.422636032104492, 13.599628448486328, 13.83968734741211, 13.582568168640137, 19.779544830322266, 19.78046417236328, -20.89499855041504, 15.194920539855957, 15.192988395690918, 15.193404197692871, 24.758909225463867, -8.548921585083008, -8.17263126373291, -8.092381477355957, -8.612166404724121, -7.9459404945373535, -7.908633232116699, -8.258086204528809, -8.47465705871582, -6.015981197357178, -6.016862392425537, -7.458787441253662, -16.627302169799805, -16.638513565063477, 9.4815034866333, 8.686928749084473, 8.767452239990234, 8.733052253723145, 9.254551887512207, 9.068819999694824, 9.326662063598633, 9.521208763122559, 9.01665210723877, -33.5537223815918, -33.41852951049805, -32.519500732421875, -32.37589645385742, -33.090675354003906, -32.76300048828125, -33.34613037109375, -32.79806137084961, -33.107383728027344, -32.37151336669922, -32.52617645263672, -33.4159049987793, 17.51405143737793, -48.12157440185547, -48.121917724609375, -18.398242950439453, -18.39564323425293, -18.39533042907715, -18.401718139648438, -18.396867752075195, 39.38861846923828, 39.976600646972656, 40.174774169921875, 39.38467025756836, 40.03343963623047, 39.68410110473633, 39.431175231933594, 40.16361999511719, 39.68256759643555, -1.0205796957015991, 27.122779846191406, 26.8991641998291, 27.365554809570312, 26.963308334350586, 26.82093620300293, 27.097187042236328, 27.3533992767334, -18.807035446166992, -18.80803108215332, -18.807857513427734, -3.0396621227264404, -35.32816696166992, -35.31455993652344, -35.30586242675781, -35.31141662597656, -35.32258605957031, 29.377277374267578, 29.331165313720703, 29.79332733154297, 29.823139190673828, 29.011152267456055, 28.968809127807617, 29.059791564941406, 29.547189712524414, 29.600854873657227, -10.023449897766113, -9.717480659484863, -9.696830749511719, -9.816121101379395, -9.817838668823242, -9.982062339782715, 15.562488555908203, 11.156473159790039, 11.161606788635254, 0.8024594187736511, 0.833760678768158, 0.8056886792182922, 0.8290128707885742, 0.8213921785354614, -12.169388771057129, -12.633644104003906, -13.01504898071289, -12.31503677368164, -12.885029792785645, -13.004104614257812, -12.17520523071289, -12.59722900390625, -12.286759376525879, -12.941996574401855, -54.278358459472656, -54.273651123046875, -54.274234771728516, -54.28263854980469, -54.26875305175781, 18.047138214111328, 18.04540252685547, 18.04578971862793, 18.05464744567871, -2.4231529235839844, -2.66336727142334, -2.739593267440796, -2.7503011226654053, -2.3187143802642822, -2.389716863632202, -2.282493829727173, -2.2627387046813965, -4.026824951171875, -29.96892547607422, -29.88970375061035, -29.825037002563477, -30.073617935180664, -30.382925033569336, -30.24701690673828, -30.375465393066406, 18.231870651245117, 17.834165573120117, 17.98078155517578, 18.37459945678711, 18.547462463378906, 18.556264877319336, 17.7244815826416, 17.70110511779785, 17.938413619995117, 18.50374984741211, -43.670738220214844, -43.633705139160156, -43.811954498291016, -43.68363952636719, -43.94546127319336, -43.9042854309082, -36.151737213134766, 18.404033660888672, 18.402496337890625, 16.15940284729004, 16.160688400268555, -28.839956283569336, -28.83730697631836, 24.75139045715332, 24.754684448242188, 24.755435943603516, 24.75493812561035, 41.76799011230469, 41.76414489746094, 41.76634979248047, 41.761878967285156, 1.2915915250778198, 13.169641494750977, 13.166664123535156, 13.163803100585938, 13.17993450164795, 13.1449613571167, 14.342586517333984, 14.325929641723633, 14.335565567016602, 14.34080696105957, 14.313389778137207, 39.03230285644531, 39.286476135253906, 38.963985443115234, 39.41490173339844, 39.44419860839844, 38.90126419067383, 39.13055419921875, 38.03284454345703, 38.67974090576172, 38.68232345581055, 38.679805755615234, 25.937957763671875, 25.937850952148438, 0.10437796264886856, -12.74303913116455, 6.366682529449463, 6.366235256195068, -19.949581146240234, -20.018552780151367, -19.821163177490234, -19.782100677490234, -19.71761703491211, -20.04237174987793, 19.610979080200195, 19.610275268554688, 23.666749954223633, 21.732524871826172, 21.73271369934082, 21.73044204711914, 21.737895965576172, -44.752830505371094, -44.75190734863281, -44.7523307800293, 32.28709030151367, 35.3055305480957, 35.300228118896484, 25.343730926513672, 25.33647918701172, 25.810789108276367, 25.833444595336914, 25.719240188598633, 25.67043685913086, 25.453523635864258, 42.5044059753418, -23.019763946533203, -23.020343780517578, -23.018888473510742, -20.25642204284668, -20.251367568969727, -20.25770378112793, -20.264944076538086, -20.267351150512695, 38.859405517578125, 38.85883712768555, 38.859527587890625, -28.573060989379883, -22.03397560119629, -21.922908782958984, -21.91755485534668, -21.973066329956055, -22.081790924072266, -1.0875455141067505, -1.0859827995300293, 46.17226028442383, 46.36589431762695, 46.309810638427734, 46.41761016845703, 46.08900451660156, 46.159236907958984, 30.402408599853516, 30.39059829711914, 30.392311096191406, 48.29679870605469, 48.29973602294922, 48.29946517944336, 48.29791259765625, 48.29937744140625, 35.39366912841797, 35.39427185058594, 35.39523696899414, 35.39255905151367, 34.78495407104492, 36.040557861328125, 3.8123602867126465, 3.8132331371307373, 34.87925338745117, 34.1427001953125, 34.14676284790039, 34.14508056640625, 34.147518157958984, 7.4317193031311035, 7.426583290100098, 7.42673921585083, -14.340104103088379, -14.342109680175781, -14.352396011352539, 19.41588592529297, 14.861258506774902, 14.864226341247559, -9.927525520324707, -9.928338050842285, -9.928703308105469, -9.928986549377441, 34.50882339477539, 34.50959777832031, 16.580358505249023, 16.831918716430664, 16.470169067382812, 16.649492263793945, 16.82012367248535, 16.278118133544922, 16.420555114746094, 15.21837043762207, 14.0881986618042, 14.0865478515625, 14.085740089416504, 49.11172866821289, 49.105228424072266, 49.10498046875, 49.11041259765625, 26.470069885253906, 26.347326278686523, 26.448701858520508, 27.0653133392334, 26.72629165649414, 26.699024200439453, 26.971960067749023, 26.996707916259766, 18.629465103149414, -26.576961517333984, -26.576292037963867, -26.579288482666016, -26.579381942749023, 14.829085350036621, 14.828548431396484, 26.582456588745117, 26.57759666442871, 26.578857421875, 36.30913543701172, 15.14454174041748, -29.532310485839844, -29.54073143005371, -29.213396072387695, -29.4670352935791, -29.279312133789062, -29.23227882385254, 0.45458221435546875, 0.45696786046028137, 0.4531818926334381, 0.4525377154350281, 0.45957911014556885, 14.10048770904541, 14.107304573059082, 14.10794734954834, 14.106003761291504, -26.944866180419922, 31.539813995361328, 31.548376083374023, 31.539230346679688, 31.5385684967041, 31.53981590270996, -22.068201065063477, -22.07402229309082, 8.366649627685547, 8.366140365600586, 8.368837356567383, 8.371243476867676, 21.943334579467773, 21.947996139526367, 21.94466209411621, 0.3661123216152191, 0.36600640416145325, 0.3646478056907654, -28.10162353515625, -28.094097137451172, -28.095890045166016, -28.111860275268555, -28.093626022338867, -17.77281379699707, -17.759801864624023, -17.76862335205078, -18.07876205444336, -18.04309844970703, -17.967166900634766, -10.003591537475586, -10.005874633789062, -10.005304336547852, -23.29532814025879, -23.297040939331055, -23.2872314453125, -23.291053771972656, 29.018587112426758, 29.016138076782227, 29.012004852294922, 29.01198959350586, 28.28271484375, 28.271907806396484, 28.269296646118164, 28.249237060546875, 28.251514434814453, 12.062560081481934, 12.060970306396484, 12.066309928894043, 12.06212043762207, -5.871798515319824, -6.27864933013916, -26.42731285095215, -26.788503646850586, -26.68514060974121, -26.009729385375977, -26.826467514038086, -26.105377197265625, -26.56304168701172, -26.259279251098633, -25.881832122802734, -25.932600021362305, 17.993370056152344, 17.949054718017578, 17.95391082763672, 17.961505889892578, -11.154484748840332, -11.899337768554688, -11.328936576843262, -11.997869491577148, -11.603348731994629, -11.371152877807617, -11.886072158813477, -11.714444160461426, -11.193719863891602, -45.507015228271484, -45.503639221191406, -45.507171630859375, -45.50143814086914, -45.503536224365234, -26.032690048217773, -26.23933219909668, -25.933151245117188, -26.065635681152344, -26.1584415435791, -26.14234733581543, -15.838115692138672, -15.813797950744629, -15.840272903442383, -15.824049949645996, -15.8139066696167, 24.244531631469727, -37.25996017456055, -37.262699127197266, -37.2634162902832, 18.010297775268555, 17.771242141723633, 17.663633346557617, 17.84130859375, 18.005756378173828, 17.524038314819336, 17.5631103515625, 34.26675796508789, 34.142459869384766, 34.6212158203125, 34.07425308227539, 34.5330696105957, 34.757144927978516, 34.79409408569336, 34.34833908081055, -29.973403930664062, -29.926877975463867, -30.179208755493164, -30.24758529663086, -30.17885398864746, -30.064863204956055, 9.9336576461792, 9.932912826538086, -25.95941925048828, -25.963790893554688, 44.0172233581543, 44.01338195800781, 44.01628112792969, 44.018463134765625, 44.01741027832031, 28.914749145507812, -17.783817291259766, 27.93597412109375, -38.99421310424805, -39.2667121887207, -38.783531188964844, -39.23589324951172, -38.68506622314453, -39.083274841308594, -38.805870056152344, -46.404815673828125, -46.07366180419922, -46.560726165771484, -46.01070785522461, -46.66352081298828, -46.1384162902832, -46.270477294921875, -46.69782638549805, -17.35503578186035, 45.32395935058594, 45.74835205078125, 45.32488250732422, 45.86692428588867, 45.537139892578125, 45.75690841674805, 45.53031539916992, -40.7474479675293, -40.753787994384766, -40.76063919067383, -40.75022506713867, -40.73986053466797, 18.218826293945312, -33.80427551269531, -33.8050537109375, -33.81000518798828, 8.926806449890137, 6.608199119567871, 6.59987211227417, 1.9787828922271729, 1.973188042640686, 12.132262229919434, 12.132129669189453, 12.13248348236084, 12.132060050964355, 8.555238723754883, -21.443077087402344, -21.437341690063477, -21.440475463867188, -21.432636260986328, -21.434541702270508, -18.74827766418457, -18.75035858154297, 33.441619873046875, 33.44369888305664, 33.435523986816406, 33.43416213989258, 11.619955062866211, 11.614394187927246, 11.617948532104492, -11.833293914794922, -11.850177764892578, -11.846364974975586, -11.842402458190918, -47.25044250488281, -46.9913330078125, -47.31332778930664, -47.13975143432617, -47.11505126953125, -47.0426139831543, 12.601533889770508, 12.604795455932617, 12.604125022888184, 12.601816177368164, -1.4588029384613037, -1.4590747356414795, 0.36826056241989136, 0.36933547258377075, -13.332139015197754, -13.331543922424316, 15.294424057006836, 15.234681129455566, 15.214116096496582, 15.2152681350708, 15.220285415649414, 9.783016204833984, 9.781049728393555, 9.78219985961914, 9.785968780517578, -49.471710205078125, -7.66483211517334, -7.5213422775268555, 1.493606448173523, 1.495274543762207, -0.9184134006500244, -0.918870747089386, 30.991134643554688, 31.027393341064453, 31.561174392700195, 31.562211990356445, 5.000809192657471, 4.867987155914307, 4.718029022216797, 5.135533332824707, 4.704723358154297, 5.22243595123291, 5.124989986419678, 6.559177875518799, 6.566623687744141, 6.5628533363342285, 6.5652875900268555, 6.561412334442139, -7.802720069885254, 16.877864837646484, 16.728225708007812, 16.456193923950195, 16.8848876953125, 16.6803035736084, 16.431123733520508, 16.34537124633789, 6.880577564239502, 6.872020244598389, 7.023813724517822, 7.224524974822998, 7.1789631843566895, 7.237362384796143, 23.911922454833984, -32.31336212158203, -32.01381301879883, -32.51520538330078, -32.667266845703125, -32.38756561279297, -32.70991897583008, -32.22779083251953, -31.980731964111328, -13.819992065429688, -13.819475173950195, -13.819344520568848, -13.819905281066895, -10.692642211914062, -10.556159973144531, -10.416699409484863, -10.570545196533203, -10.522032737731934, -10.442363739013672, 1.2010078430175781, 1.201279878616333, 1.201815128326416, -4.116559028625488, -4.118771553039551, -37.08694839477539, -37.08695602416992, 2.9004127979278564, 2.9008262157440186, 21.240633010864258, 21.24146270751953, -26.270017623901367, -25.73372459411621, -25.614456176757812, -26.087352752685547, -25.54012680053711, -25.892803192138672, -26.225982666015625, -25.88770866394043, -0.662028968334198, -0.661478579044342, -31.33824920654297, -31.32688331604004, -31.32499122619629, -30.42455291748047, -33.03818130493164, 13.20207405090332, 42.989593505859375, 42.98908615112305, 42.99000930786133, 30.573070526123047, -5.856276035308838, -5.856736660003662, -5.860818862915039, 2.1293270587921143, 2.1228580474853516, 2.1296756267547607, -11.273481369018555, -11.325653076171875, -11.5348482131958, -11.989509582519531, -11.952359199523926, -11.711209297180176, -11.47655963897705, -11.815461158752441, 5.284406661987305, 5.285542011260986, 5.746614933013916, 5.745158672332764, 22.156543731689453, 22.149154663085938, 22.109149932861328, 22.13410186767578, 22.142148971557617, -55.026580810546875, -54.87137222290039, -55.02241134643555, -54.68485641479492, -54.818626403808594, -54.6778678894043, -8.037609100341797, -8.034199714660645, -8.032663345336914, -8.050683975219727, -8.041062355041504, -50.15074920654297, -49.64912033081055, -49.93394470214844, 18.301916122436523, -2.04836106300354, -2.047417163848877, -2.0480849742889404, -5.110095024108887, -5.109223365783691, 22.894638061523438, -10.715763092041016, -10.716068267822266, -10.71595287322998, -0.038951728492975235, 4.517714500427246, 4.525969982147217, 5.6985626220703125, -56.7344970703125, -56.7391357421875, -7.435959815979004, -7.45888090133667, -7.428562641143799, -7.428994178771973, -7.425929069519043, 27.358173370361328, 27.353717803955078, 34.34779739379883, 25.88641357421875, 18.72780418395996, 18.72313690185547, 18.723148345947266, 18.72093963623047, 29.99066734313965, 29.973918914794922, 29.81153678894043, 29.90375518798828, 29.871623992919922, 16.744558334350586, 15.92836856842041, 15.944089889526367, 15.932124137878418, 15.925552368164062, 13.796652793884277, -19.735301971435547, -19.90638542175293, -19.86664390563965, -19.853260040283203, -19.799057006835938, -19.708324432373047, -31.957698822021484, -31.920074462890625, -31.946401596069336, -31.932653427124023, -31.921907424926758, -37.368770599365234, -37.37185287475586, -37.37347412109375, -37.37248992919922, -36.7940788269043, -36.795413970947266, -36.7943229675293, -36.79540252685547, -34.87132263183594, -34.870914459228516, 47.71986770629883, 47.72074508666992, -16.220420837402344, -16.3009033203125, -16.47381019592285, -16.151391983032227, -16.551475524902344, -16.872323989868164, -16.72113609313965, -16.812108993530273, -2.4767119884490967, -2.0573806762695312, -2.120256185531616, 23.652551651000977, -30.815797805786133, 18.582536697387695, 11.252683639526367, 11.250065803527832, -31.08638572692871, 11.306476593017578, 32.15816116333008, 32.158058166503906, 32.160499572753906, 32.16132736206055, 1.114404320716858, 1.1159000396728516, 1.1144204139709473, 3.707765579223633, 3.706777811050415, 3.7092833518981934, 3.707871198654175, -0.6900306344032288, -0.6938208937644958, 6.97075891494751, -43.6390380859375, -43.648738861083984, -43.6431884765625, -43.642024993896484, -29.78645896911621, -29.788311004638672, -29.785850524902344, -29.78651237487793, -3.981477737426758, -3.9813292026519775, -3.9809391498565674, -3.9754626750946045, -3.954899549484253, 40.61298751831055, 8.353392601013184, 8.363113403320312, 8.345367431640625, 8.363751411437988, 8.358330726623535, 7.696299076080322, 7.632247447967529, 7.66513204574585, 7.526895523071289, 7.414878845214844, 7.401457786560059, -32.966697692871094, -32.96757888793945, -32.96315383911133, 8.350659370422363, 8.345595359802246, 21.501447677612305, -4.188136100769043, -4.1862382888793945, -24.91275405883789, -24.957780838012695, -25.40624237060547, -25.31730079650879, -25.46578025817871, -25.06419563293457, -25.171260833740234, 27.114675521850586, 27.118816375732422, 27.129459381103516, 27.11992073059082, 27.106351852416992, 28.24547576904297, 28.2368221282959, 7.740007400512695, 37.918582916259766, 37.73516845703125, 38.01768112182617, 37.610809326171875, 38.161746978759766, 37.707359313964844, 38.136356353759766, 2.280782461166382, 2.0871777534484863, 2.0771172046661377, 2.268904447555542, 2.517817258834839, 2.6170005798339844, 2.5001935958862305, -37.858585357666016, -37.86007308959961, -37.8526725769043, 41.321414947509766, 41.31866455078125, 4.378730297088623, 4.376791477203369, -15.97047233581543, 23.693119049072266, 23.62434959411621, 23.013669967651367, 23.287546157836914, 23.55714988708496, 23.093278884887695, 23.08075714111328, 23.426206588745117, 4.8228325843811035, -23.536996841430664, 30.532718658447266, 30.532875061035156, 5.863246440887451, 5.87172269821167, 5.90596342086792, 5.89120626449585, 5.950563907623291, 9.896159172058105, -42.53872299194336, -42.68222427368164, -42.419490814208984, -42.42757797241211, -42.70460510253906, -42.727081298828125, -15.841381072998047, -15.835287094116211, -15.842693328857422, -15.843113899230957, -56.8805046081543, -56.880680084228516, -56.96718978881836, -56.966583251953125, -56.967201232910156, -56.96607208251953, -34.4014778137207, -34.404273986816406, -34.39933395385742, 20.786226272583008, -18.257396697998047, -3.231966257095337, -3.2332890033721924, -3.2337605953216553, 13.480339050292969, 13.46947956085205, 13.463752746582031, 13.467397689819336, -7.140839099884033, -7.1340131759643555, -7.137805461883545, -7.144547939300537, 10.966567039489746, 10.964113235473633, 10.964073181152344, -7.593807697296143, -7.475741386413574, 26.700037002563477, 26.388778686523438, 26.399003982543945, 26.541568756103516, 26.612478256225586, 26.485301971435547, -29.228050231933594, -28.905580520629883, -28.86673355102539, -28.97260856628418, -29.073232650756836, -29.255985260009766, -10.51164436340332, -10.506423950195312, -10.507916450500488, 12.636123657226562, 13.084096908569336, 12.888650894165039, 12.63332748413086, 12.525419235229492, 12.869837760925293, 13.063505172729492, 21.477447509765625, -3.260969638824463, -3.289344310760498, -3.2937121391296387, 8.265580177307129, 8.26555347442627, 8.265091896057129, 8.26089859008789, 8.264379501342773, 15.879090309143066, 40.756690979003906, 16.171823501586914, 16.163026809692383, 16.17864227294922, 16.161136627197266, -35.12771224975586, -35.13051223754883, -35.129337310791016, -35.13075637817383, -2.064112663269043, -2.0672175884246826, -2.0615594387054443, -2.061549186706543, -41.511966705322266, -41.46648406982422, -41.522491455078125, -41.506954193115234, -41.49835968017578, -44.22910690307617, -44.132713317871094, -44.257633209228516, -44.37809753417969, -44.12138748168945, -44.35356140136719, -31.654338836669922, -31.655935287475586, 25.093589782714844, 25.112720489501953, 25.08452606201172, 25.108095169067383, -33.58842468261719, -32.86674499511719, -33.31140899658203, -33.04273986816406, -32.90705871582031, -33.351768493652344, -33.52650451660156, -33.1409912109375, -3.0343246459960938, -2.996530771255493, -2.480149984359741, -2.614237070083618, -2.3039567470550537, -2.1867833137512207, -2.2546725273132324, -2.8107352256774902, -2.832228422164917, 38.25524139404297, 38.254756927490234, 38.258365631103516, 38.25779342651367, 38.25140380859375, 10.485915184020996, 10.246654510498047, 10.246710777282715, 22.0941104888916, -3.312370538711548, -3.3106021881103516, -3.3089044094085693, 36.45171356201172, 36.452125549316406, 36.45109176635742, 22.43485450744629, 22.484830856323242, 22.492847442626953, 22.459518432617188, 44.18609619140625, 44.134830474853516, 32.91526412963867, 32.91239547729492, 32.91429138183594, 32.914344787597656, 5.853630065917969, 5.8541717529296875, 5.855406761169434, -25.0044002532959, -25.676538467407227, -25.375837326049805, -25.60395050048828, -25.72479820251465, -25.36860466003418, -25.102020263671875, -25.175474166870117, -0.5462236404418945, -0.5663567185401917, 6.171211242675781, 6.172460079193115, 17.732479095458984, 25.067035675048828, 25.066112518310547, 25.068279266357422, 25.06783676147461, -13.241304397583008, 2.8637478351593018, -22.630218505859375, -22.45216941833496, -23.452598571777344, -3.812363862991333, -3.8071200847625732, -3.8099379539489746, -3.8088152408599854, -31.914588928222656, -32.00900650024414, -32.00255584716797, -31.929306030273438, -31.93777084350586, -9.695391654968262, -9.695213317871094, -9.698222160339355, -9.704031944274902, -6.290727138519287, -6.289334774017334, -6.289206504821777, 51.840938568115234, 51.841007232666016, 16.183576583862305, 16.08493423461914, 15.96239948272705, 16.567825317382812, 15.923433303833008, 16.3215389251709, 16.513198852539062, 16.503833770751953, 17.31149673461914, 2.701112985610962, 2.69804310798645, 2.6990251541137695, 14.800158500671387, 14.778239250183105, 14.769285202026367, 14.755502700805664, 14.74404525756836, -42.28889083862305, -41.667884826660156, -41.3197021484375, -42.20343017578125, -41.40203094482422, -41.6536979675293, -41.94474411010742, -41.970767974853516, -42.23006820678711, -41.41392135620117, -16.54487419128418, -15.878689765930176, -16.175458908081055, -16.432373046875, -15.54955768585205, -15.796941757202148, -15.62149715423584, -16.15195083618164, -16.41082763671875, -16.6264705657959, -15.6232271194458, 44.26640319824219, 44.26650619506836, -15.97832202911377, -15.974777221679688, -15.973469734191895, 20.78985595703125, -32.82716369628906, -32.998016357421875, -32.94586944580078, -32.874332427978516, -32.55278396606445, -32.56662368774414, -9.937012672424316, -9.88402271270752, 16.089218139648438, 0.5526585578918457, 0.5786538124084473, 0.5355678200721741, 0.5427761077880859, 0.5284500122070312, 38.912620544433594, 38.91225814819336, 38.9122428894043, -1.1412163972854614, -1.137648105621338, -58.0806999206543, -58.07757568359375, -58.080257415771484, 29.652006149291992, 29.649253845214844, -43.50829315185547, -43.50859069824219, -2.3483691215515137, -2.3538334369659424, -2.345325231552124, 50.94394302368164, 50.944114685058594, 50.94401168823242, -0.14012515544891357, 0.41782256960868835, -0.006793452426791191, 0.22352191805839539, 0.4150865972042084, -0.028098810464143753, 0.23846282064914703, 29.102741241455078, 24.2869815826416, 24.290470123291016, 24.288536071777344, 24.287158966064453, 24.67450714111328, 24.67310905456543, 24.686269760131836, 24.696033477783203, 24.698144912719727, 24.69276237487793, 24.69532585144043, -12.6117525100708, -29.425800323486328, -29.41171646118164, -29.71735191345215, -29.49496078491211, -29.67399787902832, -29.67487335205078, -2.1800663471221924, 43.14146423339844, 43.1409797668457, 43.141902923583984, 43.142051696777344, 14.764512062072754, 14.712055206298828, 14.974383354187012, 14.677641868591309, 14.968358039855957, 14.914052963256836, 18.54257583618164, 19.313018798828125, 18.573827743530273, 19.436664581298828, 19.02925682067871, 18.81679916381836, 18.742238998413086, 19.27256965637207, 19.12857437133789, 18.38174819946289, -33.386436462402344, -33.38676834106445, -33.386390686035156, 23.21918487548828, -1.9525316953659058, -1.9546228647232056, -1.9526299238204956, 31.79587745666504, 31.799571990966797, 31.800458908081055, 31.81169891357422, 31.80310821533203, -7.642937660217285, -7.643837928771973, 14.393228530883789, 14.393363952636719, 14.39262580871582, -17.14393424987793, -17.146846771240234, -17.126880645751953, -17.3830509185791, -17.15226173400879, -17.386804580688477, 40.70747375488281, 40.441864013671875, 40.51896667480469, 40.396568298339844, 40.58501052856445, 40.664180755615234, -40.0111083984375, -40.01359558105469, -40.01542663574219, -40.892555236816406, -40.823089599609375, -41.155433654785156, -41.11561965942383, -40.895755767822266, -41.05400466918945, 14.066155433654785, 3.1905248165130615, 3.3420722484588623, 3.1779658794403076, 3.0235447883605957, 3.3289222717285156, 3.0389740467071533, 19.750761032104492, 19.748821258544922, 19.750980377197266, 19.756099700927734, -22.676660537719727, 53.795047760009766, 53.793678283691406, 53.79328918457031, 53.78799819946289, 53.79477310180664, -24.597257614135742, -13.87508773803711, -13.87178897857666, -13.87104320526123, -13.86453914642334, 5.26564884185791, 5.267242908477783, 5.2550129890441895, 5.262408256530762, 5.912148475646973, 5.912282943725586, -4.591015815734863, 20.169784545898438, 20.169729232788086, -10.095734596252441, -10.10655403137207, -9.912860870361328, -10.171915054321289, -9.954948425292969, -9.787740707397461, -14.027153968811035, -13.765966415405273, -13.554597854614258, -13.991493225097656, -14.178147315979004, -13.47992992401123, -14.0242919921875, -13.518078804016113, 37.791282653808594, 37.791927337646484, 37.7913932800293, 9.540423393249512, 9.539304733276367, 9.543862342834473, -3.9976565837860107, -42.002777099609375, -42.11516571044922, -42.01088333129883, -42.259422302246094, -42.178409576416016, -42.28593063354492, 0.01017790101468563, -6.014378070831299, -6.0181565284729, -6.017068386077881, -6.017688751220703, -5.319100856781006, -5.305196285247803, -5.370142459869385, -5.328769207000732, -5.30883264541626, 31.684965133666992, 31.684518814086914, 4.65003776550293, 4.646630764007568, 4.646810054779053, 4.63346004486084, 4.635987281799316, 16.363956451416016, -8.225297927856445, -8.223050117492676, -8.224055290222168, -38.75217056274414, -38.75292205810547, 26.35517120361328, 26.354175567626953, -36.06904983520508, -36.02882766723633, -36.07080078125, -36.02425003051758, -36.03730010986328, -41.57865905761719, 38.947105407714844, 38.94660186767578, 38.9467658996582, -2.63562273979187, 16.951412200927734, 16.9505558013916, 42.466392517089844, -11.783584594726562, -11.783821105957031, -11.784163475036621, -11.78378677368164, -11.786603927612305, -5.468772888183594, -5.469125270843506, 18.315643310546875, 18.314359664916992, 18.315258026123047, 18.312314987182617, -8.266495704650879, -8.269063949584961, 5.57085657119751, 5.562460422515869, 5.5692057609558105, 5.563599109649658, 5.572672367095947, 2.858668565750122, 2.858051300048828, 2.8598806858062744, 28.558040618896484, 28.431123733520508, 28.40139389038086, 28.690183639526367, 28.714065551757812, 28.570720672607422, -17.155519485473633, -17.154388427734375, -17.15578269958496, 23.19464683532715, 23.196462631225586, 23.192834854125977, 7.129627704620361, 7.113959312438965, 6.838094711303711, 6.817015647888184, 6.960991382598877, 6.958813190460205, -16.182315826416016, 25.790599822998047, 25.773880004882812, 25.76763916015625, -21.042509078979492, -20.641368865966797, -20.6408748626709, -21.188987731933594, 33.64412307739258, 33.64402389526367, 33.64323043823242, 31.053171157836914, 31.054990768432617, 31.04871368408203, -7.634324550628662, -9.994010925292969, -18.211313247680664, -18.667438507080078, -18.44378089904785, -18.22260856628418, -18.347057342529297, -18.885540008544922, -18.723316192626953, -18.985374450683594, -19.04397201538086, -29.187984466552734, -29.186664581298828, -29.184585571289062, 15.691022872924805, 15.691450119018555, 15.690035820007324, 12.404831886291504, 12.404377937316895, -46.19942092895508, -46.198490142822266, -46.19878005981445, -46.19814682006836, 12.486980438232422, 12.482490539550781, 12.478582382202148, 30.3718318939209, 30.3714599609375, 18.57948875427246, 18.577653884887695, 18.576993942260742, -34.575408935546875, -34.57048034667969, -34.57372283935547, -23.363584518432617, 46.93637466430664, 46.93878173828125, 46.94318389892578, 46.94384765625, 46.94392013549805, -21.92167854309082, -22.03019142150879, -22.00393295288086, -21.986528396606445, -21.918025970458984, -30.71994972229004, -31.03073501586914, -30.41677474975586, -30.544414520263672, -31.22401237487793, -31.275737762451172, -31.09688949584961, -30.486469268798828, -30.83112144470215, 10.062305450439453, -20.17676544189453, -20.176116943359375, -20.1763916015625, 11.774186134338379, -33.67466354370117, 4.007706165313721, 27.699604034423828, 10.273591041564941, 10.275212287902832, -8.675962448120117, -8.720319747924805, -8.714585304260254, -8.704304695129395, -8.696915626525879, 17.094078063964844, 17.09287452697754, 17.092988967895508, 7.683358192443848, 7.681529998779297, 15.697549819946289, -11.283888816833496, -11.283696174621582, -36.88261795043945, -36.88181686401367, -36.88169860839844, -36.881771087646484, 15.406106948852539, -1.4628554582595825, -1.4641731977462769, -1.464605689048767, -1.4674345254898071, -31.229022979736328, -31.7437744140625, -31.277606964111328, -31.892589569091797, -31.784860610961914, -31.135757446289062, -31.535009384155273, -31.53071403503418, 7.514825820922852, 29.542049407958984, 29.53042221069336, -14.22795295715332, -41.614105224609375, -41.61539077758789, -41.62065887451172, -41.617897033691406, 21.637998580932617, 21.636682510375977, 21.62732696533203, 21.625125885009766, 21.627391815185547, 16.166133880615234, 16.16585350036621, -49.79198455810547, -49.6036262512207, -49.79666519165039, -49.537574768066406, -49.62736129760742, -49.886531829833984, 3.030226707458496, -7.663838863372803, -6.940779685974121, 16.702016830444336, -51.27207946777344, -51.27406311035156, -51.27574157714844, -51.27615737915039, 25.513582229614258, -20.066390991210938, -20.06627082824707, -20.065622329711914, 34.646629333496094, 34.646156311035156, -23.231964111328125, -23.75086784362793, -23.469804763793945, -23.219497680664062, -23.71854019165039, -23.83003044128418, -23.461713790893555, -23.103321075439453, -10.394655227661133, 22.73990821838379, 22.7401065826416, 22.744178771972656, 22.745420455932617, 20.886714935302734, -4.89597749710083, -4.893609523773193, -4.895732879638672, -0.48506009578704834, -0.48914825916290283, 35.203407287597656, 35.20281219482422, 35.20284652709961, 35.20296859741211, 5.995255947113037 ] }, { "hovertemplate": "%{text}", "marker": { "color": "#00ff00", "line": { "color": "white", "width": 1 }, "opacity": 0.8, "size": 10 }, "mode": "markers", "name": "Candidates", "text": [ "Candidate 0", "Candidate 1", "Candidate 2", "Candidate 3", "Candidate 4", "Candidate 5", "Candidate 6", "Candidate 7", "Candidate 8", "Candidate 9", "Candidate 10", "Candidate 11", "Candidate 12", "Candidate 13", "Candidate 14", "Candidate 15", "Candidate 16", "Candidate 17", "Candidate 18", "Candidate 19", "Candidate 20", "Candidate 21", "Candidate 22", "Candidate 23", "Candidate 24", "Candidate 25", "Candidate 26", "Candidate 27", "Candidate 28", "Candidate 29", "Candidate 30", "Candidate 31", "Candidate 32", "Candidate 33", "Candidate 34", "Candidate 35", "Candidate 36", "Candidate 37", "Candidate 38", "Candidate 39", "Candidate 40", "Candidate 41", "Candidate 42", "Candidate 43", "Candidate 44", "Candidate 45", "Candidate 46", "Candidate 47", "Candidate 48", "Candidate 49", "Candidate 50", "Candidate 51", "Candidate 52", "Candidate 53", "Candidate 54", "Candidate 55", "Candidate 56", "Candidate 57", "Candidate 58", "Candidate 59", "Candidate 60", "Candidate 61", "Candidate 62", "Candidate 63", "Candidate 64", "Candidate 65", "Candidate 66", "Candidate 67", "Candidate 68", "Candidate 69", "Candidate 70", "Candidate 71", "Candidate 72", "Candidate 73", "Candidate 74", "Candidate 75", "Candidate 76", "Candidate 77", "Candidate 78", "Candidate 79", "Candidate 80", "Candidate 81", "Candidate 82", "Candidate 83", "Candidate 84", "Candidate 85", "Candidate 86", "Candidate 87", "Candidate 88", "Candidate 89", "Candidate 90", "Candidate 91", "Candidate 92", "Candidate 93", "Candidate 94", "Candidate 95", "Candidate 96", "Candidate 97", "Candidate 98", "Candidate 99", "Candidate 100", "Candidate 101", "Candidate 102", "Candidate 103", "Candidate 104", "Candidate 105", "Candidate 106", "Candidate 107", "Candidate 108", "Candidate 109", "Candidate 110", "Candidate 111", "Candidate 112", "Candidate 113", "Candidate 114", "Candidate 115", "Candidate 116", "Candidate 117", "Candidate 118", "Candidate 119", "Candidate 120", "Candidate 121", "Candidate 122", "Candidate 123", "Candidate 124", "Candidate 125", "Candidate 126", "Candidate 127", "Candidate 128", "Candidate 129", "Candidate 130", "Candidate 131", "Candidate 132", "Candidate 133", "Candidate 134", "Candidate 135", "Candidate 136", "Candidate 137", "Candidate 138", "Candidate 139", "Candidate 140", "Candidate 141", "Candidate 142", "Candidate 143", "Candidate 144", "Candidate 145", "Candidate 146", "Candidate 147", "Candidate 148", "Candidate 149", "Candidate 150", "Candidate 151", "Candidate 152", "Candidate 153", "Candidate 154", "Candidate 155", "Candidate 156", "Candidate 157", "Candidate 158", "Candidate 159", "Candidate 160", "Candidate 161", "Candidate 162", "Candidate 163", "Candidate 164", "Candidate 165", "Candidate 166", "Candidate 167", "Candidate 168", "Candidate 169", "Candidate 170", "Candidate 171", "Candidate 172", "Candidate 173", "Candidate 174", "Candidate 175", "Candidate 176", "Candidate 177", "Candidate 178", "Candidate 179", "Candidate 180", "Candidate 181", "Candidate 182", "Candidate 183", "Candidate 184", "Candidate 185", "Candidate 186", "Candidate 187", "Candidate 188", "Candidate 189", "Candidate 190", "Candidate 191", "Candidate 192", "Candidate 193", "Candidate 194", "Candidate 195", "Candidate 196", "Candidate 197", "Candidate 198", "Candidate 199", "Candidate 200", "Candidate 201", "Candidate 202", "Candidate 203", "Candidate 204", "Candidate 205", "Candidate 206", "Candidate 207", "Candidate 208", "Candidate 209", "Candidate 210", "Candidate 211", "Candidate 212", "Candidate 213", "Candidate 214", "Candidate 215", "Candidate 216", "Candidate 217", "Candidate 218", "Candidate 219", "Candidate 220", "Candidate 221", "Candidate 222", "Candidate 223", "Candidate 224", "Candidate 225", "Candidate 226", "Candidate 227", "Candidate 228", "Candidate 229", "Candidate 230", "Candidate 231", "Candidate 232", "Candidate 233", "Candidate 234", "Candidate 235", "Candidate 236", "Candidate 237", "Candidate 238", "Candidate 239", "Candidate 240", "Candidate 241", "Candidate 242", "Candidate 243", "Candidate 244", "Candidate 245", "Candidate 246", "Candidate 247", "Candidate 248", "Candidate 249", "Candidate 250", "Candidate 251", "Candidate 252", "Candidate 253", "Candidate 254", "Candidate 255", "Candidate 256", "Candidate 257", "Candidate 258", "Candidate 259", "Candidate 260", "Candidate 261", "Candidate 262", "Candidate 263", "Candidate 264", "Candidate 265", "Candidate 266", "Candidate 267", "Candidate 268", "Candidate 269", "Candidate 270", "Candidate 271", "Candidate 272", "Candidate 273", "Candidate 274", "Candidate 275", "Candidate 276", "Candidate 277", "Candidate 278", "Candidate 279", "Candidate 280", "Candidate 281", "Candidate 282", "Candidate 283", "Candidate 284", "Candidate 285", "Candidate 286", "Candidate 287", "Candidate 288", "Candidate 289", "Candidate 290", "Candidate 291", "Candidate 292", "Candidate 293", "Candidate 294", "Candidate 295", "Candidate 296", "Candidate 297", "Candidate 298", "Candidate 299", "Candidate 300", "Candidate 301", "Candidate 302", "Candidate 303", "Candidate 304", "Candidate 305", "Candidate 306", "Candidate 307", "Candidate 308", "Candidate 309", "Candidate 310", "Candidate 311", "Candidate 312", "Candidate 313", "Candidate 314", "Candidate 315", "Candidate 316", "Candidate 317", "Candidate 318", "Candidate 319", "Candidate 320", "Candidate 321", "Candidate 322", "Candidate 323", "Candidate 324", "Candidate 325", "Candidate 326", "Candidate 327", "Candidate 328", "Candidate 329", "Candidate 330", "Candidate 331", "Candidate 332", "Candidate 333", "Candidate 334", "Candidate 335", "Candidate 336", "Candidate 337", "Candidate 338", "Candidate 339", "Candidate 340", "Candidate 341", "Candidate 342", "Candidate 343", "Candidate 344", "Candidate 345", "Candidate 346", "Candidate 347", "Candidate 348", "Candidate 349", "Candidate 350", "Candidate 351", "Candidate 352", "Candidate 353", "Candidate 354", "Candidate 355", "Candidate 356", "Candidate 357", "Candidate 358", "Candidate 359", "Candidate 360", "Candidate 361", "Candidate 362", "Candidate 363", "Candidate 364", "Candidate 365", "Candidate 366", "Candidate 367", "Candidate 368", "Candidate 369", "Candidate 370", "Candidate 371", "Candidate 372", "Candidate 373", "Candidate 374", "Candidate 375", "Candidate 376", "Candidate 377", "Candidate 378", "Candidate 379", "Candidate 380", "Candidate 381", "Candidate 382", "Candidate 383", "Candidate 384", "Candidate 385", "Candidate 386", "Candidate 387", "Candidate 388", "Candidate 389", "Candidate 390", "Candidate 391", "Candidate 392", "Candidate 393", "Candidate 394", "Candidate 395", "Candidate 396", "Candidate 397", "Candidate 398", "Candidate 399", "Candidate 400", "Candidate 401", "Candidate 402", "Candidate 403", "Candidate 404", "Candidate 405", "Candidate 406", "Candidate 407", "Candidate 408", "Candidate 409", "Candidate 410", "Candidate 411", "Candidate 412", "Candidate 413", "Candidate 414", "Candidate 415", "Candidate 416", "Candidate 417", "Candidate 418", "Candidate 419", "Candidate 420", "Candidate 421", "Candidate 422", "Candidate 423", "Candidate 424", "Candidate 425", "Candidate 426", "Candidate 427", "Candidate 428", "Candidate 429", "Candidate 430", "Candidate 431", "Candidate 432", "Candidate 433", "Candidate 434", "Candidate 435", "Candidate 436", "Candidate 437", "Candidate 438", "Candidate 439", "Candidate 440", "Candidate 441", "Candidate 442", "Candidate 443", "Candidate 444", "Candidate 445", "Candidate 446", "Candidate 447", "Candidate 448", "Candidate 449", "Candidate 450", "Candidate 451", "Candidate 452", "Candidate 453", "Candidate 454", "Candidate 455", "Candidate 456", "Candidate 457", "Candidate 458", "Candidate 459", "Candidate 460", "Candidate 461", "Candidate 462", "Candidate 463", "Candidate 464", "Candidate 465", "Candidate 466", "Candidate 467", "Candidate 468", "Candidate 469", "Candidate 470", "Candidate 471", "Candidate 472", "Candidate 473", "Candidate 474", "Candidate 475", "Candidate 476", "Candidate 477", "Candidate 478", "Candidate 479", "Candidate 480", "Candidate 481", "Candidate 482", "Candidate 483", "Candidate 484", "Candidate 485", "Candidate 486", "Candidate 487", "Candidate 488", "Candidate 489", "Candidate 490", "Candidate 491", "Candidate 492", "Candidate 493", "Candidate 494", "Candidate 495", "Candidate 496", "Candidate 497", "Candidate 498", "Candidate 499" ], "type": "scatter", "x": [ 41.186309814453125, 48.7649040222168, 58.316646575927734, 78.5217514038086, 45.868263244628906, 62.17395782470703, 43.80234909057617, 70.7208480834961, 50.60479736328125, 46.90532302856445, 81.60072326660156, 59.662071228027344, 50.84657669067383, 53.686279296875, 42.95430374145508, 81.39750671386719, 67.56729888916016, 57.606475830078125, 42.95831298828125, 57.782222747802734, 75.28368377685547, 60.29971694946289, 57.064308166503906, 74.5436019897461, 47.58145523071289, 56.73363494873047, 57.575626373291016, 60.73923110961914, 72.17411041259766, 59.215362548828125, 46.65153503417969, 43.19902420043945, 76.21859741210938, 44.94456100463867, 59.328670501708984, 54.44642639160156, 51.41210174560547, 49.53907775878906, 40.778316497802734, 77.38782501220703, 69.30795288085938, 52.119300842285156, 70.24610137939453, 62.90265655517578, 69.92957305908203, 40.96602249145508, 39.716941833496094, 56.91524124145508, 79.66697692871094, 46.232303619384766, 43.00526428222656, 84.82901000976562, 64.25175476074219, 45.929603576660156, 43.387351989746094, 62.17520523071289, 47.62195587158203, 44.57310485839844, 62.88313293457031, 74.54369354248047, 47.49254608154297, 54.291629791259766, 57.11681365966797, 54.734100341796875, 59.33404541015625, 44.617393493652344, 57.03125762939453, 73.83674621582031, 47.53178787231445, 71.25872802734375, 46.081077575683594, 58.01638412475586, 47.6691780090332, 51.8404426574707, 64.71923828125, 68.84765625, 49.98569869995117, 85.12652587890625, 54.67087936401367, 50.26119613647461, 79.08657836914062, 57.02825164794922, 66.48333740234375, 42.89822769165039, 82.3714370727539, 62.277305603027344, 60.5435676574707, 41.95161056518555, 50.29314422607422, 43.527671813964844, 41.62749481201172, 51.86753463745117, 42.44172286987305, 47.6842155456543, 47.832916259765625, 69.65628051757812, 74.05398559570312, 57.45872116088867, 68.69152069091797, 49.164791107177734, 62.173194885253906, 64.45359802246094, 57.73619842529297, 66.71459197998047, 65.0294189453125, 81.60086822509766, 47.62361145019531, 69.83934020996094, 65.38196563720703, 80.5767822265625, 83.85741424560547, 47.35179901123047, 46.10436248779297, 67.55209350585938, 78.83796691894531, 73.81653594970703, 46.00177764892578, 51.366085052490234, 58.193115234375, 64.42841339111328, 50.72207260131836, 81.2164535522461, 45.32265853881836, 54.78656005859375, 62.980262756347656, 43.76631164550781, 57.416542053222656, 63.92678451538086, 58.70901107788086, 68.42898559570312, 59.005855560302734, 70.7701416015625, 50.97396469116211, 64.9439697265625, 83.85741424560547, 72.08883666992188, 57.06011199951172, 51.03055953979492, 60.977622985839844, 55.50402069091797, 52.6026725769043, 43.91911315917969, 77.2295150756836, 62.1813850402832, 47.73841094970703, 41.46736526489258, 67.41845703125, 49.3739013671875, 66.51654052734375, 87.18785095214844, 68.16243743896484, 69.22865295410156, 75.51924133300781, 43.7775993347168, 42.96754837036133, 58.747718811035156, 49.0945930480957, 49.62605285644531, 66.85391998291016, 61.365943908691406, 66.81707763671875, 76.93666076660156, 52.06018829345703, 45.680503845214844, 61.46284866333008, 59.56631851196289, 73.81979370117188, 67.0411148071289, 62.42057418823242, 52.87530517578125, 64.63054656982422, 50.91524887084961, 65.6646957397461, 41.625816345214844, 50.964820861816406, 54.52518844604492, 61.47459030151367, 41.31926727294922, 65.033203125, 51.76608657836914, 71.47672271728516, 61.9365119934082, 66.08966827392578, 52.972084045410156, 79.0868911743164, 55.16151428222656, 66.57820129394531, 48.66446304321289, 41.57341384887695, 48.080753326416016, 75.7784194946289, 66.09010314941406, 68.8252182006836, 48.6120719909668, 55.47120666503906, 51.163570404052734, 53.49332809448242, 73.92813873291016, 66.96876525878906, 55.00785446166992, 60.992897033691406, 81.4289321899414, 60.17000961303711, 47.80009078979492, 82.1672134399414, 45.07600021362305, 51.89250946044922, 68.10161590576172, 61.485050201416016, 53.67943572998047, 62.20351791381836, 41.943809509277344, 58.699615478515625, 59.611289978027344, 64.50618743896484, 86.22273254394531, 58.34632110595703, 69.79548645019531, 81.42657470703125, 75.3263168334961, 43.410675048828125, 41.571590423583984, 58.676021575927734, 59.22542190551758, 50.148353576660156, 46.175506591796875, 58.08156204223633, 79.8652572631836, 69.45425415039062, 43.61137390136719, 73.80783081054688, 70.5758056640625, 63.05298614501953, 68.17485046386719, 59.34984588623047, 71.81078338623047, 56.431358337402344, 58.249053955078125, 80.15582275390625, 83.12422180175781, 73.49559020996094, 67.62193298339844, 86.34648132324219, 64.04608917236328, 47.759273529052734, 86.16856384277344, 44.574039459228516, 68.8252182006836, 48.20679473876953, 54.55522918701172, 71.22412872314453, 54.550514221191406, 65.1240234375, 52.67127227783203, 68.06970977783203, 58.68049621582031, 52.86639404296875, 73.49559020996094, 48.86499786376953, 82.1672134399414, 70.7208480834961, 73.82334899902344, 83.19234466552734, 69.24627685546875, 66.65544891357422, 59.9713020324707, 51.41242980957031, 71.5577392578125, 78.2261734008789, 76.63215637207031, 56.3738899230957, 52.776424407958984, 73.81979370117188, 73.29620361328125, 48.12745666503906, 48.301631927490234, 50.89945602416992, 58.042476654052734, 46.72831344604492, 50.8774528503418, 41.14567184448242, 64.02256774902344, 75.86663818359375, 60.81095886230469, 63.945289611816406, 78.31026458740234, 80.5767822265625, 61.512969970703125, 57.34416198730469, 65.78003692626953, 56.73273849487305, 59.08659362792969, 48.97831344604492, 58.347145080566406, 85.12652587890625, 47.60506057739258, 74.54369354248047, 57.51758575439453, 64.24957275390625, 55.44149398803711, 60.63573455810547, 73.67481231689453, 81.47534942626953, 75.48149871826172, 56.846595764160156, 78.80925750732422, 44.83224105834961, 41.23395538330078, 71.34185791015625, 43.95538330078125, 48.91103744506836, 76.21859741210938, 68.49401092529297, 57.69244384765625, 60.60251998901367, 77.20118713378906, 68.68830108642578, 47.584163665771484, 81.40174102783203, 64.3756332397461, 63.8189582824707, 78.80927276611328, 75.40087890625, 82.3717041015625, 82.1672134399414, 76.21859741210938, 59.15321731567383, 48.824256896972656, 64.53904724121094, 40.09119415283203, 68.87112426757812, 53.16276168823242, 54.69649124145508, 80.4161605834961, 78.9664077758789, 82.3717041015625, 81.30423736572266, 53.86909103393555, 48.72381591796875, 71.47592163085938, 60.90287780761719, 44.574039459228516, 61.740989685058594, 44.51225662231445, 53.68506622314453, 69.79618072509766, 77.59280395507812, 56.54179763793945, 51.87397003173828, 56.96883010864258, 51.03879165649414, 80.63733673095703, 51.43937683105469, 42.49432373046875, 77.8983383178711, 50.21311569213867, 48.84404373168945, 59.147708892822266, 41.1354866027832, 81.64849090576172, 58.46875, 60.76747131347656, 76.2755126953125, 71.48188781738281, 79.35529327392578, 49.3580207824707, 76.21859741210938, 65.74048614501953, 75.3469009399414, 59.1800537109375, 50.27642059326172, 71.94239044189453, 50.885372161865234, 51.83597183227539, 70.4898681640625, 41.51249313354492, 57.577392578125, 44.8387565612793, 52.95853042602539, 81.60145568847656, 74.1024398803711, 62.33481216430664, 59.89646911621094, 67.9429702758789, 43.59846496582031, 44.73035430908203, 68.18619537353516, 76.91547393798828, 60.88125228881836, 50.740196228027344, 48.359130859375, 48.645233154296875, 38.97972869873047, 61.789310455322266, 62.95248794555664, 66.08944702148438, 76.1357421875, 67.9873046875, 62.519920349121094, 65.51800537109375, 71.99424743652344, 40.49934005737305, 51.62420654296875, 70.7208480834961, 72.681640625, 81.96387481689453, 60.330448150634766, 57.86384963989258, 85.61955261230469, 60.57633590698242, 41.586002349853516, 77.87380981445312, 79.08675384521484, 48.518856048583984, 68.8252182006836, 57.70625686645508, 48.89633560180664, 42.551551818847656, 49.76506423950195, 78.80927276611328, 80.5767822265625, 55.04253387451172, 49.81794738769531, 71.46985626220703, 42.20147705078125, 72.04183959960938, 61.327301025390625, 77.0030746459961, 68.26632690429688, 52.789710998535156, 42.68382263183594, 80.23880004882812, 71.96002197265625, 72.38919067382812, 58.7811164855957, 57.16387939453125, 56.37018966674805, 56.2625617980957, 60.05529022216797, 61.79309844970703, 60.037696838378906, 62.76782989501953, 57.793373107910156, 51.91481018066406, 61.63617706298828, 56.876304626464844, 49.24814224243164, 49.09895324707031, 44.47395706176758, 41.7202033996582, 83.12308502197266, 49.76930236816406, 57.642616271972656, 57.47712326049805, 63.59986114501953, 48.831485748291016, 81.42448425292969, 72.1009521484375, 66.0814208984375, 64.61048126220703, 82.58796691894531, 74.09024047851562, 41.689151763916016, 52.05326461791992, 77.95873260498047, 71.9950180053711, 45.7216796875, 67.99883270263672, 85.12652587890625, 80.63733673095703, 60.95846176147461, 68.86085510253906, 44.1016960144043, 52.59684753417969, 64.88355255126953, 87.18785095214844, 46.276275634765625, 68.11552429199219, 81.4289321899414, 58.111045837402344, 55.06145477294922, 57.33681106567383, 60.271480560302734, 81.4289321899414, 52.789066314697266, 71.53141021728516, 61.96543884277344, 80.51499938964844, 59.055049896240234, 78.67124938964844, 43.576778411865234, 79.22743225097656, 65.21576690673828, 58.197635650634766, 58.91236114501953, 45.27826690673828, 53.65314483642578, 57.217498779296875, 67.17142486572266, 73.15074157714844 ], "y": [ -1.4922877550125122, -8.938495635986328, -15.353409767150879, -9.688542366027832, -24.66072654724121, 6.395302772521973, -23.499284744262695, 5.3420820236206055, -2.422621250152588, 7.6119890213012695, -10.742048263549805, -7.256931781768799, -12.694358825683594, 5.151981830596924, -15.540237426757812, 10.627208709716797, 6.6707892417907715, -15.860703468322754, -15.536866188049316, -2.665024995803833, -5.545052528381348, 12.479792594909668, -14.659369468688965, 1.6679441928863525, -11.179291725158691, 6.987683296203613, -7.948056697845459, -1.8479552268981934, 9.623579025268555, -3.369191884994507, 1.0154191255569458, 6.985005855560303, 4.910045146942139, -22.729000091552734, 2.179490089416504, -8.550671577453613, -4.876826763153076, -0.2785590887069702, -5.960836887359619, -2.666624069213867, -0.9398494958877563, -2.6598541736602783, 8.979642868041992, 5.110325813293457, -1.5967988967895508, -5.0648016929626465, -4.874930381774902, 6.949294090270996, -5.197410583496094, -1.3189396858215332, 6.647744655609131, -2.7565314769744873, 9.369978904724121, -23.756858825683594, 6.358474254608154, -0.3018849790096283, -2.3409574031829834, -22.67617416381836, -16.37928581237793, 1.669389009475708, -4.3933305740356445, -0.35989102721214294, -9.137138366699219, 1.3870636224746704, 13.195000648498535, -23.547855377197266, 3.58369779586792, -4.301017761230469, -3.6198253631591797, -1.3659148216247559, -4.995721340179443, -3.732149362564087, 9.274750709533691, -4.036750316619873, 1.8578561544418335, 5.550895690917969, 0.8769170045852661, -1.6177644729614258, -5.45681619644165, -3.034783124923706, -12.714402198791504, 3.5991642475128174, -15.568131446838379, -4.499922275543213, -5.461869716644287, 0.5897817015647888, -12.611681938171387, 6.828384876251221, 4.284623622894287, 7.527255058288574, 9.298942565917969, -4.019241809844971, -4.238113880157471, 9.088226318359375, 8.882399559020996, -1.115654468536377, -13.819854736328125, 13.414260864257812, -2.2700915336608887, 10.355640411376953, -11.89366626739502, 0.27045926451683044, -2.5885918140411377, -9.16625690460205, -15.53017807006836, -10.741829872131348, -11.261371612548828, -8.950119018554688, -13.965587615966797, -6.9723734855651855, -5.784872531890869, -0.008971304632723331, -21.929819107055664, 6.767290115356445, -10.391362190246582, 4.836461067199707, 0.6499705910682678, -11.801728248596191, -8.56159496307373, -4.714643955230713, -11.553486824035645, 9.473810195922852, -24.592161178588867, -5.39044189453125, -16.354440689086914, -21.336639404296875, -6.877792835235596, -8.799839973449707, -19.48927116394043, -2.8274405002593994, -18.86732292175293, -4.222970962524414, 4.972423553466797, -8.851733207702637, -5.784872531890869, 9.505176544189453, -11.183988571166992, -6.796271800994873, 1.99408757686615, -0.980618953704834, 1.3536030054092407, -22.435224533081055, -3.898395299911499, 12.94310474395752, -11.15131664276123, -4.672303676605225, -13.640619277954102, 1.3141183853149414, -2.1714813709259033, -2.3526201248168945, -12.96081829071045, -3.803976535797119, -2.640454053878784, -4.442056655883789, -15.530608177185059, -15.6439790725708, -3.6144118309020996, -1.6450414657592773, -0.9917809963226318, -9.678658485412598, -13.516290664672852, -9.269390106201172, -13.9585599899292, -22.614755630493164, 2.866201400756836, 0.008342435583472252, 9.41305923461914, -0.9467827677726746, -1.4674768447875977, -6.168642520904541, -0.8572776317596436, -1.5977007150650024, -3.193188428878784, -5.082321643829346, -1.6034015417099, -5.584026336669922, 7.043933868408203, 9.689094543457031, -7.5792059898376465, 0.29799947142601013, 10.321651458740234, -10.47062873840332, 4.304385185241699, -2.215846061706543, -12.71452808380127, 0.036669787019491196, -3.707127809524536, 8.677877426147461, -2.42038631439209, -3.404017925262451, -6.684049129486084, 4.306626796722412, 12.066198348999023, 10.404549598693848, -0.9336318969726562, 5.060445308685303, -3.3490869998931885, -4.36621618270874, -9.277847290039062, -9.885419845581055, 13.360785484313965, -7.931065082550049, -4.273126602172852, -4.967136859893799, -4.031393051147461, -21.901931762695312, -8.307486534118652, -14.966888427734375, 6.931680202484131, 5.143932819366455, -4.648625373840332, 6.641810894012451, -4.748589992523193, 13.787907600402832, -1.081494688987732, -0.39815959334373474, -15.13099479675293, 3.232675790786743, 8.219654083251953, -7.372599124908447, -22.13315200805664, 8.97138500213623, 12.148516654968262, 13.928171157836914, -5.881428241729736, -7.232564449310303, 14.014115333557129, 8.103519439697266, -4.568449974060059, -1.8053356409072876, 4.858993053436279, -3.8009073734283447, -7.4605231285095215, -4.3415608406066895, 13.367738723754883, -4.199997425079346, -0.012585623189806938, -14.47304916381836, -9.015084266662598, -6.339079856872559, 7.049975395202637, -2.279182195663452, -1.7843098640441895, -4.636688232421875, 9.295817375183105, -0.5218385457992554, -10.110942840576172, 12.066198348999023, -1.5609058141708374, -5.557375431060791, -6.838753700256348, -1.1819634437561035, -14.79620361328125, -0.3000124990940094, -14.898069381713867, -19.331403732299805, -6.008271217346191, 7.049975395202637, -5.380728244781494, -4.031393051147461, 5.3420820236206055, 5.566312789916992, -5.054574489593506, -3.5161924362182617, -9.101946830749512, -10.763110160827637, 2.52839732170105, 5.414730548858643, -6.655285835266113, -11.535677909851074, -9.755128860473633, -19.06597900390625, 9.41305923461914, -9.24907112121582, 4.853929042816162, -1.5498037338256836, 4.914575099945068, 13.516192436218262, 1.210645079612732, -12.025420188903809, -1.4286571741104126, -1.016004204750061, -9.31163215637207, -12.079316139221191, 5.961300373077393, -7.845369815826416, -6.9723734855651855, 14.198647499084473, -9.261303901672363, -4.7705302238464355, 6.681382656097412, 1.2212142944335938, 7.413909912109375, -19.52057647705078, -1.6177644729614258, 9.876154899597168, 1.669389009475708, -9.667237281799316, 9.379773139953613, 1.9664133787155151, -0.44351232051849365, -5.874195098876953, 10.482830047607422, -9.337278366088867, 7.005931854248047, -9.36722469329834, -21.32433319091797, -1.6076351404190063, -7.10358190536499, -2.8070473670959473, -2.7751731872558594, 4.910045146942139, -0.9476318955421448, 13.542257308959961, 12.750654220581055, -6.424211502075195, -1.3280645608901978, 0.800913393497467, 9.855602264404297, -0.3111674189567566, -7.897068023681641, -9.43624210357666, -5.496551036834717, -5.462174415588379, -4.031393051147461, 4.910045146942139, -7.758368015289307, -8.79951000213623, 0.6836874485015869, -4.817965030670166, 5.538528919219971, -1.0725709199905396, -8.844706535339355, -0.6047681570053101, -7.077367782592773, -5.462174415588379, 10.764768600463867, 2.6166861057281494, 2.554049253463745, -11.947504997253418, -16.50889778137207, -10.110942840576172, 2.9954326152801514, 5.64359188079834, 5.171072006225586, 3.232435941696167, -10.326900482177734, 7.143674373626709, -8.188432693481445, 1.477211833000183, -13.156472206115723, -1.034590721130371, 2.7793827056884766, 7.262403964996338, -4.755943775177002, -11.791107177734375, -5.314609527587891, 3.8878204822540283, -5.761231422424316, 8.009504318237305, 12.813529968261719, -2.804271936416626, -5.446318626403809, -11.8971586227417, -3.92665433883667, 2.666370153427124, 4.910045146942139, -3.845210075378418, -2.489241600036621, -5.114235877990723, 2.6689395904541016, -8.32136344909668, -6.605078220367432, -4.2430620193481445, 0.12305454164743423, 6.716599464416504, -19.076799392700195, -22.450218200683594, -2.1955835819244385, -10.74201774597168, -13.812590599060059, -2.7556896209716797, -16.50310707092285, -3.854200839996338, -3.037829875946045, -24.11436653137207, -5.826210021972656, -8.772568702697754, -10.600828170776367, -10.842354774475098, 4.539046287536621, 9.334234237670898, -4.828393936157227, -11.70596694946289, 5.113749027252197, 4.304637432098389, -6.268877029418945, -14.654519081115723, -1.4632513523101807, -9.810099601745605, 2.0312952995300293, -4.361074924468994, -1.26705002784729, 5.3420820236206055, 1.7866439819335938, 9.592169761657715, -10.100116729736328, -19.079622268676758, -2.3838260173797607, -1.8937102556228638, -4.766422271728516, -4.507429599761963, -12.714559555053711, 8.062276840209961, 12.066198348999023, -2.583662509918213, -6.482687950134277, 8.927447319030762, -0.5707994103431702, -9.43624210357666, -6.9723734855651855, -2.7128207683563232, 1.008800745010376, -11.874671936035156, -6.4043354988098145, -8.502972602844238, 13.951906204223633, -3.1364872455596924, -6.692933082580566, -19.060230255126953, 5.655462265014648, 8.769350051879883, -0.2937658727169037, 9.523269653320312, -5.003790855407715, -5.907060623168945, 0.015312752686440945, -10.016016006469727, -5.994969844818115, -2.2053754329681396, -10.739713668823242, -9.180935859680176, -3.82590389251709, -8.3259916305542, 2.953557252883911, -10.812188148498535, -5.778775215148926, -3.751978874206543, -22.54413414001465, 9.260998725891113, -6.339064598083496, -4.160421371459961, 5.046655178070068, 13.231433868408203, -0.6861903071403503, -8.769933700561523, 9.062976837158203, 9.626708030700684, -9.305784225463867, -16.002111434936523, 10.400837898254395, -7.210542678833008, 7.331563472747803, -13.92387866973877, -7.725407600402832, 2.031341791152954, -1.095839023590088, 0.3797302544116974, -1.6177644729614258, -1.034590721130371, 13.930790901184082, 4.175154209136963, -22.078479766845703, 1.3341844081878662, -4.416968822479248, -2.3526201248168945, -7.298153400421143, 1.6763633489608765, -7.931065082550049, 6.687289714813232, -2.7084994316101074, -18.905248641967773, -16.608074188232422, -7.931065082550049, -19.058612823486328, -8.3328857421875, -4.530581474304199, 8.255379676818848, -1.9998531341552734, -8.691783905029297, -1.8676494359970093, -3.655334234237671, -8.735392570495605, -18.485294342041016, -2.4930920600891113, -23.77134895324707, 2.1285438537597656, -5.3477091789245605, 1.5604074001312256, -9.120884895324707 ] } ], "layout": { "font": { "color": "white" }, "height": 800, "paper_bgcolor": "#0d0d0d", "plot_bgcolor": "#1a1a1a", "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Vector Space: Candidates & Companies (Enriched with Postings)" }, "width": 1200, "xaxis": { "title": { "text": "Dimension 1" } }, "yaxis": { "title": { "text": "Dimension 2" } } } } }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "✅ Visualization complete!\n", "💡 If green & red OVERLAP → Alignment worked!\n" ] } ], "source": [ "# Create interactive plot\n", "fig = go.Figure()\n", "\n", "# Companies (red)\n", "fig.add_trace(go.Scatter(\n", " x=comp_2d[:, 0],\n", " y=comp_2d[:, 1],\n", " mode='markers',\n", " name='Companies',\n", " marker=dict(size=6, color='#ff6b6b', opacity=0.6),\n", " text=[f\"Company: {companies_full.iloc[i].get('name', 'N/A')[:30]}\" \n", " for i in range(n_comp_viz)],\n", " hovertemplate='%{text}'\n", "))\n", "\n", "# Candidates (green)\n", "fig.add_trace(go.Scatter(\n", " x=cand_2d[:, 0],\n", " y=cand_2d[:, 1],\n", " mode='markers',\n", " name='Candidates',\n", " marker=dict(\n", " size=10,\n", " color='#00ff00',\n", " opacity=0.8,\n", " line=dict(width=1, color='white')\n", " ),\n", " text=[f\"Candidate {i}\" for i in range(n_cand_viz)],\n", " hovertemplate='%{text}'\n", "))\n", "\n", "fig.update_layout(\n", " title='Vector Space: Candidates & Companies (Enriched with Postings)',\n", " xaxis_title='Dimension 1',\n", " yaxis_title='Dimension 2',\n", " width=1200,\n", " height=800,\n", " plot_bgcolor='#1a1a1a',\n", " paper_bgcolor='#0d0d0d',\n", " font=dict(color='white')\n", ")\n", "\n", "fig.show()\n", "\n", "print(\"\\n✅ Visualization complete!\")\n", "print(\"💡 If green & red OVERLAP → Alignment worked!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Interactive Visualization 2: Highlighted Match Network\n", "\n", "Show candidate and their top matches with connection lines" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🔍 Analyzing Candidate #0...\n", "\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": "#ff6b6b", "opacity": 0.3, "size": 4 }, "mode": "markers", "name": "All Companies", "showlegend": true, "type": "scatter", "x": [ 8.424368858337402, 8.40195369720459, 8.385270118713379, 8.42382526397705, -38.597190856933594, -38.74054718017578, -39.00513458251953, -38.19382858276367, -38.68928527832031, -39.055809020996094, -38.23733139038086, -38.41060256958008, -38.13452911376953, -38.96975326538086, 6.241576671600342, 6.2457356452941895, 6.244972229003906, 6.242238521575928, 10.229446411132812, 10.233492851257324, 10.243219375610352, 10.251922607421875, 10.23974323272705, 31.32158660888672, 31.50520133972168, 31.074567794799805, 31.456283569335938, 30.952003479003906, 31.256980895996094, 31.037574768066406, -1.6884390115737915, -2.029571771621704, -1.8245515823364258, -1.5695979595184326, -2.1955161094665527, -2.2359817028045654, -1.5817874670028687, -1.9934055805206299, 9.939101219177246, 10.179327011108398, 10.028629302978516, 9.859413146972656, 9.736146926879883, 9.666458129882812, 10.146087646484375, -29.77255630493164, -29.772802352905273, -29.772052764892578, 11.10151481628418, 1.3300023078918457, 1.4360734224319458, 1.0943334102630615, 1.0356072187423706, 1.1802235841751099, 1.674535870552063, 1.6853547096252441, 1.534334659576416, 0.6285699605941772, 0.6299970149993896, -1.206727385520935, -1.2102998495101929, -1.2111252546310425, 9.724861145019531, 9.326569557189941, 9.39232349395752, 9.622916221618652, 9.931135177612305, 10.042128562927246, 9.491296768188477, 9.992659568786621, 17.54332733154297, -0.3671700656414032, -0.1433565318584442, -0.4733661115169525, 0.06999942660331726, 0.059171970933675766, -0.11598870903253555, -0.3749028742313385, 0.8832989931106567, 20.084917068481445, 19.9399356842041, 20.446205139160156, 19.928754806518555, 19.841358184814453, 20.449960708618164, 20.274831771850586, 20.507068634033203, 15.08704948425293, 15.08784294128418, -0.7731616497039795, -47.88224792480469, -47.88972091674805, -47.74959945678711, -47.638980865478516, -47.61027526855469, -47.826072692871094, 3.918015480041504, 3.207364082336426, 3.330911636352539, 3.8493354320526123, 3.581437826156616, 3.3239355087280273, 3.5372464656829834, 3.7747905254364014, 5.4841485023498535, 5.485290050506592, 5.483107089996338, 5.468288421630859, -44.50997543334961, -44.509490966796875, 7.004449367523193, 6.9461259841918945, 7.7173566818237305, 7.457833766937256, 7.205479145050049, 7.674495697021484, 7.453052997589111, 7.798208713531494, 7.186491966247559, 16.148298263549805, 0.6788679361343384, -49.96831130981445, -49.9749870300293, -49.96926498413086, -49.98001480102539, -49.96370315551758, -53.66045379638672, -53.32814407348633, -53.1112060546875, -53.563846588134766, -53.72007369995117, -53.32570266723633, -53.33319854736328, -53.064266204833984, -1.7918540239334106, -1.5103708505630493, -1.656924843788147, -1.6139615774154663, -1.7948498725891113, -1.4628288745880127, -9.233979225158691, 0.8506536483764648, 0.9188241958618164, 0.33622848987579346, 0.21550366282463074, 0.6105638742446899, 0.5068449974060059, 0.2981937825679779, 0.8420239686965942, -34.76046371459961, -34.761802673339844, -0.3214055895805359, -0.5830390453338623, -0.5855518579483032, 27.71541404724121, 27.715551376342773, 27.715723037719727, 14.501453399658203, 14.501948356628418, 3.622316837310791, 3.619067430496216, 3.1090145111083984, -17.84478187561035, -17.845779418945312, -20.269529342651367, -2.39193058013916, -2.976329803466797, -2.819875717163086, -2.6543285846710205, -2.212239980697632, -2.162963628768921, -2.6436922550201416, -2.315013885498047, -2.870589017868042, 11.093473434448242, 11.16355037689209, 11.144811630249023, 11.154312133789062, 11.164909362792969, 20.428001403808594, 20.588680267333984, 20.027498245239258, 20.71439552307129, 20.362051010131836, 20.088254928588867, 20.595109939575195, 20.118406295776367, 6.959162712097168, 6.957623481750488, 6.957989692687988, 6.953879356384277, 21.536287307739258, 21.5371150970459, 21.539447784423828, 2.2849104404449463, 2.247946262359619, 2.2560007572174072, 2.2936506271362305, 2.273634433746338, 24.611116409301758, 24.024993896484375, 23.83722496032715, 23.802955627441406, 24.56348991394043, 24.356430053710938, 24.07606315612793, 23.74015235900879, 24.34441566467285, 24.691028594970703, -35.44540786743164, -35.44083786010742, -35.440086364746094, -35.442039489746094, -35.441978454589844, -11.628639221191406, -11.632146835327148, -11.631753921508789, -6.116138935089111, -5.735315322875977, -6.1684651374816895, -6.031317234039307, -5.350306510925293, -5.881524562835693, -5.453628063201904, -5.593273162841797, -5.3303542137146, 27.172494888305664, 27.05206871032715, 26.476150512695312, 26.975811004638672, 26.16529655456543, 26.405893325805664, 26.11762809753418, 26.70223617553711, 26.230031967163086, 27.16168975830078, 26.780899047851562, 41.57117462158203, 9.093786239624023, 7.729669094085693, -9.199989318847656, -9.200115203857422, -9.199707984924316, 3.275583505630493, 0.6109403967857361, 0.8323028087615967, 1.0309841632843018, 0.5399081707000732, 0.9001272916793823, 0.40024876594543457, 0.3644936978816986, 1.0575400590896606, -10.868709564208984, -11.195327758789062, -11.202178955078125, -10.839980125427246, -10.687455177307129, -10.656292915344238, -11.074051856994629, -19.25959587097168, -19.64748191833496, -19.830839157104492, -19.55939292907715, -19.510013580322266, -19.771268844604492, -19.477453231811523, 21.014442443847656, 21.01875877380371, 21.014751434326172, 21.02218246459961, 21.018726348876953, -34.7541389465332, -34.75838088989258, -44.35215759277344, -44.35417938232422, -44.35533142089844, -44.3489990234375, 23.116308212280273, 23.116008758544922, 23.13246726989746, 23.128582000732422, 23.128738403320312, -3.268699884414673, -3.276209831237793, -2.9686436653137207, -3.0327906608581543, -3.078014373779297, -2.992126226425171, -54.45542907714844, -54.45764923095703, -54.45448303222656, -5.214994430541992, -5.324438571929932, -5.1812825202941895, -5.841780185699463, -5.588702201843262, -5.81018590927124, -5.992255210876465, -5.4504523277282715, -5.917391300201416, 19.516084671020508, 19.53639030456543, 19.516597747802734, 19.517608642578125, 19.536191940307617, 4.3879923820495605, 4.643431663513184, 4.874138832092285, 4.80661678314209, 4.386302471160889, 4.539963245391846, 5.081382751464844, 5.046562671661377, 4.029664516448975, 4.032876014709473, -33.696231842041016, -34.20162582397461, -33.813697814941406, -33.68760299682617, -34.37712097167969, -33.885520935058594, -34.1035041809082, -34.528079986572266, -34.40664291381836, -3.97928786277771, -4.002251625061035, -3.9830708503723145, -3.9774272441864014, -3.9920456409454346, 0.6240297555923462, 0.6299149394035339, 0.6245612502098083, 14.754414558410645, 14.753911018371582, -10.065768241882324, -10.527876853942871, -10.335932731628418, -9.57887077331543, -9.763535499572754, -9.999625205993652, -9.6849946975708, -9.566462516784668, -10.2764892578125, -10.45286750793457, -5.479043960571289, -5.477899551391602, -5.478900909423828, -5.48048210144043, 12.779082298278809, -17.70671844482422, -17.744197845458984, -17.702316284179688, -17.742536544799805, -17.707124710083008, -20.93585777282715, -20.93665313720703, -20.633319854736328, -20.759273529052734, -20.69408416748047, -20.39215660095215, 15.015809059143066, 15.015778541564941, 15.02795124053955, 15.029789924621582, 15.031014442443848, 3.425910472869873, 3.4152750968933105, 3.408923387527466, 3.4254536628723145, 3.414301633834839, 3.9991567134857178, 3.99899959564209, 3.9927053451538086, 25.70205307006836, 25.701370239257812, 25.7038631439209, 25.716358184814453, -22.74942970275879, -22.6746768951416, -23.296579360961914, -23.007549285888672, -23.232913970947266, -23.03936004638672, -22.744829177856445, -23.363330841064453, -46.83793258666992, -46.51192855834961, -46.38588333129883, -46.4818000793457, -46.73876190185547, -46.61268997192383, -46.87735366821289, 12.541228294372559, 12.545148849487305, 12.542488098144531, 5.525738716125488, -0.666083037853241, -0.6896097660064697, -0.6464848518371582, -0.6849004030227661, -6.837101936340332, -6.837188720703125, -12.867753982543945, -12.870448112487793, -12.87316608428955, -12.863214492797852, -12.860433578491211, 4.128572463989258, -40.68437194824219, -41.17593002319336, -41.00885772705078, -40.91557693481445, -41.13207244873047, -40.776947021484375, -40.61848449707031, -33.27201843261719, -33.27245330810547, -33.27284622192383, -57.87062072753906, -9.34343147277832, -9.344001770019531, -9.340361595153809, -9.339327812194824, -47.296974182128906, -47.30055618286133, -37.84874725341797, -37.848854064941406, 3.0902435779571533, 1.7777507305145264, 1.6145280599594116, 1.7982213497161865, 1.51969313621521, 1.507896065711975, 1.6925978660583496, -52.13357162475586, -52.12623596191406, -52.13442611694336, -52.119266510009766, -52.1289176940918, 0.03377633914351463, 0.44756683707237244, 0.9032312631607056, 0.15730483829975128, 0.7627853155136108, 0.4680038094520569, 0.7006529569625854, 0.9010390043258667, -0.04280976951122284, 0.2129075825214386, 9.040034294128418, -58.03909683227539, -58.02412796020508, -58.02774429321289, -58.032772064208984, -52.453792572021484, -52.45466613769531, -52.455265045166016, -52.45302200317383, -64.5255355834961, -65.22887420654297, -64.8541259765625, -64.60836029052734, -65.15137481689453, -65.38077545166016, -64.71974182128906, -65.00115966796875, -65.38782501220703, 4.057638168334961, 4.056006908416748, 4.052893161773682, -55.83613967895508, -25.252897262573242, -25.25307846069336, -65.19004821777344, -65.1804428100586, -65.1854019165039, -65.1884536743164, -56.89091873168945, -56.89566421508789, -49.766849517822266, -49.776668548583984, -49.76902770996094, -49.79204559326172, -49.73958206176758, -60.75355911254883, -60.77012634277344, -60.67805099487305, -60.68153381347656, -60.67255783081055, -70.58096313476562, -70.56818389892578, -70.49311828613281, -70.45633697509766, -70.55171966552734, -71.75516510009766, -48.498043060302734, -67.8709945678711, -68.06137084960938, -67.869140625, -67.62189483642578, -67.38013458251953, -68.04399871826172, -67.56253814697266, -67.39675903320312, -63.39543533325195, -63.396156311035156, -47.06116485595703, -50.60409164428711, -50.60587692260742, -50.601593017578125, 6.235417366027832, -15.089536666870117, -14.96912956237793, -15.012476921081543, -15.332449913024902, -15.543253898620605, -15.413955688476562, -15.729859352111816, -15.62963581085205, -14.592277526855469, -14.593019485473633, -26.06534194946289, -38.52705764770508, -38.51149368286133, 21.112993240356445, 21.182252883911133, 20.90458869934082, 21.464303970336914, 21.588134765625, 20.741323471069336, 20.869428634643555, 21.384780883789062, 21.652090072631836, 32.56788635253906, 32.32442092895508, 32.82233810424805, 32.58119201660156, 33.00376892089844, 33.009517669677734, 32.874454498291016, 31.839994430541992, 31.822965621948242, 32.25719451904297, 31.995155334472656, 32.0140380859375, -21.0692081451416, 12.000478744506836, 11.998671531677246, -28.225128173828125, -28.22435188293457, -28.223079681396484, -28.21302032470703, -28.22294807434082, 26.650436401367188, 26.71042251586914, 26.541561126708984, 26.360599517822266, 26.018096923828125, 25.916732788085938, 26.0217227935791, 26.201248168945312, 26.79701042175293, 22.952205657958984, 9.003768920898438, 8.91420841217041, 8.65842342376709, 8.48921012878418, 8.727873802185059, 8.454588890075684, 8.81289005279541, 24.353986740112305, 24.353757858276367, 24.353864669799805, 24.144853591918945, 5.315511703491211, 5.3551812171936035, 5.345043182373047, 5.407382965087891, 5.339136123657227, -46.514156341552734, -47.360450744628906, -47.14832305908203, -46.87432861328125, -47.2081184387207, -46.96484375, -46.68968963623047, -47.336238861083984, -46.59156799316406, 10.548131942749023, 10.559576034545898, 10.368062973022461, 10.648305892944336, 10.286441802978516, 10.402506828308105, -16.5687198638916, -63.4290771484375, -63.42229080200195, -58.20360565185547, -58.17733383178711, -58.1947021484375, -58.16459655761719, -58.17775344848633, -3.7078065872192383, -4.323894500732422, -4.020966529846191, -3.4456288814544678, -4.229516506195068, -3.656536102294922, -3.9565958976745605, -3.4085915088653564, -4.262689590454102, -3.4956657886505127, 9.03604507446289, 9.044646263122559, 9.046369552612305, 9.060202598571777, 9.042214393615723, -22.461328506469727, -22.450204849243164, -22.4620361328125, -22.47696304321289, 21.704755783081055, 22.654081344604492, 22.87489128112793, 22.837860107421875, 22.682125091552734, 23.008441925048828, 22.685321807861328, 22.971527099609375, 22.319419860839844, -11.821859359741211, -11.4562406539917, -11.430265426635742, -11.802940368652344, -11.55270004272461, -11.346612930297852, -11.634156227111816, -55.61581802368164, -56.44009780883789, -56.55924987792969, -56.459171295166016, -55.809165954589844, -55.99927520751953, -55.95399475097656, -56.11747741699219, -55.57479476928711, -56.44060516357422, -3.503048896789551, -3.6055238246917725, -3.818509578704834, -3.767317295074463, -3.6996099948883057, -3.514622449874878, 3.8653600215911865, -27.51788902282715, -27.517377853393555, -10.292840957641602, -10.293699264526367, -4.3271379470825195, -4.328660488128662, -6.150954723358154, -6.146858215332031, -6.1473164558410645, -6.151699542999268, -7.847476959228516, -7.846634864807129, -7.847339153289795, -7.846627235412598, 22.062091827392578, -42.20407485961914, -42.21059036254883, -42.205562591552734, -42.2010383605957, -42.17451095581055, -54.45176315307617, -54.45507049560547, -54.44932174682617, -54.437103271484375, -54.458099365234375, 0.11311550438404083, 0.11269814521074295, -0.3183369040489197, -0.31079035997390747, -0.08086839318275452, -0.07864727824926376, -0.40902724862098694, -8.530174255371094, -8.875421524047852, -8.878767013549805, -8.87488079071045, -41.6385383605957, -41.63814926147461, 10.075909614562988, 13.474474906921387, 3.3136630058288574, 3.3146092891693115, -5.984489440917969, -5.942331314086914, -5.65389347076416, -5.974327087402344, -5.733998775482178, -5.71707820892334, -10.246761322021484, -10.247757911682129, 11.465141296386719, 16.85576820373535, 16.85823631286621, 16.855016708374023, 16.859519958496094, 11.282685279846191, 11.284430503845215, 11.282645225524902, 10.005130767822266, -10.744911193847656, -10.747952461242676, 2.1230387687683105, 2.279825210571289, 2.297940731048584, 2.254340410232544, 1.9931429624557495, 2.446924924850464, 1.924859642982483, -23.303342819213867, 0.5535921454429626, 0.556233286857605, 0.5561249256134033, -39.5833625793457, -39.5936164855957, -39.60243225097656, -39.60811233520508, -39.64350128173828, 21.599185943603516, 21.599828720092773, 21.600046157836914, 9.1586275100708, 5.82058572769165, 5.842195987701416, 5.822265148162842, 5.836764335632324, 5.831743240356445, 24.477479934692383, 24.477523803710938, 3.4941024780273438, 3.5356369018554688, 3.805636405944824, 3.662766933441162, 3.6072356700897217, 3.785088300704956, -52.43108367919922, -52.432403564453125, -52.434940338134766, -29.51155662536621, -29.511749267578125, -29.512527465820312, -29.513591766357422, -29.512319564819336, -26.14444351196289, -26.14342498779297, -26.1442928314209, -26.144636154174805, -25.476295471191406, -26.19039535522461, -20.268325805664062, -20.267528533935547, -26.666950225830078, 13.385660171508789, 13.392659187316895, 13.391640663146973, 13.394041061401367, -19.978500366210938, -19.98379135131836, -19.978111267089844, 8.24605655670166, 8.247496604919434, 8.25313949584961, 5.33571195602417, 1.570122241973877, 1.56509268283844, -50.80742263793945, -50.81294631958008, -50.81252670288086, -50.81089401245117, 3.611614227294922, 3.6118197441101074, 23.973388671875, 24.076915740966797, 24.42821502685547, 24.45101547241211, 24.34916114807129, 24.315494537353516, 24.02821922302246, 24.565372467041016, -26.899677276611328, -26.903812408447266, -26.903318405151367, 14.372613906860352, 14.367293357849121, 14.367090225219727, 14.371456146240234, -61.98445510864258, -62.25145721435547, -62.47407913208008, -62.25614929199219, -61.860660552978516, -62.614986419677734, -62.49680709838867, -62.014583587646484, -18.111356735229492, 22.44692039489746, 22.447153091430664, 22.442472457885742, 22.44460678100586, -20.74327278137207, -20.745454788208008, 12.831258773803711, 12.830989837646484, 12.831042289733887, -5.251822471618652, 16.589445114135742, -7.01567268371582, -6.808887958526611, -6.946660995483398, -6.7887067794799805, -7.075699329376221, -6.86447286605835, -17.10204315185547, -17.101015090942383, -17.10253143310547, -17.102405548095703, -17.099790573120117, -7.8117289543151855, -7.814805030822754, -7.818292617797852, -7.8097147941589355, 10.708316802978516, -57.271305084228516, -57.26393508911133, -57.27133560180664, -57.271034240722656, -57.27096176147461, -43.27741622924805, -43.27329635620117, -44.94085693359375, -44.941097259521484, -44.939422607421875, -44.94015121459961, 0.41917937994003296, 0.42184415459632874, 0.42084866762161255, -22.90757179260254, -22.90688133239746, -22.902053833007812, -43.78087615966797, -43.784114837646484, -43.79555130004883, -43.8066520690918, -43.784976959228516, -48.05199432373047, -48.004432678222656, -47.818328857421875, -47.98826217651367, -48.12126541137695, -47.817039489746094, 0.24960333108901978, 0.24967969954013824, 0.2483009696006775, -36.90621566772461, -36.90498733520508, -36.90475845336914, -36.89705276489258, -9.339715957641602, -9.337632179260254, -9.334293365478516, -9.333635330200195, -50.4771614074707, -50.47110366821289, -50.47177505493164, -50.45993423461914, -50.468021392822266, -16.25105857849121, -16.249670028686523, -16.253883361816406, -16.240957260131836, 23.78154754638672, 22.668743133544922, -47.52705001831055, -46.826332092285156, -47.363277435302734, -46.66850662231445, -47.09300994873047, -47.45309829711914, -46.578468322753906, -46.5025520324707, -46.94593048095703, -47.17988586425781, 16.074325561523438, 15.986766815185547, 16.02914810180664, 15.979602813720703, -9.244939804077148, -9.459209442138672, -9.525348663330078, -9.197150230407715, -9.53021240234375, -8.741883277893066, -8.908061981201172, -8.695394515991211, -8.926861763000488, -31.140836715698242, -31.142518997192383, -31.14365577697754, -31.142181396484375, -31.145404815673828, 11.921862602233887, 12.160572052001953, 12.029277801513672, 12.316140174865723, 12.281342506408691, 12.100750923156738, -7.097792148590088, -7.1051812171936035, -7.119196891784668, -7.1125311851501465, -7.107389450073242, -17.501123428344727, -10.500753402709961, -10.497730255126953, -10.49947738647461, -51.95438003540039, -52.382293701171875, -51.78439712524414, -51.761043548583984, -52.12165832519531, -52.0570068359375, -52.146820068359375, -13.595605850219727, -14.100326538085938, -14.241900444030762, -13.86053466796875, -13.590537071228027, -13.747114181518555, -13.999796867370605, -14.268654823303223, -17.36631965637207, -17.19453239440918, -17.48020362854004, -17.363676071166992, -17.15692901611328, -17.120025634765625, 15.651924133300781, 15.652823448181152, 1.3848296403884888, 1.3827440738677979, -15.755619049072266, -15.746484756469727, -15.74909496307373, -15.750643730163574, -15.750755310058594, -18.4794979095459, 11.25140380859375, -15.106375694274902, -6.372767925262451, -6.519701957702637, -6.875925540924072, -6.731739044189453, -6.736457347869873, -6.904006004333496, -6.435727119445801, -27.11993980407715, -26.51466941833496, -26.44937515258789, -26.837587356567383, -26.962995529174805, -27.03318214416504, -26.39188575744629, -26.698883056640625, 4.984915256500244, 11.247806549072266, 11.13890266418457, 11.491522789001465, 11.357682228088379, 11.654806137084961, 11.601849555969238, 11.094734191894531, -11.371184349060059, -11.371822357177734, -11.360681533813477, -11.361397743225098, -11.354806900024414, 3.5660488605499268, -10.614304542541504, -10.614241600036621, -10.62957763671875, -56.6731071472168, -54.925315856933594, -54.9257698059082, -60.83208465576172, -60.83211898803711, 28.312219619750977, 28.312278747558594, 28.311586380004883, 28.312294006347656, -55.093116760253906, 18.950105667114258, 18.942703247070312, 18.94816780090332, 18.95065689086914, 18.94476890563965, -31.00737953186035, -31.005002975463867, -19.790851593017578, -19.789791107177734, -19.789403915405273, -19.797624588012695, -60.712493896484375, -60.71503829956055, -60.713287353515625, -57.738651275634766, -57.724151611328125, -57.72794723510742, -57.73098373413086, 8.475144386291504, 8.315611839294434, 8.373150825500488, 8.164812088012695, 8.155284881591797, 8.444578170776367, 14.958893775939941, 14.968539237976074, 14.96784496307373, 14.964698791503906, 18.776565551757812, 18.775903701782227, 15.890573501586914, 15.890604019165039, -37.54127883911133, -37.546539306640625, -29.707714080810547, -29.77176284790039, -29.841392517089844, -29.863513946533203, -29.845125198364258, 12.486668586730957, 12.488693237304688, 12.489386558532715, 12.490241050720215, 6.677422046661377, -60.37477111816406, -26.067602157592773, -25.742372512817383, -25.74478530883789, -34.2813835144043, -34.280460357666016, -5.410487174987793, -5.484710216522217, -6.743513584136963, -6.746727466583252, -16.344520568847656, -15.843527793884277, -16.029876708984375, -16.311504364013672, -16.25292205810547, -15.997291564941406, -15.816859245300293, -68.20844268798828, -68.20467376708984, -68.20362854003906, -68.20428466796875, -68.20951843261719, -63.59611129760742, -33.69157409667969, -33.57405471801758, -33.616943359375, -33.975257873535156, -34.09513473510742, -34.031028747558594, -33.83718490600586, -10.965885162353516, -10.981391906738281, -10.699649810791016, -10.824625968933105, -10.782798767089844, -10.638372421264648, 9.29180908203125, -38.729251861572266, -38.570945739746094, -38.71137619018555, -38.21712875366211, -38.035316467285156, -38.431522369384766, -38.0672721862793, -38.39033126831055, -64.2486343383789, -64.2483901977539, -64.24852752685547, -64.24834442138672, -63.52492141723633, -63.382774353027344, -63.62936019897461, -63.69843673706055, -63.355098724365234, -63.65897750854492, -45.643898010253906, -45.64356231689453, -45.6444091796875, -6.111186504364014, -6.110682487487793, -23.565807342529297, -23.565982818603516, -48.05550765991211, -48.058753967285156, -12.51508903503418, -12.514734268188477, -33.91090393066406, -33.577415466308594, -34.107025146484375, -34.18293762207031, -33.85030746459961, -34.22393798828125, -33.686614990234375, -33.519405364990234, -37.65353775024414, -37.6534309387207, 3.740062713623047, 3.7442400455474854, 3.744046211242676, 4.14409875869751, -8.994057655334473, 18.659725189208984, -22.356401443481445, -22.357711791992188, -22.354808807373047, -10.963913917541504, 8.224335670471191, 8.223245620727539, 8.21993637084961, 10.15271282196045, 10.151826858520508, 10.15285587310791, -28.508148193359375, -28.72815704345703, -28.928924560546875, -28.620750427246094, -28.41084098815918, -28.178300857543945, -28.23463249206543, -28.87276268005371, -41.52851104736328, -41.52909469604492, -2.694683074951172, -2.697195053100586, -15.884135246276855, -15.802911758422852, -15.909880638122559, -15.8931884765625, -15.85837173461914, 12.1902437210083, 12.315624237060547, 12.097739219665527, 12.210334777832031, 11.979430198669434, 12.087703704833984, -31.50810432434082, -31.50511932373047, -31.5111141204834, -31.511566162109375, -31.50833511352539, 9.788679122924805, 10.110432624816895, 9.954949378967285, 14.9107084274292, 13.252981185913086, 13.252169609069824, 13.254631042480469, -35.92222213745117, -35.9213981628418, 10.167903900146484, -42.39931106567383, -42.399864196777344, -42.400142669677734, -60.82884216308594, -59.594913482666016, -59.59376525878906, -59.31385803222656, 6.677526950836182, 6.677916526794434, 13.84874153137207, 13.850943565368652, 13.84062385559082, 13.84172534942627, 13.84252643585205, -4.282179355621338, -4.282599449157715, 0.3869257867336273, 12.832763671875, -7.454047679901123, -7.449394226074219, -7.457730293273926, -7.4590253829956055, -15.222578048706055, -15.212117195129395, -15.160901069641113, -15.182815551757812, -15.175369262695312, -61.024513244628906, -63.69906234741211, -63.71110153198242, -63.70718002319336, -63.71381378173828, -63.949058532714844, -60.58774948120117, -60.6015625, -60.32884216308594, -60.61634063720703, -60.332279205322266, -60.329647064208984, -42.887001037597656, -42.936134338378906, -42.907081604003906, -42.89353942871094, -42.91228485107422, -39.551353454589844, -39.551639556884766, -39.55238342285156, -39.5519905090332, -43.45033645629883, -43.45110321044922, -43.44938659667969, -43.45255661010742, -36.511451721191406, -36.51188278198242, 0.2971312999725342, 0.29829561710357666, 19.549253463745117, 19.08359146118164, 19.741037368774414, 19.35431671142578, 19.013877868652344, 19.427513122558594, 19.675180435180664, 19.10927391052246, -50.96442413330078, -50.067161560058594, -50.167598724365234, -35.48662185668945, -10.021904945373535, 10.931439399719238, -31.322214126586914, -31.318532943725586, -12.73622989654541, -31.678556442260742, 11.203988075256348, 11.203958511352539, 11.227036476135254, 11.235265731811523, -6.904852867126465, -6.905430793762207, -6.905808448791504, -7.9446539878845215, -7.944716453552246, -7.945710182189941, -7.944148540496826, -8.191888809204102, -8.192843437194824, 2.678701877593994, 7.625016212463379, 7.628201484680176, 7.636503219604492, 7.630942344665527, 23.330265045166016, 23.332908630371094, 23.33187484741211, 23.332874298095703, -21.119800567626953, -21.138242721557617, -21.146650314331055, -21.133689880371094, -21.143014907836914, -39.742923736572266, -60.10016632080078, -60.06216049194336, -60.07659149169922, -60.078941345214844, -60.079627990722656, -63.87070083618164, -63.82933044433594, -64.08505249023438, -64.13878631591797, -63.88064193725586, -64.05622100830078, 7.359988212585449, 7.358536720275879, 7.359809875488281, 1.0549017190933228, 1.058767557144165, -16.96685791015625, -58.71111297607422, -58.70831298828125, -25.61821174621582, -25.855731964111328, -25.862937927246094, -25.42840576171875, -25.63933753967285, -25.422956466674805, -25.96933364868164, 21.871400833129883, 21.882171630859375, 21.8466854095459, 21.876964569091797, 21.86018943786621, 2.08731746673584, 2.084014654159546, 10.558155059814453, -53.51179885864258, -54.048458099365234, -54.05021286010742, -53.85361099243164, -53.892642974853516, -53.58709716796875, -53.63858413696289, -64.06803131103516, -63.908626556396484, -63.68824768066406, -63.51429748535156, -63.99873733520508, -63.77212905883789, -63.56523132324219, -14.23972225189209, -14.240264892578125, -14.242884635925293, 10.333036422729492, 10.333346366882324, -38.038490295410156, -38.03743362426758, -11.941420555114746, -56.69660949707031, -56.43345642089844, -56.61713790893555, -57.05439376831055, -56.94187545776367, -56.89845657348633, -56.38780975341797, -56.300106048583984, 13.6294584274292, -2.2375152111053467, -22.587581634521484, -22.58746337890625, 14.323687553405762, 14.331825256347656, 14.354517936706543, 14.348875045776367, 14.395720481872559, -39.51643371582031, -29.00905990600586, -28.725196838378906, -28.77578353881836, -28.775949478149414, -28.996015548706055, -28.814306259155273, -42.3772087097168, -42.37689208984375, -42.37672805786133, -42.37638473510742, 10.325542449951172, 10.32380485534668, -6.758334159851074, -6.761075496673584, -6.760504245758057, -6.76297664642334, -40.606712341308594, -40.60508346557617, -40.61124801635742, -4.945362091064453, -61.06270980834961, -52.90327072143555, -52.90538787841797, -52.906925201416016, -57.89860153198242, -57.90040588378906, -57.916629791259766, -57.90595626831055, -69.11897277832031, -69.12520599365234, -69.12963104248047, -69.14383697509766, -58.713809967041016, -58.7151985168457, -58.71522903442383, -56.7585334777832, -56.15938949584961, -21.997802734375, -21.83837127685547, -22.03680419921875, -21.775232315063477, -21.825849533081055, -22.09166145324707, 10.477498054504395, 10.400519371032715, 10.262097358703613, 10.503884315490723, 10.273590087890625, 10.445274353027344, -66.8909683227539, -66.8964614868164, -66.89068603515625, 9.131399154663086, 9.227867126464844, 9.608245849609375, 9.560931205749512, 9.306675910949707, 9.066203117370605, 9.438796997070312, -48.08914566040039, -62.206844329833984, -62.200286865234375, -62.200225830078125, -14.774711608886719, -14.770051956176758, -14.786432266235352, -14.782983779907227, -14.774290084838867, -31.653705596923828, -36.980125427246094, -44.349693298339844, -44.34103012084961, -44.35206604003906, -44.33806610107422, -17.752960205078125, -17.75241470336914, -17.757099151611328, -17.747058868408203, -28.952077865600586, -28.945486068725586, -28.956897735595703, -28.956375122070312, -15.358386039733887, -15.353671073913574, -15.361281394958496, -15.351487159729004, -15.343894004821777, 4.714502811431885, 4.9887003898620605, 4.804062843322754, 5.15646505355835, 4.923381328582764, 4.962911605834961, -3.091036558151245, -3.090825319290161, -18.099483489990234, -18.112123489379883, -18.09318733215332, -18.111907958984375, -14.688825607299805, -14.538540840148926, -14.299317359924316, -14.337711334228516, -14.815533638000488, -14.975482940673828, -14.466683387756348, -14.952736854553223, -13.293607711791992, -13.042061805725098, -12.775985717773438, -13.634769439697266, -13.521761894226074, -13.263656616210938, -12.952322006225586, -13.563087463378906, -12.813916206359863, -46.36420440673828, -46.368350982666016, -46.36145782470703, -46.36210250854492, -46.36933517456055, -56.07087707519531, -12.314374923706055, -12.314844131469727, 12.398545265197754, -25.324207305908203, -25.32459831237793, -25.32564926147461, 23.649797439575195, 23.64925765991211, 23.64340591430664, 7.435271263122559, 7.4091668128967285, 7.414517402648926, 7.409411430358887, -10.784873962402344, -10.7341947555542, -38.71002197265625, -38.71083068847656, -38.70957565307617, -38.71027374267578, 16.548364639282227, 16.553056716918945, 16.556907653808594, -40.726871490478516, -40.41619873046875, -40.20418167114258, -40.87351608276367, -40.61463928222656, -40.970252990722656, -40.734188079833984, -40.26972198486328, -60.970394134521484, -60.97218704223633, -61.686397552490234, -61.67934799194336, 17.61966896057129, -12.593852043151855, -12.59571361541748, -12.606873512268066, -12.598134994506836, 22.108257293701172, -33.103172302246094, -32.26847457885742, -33.500396728515625, -33.379940032958984, -31.56306266784668, -31.559171676635742, -31.563657760620117, -31.55913543701172, -7.861734390258789, -7.914711952209473, -7.903069496154785, -7.8621392250061035, -7.859370708465576, -37.925540924072266, -37.9260139465332, -37.925296783447266, -37.92491149902344, -2.920363187789917, -2.92573618888855, -2.923532009124756, 6.63681697845459, 6.6368088722229, -73.71869659423828, -74.39083862304688, -73.89617919921875, -73.83633422851562, -74.16877746582031, -74.4381103515625, -73.79354095458984, -74.25989532470703, -74.5290298461914, -29.44828987121582, -29.44973373413086, -29.452014923095703, -23.69202995300293, -23.694538116455078, -23.69133758544922, -23.69902229309082, -23.665298461914062, 26.732439041137695, 26.255809783935547, 26.72085189819336, 27.006927490234375, 26.98185157775879, 27.17838478088379, 27.184123992919922, 26.255008697509766, 26.433942794799805, 26.398193359375, -1.4631564617156982, -2.0807673931121826, -2.109511375427246, -2.034956693649292, -1.643190860748291, -1.098846673965454, -1.2552950382232666, -1.0877041816711426, -1.1651872396469116, -1.711522102355957, -1.8688719272613525, -34.13358688354492, -34.131935119628906, -32.48831558227539, -32.4871711730957, -32.483943939208984, 11.574583053588867, -44.878883361816406, -44.680580139160156, -44.54521560668945, -44.510921478271484, -44.757198333740234, -44.76645278930664, -70.60704040527344, -70.4699478149414, -58.79962158203125, -68.65261840820312, -68.69153594970703, -68.68538665771484, -68.63492584228516, -68.66101837158203, -18.63035774230957, -18.630281448364258, -18.632183074951172, 9.23144245147705, 9.234416961669922, 6.9486565589904785, 6.951380252838135, 6.948786735534668, 12.324705123901367, 12.32500171661377, -26.295886993408203, -26.293813705444336, -67.51423645019531, -67.50902557373047, -67.51679992675781, -13.990531921386719, -13.990288734436035, -13.99067211151123, -74.88426971435547, -75.06077575683594, -74.64924621582031, -74.60863494873047, -74.75909423828125, -75.1240463256836, -75.17537689208984, 1.8373706340789795, -2.3988356590270996, -2.3978402614593506, -2.3997175693511963, -2.403235912322998, 15.508713722229004, 15.503201484680176, 15.518051147460938, 19.19660758972168, 19.207592010498047, 19.191099166870117, 19.194103240966797, -2.014946937561035, -51.42313766479492, -51.48221206665039, -51.50404739379883, -51.718772888183594, -51.392723083496094, -51.656829833984375, 24.34108543395996, -1.947666883468628, -1.9471527338027954, -1.9479432106018066, -1.9480937719345093, -13.688237190246582, -13.902804374694824, -13.869246482849121, -13.867380142211914, -13.714706420898438, -14.013772010803223, -69.97193908691406, -69.59896850585938, -69.76571655273438, -69.88774108886719, -70.2620620727539, -69.55244445800781, -70.21824645996094, -70.18151092529297, -69.48090362548828, -68.66361236572266, -0.6842813491821289, -0.681919276714325, -0.6847624182701111, 12.793574333190918, -64.030029296875, -64.0291519165039, -64.02894592285156, 18.78449821472168, 18.759483337402344, 18.749286651611328, 18.70789337158203, 18.734590530395508, -66.60057067871094, -66.60079956054688, -71.56140899658203, -71.56015014648438, -71.55998992919922, -16.42772102355957, -16.70086097717285, -16.430152893066406, -16.610769271850586, -16.706754684448242, -16.49740219116211, 6.9606852531433105, 7.0034894943237305, 7.035506248474121, 6.7987847328186035, 6.725658893585205, 6.733903408050537, 9.696547508239746, 9.696070671081543, 9.69472599029541, 20.120067596435547, 19.9486026763916, 19.97699737548828, 19.874601364135742, 19.847043991088867, 20.13687515258789, -29.880834579467773, -13.434200286865234, -13.21408462524414, -13.079896926879883, -13.198468208312988, -13.180018424987793, -13.31921672821045, 12.88471794128418, 12.884405136108398, 12.888836860656738, 12.885273933410645, -31.919118881225586, 1.7155766487121582, 1.7177070379257202, 1.7088819742202759, 1.7074626684188843, 1.7065359354019165, -3.832618236541748, 23.17136573791504, 23.166664123535156, 23.162588119506836, 23.153064727783203, -23.753393173217773, -23.75490379333496, -23.760515213012695, -23.75670623779297, -26.812911987304688, -26.81266212463379, -25.151025772094727, -31.25493621826172, -31.25486946105957, 4.614198684692383, 4.35776424407959, 4.537964344024658, 4.382148265838623, 4.6024169921875, 4.3679914474487305, 15.136275291442871, 15.192586898803711, 14.60908317565918, 14.515890121459961, 14.918002128601074, 14.824934959411621, 14.55881118774414, 15.123894691467285, -21.82978057861328, -21.828632354736328, -21.829904556274414, -38.527156829833984, -38.52360534667969, -38.5373420715332, -66.375, 14.80654525756836, 14.527073860168457, 14.681469917297363, 14.626154899597168, 14.903265953063965, 14.803765296936035, 10.511466026306152, -62.85231399536133, -62.854312896728516, -62.84885025024414, -62.843990325927734, -65.01849365234375, -65.04086303710938, -65.02104949951172, -65.00076293945312, -65.0142822265625, 3.5364906787872314, 3.537658214569092, 7.743208885192871, 7.730005264282227, 7.733132362365723, 7.725170135498047, 7.736743450164795, 15.357967376708984, -21.674589157104492, -21.673192977905273, -21.67369270324707, 6.22451114654541, 6.223665237426758, -26.414087295532227, -26.412384033203125, 10.984674453735352, 11.031102180480957, 10.97566032409668, 11.019796371459961, 11.01504898071289, -11.826008796691895, 15.758673667907715, 15.758585929870605, 15.758808135986328, -26.26375961303711, 13.19601058959961, 13.195222854614258, -40.1959342956543, -20.548673629760742, -20.533201217651367, -20.545686721801758, -20.540372848510742, -20.545082092285156, -16.21440315246582, -16.21455192565918, -15.51506233215332, -15.51744556427002, -15.495964050292969, -15.51413345336914, -63.41346740722656, -63.41600799560547, -74.71138763427734, -74.71638488769531, -74.7139892578125, -74.71527099609375, -74.7126235961914, -73.77288818359375, -73.77259063720703, -73.77193450927734, -31.162431716918945, -30.882938385009766, -31.050857543945312, -31.102458953857422, -30.92737579345703, -30.824872970581055, -23.274465560913086, -23.27474594116211, -23.273426055908203, -29.317319869995117, -29.318452835083008, -29.317399978637695, -32.490543365478516, -32.59402084350586, -32.42753219604492, -32.55759811401367, -32.37129592895508, -32.69107437133789, -12.106900215148926, 5.268308162689209, 5.285607814788818, 5.299559593200684, -60.29117965698242, 8.361554145812988, 8.36322021484375, 8.10783863067627, 6.807921886444092, 6.809138298034668, 6.807848930358887, -50.65309524536133, -50.655147552490234, -50.65590286254883, 4.168941497802734, -51.677894592285156, 3.550462007522583, 4.13480281829834, 3.296396493911743, 3.7737202644348145, 4.032591819763184, 4.033749580383301, 3.304417610168457, 3.472301483154297, 3.7310631275177, 0.2156933695077896, 0.21454402804374695, 0.21309591829776764, -37.844032287597656, -37.84381103515625, -37.85132598876953, -48.83259582519531, -48.829410552978516, 0.6048681735992432, 0.602332353591919, 0.6024385690689087, 0.6032942533493042, -10.460880279541016, -10.465855598449707, -10.46719741821289, -26.53402328491211, -26.533193588256836, -39.14055633544922, -39.141517639160156, -39.143577575683594, -4.630090236663818, -4.636085033416748, -4.634174346923828, 5.97052001953125, -36.777931213378906, -36.77778625488281, -36.7770881652832, -36.77738571166992, -36.778255462646484, -47.05340576171875, -47.06605529785156, -47.059024810791016, -47.04941940307617, -47.03755187988281, 14.94761848449707, 14.920146942138672, 14.507064819335938, 14.228759765625, 14.727867126464844, 14.42956829071045, 14.182744026184082, 14.775954246520996, 14.116118431091309, -26.917078018188477, -21.612327575683594, -21.61187744140625, -21.612274169921875, -63.586483001708984, -5.423588752746582, 21.541709899902344, 23.06288719177246, -26.22901153564453, -26.222148895263672, -59.94818115234375, -59.92826843261719, -59.94501495361328, -59.94598388671875, -59.972293853759766, 6.338867664337158, 6.336419105529785, 6.340895652770996, -29.89619255065918, -29.90003204345703, -28.70121955871582, -32.03236389160156, -32.03085708618164, -48.773258209228516, -48.77297592163086, -48.772762298583984, -48.773162841796875, 4.502254009246826, -3.0169200897216797, -3.016517162322998, -3.0156655311584473, -3.014995574951172, -30.852481842041016, -30.807783126831055, -31.358808517456055, -31.13585662841797, -31.322595596313477, -31.149080276489258, -30.759552001953125, -31.477121353149414, -29.491474151611328, -19.08061408996582, -19.069759368896484, -4.164778232574463, 1.7760272026062012, 1.7821723222732544, 1.7835849523544312, 1.7815669775009155, -24.41427230834961, -24.40819549560547, -24.398540496826172, -24.39463996887207, -24.390335083007812, 31.716354370117188, 31.716712951660156, -6.247402191162109, -5.967007637023926, -5.938083171844482, -6.112759113311768, -6.252727031707764, -6.086130142211914, -1.3094497919082642, -55.55604553222656, -55.96192169189453, 25.658832550048828, 15.13271713256836, 15.12988567352295, 15.128801345825195, 15.128372192382812, -47.60731887817383, -10.182089805603027, -10.1725492477417, -10.171238899230957, -8.196640014648438, -8.196233749389648, -15.613466262817383, -15.662379264831543, -15.525261878967285, -16.14585304260254, -16.16933822631836, -15.879556655883789, -16.257312774658203, -15.892128944396973, -67.68579864501953, -21.02730941772461, -21.025123596191406, -21.031599044799805, -21.03111457824707, -52.023780822753906, -60.5666618347168, -60.56923294067383, -60.568721771240234, 21.38077735900879, 21.379133224487305, 26.983030319213867, 26.983373641967773, 26.98339080810547, 26.983129501342773, -58.92685317993164 ], "y": [ 19.615699768066406, 19.578353881835938, 19.56269073486328, 19.608068466186523, 41.28982162475586, 41.35234451293945, 41.655216217041016, 41.66573715209961, 42.25960159301758, 41.800071716308594, 42.088436126708984, 42.234275817871094, 41.50304412841797, 42.188907623291016, 29.378488540649414, 29.379528045654297, 29.378686904907227, 29.380535125732422, 17.270790100097656, 17.33060646057129, 17.28412628173828, 17.26725959777832, 17.24688148498535, 23.120615005493164, 23.29633903503418, 23.15921974182129, 23.550708770751953, 23.33256721496582, 23.668794631958008, 23.599817276000977, 16.278268814086914, 16.911842346191406, 16.963712692260742, 16.47856903076172, 16.458641052246094, 16.707019805908203, 16.769603729248047, 16.26326560974121, -18.072223663330078, -17.714962005615234, -17.611141204833984, -17.51753807067871, -17.974977493286133, -17.78512954711914, -18.114604949951172, 39.314910888671875, 39.31538391113281, 39.31454849243164, 5.45222282409668, 17.783935546875, 18.538698196411133, 18.445417404174805, 18.214054107666016, 17.962711334228516, 18.11878204345703, 18.053421020507812, 18.524438858032227, 33.58551788330078, 33.587310791015625, 28.048828125, 28.00119400024414, 28.022733688354492, 36.26835250854492, 36.57929229736328, 36.8087158203125, 36.9649772644043, 36.9301872253418, 36.678043365478516, 36.300228118896484, 36.44358444213867, 32.12184143066406, -53.52337646484375, -53.4671516418457, -53.76904296875, -53.64047622680664, -53.86141586303711, -54.027496337890625, -53.958831787109375, 26.282405853271484, 14.230093955993652, 14.095026969909668, 13.578433990478516, 13.552642822265625, 13.811094284057617, 14.0676851272583, 13.559479713439941, 13.972908973693848, -17.911563873291016, -17.911212921142578, 30.242389678955078, 17.14500617980957, 17.169950485229492, 17.0700740814209, 17.319496154785156, 17.16207504272461, 17.397430419921875, 21.870765686035156, 21.913341522216797, 22.118587493896484, 22.063289642333984, 22.190187454223633, 21.575468063354492, 21.52533721923828, 21.555145263671875, 14.247730255126953, 14.246955871582031, 14.2372407913208, 14.252955436706543, -19.202116012573242, -19.202844619750977, -51.182559967041016, -51.025917053222656, -51.28550338745117, -51.47473907470703, -51.44845962524414, -50.77499008178711, -50.671966552734375, -51.05278396606445, -50.71173095703125, 15.883289337158203, 26.978958129882812, 23.916189193725586, 23.89486312866211, 23.955957412719727, 23.879182815551758, 23.879444122314453, 21.103492736816406, 21.021989822387695, 21.358562469482422, 21.620197296142578, 21.34636878967285, 20.984487533569336, 21.7039737701416, 21.543445587158203, -39.02962112426758, -39.046173095703125, -38.7376823425293, -39.11378860473633, -38.85429000854492, -38.84651565551758, 10.438827514648438, -58.41144943237305, -58.660247802734375, -58.96452713012695, -58.7503662109375, -59.05216979980469, -58.3015022277832, -58.45181655883789, -58.9362678527832, -13.338593482971191, -13.333050727844238, 9.964539527893066, 10.185064315795898, 10.184954643249512, 1.5900442600250244, 1.5900211334228516, 1.5900081396102905, 21.485576629638672, 21.487709045410156, -51.81793975830078, -51.81572341918945, -51.60102844238281, -38.643516540527344, -38.64380645751953, 19.485759735107422, -25.054697036743164, -25.613727569580078, -25.90918731689453, -25.15110969543457, -25.414566040039062, -25.731201171875, -25.952638626098633, -25.9692440032959, -25.342546463012695, 22.265003204345703, 22.304595947265625, 22.266159057617188, 22.26791000366211, 22.315412521362305, 21.797143936157227, 21.703685760498047, 21.46921730041504, 21.40131187438965, 21.06464958190918, 21.195098876953125, 21.155073165893555, 21.68206214904785, 8.656951904296875, 8.66891098022461, 8.667092323303223, 8.657218933105469, 2.797476053237915, 2.795121908187866, 2.7751567363739014, -35.326114654541016, -35.33585739135742, -35.34679412841797, -35.35205841064453, -35.324642181396484, 22.31337547302246, 21.588685989379883, 22.371187210083008, 21.798524856567383, 21.74531364440918, 22.491037368774414, 22.532258987426758, 22.097257614135742, 21.59651756286621, 22.01993179321289, 24.93752670288086, 24.907100677490234, 24.94779396057129, 24.94810676574707, 24.912691116333008, 38.61061096191406, 38.6085090637207, 38.60810089111328, 50.59627914428711, 51.2478141784668, 50.88981246948242, 51.13763427734375, 50.611083984375, 50.398887634277344, 51.14272689819336, 50.400489807128906, 50.86909484863281, 26.62944221496582, 26.34125328063965, 26.240768432617188, 27.190793991088867, 27.013992309570312, 27.211650848388672, 26.68583869934082, 27.269569396972656, 26.422161102294922, 26.938817977905273, 26.24526596069336, -22.084138870239258, 20.964096069335938, -13.321735382080078, 23.128860473632812, 23.129323959350586, 23.129138946533203, 28.859342575073242, -49.30814743041992, -49.970123291015625, -49.795372009277344, -49.95668411254883, -49.338253021240234, -49.486568450927734, -49.75401306152344, -49.573848724365234, 31.59119415283203, 31.7225341796875, 31.703258514404297, 32.05325698852539, 31.7069034576416, 31.841228485107422, 32.039852142333984, 18.4599666595459, 18.084314346313477, 18.391223907470703, 18.657838821411133, 18.088529586791992, 18.38131332397461, 18.57831573486328, 43.139923095703125, 43.138587951660156, 43.14003372192383, 43.137229919433594, 43.13914489746094, -16.596200942993164, -16.59531593322754, 22.172283172607422, 22.176353454589844, 22.179351806640625, 22.168785095214844, -7.328705310821533, -7.326674461364746, -7.347386360168457, -7.326251029968262, -7.369787216186523, 20.111957550048828, 20.24652862548828, 20.217517852783203, 20.018869400024414, 20.006141662597656, 20.252830505371094, 27.96617889404297, 27.966535568237305, 27.9635009765625, 37.933528900146484, 38.431209564208984, 38.159400939941406, 38.4959831237793, 38.541900634765625, 37.74867630004883, 38.17307662963867, 37.69267272949219, 37.86213684082031, 17.426687240600586, 17.419557571411133, 17.423786163330078, 17.44196319580078, 17.42070198059082, -47.633663177490234, -47.87929916381836, -47.8117561340332, -47.18286895751953, -47.43963623046875, -47.19351577758789, -47.56377029418945, -47.33882141113281, -54.38703918457031, -54.37321090698242, -19.587642669677734, -19.73521614074707, -19.085710525512695, -19.237403869628906, -19.12386703491211, -19.793624877929688, -18.917041778564453, -19.28270721435547, -19.675552368164062, 13.466168403625488, 13.485111236572266, 13.475837707519531, 13.496359825134277, 13.46780014038086, 12.39631175994873, 12.400782585144043, 12.39777946472168, 29.72053337097168, 29.721115112304688, -23.193052291870117, -23.515684127807617, -23.351829528808594, -23.490182876586914, -23.345279693603516, -24.227420806884766, -24.129987716674805, -23.8349609375, -24.070886611938477, -23.968381881713867, 8.533242225646973, 8.532602310180664, 8.533222198486328, 8.537431716918945, 16.43352699279785, 15.081089973449707, 14.996771812438965, 15.039948463439941, 15.039217948913574, 15.013532638549805, 10.377174377441406, 10.415907859802246, 10.244771003723145, 10.217440605163574, 10.399816513061523, 10.205963134765625, -45.74216842651367, -45.74730682373047, -45.741817474365234, -45.740562438964844, -45.740760803222656, 10.377479553222656, 10.38703727722168, 10.392452239990234, 10.370540618896484, 10.392964363098145, 1.64154052734375, 1.6382131576538086, 1.6315724849700928, -26.38961410522461, -26.39211654663086, -26.38745880126953, -26.37983512878418, 7.973665237426758, 8.174388885498047, 8.041230201721191, 7.890689373016357, 8.534941673278809, 8.620923042297363, 8.478525161743164, 8.24081802368164, 24.613622665405273, 24.952003479003906, 24.790090560913086, 24.449861526489258, 24.480419158935547, 25.047170639038086, 24.84228515625, 14.366753578186035, 14.355749130249023, 14.349175453186035, 19.448162078857422, 31.79884147644043, 31.780868530273438, 31.823060989379883, 31.799461364746094, 45.0407829284668, 45.040771484375, 42.43040084838867, 42.41851806640625, 42.42902374267578, 42.42851257324219, 42.42464828491211, -52.53044509887695, -3.155938148498535, -2.8796818256378174, -2.692490339279175, -3.250364065170288, -3.1285879611968994, -2.6988611221313477, -2.908132314682007, 33.11275863647461, 33.112552642822266, 33.11207962036133, 18.52277374267578, -6.003015995025635, -6.003298759460449, -6.001523971557617, -6.0045976638793945, 20.889053344726562, 20.88602066040039, -29.078540802001953, -29.07904052734375, 18.078266143798828, -3.4970993995666504, -3.5381932258605957, -3.327721118927002, -3.271939992904663, -3.46517014503479, -3.2104032039642334, 11.029948234558105, 11.06947135925293, 11.062063217163086, 11.059599876403809, 11.057565689086914, 3.3656105995178223, 3.9214415550231934, 3.4019882678985596, 4.011246204376221, 3.0866987705230713, 3.073415517807007, 3.9658164978027344, 3.6711747646331787, 3.669630527496338, 3.1245009899139404, 17.559486389160156, 27.181766510009766, 27.178281784057617, 27.178625106811523, 27.184091567993164, 25.574501037597656, 25.576852798461914, 25.564151763916016, 25.580490112304688, 30.692625045776367, 30.44162368774414, 31.179794311523438, 31.03142547607422, 31.177473068237305, 30.684043884277344, 30.470535278320312, 30.34078025817871, 30.98609733581543, 38.46847152709961, 38.46990966796875, 38.47005081176758, 8.65318775177002, -32.61669921875, -32.61686325073242, 10.71679973602295, 10.71477222442627, 10.712583541870117, 10.719389915466309, 20.42066764831543, 20.420419692993164, 20.376850128173828, 20.35725212097168, 20.379533767700195, 20.37837028503418, 20.389883041381836, 15.15091323852539, 15.169249534606934, 15.278226852416992, 15.268529891967773, 15.309466361999512, -3.4194695949554443, -3.413484573364258, -3.441138505935669, -3.459097385406494, -3.4275295734405518, -3.5362589359283447, 12.4593505859375, 13.846491813659668, 13.352869987487793, 13.135689735412598, 13.131237030029297, 13.422636032104492, 13.599628448486328, 13.83968734741211, 13.582568168640137, 19.779544830322266, 19.78046417236328, -20.89499855041504, 15.194920539855957, 15.192988395690918, 15.193404197692871, 24.758909225463867, -8.548921585083008, -8.17263126373291, -8.092381477355957, -8.612166404724121, -7.9459404945373535, -7.908633232116699, -8.258086204528809, -8.47465705871582, -6.015981197357178, -6.016862392425537, -7.458787441253662, -16.627302169799805, -16.638513565063477, 9.4815034866333, 8.686928749084473, 8.767452239990234, 8.733052253723145, 9.254551887512207, 9.068819999694824, 9.326662063598633, 9.521208763122559, 9.01665210723877, -33.5537223815918, -33.41852951049805, -32.519500732421875, -32.37589645385742, -33.090675354003906, -32.76300048828125, -33.34613037109375, -32.79806137084961, -33.107383728027344, -32.37151336669922, -32.52617645263672, -33.4159049987793, 17.51405143737793, -48.12157440185547, -48.121917724609375, -18.398242950439453, -18.39564323425293, -18.39533042907715, -18.401718139648438, -18.396867752075195, 39.38861846923828, 39.976600646972656, 40.174774169921875, 39.38467025756836, 40.03343963623047, 39.68410110473633, 39.431175231933594, 40.16361999511719, 39.68256759643555, -1.0205796957015991, 27.122779846191406, 26.8991641998291, 27.365554809570312, 26.963308334350586, 26.82093620300293, 27.097187042236328, 27.3533992767334, -18.807035446166992, -18.80803108215332, -18.807857513427734, -3.0396621227264404, -35.32816696166992, -35.31455993652344, -35.30586242675781, -35.31141662597656, -35.32258605957031, 29.377277374267578, 29.331165313720703, 29.79332733154297, 29.823139190673828, 29.011152267456055, 28.968809127807617, 29.059791564941406, 29.547189712524414, 29.600854873657227, -10.023449897766113, -9.717480659484863, -9.696830749511719, -9.816121101379395, -9.817838668823242, -9.982062339782715, 15.562488555908203, 11.156473159790039, 11.161606788635254, 0.8024594187736511, 0.833760678768158, 0.8056886792182922, 0.8290128707885742, 0.8213921785354614, -12.169388771057129, -12.633644104003906, -13.01504898071289, -12.31503677368164, -12.885029792785645, -13.004104614257812, -12.17520523071289, -12.59722900390625, -12.286759376525879, -12.941996574401855, -54.278358459472656, -54.273651123046875, -54.274234771728516, -54.28263854980469, -54.26875305175781, 18.047138214111328, 18.04540252685547, 18.04578971862793, 18.05464744567871, -2.4231529235839844, -2.66336727142334, -2.739593267440796, -2.7503011226654053, -2.3187143802642822, -2.389716863632202, -2.282493829727173, -2.2627387046813965, -4.026824951171875, -29.96892547607422, -29.88970375061035, -29.825037002563477, -30.073617935180664, -30.382925033569336, -30.24701690673828, -30.375465393066406, 18.231870651245117, 17.834165573120117, 17.98078155517578, 18.37459945678711, 18.547462463378906, 18.556264877319336, 17.7244815826416, 17.70110511779785, 17.938413619995117, 18.50374984741211, -43.670738220214844, -43.633705139160156, -43.811954498291016, -43.68363952636719, -43.94546127319336, -43.9042854309082, -36.151737213134766, 18.404033660888672, 18.402496337890625, 16.15940284729004, 16.160688400268555, -28.839956283569336, -28.83730697631836, 24.75139045715332, 24.754684448242188, 24.755435943603516, 24.75493812561035, 41.76799011230469, 41.76414489746094, 41.76634979248047, 41.761878967285156, 1.2915915250778198, 13.169641494750977, 13.166664123535156, 13.163803100585938, 13.17993450164795, 13.1449613571167, 14.342586517333984, 14.325929641723633, 14.335565567016602, 14.34080696105957, 14.313389778137207, 39.03230285644531, 39.286476135253906, 38.963985443115234, 39.41490173339844, 39.44419860839844, 38.90126419067383, 39.13055419921875, 38.03284454345703, 38.67974090576172, 38.68232345581055, 38.679805755615234, 25.937957763671875, 25.937850952148438, 0.10437796264886856, -12.74303913116455, 6.366682529449463, 6.366235256195068, -19.949581146240234, -20.018552780151367, -19.821163177490234, -19.782100677490234, -19.71761703491211, -20.04237174987793, 19.610979080200195, 19.610275268554688, 23.666749954223633, 21.732524871826172, 21.73271369934082, 21.73044204711914, 21.737895965576172, -44.752830505371094, -44.75190734863281, -44.7523307800293, 32.28709030151367, 35.3055305480957, 35.300228118896484, 25.343730926513672, 25.33647918701172, 25.810789108276367, 25.833444595336914, 25.719240188598633, 25.67043685913086, 25.453523635864258, 42.5044059753418, -23.019763946533203, -23.020343780517578, -23.018888473510742, -20.25642204284668, -20.251367568969727, -20.25770378112793, -20.264944076538086, -20.267351150512695, 38.859405517578125, 38.85883712768555, 38.859527587890625, -28.573060989379883, -22.03397560119629, -21.922908782958984, -21.91755485534668, -21.973066329956055, -22.081790924072266, -1.0875455141067505, -1.0859827995300293, 46.17226028442383, 46.36589431762695, 46.309810638427734, 46.41761016845703, 46.08900451660156, 46.159236907958984, 30.402408599853516, 30.39059829711914, 30.392311096191406, 48.29679870605469, 48.29973602294922, 48.29946517944336, 48.29791259765625, 48.29937744140625, 35.39366912841797, 35.39427185058594, 35.39523696899414, 35.39255905151367, 34.78495407104492, 36.040557861328125, 3.8123602867126465, 3.8132331371307373, 34.87925338745117, 34.1427001953125, 34.14676284790039, 34.14508056640625, 34.147518157958984, 7.4317193031311035, 7.426583290100098, 7.42673921585083, -14.340104103088379, -14.342109680175781, -14.352396011352539, 19.41588592529297, 14.861258506774902, 14.864226341247559, -9.927525520324707, -9.928338050842285, -9.928703308105469, -9.928986549377441, 34.50882339477539, 34.50959777832031, 16.580358505249023, 16.831918716430664, 16.470169067382812, 16.649492263793945, 16.82012367248535, 16.278118133544922, 16.420555114746094, 15.21837043762207, 14.0881986618042, 14.0865478515625, 14.085740089416504, 49.11172866821289, 49.105228424072266, 49.10498046875, 49.11041259765625, 26.470069885253906, 26.347326278686523, 26.448701858520508, 27.0653133392334, 26.72629165649414, 26.699024200439453, 26.971960067749023, 26.996707916259766, 18.629465103149414, -26.576961517333984, -26.576292037963867, -26.579288482666016, -26.579381942749023, 14.829085350036621, 14.828548431396484, 26.582456588745117, 26.57759666442871, 26.578857421875, 36.30913543701172, 15.14454174041748, -29.532310485839844, -29.54073143005371, -29.213396072387695, -29.4670352935791, -29.279312133789062, -29.23227882385254, 0.45458221435546875, 0.45696786046028137, 0.4531818926334381, 0.4525377154350281, 0.45957911014556885, 14.10048770904541, 14.107304573059082, 14.10794734954834, 14.106003761291504, -26.944866180419922, 31.539813995361328, 31.548376083374023, 31.539230346679688, 31.5385684967041, 31.53981590270996, -22.068201065063477, -22.07402229309082, 8.366649627685547, 8.366140365600586, 8.368837356567383, 8.371243476867676, 21.943334579467773, 21.947996139526367, 21.94466209411621, 0.3661123216152191, 0.36600640416145325, 0.3646478056907654, -28.10162353515625, -28.094097137451172, -28.095890045166016, -28.111860275268555, -28.093626022338867, -17.77281379699707, -17.759801864624023, -17.76862335205078, -18.07876205444336, -18.04309844970703, -17.967166900634766, -10.003591537475586, -10.005874633789062, -10.005304336547852, -23.29532814025879, -23.297040939331055, -23.2872314453125, -23.291053771972656, 29.018587112426758, 29.016138076782227, 29.012004852294922, 29.01198959350586, 28.28271484375, 28.271907806396484, 28.269296646118164, 28.249237060546875, 28.251514434814453, 12.062560081481934, 12.060970306396484, 12.066309928894043, 12.06212043762207, -5.871798515319824, -6.27864933013916, -26.42731285095215, -26.788503646850586, -26.68514060974121, -26.009729385375977, -26.826467514038086, -26.105377197265625, -26.56304168701172, -26.259279251098633, -25.881832122802734, -25.932600021362305, 17.993370056152344, 17.949054718017578, 17.95391082763672, 17.961505889892578, -11.154484748840332, -11.899337768554688, -11.328936576843262, -11.997869491577148, -11.603348731994629, -11.371152877807617, -11.886072158813477, -11.714444160461426, -11.193719863891602, -45.507015228271484, -45.503639221191406, -45.507171630859375, -45.50143814086914, -45.503536224365234, -26.032690048217773, -26.23933219909668, -25.933151245117188, -26.065635681152344, -26.1584415435791, -26.14234733581543, -15.838115692138672, -15.813797950744629, -15.840272903442383, -15.824049949645996, -15.8139066696167, 24.244531631469727, -37.25996017456055, -37.262699127197266, -37.2634162902832, 18.010297775268555, 17.771242141723633, 17.663633346557617, 17.84130859375, 18.005756378173828, 17.524038314819336, 17.5631103515625, 34.26675796508789, 34.142459869384766, 34.6212158203125, 34.07425308227539, 34.5330696105957, 34.757144927978516, 34.79409408569336, 34.34833908081055, -29.973403930664062, -29.926877975463867, -30.179208755493164, -30.24758529663086, -30.17885398864746, -30.064863204956055, 9.9336576461792, 9.932912826538086, -25.95941925048828, -25.963790893554688, 44.0172233581543, 44.01338195800781, 44.01628112792969, 44.018463134765625, 44.01741027832031, 28.914749145507812, -17.783817291259766, 27.93597412109375, -38.99421310424805, -39.2667121887207, -38.783531188964844, -39.23589324951172, -38.68506622314453, -39.083274841308594, -38.805870056152344, -46.404815673828125, -46.07366180419922, -46.560726165771484, -46.01070785522461, -46.66352081298828, -46.1384162902832, -46.270477294921875, -46.69782638549805, -17.35503578186035, 45.32395935058594, 45.74835205078125, 45.32488250732422, 45.86692428588867, 45.537139892578125, 45.75690841674805, 45.53031539916992, -40.7474479675293, -40.753787994384766, -40.76063919067383, -40.75022506713867, -40.73986053466797, 18.218826293945312, -33.80427551269531, -33.8050537109375, -33.81000518798828, 8.926806449890137, 6.608199119567871, 6.59987211227417, 1.9787828922271729, 1.973188042640686, 12.132262229919434, 12.132129669189453, 12.13248348236084, 12.132060050964355, 8.555238723754883, -21.443077087402344, -21.437341690063477, -21.440475463867188, -21.432636260986328, -21.434541702270508, -18.74827766418457, -18.75035858154297, 33.441619873046875, 33.44369888305664, 33.435523986816406, 33.43416213989258, 11.619955062866211, 11.614394187927246, 11.617948532104492, -11.833293914794922, -11.850177764892578, -11.846364974975586, -11.842402458190918, -47.25044250488281, -46.9913330078125, -47.31332778930664, -47.13975143432617, -47.11505126953125, -47.0426139831543, 12.601533889770508, 12.604795455932617, 12.604125022888184, 12.601816177368164, -1.4588029384613037, -1.4590747356414795, 0.36826056241989136, 0.36933547258377075, -13.332139015197754, -13.331543922424316, 15.294424057006836, 15.234681129455566, 15.214116096496582, 15.2152681350708, 15.220285415649414, 9.783016204833984, 9.781049728393555, 9.78219985961914, 9.785968780517578, -49.471710205078125, -7.66483211517334, -7.5213422775268555, 1.493606448173523, 1.495274543762207, -0.9184134006500244, -0.918870747089386, 30.991134643554688, 31.027393341064453, 31.561174392700195, 31.562211990356445, 5.000809192657471, 4.867987155914307, 4.718029022216797, 5.135533332824707, 4.704723358154297, 5.22243595123291, 5.124989986419678, 6.559177875518799, 6.566623687744141, 6.5628533363342285, 6.5652875900268555, 6.561412334442139, -7.802720069885254, 16.877864837646484, 16.728225708007812, 16.456193923950195, 16.8848876953125, 16.6803035736084, 16.431123733520508, 16.34537124633789, 6.880577564239502, 6.872020244598389, 7.023813724517822, 7.224524974822998, 7.1789631843566895, 7.237362384796143, 23.911922454833984, -32.31336212158203, -32.01381301879883, -32.51520538330078, -32.667266845703125, -32.38756561279297, -32.70991897583008, -32.22779083251953, -31.980731964111328, -13.819992065429688, -13.819475173950195, -13.819344520568848, -13.819905281066895, -10.692642211914062, -10.556159973144531, -10.416699409484863, -10.570545196533203, -10.522032737731934, -10.442363739013672, 1.2010078430175781, 1.201279878616333, 1.201815128326416, -4.116559028625488, -4.118771553039551, -37.08694839477539, -37.08695602416992, 2.9004127979278564, 2.9008262157440186, 21.240633010864258, 21.24146270751953, -26.270017623901367, -25.73372459411621, -25.614456176757812, -26.087352752685547, -25.54012680053711, -25.892803192138672, -26.225982666015625, -25.88770866394043, -0.662028968334198, -0.661478579044342, -31.33824920654297, -31.32688331604004, -31.32499122619629, -30.42455291748047, -33.03818130493164, 13.20207405090332, 42.989593505859375, 42.98908615112305, 42.99000930786133, 30.573070526123047, -5.856276035308838, -5.856736660003662, -5.860818862915039, 2.1293270587921143, 2.1228580474853516, 2.1296756267547607, -11.273481369018555, -11.325653076171875, -11.5348482131958, -11.989509582519531, -11.952359199523926, -11.711209297180176, -11.47655963897705, -11.815461158752441, 5.284406661987305, 5.285542011260986, 5.746614933013916, 5.745158672332764, 22.156543731689453, 22.149154663085938, 22.109149932861328, 22.13410186767578, 22.142148971557617, -55.026580810546875, -54.87137222290039, -55.02241134643555, -54.68485641479492, -54.818626403808594, -54.6778678894043, -8.037609100341797, -8.034199714660645, -8.032663345336914, -8.050683975219727, -8.041062355041504, -50.15074920654297, -49.64912033081055, -49.93394470214844, 18.301916122436523, -2.04836106300354, -2.047417163848877, -2.0480849742889404, -5.110095024108887, -5.109223365783691, 22.894638061523438, -10.715763092041016, -10.716068267822266, -10.71595287322998, -0.038951728492975235, 4.517714500427246, 4.525969982147217, 5.6985626220703125, -56.7344970703125, -56.7391357421875, -7.435959815979004, -7.45888090133667, -7.428562641143799, -7.428994178771973, -7.425929069519043, 27.358173370361328, 27.353717803955078, 34.34779739379883, 25.88641357421875, 18.72780418395996, 18.72313690185547, 18.723148345947266, 18.72093963623047, 29.99066734313965, 29.973918914794922, 29.81153678894043, 29.90375518798828, 29.871623992919922, 16.744558334350586, 15.92836856842041, 15.944089889526367, 15.932124137878418, 15.925552368164062, 13.796652793884277, -19.735301971435547, -19.90638542175293, -19.86664390563965, -19.853260040283203, -19.799057006835938, -19.708324432373047, -31.957698822021484, -31.920074462890625, -31.946401596069336, -31.932653427124023, -31.921907424926758, -37.368770599365234, -37.37185287475586, -37.37347412109375, -37.37248992919922, -36.7940788269043, -36.795413970947266, -36.7943229675293, -36.79540252685547, -34.87132263183594, -34.870914459228516, 47.71986770629883, 47.72074508666992, -16.220420837402344, -16.3009033203125, -16.47381019592285, -16.151391983032227, -16.551475524902344, -16.872323989868164, -16.72113609313965, -16.812108993530273, -2.4767119884490967, -2.0573806762695312, -2.120256185531616, 23.652551651000977, -30.815797805786133, 18.582536697387695, 11.252683639526367, 11.250065803527832, -31.08638572692871, 11.306476593017578, 32.15816116333008, 32.158058166503906, 32.160499572753906, 32.16132736206055, 1.114404320716858, 1.1159000396728516, 1.1144204139709473, 3.707765579223633, 3.706777811050415, 3.7092833518981934, 3.707871198654175, -0.6900306344032288, -0.6938208937644958, 6.97075891494751, -43.6390380859375, -43.648738861083984, -43.6431884765625, -43.642024993896484, -29.78645896911621, -29.788311004638672, -29.785850524902344, -29.78651237487793, -3.981477737426758, -3.9813292026519775, -3.9809391498565674, -3.9754626750946045, -3.954899549484253, 40.61298751831055, 8.353392601013184, 8.363113403320312, 8.345367431640625, 8.363751411437988, 8.358330726623535, 7.696299076080322, 7.632247447967529, 7.66513204574585, 7.526895523071289, 7.414878845214844, 7.401457786560059, -32.966697692871094, -32.96757888793945, -32.96315383911133, 8.350659370422363, 8.345595359802246, 21.501447677612305, -4.188136100769043, -4.1862382888793945, -24.91275405883789, -24.957780838012695, -25.40624237060547, -25.31730079650879, -25.46578025817871, -25.06419563293457, -25.171260833740234, 27.114675521850586, 27.118816375732422, 27.129459381103516, 27.11992073059082, 27.106351852416992, 28.24547576904297, 28.2368221282959, 7.740007400512695, 37.918582916259766, 37.73516845703125, 38.01768112182617, 37.610809326171875, 38.161746978759766, 37.707359313964844, 38.136356353759766, 2.280782461166382, 2.0871777534484863, 2.0771172046661377, 2.268904447555542, 2.517817258834839, 2.6170005798339844, 2.5001935958862305, -37.858585357666016, -37.86007308959961, -37.8526725769043, 41.321414947509766, 41.31866455078125, 4.378730297088623, 4.376791477203369, -15.97047233581543, 23.693119049072266, 23.62434959411621, 23.013669967651367, 23.287546157836914, 23.55714988708496, 23.093278884887695, 23.08075714111328, 23.426206588745117, 4.8228325843811035, -23.536996841430664, 30.532718658447266, 30.532875061035156, 5.863246440887451, 5.87172269821167, 5.90596342086792, 5.89120626449585, 5.950563907623291, 9.896159172058105, -42.53872299194336, -42.68222427368164, -42.419490814208984, -42.42757797241211, -42.70460510253906, -42.727081298828125, -15.841381072998047, -15.835287094116211, -15.842693328857422, -15.843113899230957, -56.8805046081543, -56.880680084228516, -56.96718978881836, -56.966583251953125, -56.967201232910156, -56.96607208251953, -34.4014778137207, -34.404273986816406, -34.39933395385742, 20.786226272583008, -18.257396697998047, -3.231966257095337, -3.2332890033721924, -3.2337605953216553, 13.480339050292969, 13.46947956085205, 13.463752746582031, 13.467397689819336, -7.140839099884033, -7.1340131759643555, -7.137805461883545, -7.144547939300537, 10.966567039489746, 10.964113235473633, 10.964073181152344, -7.593807697296143, -7.475741386413574, 26.700037002563477, 26.388778686523438, 26.399003982543945, 26.541568756103516, 26.612478256225586, 26.485301971435547, -29.228050231933594, -28.905580520629883, -28.86673355102539, -28.97260856628418, -29.073232650756836, -29.255985260009766, -10.51164436340332, -10.506423950195312, -10.507916450500488, 12.636123657226562, 13.084096908569336, 12.888650894165039, 12.63332748413086, 12.525419235229492, 12.869837760925293, 13.063505172729492, 21.477447509765625, -3.260969638824463, -3.289344310760498, -3.2937121391296387, 8.265580177307129, 8.26555347442627, 8.265091896057129, 8.26089859008789, 8.264379501342773, 15.879090309143066, 40.756690979003906, 16.171823501586914, 16.163026809692383, 16.17864227294922, 16.161136627197266, -35.12771224975586, -35.13051223754883, -35.129337310791016, -35.13075637817383, -2.064112663269043, -2.0672175884246826, -2.0615594387054443, -2.061549186706543, -41.511966705322266, -41.46648406982422, -41.522491455078125, -41.506954193115234, -41.49835968017578, -44.22910690307617, -44.132713317871094, -44.257633209228516, -44.37809753417969, -44.12138748168945, -44.35356140136719, -31.654338836669922, -31.655935287475586, 25.093589782714844, 25.112720489501953, 25.08452606201172, 25.108095169067383, -33.58842468261719, -32.86674499511719, -33.31140899658203, -33.04273986816406, -32.90705871582031, -33.351768493652344, -33.52650451660156, -33.1409912109375, -3.0343246459960938, -2.996530771255493, -2.480149984359741, -2.614237070083618, -2.3039567470550537, -2.1867833137512207, -2.2546725273132324, -2.8107352256774902, -2.832228422164917, 38.25524139404297, 38.254756927490234, 38.258365631103516, 38.25779342651367, 38.25140380859375, 10.485915184020996, 10.246654510498047, 10.246710777282715, 22.0941104888916, -3.312370538711548, -3.3106021881103516, -3.3089044094085693, 36.45171356201172, 36.452125549316406, 36.45109176635742, 22.43485450744629, 22.484830856323242, 22.492847442626953, 22.459518432617188, 44.18609619140625, 44.134830474853516, 32.91526412963867, 32.91239547729492, 32.91429138183594, 32.914344787597656, 5.853630065917969, 5.8541717529296875, 5.855406761169434, -25.0044002532959, -25.676538467407227, -25.375837326049805, -25.60395050048828, -25.72479820251465, -25.36860466003418, -25.102020263671875, -25.175474166870117, -0.5462236404418945, -0.5663567185401917, 6.171211242675781, 6.172460079193115, 17.732479095458984, 25.067035675048828, 25.066112518310547, 25.068279266357422, 25.06783676147461, -13.241304397583008, 2.8637478351593018, -22.630218505859375, -22.45216941833496, -23.452598571777344, -3.812363862991333, -3.8071200847625732, -3.8099379539489746, -3.8088152408599854, -31.914588928222656, -32.00900650024414, -32.00255584716797, -31.929306030273438, -31.93777084350586, -9.695391654968262, -9.695213317871094, -9.698222160339355, -9.704031944274902, -6.290727138519287, -6.289334774017334, -6.289206504821777, 51.840938568115234, 51.841007232666016, 16.183576583862305, 16.08493423461914, 15.96239948272705, 16.567825317382812, 15.923433303833008, 16.3215389251709, 16.513198852539062, 16.503833770751953, 17.31149673461914, 2.701112985610962, 2.69804310798645, 2.6990251541137695, 14.800158500671387, 14.778239250183105, 14.769285202026367, 14.755502700805664, 14.74404525756836, -42.28889083862305, -41.667884826660156, -41.3197021484375, -42.20343017578125, -41.40203094482422, -41.6536979675293, -41.94474411010742, -41.970767974853516, -42.23006820678711, -41.41392135620117, -16.54487419128418, -15.878689765930176, -16.175458908081055, -16.432373046875, -15.54955768585205, -15.796941757202148, -15.62149715423584, -16.15195083618164, -16.41082763671875, -16.6264705657959, -15.6232271194458, 44.26640319824219, 44.26650619506836, -15.97832202911377, -15.974777221679688, -15.973469734191895, 20.78985595703125, -32.82716369628906, -32.998016357421875, -32.94586944580078, -32.874332427978516, -32.55278396606445, -32.56662368774414, -9.937012672424316, -9.88402271270752, 16.089218139648438, 0.5526585578918457, 0.5786538124084473, 0.5355678200721741, 0.5427761077880859, 0.5284500122070312, 38.912620544433594, 38.91225814819336, 38.9122428894043, -1.1412163972854614, -1.137648105621338, -58.0806999206543, -58.07757568359375, -58.080257415771484, 29.652006149291992, 29.649253845214844, -43.50829315185547, -43.50859069824219, -2.3483691215515137, -2.3538334369659424, -2.345325231552124, 50.94394302368164, 50.944114685058594, 50.94401168823242, -0.14012515544891357, 0.41782256960868835, -0.006793452426791191, 0.22352191805839539, 0.4150865972042084, -0.028098810464143753, 0.23846282064914703, 29.102741241455078, 24.2869815826416, 24.290470123291016, 24.288536071777344, 24.287158966064453, 24.67450714111328, 24.67310905456543, 24.686269760131836, 24.696033477783203, 24.698144912719727, 24.69276237487793, 24.69532585144043, -12.6117525100708, -29.425800323486328, -29.41171646118164, -29.71735191345215, -29.49496078491211, -29.67399787902832, -29.67487335205078, -2.1800663471221924, 43.14146423339844, 43.1409797668457, 43.141902923583984, 43.142051696777344, 14.764512062072754, 14.712055206298828, 14.974383354187012, 14.677641868591309, 14.968358039855957, 14.914052963256836, 18.54257583618164, 19.313018798828125, 18.573827743530273, 19.436664581298828, 19.02925682067871, 18.81679916381836, 18.742238998413086, 19.27256965637207, 19.12857437133789, 18.38174819946289, -33.386436462402344, -33.38676834106445, -33.386390686035156, 23.21918487548828, -1.9525316953659058, -1.9546228647232056, -1.9526299238204956, 31.79587745666504, 31.799571990966797, 31.800458908081055, 31.81169891357422, 31.80310821533203, -7.642937660217285, -7.643837928771973, 14.393228530883789, 14.393363952636719, 14.39262580871582, -17.14393424987793, -17.146846771240234, -17.126880645751953, -17.3830509185791, -17.15226173400879, -17.386804580688477, 40.70747375488281, 40.441864013671875, 40.51896667480469, 40.396568298339844, 40.58501052856445, 40.664180755615234, -40.0111083984375, -40.01359558105469, -40.01542663574219, -40.892555236816406, -40.823089599609375, -41.155433654785156, -41.11561965942383, -40.895755767822266, -41.05400466918945, 14.066155433654785, 3.1905248165130615, 3.3420722484588623, 3.1779658794403076, 3.0235447883605957, 3.3289222717285156, 3.0389740467071533, 19.750761032104492, 19.748821258544922, 19.750980377197266, 19.756099700927734, -22.676660537719727, 53.795047760009766, 53.793678283691406, 53.79328918457031, 53.78799819946289, 53.79477310180664, -24.597257614135742, -13.87508773803711, -13.87178897857666, -13.87104320526123, -13.86453914642334, 5.26564884185791, 5.267242908477783, 5.2550129890441895, 5.262408256530762, 5.912148475646973, 5.912282943725586, -4.591015815734863, 20.169784545898438, 20.169729232788086, -10.095734596252441, -10.10655403137207, -9.912860870361328, -10.171915054321289, -9.954948425292969, -9.787740707397461, -14.027153968811035, -13.765966415405273, -13.554597854614258, -13.991493225097656, -14.178147315979004, -13.47992992401123, -14.0242919921875, -13.518078804016113, 37.791282653808594, 37.791927337646484, 37.7913932800293, 9.540423393249512, 9.539304733276367, 9.543862342834473, -3.9976565837860107, -42.002777099609375, -42.11516571044922, -42.01088333129883, -42.259422302246094, -42.178409576416016, -42.28593063354492, 0.01017790101468563, -6.014378070831299, -6.0181565284729, -6.017068386077881, -6.017688751220703, -5.319100856781006, -5.305196285247803, -5.370142459869385, -5.328769207000732, -5.30883264541626, 31.684965133666992, 31.684518814086914, 4.65003776550293, 4.646630764007568, 4.646810054779053, 4.63346004486084, 4.635987281799316, 16.363956451416016, -8.225297927856445, -8.223050117492676, -8.224055290222168, -38.75217056274414, -38.75292205810547, 26.35517120361328, 26.354175567626953, -36.06904983520508, -36.02882766723633, -36.07080078125, -36.02425003051758, -36.03730010986328, -41.57865905761719, 38.947105407714844, 38.94660186767578, 38.9467658996582, -2.63562273979187, 16.951412200927734, 16.9505558013916, 42.466392517089844, -11.783584594726562, -11.783821105957031, -11.784163475036621, -11.78378677368164, -11.786603927612305, -5.468772888183594, -5.469125270843506, 18.315643310546875, 18.314359664916992, 18.315258026123047, 18.312314987182617, -8.266495704650879, -8.269063949584961, 5.57085657119751, 5.562460422515869, 5.5692057609558105, 5.563599109649658, 5.572672367095947, 2.858668565750122, 2.858051300048828, 2.8598806858062744, 28.558040618896484, 28.431123733520508, 28.40139389038086, 28.690183639526367, 28.714065551757812, 28.570720672607422, -17.155519485473633, -17.154388427734375, -17.15578269958496, 23.19464683532715, 23.196462631225586, 23.192834854125977, 7.129627704620361, 7.113959312438965, 6.838094711303711, 6.817015647888184, 6.960991382598877, 6.958813190460205, -16.182315826416016, 25.790599822998047, 25.773880004882812, 25.76763916015625, -21.042509078979492, -20.641368865966797, -20.6408748626709, -21.188987731933594, 33.64412307739258, 33.64402389526367, 33.64323043823242, 31.053171157836914, 31.054990768432617, 31.04871368408203, -7.634324550628662, -9.994010925292969, -18.211313247680664, -18.667438507080078, -18.44378089904785, -18.22260856628418, -18.347057342529297, -18.885540008544922, -18.723316192626953, -18.985374450683594, -19.04397201538086, -29.187984466552734, -29.186664581298828, -29.184585571289062, 15.691022872924805, 15.691450119018555, 15.690035820007324, 12.404831886291504, 12.404377937316895, -46.19942092895508, -46.198490142822266, -46.19878005981445, -46.19814682006836, 12.486980438232422, 12.482490539550781, 12.478582382202148, 30.3718318939209, 30.3714599609375, 18.57948875427246, 18.577653884887695, 18.576993942260742, -34.575408935546875, -34.57048034667969, -34.57372283935547, -23.363584518432617, 46.93637466430664, 46.93878173828125, 46.94318389892578, 46.94384765625, 46.94392013549805, -21.92167854309082, -22.03019142150879, -22.00393295288086, -21.986528396606445, -21.918025970458984, -30.71994972229004, -31.03073501586914, -30.41677474975586, -30.544414520263672, -31.22401237487793, -31.275737762451172, -31.09688949584961, -30.486469268798828, -30.83112144470215, 10.062305450439453, -20.17676544189453, -20.176116943359375, -20.1763916015625, 11.774186134338379, -33.67466354370117, 4.007706165313721, 27.699604034423828, 10.273591041564941, 10.275212287902832, -8.675962448120117, -8.720319747924805, -8.714585304260254, -8.704304695129395, -8.696915626525879, 17.094078063964844, 17.09287452697754, 17.092988967895508, 7.683358192443848, 7.681529998779297, 15.697549819946289, -11.283888816833496, -11.283696174621582, -36.88261795043945, -36.88181686401367, -36.88169860839844, -36.881771087646484, 15.406106948852539, -1.4628554582595825, -1.4641731977462769, -1.464605689048767, -1.4674345254898071, -31.229022979736328, -31.7437744140625, -31.277606964111328, -31.892589569091797, -31.784860610961914, -31.135757446289062, -31.535009384155273, -31.53071403503418, 7.514825820922852, 29.542049407958984, 29.53042221069336, -14.22795295715332, -41.614105224609375, -41.61539077758789, -41.62065887451172, -41.617897033691406, 21.637998580932617, 21.636682510375977, 21.62732696533203, 21.625125885009766, 21.627391815185547, 16.166133880615234, 16.16585350036621, -49.79198455810547, -49.6036262512207, -49.79666519165039, -49.537574768066406, -49.62736129760742, -49.886531829833984, 3.030226707458496, -7.663838863372803, -6.940779685974121, 16.702016830444336, -51.27207946777344, -51.27406311035156, -51.27574157714844, -51.27615737915039, 25.513582229614258, -20.066390991210938, -20.06627082824707, -20.065622329711914, 34.646629333496094, 34.646156311035156, -23.231964111328125, -23.75086784362793, -23.469804763793945, -23.219497680664062, -23.71854019165039, -23.83003044128418, -23.461713790893555, -23.103321075439453, -10.394655227661133, 22.73990821838379, 22.7401065826416, 22.744178771972656, 22.745420455932617, 20.886714935302734, -4.89597749710083, -4.893609523773193, -4.895732879638672, -0.48506009578704834, -0.48914825916290283, 35.203407287597656, 35.20281219482422, 35.20284652709961, 35.20296859741211, 5.995255947113037 ] }, { "marker": { "color": "#00ff00", "line": { "color": "white", "width": 3 }, "size": 25, "symbol": "star" }, "mode": "markers", "name": "Candidate #0", "type": "scatter", "x": [ 41.186309814453125 ], "y": [ -1.4922877550125122 ] } ], "layout": { "font": { "color": "white" }, "height": 800, "paper_bgcolor": "#0d0d0d", "plot_bgcolor": "#1a1a1a", "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Candidate #0 and Top Matches" }, "width": 1200, "xaxis": { "title": { "text": "Dimension 1" } }, "yaxis": { "title": { "text": "Dimension 2" } } } } }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "✅ Highlighted visualization created!\n", " ⭐ Green star = Candidate #0\n", " 🔴 Red dots = Top matches\n", " 💛 Yellow lines = Connections\n" ] } ], "source": [ "# ============================================================================\n", "# 🔍 HIGHLIGHTED MATCH NETWORK\n", "# ============================================================================\n", "\n", "target_candidate = 0\n", "\n", "print(f\"🔍 Analyzing Candidate #{target_candidate}...\\n\")\n", "\n", "matches = find_top_matches(target_candidate, top_k=10)\n", "match_indices = [comp_idx for comp_idx, score in matches if comp_idx < n_comp_viz]\n", "\n", "# Create highlighted plot\n", "fig2 = go.Figure()\n", "\n", "# All companies (background)\n", "fig2.add_trace(go.Scatter(\n", " x=comp_2d[:, 0],\n", " y=comp_2d[:, 1],\n", " mode='markers',\n", " name='All Companies',\n", " marker=dict(size=4, color='#ff6b6b', opacity=0.3),\n", " showlegend=True\n", "))\n", "\n", "# Top matches (highlighted)\n", "if match_indices:\n", " match_positions = comp_2d[match_indices]\n", " fig2.add_trace(go.Scatter(\n", " x=match_positions[:, 0],\n", " y=match_positions[:, 1],\n", " mode='markers',\n", " name='Top Matches',\n", " marker=dict(\n", " size=15,\n", " color='#ff0000',\n", " line=dict(width=2, color='white')\n", " ),\n", " text=[f\"Match #{i+1}: {companies_full.iloc[match_indices[i]].get('name', 'N/A')[:30]}
Score: {matches[i][1]:.3f}\" \n", " for i in range(len(match_indices))],\n", " hovertemplate='%{text}'\n", " ))\n", "\n", "# Target candidate (star)\n", "fig2.add_trace(go.Scatter(\n", " x=[cand_2d[target_candidate, 0]],\n", " y=[cand_2d[target_candidate, 1]],\n", " mode='markers',\n", " name=f'Candidate #{target_candidate}',\n", " marker=dict(\n", " size=25,\n", " color='#00ff00',\n", " symbol='star',\n", " line=dict(width=3, color='white')\n", " )\n", "))\n", "\n", "# Connection lines (top 5)\n", "for i, match_idx in enumerate(match_indices[:5]):\n", " fig2.add_trace(go.Scatter(\n", " x=[cand_2d[target_candidate, 0], comp_2d[match_idx, 0]],\n", " y=[cand_2d[target_candidate, 1], comp_2d[match_idx, 1]],\n", " mode='lines',\n", " line=dict(color='yellow', width=1, dash='dot'),\n", " opacity=0.5,\n", " showlegend=False\n", " ))\n", "\n", "fig2.update_layout(\n", " title=f'Candidate #{target_candidate} and Top Matches',\n", " xaxis_title='Dimension 1',\n", " yaxis_title='Dimension 2',\n", " width=1200,\n", " height=800,\n", " plot_bgcolor='#1a1a1a',\n", " paper_bgcolor='#0d0d0d',\n", " font=dict(color='white')\n", ")\n", "\n", "fig2.show()\n", "\n", "print(\"\\n✅ Highlighted visualization created!\")\n", "print(f\" ⭐ Green star = Candidate #{target_candidate}\")\n", "print(f\" 🔴 Red dots = Top matches\")\n", "print(f\" 💛 Yellow lines = Connections\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🌐 Interactive Visualization 3: Network Graph (PyVis)\n", "\n", "Interactive network showing candidate-company connections with nodes & edges" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🌐 Creating interactive network graph...\n", "\n", "✅ Network graph created!\n", "📄 Saved: ../results/network_graph.html\n", "\n", "💡 LEGEND:\n", " ⭐ Green star = Candidate #0\n", " 🔴 Red nodes = Companies (size = match score)\n", " 💛 Yellow edges = Connections\n", "\n", "ℹ️ Hover over nodes to see details\n", " Drag nodes to rearrange\n", " Zoom with mouse wheel\n", "\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ============================================================================\n", "# 🌐 NETWORK GRAPH WITH PYVIS\n", "# ============================================================================\n", "\n", "from pyvis.network import Network\n", "import webbrowser\n", "import os\n", "\n", "print(\"🌐 Creating interactive network graph...\\n\")\n", "\n", "target_candidate = 0\n", "top_k_network = 10\n", "\n", "# Get matches\n", "matches = find_top_matches(target_candidate, top_k=top_k_network)\n", "\n", "# Create network\n", "net = Network(\n", " height='800px',\n", " width='100%',\n", " bgcolor='#1a1a1a',\n", " font_color='white',\n", " directed=False\n", ")\n", "\n", "# Configure physics\n", "net.barnes_hut(\n", " gravity=-5000,\n", " central_gravity=0.3,\n", " spring_length=100,\n", " spring_strength=0.01\n", ")\n", "\n", "# Add candidate node (center)\n", "cand = candidates.iloc[target_candidate]\n", "cand_label = f\"Candidate #{target_candidate}\"\n", "net.add_node(\n", " f'cand_{target_candidate}',\n", " label=cand_label,\n", " title=f\"{cand.get('Category', 'N/A')}
Skills: {str(cand.get('skills', 'N/A'))[:100]}\",\n", " color='#00ff00',\n", " size=40,\n", " shape='star'\n", ")\n", "\n", "# Add company nodes + edges\n", "for rank, (comp_idx, score) in enumerate(matches, 1):\n", " if comp_idx >= len(companies_full):\n", " continue\n", " \n", " company = companies_full.iloc[comp_idx]\n", " comp_name = company.get('name', f'Company {comp_idx}')[:30]\n", " \n", " # Color by score\n", " if score > 0.7:\n", " color = '#ff0000' # Red (strong match)\n", " elif score > 0.5:\n", " color = '#ff6b6b' # Light red (good match)\n", " else:\n", " color = '#ffaaaa' # Pink (weak match)\n", " \n", " # Add company node\n", " net.add_node(\n", " f'comp_{comp_idx}',\n", " label=f\"#{rank}. {comp_name}\",\n", " title=f\"Score: {score:.3f}
Industries: {str(company.get('industries_list', 'N/A'))[:50]}
Required: {str(company.get('required_skills', 'N/A'))[:100]}\",\n", " color=color,\n", " size=20 + (score * 20) # Size by score\n", " )\n", " \n", " # Add edge\n", " net.add_edge(\n", " f'cand_{target_candidate}',\n", " f'comp_{comp_idx}',\n", " value=float(score),\n", " title=f\"Similarity: {score:.3f}\",\n", " color='yellow'\n", " )\n", "\n", "# Save\n", "output_file = f'{Config.RESULTS_PATH}network_graph.html'\n", "net.save_graph(output_file)\n", "\n", "print(f\"✅ Network graph created!\")\n", "print(f\"📄 Saved: {output_file}\")\n", "print(f\"\\n💡 LEGEND:\")\n", "print(f\" ⭐ Green star = Candidate #{target_candidate}\")\n", "print(f\" 🔴 Red nodes = Companies (size = match score)\")\n", "print(f\" 💛 Yellow edges = Connections\")\n", "print(f\"\\nℹ️ Hover over nodes to see details\")\n", "print(f\" Drag nodes to rearrange\")\n", "print(f\" Zoom with mouse wheel\\n\")\n", "\n", "# Display in notebook\n", "from IPython.display import IFrame\n", "IFrame(output_file, width=1000, height=800)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 📊 Network Node Data\n", "\n", "Detailed information about nodes and connections" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "📊 NETWORK DATA SUMMARY\n", "================================================================================\n", "\n", "Total nodes: 11\n", " - 1 candidate node (green star)\n", " - 10 company nodes (red circles)\n", "\n", "Total edges: 10\n", "\n", "================================================================================\n", "\n", "🎯 CANDIDATE NODE:\n", " ID: cand_0\n", " Category: N/A\n", " Skills: ['Big Data', 'Hadoop', 'Hive', 'Python', 'Mapreduce', 'Spark', 'Java', 'Machine Learning', 'Cloud', ...\n", "\n", "🏢 COMPANY NODES (Top 5):\n", "\n", " #1. TeachTown\n", " ID: comp_9418\n", " Score: 0.7028\n", " Industries: E-Learning Providers...\n", "\n", " #2. Wolverine Power Systems\n", " ID: comp_9417\n", " Score: 0.7026\n", " Industries: Renewable Energy Semiconductor Manufacturing...\n", "\n", " #3. Mariner\n", " ID: comp_9416\n", " Score: 0.7010\n", " Industries: Financial Services...\n", "\n", " #4. Primavera School\n", " ID: comp_13786\n", " Score: 0.6827\n", " Industries: Education Administration Programs...\n", "\n", " #5. OM1, Inc.\n", " ID: comp_16864\n", " Score: 0.6776\n", " Industries: Pharmaceutical Manufacturing...\n", "\n", "================================================================================\n" ] } ], "source": [ "# ============================================================================\n", "# DISPLAY NODE DATA\n", "# ============================================================================\n", "\n", "print(\"📊 NETWORK DATA SUMMARY\")\n", "print(\"=\" * 80)\n", "print(f\"\\nTotal nodes: {1 + len(matches)}\")\n", "print(f\" - 1 candidate node (green star)\")\n", "print(f\" - {len(matches)} company nodes (red circles)\")\n", "print(f\"\\nTotal edges: {len(matches)}\")\n", "print(f\"\\n\" + \"=\" * 80)\n", "\n", "# Show node details\n", "print(f\"\\n🎯 CANDIDATE NODE:\")\n", "print(f\" ID: cand_{target_candidate}\")\n", "print(f\" Category: {cand.get('Category', 'N/A')}\")\n", "print(f\" Skills: {str(cand.get('skills', 'N/A'))[:100]}...\")\n", "\n", "print(f\"\\n🏢 COMPANY NODES (Top 5):\")\n", "for rank, (comp_idx, score) in enumerate(matches[:5], 1):\n", " if comp_idx < len(companies_full):\n", " company = companies_full.iloc[comp_idx]\n", " print(f\"\\n #{rank}. {company.get('name', 'N/A')[:40]}\")\n", " print(f\" ID: comp_{comp_idx}\")\n", " print(f\" Score: {score:.4f}\")\n", " print(f\" Industries: {str(company.get('industries_list', 'N/A'))[:60]}...\")\n", "\n", "print(f\"\\n\" + \"=\" * 80)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🔍 Visualization 4: Display Node Data\n", "\n", "Inspect detailed information about candidates and companies" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================================================================================\n", "🟢 CANDIDATE #0\n", "================================================================================\n", "\n", "📊 KEY INFORMATION:\n", "\n", "Resume ID: N/A\n", "Category: N/A\n", "Skills: ['Big Data', 'Hadoop', 'Hive', 'Python', 'Mapreduce', 'Spark', 'Java', 'Machine Learning', 'Cloud', 'Hdfs', 'YARN', 'Core Java', 'Data Science', 'C++', 'Data Structures', 'DBMS', 'RDBMS', 'Informatica\n", "Career Objective: Big data analytics working and database warehouse manager with robust experience in handling all kinds of data. I have also used multiple cloud infrastructure services and am well acquainted with them\n", "\n", "================================================================================\n", "\n", "🎯 TOP 5 MATCHES:\n", "================================================================================\n", "#1. TeachTown (Score: 0.7028)\n", "#2. Wolverine Power Systems (Score: 0.7026)\n", "#3. Mariner (Score: 0.7010)\n", "#4. Primavera School (Score: 0.6827)\n", "#5. OM1, Inc. (Score: 0.6776)\n", "\n", "================================================================================\n" ] } ], "source": [ "# ============================================================================\n", "# DISPLAY NODE DATA - See what's behind the graph\n", "# ============================================================================\n", "\n", "def display_node_data(node_id):\n", " print(\"=\" * 80)\n", " \n", " if node_id.startswith('C'):\n", " # CANDIDATE\n", " cand_idx = int(node_id[1:])\n", " \n", " if cand_idx >= len(candidates):\n", " print(f\"❌ Candidate {cand_idx} not found!\")\n", " return\n", " \n", " candidate = candidates.iloc[cand_idx]\n", " \n", " print(f\"🟢 CANDIDATE #{cand_idx}\")\n", " print(\"=\" * 80)\n", " print(f\"\\n📊 KEY INFORMATION:\\n\")\n", " print(f\"Resume ID: {candidate.get('Resume_ID', 'N/A')}\")\n", " print(f\"Category: {candidate.get('Category', 'N/A')}\")\n", " print(f\"Skills: {str(candidate.get('skills', 'N/A'))[:200]}\")\n", " print(f\"Career Objective: {str(candidate.get('career_objective', 'N/A'))[:200]}\")\n", " \n", " elif node_id.startswith('J'):\n", " # COMPANY\n", " comp_idx = int(node_id[1:])\n", " \n", " if comp_idx >= len(companies_full):\n", " print(f\"❌ Company {comp_idx} not found!\")\n", " return\n", " \n", " company = companies_full.iloc[comp_idx]\n", " \n", " print(f\"🔴 COMPANY #{comp_idx}\")\n", " print(\"=\" * 80)\n", " print(f\"\\n📊 COMPANY INFORMATION:\\n\")\n", " print(f\"Name: {company.get('name', 'N/A')}\")\n", " print(f\"Industries: {str(company.get('industries_list', 'N/A'))[:200]}\")\n", " print(f\"Required Skills: {str(company.get('required_skills', 'N/A'))[:200]}\")\n", " print(f\"Posted Jobs: {str(company.get('posted_job_titles', 'N/A'))[:200]}\")\n", " \n", " print(\"\\n\" + \"=\" * 80 + \"\\n\")\n", "\n", "def display_node_with_connections(node_id, top_k=10):\n", " display_node_data(node_id)\n", " \n", " if node_id.startswith('C'):\n", " cand_idx = int(node_id[1:])\n", " \n", " print(f\"🎯 TOP {top_k} MATCHES:\")\n", " print(\"=\" * 80)\n", " \n", " matches = find_top_matches(cand_idx, top_k=top_k)\n", " \n", " # FIXED: Validate indices before accessing\n", " valid_matches = 0\n", " for rank, (comp_idx, score) in enumerate(matches, 1):\n", " # Check if index is valid\n", " if comp_idx >= len(companies_full):\n", " print(f\"⚠️ Match #{rank}: Index {comp_idx} out of range (skipping)\")\n", " continue\n", " \n", " company = companies_full.iloc[comp_idx]\n", " print(f\"#{rank}. {company.get('name', 'N/A')[:40]} (Score: {score:.4f})\")\n", " valid_matches += 1\n", " \n", " if valid_matches == 0:\n", " print(\"⚠️ No valid matches found (all indices out of bounds)\")\n", " print(\"\\n💡 SOLUTION: Regenerate embeddings after deduplication!\")\n", " \n", " print(\"\\n\" + \"=\" * 80)\n", "\n", "# Example usage\n", "display_node_with_connections('C0', top_k=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🕸️ Visualization 5: NetworkX Graph\n", "\n", "Network graph using NetworkX + Plotly with force-directed layout" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🕸️ Creating NETWORK GRAPH...\n", "\n", "📊 Network size:\n", " • 20 candidates\n", " • 5 companies per candidate\n", "\n", "✅ Network created!\n", " Nodes: 74\n", " Edges: 100\n", "\n", "🔄 Calculating layout...\n", "✅ Layout done!\n", "\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 2.1084174513816833 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.0318786442433591, 0.8338336475325094, null ], "y": [ 0.988981958829275, 0.40312308868228247, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 2.1077165007591248 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.0318786442433591, -0.6949348089835338, null ], "y": [ 0.988981958829275, -0.7198309644751111, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 2.103096306324005 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.0318786442433591, -0.8587213208599893, null ], "y": [ 0.988981958829275, 0.5610321633503569, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 2.0479767322540283 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.0318786442433591, 0.3560795400845579, null ], "y": [ 0.988981958829275, 0.8446038805235159, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 2.0328474640846252 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.0318786442433591, -0.703616873335463, null ], "y": [ 0.988981958829275, 0.7934582640248695, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7862115502357483 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.3560795400845579, 0.5921871632171531, null ], "y": [ 0.8446038805235159, 0.8069495508567666, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8613731265068054 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.7600186746361879, -0.8129168291902286, null ], "y": [ -0.6332987184781399, -0.5537985004519345, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8605908155441284 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.7600186746361879, -0.20992886381906808, null ], "y": [ -0.6332987184781399, 0.49097452712973244, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7296607494354248 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.7600186746361879, 0.24141370170441712, null ], "y": [ -0.6332987184781399, -0.8602881624953236, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.69741952419281 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.7600186746361879, 0.35300202597267716, null ], "y": [ -0.6332987184781399, -0.9013779606691754, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6822435855865479 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.7600186746361879, -0.8056288434155425, null ], "y": [ -0.6332987184781399, -0.4356934917571282, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.504475712776184 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.8129168291902286, 0.9377523577735148, null ], "y": [ -0.5537985004519345, 0.24737815542754044, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.86833918094635 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.8129168291902286, -0.8215148751076258, null ], "y": [ -0.5537985004519345, -0.018033772475116477, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.551601231098175 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.20992886381906808, 0.9377523577735148, null ], "y": [ 0.49097452712973244, 0.24737815542754044, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8882769346237183 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.20992886381906808, -0.8215148751076258, null ], "y": [ 0.49097452712973244, -0.018033772475116477, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7182479500770569 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.20992886381906808, 0.9311629389386256, null ], "y": [ 0.49097452712973244, -0.41259534040710694, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8564974069595337 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.12256476800902333, -0.8936136198185795, null ], "y": [ 0.9252597991243965, 0.26667787249682245, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.851776361465454 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.12256476800902333, 0.26037178026216184, null ], "y": [ 0.9252597991243965, -0.9600690637569351, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8382592797279358 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.12256476800902333, 0.4423825211273832, null ], "y": [ 0.9252597991243965, -0.843818058240147, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7907847166061401 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.12256476800902333, -0.5007328288395386, null ], "y": [ 0.9252597991243965, 0.9079872609837913, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7901658415794373 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.12256476800902333, 0.8896720687197679, null ], "y": [ 0.9252597991243965, 0.5160301022248421, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6929402351379395 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.8936136198185795, 0.9718289961607458, null ], "y": [ 0.26667787249682245, -0.0012489085730085687, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.78109872341156 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.8936136198185795, 0.9311629389386256, null ], "y": [ 0.26667787249682245, -0.41259534040710694, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6051805019378662 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.8936136198185795, -0.3323919630734096, null ], "y": [ 0.26667787249682245, -0.95310972993659, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5601306557655334 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, -0.45510761780733233, null ], "y": [ -0.9600690637569351, -0.8771340529992666, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.521764874458313 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, 0.5880469328567001, null ], "y": [ -0.9600690637569351, -0.7799510009833339, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.563081979751587 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, 0.9377523577735148, null ], "y": [ -0.9600690637569351, 0.24737815542754044, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7556148767471313 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, -0.5976025974158469, null ], "y": [ -0.9600690637569351, -0.5177608869441581, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7798132300376892 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, 0.920284991483624, null ], "y": [ -0.9600690637569351, 0.149911003119065, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.4878393113613129 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, 0.4344083688528717, null ], "y": [ -0.9600690637569351, 0.9043081347609362, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.9614944458007812 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, 0.1825003845820605, null ], "y": [ -0.9600690637569351, 0.8856123864410301, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6479275822639465 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, -0.3323919630734096, null ], "y": [ -0.9600690637569351, -0.95310972993659, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8778833746910095 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.26037178026216184, 0.716838001473834, null ], "y": [ -0.9600690637569351, 0.4914287444739235, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7009924054145813 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.4423825211273832, -0.971414293246791, null ], "y": [ -0.843818058240147, -0.22258116370897627, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7009124755859375 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.4423825211273832, 0.9311629389386256, null ], "y": [ -0.843818058240147, -0.41259534040710694, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7879571318626404 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.4423825211273832, 0.716838001473834, null ], "y": [ -0.843818058240147, 0.4914287444739235, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.675342082977295 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5007328288395386, -0.5976025974158469, null ], "y": [ 0.9079872609837913, -0.5177608869441581, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7297621369361877 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5007328288395386, 0.9718289961607458, null ], "y": [ 0.9079872609837913, -0.0012489085730085687, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.4602797031402588 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5007328288395386, 0.4344083688528717, null ], "y": [ 0.9079872609837913, 0.9043081347609362, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.818146824836731 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5007328288395386, 0.1825003845820605, null ], "y": [ 0.9079872609837913, 0.8856123864410301, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7171634435653687 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5007328288395386, 0.716838001473834, null ], "y": [ 0.9079872609837913, 0.4914287444739235, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.4236835539340973 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.8896720687197679, -0.5563210525255852, null ], "y": [ 0.5160301022248421, 0.8150655688798616, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.674481987953186 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.8896720687197679, -0.5976025974158469, null ], "y": [ 0.5160301022248421, -0.5177608869441581, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7227413654327393 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.8896720687197679, 0.9718289961607458, null ], "y": [ 0.5160301022248421, -0.0012489085730085687, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.812535285949707 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.8896720687197679, 0.1825003845820605, null ], "y": [ 0.5160301022248421, 0.8856123864410301, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.713265299797058 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.8896720687197679, 0.716838001473834, null ], "y": [ 0.5160301022248421, 0.4914287444739235, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5732178688049316 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.45510761780733233, 0.7672720085277207, null ], "y": [ -0.8771340529992666, -0.4811021010561043, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5706340074539185 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.45510761780733233, -0.9578263709863069, null ], "y": [ -0.8771340529992666, 0.07703819887789656, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5432207584381104 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.45510761780733233, -0.7989282600264442, null ], "y": [ -0.8771340529992666, 0.671138629766234, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5126407146453857 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.45510761780733233, -0.5599609735071868, null ], "y": [ -0.8771340529992666, 0.52761455738175, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8709123134613037 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5599609735071868, -0.971414293246791, null ], "y": [ 0.52761455738175, -0.22258116370897627, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5490554571151733 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5599609735071868, 0.9377523577735148, null ], "y": [ 0.52761455738175, 0.24737815542754044, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6973083019256592 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5599609735071868, -0.5976025974158469, null ], "y": [ 0.52761455738175, -0.5177608869441581, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5277642607688904 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5599609735071868, -0.5930503255863487, null ], "y": [ 0.52761455738175, -0.7667491875417256, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.708068072795868 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5599609735071868, 0.9311629389386256, null ], "y": [ 0.52761455738175, -0.41259534040710694, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5966639518737793 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5599609735071868, -0.3323919630734096, null ], "y": [ 0.52761455738175, -0.95310972993659, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7233679294586182 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5599609735071868, 0.716838001473834, null ], "y": [ 0.52761455738175, 0.4914287444739235, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5464077591896057 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.008116394143636792, 0.12720550602658615, null ], "y": [ 0.825184807919145, -0.9383807650976768, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5452234745025635 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.008116394143636792, 0.9522938747640646, null ], "y": [ 0.825184807919145, 0.3633224713808146, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5407277345657349 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.008116394143636792, 0.7125181236349108, null ], "y": [ 0.825184807919145, 0.7553492480585224, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.3980203568935394 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.008116394143636792, 0.1202269486345491, null ], "y": [ 0.825184807919145, 0.9755492141641122, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.397590845823288 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.008116394143636792, -0.908499195498904, null ], "y": [ 0.825184807919145, -0.4274062018558911, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5846426486968994 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.12720550602658615, -0.5563210525255852, null ], "y": [ -0.9383807650976768, 0.8150655688798616, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.511083960533142 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.9522938747640646, -0.5563210525255852, null ], "y": [ 0.3633224713808146, 0.8150655688798616, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5837324857711792 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.7125181236349108, -0.5563210525255852, null ], "y": [ 0.7553492480585224, 0.8150655688798616, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.695440411567688 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.971414293246791, -0.3539446651136998, null ], "y": [ -0.22258116370897627, -0.8525044679085142, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6911803483963013 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.971414293246791, 0.9090686384400677, null ], "y": [ -0.22258116370897627, -0.3184658308401831, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6885857582092285 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.971414293246791, -0.7589918330884283, null ], "y": [ -0.22258116370897627, 0.49085179207513724, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.4993736147880554 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5563210525255852, -0.3833778530101549, null ], "y": [ 0.8150655688798616, 0.9644881457232451, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5398488640785217 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.5880469328567001, -0.965881003820822, null ], "y": [ -0.7799510009833339, 0.3468404881619146, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5296419858932495 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.5880469328567001, 0.5060469051636167, null ], "y": [ -0.7799510009833339, 0.7948221673899531, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5200804471969604 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.5880469328567001, 0.5152390052380482, null ], "y": [ -0.7799510009833339, -0.8701801354405351, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5190359950065613 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.5880469328567001, 0.03884341268679191, null ], "y": [ -0.7799510009833339, -0.9613272184529631, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5015045404434204 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.9377523577735148, -0.050875608622057755, null ], "y": [ 0.24737815542754044, -0.9865885919864976, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6345769762992859 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.050875608622057755, 0.4344083688528717, null ], "y": [ -0.9865885919864976, 0.9043081347609362, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7599545121192932 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.050875608622057755, -0.3323919630734096, null ], "y": [ -0.9865885919864976, -0.95310972993659, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6753939390182495 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5976025974158469, 0.6541397263656016, null ], "y": [ -0.5177608869441581, 0.6571732094522764, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7171101570129395 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.6541397263656016, 0.9718289961607458, null ], "y": [ 0.6571732094522764, -0.0012489085730085687, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8137426376342773 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.6541397263656016, 0.1825003845820605, null ], "y": [ 0.6571732094522764, 0.8856123864410301, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7582030296325684 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.9718289961607458, -0.8802527809215748, null ], "y": [ -0.0012489085730085687, 0.43414067355576974, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7454603910446167 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.920284991483624, 0.9268109330320923, null ], "y": [ 0.149911003119065, -0.10218826231842465, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6930772066116333 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.920284991483624, 0.8197873359172848, null ], "y": [ 0.149911003119065, -0.21352020487847648, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6758161187171936 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.920284991483624, -0.8080312555509204, null ], "y": [ 0.149911003119065, -0.6600593920811364, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6466056108474731 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.920284991483624, -0.9795363059011597, null ], "y": [ 0.149911003119065, 0.1919918677472795, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7621017098426819 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.8215148751076258, 0.8522029509867697, null ], "y": [ -0.018033772475116477, -0.5302979577303915, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7601535320281982 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.8215148751076258, -0.3346139490733518, null ], "y": [ -0.018033772475116477, 0.8643573172164094, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.7445834875106812 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.8215148751076258, -0.5450901973095849, null ], "y": [ -0.018033772475116477, -0.8462702899506104, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5326129794120789 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5930503255863487, 0.8083314881745419, null ], "y": [ -0.7667491875417256, 0.6189128347742368, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5217523574829102 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5930503255863487, 0.2720788119806062, null ], "y": [ -0.7667491875417256, 0.9324299383843284, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.4684463143348694 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5930503255863487, 0.6860035942339918, null ], "y": [ -0.7667491875417256, -0.7123056544250477, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.4666415452957153 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.5930503255863487, 0.971972386681689, null ], "y": [ -0.7667491875417256, 0.08059858080596716, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.4689895510673523 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.4344083688528717, -0.21580173926034327, null ], "y": [ 0.9043081347609362, -0.9543517503420255, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.4627680778503418 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.4344083688528717, -0.9191564797013532, null ], "y": [ 0.9043081347609362, -0.13121735419580033, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.5831842422485352 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ -0.21580173926034327, -0.3323919630734096, null ], "y": [ -0.9543517503420255, -0.95310972993659, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6970425844192505 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.5921871632171531, -0.9999999999999999, null ], "y": [ 0.8069495508567666, -0.025539683922903254, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6841919422149658 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.5921871632171531, -0.12132261696013238, null ], "y": [ 0.8069495508567666, -0.9242851592108585, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6796481013298035 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.5921871632171531, -0.9236450878635359, null ], "y": [ 0.8069495508567666, -0.30920992285338966, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.6783697605133057 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.5921871632171531, 0.9801682077835759, null ], "y": [ 0.8069495508567666, -0.1990402640944235, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.8548778891563416 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.1825003845820605, -0.22078263580828986, null ], "y": [ 0.8856123864410301, 0.9769464569329316, null ] }, { "hoverinfo": "none", "line": { "color": "rgba(255,255,255,0.3)", "width": 1.662172794342041 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 0.9311629389386256, 0.6083485895065861, null ], "y": [ -0.41259534040710694, -0.6459528885619005, null ] }, { "hovertemplate": "%{text}", "marker": { "color": "#00ff00", "line": { "color": "white", "width": 2 }, "size": 25 }, "mode": "markers+text", "name": "Candidates", "text": [ "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", "C14", "C15", "C16", "C17", "C18", "C19" ], "textposition": "top center", "type": "scatter", "x": [ -0.0318786442433591, 0.7600186746361879, -0.12256476800902333, -0.45510761780733233, 0.008116394143636792, -0.971414293246791, -0.5563210525255852, 0.5880469328567001, 0.9377523577735148, -0.5976025974158469, 0.9718289961607458, 0.920284991483624, -0.8215148751076258, -0.5930503255863487, 0.4344083688528717, 0.5921871632171531, 0.1825003845820605, 0.9311629389386256, -0.3323919630734096, 0.716838001473834 ], "y": [ 0.988981958829275, -0.6332987184781399, 0.9252597991243965, -0.8771340529992666, 0.825184807919145, -0.22258116370897627, 0.8150655688798616, -0.7799510009833339, 0.24737815542754044, -0.5177608869441581, -0.0012489085730085687, 0.149911003119065, -0.018033772475116477, -0.7667491875417256, 0.9043081347609362, 0.8069495508567666, 0.8856123864410301, -0.41259534040710694, -0.95310972993659, 0.4914287444739235 ] }, { "hovertemplate": "%{text}", "marker": { "color": "#ff6b6b", "size": 15, "symbol": "square" }, "mode": "markers+text", "name": "Companies", "text": [ "TeachTown", "Wolverine Power Syst", "Mariner", "Primavera School", "OM1, Inc.", "Bella Cosa Jewelers", "Bluebird Staffing", "FOGARTY KNAPP & ASSO", "GEOST, a LightRidge ", "Sobriety Centers of ", "Morado Financial LLC", "Harris County Public", "Mutual of Omaha Reve", "Victory Brewing Comp", "Phenom", "Austin Industrial, I", "Kwik Trip, Inc.", "Reproductive Medicin", "One Tech ", "Lift Bridge Lodge, A", "Pratt & Whitney", "The Mutual Group", "Cricut", "Denver7 (KMGH-TV)", "National Indemnity C", "ENGIE Impact", "NSG - Real Estate & ", "Vivacity Tech PBC", "AU Health Imaging", "Talon Simulations, L", "Canvendor", "PowerSchool", "GMA Garnet Group", "KBRA", "Ascend Elements", "Lilac Preservation P", "Stellite Works LLC", "Roper Whitney", "BlueOutlier", "Sauder Manufacturing", "Teza Technologies", "Third Plateau ", "Flatlands Jessup Ins", "Cardone Capital", "Center Design Studio", "Zepp Health ", "CRG Search", "ICBC (Insurance Corp", "Trader Interactive", "Valere Event and Vid", "The Aviary Recovery ", "Beyond Finance", "Authority Partners", "Mammoth Holdings, LL" ], "textposition": "top center", "type": "scatter", "x": [ 0.8338336475325094, -0.6949348089835338, -0.8587213208599893, 0.3560795400845579, -0.703616873335463, -0.8129168291902286, -0.20992886381906808, 0.24141370170441712, 0.35300202597267716, -0.8056288434155425, -0.8936136198185795, 0.26037178026216184, 0.4423825211273832, -0.5007328288395386, 0.8896720687197679, 0.7672720085277207, -0.9578263709863069, -0.7989282600264442, -0.5599609735071868, 0.12720550602658615, 0.9522938747640646, 0.7125181236349108, 0.1202269486345491, -0.908499195498904, -0.3539446651136998, 0.9090686384400677, -0.7589918330884283, -0.3833778530101549, -0.965881003820822, 0.5060469051636167, 0.5152390052380482, 0.03884341268679191, -0.050875608622057755, 0.6541397263656016, -0.8802527809215748, 0.9268109330320923, 0.8197873359172848, -0.8080312555509204, -0.9795363059011597, 0.8522029509867697, -0.3346139490733518, -0.5450901973095849, 0.8083314881745419, 0.2720788119806062, 0.6860035942339918, 0.971972386681689, -0.21580173926034327, -0.9191564797013532, -0.9999999999999999, -0.12132261696013238, -0.9236450878635359, 0.9801682077835759, -0.22078263580828986, 0.6083485895065861 ], "y": [ 0.40312308868228247, -0.7198309644751111, 0.5610321633503569, 0.8446038805235159, 0.7934582640248695, -0.5537985004519345, 0.49097452712973244, -0.8602881624953236, -0.9013779606691754, -0.4356934917571282, 0.26667787249682245, -0.9600690637569351, -0.843818058240147, 0.9079872609837913, 0.5160301022248421, -0.4811021010561043, 0.07703819887789656, 0.671138629766234, 0.52761455738175, -0.9383807650976768, 0.3633224713808146, 0.7553492480585224, 0.9755492141641122, -0.4274062018558911, -0.8525044679085142, -0.3184658308401831, 0.49085179207513724, 0.9644881457232451, 0.3468404881619146, 0.7948221673899531, -0.8701801354405351, -0.9613272184529631, -0.9865885919864976, 0.6571732094522764, 0.43414067355576974, -0.10218826231842465, -0.21352020487847648, -0.6600593920811364, 0.1919918677472795, -0.5302979577303915, 0.8643573172164094, -0.8462702899506104, 0.6189128347742368, 0.9324299383843284, -0.7123056544250477, 0.08059858080596716, -0.9543517503420255, -0.13121735419580033, -0.025539683922903254, -0.9242851592108585, -0.30920992285338966, -0.1990402640944235, 0.9769464569329316, -0.6459528885619005 ] } ], "layout": { "font": { "color": "white" }, "height": 900, "paper_bgcolor": "#0d0d0d", "plot_bgcolor": "#1a1a1a", "showlegend": true, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Network Graph: Candidates ↔ Companies" }, "width": 1400, "xaxis": { "showgrid": false, "showticklabels": false, "zeroline": false }, "yaxis": { "showgrid": false, "showticklabels": false, "zeroline": false } } } }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "✅ NetworkX graph created!\n", " 🟢 Green = Candidates\n", " 🔴 Red = Companies\n", " Lines = Connections (thicker = stronger)\n", "\n" ] } ], "source": [ "# ============================================================================\n", "# NETWORK GRAPH WITH NETWORKX + PLOTLY\n", "# ============================================================================\n", "\n", "import networkx as nx\n", "\n", "print(\"🕸️ Creating NETWORK GRAPH...\\n\")\n", "\n", "# Create graph\n", "G = nx.Graph()\n", "\n", "# Sample\n", "n_cand_sample = min(20, len(candidates))\n", "top_k_per_cand = 5\n", "\n", "print(f\"📊 Network size:\")\n", "print(f\" • {n_cand_sample} candidates\")\n", "print(f\" • {top_k_per_cand} companies per candidate\\n\")\n", "\n", "# Add nodes + edges\n", "companies_in_graph = set()\n", "\n", "for i in range(n_cand_sample):\n", " G.add_node(f\"C{i}\", node_type='candidate', label=f\"C{i}\")\n", " \n", " matches = find_top_matches(i, top_k=top_k_per_cand)\n", " \n", " for comp_idx, score in matches:\n", " comp_id = f\"J{comp_idx}\"\n", " \n", " if comp_id not in companies_in_graph:\n", " company_name = companies_full.iloc[comp_idx].get('name', 'N/A')[:20]\n", " G.add_node(comp_id, node_type='company', label=company_name)\n", " companies_in_graph.add(comp_id)\n", " \n", " G.add_edge(f\"C{i}\", comp_id, weight=float(score))\n", "\n", "print(f\"✅ Network created!\")\n", "print(f\" Nodes: {G.number_of_nodes()}\")\n", "print(f\" Edges: {G.number_of_edges()}\\n\")\n", "\n", "# Calculate layout\n", "print(\"🔄 Calculating layout...\")\n", "pos = nx.spring_layout(G, k=2, iterations=50, seed=42)\n", "print(\"✅ Layout done!\\n\")\n", "\n", "# Create edge traces\n", "edge_trace = []\n", "for edge in G.edges(data=True):\n", " x0, y0 = pos[edge[0]]\n", " x1, y1 = pos[edge[1]]\n", " weight = edge[2]['weight']\n", " \n", " edge_trace.append(go.Scatter(\n", " x=[x0, x1, None],\n", " y=[y0, y1, None],\n", " mode='lines',\n", " line=dict(width=weight*3, color='rgba(255,255,255,0.3)'),\n", " hoverinfo='none',\n", " showlegend=False\n", " ))\n", "\n", "# Candidate nodes\n", "cand_nodes = [n for n, d in G.nodes(data=True) if d['node_type']=='candidate']\n", "cand_x = [pos[n][0] for n in cand_nodes]\n", "cand_y = [pos[n][1] for n in cand_nodes]\n", "cand_labels = [G.nodes[n]['label'] for n in cand_nodes]\n", "\n", "candidate_trace = go.Scatter(\n", " x=cand_x, y=cand_y,\n", " mode='markers+text',\n", " name='Candidates',\n", " marker=dict(size=25, color='#00ff00', line=dict(width=2, color='white')),\n", " text=cand_labels,\n", " textposition='top center',\n", " hovertemplate='%{text}'\n", ")\n", "\n", "# Company nodes\n", "comp_nodes = [n for n, d in G.nodes(data=True) if d['node_type']=='company']\n", "comp_x = [pos[n][0] for n in comp_nodes]\n", "comp_y = [pos[n][1] for n in comp_nodes]\n", "comp_labels = [G.nodes[n]['label'] for n in comp_nodes]\n", "\n", "company_trace = go.Scatter(\n", " x=comp_x, y=comp_y,\n", " mode='markers+text',\n", " name='Companies',\n", " marker=dict(size=15, color='#ff6b6b', symbol='square'),\n", " text=comp_labels,\n", " textposition='top center',\n", " hovertemplate='%{text}'\n", ")\n", "\n", "# Create figure\n", "fig = go.Figure(data=edge_trace + [candidate_trace, company_trace])\n", "\n", "fig.update_layout(\n", " title='Network Graph: Candidates ↔ Companies',\n", " showlegend=True,\n", " width=1400, height=900,\n", " plot_bgcolor='#1a1a1a',\n", " paper_bgcolor='#0d0d0d',\n", " font=dict(color='white'),\n", " xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),\n", " yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)\n", ")\n", "\n", "fig.show()\n", "\n", "print(\"✅ NetworkX graph created!\")\n", "print(\" 🟢 Green = Candidates\")\n", "print(\" 🔴 Red = Companies\")\n", "print(\" Lines = Connections (thicker = stronger)\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🐛 DEBUG: Why aren't candidates & companies overlapping?\n", "\n", "Investigating the embedding space alignment" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🐛 DEBUGGING EMBEDDING SPACE\n", "================================================================================\n", "\n", "1️⃣ VECTOR SHAPES:\n", " Candidates: (9544, 384)\n", " Companies: (35787, 384)\n", "\n", "2️⃣ VECTOR NORMS (should be ~1.0 if normalized):\n", " Candidates: mean=1.0000, min=1.0000, max=1.0000\n", " Companies: mean=1.0000, min=1.0000, max=1.0000\n", "\n", "3️⃣ SAMPLE SIMILARITIES:\n", " Candidate #0 top 5 matches:\n", " #1. Company 9418: 0.7028\n", " #2. Company 9417: 0.7026\n", " #3. Company 9416: 0.7010\n", " #4. Company 13786: 0.6827\n", " #5. Company 16864: 0.6776\n", "\n", "4️⃣ TEXT REPRESENTATION SAMPLES:\n", "\n", " 📋 CANDIDATE #0:\n", " Skills: ['Big Data', 'Hadoop', 'Hive', 'Python', 'Mapreduce', 'Spark', 'Java', 'Machine Learning', 'Cloud', \n", " Category: N/A\n", "\n", " 🏢 TOP MATCH COMPANY #9418:\n", " Name: TeachTown\n", " Required Skills: \n", " Industries: E-Learning Providers\n", "\n", "5️⃣ POSTINGS ENRICHMENT CHECK:\n", " WITH postings: 0 (0.0%)\n", " WITHOUT postings: 24,473\n", "\n", "❓ HYPOTHESIS:\n", " ⚠️ Most companies DON'T have postings!\n", " ⚠️ They only have: industries, specialties, description\n", " ⚠️ This creates DIFFERENT language than candidates\n", "\n", " 💡 SOLUTION:\n", " Option A: Filter to only companies WITH postings\n", " Option B: Use LLM to translate industries → skills\n", "\n", "================================================================================\n" ] } ], "source": [ "# ============================================================================\n", "# DEBUG: CHECK EMBEDDING ALIGNMENT\n", "# ============================================================================\n", "\n", "print(\"🐛 DEBUGGING EMBEDDING SPACE\")\n", "print(\"=\" * 80)\n", "\n", "# 1. Check if vectors loaded correctly\n", "print(f\"\\n1️⃣ VECTOR SHAPES:\")\n", "print(f\" Candidates: {cand_vectors.shape}\")\n", "print(f\" Companies: {comp_vectors.shape}\")\n", "\n", "# 2. Check vector norms\n", "print(f\"\\n2️⃣ VECTOR NORMS (should be ~1.0 if normalized):\")\n", "cand_norms = np.linalg.norm(cand_vectors, axis=1)\n", "comp_norms = np.linalg.norm(comp_vectors, axis=1)\n", "print(f\" Candidates: mean={cand_norms.mean():.4f}, min={cand_norms.min():.4f}, max={cand_norms.max():.4f}\")\n", "print(f\" Companies: mean={comp_norms.mean():.4f}, min={comp_norms.min():.4f}, max={comp_norms.max():.4f}\")\n", "\n", "# 3. Sample similarity\n", "print(f\"\\n3️⃣ SAMPLE SIMILARITIES:\")\n", "sample_cand = 0\n", "matches = find_top_matches(sample_cand, top_k=5)\n", "print(f\" Candidate #{sample_cand} top 5 matches:\")\n", "for rank, (comp_idx, score) in enumerate(matches, 1):\n", " print(f\" #{rank}. Company {comp_idx}: {score:.4f}\")\n", "\n", "# 4. Check text representations\n", "print(f\"\\n4️⃣ TEXT REPRESENTATION SAMPLES:\")\n", "print(f\"\\n 📋 CANDIDATE #{sample_cand}:\")\n", "cand = candidates.iloc[sample_cand]\n", "print(f\" Skills: {str(cand.get('skills', 'N/A'))[:100]}\")\n", "print(f\" Category: {cand.get('Category', 'N/A')}\")\n", "\n", "top_company_idx = matches[0][0]\n", "print(f\"\\n 🏢 TOP MATCH COMPANY #{top_company_idx}:\")\n", "company = companies_full.iloc[top_company_idx]\n", "print(f\" Name: {company.get('name', 'N/A')}\")\n", "print(f\" Required Skills: {str(company.get('required_skills', 'N/A'))[:100]}\")\n", "print(f\" Industries: {str(company.get('industries_list', 'N/A'))[:100]}\")\n", "\n", "# 5. Check if postings enrichment worked\n", "print(f\"\\n5️⃣ POSTINGS ENRICHMENT CHECK:\")\n", "companies_with_postings = companies_full[companies_full['required_skills'] != ''].shape[0]\n", "companies_without = companies_full[companies_full['required_skills'] == ''].shape[0]\n", "print(f\" WITH postings: {companies_with_postings:,} ({companies_with_postings/len(companies_full)*100:.1f}%)\")\n", "print(f\" WITHOUT postings: {companies_without:,}\")\n", "\n", "# 6. HYPOTHESIS\n", "print(f\"\\n❓ HYPOTHESIS:\")\n", "if companies_without > companies_with_postings:\n", " print(f\" ⚠️ Most companies DON'T have postings!\")\n", " print(f\" ⚠️ They only have: industries, specialties, description\")\n", " print(f\" ⚠️ This creates DIFFERENT language than candidates\")\n", " print(f\"\\n 💡 SOLUTION:\")\n", " print(f\" Option A: Filter to only companies WITH postings\")\n", " print(f\" Option B: Use LLM to translate industries → skills\")\n", "else:\n", " print(f\" ✅ Most companies have postings\")\n", " print(f\" ❓ Need to check if embeddings were generated AFTER enrichment\")\n", "\n", "print(f\"\\n\" + \"=\" * 80)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 📊 Step 19: Summary\n", "\n", "### What We Built" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "======================================================================\n", "🎯 HRHUB v2.1 - SUMMARY\n", "======================================================================\n", "\n", "✅ IMPLEMENTED:\n", " 1. Zero-Shot Job Classification (Entry/Mid/Senior/Executive)\n", " 2. Few-Shot Learning with Examples\n", " 3. Structured Skills Extraction (Pydantic schemas)\n", " 4. Match Explainability (LLM-generated reasoning)\n", " 5. FREE LLM Integration (Hugging Face)\n", " 6. Flexible Data Loading (Upload OR Google Drive)\n", "\n", "💰 COST: $0.00 (completely free!)\n", "\n", "📈 COURSE ALIGNMENT:\n", " ✅ LLMs for structured output\n", " ✅ Pydantic schemas\n", " ✅ Classification pipelines\n", " ✅ Zero-shot & few-shot learning\n", " ✅ JSON extraction\n", " ✅ Transformer architecture (embeddings)\n", " ✅ API deployment strategies\n", "\n", "======================================================================\n", "🚀 READY TO MOVE TO VS CODE!\n", "======================================================================\n" ] } ], "source": [ "print(\"=\"*70)\n", "print(\"🎯 HRHUB v2.1 - SUMMARY\")\n", "print(\"=\"*70)\n", "print(\"\")\n", "print(\"✅ IMPLEMENTED:\")\n", "print(\" 1. Zero-Shot Job Classification (Entry/Mid/Senior/Executive)\")\n", "print(\" 2. Few-Shot Learning with Examples\")\n", "print(\" 3. Structured Skills Extraction (Pydantic schemas)\")\n", "print(\" 4. Match Explainability (LLM-generated reasoning)\")\n", "print(\" 5. FREE LLM Integration (Hugging Face)\")\n", "print(\" 6. Flexible Data Loading (Upload OR Google Drive)\")\n", "print(\"\")\n", "print(\"💰 COST: $0.00 (completely free!)\")\n", "print(\"\")\n", "print(\"📈 COURSE ALIGNMENT:\")\n", "print(\" ✅ LLMs for structured output\")\n", "print(\" ✅ Pydantic schemas\")\n", "print(\" ✅ Classification pipelines\")\n", "print(\" ✅ Zero-shot & few-shot learning\")\n", "print(\" ✅ JSON extraction\")\n", "print(\" ✅ Transformer architecture (embeddings)\")\n", "print(\" ✅ API deployment strategies\")\n", "print(\"\")\n", "print(\"=\"*70)\n", "print(\"🚀 READY TO MOVE TO VS CODE!\")\n", "print(\"=\"*70)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🎯 Step 7.5: Collaborative Filtering for Companies\n", "\n", "**THE GENIUS SOLUTION!**\n", "\n", "Companies WITHOUT postings can inherit skills from similar companies WITH postings!\n", "\n", "Like Netflix recommendations:\n", "- Company A (no postings) similar to Company B (has postings)\n", "- → Company A inherits Company B's required skills!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🎯 COLLABORATIVE FILTERING FOR COMPANIES\n", "================================================================================\n", "\n", "Like Netflix: Similar companies → Similar skills needed!\n", "\n", "📊 DATA SPLIT:\n", " WITH postings: 0 companies\n", " WITHOUT postings: 24,473 companies\n", "\n", "💡 Goal: Infer skills for 24,473 companies\n", "\n", "🔧 Building company profile vectors...\n", " Encoding 0 companies WITH postings...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Batches: 0it [00:00, ?it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Encoding 24,473 companies WITHOUT postings...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "Batches: 100%|██████████| 765/765 [12:15<00:00, 1.04it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "✅ Profile embeddings created!\n", " Shape WITH: (0,)\n", " Shape WITHOUT: (24473, 384)\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# ============================================================================\n", "# COLLABORATIVE FILTERING: Companies without postings\n", "# ============================================================================\n", "\n", "print(\"🎯 COLLABORATIVE FILTERING FOR COMPANIES\")\n", "print(\"=\" * 80)\n", "print(\"\\nLike Netflix: Similar companies → Similar skills needed!\\n\")\n", "\n", "# Step 1: Separate companies\n", "companies_with_postings = companies_full[companies_full['required_skills'] != ''].copy()\n", "companies_without_postings = companies_full[companies_full['required_skills'] == ''].copy()\n", "\n", "print(f\"📊 DATA SPLIT:\")\n", "print(f\" WITH postings: {len(companies_with_postings):,} companies\")\n", "print(f\" WITHOUT postings: {len(companies_without_postings):,} companies\")\n", "print(f\"\\n💡 Goal: Infer skills for {len(companies_without_postings):,} companies\\n\")\n", "\n", "# Step 2: Build company profile vectors (BEFORE postings)\n", "# Using ONLY: industries, specialties, employee_count, description\n", "print(\"🔧 Building company profile vectors...\")\n", "\n", "def build_company_profile_text(row):\n", " \"\"\"Build text representation WITHOUT postings data\"\"\"\n", " parts = []\n", " \n", " if row.get('name'):\n", " parts.append(f\"Company: {row['name']}\")\n", " \n", " if row.get('description'):\n", " parts.append(f\"Description: {row['description']}\")\n", " \n", " if row.get('industries_list'):\n", " parts.append(f\"Industries: {row['industries_list']}\")\n", " \n", " if row.get('specialties_list'):\n", " parts.append(f\"Specialties: {row['specialties_list']}\")\n", " \n", " if row.get('employee_count'):\n", " parts.append(f\"Size: {row['employee_count']} employees\")\n", " \n", " return ' '.join(parts)\n", "\n", "# Generate profile embeddings\n", "with_postings_profiles = companies_with_postings.apply(build_company_profile_text, axis=1).tolist()\n", "without_postings_profiles = companies_without_postings.apply(build_company_profile_text, axis=1).tolist()\n", "\n", "print(f\" Encoding {len(with_postings_profiles):,} companies WITH postings...\")\n", "with_postings_embeddings = model.encode(\n", " with_postings_profiles,\n", " show_progress_bar=True,\n", " batch_size=32,\n", " normalize_embeddings=True\n", ")\n", "\n", "print(f\" Encoding {len(without_postings_profiles):,} companies WITHOUT postings...\")\n", "without_postings_embeddings = model.encode(\n", " without_postings_profiles,\n", " show_progress_bar=True,\n", " batch_size=32,\n", " normalize_embeddings=True\n", ")\n", "\n", "print(f\"\\n✅ Profile embeddings created!\")\n", "print(f\" Shape WITH: {with_postings_embeddings.shape}\")\n", "print(f\" Shape WITHOUT: {without_postings_embeddings.shape}\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🔍 Finding similar companies for skill inheritance...\n", "\n", "📊 Method: Top-5 Collaborative Filtering\n", "\n", "⚙️ Calculating company-to-company similarities...\n" ] }, { "ename": "ValueError", "evalue": "Expected 2D array, got 1D array instead:\narray=[].\nReshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[31]\u001b[39m\u001b[32m, line 18\u001b[39m\n\u001b[32m 16\u001b[39m \u001b[38;5;66;03m# Calculate similarities (batch processing)\u001b[39;00m\n\u001b[32m 17\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33m⚙️ Calculating company-to-company similarities...\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m---> \u001b[39m\u001b[32m18\u001b[39m similarities = \u001b[43mcosine_similarity\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwithout_postings_embeddings\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwith_postings_embeddings\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 20\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m✅ Similarity matrix: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msimilarities.shape\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m 21\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m🔄 Inferring skills for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(companies_without_postings)\u001b[38;5;132;01m:\u001b[39;00m\u001b[33m,\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m companies...\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/sklearn/utils/_param_validation.py:213\u001b[39m, in \u001b[36mvalidate_params..decorator..wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 207\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 208\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[32m 209\u001b[39m skip_parameter_validation=(\n\u001b[32m 210\u001b[39m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[32m 211\u001b[39m )\n\u001b[32m 212\u001b[39m ):\n\u001b[32m--> \u001b[39m\u001b[32m213\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 214\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m InvalidParameterError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 215\u001b[39m \u001b[38;5;66;03m# When the function is just a wrapper around an estimator, we allow\u001b[39;00m\n\u001b[32m 216\u001b[39m \u001b[38;5;66;03m# the function to delegate validation to the estimator, but we replace\u001b[39;00m\n\u001b[32m 217\u001b[39m \u001b[38;5;66;03m# the name of the estimator by the name of the function in the error\u001b[39;00m\n\u001b[32m 218\u001b[39m \u001b[38;5;66;03m# message to avoid confusion.\u001b[39;00m\n\u001b[32m 219\u001b[39m msg = re.sub(\n\u001b[32m 220\u001b[39m \u001b[33mr\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mparameter of \u001b[39m\u001b[33m\\\u001b[39m\u001b[33mw+ must be\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 221\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mparameter of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc.\u001b[34m__qualname__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m must be\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 222\u001b[39m \u001b[38;5;28mstr\u001b[39m(e),\n\u001b[32m 223\u001b[39m )\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/sklearn/metrics/pairwise.py:1657\u001b[39m, in \u001b[36mcosine_similarity\u001b[39m\u001b[34m(X, Y, dense_output)\u001b[39m\n\u001b[32m 1613\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Compute cosine similarity between samples in X and Y.\u001b[39;00m\n\u001b[32m 1614\u001b[39m \n\u001b[32m 1615\u001b[39m \u001b[33;03mCosine similarity, or the cosine kernel, computes similarity as the\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 1653\u001b[39m \u001b[33;03m [0.57..., 0.81...]])\u001b[39;00m\n\u001b[32m 1654\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 1655\u001b[39m \u001b[38;5;66;03m# to avoid recursive import\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1657\u001b[39m X, Y = \u001b[43mcheck_pairwise_arrays\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mY\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1659\u001b[39m X_normalized = normalize(X, copy=\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[32m 1660\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m X \u001b[38;5;129;01mis\u001b[39;00m Y:\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/sklearn/metrics/pairwise.py:172\u001b[39m, in \u001b[36mcheck_pairwise_arrays\u001b[39m\u001b[34m(X, Y, precomputed, dtype, accept_sparse, force_all_finite, copy)\u001b[39m\n\u001b[32m 163\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 164\u001b[39m X = check_array(\n\u001b[32m 165\u001b[39m X,\n\u001b[32m 166\u001b[39m accept_sparse=accept_sparse,\n\u001b[32m (...)\u001b[39m\u001b[32m 170\u001b[39m estimator=estimator,\n\u001b[32m 171\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m172\u001b[39m Y = \u001b[43mcheck_array\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 173\u001b[39m \u001b[43m \u001b[49m\u001b[43mY\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 174\u001b[39m \u001b[43m \u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[43m=\u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 175\u001b[39m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 176\u001b[39m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 177\u001b[39m \u001b[43m \u001b[49m\u001b[43mforce_all_finite\u001b[49m\u001b[43m=\u001b[49m\u001b[43mforce_all_finite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 178\u001b[39m \u001b[43m \u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m=\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 179\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 181\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m precomputed:\n\u001b[32m 182\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m X.shape[\u001b[32m1\u001b[39m] != Y.shape[\u001b[32m0\u001b[39m]:\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/files_to_deploy_HRHUB/hrhub_project/venv/lib/python3.12/site-packages/sklearn/utils/validation.py:989\u001b[39m, in \u001b[36mcheck_array\u001b[39m\u001b[34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[39m\n\u001b[32m 982\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 983\u001b[39m msg = (\n\u001b[32m 984\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mExpected 2D array, got 1D array instead:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33marray=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00marray\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 985\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mReshape your data either using array.reshape(-1, 1) if \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 986\u001b[39m \u001b[33m\"\u001b[39m\u001b[33myour data has a single feature or array.reshape(1, -1) \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 987\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mif it contains a single sample.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 988\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m989\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n\u001b[32m 991\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m dtype_numeric \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(array.dtype, \u001b[33m\"\u001b[39m\u001b[33mkind\u001b[39m\u001b[33m\"\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m array.dtype.kind \u001b[38;5;129;01min\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mUSV\u001b[39m\u001b[33m\"\u001b[39m:\n\u001b[32m 992\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 993\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mdtype=\u001b[39m\u001b[33m'\u001b[39m\u001b[33mnumeric\u001b[39m\u001b[33m'\u001b[39m\u001b[33m is not compatible with arrays of bytes/strings.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 994\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mConvert your data to numeric values explicitly instead.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 995\u001b[39m )\n", "\u001b[31mValueError\u001b[39m: Expected 2D array, got 1D array instead:\narray=[].\nReshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample." ] } ], "source": [ "# ============================================================================\n", "# STEP 3: Find Similar Companies & Inherit Skills\n", "# ============================================================================\n", "\n", "print(\"🔍 Finding similar companies for skill inheritance...\\n\")\n", "\n", "# For each company WITHOUT postings, find top-K similar WITH postings\n", "TOP_K_SIMILAR = 5 # Use top 5 similar companies\n", "\n", "print(f\"📊 Method: Top-{TOP_K_SIMILAR} Collaborative Filtering\\n\")\n", "\n", "inferred_skills = []\n", "inferred_titles = []\n", "inferred_levels = []\n", "\n", "# Calculate similarities (batch processing)\n", "print(\"⚙️ Calculating company-to-company similarities...\")\n", "similarities = cosine_similarity(without_postings_embeddings, with_postings_embeddings)\n", "\n", "print(f\"✅ Similarity matrix: {similarities.shape}\\n\")\n", "print(f\"🔄 Inferring skills for {len(companies_without_postings):,} companies...\\n\")\n", "\n", "for i in range(len(companies_without_postings)):\n", " if i % 10000 == 0:\n", " print(f\" Progress: {i:,}/{len(companies_without_postings):,}\")\n", " \n", " # Get top-K similar companies WITH postings\n", " top_k_indices = np.argsort(similarities[i])[::-1][:TOP_K_SIMILAR]\n", " \n", " # Collect skills from similar companies\n", " similar_skills = []\n", " similar_titles = []\n", " similar_levels = []\n", " \n", " for idx in top_k_indices:\n", " similar_company = companies_with_postings.iloc[idx]\n", " \n", " if similar_company.get('required_skills'):\n", " similar_skills.append(str(similar_company['required_skills']))\n", " \n", " if similar_company.get('posted_job_titles'):\n", " similar_titles.append(str(similar_company['posted_job_titles']))\n", " \n", " if similar_company.get('experience_levels'):\n", " similar_levels.append(str(similar_company['experience_levels']))\n", " \n", " # Aggregate (simple concatenation)\n", " inferred_skills.append(' | '.join(similar_skills) if similar_skills else '')\n", " inferred_titles.append(' | '.join(similar_titles) if similar_titles else '')\n", " inferred_levels.append(' | '.join(similar_levels) if similar_levels else '')\n", "\n", "print(f\"\\n✅ Skill inference complete!\\n\")\n", "\n", "# Add to companies_without_postings\n", "companies_without_postings['required_skills'] = inferred_skills\n", "companies_without_postings['posted_job_titles'] = inferred_titles\n", "companies_without_postings['experience_levels'] = inferred_levels\n", "\n", "# Mark as inferred\n", "companies_without_postings['skills_source'] = 'inferred_cf'\n", "companies_with_postings['skills_source'] = 'actual_postings'\n", "\n", "print(f\"📊 RESULTS:\")\n", "non_empty = sum(1 for s in inferred_skills if s != '')\n", "print(f\" Successfully inferred skills: {non_empty:,}/{len(inferred_skills):,} ({non_empty/len(inferred_skills)*100:.1f}%)\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ============================================================================\n", "# STEP 4: Rebuild companies_full with INFERRED skills\n", "# ============================================================================\n", "\n", "print(\"🔄 Rebuilding companies_full with inferred skills...\\n\")\n", "\n", "# Combine\n", "companies_full_enhanced = pd.concat([\n", " companies_with_postings,\n", " companies_without_postings\n", "], ignore_index=False).sort_index()\n", "\n", "print(f\"✅ Enhanced dataset created!\")\n", "print(f\" Total companies: {len(companies_full_enhanced):,}\")\n", "print(f\" With actual postings: {len(companies_with_postings):,}\")\n", "print(f\" With inferred skills: {len(companies_without_postings):,}\")\n", "\n", "# Verify\n", "total_with_skills = companies_full_enhanced[companies_full_enhanced['required_skills'] != ''].shape[0]\n", "print(f\"\\n📈 IMPROVEMENT:\")\n", "print(f\" BEFORE: {len(companies_with_postings):,} companies with skills ({len(companies_with_postings)/len(companies_full)*100:.1f}%)\")\n", "print(f\" AFTER: {total_with_skills:,} companies with skills ({total_with_skills/len(companies_full_enhanced)*100:.1f}%)\")\n", "print(f\" 📊 Increase: +{total_with_skills - len(companies_with_postings):,} companies!\\n\")\n", "\n", "# Replace companies_full\n", "companies_full = companies_full_enhanced\n", "\n", "print(f\"✅ companies_full updated with collaborative filtering!\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ============================================================================\n", "# STEP 5: Regenerate Company Embeddings with INFERRED skills\n", "# ============================================================================\n", "\n", "print(\"🔄 Regenerating company embeddings with inferred skills...\\n\")\n", "\n", "def build_company_text_enhanced(row):\n", " \"\"\"Build company text WITH inferred/actual skills\"\"\"\n", " parts = []\n", " \n", " if row.get('name'):\n", " parts.append(f\"Company: {row['name']}\")\n", " \n", " if row.get('description'):\n", " parts.append(f\"Description: {row['description']}\")\n", " \n", " if row.get('industries_list'):\n", " parts.append(f\"Industries: {row['industries_list']}\")\n", " \n", " if row.get('specialties_list'):\n", " parts.append(f\"Specialties: {row['specialties_list']}\")\n", " \n", " # NOW INCLUDES INFERRED SKILLS!\n", " if row.get('required_skills'):\n", " parts.append(f\"Required Skills: {row['required_skills']}\")\n", " \n", " if row.get('posted_job_titles'):\n", " parts.append(f\"Job Titles: {row['posted_job_titles']}\")\n", " \n", " if row.get('experience_levels'):\n", " parts.append(f\"Experience: {row['experience_levels']}\")\n", " \n", " return ' '.join(parts)\n", "\n", "# Build texts\n", "company_texts_enhanced = companies_full.apply(build_company_text_enhanced, axis=1).tolist()\n", "\n", "print(f\"📝 Encoding {len(company_texts_enhanced):,} enhanced company profiles...\\n\")\n", "\n", "comp_vectors_enhanced = model.encode(\n", " company_texts_enhanced,\n", " show_progress_bar=True,\n", " batch_size=32,\n", " normalize_embeddings=True\n", ")\n", "\n", "print(f\"\\n✅ Enhanced embeddings created!\")\n", "print(f\" Shape: {comp_vectors_enhanced.shape}\")\n", "\n", "# Replace global comp_vectors\n", "comp_vectors = comp_vectors_enhanced\n", "\n", "print(f\"\\n🎯 NOW candidates & companies speak the SAME LANGUAGE!\")\n", "print(f\" All companies have skill information (actual or inferred)\")\n", "print(f\" Ready for matching!\\n\")\n", "\n", "# Save\n", "np.save(f'{Config.PROCESSED_PATH}company_embeddings_cf_enhanced.npy', comp_vectors)\n", "print(f\"💾 Saved: company_embeddings_cf_enhanced.npy\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 🔍 Example: Check Inferred Skills" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ============================================================================\n", "# EXAMPLE: See skill inference in action\n", "# ============================================================================\n", "\n", "print(\"🔍 COLLABORATIVE FILTERING EXAMPLE\")\n", "print(\"=\" * 80)\n", "\n", "# Find a company that got inferred skills\n", "inferred_companies = companies_full[companies_full['skills_source'] == 'inferred_cf']\n", "\n", "if len(inferred_companies) > 0:\n", " example = inferred_companies.iloc[0]\n", " \n", " print(f\"\\n📋 COMPANY (skills were INFERRED):\")\n", " print(f\" Name: {example.get('name', 'N/A')}\")\n", " print(f\" Industries: {str(example.get('industries_list', 'N/A'))[:100]}\")\n", " print(f\" Specialties: {str(example.get('specialties_list', 'N/A'))[:100]}\")\n", " print(f\"\\n 🎯 INFERRED Required Skills:\")\n", " print(f\" {str(example.get('required_skills', 'N/A'))[:200]}\")\n", " print(f\"\\n 💼 INFERRED Job Titles:\")\n", " print(f\" {str(example.get('posted_job_titles', 'N/A'))[:200]}\")\n", " \n", " print(f\"\\n💡 These skills were inherited from similar companies!\")\n", "else:\n", " print(\"\\n⚠️ No inferred companies found\")\n", "\n", "print(\"\\n\" + \"=\" * 80)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🧠 Step 8: Generate OR Load Embeddings\n", "\n", "**Smart pipeline:**\n", "- First run: Generate embeddings (slow ~5 min)\n", "- Subsequent runs: Load from file (fast <5 sec)\n", "\n", "**CRITICAL:** Embeddings generated AFTER deduplication for perfect alignment!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ============================================================================\n", "# EMBEDDING GENERATION + SAVE/LOAD PIPELINE\n", "# ============================================================================\n", "\n", "import os\n", "from pathlib import Path\n", "\n", "print(\"🧠 EMBEDDING PIPELINE\")\n", "print(\"=\" * 80)\n", "print()\n", "\n", "# Ensure processed directory exists\n", "Path(Config.PROCESSED_PATH).mkdir(parents=True, exist_ok=True)\n", "\n", "# Define file paths\n", "CAND_EMBEDDINGS_FILE = f'{Config.PROCESSED_PATH}candidate_embeddings.npy'\n", "COMP_EMBEDDINGS_FILE = f'{Config.PROCESSED_PATH}company_embeddings.npy'\n", "CAND_METADATA_FILE = f'{Config.PROCESSED_PATH}candidates_metadata.pkl'\n", "COMP_METADATA_FILE = f'{Config.PROCESSED_PATH}companies_metadata.pkl'\n", "\n", "# Check if embeddings already exist\n", "cand_exists = os.path.exists(CAND_EMBEDDINGS_FILE)\n", "comp_exists = os.path.exists(COMP_EMBEDDINGS_FILE)\n", "\n", "print(f\"📁 Checking for existing embeddings...\")\n", "print(f\" Candidates: {'✅ Found' if cand_exists else '❌ Not found'}\")\n", "print(f\" Companies: {'✅ Found' if comp_exists else '❌ Not found'}\")\n", "print()\n", "\n", "# Load model\n", "print(f\"🔧 Loading embedding model: {Config.EMBEDDING_MODEL}\")\n", "model = SentenceTransformer(Config.EMBEDDING_MODEL)\n", "embedding_dim = model.get_sentence_embedding_dimension()\n", "print(f\"✅ Model loaded! Dimension: {embedding_dim}\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ============================================================================\n", "# CANDIDATE EMBEDDINGS - Generate or Load\n", "# ============================================================================\n", "\n", "if cand_exists:\n", " print(\"📥 LOADING candidate embeddings from file...\")\n", " cand_vectors = np.load(CAND_EMBEDDINGS_FILE)\n", " print(f\"✅ Loaded: {cand_vectors.shape}\")\n", " \n", " # Verify alignment\n", " if len(cand_vectors) != len(candidates):\n", " print(f\"\\n⚠️ WARNING: Size mismatch!\")\n", " print(f\" Embeddings: {len(cand_vectors):,}\")\n", " print(f\" Dataset: {len(candidates):,}\")\n", " print(f\"\\n🔄 Regenerating...\")\n", " cand_exists = False\n", "\n", "if not cand_exists:\n", " print(\"🔄 GENERATING candidate embeddings...\")\n", " print(f\" Processing {len(candidates):,} candidates...\\n\")\n", " \n", " # Build text representations\n", " def build_candidate_text(row):\n", " parts = []\n", " \n", " if row.get('Category'):\n", " parts.append(f\"Job Category: {row['Category']}\")\n", " \n", " if row.get('skills'):\n", " parts.append(f\"Skills: {row['skills']}\")\n", " \n", " if row.get('career_objective'):\n", " parts.append(f\"Objective: {row['career_objective']}\")\n", " \n", " if row.get('degree_names'):\n", " parts.append(f\"Education: {row['degree_names']}\")\n", " \n", " if row.get('positions'):\n", " parts.append(f\"Experience: {row['positions']}\")\n", " \n", " return ' '.join(parts)\n", " \n", " candidate_texts = candidates.apply(build_candidate_text, axis=1).tolist()\n", " \n", " # Generate embeddings\n", " cand_vectors = model.encode(\n", " candidate_texts,\n", " show_progress_bar=True,\n", " batch_size=32,\n", " normalize_embeddings=True,\n", " convert_to_numpy=True\n", " )\n", " \n", " # Save\n", " np.save(CAND_EMBEDDINGS_FILE, cand_vectors)\n", " candidates.to_pickle(CAND_METADATA_FILE)\n", " \n", " print(f\"\\n💾 Saved:\")\n", " print(f\" {CAND_EMBEDDINGS_FILE}\")\n", " print(f\" {CAND_METADATA_FILE}\")\n", "\n", "print(f\"\\n✅ CANDIDATE EMBEDDINGS READY\")\n", "print(f\" Shape: {cand_vectors.shape}\")\n", "print(f\" Dataset size: {len(candidates):,}\")\n", "print(f\" Alignment: {'✅ PERFECT' if len(cand_vectors) == len(candidates) else '❌ MISMATCH'}\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ============================================================================\n", "# COMPANY EMBEDDINGS - Generate or Load\n", "# ============================================================================\n", "\n", "if comp_exists:\n", " print(\"📥 LOADING company embeddings from file...\")\n", " comp_vectors = np.load(COMP_EMBEDDINGS_FILE)\n", " print(f\"✅ Loaded: {comp_vectors.shape}\")\n", " \n", " # Verify alignment\n", " if len(comp_vectors) != len(companies_full):\n", " print(f\"\\n⚠️ WARNING: Size mismatch!\")\n", " print(f\" Embeddings: {len(comp_vectors):,}\")\n", " print(f\" Dataset: {len(companies_full):,}\")\n", " print(f\"\\n🔄 Regenerating...\")\n", " comp_exists = False\n", "\n", "if not comp_exists:\n", " print(\"🔄 GENERATING company embeddings...\")\n", " print(f\" Processing {len(companies_full):,} companies...\")\n", " print(f\" IMPORTANT: Generated AFTER deduplication for alignment!\\n\")\n", " \n", " # Build text representations\n", " def build_company_text(row):\n", " parts = []\n", " \n", " if row.get('name'):\n", " parts.append(f\"Company: {row['name']}\")\n", " \n", " if row.get('description'):\n", " parts.append(f\"Description: {row['description']}\")\n", " \n", " if row.get('industries_list'):\n", " parts.append(f\"Industries: {row['industries_list']}\")\n", " \n", " if row.get('specialties_list'):\n", " parts.append(f\"Specialties: {row['specialties_list']}\")\n", " \n", " # Include job postings data (THE BRIDGE!)\n", " if row.get('required_skills'):\n", " parts.append(f\"Required Skills: {row['required_skills']}\")\n", " \n", " if row.get('posted_job_titles'):\n", " parts.append(f\"Job Titles: {row['posted_job_titles']}\")\n", " \n", " if row.get('experience_levels'):\n", " parts.append(f\"Experience Levels: {row['experience_levels']}\")\n", " \n", " return ' '.join(parts)\n", " \n", " company_texts = companies_full.apply(build_company_text, axis=1).tolist()\n", " \n", " # Generate embeddings\n", " comp_vectors = model.encode(\n", " company_texts,\n", " show_progress_bar=True,\n", " batch_size=32,\n", " normalize_embeddings=True,\n", " convert_to_numpy=True\n", " )\n", " \n", " # Save\n", " np.save(COMP_EMBEDDINGS_FILE, comp_vectors)\n", " companies_full.to_pickle(COMP_METADATA_FILE)\n", " \n", " print(f\"\\n💾 Saved:\")\n", " print(f\" {COMP_EMBEDDINGS_FILE}\")\n", " print(f\" {COMP_METADATA_FILE}\")\n", "\n", "print(f\"\\n✅ COMPANY EMBEDDINGS READY\")\n", "print(f\" Shape: {comp_vectors.shape}\")\n", "print(f\" Dataset size: {len(companies_full):,}\")\n", "print(f\" Alignment: {'✅ PERFECT' if len(comp_vectors) == len(companies_full) else '❌ MISMATCH'}\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ============================================================================\n", "# FINAL VERIFICATION\n", "# ============================================================================\n", "\n", "print(\"🔍 FINAL ALIGNMENT CHECK\")\n", "print(\"=\" * 80)\n", "print()\n", "\n", "print(f\"📊 CANDIDATES:\")\n", "print(f\" Dataset rows: {len(candidates):,}\")\n", "print(f\" Embedding vectors: {len(cand_vectors):,}\")\n", "print(f\" Status: {'✅ ALIGNED' if len(candidates) == len(cand_vectors) else '❌ MISALIGNED'}\")\n", "print()\n", "\n", "print(f\"📊 COMPANIES:\")\n", "print(f\" Dataset rows: {len(companies_full):,}\")\n", "print(f\" Embedding vectors: {len(comp_vectors):,}\")\n", "print(f\" Status: {'✅ ALIGNED' if len(companies_full) == len(comp_vectors) else '❌ MISALIGNED'}\")\n", "print()\n", "\n", "if len(candidates) == len(cand_vectors) and len(companies_full) == len(comp_vectors):\n", " print(\"🎯 PERFECT ALIGNMENT! Ready for matching!\")\n", " print(\"\\n💡 Next runs will LOAD embeddings (fast!)\")\n", "else:\n", " print(\"⚠️ ALIGNMENT ISSUE DETECTED\")\n", " print(\" Delete .npy files and regenerate\")\n", "\n", "print(\"\\n\" + \"=\" * 80)" ] } ], "metadata": { "kernelspec": { "display_name": "venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 2 }