diff --git a/README.md b/README.md index abc5424..b8c5070 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,42 @@ ![JUnit](https://img.shields.io/badge/JUnit-5.x-blue) ![JaCoCo](https://img.shields.io/badge/JaCoCo-0.8.x-blue) +## Table of Contents + +- [Build Status](#build-status) +- [Features](#features) +- [Prerequisites](#prerequisites) +- [Configuration](#configuration) + - [Kafka Configuration](#kafka-configuration) + - [Component Control](#component-control) + - [Database](#database) + - [Benefits of Write/Read Replicas](#benefits-of-writeread-replicas) + - [When to Use Write/Read Replicas](#when-to-use-writeread-replicas) + - [Configuration](#configuration-1) + - [How Datasource Routing Works](#how-datasource-routing-works) + - [Redis](#redis) + - [Clock Configuration](#clock-configuration) + - [API Documentation](#api-documentation) +- [Development](#development) + - [Running the Application](#running-the-application) + - [Testing](#testing) +- [API Documentation](#api-documentation-1) +- [Getting Started](#getting-started) + - [External Dependencies](#external-dependencies) + - [Using Docker Compose](#using-docker-compose) + - [Service Details](#service-details) + - [Manual Service Management](#manual-service-management) + - [Cloning the Repository](#cloning-the-repository) + - [Building](#building) +- [Contributing](#contributing) +- [GitHub Actions Permissions](#github-actions-permissions) +- [Read Write Datasource Routing](#read-write-datasource-routing) +- [Project Structure](#project-structure) +- [Analysis and Decisions](#analysis-and-decisions) + - [Architecture Decision Records (ADRs)](#architecture-decision-records-adrs) + - [Technical Analysis](#technical-analysis) +- [License](#license) + A Spring Boot application for tracking flight events. ## Build Status @@ -39,8 +75,85 @@ A Spring Boot application for tracking flight events. The application can be configured through `application.yml`. Key configurations include: +### Kafka Configuration + +The application uses Kafka for event streaming and real-time data processing. Here's the complete Kafka configuration: + +```yaml +spring: + kafka: + bootstrap-servers: localhost:9092 + consumer: + group-id: flight-tracker-group + auto-offset-reset: earliest + key-deserializer: org.apache.kafka.common.serialization.StringDeserializer + value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer + properties: + spring.json.trusted.packages: "dev.luismachadoreis.flighttracker.server.ping.application.dto" + topic: + flight-positions: flight-positions + ping-created: ping-created +``` + +#### Component Control + +You can enable or disable various Kafka components and WebSocket notifications: + +```yaml +app: + flight-data: + subscriber: + enabled: true # Enable/disable flight data Kafka subscriber + ping: + subscriber: + enabled: true # Enable/disable ping Kafka subscriber + publisher: + enabled: true # Enable/disable ping Kafka publisher + websocket: + enabled: true # Enable/disable WebSocket notifications +``` +![Load Balancing](docs/diagrams/arch_diagram_load_balancing.png) + +These settings allow you to: +- Control Kafka message consumption for flight data +- Control Kafka message consumption for ping events +- Control Kafka message publishing for ping events +- Enable/disable WebSocket real-time notifications + ### Database +The application supports a Write/Read replica pattern for database operations. This pattern separates read and write operations to different database instances, providing several benefits: + +![Database Write/Read Replicas](docs/diagrams/arch_diagram_datasource_read_write.png) + +#### Benefits of Write/Read Replicas + +1. **Improved Read Performance** + - Read operations are distributed across multiple replicas + - Reduced load on the primary database + - Better scalability for read-heavy workloads + +2. **High Availability** + - If the primary database fails, read replicas can continue serving read requests + - Automatic failover capabilities + - Reduced downtime impact + +3. **Geographic Distribution** + - Read replicas can be placed closer to users + - Reduced latency for read operations + - Better global performance + +#### When to Use Write/Read Replicas + +Consider implementing Write/Read replicas when: +- Your application has a high read-to-write ratio (e.g., 80% reads, 20% writes) +- You need to scale read operations independently +- You require high availability and disaster recovery +- You have geographically distributed users +- Your application has reporting or analytics features that require heavy read operations + +#### Configuration + ```yaml spring: datasource: @@ -54,18 +167,50 @@ spring: password: flighttracker ``` -### Kafka +#### How Datasource Routing Works -```yaml -spring: - kafka: - bootstrap-servers: localhost:9092 - consumer: - group-id: flight-tracker-group - topic: - flight-positions: flight-positions - ping-created: ping-created -``` +The application uses Spring's `@Transactional` annotation to determine which datasource to use. Here's how it works: + +![Datasource Routing](docs/diagrams/arch_diagram_datasource_routing.png) + +1. **Read Operations** + ```java + @Transactional(readOnly = true) + public List getRecentFlights() { + // This will use the reader datasource + return flightRepository.findAll(); + } + ``` + +2. **Write Operations** + ```java + @Transactional + public void saveFlight(Flight flight) { + // This will use the writer datasource + flightRepository.save(flight); + } + ``` + +3. **Mixed Operations** + ```java + @Transactional + public void updateFlightStatus(String flightId, Status newStatus) { + // This will use the writer datasource for the entire method + Flight flight = flightRepository.findById(flightId); + flight.setStatus(newStatus); + flightRepository.save(flight); + } + ``` + +The routing is handled by: +- `ReadWriteRoutingAspect`: Intercepts `@Transactional` annotations +- `DbContextHolder`: Maintains the current context in a ThreadLocal +- `RoutingDataSource`: Routes the request to the appropriate datasource + +**Important Notes:** +- Methods without `@Transactional` will use the writer datasource by default +- Nested transactions inherit the datasource from the outer transaction +- The `readOnly` flag is the key to determining which datasource to use ### Redis @@ -145,237 +290,4 @@ The application requires the following external services: #### Using Docker Compose -The project includes a `docker-compose.yml` file that sets up all required services. To manage the services: - -```bash -# Start all services -docker-compose up -d - -# Stop all services -docker-compose down - -# View logs for all services -docker-compose logs -f - -# View logs for a specific service -docker-compose logs -f redis -docker-compose logs -f postgres -docker-compose logs -f kafka - -# Restart a specific service -docker-compose restart redis -docker-compose restart postgres -docker-compose restart kafka - -# Stop and remove all containers and volumes -docker-compose down -v -``` - -#### Service Details - -- **Redis** - - Port: 6379 - - No authentication required - - Data persistence enabled - -- **PostgreSQL** - - Port: 5432 - - Database: flighttracker - - Username: flighttracker - - Password: flighttracker - - Schema: flighttracker - -- **Kafka** - - Port: 9092 - - Auto topic creation enabled - - Single broker configuration - -#### Manual Service Management - -If you prefer to manage services individually: - -```bash -# Redis -docker run -d --name redis -p 6379:6379 redis:7.4 - -# PostgreSQL -docker run -d --name postgres \ - -e POSTGRES_USER=flighttracker \ - -e POSTGRES_PASSWORD=flighttracker \ - -e POSTGRES_DB=flighttracker \ - -p 5432:5432 \ - postgres:17 - -# Kafka -docker run -d --name kafka \ - -p 9092:9092 \ - -e KAFKA_BROKER_ID=1 \ - -e KAFKA_LISTENERS=PLAINTEXT://:9092 \ - -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \ - -e KAFKA_AUTO_CREATE_TOPICS_ENABLE=true \ - apache/kafka:4 -``` - -### Cloning the Repository - -```bash -git clone git@github.com:luismr/flight-tracker-event-server-java.git -cd flight-tracker-event-server-java -``` - -### Building - -```bash -mvn clean install -``` - -## Contributing - -1. Fork the repository -2. Create your feature branch (`git checkout -b feature/amazing-feature`) -3. Commit your changes (`git commit -m 'Add some amazing feature'`) -4. Push to the branch (`git push origin feature/amazing-feature`) -5. Open a Pull Request - -## GitHub Actions Permissions - -To enable automatic badge updates and coverage reports, ensure the following GitHub Actions permissions are set: - -1. Go to your repository's Settings -2. Navigate to Actions > General -3. Under "Workflow permissions", select: - - "Read and write permissions" - - "Allow GitHub Actions to create and approve pull requests" - -## Read Write Datasource Routing - -![Read Write Deployment](docs/arch_diagram_datasource_read_write.png) - -The application supports read-write splitting for database operations. This feature is disabled by default but can be enabled through configuration. - -### Configuration - -```yaml -spring: - datasource: - writer: - jdbcUrl: jdbc:postgresql://localhost:5432/flighttracker - username: flighttracker - password: flighttracker - driverClassName: org.postgresql.Driver - type: com.zaxxer.hikari.HikariDataSource - reader: - jdbcUrl: jdbc:postgresql://localhost:5433/flighttracker - username: flighttracker - password: flighttracker - driverClassName: org.postgresql.Driver - type: com.zaxxer.hikari.HikariDataSource - -app: - read-write-routing: - enabled: false # Set to true to enable read-write splitting -``` - -### Important Notes - -1. When enabled, you must configure both write and read data sources -2. The routing is based on Spring's `@Transactional` annotation: - - Read operations: Use `@Transactional(readOnly = true)` - - Write operations: Use `@Transactional` or `@Transactional(readOnly = false)` - -![Read Write DataSource Routing](docs/arch_diagram_datasource_routing.png) - -3. If read-write splitting is enabled but not properly configured, the application will fail to start -4. For development and testing, it's recommended to keep this feature disabled -5. The routing is handled by: - - `DatasourceConfig`: Configures the data sources and routing - - `RoutingDataSource`: Routes requests to the appropriate data source - - `ReadWriteRoutingAspect`: Sets the context based on transaction type - - `DbContextHolder`: Thread-local holder for the current context - -## Message Payloads - -The application uses two main DTOs for message communication: - -### PingDTO -Used to publish flight position updates to the flight-tracker-event-app via WebSocket. - -```json -{ - "id": "uuid", - "aircraft": { - "icao24": "string", - "callsign": "string", - "origin_country": "string", - "last_contact": "timestamp", - "squawk": "string", - "spi": boolean, - "sensors": [integer] - }, - "vector": { - "velocity": double, - "true_track": double, - "vertical_rate": double - }, - "position": { - "longitude": double, - "latitude": double, - "geo_altitude": double, - "baro_altitude": double, - "on_ground": boolean, - "source": integer, - "time": "timestamp" - }, - "last_update": "timestamp" -} -``` - -### FlightDataDTO -Used to subscribe to flight tracker data from the flight tracker producer via Kafka. - -```json -{ - "icao24": "string", - "callsign": "string", - "origin_country": "string", - "last_contact": long, - "time_position": long, - "longitude": double, - "latitude": double, - "baro_altitude": double, - "on_ground": boolean, - "velocity": double, - "true_track": double, - "vertical_rate": double, - "sensors": [integer], - "geo_altitude": double, - "squawk": "string", - "spi": boolean, - "position_source": integer -} -``` - -## Project Structure - -``` -src/ -├── main/ -│ ├── java/ -│ │ └── dev/luismachadoreis/flighttracker/server/ -│ │ ├── common/ # Common infrastructure and utilities -│ │ ├── flightdata/ # Flight data processing -│ │ └── ping/ # Ping domain and API -│ └── resources/ -│ ├── application.yml # Main configuration -│ └── application-test.yml # Test configuration -└── test/ - └── java/ - └── dev/luismachadoreis/flighttracker/server/ - ├── common/ # Common infrastructure tests - ├── flightdata/ # Flight data tests - └── ping/ # Ping domain and API tests -``` - -## License - -This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details. \ No newline at end of file +The project includes a `docker-compose.yml` \ No newline at end of file diff --git a/docs/adrs/adr-001-websocket-scalability.md b/docs/adrs/adr-001-websocket-scalability.md new file mode 100644 index 0000000..21d5c32 --- /dev/null +++ b/docs/adrs/adr-001-websocket-scalability.md @@ -0,0 +1,38 @@ +# ADR 001 - WebSocket Notification Scalability Strategy + +## Context +The `flight-tracker-event-server` currently sends flight updates directly to clients over WebSocket. Sessions are kept in memory, which limits horizontal scalability, requires sticky sessions in the load balancer, and makes managing thousands of connections inefficient. + +## Decision +Refactor the application so that the `PingEventPublisher` publishes flight events to a Kafka topic. A new dedicated component will consume these events and manage active WebSocket sessions for message delivery. + +Additionally, we will implement feature flags to control the WebSocket delivery mechanism, allowing the system to run in different deployment configurations: +- **Monolithic Mode**: All components run in the same service with in-memory WebSocket sessions +- **Decoupled Mode**: WebSocket delivery runs as a separate component consuming from Kafka + +This decision enables separation of responsibilities and prepares the system for a future migration to a STOMP-based architecture (e.g., RabbitMQ) if scale demands increase. + +## Justification +- **Time-to-market**: quick delivery without frontend changes +- **Decoupling**: separates event generation from delivery logic +- **Reuses existing infrastructure**: Kafka is already in place +- **Low impact**: avoids protocol changes or client modifications for now +- **Deployment Flexibility**: allows gradual transition between deployment models +- **Reduced Complexity**: initial implementation can stay within the same service + +## Alternatives Considered +- **STOMP Broker with RabbitMQ**: powerful but requires client refactor and more setup +- **Redis Streams/PubSub**: simple, fast, but with delivery and clustering limitations +- **Optimizing the current implementation**: fast but not future-proof +- **Immediate Service Split**: would require more upfront work and coordination + +## Consequences +- The system becomes modular and more scalable +- Kafka enables better backpressure and failover handling +- Prepares for a transition to STOMP when scale justifies it +- A new WebSocket delivery component must be monitored closely +- Feature flags add complexity but provide deployment flexibility +- Allows for gradual migration of WebSocket handling to a separate service + +## Links +- [Technical Analysis – WebSocket Scalability](../analysis/technical-analysis-websocket-flight-tracker.md) diff --git a/docs/analysis/technical-analysis-websocket-flight-tracker.md b/docs/analysis/technical-analysis-websocket-flight-tracker.md new file mode 100644 index 0000000..5a20002 --- /dev/null +++ b/docs/analysis/technical-analysis-websocket-flight-tracker.md @@ -0,0 +1,94 @@ +# WebSocket Notification Scalability + +## Context +The **Flight Tracker** project provides users with real-time flight information via **WebSocket** notifications. Currently, the application maintains active WebSocket connections and sends updates directly. As the number of users and simultaneous events increases, the current solution is reaching **scalability limits**, primarily due to in-memory session storage and sticky session dependencies on the load balancer. + +## Objective +This document aims to analyze architectural alternatives to scale WebSocket notification delivery while maintaining low latency, high reliability, and minimal disruption to the existing system. The goal is to find an evolutionary solution with fast time-to-market and a path toward future scalability. + +## Requirements + +### Non-functional Requirements +- Scalability to thousands of simultaneous WebSocket connections +- Low delivery latency (< 100ms) +- High availability and fault tolerance +- Reliable message delivery +- Minimal frontend impact (initially) + +### Technical Requirements +- Integration with existing Kafka infrastructure +- Support for component decoupling +- Compatibility with WebSocket and STOMP +- Easy monitoring and operations + +## Considered Alternatives + +### 1. Kafka + ThreadExecutors +Decouple event dispatching via Kafka and parallelize delivery using thread pools. No frontend changes required. + +**Pros:** scalable, no changes to the client, uses existing Kafka +**Cons:** requires concurrency implementation and session control + +### 2. STOMP Broker (RabbitMQ/ActiveMQ) +Use a STOMP-compatible message broker as an external relay. Frontends subscribe to STOMP topics via WebSocket. + +**Pros:** complete decoupling, mature pub/sub model +**Cons:** requires frontend refactoring and broker setup + +### 3. Redis Streams/PubSub +Use Redis for message publishing/subscribing or streams. Messages are distributed across WebSocket server instances. + +**Pros:** simple, fast, great for low latency +**Cons:** pub/sub doesn't guarantee delivery; streams require additional handling + +### 4. Optimizing the Current Architecture +Local improvements with thread pools, async I/O, or sticky session-based load balancing. + +**Pros:** low cost, fast implementation +**Cons:** doesn't solve horizontal scalability limitations + +## Comparative Analysis + +| Solution | Scalability | Latency | Complexity | Reliability | Frontend Impact | +|---------------------------|-------------|---------|------------|-------------|------------------| +| Kafka + Threads | High | Medium | Medium | High | None | +| STOMP Broker | High | Low | High | High | High | +| Redis Streams/PubSub | Medium | Very Low| Medium | Medium/High | None | +| Local Optimization | Low | Low | Low | Low | None | + +## Recommended Conclusion + +We recommend an **evolutionary approach in two phases**: + +### Phase 1: Refactoring with Kafka + Dedicated WebSocket Component + +Refactor the `PingEventPublisher` to publish events to a Kafka topic. A new (or existing) component will consume the topic and handle active WebSocket session management and message delivery. + +**Benefits:** +- Fast time-to-market +- Immediate scalability using current infrastructure +- No frontend changes +- Improves modularity and observability + +### Phase 2: Evolve to STOMP Broker + +If scalability needs increase significantly, migrate to a **STOMP-based broker architecture** (RabbitMQ or ActiveMQ), enabling: +- Topic-based subscriptions +- Automatic message distribution by the broker +- Event-driven backend/frontend + +This phase requires more effort and frontend changes, so it's reserved for future growth that justifies the investment. + +### Why this phased approach? + +- **Time-to-market**: quick delivery with low risk +- **Low disruption**: avoids major changes to frontend/backend for now +- **Preparation**: creates a foundation for future pub/sub migration + +This shows how **architecture can evolve with minimal impact** while aligning with team capacity and business context. + +## References + +- [ADR 001 – WebSocket Scalability Strategy](../adrs/adr-001-websocket-scalability.md) +- [ByteWise010, *“Scaling WebSockets with STOMP and RabbitMQ”*](https://medium.com/@bytewise010/scaling-websocket-messaging-with-spring-boot-e9877c80f027) +- Internal Kafka and Redis benchmark experiences diff --git a/docs/arch_diagram_datasource_read_write.excalidraw b/docs/diagrams/arch_diagram_datasource_read_write.excalidraw similarity index 56% rename from docs/arch_diagram_datasource_read_write.excalidraw rename to docs/diagrams/arch_diagram_datasource_read_write.excalidraw index be293d2..5a09293 100644 --- a/docs/arch_diagram_datasource_read_write.excalidraw +++ b/docs/diagrams/arch_diagram_datasource_read_write.excalidraw @@ -90,7 +90,6 @@ "height": 466.5454563293774, "seed": 2098251668, "groupIds": [], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744147498163, "link": null, @@ -122,7 +121,6 @@ "UWbCM0cPpsLapKLyh23SG", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744147498163, "link": null, @@ -165,7 +163,6 @@ "UWbCM0cPpsLapKLyh23SG", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744147498163, "link": null, @@ -197,8 +194,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -351,8 +346,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aK", "frameId": null, "roundness": null, @@ -384,8 +377,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aL", "frameId": null, "roundness": null, @@ -417,8 +408,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aM", "frameId": null, "roundness": null, @@ -450,8 +439,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aN", "frameId": null, "roundness": null, @@ -483,8 +470,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aO", "frameId": null, "roundness": null, @@ -516,8 +501,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aP", "frameId": null, "roundness": null, @@ -549,8 +532,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aQ", "frameId": null, "roundness": null, @@ -582,8 +563,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aR", "frameId": null, "roundness": null, @@ -615,8 +594,6 @@ "OpO5mnsKv4dmNTkSgpDYw", "M9I8Z-DMcz57QnBgUx0n6" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "aS", "frameId": null, "roundness": null, @@ -650,8 +627,6 @@ "bcN3KjjfN6RFXKWS8FTUI", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "lastCommittedPoint": null, @@ -770,10 +745,6 @@ "bcN3KjjfN6RFXKWS8FTUI", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "sharp", - "boundElementIds": [ - "bxuMGTzXLn7H-uBCptINx" - ], "index": "aU", "frameId": null, "roundness": null, @@ -853,8 +824,6 @@ "0QjRUGgijGT6qbCsA25hg", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1031,8 +1000,6 @@ "0QjRUGgijGT6qbCsA25hg", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1117,8 +1084,6 @@ "0QjRUGgijGT6qbCsA25hg", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1187,8 +1152,6 @@ "0QjRUGgijGT6qbCsA25hg", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1269,8 +1232,6 @@ "0QjRUGgijGT6qbCsA25hg", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1339,8 +1300,6 @@ "0QjRUGgijGT6qbCsA25hg", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1401,8 +1360,6 @@ "0QjRUGgijGT6qbCsA25hg", "fkat79Hjgyq599a3CySwS" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1469,8 +1426,6 @@ "9chHTM5RjP-nmLah4YJlb", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "lastCommittedPoint": null, @@ -1589,10 +1544,6 @@ "9chHTM5RjP-nmLah4YJlb", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "sharp", - "boundElementIds": [ - "bxuMGTzXLn7H-uBCptINx" - ], "index": "ae", "frameId": null, "roundness": null, @@ -1672,8 +1623,6 @@ "cucNXS6tpUdxAAt1a3ThA", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1850,8 +1799,6 @@ "cucNXS6tpUdxAAt1a3ThA", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -1936,8 +1883,6 @@ "cucNXS6tpUdxAAt1a3ThA", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -2006,8 +1951,6 @@ "cucNXS6tpUdxAAt1a3ThA", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -2088,8 +2031,6 @@ "cucNXS6tpUdxAAt1a3ThA", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -2158,8 +2099,6 @@ "cucNXS6tpUdxAAt1a3ThA", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -2220,8 +2159,6 @@ "cucNXS6tpUdxAAt1a3ThA", "_UGBWBskXEW4Zrv4FmSOr" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -2394,21 +2331,10 @@ "USzy_OXLUfaybD80dKq6S", "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "ap", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "GuS-OHqt5VogkEFHAfQM7", - "type": "arrow" - }, - { - "id": "dg0pBoROQNLSuBQM0bKvI", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744147498407, "link": null, "locked": false @@ -2437,22 +2363,12 @@ "USzy_OXLUfaybD80dKq6S", "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "round", - "boundElementIds": [ - "M76SKaRGut40Zas6bdomF", - "xAEbYQGshLqaxnyUxa96J" - ], "index": "aq", "frameId": null, "roundness": { "type": 2 }, - "boundElements": [ - { - "id": "nL2pwNeS8ysyygFeu1MQz", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744147498407, "link": null, "locked": false @@ -2481,31 +2397,12 @@ "USzy_OXLUfaybD80dKq6S", "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "round", - "boundElementIds": [ - "itEKrHYd1bIWVUJ3nf7vn", - "M76SKaRGut40Zas6bdomF", - "xAEbYQGshLqaxnyUxa96J" - ], "index": "ar", "frameId": null, "roundness": { "type": 2 }, - "boundElements": [ - { - "id": "mrTghihtGIB3A6OzKOodq", - "type": "arrow" - }, - { - "id": "nL2pwNeS8ysyygFeu1MQz", - "type": "arrow" - }, - { - "id": "HiHJiM-TYktR2S4cTUbb1", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744147498407, "link": null, "locked": false @@ -2534,10 +2431,6 @@ "USzy_OXLUfaybD80dKq6S", "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "round", - "boundElementIds": [ - "xAEbYQGshLqaxnyUxa96J" - ], "index": "as", "frameId": null, "roundness": { @@ -2572,21 +2465,12 @@ "USzy_OXLUfaybD80dKq6S", "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "round", - "boundElementIds": [ - "M76SKaRGut40Zas6bdomF" - ], "index": "at", "frameId": null, "roundness": { "type": 2 }, - "boundElements": [ - { - "id": "HiHJiM-TYktR2S4cTUbb1", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744147498407, "link": null, "locked": false @@ -2615,8 +2499,6 @@ "USzy_OXLUfaybD80dKq6S", "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "startBinding": { "elementId": "TpOM1ayaDtuR3K8YV0E-n", "focus": 0.175970997614802, @@ -2668,8 +2550,6 @@ "USzy_OXLUfaybD80dKq6S", "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "startBinding": { "elementId": "TpOM1ayaDtuR3K8YV0E-n", "focus": -0.05221429201344226, @@ -2725,8 +2605,6 @@ "USzy_OXLUfaybD80dKq6S", "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "startBinding": { "elementId": "TpOM1ayaDtuR3K8YV0E-n", "focus": -0.06331396204477087, @@ -2780,8 +2658,6 @@ "groupIds": [ "66NXL-BeoTybK6QQNJviT" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 14.751291676011752, "fontFamily": 1, "text": "Docker\nInterface", @@ -2956,8 +2832,6 @@ "groupIds": [ "uJnxEf7lFPNGtrTGqXRXB" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b01", "frameId": null, "roundness": null, @@ -2988,8 +2862,6 @@ "groupIds": [ "uJnxEf7lFPNGtrTGqXRXB" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "Flight\nTracker\nEvent\nserver", @@ -2999,16 +2871,7 @@ "index": "b02", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "GuS-OHqt5VogkEFHAfQM7", - "type": "arrow" - }, - { - "id": "dg0pBoROQNLSuBQM0bKvI", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744147498407, "link": null, "locked": false, @@ -3217,7 +3080,6 @@ "groupIds": [ "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744147498164, "fontSize": 10.356857140731485, @@ -3260,7 +3122,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744147498164, "index": "b08", @@ -3293,7 +3154,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744147498164, "index": "b09", @@ -3326,7 +3186,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744147498164, "fontSize": 10.356857140731485, @@ -3365,7 +3224,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "round", "seed": 1026447976, "version": 920, "versionNonce": 1996098152, @@ -3447,7 +3305,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "round", "seed": 1715916136, "version": 1072, "versionNonce": 1260158312, @@ -3537,7 +3394,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "round", "seed": 1507385448, "version": 920, "versionNonce": 2021167208, @@ -3623,7 +3479,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "round", "seed": 1471189864, "version": 1029, "versionNonce": 1725580136, @@ -3707,7 +3562,7 @@ "x": 332.529227842414, "y": 466.840593592432, "width": 16.165462935557684, - "height": 2.1175228860028605, + "height": 2.117522886002861, "angle": 0, "strokeColor": "#1555a1", "backgroundColor": "#1555a1", @@ -3721,7 +3576,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "round", "seed": 1176102504, "version": 1236, "versionNonce": 613258856, @@ -3841,7 +3695,7 @@ "x": 319.8910052859328, "y": 469.54636770747015, "width": 13.949236758581534, - "height": 1.851609350843774, + "height": 1.8516093508437739, "angle": 0, "strokeColor": "#1555a1", "backgroundColor": "#1555a1", @@ -3855,7 +3709,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "round", "seed": 1642125672, "version": 1254, "versionNonce": 375294312, @@ -3943,7 +3796,7 @@ "x": 327.62465634295745, "y": 446.1912458293855, "width": 6.064330461769457, - "height": 12.821105200975358, + "height": 12.82110520097536, "angle": 0, "strokeColor": "#fc090f", "backgroundColor": "#fc090f", @@ -3957,7 +3810,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "round", "seed": 1850829928, "version": 1187, "versionNonce": 664345704, @@ -4091,7 +3943,6 @@ "NjcqG0KqTRBmUtxnLEOpA", "6qhbO0AvKzesn9cplZvSK" ], - "strokeSharpness": "round", "seed": 1698144104, "version": 1036, "versionNonce": 2047430504, @@ -4283,17 +4134,10 @@ "ABlj6B0AKCe6SVp7Ng1I-", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b0K8", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "I6LE5sHBj4OXlefyB7HU8", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148592192, "link": null, "locked": false @@ -4321,8 +4165,6 @@ "ABlj6B0AKCe6SVp7Ng1I-", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "Command", @@ -4364,7 +4206,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592192, "fontSize": 10.356857140731485, @@ -4408,7 +4249,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592192, "index": "b0KV", @@ -4442,7 +4282,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592192, "index": "b0Kd", @@ -4476,7 +4315,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592192, "fontSize": 10.356857140731485, @@ -4516,7 +4354,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "round", "seed": 621255016, "version": 1119, "versionNonce": 268761192, @@ -4599,7 +4436,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "round", "seed": 513813608, "version": 1271, "versionNonce": 546941800, @@ -4690,7 +4526,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "round", "seed": 497966952, "version": 1119, "versionNonce": 1109393000, @@ -4777,7 +4612,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "round", "seed": 578695784, "version": 1228, "versionNonce": 627306856, @@ -4876,7 +4710,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "round", "seed": 1138468200, "version": 1435, "versionNonce": 28410984, @@ -5011,7 +4844,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "round", "seed": 1595062376, "version": 1453, "versionNonce": 1154791272, @@ -5114,7 +4946,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "round", "seed": 1206872936, "version": 1386, "versionNonce": 1125747304, @@ -5249,7 +5080,6 @@ "mc7Xw2VrBdnQp4RmfNDuW", "2op3wzDEQ-CkjAVdQrdLZ" ], - "strokeSharpness": "round", "seed": 2025700968, "version": 1235, "versionNonce": 1733033320, @@ -5374,17 +5204,10 @@ "j77nnrfOoqmNAFsVZqAO7", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b0Y8", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "HhqHXrIaQ5eCU08wVfrPp", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148592192, "link": null, "locked": false @@ -5412,8 +5235,6 @@ "j77nnrfOoqmNAFsVZqAO7", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "Request", @@ -5455,7 +5276,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592192, "fontSize": 10.356857140731485, @@ -5499,7 +5319,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "index": "b0YV", @@ -5533,7 +5352,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "index": "b0Yd", @@ -5567,7 +5385,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "fontSize": 10.356857140731485, @@ -5607,7 +5424,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "round", "seed": 1441793560, "version": 1208, "versionNonce": 1860834664, @@ -5690,7 +5506,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "round", "seed": 1798800152, "version": 1360, "versionNonce": 2127767656, @@ -5781,7 +5596,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "round", "seed": 1149722648, "version": 1208, "versionNonce": 1981930344, @@ -5868,7 +5682,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "round", "seed": 30645528, "version": 1317, "versionNonce": 388116072, @@ -5967,7 +5780,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "round", "seed": 613431832, "version": 1524, "versionNonce": 2057314664, @@ -6102,7 +5914,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "round", "seed": 1605449496, "version": 1542, "versionNonce": 1072149608, @@ -6205,7 +6016,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "round", "seed": 1739232280, "version": 1475, "versionNonce": 1019537256, @@ -6340,7 +6150,6 @@ "DTzVbysSTNyhR5md69VhG", "3_bog1VdIbaGMG52W23yN" ], - "strokeSharpness": "round", "seed": 1114657048, "version": 1324, "versionNonce": 763607656, @@ -6465,25 +6274,10 @@ "R0myKRrpdfCCjoDjm0MZo", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b0q8", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "I6LE5sHBj4OXlefyB7HU8", - "type": "arrow" - }, - { - "id": "HhqHXrIaQ5eCU08wVfrPp", - "type": "arrow" - }, - { - "id": "WEQZ-QnBCh75SuiPUa-AL", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148592193, "link": null, "locked": false @@ -6511,8 +6305,6 @@ "R0myKRrpdfCCjoDjm0MZo", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "Mediator", @@ -6554,7 +6346,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "fontSize": 10.356857140731485, @@ -6598,7 +6389,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "sharp", "boundElements": [ { "id": "HhqHXrIaQ5eCU08wVfrPp", @@ -6641,7 +6431,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "index": "b0qd", @@ -6675,7 +6464,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "fontSize": 10.356857140731485, @@ -6715,7 +6503,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "round", "seed": 198458728, "version": 1317, "versionNonce": 491391848, @@ -6798,7 +6585,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "round", "seed": 1278759016, "version": 1469, "versionNonce": 163864168, @@ -6889,7 +6675,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "round", "seed": 748815208, "version": 1317, "versionNonce": 964448616, @@ -6976,7 +6761,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "round", "seed": 1532843624, "version": 1426, "versionNonce": 868082792, @@ -7075,7 +6859,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "round", "seed": 1563838824, "version": 1633, "versionNonce": 911546216, @@ -7210,7 +6993,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "round", "seed": 1031330920, "version": 1651, "versionNonce": 1703799400, @@ -7313,7 +7095,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "round", "seed": 1039208296, "version": 1584, "versionNonce": 2083806568, @@ -7448,7 +7229,6 @@ "oTI54qJqpMGrtwd5MWUd8", "r1kLdVSbT2YI2w2T7srHX" ], - "strokeSharpness": "round", "seed": 116056680, "version": 1433, "versionNonce": 2073325672, @@ -7575,7 +7355,7 @@ "version": 514, "versionNonce": 146694168, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148592449, "link": null, "locked": false, @@ -7681,7 +7461,7 @@ "version": 180, "versionNonce": 210135400, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148592193, "link": null, "locked": false, @@ -7718,7 +7498,7 @@ "version": 198, "versionNonce": 1304755304, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148592193, "link": null, "locked": false, @@ -7755,21 +7535,10 @@ "wWwg19-cEnLazGq0NpP1Q", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b18", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "C6MoR2vMu18uX0-1CHSFC", - "type": "arrow" - }, - { - "id": "jltgCDcCJEblwUATPHkLJ", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148592193, "link": null, "locked": false @@ -7797,8 +7566,6 @@ "wWwg19-cEnLazGq0NpP1Q", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "Command\nHandler", @@ -7840,7 +7607,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "fontSize": 10.356857140731485, @@ -7884,7 +7650,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "index": "b1B", @@ -7918,7 +7683,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "index": "b1C", @@ -7952,7 +7716,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "fontSize": 10.356857140731485, @@ -7992,7 +7755,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "round", "seed": 562843928, "version": 1440, "versionNonce": 1904559976, @@ -8075,7 +7837,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "round", "seed": 856845848, "version": 1592, "versionNonce": 725097064, @@ -8166,7 +7927,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "round", "seed": 1204611864, "version": 1440, "versionNonce": 1830325608, @@ -8253,7 +8013,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "round", "seed": 976209944, "version": 1549, "versionNonce": 544383080, @@ -8352,7 +8111,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "round", "seed": 1982792984, "version": 1756, "versionNonce": 621957992, @@ -8487,7 +8245,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "round", "seed": 1228841496, "version": 1774, "versionNonce": 21210728, @@ -8590,7 +8347,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "round", "seed": 844275480, "version": 1707, "versionNonce": 299014504, @@ -8725,7 +8481,6 @@ "HOb4iCd6G6UWJdm86YyU-", "hK7wvB9wQBEWONHZli83C" ], - "strokeSharpness": "round", "seed": 836697112, "version": 1556, "versionNonce": 973810792, @@ -8850,17 +8605,10 @@ "pMfcLdix2y35tgrqG2bmR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b1M", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "WEQZ-QnBCh75SuiPUa-AL", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148592193, "link": null, "locked": false @@ -8888,8 +8636,6 @@ "pMfcLdix2y35tgrqG2bmR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "Request\nHandler", @@ -8931,7 +8677,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592450, "fontSize": 10.356857140731485, @@ -8975,7 +8720,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "sharp", "boundElements": [ { "id": "SMoMkNrfo6_53j-yv5IBH", @@ -9014,7 +8758,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "index": "b1Q", @@ -9048,7 +8791,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "fontSize": 10.356857140731485, @@ -9088,7 +8830,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "round", "seed": 145947496, "version": 1487, "versionNonce": 777353064, @@ -9171,7 +8912,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "round", "seed": 2056212072, "version": 1639, "versionNonce": 1048726120, @@ -9262,7 +9002,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "round", "seed": 862536040, "version": 1487, "versionNonce": 2006760808, @@ -9349,7 +9088,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "round", "seed": 1116525672, "version": 1596, "versionNonce": 720425064, @@ -9448,7 +9186,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "round", "seed": 1841694568, "version": 1803, "versionNonce": 541754216, @@ -9583,7 +9320,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "round", "seed": 1633737320, "version": 1821, "versionNonce": 1173739112, @@ -9686,7 +9422,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "round", "seed": 1613319528, "version": 1754, "versionNonce": 1623116136, @@ -9821,7 +9556,6 @@ "g1eqz7w-GKXAW85i9wmcR", "HVi3cMXaQVZEIX6Q74tqn" ], - "strokeSharpness": "round", "seed": 1936416872, "version": 1603, "versionNonce": 1005673576, @@ -9948,7 +9682,7 @@ "version": 518, "versionNonce": 1482789912, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148592450, "link": null, "locked": false, @@ -10002,7 +9736,7 @@ "version": 357, "versionNonce": 2009590552, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148592450, "link": null, "locked": false, @@ -10054,7 +9788,7 @@ "version": 146, "versionNonce": 310039912, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148592193, "link": null, "locked": false, @@ -10207,25 +9941,10 @@ "PfxISQ2yT8DMFU3VtlJk7", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b1h", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "SMoMkNrfo6_53j-yv5IBH", - "type": "arrow" - }, - { - "id": "jltgCDcCJEblwUATPHkLJ", - "type": "arrow" - }, - { - "id": "LPqW6wZbAiJlI94eo7buo", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148785557, "link": null, "locked": false @@ -10253,8 +9972,6 @@ "PfxISQ2yT8DMFU3VtlJk7", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "DataSource\nRouting", @@ -10264,16 +9981,7 @@ "index": "b1i", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "SMoMkNrfo6_53j-yv5IBH", - "type": "arrow" - }, - { - "id": "NyThiH-pWpC0uS-sdsFJM", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148619892, "link": null, "locked": false, @@ -10305,7 +10013,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "sharp", "boundElements": [ { "id": "LqU1NjpOpK4HaQVvT4fl6", @@ -10354,7 +10061,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "index": "b1k", @@ -10388,7 +10094,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "index": "b1l", @@ -10422,7 +10127,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148592193, "fontSize": 10.356857140731485, @@ -10462,7 +10166,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "round", "seed": 481701656, "version": 1442, "versionNonce": 961214824, @@ -10545,7 +10248,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "round", "seed": 693144600, "version": 1594, "versionNonce": 326601832, @@ -10636,7 +10338,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "round", "seed": 1284983064, "version": 1442, "versionNonce": 1083817832, @@ -10723,7 +10424,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "round", "seed": 838755864, "version": 1551, "versionNonce": 285053544, @@ -10822,7 +10522,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "round", "seed": 1987699480, "version": 1758, "versionNonce": 1802437992, @@ -10957,7 +10656,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "round", "seed": 2021507096, "version": 1776, "versionNonce": 2100959336, @@ -11060,7 +10758,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "round", "seed": 670956824, "version": 1709, "versionNonce": 1781189480, @@ -11195,7 +10892,6 @@ "Zlyz7iQyBMaFRyQUjghk1", "edeLAV-UoPbR7Vgq-gXPI" ], - "strokeSharpness": "round", "seed": 1450088984, "version": 1558, "versionNonce": 2089623144, @@ -11322,7 +11018,7 @@ "version": 512, "versionNonce": 594150680, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148592450, "link": null, "locked": false, @@ -11372,7 +11068,7 @@ "version": 345, "versionNonce": 1712051736, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148592450, "link": null, "locked": false, @@ -11503,17 +11199,10 @@ "WDJYhSe7Ygjm2faqhasAf", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b1z", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "LqU1NjpOpK4HaQVvT4fl6", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148616101, "link": null, "locked": false @@ -11541,8 +11230,6 @@ "WDJYhSe7Ygjm2faqhasAf", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "Write\nDataSource", @@ -11552,12 +11239,7 @@ "index": "b20", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "wpwPxj-PoZ42JUTlbq8d5", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148693289, "link": null, "locked": false, @@ -11589,7 +11271,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148598674, "fontSize": 10.356857140731485, @@ -11633,7 +11314,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148598674, "index": "b22", @@ -11667,7 +11347,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148598674, "index": "b23", @@ -11701,7 +11380,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148598674, "fontSize": 10.356857140731485, @@ -11741,7 +11419,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "round", "seed": 1215326568, "version": 1569, "versionNonce": 524639000, @@ -11824,7 +11501,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "round", "seed": 2087648360, "version": 1721, "versionNonce": 1763325976, @@ -11915,7 +11591,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "round", "seed": 2032349032, "version": 1569, "versionNonce": 1045132568, @@ -12002,7 +11677,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "round", "seed": 1457062504, "version": 1678, "versionNonce": 877466136, @@ -12101,7 +11775,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "round", "seed": 1146910056, "version": 1885, "versionNonce": 303238936, @@ -12236,7 +11909,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "round", "seed": 922323048, "version": 1903, "versionNonce": 538012696, @@ -12339,7 +12011,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "round", "seed": 444349288, "version": 1836, "versionNonce": 2017208600, @@ -12474,7 +12145,6 @@ "aKJI4-gwAlAmCdU8kV7pF", "phDl7laYstEQzWlxpXkdY" ], - "strokeSharpness": "round", "seed": 19959400, "version": 1685, "versionNonce": 1443317272, @@ -12599,21 +12269,10 @@ "5dFCb5dZ9-0oXGJrx3lm0", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b2D", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "NyThiH-pWpC0uS-sdsFJM", - "type": "arrow" - }, - { - "id": "TudOKocD8sdgh8xwLfHQ7", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148701343, "link": null, "locked": false @@ -12641,8 +12300,6 @@ "5dFCb5dZ9-0oXGJrx3lm0", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 15.020044102147551, "fontFamily": 1, "text": "Read\nDataSource", @@ -12684,7 +12341,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148655879, "fontSize": 10.356857140731485, @@ -12728,7 +12384,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148655879, "index": "b2G", @@ -12762,7 +12417,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148655879, "index": "b2H", @@ -12796,7 +12450,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148655879, "fontSize": 10.356857140731485, @@ -12836,7 +12489,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "round", "seed": 1849241960, "version": 1687, "versionNonce": 986174568, @@ -12919,7 +12571,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "round", "seed": 2111751272, "version": 1839, "versionNonce": 648087400, @@ -13010,7 +12661,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "round", "seed": 1230632808, "version": 1687, "versionNonce": 1188813416, @@ -13097,7 +12747,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "round", "seed": 83282536, "version": 1796, "versionNonce": 1581534568, @@ -13196,7 +12845,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "round", "seed": 2072067432, "version": 2003, "versionNonce": 1982226536, @@ -13331,7 +12979,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "round", "seed": 1044729960, "version": 2021, "versionNonce": 239997800, @@ -13434,7 +13081,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "round", "seed": 1427047272, "version": 1954, "versionNonce": 1292330600, @@ -13569,7 +13215,6 @@ "DzwY6jPqhLIfXXc7l8Sdg", "OVyLg4hLA0stqSEzttT6_" ], - "strokeSharpness": "round", "seed": 1848268392, "version": 1803, "versionNonce": 790518120, @@ -13696,7 +13341,7 @@ "version": 65, "versionNonce": 1513107480, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148616101, "link": null, "locked": false, @@ -13750,7 +13395,7 @@ "version": 163, "versionNonce": 555032424, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148655964, "link": null, "locked": false, @@ -13841,8 +13486,6 @@ "QpkABwPd2D1onn9uUJ42p", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "lastCommittedPoint": null, @@ -13961,10 +13604,6 @@ "QpkABwPd2D1onn9uUJ42p", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "sharp", - "boundElementIds": [ - "bxuMGTzXLn7H-uBCptINx" - ], "index": "b2W", "frameId": null, "roundness": null, @@ -14040,8 +13679,6 @@ "_THpTBDTY791_FYlpZVH2", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -14218,8 +13855,6 @@ "_THpTBDTY791_FYlpZVH2", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -14304,8 +13939,6 @@ "_THpTBDTY791_FYlpZVH2", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -14374,8 +14007,6 @@ "_THpTBDTY791_FYlpZVH2", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -14456,8 +14087,6 @@ "_THpTBDTY791_FYlpZVH2", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -14526,8 +14155,6 @@ "_THpTBDTY791_FYlpZVH2", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -14588,8 +14215,6 @@ "_THpTBDTY791_FYlpZVH2", "k3iZ0phCXLyPbybkrQI3C" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -14656,8 +14281,6 @@ "xWTF7ik1NSRjAp5Oa3kWX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "lastCommittedPoint": null, @@ -14776,10 +14399,6 @@ "xWTF7ik1NSRjAp5Oa3kWX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "sharp", - "boundElementIds": [ - "bxuMGTzXLn7H-uBCptINx" - ], "index": "b2g", "frameId": null, "roundness": null, @@ -14855,8 +14474,6 @@ "tsUsbTrLb-IoUAQj4B7uX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -15033,8 +14650,6 @@ "tsUsbTrLb-IoUAQj4B7uX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -15119,8 +14734,6 @@ "tsUsbTrLb-IoUAQj4B7uX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -15189,8 +14802,6 @@ "tsUsbTrLb-IoUAQj4B7uX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -15271,8 +14882,6 @@ "tsUsbTrLb-IoUAQj4B7uX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -15341,8 +14950,6 @@ "tsUsbTrLb-IoUAQj4B7uX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -15403,8 +15010,6 @@ "tsUsbTrLb-IoUAQj4B7uX", "CXZNHTYvOPwwtxKvKsV9t" ], - "strokeSharpness": "round", - "boundElementIds": [], "startBinding": null, "endBinding": null, "points": [ @@ -15579,7 +15184,7 @@ "version": 59, "versionNonce": 216308248, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148693289, "link": null, "locked": false, @@ -15629,7 +15234,7 @@ "version": 127, "versionNonce": 279291240, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148710692, "link": null, "locked": false, @@ -15677,17 +15282,10 @@ "7BEGrdXj7AZCwZYBeq4do", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "index": "b2t", "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "LPqW6wZbAiJlI94eo7buo", - "type": "arrow" - } - ], + "boundElements": [], "updated": 1744148785557, "link": null, "locked": false @@ -15715,8 +15313,6 @@ "7BEGrdXj7AZCwZYBeq4do", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "sharp", - "boundElementIds": [], "fontSize": 14.866947660514159, "fontFamily": 1, "text": "DataSource\nRouting\nAspect", @@ -15758,7 +15354,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148760164, "fontSize": 10.356857140731485, @@ -15802,7 +15397,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148760164, "index": "b2w", @@ -15836,7 +15430,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148760164, "index": "b2x", @@ -15870,7 +15463,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "sharp", "boundElements": [], "updated": 1744148760164, "fontSize": 10.356857140731485, @@ -15910,7 +15502,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "round", "seed": 1892261400, "version": 1469, "versionNonce": 519902744, @@ -15993,7 +15584,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "round", "seed": 656284440, "version": 1621, "versionNonce": 807572248, @@ -16084,7 +15674,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "round", "seed": 2010839064, "version": 1469, "versionNonce": 1502638104, @@ -16171,7 +15760,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "round", "seed": 921974040, "version": 1578, "versionNonce": 859483416, @@ -16270,7 +15858,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "round", "seed": 433967640, "version": 1785, "versionNonce": 915753496, @@ -16405,7 +15992,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "round", "seed": 126603032, "version": 1803, "versionNonce": 244598552, @@ -16508,7 +16094,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "round", "seed": 1752312856, "version": 1736, "versionNonce": 1739301912, @@ -16643,7 +16228,6 @@ "Oq1yg8KvAcL_Rzb1jWEBJ", "R96URd6YvXf5aCmtEJeS8" ], - "strokeSharpness": "round", "seed": 1988421912, "version": 1585, "versionNonce": 1070555416, @@ -16768,7 +16352,7 @@ "version": 64, "versionNonce": 30033768, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1744148794667, "link": null, "locked": false, @@ -16796,6 +16380,12649 @@ "startArrowhead": null, "endArrowhead": "arrow", "elbowed": false + }, + { + "id": "XCHrvW7XR6U9w3o4nbRxm", + "type": "rectangle", + "x": -91.7229842513974, + "y": 1426.4170856177716, + "width": 1451.9999999999998, + "height": 913, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b38", + "roundness": { + "type": 3 + }, + "seed": 347561388, + "version": 467, + "versionNonce": 1957205676, + "isDeleted": false, + "boundElements": [], + "updated": 1746715779421, + "link": null, + "locked": false + }, + { + "id": "yrDvQn3-tXS65BO02tg9B", + "type": "text", + "x": -63.72298425139752, + "y": 1435.4170856177716, + "width": 360.239990234375, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b39", + "roundness": null, + "seed": 1876346924, + "version": 399, + "versionNonce": 1377000492, + "isDeleted": false, + "boundElements": [], + "updated": 1746716332792, + "link": null, + "locked": false, + "text": "Flight Tracker websockets decoupled", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Flight Tracker websockets decoupled", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1038, + "versionNonce": 762795052, + "isDeleted": false, + "id": "gURMxYCFl7J-SvWk44x34", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 315.9251334098882, + "y": 1531.1443574530829, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "width": 1019.7037646774287, + "height": 766.5454563293772, + "seed": 950330028, + "groupIds": [], + "boundElements": [], + "updated": 1746715440543, + "link": null, + "locked": false, + "index": "b3A", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2426, + "versionNonce": 1364872340, + "isDeleted": false, + "id": "eoDH4V0kgt8mT2fUjX3Lh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 367.46856663667927, + "y": 1541.390331642752, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 68.00552368164062, + "height": 25.759668500051333, + "seed": 634105132, + "groupIds": [ + "JkiHfzaZJwueuTx5YxacN", + "8aq2bfPhz8PdS1gkApcHw" + ], + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false, + "fontSize": 20.607734800041065, + "fontFamily": 1, + "text": "Docker", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker", + "index": "b3B", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 769, + "versionNonce": 319527444, + "isDeleted": false, + "id": "faichZ6cL0qTPjEkxiw1E", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 317.2731333277843, + "y": 1532.3622459711744, + "strokeColor": "#2b8a3e", + "backgroundColor": "#40c05788", + "width": 40.82839621753342, + "height": 43.81583984320666, + "seed": 146089900, + "groupIds": [ + "vKbXg2c8_T-6opKnRyew-", + "JkiHfzaZJwueuTx5YxacN", + "8aq2bfPhz8PdS1gkApcHw" + ], + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false, + "index": "b3C", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 3317, + "versionNonce": 2083993492, + "isDeleted": false, + "id": "9ucRyTigUM9_aCEMna3EF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 347.4492006743767, + "y": 1549.356233582063, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 32.43929919603974, + "height": 19.006285432040904, + "seed": 1972064812, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.675548080974804, + -1.8707485319302044 + ], + [ + -2.1045920984214797, + -3.4686795696205874 + ], + [ + -4.040297176599267, + -4.040297176599263 + ], + [ + -4.891227932442524, + -1.8772441865549636 + ], + [ + -4.319610325463848, + 0.23384356649127594 + ], + [ + -3.156888147632222, + 1.9486963874272965 + ], + [ + -4.949688824065338, + 2.6892010146496688 + ], + [ + -8.88605552666848, + 2.8061227978953074 + ], + [ + -12.978317940265796, + 2.767148870146762 + ], + [ + -23.115869591304243, + 2.7714793065632666 + ], + [ + -26.60620134300736, + 2.9317054539739544 + ], + [ + -26.917992764995727, + 5.161880208474086 + ], + [ + -25.73145318687332, + 8.84275116250342 + ], + [ + -22.91666951614502, + 12.432682951786159 + ], + [ + -19.79875529626134, + 14.264457555967816 + ], + [ + -15.940336449155286, + 14.965988255441642 + ], + [ + -10.483986564358853, + 14.459327194710534 + ], + [ + -5.456349884796433, + 12.432682951786159 + ], + [ + -2.338435664912755, + 9.704508009387935 + ], + [ + -0.601930661894202, + 6.1232370929382185 + ], + [ + 0.2338435664912771, + 3.8584188471060474 + ], + [ + 2.169548644669062, + 3.5379665522846673 + ], + [ + 4.421375581251708, + 2.6199140319855876 + ], + [ + 5.521306431044013, + 0.970017757297142 + ], + [ + 3.8324362286070133, + -0.38973927748546094 + ], + [ + 1.5373049278593183, + -0.5802784798116826 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3D", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 539, + "versionNonce": 1225991444, + "isDeleted": false, + "id": "xpKPyNU1vJcLrN0Qa2u-1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 323.29456668720195, + "y": 1548.6321514904776, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 3.0740685511665604, + "height": 2.9279163221095144, + "seed": 1798843564, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3E", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 567, + "versionNonce": 1058366100, + "isDeleted": false, + "id": "lC0hiyAe9xISMuMmmLBXw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 326.84606585328834, + "y": 1548.5883058217605, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 2.9522750269523534, + "height": 2.9522750269523534, + "seed": 2070263596, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3F", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 605, + "versionNonce": 83095572, + "isDeleted": false, + "id": "YOj10g4QsRko4UFddjkPy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 330.3732063145319, + "y": 1548.6370232314462, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 2.9035576172666726, + "height": 2.9035576172666726, + "seed": 1920856492, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3G", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 665, + "versionNonce": 2057620884, + "isDeleted": false, + "id": "QuBzxReaBPYW_LcJ3nfOb", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 333.8029119564037, + "y": 1548.6077927856347, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 2.9035576172666726, + "height": 2.9035576172666726, + "seed": 2141903916, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3H", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 692, + "versionNonce": 291371796, + "isDeleted": false, + "id": "5Isw3CHusyTO76uyYo-77", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 337.276463266993, + "y": 1548.6370232314462, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 2.9035576172666726, + "height": 2.9035576172666726, + "seed": 1557558956, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3I", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 743, + "versionNonce": 596998292, + "isDeleted": false, + "id": "FgVKBgoKNzsmQX-bbqupv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 333.75906628768666, + "y": 1545.1780871437627, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 2.9522750269523534, + "height": 2.9522750269523534, + "seed": 1990902060, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3J", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 792, + "versionNonce": 1291929108, + "isDeleted": false, + "id": "pIXxcmjbEBwOgjoKlcada", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 330.45602591099737, + "y": 1545.3485980776627, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 2.8061227978953083, + "height": 2.8061227978953083, + "seed": 345095084, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3K", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 833, + "versionNonce": 1117217684, + "isDeleted": false, + "id": "5alustoxFedtXRRa3R_hk", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 326.9045267449112, + "y": 1545.3242393728196, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 2.8061227978953083, + "height": 2.8061227978953083, + "seed": 11888172, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3L", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 932, + "versionNonce": 713937172, + "isDeleted": false, + "id": "T6RUhCFTRSj-qUi1frd3q", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 333.710348878001, + "y": 1541.7483815018907, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 2.9522750269523534, + "height": 2.9522750269523534, + "seed": 805290156, + "groupIds": [ + "Q2qpn-t3KFxgAVBeIfOsu", + "8aq2bfPhz8PdS1gkApcHw" + ], + "index": "b3M", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746714567084, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 6458, + "versionNonce": 853311892, + "isDeleted": false, + "id": "n-UlyQSp-DUo-WNVFcBfw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1115.5990808873635, + "y": 1772.878909868985, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 75.01121630306868, + "height": 96.81388324216653, + "seed": 1780140844, + "groupIds": [ + "Vozy10_MBL4LAscHVTT51", + "v4IMneap4q82mnGEkNEAD", + "rbX81SV9LT9OPHnGaYjKN", + "0c-TyP7paedXcI9aEYXbd" + ], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.24734846976242794, + 73.1714082159101 + ], + [ + 0.011575327725072006, + 81.50165529728328 + ], + [ + 3.8632435379119165, + 85.10105205208878 + ], + [ + 17.276485894102954, + 88.14730719194147 + ], + [ + 39.948665011120255, + 89.0958655364321 + ], + [ + 61.61043288740646, + 87.58135319133916 + ], + [ + 73.11948965218787, + 83.95942431004657 + ], + [ + 74.74268637210398, + 80.90610026776591 + ], + [ + 74.9706584753909, + 74.19947908967055 + ], + [ + 74.79172688269483, + 6.138672737165569 + ], + [ + 74.38835763792527, + -0.2918194398554754 + ], + [ + 69.57188081608908, + -3.885863818744892 + ], + [ + 59.42940850758881, + -5.967344146345569 + ], + [ + 36.31608449133351, + -7.7180177057344235 + ], + [ + 17.785060590062127, + -6.674087120295436 + ], + [ + 3.210536142559118, + -3.1332019499277424 + ], + [ + -0.04055782767777212, + -0.04396604849106378 + ], + [ + 0, + 0 + ] + ], + "index": "b3N", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 7178, + "versionNonce": 1350512404, + "isDeleted": false, + "id": "2ei4o0d5K3Vv5OSy2S9iC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1115.8650134780473, + "y": 1764.1259417129568, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 74.53008207714048, + "height": 15.073148387271289, + "seed": 1903199660, + "groupIds": [ + "Vozy10_MBL4LAscHVTT51", + "v4IMneap4q82mnGEkNEAD", + "rbX81SV9LT9OPHnGaYjKN", + "0c-TyP7paedXcI9aEYXbd" + ], + "index": "b3O", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "id": "ql96A4jqqYK9X0qhTkwyF", + "type": "text", + "x": 1072.2770157486025, + "y": 1864.4170856177716, + "width": 166.48001098632812, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "0c-TyP7paedXcI9aEYXbd" + ], + "frameId": null, + "index": "b3P", + "roundness": null, + "seed": 724234284, + "version": 556, + "versionNonce": 1349528724, + "isDeleted": false, + "boundElements": [ + { + "id": "wpR455o7MptyhB2pOYdvD", + "type": "arrow" + } + ], + "updated": 1746715449365, + "link": null, + "locked": false, + "text": "postgres_primary\n5432", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "postgres_primary\n5432", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "line", + "version": 4372, + "versionNonce": 1465194388, + "isDeleted": false, + "id": "wnklrCNzMqMFxaI3PGkuP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1156.728514665101, + "y": 1804.224483509276, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 38.83511032012047, + "height": 38.970657377573175, + "seed": 1194592940, + "groupIds": [ + "OBaOAi3tyKfTDFv_ALeeJ", + "0c-TyP7paedXcI9aEYXbd" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -3.951909465061145, + -1.1653066371334362 + ], + [ + -6.941174316838229, + -0.5066550596232305 + ], + [ + -9.753109897747098, + 0.2026620238492907 + ], + [ + -18.45491054677613, + -1.3046367785298136 + ], + [ + -24.496772132783114, + 2.6346063100407955 + ], + [ + -24.332109238405536, + 12.058390419032886 + ], + [ + -20.759286326883863, + 21.83773781093911 + ], + [ + -16.04648953121003, + 26.99385778378335 + ], + [ + -11.323740582579186, + 21.521983139852445 + ], + [ + -8.736180813789133, + 21.55998226932424 + ], + [ + -7.845915494736847, + 22.372439847077203 + ], + [ + -8.942461802349907, + 23.61012577844252 + ], + [ + -10.424427851747916, + 24.433440250330282 + ], + [ + -12.831039384958315, + 25.78874253482239 + ], + [ + -9.288676093092517, + 26.261620590470685 + ], + [ + -6.755400794976439, + 26.075847068608898 + ], + [ + -5.201658612131816, + 26.51494812028232 + ], + [ + -4.187104871489321, + 33.283402113546835 + ], + [ + -1.8619573441152784, + 37.45069219870349 + ], + [ + 3.600929567757278, + 36.13701546835983 + ], + [ + 5.281931216327825, + 32.36064817170625 + ], + [ + 5.44654189094972, + 26.68805526565355 + ], + [ + 6.1685253509128, + 24.585436768217196 + ], + [ + 10.33576321631387, + 24.52210488576429 + ], + [ + 13.29969531510979, + 22.254823493950347 + ], + [ + 9.993771051068228, + 21.925497705195237 + ], + [ + 7.916485306612959, + 20.430865279306726 + ], + [ + 10.741087264012453, + 15.250317294659162 + ], + [ + 13.679686609827176, + 8.651135143066625 + ], + [ + 14.338338187337355, + 1.570630684832008 + ], + [ + 9.575780626879004, + -1.1146411311711069 + ], + [ + 4.053240476985829, + -1.5199651788696857 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3Q", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2048, + "versionNonce": 1165296916, + "isDeleted": false, + "id": "6MAPiOYmWnpCJ_52eQlGn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1147.916503014777, + "y": 1804.490311551534, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.31758722881466, + "height": 25.417195491098582, + "seed": 1748358444, + "groupIds": [ + "OBaOAi3tyKfTDFv_ALeeJ", + "0c-TyP7paedXcI9aEYXbd" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -2.6388284355376497, + 2.723270945474847 + ], + [ + -3.947687339564326, + 7.663157776801329 + ], + [ + -3.3777003974881983, + 13.341916570078345 + ], + [ + -4.137682986923011, + 16.65628508511359 + ], + [ + -3.314368515035271, + 19.274002893166976 + ], + [ + -1.3299695315109548, + 20.625083052162214 + ], + [ + 1.2455270215737815, + 21.72283568134594 + ], + [ + 3.4621429074254046, + 22.44059701581213 + ], + [ + 4.1799042418916486, + 24.256110979462118 + ], + [ + 3.0610409852236784, + 25.417195491098582 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3R", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1487, + "versionNonce": 339427988, + "isDeleted": false, + "id": "WwLZAuB6Pw2MVJ--HGSm1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1156.5801780946656, + "y": 1804.2277644311512, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 7.726489659254246, + "height": 20.329534267382048, + "seed": 1268404140, + "groupIds": [ + "OBaOAi3tyKfTDFv_ALeeJ", + "0c-TyP7paedXcI9aEYXbd" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.153284003398724, + 0.44332317717032405 + ], + [ + 5.446541890949724, + 3.039930357739374 + ], + [ + 6.966507069819409, + 8.423140366236177 + ], + [ + 6.5865157751019785, + 13.553022844921388 + ], + [ + 7.726489659254246, + 17.47959955700139 + ], + [ + 6.839843304913594, + 20.329534267382048 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3S", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2186, + "versionNonce": 2052968468, + "isDeleted": false, + "id": "7Xqi3m_tfAO_qXtjpkSwm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1162.480832086123, + "y": 1829.255105241697, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.7758676797048, + "height": 17.454266804020236, + "seed": 1904966188, + "groupIds": [ + "OBaOAi3tyKfTDFv_ALeeJ", + "0c-TyP7paedXcI9aEYXbd" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.13088589040266718, + -2.317946897776323 + ], + [ + 1.074530938950941, + -3.3059242640416224 + ], + [ + 2.2715035173108085, + -3.8125793236648184 + ], + [ + 0.8402029738751906, + -4.8132230664207665 + ], + [ + -0.33777003974883135, + -6.903175187366524 + ], + [ + -1.5917413123163227, + -9.778442650728383 + ], + [ + -3.5043641623939914, + -14.43966919926203 + ], + [ + -2.681049690506256, + -17.289603909642814 + ], + [ + 0.8908684798375112, + -17.454266804020236 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3T", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1646, + "versionNonce": 1741860244, + "isDeleted": false, + "id": "qVXp3N0x9ddeC0anBZiNl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1144.096264739981, + "y": 1814.2323934276992, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.143192597931644, + "height": 13.04636778529813, + "seed": 1156797612, + "groupIds": [ + "OBaOAi3tyKfTDFv_ALeeJ", + "0c-TyP7paedXcI9aEYXbd" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.0688414934615182, + -1.0555313742150523 + ], + [ + 4.6865593015148646, + -1.3299695315109727 + ], + [ + 6.143192597931644, + 0.8233144718877504 + ], + [ + 6.143192597931644, + 5.066550596232291 + ], + [ + 5.256546243591003, + 8.233144718877458 + ], + [ + 4.74989118396777, + 11.716398253787158 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3U", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1725, + "versionNonce": 1573903124, + "isDeleted": false, + "id": "yhC_aJ3-26fZdl5814Y2H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.251548691252406, + "x": 1161.0326213064063, + "y": 1812.6232464525492, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.0031769178615733, + "height": 1.2497236924063615, + "seed": 1132191532, + "groupIds": [ + "OBaOAi3tyKfTDFv_ALeeJ", + "0c-TyP7paedXcI9aEYXbd" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.0156953386340373, + 0.5311325692727029 + ], + [ + 0.05642751881300172, + 1.2497236924063615 + ], + [ + 0.9874815792275361, + 0.21870164617111282 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3V", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1851, + "versionNonce": 1187731604, + "isDeleted": false, + "id": "i-VDPl68ogxVsiutGm3S4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.25834385002361504, + "x": 1147.908205736784, + "y": 1813.7160955088843, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.128044882242656, + "height": 1.175157907952121, + "seed": 630135212, + "groupIds": [ + "OBaOAi3tyKfTDFv_ALeeJ", + "0c-TyP7paedXcI9aEYXbd" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.0408529465243743, + 0.5044965425931287 + ], + [ + -0.12466659825222719, + 1.175157907952121 + ], + [ + 0.7625351472179395, + 0.981362322379312 + ], + [ + 1.0871919357182815, + 0.03830757935799324 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3W", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 6549, + "versionNonce": 1316693524, + "isDeleted": false, + "id": "UJqUW6SGXmZGZtbqBE-qi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1117.3590753941994, + "y": 1934.6567528363703, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 75.01121630306868, + "height": 96.81388324216653, + "seed": 106365996, + "groupIds": [ + "k2cjnNMgMAscnvyff0s2Z", + "1Ya240TQ8eZMFDzeQI3Fe", + "Q9o_NkgEzCSJhV4WrCNsu", + "_n_d5xDXKB9JeIAH_irnP" + ], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.24734846976242794, + 73.1714082159101 + ], + [ + 0.011575327725072006, + 81.50165529728328 + ], + [ + 3.8632435379119165, + 85.10105205208878 + ], + [ + 17.276485894102954, + 88.14730719194147 + ], + [ + 39.948665011120255, + 89.0958655364321 + ], + [ + 61.61043288740646, + 87.58135319133916 + ], + [ + 73.11948965218787, + 83.95942431004657 + ], + [ + 74.74268637210398, + 80.90610026776591 + ], + [ + 74.9706584753909, + 74.19947908967055 + ], + [ + 74.79172688269483, + 6.138672737165569 + ], + [ + 74.38835763792527, + -0.2918194398554754 + ], + [ + 69.57188081608908, + -3.885863818744892 + ], + [ + 59.42940850758881, + -5.967344146345569 + ], + [ + 36.31608449133351, + -7.7180177057344235 + ], + [ + 17.785060590062127, + -6.674087120295436 + ], + [ + 3.210536142559118, + -3.1332019499277424 + ], + [ + -0.04055782767777212, + -0.04396604849106378 + ], + [ + 0, + 0 + ] + ], + "index": "b3X", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 7269, + "versionNonce": 970277780, + "isDeleted": false, + "id": "rgqGIOVrYDgbdzfxTafDR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1117.6250079848833, + "y": 1925.9037846803421, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 74.53008207714048, + "height": 15.073148387271289, + "seed": 196976300, + "groupIds": [ + "k2cjnNMgMAscnvyff0s2Z", + "1Ya240TQ8eZMFDzeQI3Fe", + "Q9o_NkgEzCSJhV4WrCNsu", + "_n_d5xDXKB9JeIAH_irnP" + ], + "index": "b3Y", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "id": "lbaSbnkibnkY0-Jqcaitq", + "type": "text", + "x": 1074.0370102554384, + "y": 2026.194928585157, + "width": 158.90000915527344, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_n_d5xDXKB9JeIAH_irnP" + ], + "frameId": null, + "index": "b3Z", + "roundness": null, + "seed": 242018604, + "version": 658, + "versionNonce": 1057992980, + "isDeleted": false, + "boundElements": [ + { + "id": "wpR455o7MptyhB2pOYdvD", + "type": "arrow" + } + ], + "updated": 1746715449365, + "link": null, + "locked": false, + "text": "postgres_replica\n5433", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "postgres_replica\n5433", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "line", + "version": 4463, + "versionNonce": 909999124, + "isDeleted": false, + "id": "874qm2k90yI0q-yGu5gQq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1158.488509171937, + "y": 1966.0023264766614, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 38.83511032012047, + "height": 38.970657377573175, + "seed": 1104077740, + "groupIds": [ + "R0_0NfflbrpBLMpZJGZyB", + "_n_d5xDXKB9JeIAH_irnP" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -3.951909465061145, + -1.1653066371334362 + ], + [ + -6.941174316838229, + -0.5066550596232305 + ], + [ + -9.753109897747098, + 0.2026620238492907 + ], + [ + -18.45491054677613, + -1.3046367785298136 + ], + [ + -24.496772132783114, + 2.6346063100407955 + ], + [ + -24.332109238405536, + 12.058390419032886 + ], + [ + -20.759286326883863, + 21.83773781093911 + ], + [ + -16.04648953121003, + 26.99385778378335 + ], + [ + -11.323740582579186, + 21.521983139852445 + ], + [ + -8.736180813789133, + 21.55998226932424 + ], + [ + -7.845915494736847, + 22.372439847077203 + ], + [ + -8.942461802349907, + 23.61012577844252 + ], + [ + -10.424427851747916, + 24.433440250330282 + ], + [ + -12.831039384958315, + 25.78874253482239 + ], + [ + -9.288676093092517, + 26.261620590470685 + ], + [ + -6.755400794976439, + 26.075847068608898 + ], + [ + -5.201658612131816, + 26.51494812028232 + ], + [ + -4.187104871489321, + 33.283402113546835 + ], + [ + -1.8619573441152784, + 37.45069219870349 + ], + [ + 3.600929567757278, + 36.13701546835983 + ], + [ + 5.281931216327825, + 32.36064817170625 + ], + [ + 5.44654189094972, + 26.68805526565355 + ], + [ + 6.1685253509128, + 24.585436768217196 + ], + [ + 10.33576321631387, + 24.52210488576429 + ], + [ + 13.29969531510979, + 22.254823493950347 + ], + [ + 9.993771051068228, + 21.925497705195237 + ], + [ + 7.916485306612959, + 20.430865279306726 + ], + [ + 10.741087264012453, + 15.250317294659162 + ], + [ + 13.679686609827176, + 8.651135143066625 + ], + [ + 14.338338187337355, + 1.570630684832008 + ], + [ + 9.575780626879004, + -1.1146411311711069 + ], + [ + 4.053240476985829, + -1.5199651788696857 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3a", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2139, + "versionNonce": 1658640788, + "isDeleted": false, + "id": "_pAqJbwJT7o0q3DZNbwXm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1149.6764975216129, + "y": 1966.2681545189193, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.31758722881466, + "height": 25.417195491098582, + "seed": 1544392236, + "groupIds": [ + "R0_0NfflbrpBLMpZJGZyB", + "_n_d5xDXKB9JeIAH_irnP" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -2.6388284355376497, + 2.723270945474847 + ], + [ + -3.947687339564326, + 7.663157776801329 + ], + [ + -3.3777003974881983, + 13.341916570078345 + ], + [ + -4.137682986923011, + 16.65628508511359 + ], + [ + -3.314368515035271, + 19.274002893166976 + ], + [ + -1.3299695315109548, + 20.625083052162214 + ], + [ + 1.2455270215737815, + 21.72283568134594 + ], + [ + 3.4621429074254046, + 22.44059701581213 + ], + [ + 4.1799042418916486, + 24.256110979462118 + ], + [ + 3.0610409852236784, + 25.417195491098582 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3b", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1578, + "versionNonce": 1320453908, + "isDeleted": false, + "id": "XVeRI4YtEYBDDuhV6iuQ5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1158.3401726015015, + "y": 1966.005607398537, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 7.726489659254246, + "height": 20.329534267382048, + "seed": 1041426604, + "groupIds": [ + "R0_0NfflbrpBLMpZJGZyB", + "_n_d5xDXKB9JeIAH_irnP" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.153284003398724, + 0.44332317717032405 + ], + [ + 5.446541890949724, + 3.039930357739374 + ], + [ + 6.966507069819409, + 8.423140366236177 + ], + [ + 6.5865157751019785, + 13.553022844921388 + ], + [ + 7.726489659254246, + 17.47959955700139 + ], + [ + 6.839843304913594, + 20.329534267382048 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3c", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2277, + "versionNonce": 238716052, + "isDeleted": false, + "id": "-g7Bi45QrK-UxnKLBaRZE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1164.240826592959, + "y": 1991.0329482090829, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.7758676797048, + "height": 17.454266804020236, + "seed": 461959980, + "groupIds": [ + "R0_0NfflbrpBLMpZJGZyB", + "_n_d5xDXKB9JeIAH_irnP" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.13088589040266718, + -2.317946897776323 + ], + [ + 1.074530938950941, + -3.3059242640416224 + ], + [ + 2.2715035173108085, + -3.8125793236648184 + ], + [ + 0.8402029738751906, + -4.8132230664207665 + ], + [ + -0.33777003974883135, + -6.903175187366524 + ], + [ + -1.5917413123163227, + -9.778442650728383 + ], + [ + -3.5043641623939914, + -14.43966919926203 + ], + [ + -2.681049690506256, + -17.289603909642814 + ], + [ + 0.8908684798375112, + -17.454266804020236 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3d", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1737, + "versionNonce": 925159956, + "isDeleted": false, + "id": "bKxxhvLCj3oyq4AReMXed", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1145.856259246817, + "y": 1976.0102363950846, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.143192597931644, + "height": 13.04636778529813, + "seed": 584691116, + "groupIds": [ + "R0_0NfflbrpBLMpZJGZyB", + "_n_d5xDXKB9JeIAH_irnP" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.0688414934615182, + -1.0555313742150523 + ], + [ + 4.6865593015148646, + -1.3299695315109727 + ], + [ + 6.143192597931644, + 0.8233144718877504 + ], + [ + 6.143192597931644, + 5.066550596232291 + ], + [ + 5.256546243591003, + 8.233144718877458 + ], + [ + 4.74989118396777, + 11.716398253787158 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3e", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1816, + "versionNonce": 946433940, + "isDeleted": false, + "id": "-PaGQ1FFqUDQRcXxl4KGS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.251548691252406, + "x": 1162.7926158132423, + "y": 1974.401089419935, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.0031769178615733, + "height": 1.2497236924063615, + "seed": 623843372, + "groupIds": [ + "R0_0NfflbrpBLMpZJGZyB", + "_n_d5xDXKB9JeIAH_irnP" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.0156953386340373, + 0.5311325692727029 + ], + [ + 0.05642751881300172, + 1.2497236924063615 + ], + [ + 0.9874815792275361, + 0.21870164617111282 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3f", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1942, + "versionNonce": 842947860, + "isDeleted": false, + "id": "OMpvpQ-w1Gk7DNngnP5ka", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.25834385002361504, + "x": 1149.66820024362, + "y": 1975.4939384762702, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.128044882242656, + "height": 1.175157907952121, + "seed": 1047737004, + "groupIds": [ + "R0_0NfflbrpBLMpZJGZyB", + "_n_d5xDXKB9JeIAH_irnP" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.0408529465243743, + 0.5044965425931287 + ], + [ + -0.12466659825222719, + 1.175157907952121 + ], + [ + 0.7625351472179395, + 0.981362322379312 + ], + [ + 1.0871919357182815, + 0.03830757935799324 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b3g", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "id": "wpR455o7MptyhB2pOYdvD", + "type": "arrow", + "x": 1243.7570267349306, + "y": 1889.2170856177718, + "width": 40.82000732421875, + "height": 161.77784296738537, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3h", + "roundness": null, + "seed": 2102394156, + "version": 1608, + "versionNonce": 705354772, + "isDeleted": false, + "boundElements": [], + "updated": 1746715450048, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 35, + 0 + ], + [ + 35, + 161.77784296738537 + ], + [ + -5.82000732421875, + 161.77784296738537 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ql96A4jqqYK9X0qhTkwyF", + "focus": -0.00799999999999906, + "gap": 5, + "fixedPoint": [ + 1.030033635692219, + 0.4959999999999991 + ] + }, + "endBinding": { + "elementId": "lbaSbnkibnkY0-Jqcaitq", + "focus": 1.0629326584256407, + "gap": 5, + "fixedPoint": [ + 1.0314663292128203, + 0.4959999999999991 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "MHRRh4wWc7ymUmIXh-Uar", + "type": "text", + "x": 1230.2770157486025, + "y": 1940.4170856177716, + "width": 98.75999450683594, + "height": 50, + "angle": 1.5707963267948966, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3i", + "roundness": null, + "seed": 187660204, + "version": 541, + "versionNonce": 380708884, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false, + "text": "replication\nslot", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "replication\nslot", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 2098, + "versionNonce": 1790922132, + "isDeleted": false, + "id": "v4FFMQmjn2SKQPYP0coSr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 283.9300632621197, + "y": 1712.5209450714024, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 69.69390497296568, + "height": 201.7922810927382, + "seed": 1413194284, + "groupIds": [ + "uwSNtb8AYxlEm36HltWkQ", + "A86abESgVzLKyZaXj-mQI" + ], + "index": "b3j", + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "i-LhadKQBUUyTSngQgZUh", + "type": "arrow" + }, + { + "id": "ckI9IOdrA2mYrkhxY_N-s", + "type": "arrow" + }, + { + "id": "zoN0oyFMFPAOiMpl4JcMV", + "type": "arrow" + }, + { + "id": "5iqCtDl4dM4a7Y0cHcWm6", + "type": "arrow" + }, + { + "id": "gN2KnbKlsDMfoI0KndM0e", + "type": "arrow" + }, + { + "id": "wyn7jFw606T45JIJW2DoI", + "type": "arrow" + } + ], + "updated": 1746716107210, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1891, + "versionNonce": 416474516, + "isDeleted": false, + "id": "y5BZBhNBuC30fauitNRW-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 327.0618088547376, + "y": 1782.4053960838683, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 18.463181339628875, + "height": 17.895083452255665, + "seed": 794721452, + "groupIds": [ + "hL7_0gXiG2GIEpjDPLHgl", + "uwSNtb8AYxlEm36HltWkQ", + "A86abESgVzLKyZaXj-mQI" + ], + "index": "b3k", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "sUYd3FzN9ow5CIZllqj7H", + "type": "arrow" + } + ], + "updated": 1746715054659, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2206, + "versionNonce": 1864208532, + "isDeleted": false, + "id": "9zsz86LagSoKwZ-sNrmEh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 290.9980499411523, + "y": 1779.5134609087174, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 18.463181339628875, + "height": 17.895083452255665, + "seed": 104990508, + "groupIds": [ + "hL7_0gXiG2GIEpjDPLHgl", + "uwSNtb8AYxlEm36HltWkQ", + "A86abESgVzLKyZaXj-mQI" + ], + "index": "b3l", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "iLBDF12PGDFaK8ZR6lENU", + "type": "arrow" + }, + { + "id": "sUYd3FzN9ow5CIZllqj7H", + "type": "arrow" + }, + { + "id": "7bGDpeW7yD0RKrA6R_aba", + "type": "arrow" + } + ], + "updated": 1746715054659, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2198, + "versionNonce": 253142676, + "isDeleted": false, + "id": "jfdjz673zT24j83xUKwne", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 327.5535643515086, + "y": 1833.0050376806453, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 18.463181339628875, + "height": 17.895083452255665, + "seed": 2102411692, + "groupIds": [ + "hL7_0gXiG2GIEpjDPLHgl", + "uwSNtb8AYxlEm36HltWkQ", + "A86abESgVzLKyZaXj-mQI" + ], + "index": "b3m", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "iLBDF12PGDFaK8ZR6lENU", + "type": "arrow" + } + ], + "updated": 1746715054659, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1915, + "versionNonce": 1713705364, + "isDeleted": false, + "id": "qPO8wjZbhO_iVC9niLTDI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 326.8718468866732, + "y": 1730.8204554767046, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 18.463181339628875, + "height": 17.895083452255665, + "seed": 464727084, + "groupIds": [ + "hL7_0gXiG2GIEpjDPLHgl", + "uwSNtb8AYxlEm36HltWkQ", + "A86abESgVzLKyZaXj-mQI" + ], + "index": "b3n", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "7bGDpeW7yD0RKrA6R_aba", + "type": "arrow" + } + ], + "updated": 1746715054659, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 6139, + "versionNonce": 1747757100, + "isDeleted": false, + "id": "iLBDF12PGDFaK8ZR6lENU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 304.06718218536514, + "y": 1797.7285488287657, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 26.68308902555831, + "height": 37.58197677119037, + "seed": 1934935724, + "groupIds": [ + "hL7_0gXiG2GIEpjDPLHgl", + "uwSNtb8AYxlEm36HltWkQ", + "A86abESgVzLKyZaXj-mQI" + ], + "startBinding": { + "elementId": "9zsz86LagSoKwZ-sNrmEh", + "focus": 0.17597099761478358, + "gap": 1.0429565441459059 + }, + "endBinding": { + "elementId": "jfdjz673zT24j83xUKwne", + "focus": -0.08463930453719035, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 26.68308902555831, + 37.58197677119037 + ] + ], + "index": "b3o", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715054973, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 4843, + "versionNonce": 707366188, + "isDeleted": false, + "id": "sUYd3FzN9ow5CIZllqj7H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 310.0524740709985, + "y": 1788.7364831197651, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 16.61130383973117, + "height": 1.3207328297184937, + "seed": 1222578476, + "groupIds": [ + "hL7_0gXiG2GIEpjDPLHgl", + "uwSNtb8AYxlEm36HltWkQ", + "A86abESgVzLKyZaXj-mQI" + ], + "startBinding": { + "elementId": "9zsz86LagSoKwZ-sNrmEh", + "focus": -0.05221429201338877, + "gap": 1 + }, + "endBinding": { + "elementId": "y5BZBhNBuC30fauitNRW-", + "focus": 0.05475263558969679, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 16.61130383973117, + 1.3207328297184937 + ] + ], + "index": "b3p", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715054973, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 5922, + "versionNonce": 603009580, + "isDeleted": false, + "id": "7bGDpeW7yD0RKrA6R_aba", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 309.685174377768, + "y": 1784.6607668896145, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 21.254589605555225, + "height": 39.788991050614186, + "seed": 1002179500, + "groupIds": [ + "hL7_0gXiG2GIEpjDPLHgl", + "uwSNtb8AYxlEm36HltWkQ", + "A86abESgVzLKyZaXj-mQI" + ], + "startBinding": { + "elementId": "9zsz86LagSoKwZ-sNrmEh", + "focus": 0.5299693881236326, + "gap": 1 + }, + "endBinding": { + "elementId": "qPO8wjZbhO_iVC9niLTDI", + "focus": 0.17395521408956444, + "gap": 1.826470067733724 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 21.254589605555225, + -39.788991050614186 + ] + ], + "index": "b3q", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715054974, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1001, + "versionNonce": 157521172, + "isDeleted": false, + "id": "4STTqicswO1qNsIBK1ekg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 287.2830086380069, + "y": 1868.9133483967162, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 62.988014221191406, + "height": 40, + "seed": 1846916652, + "groupIds": [ + "A86abESgVzLKyZaXj-mQI" + ], + "fontSize": 14.751291676011752, + "fontFamily": 1, + "text": "Load\nBalancer", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "index": "b3r", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715054659, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Load\nBalancer", + "autoResize": true, + "lineHeight": 1.355813473102399 + }, + { + "type": "rectangle", + "version": 1963, + "versionNonce": 1341851028, + "isDeleted": false, + "id": "5HoarNzUSMGc0zULUQ_qc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 590.7903168057057, + "y": 1792.3162176937558, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 96.9733978857935, + "height": 95.10852484952814, + "seed": 1223873964, + "groupIds": [ + "KmwT26q5zrjUxn-3KROhX", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "index": "b4i", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1449, + "versionNonce": 1328362260, + "isDeleted": false, + "id": "dW2nlcdbeP2Bd_a_nphad", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 590.8345375686707, + "y": 1801.5934205806207, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 96.8849563598633, + "height": 81.10823815159674, + "seed": 2112045100, + "groupIds": [ + "KmwT26q5zrjUxn-3KROhX", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "fontSize": 15.020044102147551, + "fontFamily": 1, + "text": "Flight\nTracker\nEvent\nserver", + "baseline": 34.167465732141956, + "textAlign": "center", + "verticalAlign": "top", + "index": "b4j", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Flight Tracker\nEvent\nserver", + "autoResize": false, + "lineHeight": 1.3499999999999994 + }, + { + "type": "text", + "version": 2193, + "versionNonce": 1388163220, + "isDeleted": false, + "id": "D3LcNchWDP_oUSrBAF4R2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 571.621507134026, + "y": 1918.0243574508245, + "strokeColor": "#000", + "backgroundColor": "#edf2f9", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 1249485996, + "groupIds": [ + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b4k", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3962, + "versionNonce": 1516404244, + "isDeleted": false, + "id": "gtn6gvsIGgG2b770Pk4ac", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 562.0480978449821, + "y": 1853.6415201365821, + "strokeColor": "#000000", + "backgroundColor": "#f5f3f6", + "width": 45.4967677285642, + "height": 62.002957510392, + "seed": 1673015084, + "groupIds": [ + "7rNjBzvYfYTO_tWOwvrJu", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [ + { + "id": "7bGDpeW7yD0RKrA6R_aba", + "type": "arrow" + } + ], + "updated": 1746715449365, + "index": "b4l", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3494, + "versionNonce": 2131860372, + "isDeleted": false, + "id": "H03LUKrRNfvulANd8e9hx", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 576.2930139368442, + "y": 1861.1120342293907, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 36.33800423361336, + "height": 15.535285711097229, + "seed": 432105900, + "groupIds": [ + "7rNjBzvYfYTO_tWOwvrJu", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "index": "b4m", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2626, + "versionNonce": 1258359060, + "isDeleted": false, + "id": "C9AVJR7ONESWP-JAJB6Th", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 583.1711176526771, + "y": 1862.552007959478, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 1606374444, + "groupIds": [ + "7rNjBzvYfYTO_tWOwvrJu", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b4n", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "clo9PFdhEQqcdwqW6hVUh", + "type": "line", + "x": 581.1726739877405, + "y": 1899.5679591638418, + "width": 10.732121509799065, + "height": 1.855231307857764, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NLpNda7rxnobntoqQwNy9", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 865857196, + "version": 1448, + "versionNonce": 296142484, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -3.1027124304035283, + 1.158400933496767 + ], + [ + -2.5409800493418864, + 1.7436993649641308 + ], + [ + 2.523248712862932, + 1.855231307857764 + ], + [ + 7.629409079395535, + 1.2540592647352646 + ], + [ + 2.758731473950813, + 1.6474448197593061 + ], + [ + 0.251746754213678, + 1.67808773914117 + ], + [ + -1.8756922853687323, + 1.4365442496601786 + ], + [ + -1.708217021469664, + 0.8176097119286738 + ], + [ + 0.028685071526469038, + 0.004487321506281649 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b4o", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "0olheUWfWJduTonbUR8g8", + "type": "line", + "x": 590.1586904259414, + "y": 1899.988553713321, + "width": 3.7498900820437275, + "height": 4.366998249786954, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NLpNda7rxnobntoqQwNy9", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1174485292, + "version": 1600, + "versionNonce": 1203295252, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 1.5081079438317329, + 0.1887704295289138 + ], + [ + 2.06036345373866, + 0.8776225522415755 + ], + [ + 1.9057939502637078, + 1.7647536845430505 + ], + [ + 0.8813722286229448, + 3.065871560964751 + ], + [ + -0.6218228019711837, + 4.188464524903099 + ], + [ + 1.1092763253443232, + 3.4769458067441943 + ], + [ + 2.38954626545785, + 2.5326034693260793 + ], + [ + 3.128067280072544, + 1.1920589133976744 + ], + [ + 2.8635520657806603, + 0.1980884414295272 + ], + [ + 1.9154545442309043, + -0.1785337248838554 + ], + [ + -0.009845654376131894, + -0.007317597003873432 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b4p", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "6xtXlbDPGRZspF6gbpTgY", + "type": "line", + "x": 580.3470453061526, + "y": 1902.6013180815735, + "width": 8.44853641256907, + "height": 1.7076383142809495, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NLpNda7rxnobntoqQwNy9", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 576271276, + "version": 1448, + "versionNonce": 1529688468, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.7725082399582961, + 0.7907598227909706 + ], + [ + 0.07010705159035445, + 1.5248757387426026 + ], + [ + 3.93829700005503, + 1.7076383142809495 + ], + [ + 7.676028172610773, + 1.125431658425576 + ], + [ + 7.322322653605653, + 0.6169770832868927 + ], + [ + 5.694013567961052, + 0.7319359483962525 + ], + [ + 3.8203650513518825, + 0.8720101547202224 + ], + [ + 1.621195275400573, + 0.9635742997982352 + ], + [ + 0.1856199963765434, + 0.7757710312160854 + ], + [ + 0.0026921883301963627, + 0.09663127532309924 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b4q", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "fPxma51_2Jhii7L1BizGj", + "type": "line", + "x": 580.9472446805781, + "y": 1905.0259850673801, + "width": 7.549854426409026, + "height": 1.9521824261070226, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NLpNda7rxnobntoqQwNy9", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1456332332, + "version": 1557, + "versionNonce": 188342036, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.6960210104594012, + 0.6258720999670092 + ], + [ + -0.3105974592204193, + 1.3030301673141964 + ], + [ + 0.8364906732524691, + 1.7932507844211096 + ], + [ + 3.5826681746569156, + 1.9521824261070226 + ], + [ + 6.709816761985028, + 1.404333116413167 + ], + [ + 6.853833415949625, + 0.8850778430021672 + ], + [ + 6.1741660175810935, + 0.7478269094646878 + ], + [ + 5.355989715514292, + 0.7894632983782015 + ], + [ + 4.211679692275754, + 0.909404474378602 + ], + [ + 2.5947408062810045, + 1.0554391680407116 + ], + [ + 1.0464196762045963, + 0.9224754673106429 + ], + [ + 0.10286715017462596, + 0.588289415249492 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b4r", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "yPvTN4rcx-SMH0LgsiSQy", + "type": "line", + "x": 591.8062435910165, + "y": 1907.2576792102036, + "width": 16.165462935557684, + "height": 2.117522886002861, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NLpNda7rxnobntoqQwNy9", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 474560684, + "version": 1764, + "versionNonce": 1079303316, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.5654256423438722, + 0.6284629456922926 + ], + [ + -1.0622996217725522, + 0.9791325927506236 + ], + [ + -2.2492374289725587, + 1.4089596266369213 + ], + [ + -3.933989939346747, + 1.6580641556835356 + ], + [ + -7.17836107714371, + 1.8721746426378705 + ], + [ + -10.416927046159945, + 1.8812073530747082 + ], + [ + -13.532366156421766, + 1.7587039716505128 + ], + [ + -15.440920591119012, + 1.5623702994558222 + ], + [ + -16.165462935557684, + 0.9826905994226706 + ], + [ + -15.549291085359739, + 0.3937072076395451 + ], + [ + -14.372760723063031, + -0.05280830955380671 + ], + [ + -13.020445003265408, + -0.2363155329281526 + ], + [ + -14.35079140880061, + 0.13188418167787264 + ], + [ + -15.082855137003046, + 0.6739040884898041 + ], + [ + -14.702366530002676, + 0.9636139556001095 + ], + [ + -13.53886089553588, + 1.0999439932929937 + ], + [ + -11.20706008697059, + 1.2734138925819605 + ], + [ + -9.166755859702002, + 1.3545915222077083 + ], + [ + -5.014090609980159, + 1.3028957782077304 + ], + [ + -2.087042996028866, + 0.9830981729423222 + ], + [ + -0.7663505751605163, + 0.5521079021998312 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b4s", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "kYaRzoWdr3g0Wz1d9yj3P", + "type": "line", + "x": 579.1680210345353, + "y": 1909.963453325242, + "width": 13.949236758581534, + "height": 1.8516093508437739, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NLpNda7rxnobntoqQwNy9", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 2121614124, + "version": 1782, + "versionNonce": 1681140244, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 1.2222490957076624, + 0.3516340182818606 + ], + [ + 2.963896666333292, + 0.5063854047172415 + ], + [ + 6.730951101307093, + 0.55831181644186 + ], + [ + 9.5878564140663, + 0.4299700219224214 + ], + [ + 11.293452454548508, + 0.2472608719546376 + ], + [ + 12.47542667720846, + -0.1627298916074685 + ], + [ + 13.933343594412948, + -1.293297534401914 + ], + [ + 12.69348291645361, + -0.6106371263420582 + ], + [ + 10.95335107870128, + -0.1915829846553404 + ], + [ + 8.628463598270319, + 0.027194724833249664 + ], + [ + 6.064892252296664, + 0.0924810595841015 + ], + [ + 4.074439774238859, + 0.09915257880789187 + ], + [ + 2.2085858258066393, + 0.04420382746655044 + ], + [ + -0.01589316416858611, + 0.01996390393466801 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b4t", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "gc0yTdsPmaYRCg1FA-8jH", + "type": "line", + "x": 586.9016720915599, + "y": 1886.608331447157, + "width": 6.064330461769457, + "height": 12.82110520097536, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NLpNda7rxnobntoqQwNy9", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 62651820, + "version": 1715, + "versionNonce": 969787284, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 0.5341328084305129, + 1.2525301558970174 + ], + [ + 0.5720966294664349, + 2.2555790526292516 + ], + [ + 0.14666257719255568, + 3.4557696085201544 + ], + [ + -0.8254355169178571, + 4.570440224475339 + ], + [ + -1.8821106241183998, + 5.605425811126976 + ], + [ + -3.494762277305824, + 7.305862191159634 + ], + [ + -4.139948955906879, + 8.563996482952684 + ], + [ + -4.18264062977143, + 9.76204562554004 + ], + [ + -3.6931778791011425, + 10.981768866975575 + ], + [ + -2.8651294854569316, + 12.328498626453033 + ], + [ + -2.6923095006993925, + 12.783976354879819 + ], + [ + -3.925587315540412, + 11.419050090072364 + ], + [ + -4.839375959130988, + 10.400563520118592 + ], + [ + -5.353870333211795, + 9.37297043587449 + ], + [ + -5.492233832303023, + 8.384599142827106 + ], + [ + -5.2381723280166765, + 7.603743356565097 + ], + [ + -4.316813832460008, + 6.464591892226022 + ], + [ + -2.50008020400324, + 5.018148720376424 + ], + [ + -1.0368560186420932, + 3.8376880274896337 + ], + [ + -0.2095214294324007, + 2.649602405134108 + ], + [ + 0.10860402285206669, + 1.4088571824819827 + ], + [ + -0.08990631224784021, + -0.037128846095540714 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b4u", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "s1dKbGit5ixcWnfGNkDqr", + "type": "line", + "x": 589.6058224542047, + "y": 1891.560772706856, + "width": 4.894017247973431, + "height": 8.713691627441886, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NLpNda7rxnobntoqQwNy9", + "VPjWgK0L2ufXbY33TPL_b", + "-U0ERJ70OmhOaC0jrm6yV", + "b-vEr1tJWJa9GkkEDa2XC", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1430743084, + "version": 1564, + "versionNonce": 894940436, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -1.6085142311873455, + 0.572583514589994 + ], + [ + -2.395584962849884, + 0.9599039350207045 + ], + [ + -3.4672059011731937, + 1.5891038176987031 + ], + [ + -4.263851305898754, + 2.3786552400811507 + ], + [ + -4.894017247973431, + 3.392102218541166 + ], + [ + -4.8766391943330305, + 4.941398220414746 + ], + [ + -4.363506336118044, + 6.011676369223136 + ], + [ + -3.7603371827489545, + 6.710743165579823 + ], + [ + -3.6003943181141507, + 7.423897685567786 + ], + [ + -4.4233513474121455, + 8.702455816898532 + ], + [ + -4.383497266484815, + 8.713691627441886 + ], + [ + -3.2545626788898185, + 7.907779983668232 + ], + [ + -2.486443014343759, + 6.7700572297481925 + ], + [ + -2.6894564860614434, + 5.707422736759479 + ], + [ + -3.655421149475244, + 4.668464960615742 + ], + [ + -3.726034914090105, + 3.3733020637819893 + ], + [ + -3.157425792092305, + 2.4998455738418963 + ], + [ + -1.7765931445155962, + 1.2724247006341083 + ], + [ + -0.016212613684044374, + 0.010915259477846866 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b4v", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "8DGNpmjera-6zBEeUch3F", + "type": "rectangle", + "x": 547.2770157486025, + "y": 1778.4170856177716, + "width": 364.00000000000006, + "height": 267.99999999999994, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "frameId": null, + "index": "b4w", + "roundness": { + "type": 3 + }, + "seed": 93433132, + "version": 517, + "versionNonce": 1476237204, + "isDeleted": false, + "boundElements": [ + { + "id": "X96A3SClZLTzH-OgSRPAS", + "type": "arrow" + }, + { + "id": "ZnQSttLh1IC_uTE7yb1hf", + "type": "arrow" + }, + { + "id": "5mZ0q-JQ8oz6bC-mL6Y-Z", + "type": "arrow" + }, + { + "id": "-PBmWr9JLfNrFwQH7HLn3", + "type": "arrow" + }, + { + "id": "gN2KnbKlsDMfoI0KndM0e", + "type": "arrow" + } + ], + "updated": 1746716046835, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2043, + "versionNonce": 786074388, + "isDeleted": false, + "id": "bTN0tTzmys4o0dD66f9bY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 652.1614262860676, + "y": 1909.0899800262796, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 96.9733978857935, + "height": 95.10852484952814, + "seed": 316254868, + "groupIds": [ + "jH6i1iT8Jy78JhRURQ7b0", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "index": "b4x", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1529, + "versionNonce": 50333844, + "isDeleted": false, + "id": "voOxWFblEtvr9dZRvL9rK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 652.2056470490327, + "y": 1918.3671829131445, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 96.8849563598633, + "height": 81.10823815159674, + "seed": 1760507924, + "groupIds": [ + "jH6i1iT8Jy78JhRURQ7b0", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "fontSize": 15.020044102147551, + "fontFamily": 1, + "text": "Flight\nTracker\nEvent\nserver", + "baseline": 34.167465732141956, + "textAlign": "center", + "verticalAlign": "top", + "index": "b4y", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Flight Tracker\nEvent\nserver", + "autoResize": false, + "lineHeight": 1.3499999999999994 + }, + { + "type": "text", + "version": 2273, + "versionNonce": 10081812, + "isDeleted": false, + "id": "oLuq6V3Px8feLU-zKO2b8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 632.992616614388, + "y": 2034.7981197833487, + "strokeColor": "#000", + "backgroundColor": "#edf2f9", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 1341592980, + "groupIds": [ + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b4z", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 4042, + "versionNonce": 345895828, + "isDeleted": false, + "id": "istIwvjbReWRnQukeqmg8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 623.4192073253439, + "y": 1970.4152824691064, + "strokeColor": "#000000", + "backgroundColor": "#f5f3f6", + "width": 45.4967677285642, + "height": 62.002957510392, + "seed": 354894612, + "groupIds": [ + "8CV9uUiIwlXpHXC_ed1rf", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "index": "b50", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3574, + "versionNonce": 490889492, + "isDeleted": false, + "id": "1iO1hxkdGJeU_dWPsmZeZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 637.6641234172059, + "y": 1977.8857965619154, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 36.33800423361336, + "height": 15.535285711097229, + "seed": 1861599380, + "groupIds": [ + "8CV9uUiIwlXpHXC_ed1rf", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "index": "b51", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2706, + "versionNonce": 1107107476, + "isDeleted": false, + "id": "5GtzFmtv0TPy1KOuLd6Wz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 644.542227133039, + "y": 1979.3257702920027, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 1427672596, + "groupIds": [ + "8CV9uUiIwlXpHXC_ed1rf", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b52", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0s9d13QI7b_c9wVy7kZJv", + "type": "line", + "x": 642.5437834681022, + "y": 2016.3417214963665, + "width": 10.732121509799065, + "height": 1.855231307857764, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "OK8yyX9QbyD_hD_K1nCbE", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1485155220, + "version": 1528, + "versionNonce": 1266953236, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -3.1027124304035283, + 1.158400933496767 + ], + [ + -2.5409800493418864, + 1.7436993649641308 + ], + [ + 2.523248712862932, + 1.855231307857764 + ], + [ + 7.629409079395535, + 1.2540592647352646 + ], + [ + 2.758731473950813, + 1.6474448197593061 + ], + [ + 0.251746754213678, + 1.67808773914117 + ], + [ + -1.8756922853687323, + 1.4365442496601786 + ], + [ + -1.708217021469664, + 0.8176097119286738 + ], + [ + 0.028685071526469038, + 0.004487321506281649 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b53", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "-kyjYBH1drVTOChkZMem4", + "type": "line", + "x": 651.5297999063032, + "y": 2016.7623160458452, + "width": 3.7498900820437275, + "height": 4.366998249786954, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "OK8yyX9QbyD_hD_K1nCbE", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 2071140628, + "version": 1680, + "versionNonce": 2077067668, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 1.5081079438317329, + 0.1887704295289138 + ], + [ + 2.06036345373866, + 0.8776225522415755 + ], + [ + 1.9057939502637078, + 1.7647536845430505 + ], + [ + 0.8813722286229448, + 3.065871560964751 + ], + [ + -0.6218228019711837, + 4.188464524903099 + ], + [ + 1.1092763253443232, + 3.4769458067441943 + ], + [ + 2.38954626545785, + 2.5326034693260793 + ], + [ + 3.128067280072544, + 1.1920589133976744 + ], + [ + 2.8635520657806603, + 0.1980884414295272 + ], + [ + 1.9154545442309043, + -0.1785337248838554 + ], + [ + -0.009845654376131894, + -0.007317597003873432 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b54", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "jaZO9n-qLTL56in8Yftze", + "type": "line", + "x": 641.7181547865146, + "y": 2019.3750804140982, + "width": 8.44853641256907, + "height": 1.7076383142809495, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "OK8yyX9QbyD_hD_K1nCbE", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 156685972, + "version": 1528, + "versionNonce": 1712273172, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.7725082399582961, + 0.7907598227909706 + ], + [ + 0.07010705159035445, + 1.5248757387426026 + ], + [ + 3.93829700005503, + 1.7076383142809495 + ], + [ + 7.676028172610773, + 1.125431658425576 + ], + [ + 7.322322653605653, + 0.6169770832868927 + ], + [ + 5.694013567961052, + 0.7319359483962525 + ], + [ + 3.8203650513518825, + 0.8720101547202224 + ], + [ + 1.621195275400573, + 0.9635742997982352 + ], + [ + 0.1856199963765434, + 0.7757710312160854 + ], + [ + 0.0026921883301963627, + 0.09663127532309924 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b55", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "tnnG0VE4JPqNZgGlxz6N2", + "type": "line", + "x": 642.3183541609399, + "y": 2021.7997473999048, + "width": 7.549854426409026, + "height": 1.9521824261070226, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "OK8yyX9QbyD_hD_K1nCbE", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1860625428, + "version": 1637, + "versionNonce": 1186935956, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.6960210104594012, + 0.6258720999670092 + ], + [ + -0.3105974592204193, + 1.3030301673141964 + ], + [ + 0.8364906732524691, + 1.7932507844211096 + ], + [ + 3.5826681746569156, + 1.9521824261070226 + ], + [ + 6.709816761985028, + 1.404333116413167 + ], + [ + 6.853833415949625, + 0.8850778430021672 + ], + [ + 6.1741660175810935, + 0.7478269094646878 + ], + [ + 5.355989715514292, + 0.7894632983782015 + ], + [ + 4.211679692275754, + 0.909404474378602 + ], + [ + 2.5947408062810045, + 1.0554391680407116 + ], + [ + 1.0464196762045963, + 0.9224754673106429 + ], + [ + 0.10286715017462596, + 0.588289415249492 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b56", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "JjsR99nxjbWx4teso7YKz", + "type": "line", + "x": 653.1773530713783, + "y": 2024.0314415427283, + "width": 16.165462935557684, + "height": 2.117522886002861, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "OK8yyX9QbyD_hD_K1nCbE", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 303645076, + "version": 1844, + "versionNonce": 1536393748, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.5654256423438722, + 0.6284629456922926 + ], + [ + -1.0622996217725522, + 0.9791325927506236 + ], + [ + -2.2492374289725587, + 1.4089596266369213 + ], + [ + -3.933989939346747, + 1.6580641556835356 + ], + [ + -7.17836107714371, + 1.8721746426378705 + ], + [ + -10.416927046159945, + 1.8812073530747082 + ], + [ + -13.532366156421766, + 1.7587039716505128 + ], + [ + -15.440920591119012, + 1.5623702994558222 + ], + [ + -16.165462935557684, + 0.9826905994226706 + ], + [ + -15.549291085359739, + 0.3937072076395451 + ], + [ + -14.372760723063031, + -0.05280830955380671 + ], + [ + -13.020445003265408, + -0.2363155329281526 + ], + [ + -14.35079140880061, + 0.13188418167787264 + ], + [ + -15.082855137003046, + 0.6739040884898041 + ], + [ + -14.702366530002676, + 0.9636139556001095 + ], + [ + -13.53886089553588, + 1.0999439932929937 + ], + [ + -11.20706008697059, + 1.2734138925819605 + ], + [ + -9.166755859702002, + 1.3545915222077083 + ], + [ + -5.014090609980159, + 1.3028957782077304 + ], + [ + -2.087042996028866, + 0.9830981729423222 + ], + [ + -0.7663505751605163, + 0.5521079021998312 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b57", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "y72M36o3RECT1r0h0LM-e", + "type": "line", + "x": 640.5391305148971, + "y": 2026.7372156577658, + "width": 13.949236758581534, + "height": 1.8516093508437739, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "OK8yyX9QbyD_hD_K1nCbE", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 706998036, + "version": 1862, + "versionNonce": 998383508, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 1.2222490957076624, + 0.3516340182818606 + ], + [ + 2.963896666333292, + 0.5063854047172415 + ], + [ + 6.730951101307093, + 0.55831181644186 + ], + [ + 9.5878564140663, + 0.4299700219224214 + ], + [ + 11.293452454548508, + 0.2472608719546376 + ], + [ + 12.47542667720846, + -0.1627298916074685 + ], + [ + 13.933343594412948, + -1.293297534401914 + ], + [ + 12.69348291645361, + -0.6106371263420582 + ], + [ + 10.95335107870128, + -0.1915829846553404 + ], + [ + 8.628463598270319, + 0.027194724833249664 + ], + [ + 6.064892252296664, + 0.0924810595841015 + ], + [ + 4.074439774238859, + 0.09915257880789187 + ], + [ + 2.2085858258066393, + 0.04420382746655044 + ], + [ + -0.01589316416858611, + 0.01996390393466801 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b58", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "VL_kQH3fymy2XiKx6SqKE", + "type": "line", + "x": 648.2727815719218, + "y": 2003.3820937796818, + "width": 6.064330461769457, + "height": 12.82110520097536, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "OK8yyX9QbyD_hD_K1nCbE", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 394062996, + "version": 1795, + "versionNonce": 784403732, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 0.5341328084305129, + 1.2525301558970174 + ], + [ + 0.5720966294664349, + 2.2555790526292516 + ], + [ + 0.14666257719255568, + 3.4557696085201544 + ], + [ + -0.8254355169178571, + 4.570440224475339 + ], + [ + -1.8821106241183998, + 5.605425811126976 + ], + [ + -3.494762277305824, + 7.305862191159634 + ], + [ + -4.139948955906879, + 8.563996482952684 + ], + [ + -4.18264062977143, + 9.76204562554004 + ], + [ + -3.6931778791011425, + 10.981768866975575 + ], + [ + -2.8651294854569316, + 12.328498626453033 + ], + [ + -2.6923095006993925, + 12.783976354879819 + ], + [ + -3.925587315540412, + 11.419050090072364 + ], + [ + -4.839375959130988, + 10.400563520118592 + ], + [ + -5.353870333211795, + 9.37297043587449 + ], + [ + -5.492233832303023, + 8.384599142827106 + ], + [ + -5.2381723280166765, + 7.603743356565097 + ], + [ + -4.316813832460008, + 6.464591892226022 + ], + [ + -2.50008020400324, + 5.018148720376424 + ], + [ + -1.0368560186420932, + 3.8376880274896337 + ], + [ + -0.2095214294324007, + 2.649602405134108 + ], + [ + 0.10860402285206669, + 1.4088571824819827 + ], + [ + -0.08990631224784021, + -0.037128846095540714 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b59", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "cPeD_B5lDX1ynQmnOxMMH", + "type": "line", + "x": 650.9769319345667, + "y": 2008.3345350393802, + "width": 4.894017247973431, + "height": 8.713691627441886, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "OK8yyX9QbyD_hD_K1nCbE", + "9EGaFT9fjRS0eFt-tIwJq", + "riYFmyoMCWdHiK2b7Ub9I", + "CrJSHWS1LYD7r0kKXFY2B", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1004157460, + "version": 1644, + "versionNonce": 113658516, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -1.6085142311873455, + 0.572583514589994 + ], + [ + -2.395584962849884, + 0.9599039350207045 + ], + [ + -3.4672059011731937, + 1.5891038176987031 + ], + [ + -4.263851305898754, + 2.3786552400811507 + ], + [ + -4.894017247973431, + 3.392102218541166 + ], + [ + -4.8766391943330305, + 4.941398220414746 + ], + [ + -4.363506336118044, + 6.011676369223136 + ], + [ + -3.7603371827489545, + 6.710743165579823 + ], + [ + -3.6003943181141507, + 7.423897685567786 + ], + [ + -4.4233513474121455, + 8.702455816898532 + ], + [ + -4.383497266484815, + 8.713691627441886 + ], + [ + -3.2545626788898185, + 7.907779983668232 + ], + [ + -2.486443014343759, + 6.7700572297481925 + ], + [ + -2.6894564860614434, + 5.707422736759479 + ], + [ + -3.655421149475244, + 4.668464960615742 + ], + [ + -3.726034914090105, + 3.3733020637819893 + ], + [ + -3.157425792092305, + 2.4998455738418963 + ], + [ + -1.7765931445155962, + 1.2724247006341083 + ], + [ + -0.016212613684044374, + 0.010915259477846866 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5A", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2075, + "versionNonce": 1984419860, + "isDeleted": false, + "id": "829gVc7kZRuYX6UTr41Vu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 789.1614262860676, + "y": 1787.0899800262796, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 96.9733978857935, + "height": 95.10852484952814, + "seed": 956297260, + "groupIds": [ + "eSf40Qfnzh1eUg-7nuAUd", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "index": "b5B", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1561, + "versionNonce": 1765520788, + "isDeleted": false, + "id": "uuFPspcZpSy69iM95M9Cc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 789.2056470490327, + "y": 1796.3671829131445, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 96.8849563598633, + "height": 81.10823815159674, + "seed": 1382615724, + "groupIds": [ + "eSf40Qfnzh1eUg-7nuAUd", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "fontSize": 15.020044102147551, + "fontFamily": 1, + "text": "Flight\nTracker\nEvent\nserver", + "baseline": 34.167465732141956, + "textAlign": "center", + "verticalAlign": "top", + "index": "b5C", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Flight Tracker\nEvent\nserver", + "autoResize": false, + "lineHeight": 1.3499999999999994 + }, + { + "type": "text", + "version": 2305, + "versionNonce": 1557652244, + "isDeleted": false, + "id": "KpLUQhBMepuKs-AkQ79uv", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 769.992616614388, + "y": 1912.7981197833487, + "strokeColor": "#000", + "backgroundColor": "#edf2f9", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 1154143532, + "groupIds": [ + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b5D", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 4074, + "versionNonce": 932339860, + "isDeleted": false, + "id": "_UfP068rGtwYsjKnGYDQm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 760.4192073253439, + "y": 1848.4152824691064, + "strokeColor": "#000000", + "backgroundColor": "#f5f3f6", + "width": 45.4967677285642, + "height": 62.002957510392, + "seed": 1301237676, + "groupIds": [ + "HIt7aN4PTdHMHJ3HKUOiW", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "index": "b5E", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3606, + "versionNonce": 555822612, + "isDeleted": false, + "id": "he4qT8yHZ91KFeWWM5rDQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 774.6641234172059, + "y": 1855.8857965619154, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 36.33800423361336, + "height": 15.535285711097229, + "seed": 1826650668, + "groupIds": [ + "HIt7aN4PTdHMHJ3HKUOiW", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "index": "b5F", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2738, + "versionNonce": 1517964180, + "isDeleted": false, + "id": "wTrwErNoOvcSnzPu7YFuq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 781.542227133039, + "y": 1857.3257702920027, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 229135532, + "groupIds": [ + "HIt7aN4PTdHMHJ3HKUOiW", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "boundElements": [], + "updated": 1746715449365, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b5G", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xnU3qkfy4apJHRP79_a8L", + "type": "line", + "x": 779.5437834681022, + "y": 1894.3417214963665, + "width": 10.732121509799065, + "height": 1.855231307857764, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "Hg6KwqhETu3E3X1QyagaF", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 764469036, + "version": 1560, + "versionNonce": 366197012, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -3.1027124304035283, + 1.158400933496767 + ], + [ + -2.5409800493418864, + 1.7436993649641308 + ], + [ + 2.523248712862932, + 1.855231307857764 + ], + [ + 7.629409079395535, + 1.2540592647352646 + ], + [ + 2.758731473950813, + 1.6474448197593061 + ], + [ + 0.251746754213678, + 1.67808773914117 + ], + [ + -1.8756922853687323, + 1.4365442496601786 + ], + [ + -1.708217021469664, + 0.8176097119286738 + ], + [ + 0.028685071526469038, + 0.004487321506281649 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5H", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "DeYCG-2hllpiMN1VPAbTi", + "type": "line", + "x": 788.5297999063032, + "y": 1894.7623160458452, + "width": 3.7498900820437275, + "height": 4.366998249786954, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "Hg6KwqhETu3E3X1QyagaF", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 84154796, + "version": 1712, + "versionNonce": 1319335572, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 1.5081079438317329, + 0.1887704295289138 + ], + [ + 2.06036345373866, + 0.8776225522415755 + ], + [ + 1.9057939502637078, + 1.7647536845430505 + ], + [ + 0.8813722286229448, + 3.065871560964751 + ], + [ + -0.6218228019711837, + 4.188464524903099 + ], + [ + 1.1092763253443232, + 3.4769458067441943 + ], + [ + 2.38954626545785, + 2.5326034693260793 + ], + [ + 3.128067280072544, + 1.1920589133976744 + ], + [ + 2.8635520657806603, + 0.1980884414295272 + ], + [ + 1.9154545442309043, + -0.1785337248838554 + ], + [ + -0.009845654376131894, + -0.007317597003873432 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5I", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "FQ0_HjpFv9ujM5lrMuZJw", + "type": "line", + "x": 778.7181547865146, + "y": 1897.3750804140982, + "width": 8.44853641256907, + "height": 1.7076383142809495, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "Hg6KwqhETu3E3X1QyagaF", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 791413804, + "version": 1560, + "versionNonce": 564102164, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.7725082399582961, + 0.7907598227909706 + ], + [ + 0.07010705159035445, + 1.5248757387426026 + ], + [ + 3.93829700005503, + 1.7076383142809495 + ], + [ + 7.676028172610773, + 1.125431658425576 + ], + [ + 7.322322653605653, + 0.6169770832868927 + ], + [ + 5.694013567961052, + 0.7319359483962525 + ], + [ + 3.8203650513518825, + 0.8720101547202224 + ], + [ + 1.621195275400573, + 0.9635742997982352 + ], + [ + 0.1856199963765434, + 0.7757710312160854 + ], + [ + 0.0026921883301963627, + 0.09663127532309924 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5J", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "IMnoKNBBeSe2yUNu0NcBN", + "type": "line", + "x": 779.3183541609399, + "y": 1899.7997473999048, + "width": 7.549854426409026, + "height": 1.9521824261070226, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "Hg6KwqhETu3E3X1QyagaF", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1374854828, + "version": 1669, + "versionNonce": 616423828, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.6960210104594012, + 0.6258720999670092 + ], + [ + -0.3105974592204193, + 1.3030301673141964 + ], + [ + 0.8364906732524691, + 1.7932507844211096 + ], + [ + 3.5826681746569156, + 1.9521824261070226 + ], + [ + 6.709816761985028, + 1.404333116413167 + ], + [ + 6.853833415949625, + 0.8850778430021672 + ], + [ + 6.1741660175810935, + 0.7478269094646878 + ], + [ + 5.355989715514292, + 0.7894632983782015 + ], + [ + 4.211679692275754, + 0.909404474378602 + ], + [ + 2.5947408062810045, + 1.0554391680407116 + ], + [ + 1.0464196762045963, + 0.9224754673106429 + ], + [ + 0.10286715017462596, + 0.588289415249492 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5K", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "_3dYmJ-gkmHlI805beghk", + "type": "line", + "x": 790.1773530713783, + "y": 1902.0314415427283, + "width": 16.165462935557684, + "height": 2.117522886002861, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "Hg6KwqhETu3E3X1QyagaF", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1174530348, + "version": 1876, + "versionNonce": 1060409108, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -0.5654256423438722, + 0.6284629456922926 + ], + [ + -1.0622996217725522, + 0.9791325927506236 + ], + [ + -2.2492374289725587, + 1.4089596266369213 + ], + [ + -3.933989939346747, + 1.6580641556835356 + ], + [ + -7.17836107714371, + 1.8721746426378705 + ], + [ + -10.416927046159945, + 1.8812073530747082 + ], + [ + -13.532366156421766, + 1.7587039716505128 + ], + [ + -15.440920591119012, + 1.5623702994558222 + ], + [ + -16.165462935557684, + 0.9826905994226706 + ], + [ + -15.549291085359739, + 0.3937072076395451 + ], + [ + -14.372760723063031, + -0.05280830955380671 + ], + [ + -13.020445003265408, + -0.2363155329281526 + ], + [ + -14.35079140880061, + 0.13188418167787264 + ], + [ + -15.082855137003046, + 0.6739040884898041 + ], + [ + -14.702366530002676, + 0.9636139556001095 + ], + [ + -13.53886089553588, + 1.0999439932929937 + ], + [ + -11.20706008697059, + 1.2734138925819605 + ], + [ + -9.166755859702002, + 1.3545915222077083 + ], + [ + -5.014090609980159, + 1.3028957782077304 + ], + [ + -2.087042996028866, + 0.9830981729423222 + ], + [ + -0.7663505751605163, + 0.5521079021998312 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5L", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "dhNe6KQ1lD4OavRekXRsh", + "type": "line", + "x": 777.5391305148971, + "y": 1904.7372156577658, + "width": 13.949236758581534, + "height": 1.8516093508437739, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "Hg6KwqhETu3E3X1QyagaF", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1053025196, + "version": 1894, + "versionNonce": 24743060, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 1.2222490957076624, + 0.3516340182818606 + ], + [ + 2.963896666333292, + 0.5063854047172415 + ], + [ + 6.730951101307093, + 0.55831181644186 + ], + [ + 9.5878564140663, + 0.4299700219224214 + ], + [ + 11.293452454548508, + 0.2472608719546376 + ], + [ + 12.47542667720846, + -0.1627298916074685 + ], + [ + 13.933343594412948, + -1.293297534401914 + ], + [ + 12.69348291645361, + -0.6106371263420582 + ], + [ + 10.95335107870128, + -0.1915829846553404 + ], + [ + 8.628463598270319, + 0.027194724833249664 + ], + [ + 6.064892252296664, + 0.0924810595841015 + ], + [ + 4.074439774238859, + 0.09915257880789187 + ], + [ + 2.2085858258066393, + 0.04420382746655044 + ], + [ + -0.01589316416858611, + 0.01996390393466801 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5M", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "P7OTJ_oRS_JEynL5PLUNF", + "type": "line", + "x": 785.2727815719218, + "y": 1881.3820937796818, + "width": 6.064330461769457, + "height": 12.82110520097536, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "Hg6KwqhETu3E3X1QyagaF", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1919061548, + "version": 1827, + "versionNonce": 2101533204, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + 0.5341328084305129, + 1.2525301558970174 + ], + [ + 0.5720966294664349, + 2.2555790526292516 + ], + [ + 0.14666257719255568, + 3.4557696085201544 + ], + [ + -0.8254355169178571, + 4.570440224475339 + ], + [ + -1.8821106241183998, + 5.605425811126976 + ], + [ + -3.494762277305824, + 7.305862191159634 + ], + [ + -4.139948955906879, + 8.563996482952684 + ], + [ + -4.18264062977143, + 9.76204562554004 + ], + [ + -3.6931778791011425, + 10.981768866975575 + ], + [ + -2.8651294854569316, + 12.328498626453033 + ], + [ + -2.6923095006993925, + 12.783976354879819 + ], + [ + -3.925587315540412, + 11.419050090072364 + ], + [ + -4.839375959130988, + 10.400563520118592 + ], + [ + -5.353870333211795, + 9.37297043587449 + ], + [ + -5.492233832303023, + 8.384599142827106 + ], + [ + -5.2381723280166765, + 7.603743356565097 + ], + [ + -4.316813832460008, + 6.464591892226022 + ], + [ + -2.50008020400324, + 5.018148720376424 + ], + [ + -1.0368560186420932, + 3.8376880274896337 + ], + [ + -0.2095214294324007, + 2.649602405134108 + ], + [ + 0.10860402285206669, + 1.4088571824819827 + ], + [ + -0.08990631224784021, + -0.037128846095540714 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5N", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "JTMWA3S9Ox73FIDiXjiO2", + "type": "line", + "x": 787.9769319345667, + "y": 1886.3345350393802, + "width": 4.894017247973431, + "height": 8.713691627441886, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "Hg6KwqhETu3E3X1QyagaF", + "S5lN9_3NvE9F3D1BuMDSd", + "KKCU2e5y0V_p6h_xAZ31n", + "OR8b3rcLDWBXmkCjvr0TO", + "5zV5Hb4_wezvQioVVaQLs", + "SFcZussCIN16xs7FzBnFl" + ], + "seed": 1103620268, + "version": 1676, + "versionNonce": 495351700, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "points": [ + [ + 0, + 0 + ], + [ + -1.6085142311873455, + 0.572583514589994 + ], + [ + -2.395584962849884, + 0.9599039350207045 + ], + [ + -3.4672059011731937, + 1.5891038176987031 + ], + [ + -4.263851305898754, + 2.3786552400811507 + ], + [ + -4.894017247973431, + 3.392102218541166 + ], + [ + -4.8766391943330305, + 4.941398220414746 + ], + [ + -4.363506336118044, + 6.011676369223136 + ], + [ + -3.7603371827489545, + 6.710743165579823 + ], + [ + -3.6003943181141507, + 7.423897685567786 + ], + [ + -4.4233513474121455, + 8.702455816898532 + ], + [ + -4.383497266484815, + 8.713691627441886 + ], + [ + -3.2545626788898185, + 7.907779983668232 + ], + [ + -2.486443014343759, + 6.7700572297481925 + ], + [ + -2.6894564860614434, + 5.707422736759479 + ], + [ + -3.655421149475244, + 4.668464960615742 + ], + [ + -3.726034914090105, + 3.3733020637819893 + ], + [ + -3.157425792092305, + 2.4998455738418963 + ], + [ + -1.7765931445155962, + 1.2724247006341083 + ], + [ + -0.016212613684044374, + 0.010915259477846866 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b5O", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "HsZfVOa3bxRXhPAQBsBZh", + "type": "text", + "x": 562.2770157486025, + "y": 1759.4170856177716, + "width": 83.13600158691406, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "SFcZussCIN16xs7FzBnFl" + ], + "frameId": null, + "index": "b5P", + "roundness": null, + "seed": 1963986068, + "version": 399, + "versionNonce": 2121950484, + "isDeleted": false, + "boundElements": null, + "updated": 1746715449365, + "link": null, + "locked": false, + "text": "API Group", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "API Group", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1901, + "versionNonce": 985120940, + "isDeleted": false, + "id": "lo00HyvR-AkSrzsr55mKp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 594.7903168057057, + "y": 1578.1526648980098, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 96.9733978857935, + "height": 95.10852484952814, + "seed": 494734996, + "groupIds": [ + "Wt_7n9l6AJY07gCb04KBC", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "index": "b67", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715432713, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1387, + "versionNonce": 1574095660, + "isDeleted": false, + "id": "cOMQuMaZq0sRMnlistuax", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 594.8345375686708, + "y": 1587.4298677848747, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 96.8849563598633, + "height": 81.10823815159674, + "seed": 294001684, + "groupIds": [ + "Wt_7n9l6AJY07gCb04KBC", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "fontSize": 15.020044102147551, + "fontFamily": 1, + "text": "Flight\nTracker\nEvent\nserver", + "baseline": 34.167465732141956, + "textAlign": "center", + "verticalAlign": "top", + "index": "b68", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715432713, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Flight Tracker\nEvent\nserver", + "autoResize": false, + "lineHeight": 1.3499999999999994 + }, + { + "type": "text", + "version": 2131, + "versionNonce": 774407596, + "isDeleted": false, + "id": "zrwdvABBK0v7eSlz1Ek7p", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 575.6215071340262, + "y": 1703.8608046550785, + "strokeColor": "#000", + "backgroundColor": "#edf2f9", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 202471828, + "groupIds": [ + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "boundElements": [], + "updated": 1746715432713, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b69", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3900, + "versionNonce": 283308076, + "isDeleted": false, + "id": "iZ29LqqiuO6Cr8-ScR0te", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 566.0480978449821, + "y": 1639.4779673408361, + "strokeColor": "#000000", + "backgroundColor": "#f5f3f6", + "width": 45.4967677285642, + "height": 62.002957510392, + "seed": 676669204, + "groupIds": [ + "L-MLxw4tGBPfo_sVO8ca2", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "boundElements": [], + "updated": 1746715432713, + "index": "b6A", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3432, + "versionNonce": 904661676, + "isDeleted": false, + "id": "vvfPx-1THjy7TTurmzoS_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 580.2930139368441, + "y": 1646.9484814336447, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 36.33800423361336, + "height": 15.535285711097229, + "seed": 717694100, + "groupIds": [ + "L-MLxw4tGBPfo_sVO8ca2", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "boundElements": [], + "updated": 1746715432713, + "index": "b6B", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2564, + "versionNonce": 1072551212, + "isDeleted": false, + "id": "_CrPn5B-4DNtLFhzk87Us", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 587.1711176526771, + "y": 1648.388455163732, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 1495101972, + "groupIds": [ + "L-MLxw4tGBPfo_sVO8ca2", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "boundElements": [], + "updated": 1746715432713, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b6C", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "aSFZIzZnmDyQWVVCpHRJr", + "type": "line", + "x": 585.1726739877404, + "y": 1685.4044063680958, + "width": 10.732121509799065, + "height": 1.855231307857764, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "jF7xBgGcpxTjecXefa55-", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 1380847508, + "version": 1386, + "versionNonce": 1817333676, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -3.1027124304035283, + 1.158400933496767 + ], + [ + -2.5409800493418864, + 1.7436993649641308 + ], + [ + 2.523248712862932, + 1.855231307857764 + ], + [ + 7.629409079395535, + 1.2540592647352646 + ], + [ + 2.758731473950813, + 1.6474448197593061 + ], + [ + 0.251746754213678, + 1.67808773914117 + ], + [ + -1.8756922853687323, + 1.4365442496601786 + ], + [ + -1.708217021469664, + 0.8176097119286738 + ], + [ + 0.028685071526469038, + 0.004487321506281649 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6D", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "4oNvLgT0iYws6s4aPQcLt", + "type": "line", + "x": 594.1586904259414, + "y": 1685.825000917575, + "width": 3.7498900820437275, + "height": 4.366998249786954, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "jF7xBgGcpxTjecXefa55-", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 1720646932, + "version": 1538, + "versionNonce": 994277932, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + 1.5081079438317329, + 0.1887704295289138 + ], + [ + 2.06036345373866, + 0.8776225522415755 + ], + [ + 1.9057939502637078, + 1.7647536845430505 + ], + [ + 0.8813722286229448, + 3.065871560964751 + ], + [ + -0.6218228019711837, + 4.188464524903099 + ], + [ + 1.1092763253443232, + 3.4769458067441943 + ], + [ + 2.38954626545785, + 2.5326034693260793 + ], + [ + 3.128067280072544, + 1.1920589133976744 + ], + [ + 2.8635520657806603, + 0.1980884414295272 + ], + [ + 1.9154545442309043, + -0.1785337248838554 + ], + [ + -0.009845654376131894, + -0.007317597003873432 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6E", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "ObRSzJbPQx9ISEv5MBGej", + "type": "line", + "x": 584.3470453061527, + "y": 1688.4377652858275, + "width": 8.44853641256907, + "height": 1.7076383142809495, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "jF7xBgGcpxTjecXefa55-", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 1867922068, + "version": 1386, + "versionNonce": 397104300, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -0.7725082399582961, + 0.7907598227909706 + ], + [ + 0.07010705159035445, + 1.5248757387426026 + ], + [ + 3.93829700005503, + 1.7076383142809495 + ], + [ + 7.676028172610773, + 1.125431658425576 + ], + [ + 7.322322653605653, + 0.6169770832868927 + ], + [ + 5.694013567961052, + 0.7319359483962525 + ], + [ + 3.8203650513518825, + 0.8720101547202224 + ], + [ + 1.621195275400573, + 0.9635742997982352 + ], + [ + 0.1856199963765434, + 0.7757710312160854 + ], + [ + 0.0026921883301963627, + 0.09663127532309924 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6F", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "89SFDETO75BClHYXD5dLA", + "type": "line", + "x": 584.947244680578, + "y": 1690.8624322716341, + "width": 7.549854426409026, + "height": 1.9521824261070226, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "jF7xBgGcpxTjecXefa55-", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 660195348, + "version": 1495, + "versionNonce": 2134105900, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -0.6960210104594012, + 0.6258720999670092 + ], + [ + -0.3105974592204193, + 1.3030301673141964 + ], + [ + 0.8364906732524691, + 1.7932507844211096 + ], + [ + 3.5826681746569156, + 1.9521824261070226 + ], + [ + 6.709816761985028, + 1.404333116413167 + ], + [ + 6.853833415949625, + 0.8850778430021672 + ], + [ + 6.1741660175810935, + 0.7478269094646878 + ], + [ + 5.355989715514292, + 0.7894632983782015 + ], + [ + 4.211679692275754, + 0.909404474378602 + ], + [ + 2.5947408062810045, + 1.0554391680407116 + ], + [ + 1.0464196762045963, + 0.9224754673106429 + ], + [ + 0.10286715017462596, + 0.588289415249492 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6G", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "joJ4d5E7fv9gO9i-m9Nvi", + "type": "line", + "x": 595.8062435910165, + "y": 1693.0941264144576, + "width": 16.165462935557684, + "height": 2.117522886002861, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "jF7xBgGcpxTjecXefa55-", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 42968468, + "version": 1702, + "versionNonce": 709302700, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -0.5654256423438722, + 0.6284629456922926 + ], + [ + -1.0622996217725522, + 0.9791325927506236 + ], + [ + -2.2492374289725587, + 1.4089596266369213 + ], + [ + -3.933989939346747, + 1.6580641556835356 + ], + [ + -7.17836107714371, + 1.8721746426378705 + ], + [ + -10.416927046159945, + 1.8812073530747082 + ], + [ + -13.532366156421766, + 1.7587039716505128 + ], + [ + -15.440920591119012, + 1.5623702994558222 + ], + [ + -16.165462935557684, + 0.9826905994226706 + ], + [ + -15.549291085359739, + 0.3937072076395451 + ], + [ + -14.372760723063031, + -0.05280830955380671 + ], + [ + -13.020445003265408, + -0.2363155329281526 + ], + [ + -14.35079140880061, + 0.13188418167787264 + ], + [ + -15.082855137003046, + 0.6739040884898041 + ], + [ + -14.702366530002676, + 0.9636139556001095 + ], + [ + -13.53886089553588, + 1.0999439932929937 + ], + [ + -11.20706008697059, + 1.2734138925819605 + ], + [ + -9.166755859702002, + 1.3545915222077083 + ], + [ + -5.014090609980159, + 1.3028957782077304 + ], + [ + -2.087042996028866, + 0.9830981729423222 + ], + [ + -0.7663505751605163, + 0.5521079021998312 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6H", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "fFoWOMqOprECFlvThTM9e", + "type": "line", + "x": 583.1680210345353, + "y": 1695.799900529496, + "width": 13.949236758581534, + "height": 1.8516093508437739, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "jF7xBgGcpxTjecXefa55-", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 103666452, + "version": 1720, + "versionNonce": 873399340, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + 1.2222490957076624, + 0.3516340182818606 + ], + [ + 2.963896666333292, + 0.5063854047172415 + ], + [ + 6.730951101307093, + 0.55831181644186 + ], + [ + 9.5878564140663, + 0.4299700219224214 + ], + [ + 11.293452454548508, + 0.2472608719546376 + ], + [ + 12.47542667720846, + -0.1627298916074685 + ], + [ + 13.933343594412948, + -1.293297534401914 + ], + [ + 12.69348291645361, + -0.6106371263420582 + ], + [ + 10.95335107870128, + -0.1915829846553404 + ], + [ + 8.628463598270319, + 0.027194724833249664 + ], + [ + 6.064892252296664, + 0.0924810595841015 + ], + [ + 4.074439774238859, + 0.09915257880789187 + ], + [ + 2.2085858258066393, + 0.04420382746655044 + ], + [ + -0.01589316416858611, + 0.01996390393466801 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6I", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "VHDMLx__PibGTIdjZ-7IF", + "type": "line", + "x": 590.9016720915599, + "y": 1672.444778651411, + "width": 6.064330461769457, + "height": 12.82110520097536, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "jF7xBgGcpxTjecXefa55-", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 548032660, + "version": 1653, + "versionNonce": 1115004588, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + 0.5341328084305129, + 1.2525301558970174 + ], + [ + 0.5720966294664349, + 2.2555790526292516 + ], + [ + 0.14666257719255568, + 3.4557696085201544 + ], + [ + -0.8254355169178571, + 4.570440224475339 + ], + [ + -1.8821106241183998, + 5.605425811126976 + ], + [ + -3.494762277305824, + 7.305862191159634 + ], + [ + -4.139948955906879, + 8.563996482952684 + ], + [ + -4.18264062977143, + 9.76204562554004 + ], + [ + -3.6931778791011425, + 10.981768866975575 + ], + [ + -2.8651294854569316, + 12.328498626453033 + ], + [ + -2.6923095006993925, + 12.783976354879819 + ], + [ + -3.925587315540412, + 11.419050090072364 + ], + [ + -4.839375959130988, + 10.400563520118592 + ], + [ + -5.353870333211795, + 9.37297043587449 + ], + [ + -5.492233832303023, + 8.384599142827106 + ], + [ + -5.2381723280166765, + 7.603743356565097 + ], + [ + -4.316813832460008, + 6.464591892226022 + ], + [ + -2.50008020400324, + 5.018148720376424 + ], + [ + -1.0368560186420932, + 3.8376880274896337 + ], + [ + -0.2095214294324007, + 2.649602405134108 + ], + [ + 0.10860402285206669, + 1.4088571824819827 + ], + [ + -0.08990631224784021, + -0.037128846095540714 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6J", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "qgNnYY0okMJwRDQVuxtN9", + "type": "line", + "x": 593.6058224542048, + "y": 1677.39721991111, + "width": 4.894017247973431, + "height": 8.713691627441886, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "jF7xBgGcpxTjecXefa55-", + "VZBeknQgAnX27qCoENtxf", + "tAMO6MLu-JG6v6vfeGzzB", + "CNJef3-VlZIvvu5e6DCTm", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 29040148, + "version": 1502, + "versionNonce": 774170924, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -1.6085142311873455, + 0.572583514589994 + ], + [ + -2.395584962849884, + 0.9599039350207045 + ], + [ + -3.4672059011731937, + 1.5891038176987031 + ], + [ + -4.263851305898754, + 2.3786552400811507 + ], + [ + -4.894017247973431, + 3.392102218541166 + ], + [ + -4.8766391943330305, + 4.941398220414746 + ], + [ + -4.363506336118044, + 6.011676369223136 + ], + [ + -3.7603371827489545, + 6.710743165579823 + ], + [ + -3.6003943181141507, + 7.423897685567786 + ], + [ + -4.4233513474121455, + 8.702455816898532 + ], + [ + -4.383497266484815, + 8.713691627441886 + ], + [ + -3.2545626788898185, + 7.907779983668232 + ], + [ + -2.486443014343759, + 6.7700572297481925 + ], + [ + -2.6894564860614434, + 5.707422736759479 + ], + [ + -3.655421149475244, + 4.668464960615742 + ], + [ + -3.726034914090105, + 3.3733020637819893 + ], + [ + -3.157425792092305, + 2.4998455738418963 + ], + [ + -1.7765931445155962, + 1.2724247006341083 + ], + [ + -0.016212613684044374, + 0.010915259477846866 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6K", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "OuzLjTwWV2ZoafCv6MrGy", + "type": "rectangle", + "x": 551.2770157486025, + "y": 1564.2535328220256, + "width": 364.00000000000006, + "height": 169.99999999999994, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "B6tozPlI7jkM886d2ufr0" + ], + "frameId": null, + "index": "b6L", + "roundness": { + "type": 3 + }, + "seed": 1918253972, + "version": 512, + "versionNonce": 1629057708, + "isDeleted": false, + "boundElements": [ + { + "id": "sUGzeWQ9d-2kwXhZywlhe", + "type": "arrow" + }, + { + "id": "ckI9IOdrA2mYrkhxY_N-s", + "type": "arrow" + }, + { + "id": "zoN0oyFMFPAOiMpl4JcMV", + "type": "arrow" + } + ], + "updated": 1746715926473, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2063, + "versionNonce": 1489692844, + "isDeleted": false, + "id": "f_cUKjh2X7xqSDE1bT_5X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 786.1614262860676, + "y": 1578.9264272305336, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 96.9733978857935, + "height": 95.10852484952814, + "seed": 749840660, + "groupIds": [ + "3UMH1cz8L6J_hMBe0ZfBf", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "index": "b6M", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715432713, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1549, + "versionNonce": 524350252, + "isDeleted": false, + "id": "ckn1D7RtFZyN_Yi0uEEaH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 786.2056470490327, + "y": 1588.2036301173985, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 96.8849563598633, + "height": 81.10823815159674, + "seed": 876832404, + "groupIds": [ + "3UMH1cz8L6J_hMBe0ZfBf", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "fontSize": 15.020044102147551, + "fontFamily": 1, + "text": "Flight\nTracker\nEvent\nserver", + "baseline": 34.167465732141956, + "textAlign": "center", + "verticalAlign": "top", + "index": "b6N", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715432713, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Flight Tracker\nEvent\nserver", + "autoResize": false, + "lineHeight": 1.3499999999999994 + }, + { + "type": "text", + "version": 2293, + "versionNonce": 1871818156, + "isDeleted": false, + "id": "-zM-iLnWeX1z84fgYCH2q", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 766.992616614388, + "y": 1704.6345669876027, + "strokeColor": "#000", + "backgroundColor": "#edf2f9", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 767652884, + "groupIds": [ + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "boundElements": [], + "updated": 1746715432713, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b6O", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 4062, + "versionNonce": 451352620, + "isDeleted": false, + "id": "Up6kiQTGfFxQdPbeUr_co", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 757.4192073253439, + "y": 1640.2517296733604, + "strokeColor": "#000000", + "backgroundColor": "#f5f3f6", + "width": 45.4967677285642, + "height": 62.002957510392, + "seed": 924963220, + "groupIds": [ + "z5UfxhFhltakQMMPo85cl", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "boundElements": [], + "updated": 1746715432713, + "index": "b6P", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3594, + "versionNonce": 1026241196, + "isDeleted": false, + "id": "-Qhsm-diR9bt2aSKCXIIT", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 771.6641234172059, + "y": 1647.7222437661694, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 36.33800423361336, + "height": 15.535285711097229, + "seed": 1067089684, + "groupIds": [ + "z5UfxhFhltakQMMPo85cl", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "boundElements": [], + "updated": 1746715432713, + "index": "b6Q", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2726, + "versionNonce": 1695022380, + "isDeleted": false, + "id": "Bv2UACqux3ftevhQ-G98y", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 778.542227133039, + "y": 1649.1622174962567, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 26.40998570886529, + "height": 12.946071425914358, + "seed": 1604418708, + "groupIds": [ + "z5UfxhFhltakQMMPo85cl", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "boundElements": [], + "updated": 1746715432713, + "fontSize": 10.356857140731485, + "fontFamily": 1, + "text": "Java", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Java", + "index": "b6R", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ruLbSZowD_Z8s4NdCsevD", + "type": "line", + "x": 776.5437834681022, + "y": 1686.1781687006205, + "width": 10.732121509799065, + "height": 1.855231307857764, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "8GD3DDsPdVTv1kF_0JFKf", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 820824596, + "version": 1548, + "versionNonce": 1005025196, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -3.1027124304035283, + 1.158400933496767 + ], + [ + -2.5409800493418864, + 1.7436993649641308 + ], + [ + 2.523248712862932, + 1.855231307857764 + ], + [ + 7.629409079395535, + 1.2540592647352646 + ], + [ + 2.758731473950813, + 1.6474448197593061 + ], + [ + 0.251746754213678, + 1.67808773914117 + ], + [ + -1.8756922853687323, + 1.4365442496601786 + ], + [ + -1.708217021469664, + 0.8176097119286738 + ], + [ + 0.028685071526469038, + 0.004487321506281649 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6S", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "KDzYHC0nchb9lhduABj47", + "type": "line", + "x": 785.5297999063032, + "y": 1686.5987632500992, + "width": 3.7498900820437275, + "height": 4.366998249786954, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "8GD3DDsPdVTv1kF_0JFKf", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 645031828, + "version": 1700, + "versionNonce": 770941484, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + 1.5081079438317329, + 0.1887704295289138 + ], + [ + 2.06036345373866, + 0.8776225522415755 + ], + [ + 1.9057939502637078, + 1.7647536845430505 + ], + [ + 0.8813722286229448, + 3.065871560964751 + ], + [ + -0.6218228019711837, + 4.188464524903099 + ], + [ + 1.1092763253443232, + 3.4769458067441943 + ], + [ + 2.38954626545785, + 2.5326034693260793 + ], + [ + 3.128067280072544, + 1.1920589133976744 + ], + [ + 2.8635520657806603, + 0.1980884414295272 + ], + [ + 1.9154545442309043, + -0.1785337248838554 + ], + [ + -0.009845654376131894, + -0.007317597003873432 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6T", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "jE1M51h0csr40EFfWleVl", + "type": "line", + "x": 775.7181547865146, + "y": 1689.2115276183522, + "width": 8.44853641256907, + "height": 1.7076383142809495, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "8GD3DDsPdVTv1kF_0JFKf", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 1684559124, + "version": 1548, + "versionNonce": 303463596, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -0.7725082399582961, + 0.7907598227909706 + ], + [ + 0.07010705159035445, + 1.5248757387426026 + ], + [ + 3.93829700005503, + 1.7076383142809495 + ], + [ + 7.676028172610773, + 1.125431658425576 + ], + [ + 7.322322653605653, + 0.6169770832868927 + ], + [ + 5.694013567961052, + 0.7319359483962525 + ], + [ + 3.8203650513518825, + 0.8720101547202224 + ], + [ + 1.621195275400573, + 0.9635742997982352 + ], + [ + 0.1856199963765434, + 0.7757710312160854 + ], + [ + 0.0026921883301963627, + 0.09663127532309924 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6U", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "vuEEQlR_3l0vtmcRgAp-t", + "type": "line", + "x": 776.3183541609399, + "y": 1691.6361946041588, + "width": 7.549854426409026, + "height": 1.9521824261070226, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "8GD3DDsPdVTv1kF_0JFKf", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 407147156, + "version": 1657, + "versionNonce": 1375340332, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -0.6960210104594012, + 0.6258720999670092 + ], + [ + -0.3105974592204193, + 1.3030301673141964 + ], + [ + 0.8364906732524691, + 1.7932507844211096 + ], + [ + 3.5826681746569156, + 1.9521824261070226 + ], + [ + 6.709816761985028, + 1.404333116413167 + ], + [ + 6.853833415949625, + 0.8850778430021672 + ], + [ + 6.1741660175810935, + 0.7478269094646878 + ], + [ + 5.355989715514292, + 0.7894632983782015 + ], + [ + 4.211679692275754, + 0.909404474378602 + ], + [ + 2.5947408062810045, + 1.0554391680407116 + ], + [ + 1.0464196762045963, + 0.9224754673106429 + ], + [ + 0.10286715017462596, + 0.588289415249492 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6V", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "5ftPN8KrOHshAF7mYifa8", + "type": "line", + "x": 787.1773530713783, + "y": 1693.8678887469823, + "width": 16.165462935557684, + "height": 2.117522886002861, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "8GD3DDsPdVTv1kF_0JFKf", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 1354571796, + "version": 1864, + "versionNonce": 302530988, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -0.5654256423438722, + 0.6284629456922926 + ], + [ + -1.0622996217725522, + 0.9791325927506236 + ], + [ + -2.2492374289725587, + 1.4089596266369213 + ], + [ + -3.933989939346747, + 1.6580641556835356 + ], + [ + -7.17836107714371, + 1.8721746426378705 + ], + [ + -10.416927046159945, + 1.8812073530747082 + ], + [ + -13.532366156421766, + 1.7587039716505128 + ], + [ + -15.440920591119012, + 1.5623702994558222 + ], + [ + -16.165462935557684, + 0.9826905994226706 + ], + [ + -15.549291085359739, + 0.3937072076395451 + ], + [ + -14.372760723063031, + -0.05280830955380671 + ], + [ + -13.020445003265408, + -0.2363155329281526 + ], + [ + -14.35079140880061, + 0.13188418167787264 + ], + [ + -15.082855137003046, + 0.6739040884898041 + ], + [ + -14.702366530002676, + 0.9636139556001095 + ], + [ + -13.53886089553588, + 1.0999439932929937 + ], + [ + -11.20706008697059, + 1.2734138925819605 + ], + [ + -9.166755859702002, + 1.3545915222077083 + ], + [ + -5.014090609980159, + 1.3028957782077304 + ], + [ + -2.087042996028866, + 0.9830981729423222 + ], + [ + -0.7663505751605163, + 0.5521079021998312 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6W", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "rB9f2qD2ES0V7fOu5gAG4", + "type": "line", + "x": 774.5391305148971, + "y": 1696.5736628620198, + "width": 13.949236758581534, + "height": 1.8516093508437739, + "angle": 0, + "strokeColor": "#1555a1", + "backgroundColor": "#1555a1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "8GD3DDsPdVTv1kF_0JFKf", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 1439169940, + "version": 1882, + "versionNonce": 1500195884, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + 1.2222490957076624, + 0.3516340182818606 + ], + [ + 2.963896666333292, + 0.5063854047172415 + ], + [ + 6.730951101307093, + 0.55831181644186 + ], + [ + 9.5878564140663, + 0.4299700219224214 + ], + [ + 11.293452454548508, + 0.2472608719546376 + ], + [ + 12.47542667720846, + -0.1627298916074685 + ], + [ + 13.933343594412948, + -1.293297534401914 + ], + [ + 12.69348291645361, + -0.6106371263420582 + ], + [ + 10.95335107870128, + -0.1915829846553404 + ], + [ + 8.628463598270319, + 0.027194724833249664 + ], + [ + 6.064892252296664, + 0.0924810595841015 + ], + [ + 4.074439774238859, + 0.09915257880789187 + ], + [ + 2.2085858258066393, + 0.04420382746655044 + ], + [ + -0.01589316416858611, + 0.01996390393466801 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6X", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "b-G-seCX8zBbgHyd-oiaD", + "type": "line", + "x": 782.2727815719218, + "y": 1673.2185409839358, + "width": 6.064330461769457, + "height": 12.82110520097536, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "8GD3DDsPdVTv1kF_0JFKf", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 10169108, + "version": 1815, + "versionNonce": 973915820, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + 0.5341328084305129, + 1.2525301558970174 + ], + [ + 0.5720966294664349, + 2.2555790526292516 + ], + [ + 0.14666257719255568, + 3.4557696085201544 + ], + [ + -0.8254355169178571, + 4.570440224475339 + ], + [ + -1.8821106241183998, + 5.605425811126976 + ], + [ + -3.494762277305824, + 7.305862191159634 + ], + [ + -4.139948955906879, + 8.563996482952684 + ], + [ + -4.18264062977143, + 9.76204562554004 + ], + [ + -3.6931778791011425, + 10.981768866975575 + ], + [ + -2.8651294854569316, + 12.328498626453033 + ], + [ + -2.6923095006993925, + 12.783976354879819 + ], + [ + -3.925587315540412, + 11.419050090072364 + ], + [ + -4.839375959130988, + 10.400563520118592 + ], + [ + -5.353870333211795, + 9.37297043587449 + ], + [ + -5.492233832303023, + 8.384599142827106 + ], + [ + -5.2381723280166765, + 7.603743356565097 + ], + [ + -4.316813832460008, + 6.464591892226022 + ], + [ + -2.50008020400324, + 5.018148720376424 + ], + [ + -1.0368560186420932, + 3.8376880274896337 + ], + [ + -0.2095214294324007, + 2.649602405134108 + ], + [ + 0.10860402285206669, + 1.4088571824819827 + ], + [ + -0.08990631224784021, + -0.037128846095540714 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6Y", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "AYlkVcwhSgXmPTyCWjP99", + "type": "line", + "x": 784.9769319345667, + "y": 1678.1709822436342, + "width": 4.894017247973431, + "height": 8.713691627441886, + "angle": 0, + "strokeColor": "#fc090f", + "backgroundColor": "#fc090f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "8GD3DDsPdVTv1kF_0JFKf", + "g4wEZOyp9gcxFdf3AMa9w", + "LK84-QUevyKQsIfnT1At3", + "FA3dxS-J0ulB71YmHBSg8", + "B6tozPlI7jkM886d2ufr0" + ], + "seed": 330082452, + "version": 1664, + "versionNonce": 2023166252, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "points": [ + [ + 0, + 0 + ], + [ + -1.6085142311873455, + 0.572583514589994 + ], + [ + -2.395584962849884, + 0.9599039350207045 + ], + [ + -3.4672059011731937, + 1.5891038176987031 + ], + [ + -4.263851305898754, + 2.3786552400811507 + ], + [ + -4.894017247973431, + 3.392102218541166 + ], + [ + -4.8766391943330305, + 4.941398220414746 + ], + [ + -4.363506336118044, + 6.011676369223136 + ], + [ + -3.7603371827489545, + 6.710743165579823 + ], + [ + -3.6003943181141507, + 7.423897685567786 + ], + [ + -4.4233513474121455, + 8.702455816898532 + ], + [ + -4.383497266484815, + 8.713691627441886 + ], + [ + -3.2545626788898185, + 7.907779983668232 + ], + [ + -2.486443014343759, + 6.7700572297481925 + ], + [ + -2.6894564860614434, + 5.707422736759479 + ], + [ + -3.655421149475244, + 4.668464960615742 + ], + [ + -3.726034914090105, + 3.3733020637819893 + ], + [ + -3.157425792092305, + 2.4998455738418963 + ], + [ + -1.7765931445155962, + 1.2724247006341083 + ], + [ + -0.016212613684044374, + 0.010915259477846866 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b6Z", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "6KdEez2Lm-NZ47jfBpTj_", + "type": "text", + "x": 566.2770157486025, + "y": 1545.2535328220256, + "width": 134.32000732421875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "B6tozPlI7jkM886d2ufr0" + ], + "frameId": null, + "index": "b6a", + "roundness": null, + "seed": 1230537492, + "version": 351, + "versionNonce": 880020396, + "isDeleted": false, + "boundElements": [], + "updated": 1746715432713, + "link": null, + "locked": false, + "text": "Websocket Group", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Websocket Group", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "RnKoAn6_KNEEoUOql5kgB", + "type": "rectangle", + "x": 552.2770157486025, + "y": 2105.9170856177716, + "width": 364.00000000000006, + "height": 169.99999999999994, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6p", + "roundness": { + "type": 3 + }, + "seed": 1620535700, + "version": 491, + "versionNonce": 1330482708, + "isDeleted": false, + "boundElements": [ + { + "id": "hmhuTvwwdD_oLkBChtp5l", + "type": "arrow" + }, + { + "id": "KAhEGRMTcuXIMxoT8Fqx8", + "type": "arrow" + } + ], + "updated": 1746716286948, + "link": null, + "locked": false + }, + { + "id": "qi5FW6xfoJw-b5zpHXU2W", + "type": "text", + "x": 567.2770157486025, + "y": 2086.9170856177716, + "width": 123.760009765625, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6q", + "roundness": null, + "seed": 1453135636, + "version": 347, + "versionNonce": 1826783892, + "isDeleted": false, + "boundElements": [], + "updated": 1746714917004, + "link": null, + "locked": false, + "text": "Consumer Group", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Consumer Group", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1886, + "versionNonce": 507374764, + "isDeleted": false, + "id": "4bcr05frKfFmiwmrn6t8d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 595.7903168057057, + "y": 2119.816217693756, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 96.9733978857935, + "height": 95.10852484952814, + "seed": 1944501396, + "groupIds": [ + "LhRyhgVzIUfcNjpeYlZWR", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "index": "b748", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715047423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1399, + "versionNonce": 1583711252, + "isDeleted": false, + "id": "Xq3I-tYgBKh00rSR0KAyJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 595.8345375686708, + "y": 2129.0934205806207, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 96.8849563598633, + "height": 81.10823815159674, + "seed": 176818708, + "groupIds": [ + "LhRyhgVzIUfcNjpeYlZWR", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "fontSize": 15.020044102147551, + "fontFamily": 1, + "text": "Flight\nTracker\nEvent\nproducer", + "baseline": 34.167465732141956, + "textAlign": "center", + "verticalAlign": "top", + "index": "b74G", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715047423, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Flight Tracker\nEvent\nproducer", + "autoResize": false, + "lineHeight": 1.3499999999999994 + }, + { + "type": "text", + "version": 1727, + "versionNonce": 1202943788, + "isDeleted": false, + "id": "rnTsh1hjfne5Z8fhCnky4", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 575.4362633101044, + "y": 2233.471274036914, + "strokeColor": "#000", + "backgroundColor": "#edf2f9", + "width": 27.246969670755004, + "height": 10.479603719521155, + "seed": 1438055596, + "groupIds": [ + "DH1vlpJ1ktCnNR0-DV8Y9", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "boundElements": [], + "updated": 1746715047423, + "fontSize": 8.383682975616923, + "fontFamily": 1, + "text": "Python", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Python", + "index": "b74V", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3633, + "versionNonce": 1489232276, + "isDeleted": false, + "id": "Kw2YIbycHsoXoSTV4hG96", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 567.9900576994631, + "y": 2181.8832934791076, + "strokeColor": "#000000", + "backgroundColor": "#3572a5", + "width": 36.828786172155446, + "height": 50.19023939931062, + "seed": 1300924204, + "groupIds": [ + "bhGo-PLNnEo_lVd1_vuFQ", + "oQ-ZZ6uOHp3uxiRWT2yh7", + "DH1vlpJ1ktCnNR0-DV8Y9", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "boundElements": [], + "updated": 1746715047423, + "index": "b74d", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3158, + "versionNonce": 1863561644, + "isDeleted": false, + "id": "1PzVK-481yp-Jan9RoMb3", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 577.1405615498857, + "y": 2187.954137645769, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 31.793413311132568, + "height": 12.575524463425385, + "seed": 1200144812, + "groupIds": [ + "bhGo-PLNnEo_lVd1_vuFQ", + "oQ-ZZ6uOHp3uxiRWT2yh7", + "DH1vlpJ1ktCnNR0-DV8Y9", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "boundElements": [], + "updated": 1746715047423, + "index": "b74l", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2314, + "versionNonce": 41586452, + "isDeleted": false, + "id": "t5_uj2k3NYC44yHiReYDz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 580.5522881898543, + "y": 2188.868889916195, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 27.246969670755004, + "height": 10.479603719521155, + "seed": 182168620, + "groupIds": [ + "bhGo-PLNnEo_lVd1_vuFQ", + "oQ-ZZ6uOHp3uxiRWT2yh7", + "DH1vlpJ1ktCnNR0-DV8Y9", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "boundElements": [], + "updated": 1746715047423, + "fontSize": 8.383682975616923, + "fontFamily": 1, + "text": "Python", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Python", + "index": "b75", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dNYwnTGBGm_rsCHk15qOP", + "type": "line", + "x": 593.0934117798676, + "y": 2215.0517766268795, + "width": 11.880518425957822, + "height": 12.12874003300182, + "angle": 0, + "strokeColor": "#000", + "backgroundColor": "#ffda48", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "WNRtEzLFL_c_FKJmsC5W_", + "oQ-ZZ6uOHp3uxiRWT2yh7", + "DH1vlpJ1ktCnNR0-DV8Y9", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "seed": 1768769196, + "version": 1653, + "versionNonce": 1669897260, + "isDeleted": false, + "boundElements": [], + "updated": 1746715047423, + "points": [ + [ + 0, + 0 + ], + [ + 1.7265387840078, + 0.14543856296655433 + ], + [ + 2.56696608251111, + 1.2125203256494754 + ], + [ + 2.902028692245788, + 3.745023043810697 + ], + [ + 2.464067665335628, + 6.033119110262318 + ], + [ + 0.7853916835141446, + 7.280188984875059 + ], + [ + -1.7769502758881528, + 7.487342670205887 + ], + [ + -4.385599306467647, + 7.496926585464399 + ], + [ + -5.304451618504596, + 7.611069369232367 + ], + [ + -5.257846520026599, + 8.537864827263276 + ], + [ + -1.4734760482426283, + 8.713052917407039 + ], + [ + -1.0564498127983066, + 9.927738343468832 + ], + [ + -1.5474839872435568, + 11.049569956218452 + ], + [ + -3.1512886260669335, + 12.050274629438023 + ], + [ + -6.027561917496864, + 12.12874003300182 + ], + [ + -8.0966051106854, + 11.327366123177482 + ], + [ + -8.786163459131274, + 10.11095518612174 + ], + [ + -8.978489733712033, + 8.201437536522945 + ], + [ + -8.897657929462975, + 5.892807596707918 + ], + [ + -7.708344308253514, + 4.490416774912253 + ], + [ + -5.540694431274791, + 4.467958921779437 + ], + [ + -3.297172006541837, + 4.490206273652642 + ], + [ + -1.622201728189635, + 4.108689833148211 + ], + [ + -0.21218563584496303, + 2.5715234499165156 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b75G", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1716, + "versionNonce": 1811909780, + "isDeleted": false, + "id": "rAl8JHcUIiM6t5fsXUQim", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 583.0566168444426, + "y": 2222.922901729191, + "strokeColor": "#000", + "backgroundColor": "#3371a2", + "width": 12.499496087510447, + "height": 12.530524250168835, + "seed": 1743229228, + "groupIds": [ + "WNRtEzLFL_c_FKJmsC5W_", + "oQ-ZZ6uOHp3uxiRWT2yh7", + "DH1vlpJ1ktCnNR0-DV8Y9", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "boundElements": [], + "updated": 1746715047423, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.8467620924147892, + -0.007788167841461215 + ], + [ + -3.0636120038363184, + -1.2317320692778586 + ], + [ + -3.5582062101444785, + -3.7988991594157535 + ], + [ + -3.0997437372065084, + -6.191317663052805 + ], + [ + -1.5556400228732736, + -7.659204708754456 + ], + [ + 1.2577044348668416, + -7.797088293295793 + ], + [ + 4.190869444879476, + -7.697591396845246 + ], + [ + 5.257975709786195, + -7.796950626767151 + ], + [ + 4.86451796211494, + -8.853935128060934 + ], + [ + 1.0587638069200047, + -9.050903453633584 + ], + [ + 0.6069328193194631, + -9.88091565202735 + ], + [ + 0.9276967691571457, + -11.50790393407931 + ], + [ + 2.7470555181357934, + -12.419158198355548 + ], + [ + 5.746086609297369, + -12.530524250168835 + ], + [ + 7.919111458210038, + -11.781588378573767 + ], + [ + 8.852824453463882, + -10.528544358148965 + ], + [ + 8.94128987736597, + -8.455024123095898 + ], + [ + 8.638332377179477, + -6.108163342717228 + ], + [ + 7.510750397104057, + -4.5906902165703185 + ], + [ + 5.230881303121608, + -4.567069720558261 + ], + [ + 2.8712117401871935, + -4.590468817662158 + ], + [ + 1.108843879439988, + -3.9795801976377136 + ], + [ + 0.03419899870839734, + -2.3374846425615994 + ], + [ + 0, + 0 + ] + ], + "index": "b75V", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "a3hrTKpT58Sa1Yf6i6Yqv", + "type": "ellipse", + "x": 586.6924690715948, + "y": 2211.326422750569, + "width": 1.5825138572777007, + "height": 1.6870122153773255, + "angle": 0, + "strokeColor": "#000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "WNRtEzLFL_c_FKJmsC5W_", + "oQ-ZZ6uOHp3uxiRWT2yh7", + "DH1vlpJ1ktCnNR0-DV8Y9", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "seed": 1706331052, + "version": 801, + "versionNonce": 2130458284, + "isDeleted": false, + "boundElements": [], + "updated": 1746715047423, + "index": "b76", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 875, + "versionNonce": 654891540, + "isDeleted": false, + "id": "ssDxlE0EbvCo4zb7w7usQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 587.2245279768515, + "y": 2224.6161944355163, + "strokeColor": "#000", + "backgroundColor": "#fff", + "width": 1.5825138572777007, + "height": 1.6870122153773255, + "seed": 1157510700, + "groupIds": [ + "WNRtEzLFL_c_FKJmsC5W_", + "oQ-ZZ6uOHp3uxiRWT2yh7", + "DH1vlpJ1ktCnNR0-DV8Y9", + "yB0rtb0ruBZvOVV2FMJWd" + ], + "boundElements": [], + "updated": 1746715047423, + "index": "b77", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2052, + "versionNonce": 1364820500, + "isDeleted": false, + "id": "VJiDkiVRzJ9OA9P1Y0wbJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 787.1614262860676, + "y": 2120.5899800262796, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 96.9733978857935, + "height": 95.10852484952814, + "seed": 714151060, + "groupIds": [ + "laROsj0czkg29Zh1wy1T5", + "ECDarTV8rk88ELZZx4LyE" + ], + "index": "b7D", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715044365, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1556, + "versionNonce": 747002156, + "isDeleted": false, + "id": "wftCu7vdY5zMbbx2Z3FVj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 787.2056470490327, + "y": 2129.8671829131445, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 96.8849563598633, + "height": 81.10823815159674, + "seed": 707355156, + "groupIds": [ + "laROsj0czkg29Zh1wy1T5", + "ECDarTV8rk88ELZZx4LyE" + ], + "fontSize": 15.020044102147551, + "fontFamily": 1, + "text": "Flight\nTracker\nEvent\nproducer", + "baseline": 34.167465732141956, + "textAlign": "center", + "verticalAlign": "top", + "index": "b7E", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715044365, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Flight Tracker\nEvent\nproducer", + "autoResize": false, + "lineHeight": 1.3499999999999994 + }, + { + "type": "text", + "version": 1776, + "versionNonce": 143138708, + "isDeleted": false, + "id": "Cus9Kfgos0iCNZSbFk5nC", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 769.2512627784664, + "y": 2233.9712740369146, + "strokeColor": "#000", + "backgroundColor": "#edf2f9", + "width": 27.246969670755004, + "height": 10.479603719521155, + "seed": 1460606508, + "groupIds": [ + "m8VOyVNjaCZnSiHIVBvrL", + "ECDarTV8rk88ELZZx4LyE" + ], + "boundElements": [], + "updated": 1746715044365, + "fontSize": 8.383682975616923, + "fontFamily": 1, + "text": "Python", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Python", + "index": "b7F", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3682, + "versionNonce": 993678252, + "isDeleted": false, + "id": "InIFp405lhlz2xFyfbD93", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 761.8050571678251, + "y": 2182.3832934791085, + "strokeColor": "#000000", + "backgroundColor": "#3572a5", + "width": 36.828786172155446, + "height": 50.19023939931062, + "seed": 1872982188, + "groupIds": [ + "tvHOFmJ_m0JfhYL5KsUgu", + "CAc4Z0qDlLOSWqgG5r87h", + "m8VOyVNjaCZnSiHIVBvrL", + "ECDarTV8rk88ELZZx4LyE" + ], + "boundElements": [], + "updated": 1746715044365, + "index": "b7G", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3207, + "versionNonce": 1795624212, + "isDeleted": false, + "id": "eXhaZ_DnmbyG_8VjfJMOG", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 770.9555610182475, + "y": 2188.4541376457696, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 31.793413311132568, + "height": 12.575524463425385, + "seed": 1506310956, + "groupIds": [ + "tvHOFmJ_m0JfhYL5KsUgu", + "CAc4Z0qDlLOSWqgG5r87h", + "m8VOyVNjaCZnSiHIVBvrL", + "ECDarTV8rk88ELZZx4LyE" + ], + "boundElements": [], + "updated": 1746715044365, + "index": "b7H", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2366, + "versionNonce": 1988820524, + "isDeleted": false, + "id": "pz82PUgUE8vJ87ZpZnZvN", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 774.367287658216, + "y": 2189.3688899161957, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 27.246969670755004, + "height": 10.479603719521155, + "seed": 2145924524, + "groupIds": [ + "tvHOFmJ_m0JfhYL5KsUgu", + "CAc4Z0qDlLOSWqgG5r87h", + "m8VOyVNjaCZnSiHIVBvrL", + "ECDarTV8rk88ELZZx4LyE" + ], + "boundElements": [], + "updated": 1746715044365, + "fontSize": 8.383682975616923, + "fontFamily": 1, + "text": "Python", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Python", + "index": "b7I", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "52sAV-JeUrJkU8buWGJZ7", + "type": "line", + "x": 786.9084112482293, + "y": 2215.55177662688, + "width": 11.88051842595782, + "height": 12.12874003300182, + "angle": 0, + "strokeColor": "#000", + "backgroundColor": "#ffda48", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "f6GefXqqfu8wmOUtoD6eN", + "CAc4Z0qDlLOSWqgG5r87h", + "m8VOyVNjaCZnSiHIVBvrL", + "ECDarTV8rk88ELZZx4LyE" + ], + "seed": 1865195564, + "version": 1702, + "versionNonce": 1246513812, + "isDeleted": false, + "boundElements": [], + "updated": 1746715044365, + "points": [ + [ + 0, + 0 + ], + [ + 1.7265387840078, + 0.14543856296655433 + ], + [ + 2.56696608251111, + 1.2125203256494754 + ], + [ + 2.902028692245788, + 3.745023043810697 + ], + [ + 2.464067665335628, + 6.033119110262318 + ], + [ + 0.7853916835141446, + 7.280188984875059 + ], + [ + -1.7769502758881528, + 7.487342670205887 + ], + [ + -4.385599306467647, + 7.496926585464399 + ], + [ + -5.304451618504596, + 7.611069369232367 + ], + [ + -5.257846520026599, + 8.537864827263276 + ], + [ + -1.4734760482426283, + 8.713052917407039 + ], + [ + -1.0564498127983066, + 9.927738343468832 + ], + [ + -1.5474839872435568, + 11.049569956218452 + ], + [ + -3.1512886260669335, + 12.050274629438023 + ], + [ + -6.027561917496864, + 12.12874003300182 + ], + [ + -8.0966051106854, + 11.327366123177482 + ], + [ + -8.786163459131274, + 10.11095518612174 + ], + [ + -8.978489733712033, + 8.201437536522945 + ], + [ + -8.897657929462975, + 5.892807596707918 + ], + [ + -7.708344308253514, + 4.490416774912253 + ], + [ + -5.540694431274791, + 4.467958921779437 + ], + [ + -3.297172006541837, + 4.490206273652642 + ], + [ + -1.622201728189635, + 4.108689833148211 + ], + [ + -0.21218563584496303, + 2.5715234499165156 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b7J", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1765, + "versionNonce": 123885740, + "isDeleted": false, + "id": "K-h5CQVxMYmPIekkdRkce", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 776.8716163128043, + "y": 2223.4229017291914, + "strokeColor": "#000", + "backgroundColor": "#3371a2", + "width": 12.499496087510447, + "height": 12.530524250168835, + "seed": 2139077292, + "groupIds": [ + "f6GefXqqfu8wmOUtoD6eN", + "CAc4Z0qDlLOSWqgG5r87h", + "m8VOyVNjaCZnSiHIVBvrL", + "ECDarTV8rk88ELZZx4LyE" + ], + "boundElements": [], + "updated": 1746715044365, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.8467620924147892, + -0.007788167841461215 + ], + [ + -3.0636120038363184, + -1.2317320692778586 + ], + [ + -3.5582062101444785, + -3.7988991594157535 + ], + [ + -3.0997437372065084, + -6.191317663052805 + ], + [ + -1.5556400228732736, + -7.659204708754456 + ], + [ + 1.2577044348668416, + -7.797088293295793 + ], + [ + 4.190869444879476, + -7.697591396845246 + ], + [ + 5.257975709786195, + -7.796950626767151 + ], + [ + 4.86451796211494, + -8.853935128060934 + ], + [ + 1.0587638069200047, + -9.050903453633584 + ], + [ + 0.6069328193194631, + -9.88091565202735 + ], + [ + 0.9276967691571457, + -11.50790393407931 + ], + [ + 2.7470555181357934, + -12.419158198355548 + ], + [ + 5.746086609297369, + -12.530524250168835 + ], + [ + 7.919111458210038, + -11.781588378573767 + ], + [ + 8.852824453463882, + -10.528544358148965 + ], + [ + 8.94128987736597, + -8.455024123095898 + ], + [ + 8.638332377179477, + -6.108163342717228 + ], + [ + 7.510750397104057, + -4.5906902165703185 + ], + [ + 5.230881303121608, + -4.567069720558261 + ], + [ + 2.8712117401871935, + -4.590468817662158 + ], + [ + 1.108843879439988, + -3.9795801976377136 + ], + [ + 0.03419899870839734, + -2.3374846425615994 + ], + [ + 0, + 0 + ] + ], + "index": "b7K", + "frameId": null, + "roundness": { + "type": 2 + }, + "link": null, + "locked": false + }, + { + "id": "IM7nv0nYQ-UlluRriBskO", + "type": "ellipse", + "x": 780.5074685399567, + "y": 2211.8264227505692, + "width": 1.5825138572777007, + "height": 1.6870122153773255, + "angle": 0, + "strokeColor": "#000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "f6GefXqqfu8wmOUtoD6eN", + "CAc4Z0qDlLOSWqgG5r87h", + "m8VOyVNjaCZnSiHIVBvrL", + "ECDarTV8rk88ELZZx4LyE" + ], + "seed": 2072741164, + "version": 850, + "versionNonce": 1494079508, + "isDeleted": false, + "boundElements": [], + "updated": 1746715044365, + "index": "b7L", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 924, + "versionNonce": 1768579884, + "isDeleted": false, + "id": "tN_j25yAoWfTtK-psImWo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 781.0395274452134, + "y": 2225.1161944355167, + "strokeColor": "#000", + "backgroundColor": "#fff", + "width": 1.5825138572777007, + "height": 1.6870122153773255, + "seed": 1220149164, + "groupIds": [ + "f6GefXqqfu8wmOUtoD6eN", + "CAc4Z0qDlLOSWqgG5r87h", + "m8VOyVNjaCZnSiHIVBvrL", + "ECDarTV8rk88ELZZx4LyE" + ], + "boundElements": [], + "updated": 1746715044365, + "index": "b7M", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "id": "X96A3SClZLTzH-OgSRPAS", + "type": "arrow", + "x": 922.2770157486025, + "y": 1833.4170856177716, + "width": 189, + "height": 2, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7N", + "roundness": null, + "seed": 2123588628, + "version": 510, + "versionNonce": 1435066028, + "isDeleted": false, + "boundElements": null, + "updated": 1746715452757, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 189, + -2 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "8DGNpmjera-6zBEeUch3F", + "focus": -0.5661736084079391, + "gap": 11 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ZnQSttLh1IC_uTE7yb1hf", + "type": "arrow", + "x": 1102.2770157486025, + "y": 1984.4170856177716, + "width": 181, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7O", + "roundness": null, + "seed": 739600916, + "version": 556, + "versionNonce": 683714860, + "isDeleted": false, + "boundElements": null, + "updated": 1746715452757, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -181, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "8DGNpmjera-6zBEeUch3F", + "focus": 0.537313432835822, + "gap": 10 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ZA54V3iiVn50JcgraJb_O", + "type": "text", + "x": 985.2770157486025, + "y": 1809.4170856177716, + "width": 39.343997955322266, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7P", + "roundness": null, + "seed": 327240492, + "version": 238, + "versionNonce": 1515457940, + "isDeleted": false, + "boundElements": null, + "updated": 1746715449365, + "link": null, + "locked": false, + "text": "write", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "write", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PA6YgXIAyy2CHKn6T9P9K", + "type": "text", + "x": 992.6050167709413, + "y": 1984.4170856177716, + "width": 33.76000213623047, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7Q", + "roundness": null, + "seed": 1379428244, + "version": 305, + "versionNonce": 958741268, + "isDeleted": false, + "boundElements": [], + "updated": 1746715449365, + "link": null, + "locked": false, + "text": "read", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "read", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "sUGzeWQ9d-2kwXhZywlhe", + "type": "arrow", + "x": 925.1258997725826, + "y": 1663.4097536688796, + "width": 158.15111597601992, + "height": 1.0073319488919878, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7j", + "roundness": null, + "seed": 499687828, + "version": 301, + "versionNonce": 1261567764, + "isDeleted": false, + "boundElements": null, + "updated": 1746715902504, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 158.15111597601992, + 1.0073319488919878 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "OuzLjTwWV2ZoafCv6MrGy", + "focus": 0.1501203362853628, + "gap": 11 + }, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "elbowed": false + }, + { + "id": "owMpj-Umh6rn4zG85CTc2", + "type": "text", + "x": 980.2770157486025, + "y": 1664.4170856177716, + "width": 62.73600387573242, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7l", + "roundness": null, + "seed": 127295892, + "version": 149, + "versionNonce": 674013100, + "isDeleted": false, + "boundElements": null, + "updated": 1746715432713, + "link": null, + "locked": false, + "text": "consume", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "consume", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5mZ0q-JQ8oz6bC-mL6Y-Z", + "type": "arrow", + "x": 918.2770157486025, + "y": 1784.4170856177716, + "width": 169, + "height": 88, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7p", + "roundness": null, + "seed": 75742484, + "version": 52, + "versionNonce": 8689428, + "isDeleted": false, + "boundElements": null, + "updated": 1746715475044, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 169, + -88 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "8DGNpmjera-6zBEeUch3F", + "focus": -0.12932595313227568, + "gap": 13.206938761784375 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "wy_tJig7R8xbbPIVLNFO1", + "type": "text", + "x": 947.2770157486025, + "y": 1734.4170856177716, + "width": 51.50400161743164, + "height": 20, + "angle": 5.827197518350982, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7q", + "roundness": null, + "seed": 1632958764, + "version": 78, + "versionNonce": 528819476, + "isDeleted": false, + "boundElements": null, + "updated": 1746715493634, + "link": null, + "locked": false, + "text": "publish", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "publish", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "hmhuTvwwdD_oLkBChtp5l", + "type": "arrow", + "x": 923.2770157486025, + "y": 2195.4170856177716, + "width": 165, + "height": 2, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7r", + "roundness": null, + "seed": 851933332, + "version": 61, + "versionNonce": 83350956, + "isDeleted": false, + "boundElements": null, + "updated": 1746715526639, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 165, + 2 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "RnKoAn6_KNEEoUOql5kgB", + "focus": 0.025331850719299304, + "gap": 7 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rnTQC3heP_HPlySBgxJF4", + "type": "text", + "x": 969.2770157486025, + "y": 2196.4170856177716, + "width": 51.50400161743164, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7s", + "roundness": null, + "seed": 2029625260, + "version": 61, + "versionNonce": 1369802900, + "isDeleted": false, + "boundElements": null, + "updated": 1746715534470, + "link": null, + "locked": false, + "text": "publish", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "publish", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-PBmWr9JLfNrFwQH7HLn3", + "type": "arrow", + "x": 1090.2770157486025, + "y": 2167.4170856177716, + "width": 171, + "height": 122, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7t", + "roundness": null, + "seed": 400782228, + "version": 56, + "versionNonce": 1597094444, + "isDeleted": false, + "boundElements": [], + "updated": 1746715544273, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -171, + -122 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "8DGNpmjera-6zBEeUch3F", + "focus": -0.009685713019194506, + "gap": 16.77878197871027 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "40Q2BJ-C7V3BtgrJ3ZpaD", + "type": "text", + "x": 994.2770157486025, + "y": 2101.4170856177716, + "width": 64.9280014038086, + "height": 20, + "angle": 0.7041405611635616, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7v", + "roundness": null, + "seed": 142567188, + "version": 131, + "versionNonce": 1128572308, + "isDeleted": false, + "boundElements": null, + "updated": 1746715563789, + "link": null, + "locked": false, + "text": "comsume", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "comsume", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 2049, + "versionNonce": 1136854932, + "isDeleted": false, + "id": "m9rk78G3BLGF9rjtiw0AF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -35.30955364117301, + "y": 1740.3497555864315, + "strokeColor": "#000000", + "backgroundColor": "#eeeeee", + "width": 96.9733978857935, + "height": 95.10852484952814, + "seed": 1378496276, + "groupIds": [ + "a-wQAbCGL36oD-cl7ibKp", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "index": "b86", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746715782337, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1570, + "versionNonce": 1003479700, + "isDeleted": false, + "id": "sOPRKKByKuHpUfdh41H9o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -35.265332878207914, + "y": 1749.6269584732972, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 96.8849563598633, + "height": 81.10823815159674, + "seed": 1689988244, + "groupIds": [ + "a-wQAbCGL36oD-cl7ibKp", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "fontSize": 15.020044102147551, + "fontFamily": 1, + "text": "Flight\nTracker\nEvent\napp", + "baseline": 34.167465732141956, + "textAlign": "center", + "verticalAlign": "top", + "index": "b87", + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "i-LhadKQBUUyTSngQgZUh", + "type": "arrow" + }, + { + "id": "5iqCtDl4dM4a7Y0cHcWm6", + "type": "arrow" + }, + { + "id": "wyn7jFw606T45JIJW2DoI", + "type": "arrow" + } + ], + "updated": 1746716107210, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Flight Tracker\nEvent\napp", + "autoResize": false, + "lineHeight": 1.3499999999999994 + }, + { + "type": "text", + "version": 1302, + "versionNonce": 206684180, + "isDeleted": false, + "id": "cSQ9v4r9ImI6AEVYpseJz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -49.01513406593074, + "y": 1869.4722822351705, + "strokeColor": "#000", + "backgroundColor": "#edf2f9", + "width": 30.979236868384554, + "height": 12.908015361826896, + "seed": 783498156, + "groupIds": [ + "3URPFA6xJushzykrjXKcL", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "boundElements": [], + "updated": 1746715782337, + "fontSize": 10.326412289461517, + "fontFamily": 1, + "text": "React", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "React", + "index": "b88", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3289, + "versionNonce": 1976081812, + "isDeleted": false, + "id": "eDUWxY-0fZBAx3wDGoyYi", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -58.81710437486777, + "y": 1804.4538736385457, + "strokeColor": "#000000", + "backgroundColor": "#454c5a", + "width": 45.36302615928901, + "height": 61.820694610165425, + "seed": 1520887340, + "groupIds": [ + "XTE7r20RYY5DcNuq_jGbs", + "i0b2N1W1rxsw70DpDMfeO", + "3URPFA6xJushzykrjXKcL", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "boundElements": [], + "updated": 1746715782337, + "index": "b89", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2805, + "versionNonce": 394775316, + "isDeleted": false, + "id": "2CpdMGqyFtVBpLDa3vOtK", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.96113561355105, + "y": 1811.9314989247534, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 37.57577711760764, + "height": 15.489618434192277, + "seed": 1338065068, + "groupIds": [ + "XTE7r20RYY5DcNuq_jGbs", + "i0b2N1W1rxsw70DpDMfeO", + "3URPFA6xJushzykrjXKcL", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "boundElements": [], + "updated": 1746715782337, + "index": "b8A", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1952, + "versionNonce": 1678067860, + "isDeleted": false, + "id": "LOU88LoXLo4l-RCXwgEoO", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -40.981054122751516, + "y": 1813.431084536737, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 30.979236868384554, + "height": 12.908015361826896, + "seed": 363612972, + "groupIds": [ + "XTE7r20RYY5DcNuq_jGbs", + "i0b2N1W1rxsw70DpDMfeO", + "3URPFA6xJushzykrjXKcL", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "boundElements": [], + "updated": 1746715782338, + "fontSize": 10.326412289461517, + "fontFamily": 1, + "text": "React", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "React", + "index": "b8B", + "frameId": null, + "roundness": null, + "link": null, + "locked": false, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "ellipse", + "version": 1223, + "versionNonce": 251074068, + "isDeleted": false, + "id": "A8J6RhQZQ4sJU5MeRwkrN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.566715780553067, + "x": -39.26072216396756, + "y": 1834.754169721522, + "strokeColor": "#00bbd4", + "backgroundColor": "#ff00", + "width": 8.429052001467532, + "height": 26.83175269624534, + "seed": 785515948, + "groupIds": [ + "Kc7jpSwZGx-os4PlJRdzd", + "i0b2N1W1rxsw70DpDMfeO", + "3URPFA6xJushzykrjXKcL", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "boundElements": [], + "updated": 1746715782338, + "index": "b8C", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1340, + "versionNonce": 1699951508, + "isDeleted": false, + "id": "iwxwmcGxt4ME-dVFXoB3K", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.5133050667589325, + "x": -39.62815330381818, + "y": 1834.7430725525485, + "strokeColor": "#00bbd4", + "backgroundColor": "#ff00", + "width": 8.429052001467532, + "height": 26.83175269624534, + "seed": 1079799852, + "groupIds": [ + "Kc7jpSwZGx-os4PlJRdzd", + "i0b2N1W1rxsw70DpDMfeO", + "3URPFA6xJushzykrjXKcL", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "boundElements": [], + "updated": 1746715782338, + "index": "b8D", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1363, + "versionNonce": 625975572, + "isDeleted": false, + "id": "pJiLVylJ8SW7MROWWgJeW", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 2.5193659458493443, + "x": -39.23766150786935, + "y": 1834.7887382947372, + "strokeColor": "#00bbd4", + "backgroundColor": "#ff00", + "width": 8.429052001467532, + "height": 26.83175269624534, + "seed": 976587436, + "groupIds": [ + "Kc7jpSwZGx-os4PlJRdzd", + "i0b2N1W1rxsw70DpDMfeO", + "3URPFA6xJushzykrjXKcL", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "boundElements": [], + "updated": 1746715782338, + "index": "b8E", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "id": "RVdOo3jSD9ShTS08ZN8fG", + "type": "ellipse", + "x": -36.30813791807407, + "y": 1847.1306312292722, + "width": 2.006214750216971, + "height": 2.006214750216971, + "angle": 0, + "strokeColor": "#00bbd4", + "backgroundColor": "#00bbd4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Kc7jpSwZGx-os4PlJRdzd", + "i0b2N1W1rxsw70DpDMfeO", + "3URPFA6xJushzykrjXKcL", + "bXVY2BGfbKtFxPqJxi9Xh" + ], + "seed": 2131186988, + "version": 860, + "versionNonce": 1449287316, + "isDeleted": false, + "boundElements": [], + "updated": 1746715782338, + "index": "b8F", + "frameId": null, + "roundness": null, + "link": null, + "locked": false + }, + { + "id": "i-LhadKQBUUyTSngQgZUh", + "type": "arrow", + "x": 72.2770157486025, + "y": 1786.9974115738837, + "width": 201, + "height": 1.9130100360041524, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8G", + "roundness": null, + "seed": 1623687212, + "version": 97, + "versionNonce": 288945172, + "isDeleted": false, + "boundElements": null, + "updated": 1746715902504, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 201, + -1.9130100360041524 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "sOPRKKByKuHpUfdh41H9o", + "focus": -0.063877974666125, + "gap": 10.657392266947113 + }, + "endBinding": { + "elementId": "v4FFMQmjn2SKQPYP0coSr", + "focus": 0.2841699553691773, + "gap": 10.653047513517208 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "nsRnbsgYOCcyvcs650GM4", + "type": "text", + "x": 131.27701574860248, + "y": 1765.4170856177716, + "width": 80.87999725341797, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8H", + "roundness": null, + "seed": 35450260, + "version": 86, + "versionNonce": 1557297940, + "isDeleted": false, + "boundElements": null, + "updated": 1746715784387, + "link": null, + "locked": false, + "text": "subscribe\nwebsocket", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "subscribe\nwebsocket", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "i9bJ-j4EmZ8Dj4oPL8cT4", + "type": "text", + "x": 399.2770157486025, + "y": 1677.4170856177716, + "width": 107.08800506591797, + "height": 40, + "angle": 4.71238898038469, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8J", + "roundness": null, + "seed": 1383387052, + "version": 183, + "versionNonce": 1991979156, + "isDeleted": false, + "boundElements": null, + "updated": 1746715908181, + "link": null, + "locked": false, + "text": "stick session\nload balancing", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "stick session\nload balancing", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ckI9IOdrA2mYrkhxY_N-s", + "type": "arrow", + "x": 358.6239682350854, + "y": 1768.4170856177716, + "width": 187.6530475135171, + "height": 152.2635527957459, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8K", + "roundness": null, + "seed": 640293804, + "version": 93, + "versionNonce": 354915988, + "isDeleted": false, + "boundElements": null, + "updated": 1746715905482, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 93.82652375675855, + 0 + ], + [ + 93.82652375675855, + -152.2635527957459 + ], + [ + 187.6530475135171, + -152.2635527957459 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "v4FFMQmjn2SKQPYP0coSr", + "focus": -0.4460031846244804, + "gap": 5, + "fixedPoint": [ + 1.0717422850956553, + 0.27699840768775935 + ] + }, + "endBinding": { + "elementId": "OuzLjTwWV2ZoafCv6MrGy", + "focus": 0.3894117647058821, + "gap": 5, + "fixedPoint": [ + -0.013736263736263734, + 0.30529411764705944 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "zoN0oyFMFPAOiMpl4JcMV", + "type": "arrow", + "x": 546.2770157486025, + "y": 1678.4170856177716, + "width": 187.6530475135171, + "height": 134.89999999999986, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8M", + "roundness": null, + "seed": 231914260, + "version": 173, + "versionNonce": 1063078804, + "isDeleted": false, + "boundElements": null, + "updated": 1746715974191, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -23, + 0 + ], + [ + -23, + 134.89999999999986 + ], + [ + -187.6530475135171, + 134.89999999999986 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "OuzLjTwWV2ZoafCv6MrGy", + "focus": -0.3431006211264233, + "gap": 5, + "fixedPoint": [ + -0.013736263736263734, + 0.671550310563212 + ] + }, + "endBinding": { + "elementId": "v4FFMQmjn2SKQPYP0coSr", + "focus": -0.0009911181880535508, + "gap": 5, + "fixedPoint": [ + 1.0717422850956553, + 0.49950444090597274 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": [ + { + "index": 2, + "start": [ + -23, + 0 + ], + "end": [ + -23, + 134.89999999999986 + ] + } + ], + "startIsSpecial": false, + "endIsSpecial": false + }, + { + "id": "Hi5QYa4h80cOYbb6Fl2pI", + "type": "text", + "x": 404.47701269684467, + "y": 1791.4170856177716, + "width": 98.57600402832031, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8N", + "roundness": null, + "seed": 1162741652, + "version": 81, + "versionNonce": 1731147436, + "isDeleted": false, + "boundElements": null, + "updated": 1746715979683, + "link": null, + "locked": false, + "text": "ping updates\nwebsocket", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ping updates\nwebsocket", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5iqCtDl4dM4a7Y0cHcWm6", + "type": "arrow", + "x": 271.9300632621197, + "y": 1823.4170856177716, + "width": 206.31043978046426, + "height": 2, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8O", + "roundness": { + "type": 2 + }, + "seed": 1874492332, + "version": 90, + "versionNonce": 747895956, + "isDeleted": false, + "boundElements": null, + "updated": 1746716032563, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -206.31043978046426, + 2 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "v4FFMQmjn2SKQPYP0coSr", + "focus": -0.09429504105704574, + "gap": 12 + }, + "endBinding": { + "elementId": "sOPRKKByKuHpUfdh41H9o", + "focus": 0.8713102169017551, + "gap": 4.000000000000043 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "o-QMWbArtvX50HKkOuoFt", + "type": "text", + "x": 105.78901678620014, + "y": 1803.4170856177716, + "width": 140.9759979248047, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8P", + "roundness": null, + "seed": 1440748948, + "version": 68, + "versionNonce": 1460086700, + "isDeleted": false, + "boundElements": null, + "updated": 1746716023321, + "link": null, + "locked": false, + "text": "ping updates\nwebsocket update", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ping updates\nwebsocket update", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "gN2KnbKlsDMfoI0KndM0e", + "type": "arrow", + "x": 358.6239682350854, + "y": 1855.4170856177718, + "width": 183.6530475135171, + "height": 146.99999999999955, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8Q", + "roundness": null, + "seed": 2138116396, + "version": 116, + "versionNonce": 2067573932, + "isDeleted": false, + "boundElements": null, + "updated": 1746716080625, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 91.82652375675855, + 0 + ], + [ + 91.82652375675855, + 146.99999999999955 + ], + [ + 183.6530475135171, + 146.99999999999955 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "v4FFMQmjn2SKQPYP0coSr", + "focus": 0.13072015141636462, + "gap": 10.653047513517095, + "fixedPoint": [ + 1.0717422850956553, + 0.708134819491427 + ] + }, + "endBinding": { + "elementId": "8DGNpmjera-6zBEeUch3F", + "focus": -0.6716417910447737, + "gap": 5, + "fixedPoint": [ + -0.013736263736263734, + 0.8358208955223874 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "TLaJvX-y2lUdDveQuecqT", + "type": "text", + "x": 396.7330132156435, + "y": 1896.4170856177716, + "width": 107.08800506591797, + "height": 40, + "angle": 4.71238898038469, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8R", + "roundness": null, + "seed": 1326700692, + "version": 122, + "versionNonce": 1916661140, + "isDeleted": false, + "boundElements": null, + "updated": 1746716072741, + "link": null, + "locked": false, + "text": "round robin\nload balancing", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "round robin\nload balancing", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wyn7jFw606T45JIJW2DoI", + "type": "arrow", + "x": 32.27701574860248, + "y": 1835.735196624894, + "width": 246.6530475135172, + "height": 46.68188899287793, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8S", + "roundness": null, + "seed": 73998740, + "version": 11, + "versionNonce": 106852372, + "isDeleted": false, + "boundElements": null, + "updated": 1746716107210, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 46.68188899287793 + ], + [ + 246.6530475135172, + 46.68188899287793 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "sOPRKKByKuHpUfdh41H9o", + "focus": -0.3942793838072295, + "gap": 5, + "fixedPoint": [ + 0.6971396919036161, + 1.0616460191214434 + ] + }, + "endBinding": { + "elementId": "v4FFMQmjn2SKQPYP0coSr", + "focus": -0.6838715497575465, + "gap": 5, + "fixedPoint": [ + -0.07174228509565511, + 0.8419357748787717 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "VWnAy1bX3ukGmGdywHN-_", + "type": "text", + "x": 112.75701910553607, + "y": 1882.4170856177716, + "width": 103.03999328613281, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8T", + "roundness": null, + "seed": 86754836, + "version": 99, + "versionNonce": 1053476012, + "isDeleted": false, + "boundElements": null, + "updated": 1746716125496, + "link": null, + "locked": false, + "text": "http api calls", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "http api calls", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PWIdD2hoh83yxm1oc695T", + "type": "line", + "x": 1139.37219984494, + "y": 2127.148032730527, + "width": 52.317507746132115, + "height": 154.56722543646003, + "angle": 1.5707963267948957, + "strokeColor": "#087f5b", + "backgroundColor": "#40c057", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sB6OaNzmSzs62vrIDDMCF", + "HL2APcqJNqqcBB8ffqgkV", + "FUtIwUO8b6idlyeNFO8Kg" + ], + "seed": 658687532, + "version": 4989, + "versionNonce": 768592044, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.1725162731731403, + 116.82107121890462 + ], + [ + 0.008073356596080744, + 130.12064288619618 + ], + [ + 2.694467356765587, + 135.86722334556717 + ], + [ + 12.049700419984944, + 140.7306911579349 + ], + [ + 27.86269432990675, + 142.2451023824676 + ], + [ + 42.97096432627199, + 139.82712302629713 + ], + [ + 50.998099415101294, + 134.0445691284302 + ], + [ + 52.13021819883883, + 129.16981553143583 + ], + [ + 52.28922018370778, + 118.46242736729553 + ], + [ + 52.16442211418855, + 9.800635828982735 + ], + [ + 51.88308720685254, + -0.46590137319512337 + ], + [ + 48.52377541516831, + -6.203936550968926 + ], + [ + 41.449781688403746, + -9.527102901326515 + ], + [ + 25.329105770103325, + -12.322123053992442 + ], + [ + 12.404412180527922, + -10.655446243436785 + ], + [ + 2.239228448568725, + -5.00228186200372 + ], + [ + -0.028287562424331975, + -0.07019354973772352 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b8U", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746716152236, + "link": null, + "locked": false + }, + { + "id": "G499XsDNZ1HMh8Vesy2ZI", + "type": "line", + "x": 1114.844789440583, + "y": 2186.2529892880925, + "width": 50.7174766392476, + "height": 12.698053371678215, + "angle": 1.5707963267948957, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sB6OaNzmSzs62vrIDDMCF", + "HL2APcqJNqqcBB8ffqgkV", + "FUtIwUO8b6idlyeNFO8Kg" + ], + "seed": 1575035052, + "version": 2628, + "versionNonce": 779053076, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.3361877396713384, + 5.061656285093649 + ], + [ + 7.098613049589299, + 9.308339392337079 + ], + [ + 14.766422451441104, + 11.880105003906111 + ], + [ + 26.779003528407447, + 12.114458425450186 + ], + [ + 40.79727342221974, + 10.477131310135727 + ], + [ + 48.98410145879092, + 4.5205722256349645 + ], + [ + 50.7174766392476, + -0.5835949462280285 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b8V", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746716152236, + "link": null, + "locked": false + }, + { + "id": "gqzYp7jDQLAwLZGq0tZ0i", + "type": "line", + "x": 1160.2705705890248, + "y": 2186.5920744130926, + "width": 50.57247907260371, + "height": 10.178760037658167, + "angle": 1.5707963267948957, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sB6OaNzmSzs62vrIDDMCF", + "HL2APcqJNqqcBB8ffqgkV", + "FUtIwUO8b6idlyeNFO8Kg" + ], + "seed": 349186860, + "version": 2761, + "versionNonce": 1084871468, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.332367676378171, + 4.05742385947015 + ], + [ + 7.078318632616268, + 7.4615651903783 + ], + [ + 14.724206326638113, + 9.523092596748189 + ], + [ + 26.70244431044034, + 9.710950307853885 + ], + [ + 40.68063699304561, + 8.398468833558885 + ], + [ + 48.84405948536458, + 3.623690858023169 + ], + [ + 50.57247907260371, + -0.4678097298042818 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b8W", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746716152236, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5726, + "versionNonce": 1441875348, + "isDeleted": false, + "id": "T8JsLo6W0epNWzKrwTqkL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1206.8753437211399, + "y": 2180.738878492204, + "strokeColor": "#087f5b", + "backgroundColor": "#fff", + "width": 51.27812853552538, + "height": 22.797152568995934, + "seed": 1585046956, + "groupIds": [ + "sB6OaNzmSzs62vrIDDMCF", + "HL2APcqJNqqcBB8ffqgkV", + "FUtIwUO8b6idlyeNFO8Kg" + ], + "index": "b8X", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746716152236, + "link": null, + "locked": false + }, + { + "id": "HZrpnO9pGTDp3Hn7FyiDE", + "type": "text", + "x": 1120.2770157486025, + "y": 2221.4170856177716, + "width": 85.7919921875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "HL2APcqJNqqcBB8ffqgkV", + "FUtIwUO8b6idlyeNFO8Kg" + ], + "frameId": null, + "index": "b8Y", + "roundness": null, + "seed": 863551276, + "version": 87, + "versionNonce": 819891628, + "isDeleted": false, + "boundElements": null, + "updated": 1746716152236, + "link": null, + "locked": false, + "text": "flight-data", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "flight-data", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "UBkqnfdnrVrquZGgbgDnM", + "type": "text", + "x": 1111.2770157486025, + "y": 2146.4170856177716, + "width": 92.75200653076172, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "HL2APcqJNqqcBB8ffqgkV", + "FUtIwUO8b6idlyeNFO8Kg" + ], + "frameId": null, + "index": "b8Z", + "roundness": null, + "seed": 30987436, + "version": 94, + "versionNonce": 1012626196, + "isDeleted": false, + "boundElements": null, + "updated": 1746716152236, + "link": null, + "locked": false, + "text": "Kafka Topic", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka Topic", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "ellipse", + "version": 215, + "versionNonce": 1603794988, + "isDeleted": false, + "id": "wP4gtaApUjhUsUJgeutRx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1215.2770157486025, + "y": 2150.4170856177716, + "strokeColor": "#000000", + "backgroundColor": "#62a1d6", + "width": 39, + "height": 39, + "seed": 250617748, + "groupIds": [ + "DTKRFzXrCHnK-ly4QnaLt", + "FUtIwUO8b6idlyeNFO8Kg" + ], + "index": "b8a", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746716152236, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2118, + "versionNonce": 2355348, + "isDeleted": false, + "id": "QY3K_u0wrmjp5Z6mJckvq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1220.4238278291393, + "y": 2163.3140024602676, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 26.076825437972833, + "height": 25.574664429530202, + "seed": 1684999444, + "groupIds": [ + "DTKRFzXrCHnK-ly4QnaLt", + "FUtIwUO8b6idlyeNFO8Kg" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.1045163344207328, + 11.55579873459892 + ], + [ + 6.166463730823237, + 11.61005131081769 + ], + [ + 6.260528431801892, + 7.172190576121962 + ], + [ + 18.384423224606902, + 15.657293496738262 + ], + [ + 17.506486015472742, + 17.284870783301493 + ], + [ + 21.509461623786812, + 18.033556335120576 + ], + [ + 21.509461623786812, + 19.74793774363384 + ], + [ + 26.06637380453076, + 19.520076923514992 + ], + [ + 26.076825437972833, + 14.810953307725379 + ], + [ + 21.54081652411303, + 14.865205883944155 + ], + [ + 21.51991325722888, + 16.24322131990103 + ], + [ + 19.795393739286787, + 13.422087356524761 + ], + [ + 18.927908163594708, + 14.626494548581547 + ], + [ + 8.50762962184765, + 6.792422542590541 + ], + [ + 17.360163147283714, + 6.781572027346791 + ], + [ + 17.307904980073356, + 8.040231795622352 + ], + [ + 21.19591262052461, + 6.781572027346791 + ], + [ + 21.19591262052461, + 9.027628682804044 + ], + [ + 26.02456727076248, + 8.995077137072776 + ], + [ + 26.076825437972833, + 4.123195792626847 + ], + [ + 21.216815887408753, + 4.123195792626847 + ], + [ + 21.143654453314245, + 5.631417411508772 + ], + [ + 17.318356613515423, + 4.090644246895582 + ], + [ + 17.401969681052005, + 5.132293710296048 + ], + [ + 8.612145956268382, + 5.034639073102255 + ], + [ + 18.635262427216652, + -0.7920876127941049 + ], + [ + 19.398231668488016, + 0.36891751828766517 + ], + [ + 21.185460987082543, + -2.3111597469197847 + ], + [ + 21.19591262052461, + -0.8137886432816146 + ], + [ + 25.98276073699417, + -0.7703865823065947 + ], + [ + 25.95140583666795, + -5.772474109677585 + ], + [ + 21.070493019219732, + -5.82672668589636 + ], + [ + 21.028686485451434, + -3.7976803353141997 + ], + [ + 17.485582748588595, + -3.21175251215144 + ], + [ + 17.997712787250187, + -1.7794844999757968 + ], + [ + 6.2187218980336025, + 4.93698443590846 + ], + [ + 6.061947396402502, + 0 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b8b", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746716152236, + "link": null, + "locked": false + }, + { + "id": "SjZkbdIkH4aJ9pT9e8WOx", + "type": "line", + "x": 1139.5892717150623, + "y": 1601.6480327305271, + "width": 52.317507746132115, + "height": 154.56722543646003, + "angle": 1.5707963267948957, + "strokeColor": "#087f5b", + "backgroundColor": "#40c057", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jgsF3zQqT0zw8MeTu8vzq", + "q1_Vfo_owMcGo1A16_pK_", + "_cnbqbNRa7YglLspDyCdj" + ], + "seed": 1653986324, + "version": 5202, + "versionNonce": 1182238380, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.1725162731731403, + 116.82107121890462 + ], + [ + 0.008073356596080744, + 130.12064288619618 + ], + [ + 2.694467356765587, + 135.86722334556717 + ], + [ + 12.049700419984944, + 140.7306911579349 + ], + [ + 27.86269432990675, + 142.2451023824676 + ], + [ + 42.97096432627199, + 139.82712302629713 + ], + [ + 50.998099415101294, + 134.0445691284302 + ], + [ + 52.13021819883883, + 129.16981553143583 + ], + [ + 52.28922018370778, + 118.46242736729553 + ], + [ + 52.16442211418855, + 9.800635828982735 + ], + [ + 51.88308720685254, + -0.46590137319512337 + ], + [ + 48.52377541516831, + -6.203936550968926 + ], + [ + 41.449781688403746, + -9.527102901326515 + ], + [ + 25.329105770103325, + -12.322123053992442 + ], + [ + 12.404412180527922, + -10.655446243436785 + ], + [ + 2.239228448568725, + -5.00228186200372 + ], + [ + -0.028287562424331975, + -0.07019354973772352 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b8c", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746716162407, + "link": null, + "locked": false + }, + { + "id": "v3Io81zDfk-mWJvQFbjCM", + "type": "line", + "x": 1115.0618613107054, + "y": 1660.752989288092, + "width": 50.7174766392476, + "height": 12.698053371678215, + "angle": 1.5707963267948957, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jgsF3zQqT0zw8MeTu8vzq", + "q1_Vfo_owMcGo1A16_pK_", + "_cnbqbNRa7YglLspDyCdj" + ], + "seed": 308949396, + "version": 2841, + "versionNonce": 598379028, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.3361877396713384, + 5.061656285093649 + ], + [ + 7.098613049589299, + 9.308339392337079 + ], + [ + 14.766422451441104, + 11.880105003906111 + ], + [ + 26.779003528407447, + 12.114458425450186 + ], + [ + 40.79727342221974, + 10.477131310135727 + ], + [ + 48.98410145879092, + 4.5205722256349645 + ], + [ + 50.7174766392476, + -0.5835949462280285 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b8d", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746716162407, + "link": null, + "locked": false + }, + { + "id": "rXrxPkpabYNpa6qI0qQyU", + "type": "line", + "x": 1160.487642459147, + "y": 1661.0920744130926, + "width": 50.57247907260371, + "height": 10.178760037658167, + "angle": 1.5707963267948957, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jgsF3zQqT0zw8MeTu8vzq", + "q1_Vfo_owMcGo1A16_pK_", + "_cnbqbNRa7YglLspDyCdj" + ], + "seed": 1389813524, + "version": 2974, + "versionNonce": 698994988, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.332367676378171, + 4.05742385947015 + ], + [ + 7.078318632616268, + 7.4615651903783 + ], + [ + 14.724206326638113, + 9.523092596748189 + ], + [ + 26.70244431044034, + 9.710950307853885 + ], + [ + 40.68063699304561, + 8.398468833558885 + ], + [ + 48.84405948536458, + 3.623690858023169 + ], + [ + 50.57247907260371, + -0.4678097298042818 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b8e", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1746716162407, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5939, + "versionNonce": 2071472020, + "isDeleted": false, + "id": "GP5zlHF1abshR8e2IPZKH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1207.0924155912621, + "y": 1655.238878492204, + "strokeColor": "#087f5b", + "backgroundColor": "#fff", + "width": 51.27812853552538, + "height": 22.797152568995934, + "seed": 206691476, + "groupIds": [ + "jgsF3zQqT0zw8MeTu8vzq", + "q1_Vfo_owMcGo1A16_pK_", + "_cnbqbNRa7YglLspDyCdj" + ], + "index": "b8f", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746716162407, + "link": null, + "locked": false + }, + { + "id": "Rxa_qO8XEPEc81rmk8J43", + "type": "text", + "x": 1120.4940876187247, + "y": 1695.9170856177716, + "width": 95.63199615478516, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "q1_Vfo_owMcGo1A16_pK_", + "_cnbqbNRa7YglLspDyCdj" + ], + "frameId": null, + "index": "b8g", + "roundness": null, + "seed": 680602132, + "version": 312, + "versionNonce": 892259244, + "isDeleted": false, + "boundElements": [], + "updated": 1746716162407, + "link": null, + "locked": false, + "text": "ping-created", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ping-created", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "l3fFnym04IthPXaqetUQl", + "type": "text", + "x": 1111.4940876187247, + "y": 1620.9170856177716, + "width": 92.75200653076172, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "q1_Vfo_owMcGo1A16_pK_", + "_cnbqbNRa7YglLspDyCdj" + ], + "frameId": null, + "index": "b8h", + "roundness": null, + "seed": 1787479956, + "version": 307, + "versionNonce": 313922836, + "isDeleted": false, + "boundElements": [], + "updated": 1746716162407, + "link": null, + "locked": false, + "text": "Kafka Topic", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka Topic", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "ellipse", + "version": 313, + "versionNonce": 724596268, + "isDeleted": false, + "id": "7dcmyGlMv6JSTSsfT62DK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1214.7770157486025, + "y": 1618.9170856177716, + "strokeColor": "#000000", + "backgroundColor": "#62a1d6", + "width": 39, + "height": 39, + "seed": 590643756, + "groupIds": [ + "G-LfwdcdCPPOrFp3lK-av", + "rVeM-gSbciJX3U8R7vYjo", + "_cnbqbNRa7YglLspDyCdj" + ], + "index": "b8i", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746716162407, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2216, + "versionNonce": 920277652, + "isDeleted": false, + "id": "mTTbCeqJyliz1U4-Y7ahB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1219.923827829139, + "y": 1631.8140024602671, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 26.076825437972833, + "height": 25.574664429530202, + "seed": 1815829676, + "groupIds": [ + "G-LfwdcdCPPOrFp3lK-av", + "rVeM-gSbciJX3U8R7vYjo", + "_cnbqbNRa7YglLspDyCdj" + ], + "startBinding": null, + "endBinding": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.1045163344207328, + 11.55579873459892 + ], + [ + 6.166463730823237, + 11.61005131081769 + ], + [ + 6.260528431801892, + 7.172190576121962 + ], + [ + 18.384423224606902, + 15.657293496738262 + ], + [ + 17.506486015472742, + 17.284870783301493 + ], + [ + 21.509461623786812, + 18.033556335120576 + ], + [ + 21.509461623786812, + 19.74793774363384 + ], + [ + 26.06637380453076, + 19.520076923514992 + ], + [ + 26.076825437972833, + 14.810953307725379 + ], + [ + 21.54081652411303, + 14.865205883944155 + ], + [ + 21.51991325722888, + 16.24322131990103 + ], + [ + 19.795393739286787, + 13.422087356524761 + ], + [ + 18.927908163594708, + 14.626494548581547 + ], + [ + 8.50762962184765, + 6.792422542590541 + ], + [ + 17.360163147283714, + 6.781572027346791 + ], + [ + 17.307904980073356, + 8.040231795622352 + ], + [ + 21.19591262052461, + 6.781572027346791 + ], + [ + 21.19591262052461, + 9.027628682804044 + ], + [ + 26.02456727076248, + 8.995077137072776 + ], + [ + 26.076825437972833, + 4.123195792626847 + ], + [ + 21.216815887408753, + 4.123195792626847 + ], + [ + 21.143654453314245, + 5.631417411508772 + ], + [ + 17.318356613515423, + 4.090644246895582 + ], + [ + 17.401969681052005, + 5.132293710296048 + ], + [ + 8.612145956268382, + 5.034639073102255 + ], + [ + 18.635262427216652, + -0.7920876127941049 + ], + [ + 19.398231668488016, + 0.36891751828766517 + ], + [ + 21.185460987082543, + -2.3111597469197847 + ], + [ + 21.19591262052461, + -0.8137886432816146 + ], + [ + 25.98276073699417, + -0.7703865823065947 + ], + [ + 25.95140583666795, + -5.772474109677585 + ], + [ + 21.070493019219732, + -5.82672668589636 + ], + [ + 21.028686485451434, + -3.7976803353141997 + ], + [ + 17.485582748588595, + -3.21175251215144 + ], + [ + 17.997712787250187, + -1.7794844999757968 + ], + [ + 6.2187218980336025, + 4.93698443590846 + ], + [ + 6.061947396402502, + 0 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "index": "b8j", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1746716162407, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 934, + "versionNonce": 1840874772, + "isDeleted": false, + "id": "m11Mkgu4knsdBw3C8olqz", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -9.857164249874131, + "y": 2165.6873322879915, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 37.26835999695436, + "height": 69.56760532764793, + "seed": 350066452, + "groupIds": [ + "TpT5Qy9f9a_z6njDw7zGI" + ], + "boundElements": [ + { + "id": "KAhEGRMTcuXIMxoT8Fqx8", + "type": "arrow" + } + ], + "updated": 1746716293455, + "link": null, + "locked": false, + "index": "b8k", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 1496, + "versionNonce": 998395924, + "isDeleted": false, + "id": "Q5RZwRmTkLnROPP215143", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -22.72298425139752, + "y": 2245.1468389475513, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 75.93999481201172, + "height": 50, + "seed": 1287754900, + "groupIds": [ + "TpT5Qy9f9a_z6njDw7zGI" + ], + "boundElements": [], + "updated": 1746716293455, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "OpenSky\nAPI", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "OpenSky\nAPI", + "index": "b8l", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "line", + "version": 778, + "versionNonce": 275197332, + "isDeleted": false, + "id": "0VbEvAcBqTuQMRsgcwMw_", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -5.3726069167437345, + "y": 2173.383282953947, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 28.572409330998198, + "height": 2.2737367544323206e-13, + "seed": 843702804, + "groupIds": [ + "TpT5Qy9f9a_z6njDw7zGI" + ], + "boundElements": [], + "updated": 1746716293455, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 28.572409330998198, + 2.2737367544323206e-13 + ] + ], + "index": "b8m", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "line", + "version": 810, + "versionNonce": 2144623380, + "isDeleted": false, + "id": "ySLRlODhHgEofcDb5iD94", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -5.509188916896619, + "y": 2179.7870807315558, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 28.572409330998198, + "height": 2.2737367544323206e-13, + "seed": 745308052, + "groupIds": [ + "TpT5Qy9f9a_z6njDw7zGI" + ], + "boundElements": [], + "updated": 1746716293455, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 28.572409330998198, + 2.2737367544323206e-13 + ] + ], + "index": "b8n", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "line", + "version": 792, + "versionNonce": 876599444, + "isDeleted": false, + "id": "CnBSN3EOL6q4nFOwqdQCQ", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -5.540074250635826, + "y": 2186.1908785091646, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 28.572409330998198, + "height": 2.2737367544323206e-13, + "seed": 1398762772, + "groupIds": [ + "TpT5Qy9f9a_z6njDw7zGI" + ], + "boundElements": [], + "updated": 1746716293455, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 28.572409330998198, + 2.2737367544323206e-13 + ] + ], + "index": "b8o", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "line", + "version": 796, + "versionNonce": 425698836, + "isDeleted": false, + "id": "6cPwOpaiVAT6nijP__pn5", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -5.540074250635826, + "y": 2192.5946762867734, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 28.572409330998198, + "height": 2.2737367544323206e-13, + "seed": 1217964692, + "groupIds": [ + "TpT5Qy9f9a_z6njDw7zGI" + ], + "boundElements": [], + "updated": 1746716293455, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 28.572409330998198, + 2.2737367544323206e-13 + ] + ], + "index": "b8p", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "id": "KAhEGRMTcuXIMxoT8Fqx8", + "type": "arrow", + "x": 547.7716586755959, + "y": 2208.1448568574383, + "width": 515.3604629285156, + "height": 1.0527472105686684, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8q", + "roundness": null, + "seed": 722823444, + "version": 99, + "versionNonce": 875152276, + "isDeleted": false, + "boundElements": null, + "updated": 1746716293472, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -515.3604629285156, + -1.0527472105686684 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "RnKoAn6_KNEEoUOql5kgB", + "focus": -0.2062592434581468, + "gap": 5 + }, + "endBinding": { + "elementId": "m11Mkgu4knsdBw3C8olqz", + "focus": 0.1890743366504696, + "gap": 5 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "8Z2Em1s7N1zcmTbtXg4f-", + "type": "text", + "x": 367.0770188003603, + "y": 2188.4170856177716, + "width": 154.39999389648438, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8r", + "roundness": null, + "seed": 719453204, + "version": 133, + "versionNonce": 1678919060, + "isDeleted": false, + "boundElements": null, + "updated": 1746716324090, + "link": null, + "locked": false, + "text": "http api calls\nflight data updates", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "http api calls\nflight data updates", + "autoResize": true, + "lineHeight": 1.25 } ], "appState": { diff --git a/docs/arch_diagram_datasource_read_write.png b/docs/diagrams/arch_diagram_datasource_read_write.png similarity index 100% rename from docs/arch_diagram_datasource_read_write.png rename to docs/diagrams/arch_diagram_datasource_read_write.png diff --git a/docs/arch_diagram_datasource_routing.png b/docs/diagrams/arch_diagram_datasource_routing.png similarity index 100% rename from docs/arch_diagram_datasource_routing.png rename to docs/diagrams/arch_diagram_datasource_routing.png diff --git a/docs/diagrams/arch_diagram_load_balancing.png b/docs/diagrams/arch_diagram_load_balancing.png new file mode 100644 index 0000000..be94b1b Binary files /dev/null and b/docs/diagrams/arch_diagram_load_balancing.png differ diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/flightdata/infrastructure/config/FlightDataConfig.java b/src/main/java/dev/luismachadoreis/flighttracker/server/flightdata/infrastructure/config/FlightDataConfig.java new file mode 100644 index 0000000..8e16582 --- /dev/null +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/flightdata/infrastructure/config/FlightDataConfig.java @@ -0,0 +1,20 @@ +package dev.luismachadoreis.flighttracker.server.flightdata.infrastructure.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import lombok.Getter; +import lombok.Setter; + +@Configuration +@ConfigurationProperties(prefix = "app.flight-data") +@Getter +@Setter +public class FlightDataConfig { + private Subscriber subscriber = new Subscriber(); + + @Getter + @Setter + public static class Subscriber { + private boolean enabled = true; + } +} \ No newline at end of file diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/flightdata/infrastructure/pubsub/FlightDataSubscriber.java b/src/main/java/dev/luismachadoreis/flighttracker/server/flightdata/infrastructure/pubsub/FlightDataSubscriber.java index efecae4..cc993ce 100644 --- a/src/main/java/dev/luismachadoreis/flighttracker/server/flightdata/infrastructure/pubsub/FlightDataSubscriber.java +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/flightdata/infrastructure/pubsub/FlightDataSubscriber.java @@ -8,10 +8,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -@Service @Slf4j +@Service @RequiredArgsConstructor +@ConditionalOnProperty(prefix = "app.flight-data.subscriber", name = "enabled", havingValue = "true") public class FlightDataSubscriber { private final SpringCommanderMediator mediator; diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/application/CreatePingCommandHandler.java b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/application/CreatePingCommandHandler.java index 85642fb..64ce9e3 100644 --- a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/application/CreatePingCommandHandler.java +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/application/CreatePingCommandHandler.java @@ -1,7 +1,6 @@ package dev.luismachadoreis.flighttracker.server.ping.application; import dev.luismachadoreis.blueprint.cqs.command.CommandHandler; -import dev.luismachadoreis.flighttracker.server.ping.domain.Ping; import dev.luismachadoreis.flighttracker.server.ping.domain.PingRepository; import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingMapper; import org.springframework.stereotype.Component; diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/PingEventConsumerConfig.java b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/PingEventConsumerConfig.java new file mode 100644 index 0000000..b279bd0 --- /dev/null +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/PingEventConsumerConfig.java @@ -0,0 +1,38 @@ +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.config; + +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; + +import java.util.Map; + +@Configuration +public class PingEventConsumerConfig { + + private final Map properties; + + public PingEventConsumerConfig(@Qualifier("kafkaListenerContainerFactoryProperties") Map properties) { + this.properties = properties; + } + + @Bean(name = "pingEventConsumerFactory") + public ConsumerFactory consumerFactory() { + return new DefaultKafkaConsumerFactory<>( + properties, + new StringDeserializer(), + new StringDeserializer() + ); + } + + @Bean(name = "pingEventKafkaListenerContainerFactory") + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = + new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory()); + return factory; + } +} \ No newline at end of file diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesConfig.java b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/WebSocketConfig.java similarity index 54% rename from src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesConfig.java rename to src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/WebSocketConfig.java index 18e1081..b3f1316 100644 --- a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesConfig.java +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/WebSocketConfig.java @@ -1,36 +1,32 @@ -package dev.luismachadoreis.flighttracker.server.ping.infrastructure.websocket; +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.config; import org.springframework.context.annotation.Configuration; +import org.springframework.lang.NonNull; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import dev.luismachadoreis.flighttracker.server.ping.infrastructure.websocket.MapUpdatesHandler; +import lombok.AllArgsConstructor; /** - * Configures the WebSocket endpoints and handlers. + * Configuration for the WebSocket server. */ @Configuration @EnableWebSocket -public class MapUpdatesConfig implements WebSocketConfigurer { - +@AllArgsConstructor +@ConditionalOnProperty(prefix = "app.ping.websocket", name = "enabled", havingValue = "true") +public class WebSocketConfig implements WebSocketConfigurer { private final MapUpdatesHandler mapUpdatesHandler; - /** - * Constructor for MapUpdatesConfig. - * - * @param mapUpdatesHandler the handler for map updates - */ - public MapUpdatesConfig(MapUpdatesHandler mapUpdatesHandler) { - this.mapUpdatesHandler = mapUpdatesHandler; - } - /** * Registers the WebSocket handlers. * * @param registry the WebSocket handler registry */ @Override - public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + public void registerWebSocketHandlers(@NonNull WebSocketHandlerRegistry registry) { registry.addHandler(mapUpdatesHandler, "/map-updates").setAllowedOrigins("*"); } -} +} \ No newline at end of file diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/WebSocketThreadPoolConfig.java b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/WebSocketThreadPoolConfig.java new file mode 100644 index 0000000..92cc6db --- /dev/null +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/config/WebSocketThreadPoolConfig.java @@ -0,0 +1,26 @@ +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Configuration for the WebSocket thread pool using virtual threads. + */ +@Configuration +@ConditionalOnBean(WebSocketConfig.class) +public class WebSocketThreadPoolConfig { + + /** + * Creates a new executor service using virtual threads. + * + * @return the new executor service + */ + @Bean + public ExecutorService webSocketExecutorService() { + return Executors.newVirtualThreadPerTaskExecutor(); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventConsumer.java b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventConsumer.java new file mode 100644 index 0000000..b66ccb5 --- /dev/null +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventConsumer.java @@ -0,0 +1,41 @@ +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.pubsub; + +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.util.StringUtils; + +import dev.luismachadoreis.flighttracker.server.ping.infrastructure.websocket.MapUpdatesHandler; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * Consumes ping events from Kafka and forwards them to WebSocket clients. + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(prefix = "app.ping.websocket", name = "enabled", havingValue = "true") +public class PingEventConsumer { + + private final MapUpdatesHandler mapUpdatesHandler; + + /** + * Consumes ping created events from Kafka and forwards them to WebSocket clients. + * + * @param message the ping created event as JSON string + */ + @KafkaListener( + topics = "${spring.kafka.topic.ping-created}", + groupId = "${spring.kafka.consumer.group-id}", + containerFactory = "pingEventKafkaListenerContainerFactory" + ) + public void consumePingCreated(String message) { + log.debug("Received ping created event from Kafka: {}", message); + if (StringUtils.hasText(message)) { + mapUpdatesHandler.sendMessage(message); + } else { + log.debug("Skipping empty or null message"); + } + } +} \ No newline at end of file diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisher.java b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisher.java index 9b26ba3..0f60b52 100644 --- a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisher.java +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisher.java @@ -3,26 +3,41 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.beans.factory.annotation.Value; import dev.luismachadoreis.flighttracker.server.common.utils.JsonUtils; import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingDTO; import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingMapper; import dev.luismachadoreis.flighttracker.server.ping.domain.PingCreatedEvent; -import dev.luismachadoreis.flighttracker.server.ping.infrastructure.websocket.MapUpdatesHandler; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; /** - * Publishes PingCreated events to the MapUpdatesHandler. + * Publishes PingCreated events to Kafka. */ @Slf4j @Component -@AllArgsConstructor +@ConditionalOnProperty(prefix = "app.ping.publisher", name = "enabled", havingValue = "true") public class PingEventPublisher { private final PingMapper pingMapper; - private final MapUpdatesHandler mapUpdatesHandler; + private final KafkaTemplate kafkaTemplate; private final JsonUtils jsonUtils; + private final String pingCreatedTopic; + + public PingEventPublisher( + final PingMapper pingMapper, + final KafkaTemplate kafkaTemplate, + final JsonUtils jsonUtils, + @Value("${spring.kafka.topic.ping-created}") + final String pingCreatedTopic + ) { + this.pingMapper = pingMapper; + this.kafkaTemplate = kafkaTemplate; + this.jsonUtils = jsonUtils; + this.pingCreatedTopic = pingCreatedTopic; + } /** * Handles PingCreated events. @@ -31,7 +46,8 @@ public class PingEventPublisher { @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void handlePingCreated(PingCreatedEvent event) { PingDTO pingDTO = pingMapper.toDTO(event.ping()); - mapUpdatesHandler.sendMessage(jsonUtils.toJson(pingDTO)); + String message = jsonUtils.toJson(pingDTO); + kafkaTemplate.send(pingCreatedTopic, message); + log.debug("Published ping created event to Kafka topic {}: {}", pingCreatedTopic, message); } - } \ No newline at end of file diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherByPassingKafka.java b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherByPassingKafka.java new file mode 100644 index 0000000..046e505 --- /dev/null +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherByPassingKafka.java @@ -0,0 +1,40 @@ +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.pubsub; + +import org.springframework.stereotype.Component; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.util.StringUtils; +import org.springframework.transaction.event.TransactionalEventListener; +import org.springframework.transaction.event.TransactionPhase; + +import dev.luismachadoreis.flighttracker.server.ping.infrastructure.websocket.MapUpdatesHandler; +import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingMapper; +import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingDTO; +import dev.luismachadoreis.flighttracker.server.common.utils.JsonUtils; +import dev.luismachadoreis.flighttracker.server.ping.domain.PingCreatedEvent; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnExpression("${app.ping.publisher.enabled:false} == false and ${app.ping.websocket.enabled:false} == true") +public class PingEventPublisherByPassingKafka { + + private final MapUpdatesHandler mapUpdatesHandler; + private final PingMapper pingMapper; + private final JsonUtils jsonUtils; + + /** + * Handles PingCreated events. + * @param event the PingCreated event + */ + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void handlePingCreated(PingCreatedEvent event) { + PingDTO pingDTO = pingMapper.toDTO(event.ping()); + String message = jsonUtils.toJson(pingDTO); + mapUpdatesHandler.sendMessage(message); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesHandler.java b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesHandler.java index 286c311..96512a9 100644 --- a/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesHandler.java +++ b/src/main/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesHandler.java @@ -9,25 +9,33 @@ import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; - +import org.springframework.lang.NonNull; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import lombok.extern.slf4j.Slf4j; +import lombok.AllArgsConstructor; +import java.util.concurrent.ExecutorService; /** - * Handles the WebSocket connection for map updates. + * Handles WebSocket connections and message sending for map updates. */ @Slf4j @Component +@AllArgsConstructor +@ConditionalOnProperty(prefix = "app.ping.websocket", name = "enabled", havingValue = "true") public class MapUpdatesHandler extends TextWebSocketHandler { private static final Set sessions = new HashSet<>(); + private final ExecutorService executor; + /** * Adds a new WebSocket session to the set of active sessions. * * @param session the WebSocket session to add * @throws Exception if an error occurs */ - public void afterConnectionEstablished(WebSocketSession session) throws Exception { + @Override + public void afterConnectionEstablished(@NonNull WebSocketSession session) throws Exception { sessions.add(session); } @@ -37,7 +45,8 @@ public void afterConnectionEstablished(WebSocketSession session) throws Exceptio * @param session the WebSocket session to remove * @throws Exception if an error occurs */ - public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { + @Override + public void afterConnectionClosed(@NonNull WebSocketSession session, @NonNull CloseStatus status) throws Exception { sessions.remove(session); } @@ -46,14 +55,34 @@ public void afterConnectionClosed(WebSocketSession session, CloseStatus status) * * @param message the message to send */ - public void sendMessage(String message) { - sessions.forEach(session -> { - try { - session.sendMessage(new TextMessage(message)); - } catch (IOException e) { - log.error("Error sending message to session: {}", session.getId(), e); - } - }); + public void sendMessage(String message) { + if (sessions.isEmpty()) { + return; + } + + log.debug("Sending message to {} sessions", sessions.size()); + + sessions.forEach(session -> + executor.submit(() -> sendMessageToSession(message, session)) + ); + } + + /** + * Sends a message to a specific WebSocket session. + * + * @param message the message to send + * @param session the WebSocket session to send the message to + */ + private void sendMessageToSession(String message, WebSocketSession session) { + if (session == null || !session.isOpen()) { + return; + } + + try { + session.sendMessage(new TextMessage(message)); + } catch (IOException e) { + log.error("Error sending message to session: {}", session.getId(), e); + } } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 04a6395..d3bf2f1 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -93,4 +93,15 @@ app: read-write-routing: enabled: false clock: - timezone: UTC \ No newline at end of file + timezone: UTC + flight-data: + subscriber: + enabled: true + ping: + subscriber: + enabled: true + publisher: + enabled: false + websocket: + enabled: true + diff --git a/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventConsumerTest.java b/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventConsumerTest.java new file mode 100644 index 0000000..2e78c31 --- /dev/null +++ b/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventConsumerTest.java @@ -0,0 +1,55 @@ +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.pubsub; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import dev.luismachadoreis.flighttracker.server.ping.infrastructure.websocket.MapUpdatesHandler; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class PingEventConsumerTest { + + @Mock + private MapUpdatesHandler mapUpdatesHandler; + + private PingEventConsumer pingKafkaConsumer; + + @BeforeEach + void setUp() { + pingKafkaConsumer = new PingEventConsumer(mapUpdatesHandler); + } + + @Test + void consumePingCreated_ShouldForwardMessageToWebSocket() { + // Arrange + String message = "{\"id\":\"123\"}"; + + // Act + pingKafkaConsumer.consumePingCreated(message); + + // Assert + verify(mapUpdatesHandler).sendMessage(message); + } + + @Test + void consumePingCreated_WhenMessageIsNull_ShouldNotForwardToWebSocket() { + // Act + pingKafkaConsumer.consumePingCreated(null); + + // Assert + verify(mapUpdatesHandler, never()).sendMessage(anyString()); + } + + @Test + void consumePingCreated_WhenMessageIsEmpty_ShouldNotForwardToWebSocket() { + // Act + pingKafkaConsumer.consumePingCreated(""); + + // Assert + verify(mapUpdatesHandler, never()).sendMessage(anyString()); + } +} \ No newline at end of file diff --git a/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherByPassingKafkaTest.java b/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherByPassingKafkaTest.java new file mode 100644 index 0000000..9d4d329 --- /dev/null +++ b/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherByPassingKafkaTest.java @@ -0,0 +1,92 @@ +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.pubsub; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.time.Instant; +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingDTO; +import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingMapper; +import dev.luismachadoreis.flighttracker.server.ping.domain.Ping; +import dev.luismachadoreis.flighttracker.server.ping.domain.PingCreatedEvent; +import dev.luismachadoreis.flighttracker.server.ping.infrastructure.websocket.MapUpdatesHandler; +import dev.luismachadoreis.flighttracker.server.common.utils.JsonUtils; + +@ExtendWith(MockitoExtension.class) +class PingEventPublisherByPassingKafkaTest { + + @Mock + private MapUpdatesHandler mapUpdatesHandler; + + @Mock + private PingMapper pingMapper; + + @Mock + private JsonUtils jsonUtils; + + private PingEventPublisherByPassingKafka publisher; + + @BeforeEach + void setUp() { + publisher = new PingEventPublisherByPassingKafka(mapUpdatesHandler, pingMapper, jsonUtils); + } + + @Test + void handlePingCreated_ShouldSendMessageToWebSocket() { + // Arrange + Instant now = Instant.now(); + var aircraft = new Ping.Aircraft("ABC123", "FL123", "US", now, "7700", true, new Integer[]{1, 2}); + var vector = new Ping.Vector(500.0, 180.0, 0.0); + var position = new Ping.Position(10.0, 20.0, 30000.0, 29000.0, false, 1, now); + var ping = new Ping(aircraft, vector, position); + var event = new PingCreatedEvent(ping, now); + + var pingDTO = new PingDTO( + ping.getId(), + new PingDTO.Aircraft( + aircraft.icao24(), + aircraft.callsign(), + aircraft.originCountry(), + aircraft.lastContact(), + aircraft.squawk(), + aircraft.spi(), + aircraft.sensors() + ), + new PingDTO.Vector( + vector.velocity(), + vector.trueTrack(), + vector.verticalRate() + ), + new PingDTO.Position( + position.longitude(), + position.latitude(), + position.geoAltitude(), + position.baroAltitude(), + position.onGround(), + position.source(), + position.time() + ), + ping.getLastUpdate() + ); + + String expectedJson = "{\"id\":\"" + ping.getId() + "\",\"aircraft\":{\"icao24\":\"ABC123\",\"callsign\":\"FL123\",\"origin_country\":\"US\",\"last_contact\":\"" + now + "\",\"squawk\":\"7700\",\"spi\":true,\"sensors\":[1,2]},\"vector\":{\"velocity\":500.0,\"true_track\":180.0,\"vertical_rate\":0.0},\"position\":{\"longitude\":10.0,\"latitude\":20.0,\"geo_altitude\":30000.0,\"baro_altitude\":29000.0,\"on_ground\":false,\"source\":1,\"time\":\"" + now + "\"},\"last_update\":\"" + now + "\"}"; + + when(pingMapper.toDTO(ping)).thenReturn(pingDTO); + when(jsonUtils.toJson(pingDTO)).thenReturn(expectedJson); + + // Act + publisher.handlePingCreated(event); + + // Assert + verify(pingMapper).toDTO(ping); + verify(jsonUtils).toJson(pingDTO); + verify(mapUpdatesHandler).sendMessage(expectedJson); + } +} \ No newline at end of file diff --git a/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherTest.java b/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherTest.java new file mode 100644 index 0000000..8cd563b --- /dev/null +++ b/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/pubsub/PingEventPublisherTest.java @@ -0,0 +1,100 @@ +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.pubsub; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.kafka.core.KafkaTemplate; + +import dev.luismachadoreis.flighttracker.server.common.utils.JsonUtils; +import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingDTO; +import dev.luismachadoreis.flighttracker.server.ping.application.dto.PingMapper; +import dev.luismachadoreis.flighttracker.server.ping.domain.Ping; +import dev.luismachadoreis.flighttracker.server.ping.domain.PingCreatedEvent; + +import java.time.Instant; +import java.util.UUID; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class PingEventPublisherTest { + + @Mock + private PingMapper pingMapper; + + @Mock + private KafkaTemplate kafkaTemplate; + + @Mock + private JsonUtils jsonUtils; + + @Mock + private Ping ping; + + private PingEventPublisher pingEventPublisher; + private static final String PING_CREATED_TOPIC = "ping-created-topic"; + + @BeforeEach + void setUp() { + pingEventPublisher = new PingEventPublisher(pingMapper, kafkaTemplate, jsonUtils, PING_CREATED_TOPIC); + } + + @Test + void handlePingCreated_ShouldPublishEventToKafka() { + // Arrange + Instant now = Instant.now(); + PingCreatedEvent event = new PingCreatedEvent(ping, now); + + PingDTO pingDTO = new PingDTO( + UUID.randomUUID(), + new PingDTO.Aircraft("ABC123", "FL123", "US", now, "7700", true, new Integer[]{1, 2}), + new PingDTO.Vector(500.0, 180.0, 0.0), + new PingDTO.Position(10.0, 20.0, 30000.0, 29000.0, false, 1, now), + now + ); + + String jsonMessage = "{\"id\":\"123\"}"; + + when(pingMapper.toDTO(ping)).thenReturn(pingDTO); + when(jsonUtils.toJson(pingDTO)).thenReturn(jsonMessage); + + // Act + pingEventPublisher.handlePingCreated(event); + + // Assert + verify(pingMapper).toDTO(ping); + verify(jsonUtils).toJson(pingDTO); + verify(kafkaTemplate).send(PING_CREATED_TOPIC, jsonMessage); + } + + @Test + void handlePingCreated_WhenJsonConversionFails_ShouldNotPublish() { + // Arrange + Instant now = Instant.now(); + PingCreatedEvent event = new PingCreatedEvent(ping, now); + + PingDTO pingDTO = new PingDTO( + UUID.randomUUID(), + new PingDTO.Aircraft("ABC123", "FL123", "US", now, "7700", true, new Integer[]{1, 2}), + new PingDTO.Vector(500.0, 180.0, 0.0), + new PingDTO.Position(10.0, 20.0, 30000.0, 29000.0, false, 1, now), + now + ); + + when(pingMapper.toDTO(ping)).thenReturn(pingDTO); + when(jsonUtils.toJson(pingDTO)).thenThrow(new RuntimeException("JSON conversion failed")); + + // Act & Assert + try { + pingEventPublisher.handlePingCreated(event); + } catch (RuntimeException e) { + // Expected exception + } + + verify(pingMapper).toDTO(ping); + verify(jsonUtils).toJson(pingDTO); + verify(kafkaTemplate, never()).send(anyString(), anyString()); + } +} \ No newline at end of file diff --git a/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesHandlerTest.java b/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesHandlerTest.java new file mode 100644 index 0000000..997be97 --- /dev/null +++ b/src/test/java/dev/luismachadoreis/flighttracker/server/ping/infrastructure/websocket/MapUpdatesHandlerTest.java @@ -0,0 +1,126 @@ +package dev.luismachadoreis.flighttracker.server.ping.infrastructure.websocket; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.Set; +import java.util.concurrent.ExecutorService; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.lenient; + +@ExtendWith(MockitoExtension.class) +class MapUpdatesHandlerTest { + + @Mock + private WebSocketSession session1; + + @Mock + private WebSocketSession session2; + + @Mock + private ExecutorService executor; + + private MapUpdatesHandler mapUpdatesHandler; + private static final String TEST_MESSAGE = "test message"; + + @BeforeEach + void setUp() throws Exception { + mapUpdatesHandler = new MapUpdatesHandler(executor); + + // Clear the static sessions set before each test + Field sessionsField = MapUpdatesHandler.class.getDeclaredField("sessions"); + sessionsField.setAccessible(true); + Set sessions = (Set) sessionsField.get(null); + sessions.clear(); + + // Set up lenient mocks for session methods that might be called + lenient().when(session1.isOpen()).thenReturn(true); + lenient().when(session2.isOpen()).thenReturn(true); + } + + @Test + void afterConnectionEstablished_ShouldAddSession() throws Exception { + // Act + mapUpdatesHandler.afterConnectionEstablished(session1); + + // Send a message to verify the session was added + mapUpdatesHandler.sendMessage(TEST_MESSAGE); + + // Assert + verify(executor, times(1)).submit(any(java.lang.Runnable.class)); + } + + @Test + void afterConnectionClosed_ShouldRemoveSession() throws Exception { + // Arrange + mapUpdatesHandler.afterConnectionEstablished(session1); + + // Act + mapUpdatesHandler.afterConnectionClosed(session1, null); + mapUpdatesHandler.sendMessage(TEST_MESSAGE); + + // Assert - no messages should be sent since session was removed + verify(executor, never()).submit(any(java.lang.Runnable.class)); + } + + @Test + void sendMessage_WithNoSessions_ShouldNotSendAnyMessages() throws Exception { + // Act + mapUpdatesHandler.sendMessage(TEST_MESSAGE); + + // Assert + verify(executor, never()).submit(any(java.lang.Runnable.class)); + verify(session1, never()).sendMessage(any(TextMessage.class)); + verify(session2, never()).sendMessage(any(TextMessage.class)); + } + + @Test + void sendMessage_WithActiveSessions_ShouldSendToAllSessions() throws Exception { + // Arrange + mapUpdatesHandler.afterConnectionEstablished(session1); + mapUpdatesHandler.afterConnectionEstablished(session2); + + // Act + mapUpdatesHandler.sendMessage(TEST_MESSAGE); + + // Assert - one submit per active session + verify(executor, times(2)).submit(any(java.lang.Runnable.class)); + } + + @Test + void sendMessage_WithClosedSession_ShouldNotSendToClosedSession() throws Exception { + // Arrange + lenient().when(session1.isOpen()).thenReturn(false); + mapUpdatesHandler.afterConnectionEstablished(session1); + mapUpdatesHandler.afterConnectionEstablished(session2); + mapUpdatesHandler.afterConnectionClosed(session1, null); + + // Act + mapUpdatesHandler.sendMessage(TEST_MESSAGE); + + // Assert - should only submit for the remaining session + verify(executor, times(1)).submit(any(java.lang.Runnable.class)); + } + + @Test + void sendMessage_WhenSessionThrowsException_ShouldLogError() throws Exception { + // Arrange + mapUpdatesHandler.afterConnectionEstablished(session1); + lenient().doThrow(new IOException("Test exception")).when(session1).sendMessage(any(TextMessage.class)); + + // Act + mapUpdatesHandler.sendMessage(TEST_MESSAGE); + + // Assert - should still submit the task even if it throws + verify(executor, times(1)).submit(any(java.lang.Runnable.class)); + } +} \ No newline at end of file