{"felt_version":"46","isAdmin":false,"constraints":{"bounds":null,"maxZoom":null,"minZoom":null},"isOwner":false,"mapProject":null,"allowedFeatures":{"transformations":false,"sdk":false,"editableLayers":false,"streamVectorTiles":false,"embedTokens":false,"embedActionCustomization":false,"contributorLicenses":false,"basicExports":false,"filters":false,"sameDomainJoin":false,"h3":false,"mapActions":false,"commentsAttachedData":false,"createLayerFromColumns":false,"streamCogs":false,"widgets":false,"viewerExportData":false,"bucketSources":false,"embeds":false,"advancedExports":false,"basicPipelineExports":false,"enterprisePipelineExports":false,"liveLayers":false,"uploadLayer":false,"extensions":false,"sources":false,"updateEnterpriseSettings":false,"enterpriseExports":false,"usageDashboard":false,"customIcons":false,"iframePopups":false,"stacSource":false,"workspaceLibrary":false,"commentsAttachedMedia":false},"buildSha":"bb2cb015c3682483405300a129b2e7d71e52a7b5","createMapParams":null,"individualPermissions":[],"teamAdminEmails":[],"actions":[],"layerTaggedUsers":[],"pendingAccessRequests":[],"current_user":{},"mapUrls":{"export":"https://felt.com/map/export/d9107725-f9a4-4ee9-a6a7-6bdebd9276a7","embed":"https://felt.com/embed/map/Active-Rebel-Groups-and-Chinese-Assets-in-Ethiopia-2026-2RB3JfmkTummp2vevZJ2pD","login":"/login/map/d9107725-f9a4-4ee9-a6a7-6bdebd9276a7","appHomeForKarta":"/maps/contains/d9107725-f9a4-4ee9-a6a7-6bdebd9276a7","dataTroubleshooting":"https://help.felt.com/upload-anything/troubleshooting","exportComments":"https://felt.com/map/export/d9107725-f9a4-4ee9-a6a7-6bdebd9276a7/comments","signup":"/signup/map/d9107725-f9a4-4ee9-a6a7-6bdebd9276a7","supportedFormats":"https://help.felt.com/upload-anything/files"},"mapBackgrounds":[],"comments":{"threads":[],"users":{}},"validGeoDataExtensions":[".json",".geojson"],"sharing":{"maxInheritedPermission":"view_only","publicAccess":"view_only"},"amplitudeAnalyticsId":"d01926b917624c9f002b79f6016c7213","settings":{"path":"/map/Active-Rebel-Groups-and-Chinese-Assets-in-Ethiopia-2026-2RB3JfmkTummp2vevZJ2pD","url":"https://felt.com/map/Active-Rebel-Groups-and-Chinese-Assets-in-Ethiopia-2026-2RB3JfmkTummp2vevZJ2pD","viewers":{"allowExport":false,"dataTable":true,"defaultTableLayerId":null,"duplicateMap":true,"seeMapPresence":true},"mapDescription":null,"mapTitle":"Active Rebel Groups and Chinese Assets in Ethiopia 2026 "},"layerGroups":[],"loadedAt":1775420898,"onboardingNeeded":[],"mapId":"d9107725-f9a4-4ee9-a6a7-6bdebd9276a7","scripts":[{"id":"65ee1c35-1369-4a1a-a019-0879fe694432","name":"Custom extension","threads":[{"id":"73820afd-3abc-41ab-8b3b-235a13fdc2a3","insertedAt":"2026-03-29T09:02:54.117019","scriptId":"65ee1c35-1369-4a1a-a019-0879fe694432"}],"content":"\n\n// Define categories and their colors\nconst categories = {\n \"Industrial\": \"#FF6B35\", // Orange for Industrial Parks & SEZs\n \"Energy/Extractives\": \"#2E8B57\", // Green for Mining & Energy\n \"Manufacturing\": \"#4169E1\", // Blue for Heavy Manufacturing\n \"Infrastructure\": \"#8B008B\" // Purple for Agriculture & Infrastructure\n};\n\n// Define all Chinese assets in Ethiopia\nconst assets = [\n // Industrial Parks & SEZs\n { name: \"Eastern Industrial Zone (Dukem)\", category: \"Industrial\", status: \"Largest private hub\", coords: [38.92, 8.77] },\n { name: \"Huajian Industrial Park (Addis Ababa)\", category: \"Industrial\", status: \"Footwear/Apparel hub\", coords: [38.70, 8.95] },\n { name: \"Arerti Industrial Zone (Amhara)\", category: \"Industrial\", status: \"Developed by CCCC\", coords: [39.40, 8.83] },\n { name: \"Dire Dawa Industrial Park\", category: \"Industrial\", status: \"Logistics/Rail hub\", coords: [41.72, 9.61] },\n { name: \"Adama Industrial Park\", category: \"Industrial\", status: \"Textile/Garment center\", coords: [39.30, 8.52] },\n { name: \"Bahir Dar Industrial Park\", category: \"Industrial\", status: \"Export-oriented textiles\", coords: [37.33, 11.56] },\n { name: \"Hawassa Industrial Park\", category: \"Industrial\", status: \"CCECC managed\", coords: [38.48, 7.05] },\n \n // Mining & Energy\n { name: \"Kurmuk Gold Project\", category: \"Energy/Extractives\", status: \"Zijin Mining; operational mid-2026\", coords: [34.30, 10.51] },\n { name: \"Poly-GCL (Calub/Hilala Gas Fields)\", category: \"Energy/Extractives\", status: \"Ogaden Basin extraction\", coords: [44.83, 6.22] },\n { name: \"Kenticha Tantalum Mine\", category: \"Energy/Extractives\", status: \"Lithium/Tantalum JV\", coords: [39.02, 5.52] },\n { name: \"Genale Dawa III Hydropower\", category: \"Energy/Extractives\", status: \"Financed/built by China\", coords: [39.71, 5.51] },\n { name: \"Tana Beles Sugar Factory One\", category: \"Energy/Extractives\", status: \"Chinese-funded processing\", coords: [37.01, 11.88] },\n { name: \"Omo Kuraz Sugar II & III\", category: \"Energy/Extractives\", status: \"CDB financed\", coords: [36.15, 5.85] },\n \n // Heavy Manufacturing\n { name: \"East Cement Factory (North Shoa)\", category: \"Manufacturing\", status: \"Large-scale production\", coords: [38.58, 9.00] },\n { name: \"Sansheng Pharmaceuticals (Dukem)\", category: \"Manufacturing\", status: \"Largest pharma plant\", coords: [38.93, 8.79] },\n { name: \"L Africa Steel (Bishoftu)\", category: \"Manufacturing\", status: \"Metal fabrication\", coords: [38.98, 8.75] },\n { name: \"Hansom Glass Factory\", category: \"Manufacturing\", status: \"Major glass production\", coords: [38.95, 8.81] },\n { name: \"Lifan Motors (Dukem)\", category: \"Manufacturing\", status: \"Automotive assembly\", coords: [38.92, 8.78] },\n \n // Agriculture & Infrastructure\n { name: \"Ethio-Djibouti Railway (Furi-Labu Station)\", category: \"Infrastructure\", status: \"Strategic terminal\", coords: [38.68, 8.93] },\n { name: \"Bamboo Star Agro-Forestry\", category: \"Infrastructure\", status: \"Industrial bamboo products\", coords: [38.77, 8.95] },\n { name: \"Huichuan Freeze-Dried Food\", category: \"Infrastructure\", status: \"2026 High-tech coffee processing\", coords: [38.75, 9.02] },\n { name: \"Ethio Telecom Backbone\", category: \"Infrastructure\", status: \"Huawei/ZTE managed infrastructure\", coords: [38.76, 9.01] }\n];\n\n// Create elements for each asset\nasync function createAssetElements() {\n console.log(`Creating ${assets.length} Chinese asset markers in Ethiopia...`);\n \n const createdElements = [];\n \n for (const asset of assets) {\n try {\n const element = await felt.createElement({\n type: \"Place\",\n coordinates: asset.coords,\n name: asset.name,\n color: categories[asset.category],\n symbol: \":factory:\",\n frame: \"frame-circle\",\n interaction: \"locked\",\n attributes: {\n Category: asset.category,\n Status: asset.status,\n Country: \"Ethiopia\",\n Year: \"2026\",\n Ownership: \"Chinese-owned/operated\"\n }\n });\n \n createdElements.push(element);\n console.log(`Created: ${asset.name} (${asset.category})`);\n } catch (error) {\n console.error(`Failed to create element for ${asset.name}:`, error);\n }\n }\n \n console.log(`Successfully created ${createdElements.length} asset markers`);\n return createdElements;\n}\n\n// Set viewport to show Ethiopia\nfunction setEthiopiaViewport() {\n felt.setViewport({\n center: { latitude: 9.0, longitude: 38.7 },\n zoom: 6\n });\n console.log(\"Viewport set to show Ethiopia\");\n}\n\n// Create summary statistics\nfunction createSummary() {\n const categoryStats = {};\n assets.forEach(asset => {\n categoryStats[asset.category] = (categoryStats[asset.category] || 0) + 1;\n });\n \n console.log(\"=== Chinese Assets in Ethiopia (2026) Summary ===\");\n console.log(`Total Assets: ${assets.length}`);\n Object.entries(categoryStats).forEach(([category, count]) => {\n console.log(`${category}: ${count} assets`);\n });\n \n return categoryStats;\n}\n\n// Main execution\nasync function main() {\n console.log(\"Creating map of Chinese-owned and operated assets in Ethiopia (2026)...\");\n \n // Create summary\n const stats = createSummary();\n \n // Set viewport to Ethiopia\n setEthiopiaViewport();\n \n // Create all asset elements\n const elements = await createAssetElements();\n \n console.log(\"=== Color Legend ===\");\n Object.entries(categories).forEach(([category, color]) => {\n console.log(`${category}: ${color}`);\n });\n \n console.log(\"\\nMap creation complete! All Chinese assets in Ethiopia have been plotted and color-coded by category.\");\n}\n\n// Execute the main function\nmain().catch(error => {\n console.error(\"Error creating map:\", error);\n});","insertedAt":"2026-03-29T09:02:54","zOrder":-1},{"id":"064f8310-f36b-4acf-abe3-f8b836716db7","name":"Custom extension 2","threads":[{"id":"63af2572-7ce8-4897-ac5a-e4020afee9ea","insertedAt":"2026-03-29T09:06:25.845848","scriptId":"064f8310-f36b-4acf-abe3-f8b836716db7"}],"content":"\n\n// Set initial viewport to center on Ethiopia\nfelt.setViewport({\n center: { latitude: 9.1450, longitude: 40.4897 },\n zoom: 6\n});\n\n// Fano Militia locations (Red)\nconst fanoLocations = [\n {\n name: \"Nefase Mewucha\",\n coordinates: [38.4667, 12.0167], // South Gondar\n activity: \"Captured town March 18, 2026\"\n },\n {\n name: \"Gondar City\", \n coordinates: [37.4667, 12.6000], // North Gondar\n activity: \"Active urban insurgency\"\n },\n {\n name: \"Debre Markos\",\n coordinates: [37.7333, 10.3333], // Gojjam\n activity: \"Major faction stronghold\"\n },\n {\n name: \"Lalibela\",\n coordinates: [39.0333, 12.0333], // Wollo\n activity: \"Frequent skirmish site\"\n }\n];\n\n// OLA locations (Orange)\nconst olaLocations = [\n {\n name: \"Gimbi\",\n coordinates: [35.8333, 9.1667], // Western Oromia\n activity: \"Core operational zone\"\n },\n {\n name: \"Dembi Dollo\",\n coordinates: [34.8000, 8.5333], // Western Oromia\n activity: \"Core operational zone\"\n },\n {\n name: \"Ginde Beret\",\n coordinates: [38.2500, 9.5000], // Central Oromia\n activity: \"Strategic node near Addis Ababa\"\n },\n {\n name: \"Sayo Woreda\",\n coordinates: [35.0000, 8.8333], // Kellem Wollega\n activity: \"Recent heavy engagements\"\n },\n {\n name: \"Anfillo Woreda\",\n coordinates: [35.1667, 9.0000], // Kellem Wollega\n activity: \"Recent heavy engagements\"\n }\n];\n\n// Contested flashpoints (Yellow)\nconst contestedLocations = [\n {\n name: \"Tselemti\",\n coordinates: [37.2000, 14.1000], // Tigray/Amhara Border\n activity: \"Recent clashes between TPLF/TDF and Amhara forces\"\n },\n {\n name: \"Welkait/Humera\",\n coordinates: [36.6167, 14.2833], // Disputed zone\n activity: \"Heavily militarized disputed zone\"\n }\n];\n\n// Create Fano Militia locations\nfor (const location of fanoLocations) {\n await felt.createElement({\n type: \"Place\",\n coordinates: location.coordinates,\n name: location.name,\n color: \"#DC2626\", // Red\n symbol: \":crossed_swords:\",\n frame: \"frame-circle\",\n attributes: {\n \"Group Name\": \"Fano Militia (Amhara)\",\n \"Recent Activity\": location.activity\n },\n interaction: \"locked\"\n });\n}\n\n// Create OLA locations\nfor (const location of olaLocations) {\n await felt.createElement({\n type: \"Place\",\n coordinates: location.coordinates,\n name: location.name,\n color: \"#EA580C\", // Orange\n symbol: \":military_helmet:\",\n frame: \"frame-circle\",\n attributes: {\n \"Group Name\": \"Oromo Liberation Army (OLA)\",\n \"Recent Activity\": location.activity\n },\n interaction: \"locked\"\n });\n}\n\n// Create contested flashpoint locations\nfor (const location of contestedLocations) {\n await felt.createElement({\n type: \"Place\",\n coordinates: location.coordinates,\n name: location.name,\n color: \"#EAB308\", // Yellow\n symbol: \":warning:\",\n frame: \"frame-square\",\n attributes: {\n \"Group Name\": \"Contested Flashpoint\",\n \"Recent Activity\": location.activity\n },\n interaction: \"locked\"\n });\n}\n\n// Create 20km buffer zones around OLA Western Command (Gimbi and Dembi Dollo)\nconst westernCommandZones = [\n { name: \"Gimbi\", coordinates: [35.8333, 9.1667] },\n { name: \"Dembi Dollo\", coordinates: [34.8000, 8.5333] }\n];\n\nfor (const zone of westernCommandZones) {\n await felt.createElement({\n type: \"Circle\",\n center: zone.coordinates,\n radius: 20000, // 20km in meters\n name: `${zone.name} Rural Influence Area`,\n color: \"#F97316\", // Orange (lighter)\n fillOpacity: 0.15,\n strokeOpacity: 0.6,\n strokeWidth: 2,\n strokeStyle: \"dashed\",\n radiusMarker: true,\n attributes: {\n \"Group Name\": \"OLA Western Command\",\n \"Recent Activity\": \"Rural influence and control zone - 20km radius\"\n },\n interaction: \"locked\"\n });\n}\n\n// Create legend elements\nawait felt.createElement({\n type: \"Text\",\n text: \"ETHIOPIA CONFLICT ZONES - MARCH 2026\",\n position: [42.0, 14.5],\n style: \"caps\",\n scale: 1.5,\n color: \"#1F2937\",\n attributes: {\n \"Type\": \"Map Title\"\n },\n interaction: \"locked\"\n});\n\nawait felt.createElement({\n type: \"Text\",\n text: \"🗡️ Fano Militia (Amhara)\\n🪖 OLA Forces\\n⚠️ Contested Zones\\n○ Rural Influence (20km)\",\n position: [42.0, 13.8],\n align: \"left\",\n color: \"#374151\",\n attributes: {\n \"Type\": \"Legend\"\n },\n interaction: \"locked\"\n});\n\nconsole.log(\"Ethiopia conflict zone map created successfully!\");\nconsole.log(\"- Fano Militia locations: 4 sites marked in red\");\nconsole.log(\"- OLA locations: 5 sites marked in orange\");\nconsole.log(\"- Contested flashpoints: 2 sites marked in yellow\");\nconsole.log(\"- Rural influence zones: 20km buffers around Gimbi and Dembi Dollo\");","insertedAt":"2026-03-29T09:06:25","zOrder":-2},{"id":"0e60ecc0-fa6b-445c-93c0-360d94f74461","name":"Custom extension 3","threads":[{"id":"80191f33-3abc-4b19-b12a-340e0289750e","insertedAt":"2026-03-29T09:14:11.067860","scriptId":"0e60ecc0-fa6b-445c-93c0-360d94f74461"}],"content":"\n\n// Create January 2025 Historical Data Layer\nconst historicalData = {\n type: \"FeatureCollection\",\n features: [\n // Fano Militia (Amhara) - January 2025\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.55, 12.67] },\n properties: {\n \"Group Name\": \"Fano Militia (Amhara)\",\n \"Date\": \"January 2025\",\n \"Status\": \"Segmented commands, rural focus\",\n \"Location\": \"North Gondar Highlands\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.73, 10.33] },\n properties: {\n \"Group Name\": \"Fano Militia (Amhara)\",\n \"Date\": \"January 2025\",\n \"Status\": \"Guerilla activity\",\n \"Location\": \"Debre Markos Periphery\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.73, 11.08] },\n properties: {\n \"Group Name\": \"Fano Militia (Amhara)\",\n \"Date\": \"January 2025\",\n \"Status\": \"Frequent highway ambushes\",\n \"Location\": \"Kombolcha-Woldia Corridor\"\n }\n },\n // Oromo Liberation Army (OLA) - January 2025\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [34.80, 8.63] },\n properties: {\n \"Group Name\": \"Oromo Liberation Army (OLA)\",\n \"Date\": \"January 2025\",\n \"Status\": \"Deep territorial control\",\n \"Location\": \"Kellem Wollega\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.00, 5.33] },\n properties: {\n \"Group Name\": \"Oromo Liberation Army (OLA)\",\n \"Date\": \"January 2025\",\n \"Status\": \"Active insurgency, resource disruption\",\n \"Location\": \"Guji Zone (Southern)\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.85, 9.38] },\n properties: {\n \"Group Name\": \"Oromo Liberation Army (OLA)\",\n \"Date\": \"January 2025\",\n \"Status\": \"Strategic foothold near the capital\",\n \"Location\": \"Ginde Beret (Central)\"\n }\n },\n // Tigray (Post-Civil War) - January 2025\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.47, 13.49] },\n properties: {\n \"Group Name\": \"Tigray (Post-Civil War)\",\n \"Date\": \"January 2025\",\n \"Status\": \"TPLF-led Interim Administration; high tension with hardliners\",\n \"Location\": \"Mekelle\"\n }\n }\n ]\n};\n\n// Create March 2026 Active Hostilities Data Layer\nconst currentData = {\n type: \"FeatureCollection\",\n features: [\n // Fano Militia (Amhara) - March 2026\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.47, 11.73] },\n properties: {\n \"Group Name\": \"Fano Militia (Amhara)\",\n \"Date\": \"March 2026\",\n \"Status\": \"Town occupied\",\n \"Location\": \"Nefase Mewucha (Captured March 18, 2026)\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.39, 11.60] },\n properties: {\n \"Group Name\": \"Fano Militia (Amhara)\",\n \"Date\": \"March 2026\",\n \"Status\": \"Urban offensive launched\",\n \"Location\": \"Bahir Dar\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.47, 12.60] },\n properties: {\n \"Group Name\": \"Fano Militia (Amhara)\",\n \"Date\": \"March 2026\",\n \"Status\": \"Heavy urban warfare\",\n \"Location\": \"Gondar City\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.53, 9.68] },\n properties: {\n \"Group Name\": \"Fano Militia (Amhara)\",\n \"Date\": \"March 2026\",\n \"Status\": \"Main highway to Addis Ababa frequently blocked\",\n \"Location\": \"Debre Birhan\"\n }\n },\n // Oromo Liberation Army (OLA) - March 2026\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [34.83, 8.53] },\n properties: {\n \"Group Name\": \"Oromo Liberation Army (OLA)\",\n \"Date\": \"March 2026\",\n \"Status\": \"Heavy clashes with federal forces\",\n \"Location\": \"Dembi Dollo & Sayo Woreda\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.65, 9.28] },\n properties: {\n \"Group Name\": \"Oromo Liberation Army (OLA)\",\n \"Date\": \"March 2026\",\n \"Status\": \"Active threat to capital region\",\n \"Location\": \"Mulo (Periphery of Addis)\"\n }\n },\n // Tigray Flashpoints - March 2026\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.25, 13.45] },\n properties: {\n \"Group Name\": \"Tigray Flashpoints\",\n \"Date\": \"March 2026\",\n \"Status\": \"Clashes between TDF and Amhara militias/federal forces\",\n \"Location\": \"Tselemti Woreda\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.15, 13.75] },\n properties: {\n \"Group Name\": \"Tigray Flashpoints\",\n \"Date\": \"March 2026\",\n \"Status\": \"Heavily militarized, disputed border\",\n \"Location\": \"Welkait/Humera Border\"\n }\n }\n ]\n};\n\n// Create the historical layer (January 2025)\nconst historicalLayer = await felt.createLayersFromGeoJson({\n name: \"January 2025 - Historical Insurgency\",\n source: { type: \"geoJsonData\", data: historicalData },\n description: \"Baseline insurgency activity and territorial control as of January 2025\",\n geometryStyles: {\n Point: {\n version: \"2.3.1\",\n type: \"categorical\",\n config: {\n categoricalAttribute: \"Group Name\",\n categories: [\"Fano Militia (Amhara)\", \"Oromo Liberation Army (OLA)\", \"Tigray (Post-Civil War)\"]\n },\n paint: {\n color: [\"#1f77b4\", \"#1f77b4\", \"#1f77b4\"], // Solid blue for all groups\n strokeColor: [\"#0d47a1\", \"#0d47a1\", \"#0d47a1\"],\n size: 8,\n strokeWidth: 2,\n opacity: 0.7 // 70% opacity as requested\n },\n label: {\n minZoom: 8,\n color: [\"#0d47a1\", \"#0d47a1\", \"#0d47a1\"],\n haloColor: \"#ffffff\",\n haloWidth: 1,\n fontSize: 12\n },\n legend: { \n displayName: {\n \"Fano Militia (Amhara)\": \"Fano Militia (Jan 2025)\",\n \"Oromo Liberation Army (OLA)\": \"OLA (Jan 2025)\", \n \"Tigray (Post-Civil War)\": \"Tigray (Jan 2025)\"\n }\n }\n }\n }\n});\n\n// Create the current layer (March 2026)\nconst currentLayer = await felt.createLayersFromGeoJson({\n name: \"March 2026 - Active Hostilities\",\n source: { type: \"geoJsonData\", data: currentData },\n description: \"Current active combat zones and insurgency activities as of March 2026\",\n geometryStyles: {\n Point: {\n version: \"2.3.1\",\n type: \"categorical\",\n config: {\n categoricalAttribute: \"Group Name\",\n categories: [\"Fano Militia (Amhara)\", \"Oromo Liberation Army (OLA)\", \"Tigray Flashpoints\"]\n },\n paint: {\n color: [\"#d62728\", \"#d62728\", \"#d62728\"], // Red for all current groups\n strokeColor: [\"#8b0000\", \"#8b0000\", \"#8b0000\"],\n size: 10,\n strokeWidth: 2,\n opacity: 1.0\n },\n label: {\n minZoom: 8,\n color: [\"#8b0000\", \"#8b0000\", \"#8b0000\"],\n haloColor: \"#ffffff\",\n haloWidth: 1.5,\n fontSize: 12\n },\n legend: { \n displayName: {\n \"Fano Militia (Amhara)\": \"Fano Militia (Mar 2026)\",\n \"Oromo Liberation Army (OLA)\": \"OLA (Mar 2026)\",\n \"Tigray Flashpoints\": \"Tigray Flashpoints (Mar 2026)\"\n }\n }\n }\n }\n});\n\n// Set viewport to show Ethiopia\nfelt.setViewport({\n center: { latitude: 9.145, longitude: 38.757 },\n zoom: 6\n});\n\n// Create an information panel explaining the visualization\nconst panelId = await felt.createPanelId();\nawait felt.createOrUpdatePanel({\n panel: {\n id: panelId,\n title: \"Ethiopia Conflict Zones Analysis\",\n body: [\n {\n type: \"Text\",\n content: \"## Armed Conflict Evolution (2025-2026)\\n\\nThis map visualizes the escalation of armed conflicts in Ethiopia over a 14-month period.\"\n },\n {\n type: \"Divider\"\n },\n {\n type: \"Text\",\n content: \"### Layer Overview\\n\\n**🔵 January 2025 (Blue):** Historical baseline showing insurgency patterns and territorial control\\n\\n**🔴 March 2026 (Red):** Current active hostilities and combat zones\"\n },\n {\n type: \"Divider\"\n },\n {\n type: \"Text\",\n content: \"### Key Observations\\n\\n• **Escalation:** Significant increase in urban warfare and territorial gains\\n• **Geographic Spread:** Conflicts have expanded closer to major population centers\\n• **Strategic Concerns:** Multiple groups now pose direct threats to critical infrastructure\"\n },\n {\n type: \"Button\",\n label: \"Focus on Addis Ababa Region\",\n variant: \"filled\",\n tint: \"primary\",\n onClick: () => {\n felt.setViewport({\n center: { latitude: 9.0, longitude: 38.7 },\n zoom: 8\n });\n }\n },\n {\n type: \"Button\",\n label: \"View Northern Conflicts\",\n variant: \"outlined\",\n onClick: () => {\n felt.setViewport({\n center: { latitude: 12.5, longitude: 38.0 },\n zoom: 7\n });\n }\n }\n ],\n onClickClose: () => {\n felt.deletePanel(panelId);\n }\n }\n});\n\nconsole.log(\"Ethiopia conflict visualization created successfully\");\nconsole.log(\"Historical layer (2025):\", historicalLayer.layerGroup.name);\nconsole.log(\"Current layer (2026):\", currentLayer.layerGroup.name);","insertedAt":"2026-03-29T09:14:11","zOrder":-3},{"id":"7e6596f8-8dc0-4d64-9b3a-43e560553b84","name":"Custom extension 4","threads":[{"id":"c5fabe42-cb59-4454-a10f-1edce06284e1","insertedAt":"2026-03-29T09:18:15.514054","scriptId":"7e6596f8-8dc0-4d64-9b3a-43e560553b84"}],"content":"\n\n// Create GeoJSON data for each year of conflict\nconst conflict2023Data = {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.47, 13.49] },\n properties: {\n Year: \"2023\",\n Group: \"TPLF/TDF\",\n Location: \"Mekelle\",\n \"Operational Status\": \"Demobilization phase; transitioning to Interim Administration\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.46, 14.27] },\n properties: {\n Year: \"2023\",\n Group: \"TPLF/TDF\",\n Location: \"Adigrat\",\n \"Operational Status\": \"Demobilization phase; transitioning to Interim Administration\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [35.83, 9.17] },\n properties: {\n Year: \"2023\",\n Group: \"OLA\",\n Location: \"Western Wollega\",\n \"Operational Status\": \"Consolidation of rural liberated zones following failed peace talks\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.00, 5.33] },\n properties: {\n Year: \"2023\",\n Group: \"OLA\",\n Location: \"Guji\",\n \"Operational Status\": \"Consolidation of rural liberated zones following failed peace talks\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.50, 11.50] },\n properties: {\n Year: \"2023\",\n Group: \"Fano\",\n Location: \"Rural Amhara Highlands\",\n \"Operational Status\": \"Small-scale localized skirmishes; rising tension over disarmament\"\n }\n }\n ]\n};\n\nconst conflict2024Data = {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.39, 11.60] },\n properties: {\n Year: \"2024\",\n Group: \"Fano Militia\",\n Location: \"Bahir Dar\",\n \"Operational Status\": \"Outbreak of full-scale regional insurgency; state of emergency declared\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.47, 12.60] },\n properties: {\n Year: \"2024\",\n Group: \"Fano Militia\",\n Location: \"Gondar\",\n \"Operational Status\": \"Outbreak of full-scale regional insurgency; state of emergency declared\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.85, 9.38] },\n properties: {\n Year: \"2024\",\n Group: \"OLA\",\n Location: \"Ginde Beret\",\n \"Operational Status\": \"Expansion toward Finfinne periphery; increased kidnapping/ransom tactics\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.00, 8.75] },\n properties: {\n Year: \"2024\",\n Group: \"OLA\",\n Location: \"East Shewa\",\n \"Operational Status\": \"Expansion toward Finfinne periphery; increased kidnapping/ransom tactics\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.60, 12.75] },\n properties: {\n Year: \"2024\",\n Group: \"Amhara/Tigray Border\",\n Location: \"Raya\",\n \"Operational Status\": \"First major post-war territorial clashes\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.15, 13.75] },\n properties: {\n Year: \"2024\",\n Group: \"Amhara/Tigray Border\",\n Location: \"Welkait\",\n \"Operational Status\": \"First major post-war territorial clashes\"\n }\n }\n ]\n};\n\nconst conflict2025Data = {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [37.73, 10.33] },\n properties: {\n Year: \"2025\",\n Group: \"Fano Militia\",\n Location: \"Debre Markos\",\n \"Operational Status\": \"Control of rural administrative nodes; frequent hit-and-run on ENDF convoys\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.04, 12.03] },\n properties: {\n Year: \"2025\",\n Group: \"Fano Militia\",\n Location: \"Lalibela\",\n \"Operational Status\": \"Control of rural administrative nodes; frequent hit-and-run on ENDF convoys\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [34.80, 8.63] },\n properties: {\n Year: \"2025\",\n Group: \"OLA\",\n Location: \"Kellem Wollega\",\n \"Operational Status\": \"Heavy focus on southern trade route disruption\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.30, 3.85] },\n properties: {\n Year: \"2025\",\n Group: \"OLA\",\n Location: \"Borena\",\n \"Operational Status\": \"Heavy focus on southern trade route disruption\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.30, 14.10] },\n properties: {\n Year: \"2025\",\n Group: \"TPLF Hardliners\",\n Location: \"North-Western Tigray\",\n \"Operational Status\": \"Friction within TPLF; reports of re-arming near the Eritrean border\"\n }\n }\n ]\n};\n\nconst conflict2026Data = {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.47, 11.73] },\n properties: {\n Year: \"2026\",\n Group: \"Fano Militia\",\n Location: \"Nefase Mewucha\",\n \"Operational Status\": \"Capture of strategic towns; blockade of Addis–Djibouti corridor\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [39.53, 9.68] },\n properties: {\n Year: \"2026\",\n Group: \"Fano Militia\",\n Location: \"Debre Birhan\",\n \"Operational Status\": \"Capture of strategic towns; blockade of Addis–Djibouti corridor\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.65, 9.28] },\n properties: {\n Year: \"2026\",\n Group: \"OLA\",\n Location: \"Mulo\",\n \"Operational Status\": \"High-intensity urban engagements; coordination with Fano (tactical)\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [34.83, 8.53] },\n properties: {\n Year: \"2026\",\n Group: \"OLA\",\n Location: \"Sayo Woreda\",\n \"Operational Status\": \"High-intensity urban engagements; coordination with Fano (tactical)\"\n }\n },\n {\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [38.25, 13.45] },\n properties: {\n Year: \"2026\",\n Group: \"Tigray/Amhara Flashpoint\",\n Location: \"Tselemti\",\n \"Operational Status\": \"Active combat over disputed territories\"\n }\n }\n ]\n};\n\n// Create layers for each year\nasync function createConflictLayers() {\n console.log(\"Creating Ethiopia conflict timeline layers...\");\n \n // 2023 Layer - Grey\n const layer2023 = await felt.createLayersFromGeoJson({\n name: \"2023 - Post-Pretoria Realignment\",\n source: { type: \"geoJsonData\", data: conflict2023Data },\n caption: \"Demobilization phase and initial realignments\",\n description: \"Armed groups in transition following the Pretoria Agreement\",\n geometryStyles: {\n Point: {\n version: \"2.3.1\",\n type: \"categorical\",\n config: {\n categoricalAttribute: \"Group\",\n categories: [\"TPLF/TDF\", \"OLA\", \"Fano\"]\n },\n paint: {\n color: [\"#808080\", \"#808080\", \"#808080\"],\n strokeColor: [\"#606060\", \"#606060\", \"#606060\"],\n opacity: 0.3,\n size: 8,\n strokeWidth: 1\n },\n label: {\n minZoom: 8,\n color: \"#404040\",\n haloColor: \"#FFFFFF\",\n haloWidth: 1,\n fontSize: 10\n },\n legend: { \n displayName: {\n \"TPLF/TDF\": \"TPLF/TDF (Demobilizing)\",\n \"OLA\": \"OLA (Consolidating)\",\n \"Fano\": \"Fano (Small-scale)\"\n }\n }\n }\n }\n });\n\n // 2024 Layer - Purple\n const layer2024 = await felt.createLayersFromGeoJson({\n name: \"2024 - The Amhara Uprising\",\n source: { type: \"geoJsonData\", data: conflict2024Data },\n caption: \"Escalation to full-scale regional insurgency\",\n description: \"State of emergency declared; territorial clashes emerge\",\n geometryStyles: {\n Point: {\n version: \"2.3.1\",\n type: \"categorical\",\n config: {\n categoricalAttribute: \"Group\",\n categories: [\"Fano Militia\", \"OLA\", \"Amhara/Tigray Border\"]\n },\n paint: {\n color: [\"#8B4A9C\", \"#9B59B6\", \"#7B68A2\"],\n strokeColor: [\"#6A3A7C\", \"#7B4996\", \"#5B4882\"],\n opacity: 0.5,\n size: 10,\n strokeWidth: 1.5\n },\n label: {\n minZoom: 8,\n color: \"#5A2D6C\",\n haloColor: \"#FFFFFF\",\n haloWidth: 1,\n fontSize: 11\n },\n legend: { \n displayName: {\n \"Fano Militia\": \"Fano Militia (Full insurgency)\",\n \"OLA\": \"OLA (Expanding)\",\n \"Amhara/Tigray Border\": \"Border Clashes\"\n }\n }\n }\n }\n });\n\n // 2025 Layer - Blue\n const layer2025 = await felt.createLayersFromGeoJson({\n name: \"2025 - Fragmentation & Attrition\",\n source: { type: \"geoJsonData\", data: conflict2025Data },\n caption: \"Rural control and trade route disruption\",\n description: \"Hit-and-run tactics and administrative capture\",\n geometryStyles: {\n Point: {\n version: \"2.3.1\",\n type: \"categorical\",\n config: {\n categoricalAttribute: \"Group\",\n categories: [\"Fano Militia\", \"OLA\", \"TPLF Hardliners\"]\n },\n paint: {\n color: [\"#3498DB\", \"#2980B9\", \"#1F5F99\"],\n strokeColor: [\"#2471A3\", \"#1B4F72\", \"#174A7A\"],\n opacity: 0.7,\n size: 12,\n strokeWidth: 2\n },\n label: {\n minZoom: 8,\n color: \"#1B4F72\",\n haloColor: \"#FFFFFF\",\n haloWidth: 1.5,\n fontSize: 12\n },\n legend: { \n displayName: {\n \"Fano Militia\": \"Fano (Rural control)\",\n \"OLA\": \"OLA (Trade disruption)\",\n \"TPLF Hardliners\": \"TPLF Hardliners\"\n }\n }\n }\n }\n });\n\n // 2026 Layer - Red (Current)\n const layer2026 = await felt.createLayersFromGeoJson({\n name: \"2026 - Current Active Hostilities\",\n source: { type: \"geoJsonData\", data: conflict2026Data },\n caption: \"Strategic town capture and corridor blockade\",\n description: \"High-intensity engagements and tactical coordination\",\n geometryStyles: {\n Point: {\n version: \"2.3.1\",\n type: \"categorical\",\n config: {\n categoricalAttribute: \"Group\",\n categories: [\"Fano Militia\", \"OLA\", \"Tigray/Amhara Flashpoint\"]\n },\n paint: {\n color: [\"#E74C3C\", \"#C0392B\", \"#A93226\"],\n strokeColor: [\"#CB4335\", \"#A93226\", \"#922B21\"],\n opacity: 1.0,\n size: 14,\n strokeWidth: 2.5\n },\n label: {\n minZoom: 7,\n color: \"#922B21\",\n haloColor: \"#FFFFFF\",\n haloWidth: 2,\n fontSize: 13,\n fontStyle: \"bold\"\n },\n legend: { \n displayName: {\n \"Fano Militia\": \"Fano (Strategic capture)\",\n \"OLA\": \"OLA (Urban combat)\",\n \"Tigray/Amhara Flashpoint\": \"Active Flashpoint\"\n }\n }\n }\n }\n });\n\n console.log(\"All conflict layers created successfully\");\n\n // Center on Addis Ababa to show the \"tightening noose\"\n felt.setViewport({\n center: { latitude: 9.03, longitude: 38.74 }, // Addis Ababa\n zoom: 6.5\n });\n\n // Create summary panel\n const panelId = await felt.createPanelId();\n await felt.createOrUpdatePanel({\n panel: {\n id: panelId,\n title: \"Ethiopia Conflict Timeline 2023-2026\",\n body: [\n {\n type: \"Text\",\n content: \"## Conflict Evolution Analysis\\n\\nThis map shows the escalating armed conflict situation in Ethiopia from 2023 to 2026, demonstrating the 'tightening noose' effect around Addis Ababa.\"\n },\n {\n type: \"Text\",\n content: \"### Timeline Overview\\n\\n**2023** (Grey, 30% opacity): Post-Pretoria realignment and demobilization\\n\\n**2024** (Purple, 50% opacity): Amhara uprising and state of emergency\\n\\n**2025** (Blue, 70% opacity): Fragmentation with rural control strategies\\n\\n**2026** (Red, 100% opacity): Current active hostilities with strategic captures\"\n },\n {\n type: \"Text\",\n content: \"### Key Patterns\\n\\n• **Geographic Convergence**: Armed groups moving closer to the capital corridor\\n• **Tactical Evolution**: From demobilization to coordinated urban engagements\\n• **Strategic Objectives**: Control of trade routes and administrative centers\\n• **Coalition Building**: Increased coordination between Fano and OLA forces\"\n },\n {\n type: \"Divider\"\n },\n {\n type: \"Text\",\n content: \"*Click on individual points for detailed operational status information. Layer visibility can be controlled via the legend.*\"\n }\n ],\n onClickClose: (args) => {\n felt.deletePanel(args.id);\n }\n }\n });\n\n return { layer2023, layer2024, layer2025, layer2026 };\n}\n\n// Execute the layer creation\ncreateConflictLayers();","insertedAt":"2026-03-29T09:18:15","zOrder":-4}],"socketTokenTTLSeconds":1209600,"widgets":[],"ghostPresences":[],"isTrainingKarta":false,"defaultZoom":14.0,"authors":{},"flashMessages":[],"editableByCurrentSession":false,"pipeline":{"syncUploadMaxBytes":15360},"folderTree":[],"supportsNewMap":true,"mapLinks":[],"selectedBackgroundId":null,"mapbox_api_token":"pk.eyJ1IjoiZmVsdG1hcHMiLCJhIjoiY20wZndoenl1MTFrYzJxb2czemdpNGFvZCJ9.y7NzVOMNQNTC487xOYTk7Q","accessControl2":{"view":{"canDuplicate":false,"canExportLayers":false,"canExportMap":false},"edit":{"canAdjustMaxInheritedPermission":false,"canChangePublicSharingSettings":false,"canDeleteMap":false,"canEditLayerComponents":false,"canEditMapContents":false,"canEditMapElements":false,"canEditMapLayerFeatures":false,"canEditMapLayers":false,"canEnterContributeMode":false,"canEnterEditMode":false,"canInviteUsers":false,"canMove":false},"comments":{"canAttachPhotosToComments":false,"canCreateThread":false,"canDeleteAnyComment":false,"canDeleteOwnComment":false,"canEditOwnComment":false,"canExportComments":false,"canMoveAnyThread":false,"canMoveOwnThread":false,"canReplyToThread":false,"canResolveAnyComment":false,"canResolveOwnComment":false,"canTrackReadStatus":false,"canViewAllThreads":false},"teams":{"canAddSources":false,"canDeletePublishedLayer":false,"canPublishLayer":false},"kartaTeamMemberIds":[]},"elements":[],"partnerBranding":null,"mapFolderId":null,"featureFlags":{"ff_extensions_use_next_sdk":false,"ff_lightning_server":false,"ff_consistent_permissions":false,"felt_is_up":true,"ff_app_home_react":true,"ff_app_home_search":true,"ff_copy_paste_styles":false,"ff_download_pmtiles":false,"ff_editable_data_person_attribute":true,"ff_felt_ai":false,"ff_in_product_sales_form":true,"ff_isr":false,"ff_library_enchantments":false,"ff_mobile_alpha":false,"ff_more_components":false,"ff_offline":false,"ff_request_edit_access":true,"ff_timeseries_animation":false,"ff_use_our_tiles":false,"ff_wherobots":true},"satelliteMode":false,"mapImages":[],"kartaChannel":"anonymous_map:d9107725-f9a4-4ee9-a6a7-6bdebd9276a7","checkerboardTiles":false,"maxTileURLLength":2000,"commonAnalyticsProperties":{"feature_flags":["ff_all_column_index","ff_app_home_react","ff_app_home_search","ff_editable_data_person_attribute","ff_in_product_sales_form","ff_lambda_screenshot_service","ff_request_edit_access","ff_wherobots"],"workspace_id":"b16354df-c79f-4b0b-b281-b38cdda1c11f","workspace_name":"samael.ink","workspace_plan":"personal","workspace_age_days":9,"native_app_device_model":null,"native_app_os_version":null,"native_app_platform":null,"native_app_version":null,"platform_source":"web"},"canPurchasePlan":true,"currentTeamBannerAcknowledgement":{"plan":null,"plan_name":null,"acknowledged":true},"sources":[],"maxImageFileSizeBytes":20000000,"viewerPermissionInfo":{"directInvitePermission":null,"effectivePermission":"view_only","effectiveSource":"public_access"},"pendingAccessRequestApproval":null,"layerAttrConstraints":{"maxNameLength":300},"mapTeamId":null,"hasPendingAccessRequest":false,"teams":[],"isAdminView":false,"defaultControlsMode":null,"updatedAtUnixMs":1774775484000,"workspaceBilling":{"plan_limits":{"processing_bytes":0,"storage_bytes":0,"editor_limit":3,"member_limit":25,"viewer_limit":22,"contributor_limit":0,"map_views":5000,"api_calls":0},"limits_enforced":true,"next_monthly_cycle_start":1777593600000,"plan_data_usage":{"data_processing":0,"data_storage":4744},"featureGroups":{"enterprise_geocoding":false,"dashboards":false,"cloud_sources":false,"app_development":false,"raster_infrastructure":false},"inGracePeriod":false},"referer":null,"mapTitle":"Active Rebel Groups and Chinese Assets in Ethiopia 2026 ","mapDescription":null,"urls":{"api":"/api","settings":"/legacy_app_home/users/settings","dashboard":"/maps","marketing":"/","newMap":"/map/new","newWorkspace":"/join","placeholderImage":"/images/placeholder-39c4259c68cef774b08a1a06e6626c95.png?vsn=d","canonicalPath":"/map/Active-Rebel-Groups-and-Chinese-Assets-in-Ethiopia-2026-2RB3JfmkTummp2vevZJ2pD","catchup":"/map/Active-Rebel-Groups-and-Chinese-Assets-in-Ethiopia-2026-2RB3JfmkTummp2vevZJ2pD/catchup","workspaceUsage":null},"isVirtualKarta":false,"customIcons":[],"embedConfig":null,"resyncTimeoutMs":5250,"canCreateMapsSomewhere":false,"kartaTeamId":"b16354df-c79f-4b0b-b281-b38cdda1c11f","folderId":null,"curated_layers_enabled":true,"defaultCoordinates":{"lat":37.807,"lng":-122.271},"layerProcessingEmailSubscriptions":[],"shareUrl":"https://felt.com/map/Active-Rebel-Groups-and-Chinese-Assets-in-Ethiopia-2026-2RB3JfmkTummp2vevZJ2pD","mapColorPalette":[],"validMapImageMimeTypes":["application/pdf","application/postscript","application/x-photoshop","image/apng","image/avif","image/bmp","image/heic","image/jp2","image/jpeg","image/jpm","image/jpx","image/jxr","image/pict","image/pjpeg","image/png","image/svg+xml","image/vnd.adobe.photoshop","image/vnd.microsoft.icon","image/webp","image/x-icns","image/x-icon","image/x-pict"],"showBasemapLabels":true,"selectedDefaultBackgroundMode":"dark","customViewport":null}