Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.routes.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.routes.ts	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.routes.ts	(working copy)
@@ -29,6 +29,11 @@
 import {DeviceHaOverview} from './components/sub-components/device-ha-overview/device-ha-overview';
 import {DeviceHa} from './components/device-ha/device-ha';
 import {Topology} from './components/topology/topology';
+import {Observability} from './components/observability/observability';
+import {AvxDevices} from './components/sub-components/avx-devices/avx-devices';
+import {AvxInstancesOverview} from './components/sub-components/avx-instances-overview/avx-instances-overview';
+import {AvxDeviceDetails} from './components/sub-components/avx-device-details/avx-device-details';
+import {AvxVaInstanceDetails} from './components/sub-components/avx-va-instance-details/avx-va-instance-details';
 
 
 export const routes: Routes = [
@@ -187,6 +192,29 @@
           },
         ]
       },
+      {
+        path: 'avx',
+        data: {roles: ['super_admin', 'device_admin', 'common_admin'],},
+        children: [
+          {
+            path: 'devices',
+            component: AvxDevices,
+          },
+          {
+            path: 'devices/details/:deviceName/:deviceId',
+            component: AvxDeviceDetails,
+          },
+          {
+            path: 'instances',
+            component: AvxInstancesOverview
+          },
+          {
+            path: 'devices/instances/details/:deviceName/:deviceId/:instanceName',
+            component: AvxVaInstanceDetails,
+          },
+        ]
+      },
+      {path: 'observability', component: Observability, data: {roles: ['super_admin', 'device_admin', 'common_admin']}},
       {path: '', redirectTo: 'dashboard', pathMatch: 'full'},
       // {path: '**', redirectTo: 'dashboard'}
     ]
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.scss	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.scss	(working copy)
@@ -0,0 +1,20 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/update-log-settings.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/update-log-settings.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/update-log-settings.html	(working copy)
@@ -0,0 +1,27 @@
+<h2 mat-dialog-title>Update Log Settings</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+  >
+    <div class="form-field-wrapper">
+      <label for="enable" class="form-label">Keep the original log</label>
+      <mat-slide-toggle formControlName="enable"></mat-slide-toggle>
+    </div>
+    <mat-hint>Uses the 'raw_message' field to keep the log before parsing, which consumes for disk space.</mat-hint>
+  </form>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+  <button
+    mat-button
+    color="basic"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.html	(working copy)
@@ -0,0 +1,31 @@
+<div class="tab-container">
+  <mat-tab-group mat-stretch-tabs="false" animationDuration="0ms" [selectedIndex]="selectedTabIndex" (selectedTabChange)="onTabChange($event)">
+    <mat-tab label="Running Configuration">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <div class="device-config">
+            <pre class="wrapped-pre">{{ deviceConfig }}</pre>
+          </div>
+        </div>
+      </ng-template>
+    </mat-tab>
+    <mat-tab label="Startup Configuration">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <div class="device-config">
+            <pre class="wrapped-pre">{{ deviceConfig }}</pre>
+          </div>
+        </div>
+      </ng-template>
+    </mat-tab>
+    <mat-tab label="Technical Statistics">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <div class="device-config">
+            <pre class="wrapped-pre">{{ deviceConfig }}</pre>
+          </div>
+        </div>
+      </ng-template>
+    </mat-tab>
+  </mat-tab-group>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.scss	(working copy)
@@ -0,0 +1,18 @@
+.wrapped-pre {
+  padding: 15px;
+  border: 1px solid #ccc;
+  overflow-x: auto;
+  white-space: pre-wrap;
+  word-break: break-word;
+  font-family: monospace;
+  height: 60vh;
+  max-height: 80vh;
+  overflow-y: auto;
+}
+
+.device-config {
+  padding: 4px;
+  border-radius: 8px;
+  max-width: 90vw;
+  margin: 20px auto;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxDeviceDetailConfiguration } from './avx-device-detail-configuration';
+
+describe('AvxDeviceDetailConfiguration', () => {
+  let component: AvxDeviceDetailConfiguration;
+  let fixture: ComponentFixture<AvxDeviceDetailConfiguration>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxDeviceDetailConfiguration]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxDeviceDetailConfiguration);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-configuration/avx-device-detail-configuration.ts	(working copy)
@@ -0,0 +1,65 @@
+import {Component, OnInit} from '@angular/core';
+import {AvxService} from '../../../services/avx-service';
+import {NotificationService} from '../../../services/notification';
+import {ActivatedRoute} from '@angular/router';
+import {MatTabChangeEvent} from '@angular/material/tabs';
+import {SharedModule} from '../../../shared/shared-module';
+import {take} from 'rxjs/operators';
+
+@Component({
+  selector: 'app-avx-device-detail-configuration',
+  imports: [
+    SharedModule,
+  ],
+  templateUrl: './avx-device-detail-configuration.html',
+  styleUrl: './avx-device-detail-configuration.scss'
+})
+export class AvxDeviceDetailConfiguration implements OnInit {
+
+  deviceName: any = '';
+  deviceId: any = '';
+
+  selectedTabIndex: number = 0;
+  private tabNames: string[] = [
+    'Running Configuration',
+    'Startup Configuration',
+    'Technical Statistics',
+  ];
+
+  constructor(
+    private _avx: AvxService,
+    private _notification: NotificationService,
+    private _route: ActivatedRoute,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+    setTimeout(() => {
+      this.getAVXDeviceConfiguration();
+    })
+  }
+
+  onTabChange(event: MatTabChangeEvent): void {
+    this.selectedTabIndex = event.index;
+    let config = event.index === 0 ? 'running_config' : event.index === 1 ? 'startup_config' : 'tech';
+    this.getAVXDeviceConfiguration(config)
+  }
+
+  deviceConfig: any = '';
+
+  getAVXDeviceConfiguration(config: string = 'running_config') {
+    this._avx.getAVXDeviceConfig(this.deviceId, config).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result[config]) {
+          this.deviceConfig = result[config].replaceAll("&gt;", ">").replaceAll("&lt;", "<");
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.html	(working copy)
@@ -0,0 +1,26 @@
+@for (_domain of vaData; track _domain) {
+  <mat-card class="page-card-1">
+    <mat-card-header>
+      <mat-card-title>Domain ID: {{ _domain?.domain_id }}</mat-card-title>
+    </mat-card-header>
+    <mat-card-content>
+      <p>CPU Threads ({{ _domain?.domain_cpu_reserved }} reserved + {{ _domain?.domain_cpu_used }} used
+        + {{ _domain?.domain_cpu_left }} available = {{ _domain?.domain_cpu_all }} in
+        total): {{ _domain?.domain_cpu_used_rate }}% used</p>
+      <p>Memory ({{ _domain?.domain_memory_reserved }} GB reserved + {{ _domain?.domain_memory_used }} GB used
+        + {{ _domain?.domain_memory_left }} GB available = {{ _domain?.domain_memory_all }} GB in
+        total): {{ _domain?.domain_memory_used_rate }}% used</p>
+      <p>Disk Space ({{ deviceInfo?.disk?.disk_used }} GB used + {{ deviceInfo?.disk?.disk_left }} GB available
+        = {{ deviceInfo?.disk?.disk_total }} GB in total): {{ deviceInfo?.disk?.disk_used_rate }}% used</p>
+      <p>Traffic Interface VF ({{ _domain?.domain_portvf_used }} used + {{ _domain?.domain_portvf_left }} available
+        = {{ _domain?.domain_portvf_all }} in total): {{ _domain?.domain_portvf_used_rate }}% used</p>
+      <p>SSL Card VF ({{ _domain?.domain_sslvf_used }} used + {{ _domain?.domain_sslvf_left }} available
+        = {{ _domain?.domain_sslvf_all }} in total): {{ _domain?.domain_sslvf_used_rate }}% used</p>
+    </mat-card-content>
+  </mat-card>
+}
+<br>
+<p>
+  &nbsp;&nbsp;&nbsp;&nbsp;<b>Note: </b>The width of the block for a VA instance represents the amount of its CPU
+  threads.
+</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxDeviceDetailDeployments } from './avx-device-detail-deployments';
+
+describe('AvxDeviceDetailDeployments', () => {
+  let component: AvxDeviceDetailDeployments;
+  let fixture: ComponentFixture<AvxDeviceDetailDeployments>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxDeviceDetailDeployments]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxDeviceDetailDeployments);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-deployments/avx-device-detail-deployments.ts	(working copy)
@@ -0,0 +1,121 @@
+import {Component, OnInit} from '@angular/core';
+import {SharedModule} from '../../../shared/shared-module';
+import {AvxService} from '../../../services/avx-service';
+import {NotificationService} from '../../../services/notification';
+import {ActivatedRoute} from '@angular/router';
+import {take} from 'rxjs/operators';
+
+@Component({
+  selector: 'app-avx-device-detail-deployments',
+  imports: [SharedModule],
+  templateUrl: './avx-device-detail-deployments.html',
+  styleUrl: './avx-device-detail-deployments.scss'
+})
+export class AvxDeviceDetailDeployments implements OnInit {
+
+  deviceName: any = '';
+  deviceId: any = '';
+  deviceInfo: any = {};
+  vaData: any = [];
+
+  constructor(
+    private _avx: AvxService,
+    private _notification: NotificationService,
+    private _route: ActivatedRoute,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+    setTimeout(() => {
+      this.getAVXDeviceSystemInfo()
+    })
+  }
+
+  getAVXDeviceSystemInfo() {
+    this._avx.getAVXDeviceSystemInfo(this.deviceId).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result?.data) {
+          this.deviceInfo = result?.data;
+          this.deviceInfo.disk.disk_used_rate = (parseInt(this.deviceInfo.disk.disk_used) / parseInt(this.deviceInfo.disk.disk_total) * 100).toFixed(2);
+          for (let i = 0; i < this.deviceInfo.domain_num; i++) {
+            let va_addable = false;
+            let domain_cpu_all = 0;
+            let domain_cpu_used = 0;
+            let domain_cpu_left = 0;
+            let domain_cpu_reserved = 0;
+            let domain_memory_all = 0;
+            let domain_memory_used = 0;
+            let domain_memory_left = 0;
+            let domain_memory_reserved = 0;
+            let domain_portvf_all = 0;
+            let domain_portvf_used = 0;
+            let domain_portvf_left = 0;
+            let domain_sslvf_all = 0;
+            let domain_sslvf_used = 0;
+            let domain_sslvf_left = 0;
+            this.deviceInfo.domain?.forEach((_domain: any) => {
+              if (_domain.id == i + 1) {
+                domain_cpu_all = parseInt(_domain.cpu.sum);
+                domain_cpu_left = parseInt(_domain.cpu.left);
+                domain_cpu_reserved = parseInt(_domain.cpu.reserved);
+                domain_cpu_used = parseInt(_domain.cpu.used) - domain_cpu_reserved;
+                if (_domain.cpu.left > 0) {
+                  va_addable = true;
+                }
+                domain_memory_all = parseInt(_domain.memory.sum);
+                domain_memory_used = parseInt(_domain.memory.used);
+                domain_memory_left = parseInt(_domain.memory.left);
+                domain_memory_reserved = parseInt(_domain.memory.reserved);
+
+                _domain?.port.forEach((_port: any) => {
+                  domain_portvf_all += parseInt(_port["vf_sum"]);
+                  domain_portvf_left += parseInt(_port["vf_available"]);
+                })
+                domain_portvf_used = domain_portvf_all - domain_portvf_left;
+                _domain?.ssl.forEach((_ssl: any) => {
+                  domain_sslvf_all += parseInt(_ssl["vf_sum"]);
+                  domain_sslvf_left += parseInt(_ssl["vf_share_available"]);
+                  domain_sslvf_left += parseInt(_ssl["vf_dedicated_available"]);
+                })
+                domain_sslvf_used = domain_sslvf_all - domain_sslvf_left;
+              }
+            })
+            this.vaData.push({
+              'domain_id': i + 1,
+              'domain_cpu_all': domain_cpu_all,
+              'domain_cpu_left': domain_cpu_left,
+              'domain_cpu_left_shared': this.deviceInfo?.domain[i].cpu.dedicated_left,
+              'domain_cpu_left_dedicated': this.deviceInfo?.domain[i].cpu.shared_left,
+              'domain_cpu_used': domain_cpu_used,
+              'domain_cpu_reserved': domain_cpu_reserved,
+              'domain_cpu_used_rate': ((domain_cpu_used + domain_cpu_reserved) / domain_cpu_all * 100).toFixed(2),
+              'domain_memory_all': domain_memory_all,
+              'domain_memory_left': domain_memory_left,
+              'domain_memory_used': domain_memory_used,
+              'domain_memory_reserved': domain_memory_reserved,
+              'domain_memory_used_rate': ((domain_memory_used + domain_memory_reserved) / domain_memory_all * 100).toFixed(2),
+              'domain_portvf_all': domain_portvf_all,
+              'domain_portvf_left': domain_portvf_left,
+              'domain_portvf_used': domain_portvf_used,
+              'domain_portvf_used_rate': (domain_portvf_used / domain_portvf_all * 100).toFixed(2),
+              'domain_sslvf_all': domain_sslvf_all,
+              'domain_sslvf_left': domain_sslvf_left,
+              'domain_sslvf_used': domain_sslvf_used,
+              'domain_sslvf_used_rate': (domain_sslvf_used / domain_sslvf_all * 100).toFixed(2),
+              'data': [],
+              'va_addable': va_addable
+            });
+          }
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  protected readonly Array = Array;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.html	(working copy)
@@ -0,0 +1,49 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-content>
+    <div class="button-container">
+      <div class="form-field-wrapper">
+        <label for="deviceType" class="form-label">Log Level</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <mat-select (selectionChange)="filterLogs($event.value)" [(ngModel)]="selectedLogLevel">
+            @for (_level of logLevel; track _level) {
+              <mat-option [value]="_level?.value">{{ _level?.label }}</mat-option>
+            }
+          </mat-select>
+        </mat-form-field>
+      </div>
+    </div>
+    <div class="table-container">
+      <div class="mat-elevation-z0">
+        <table mat-table [dataSource]="dataSource">
+          <ng-container matColumnDef="serial">
+            <th mat-header-cell *matHeaderCellDef>ID</th>
+            <td mat-cell *matCellDef="let element; let i = index;"> {{ i | globalSerial }}</td>
+          </ng-container>
+          <ng-container matColumnDef="logLevel">
+            <th mat-header-cell *matHeaderCellDef>Log Level</th>
+            <td mat-cell *matCellDef="let element">{{ element?.logLevel }}</td>
+          </ng-container>
+          <ng-container matColumnDef="timestamp">
+            <th mat-header-cell *matHeaderCellDef>Timestamp</th>
+            <td mat-cell *matCellDef="let element">{{ element?.timestamp }}</td>
+          </ng-container>
+          <ng-container matColumnDef="message">
+            <th mat-header-cell *matHeaderCellDef>Message</th>
+            <td mat-cell *matCellDef="let element">{{ element?.message }}</td>
+          </ng-container>
+          <tr mat-header-row *matHeaderRowDef="dataColumns"></tr>
+          <tr mat-row *matRowDef="let row; columns: dataColumns;"></tr>
+          <tr class="mat-row table-no-data" *matNoDataRow>
+            <td class="mat-cell" colspan="11">No results found.</td>
+          </tr>
+        </table>
+        <mat-paginator
+          [length]="totalRecords"
+          [pageSize]="10"
+          [pageSizeOptions]="[10, 20, 50]"
+        >
+        </mat-paginator>
+      </div>
+    </div>
+  </mat-card-content>
+</mat-card>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxDeviceDetailLogs } from './avx-device-detail-logs';
+
+describe('AvxDeviceDetailLogs', () => {
+  let component: AvxDeviceDetailLogs;
+  let fixture: ComponentFixture<AvxDeviceDetailLogs>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxDeviceDetailLogs]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxDeviceDetailLogs);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-logs/avx-device-detail-logs.ts	(working copy)
@@ -0,0 +1,123 @@
+import {Component, inject, OnInit, ViewChild} from '@angular/core';
+import {GlobalSerialPipe} from "../../../pipes/global-serial-pipe";
+import {SharedModule} from '../../../shared/shared-module';
+import {AvxService} from '../../../services/avx-service';
+import {take} from 'rxjs/operators';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {MatDialog, MatDialogConfig} from '@angular/material/dialog';
+import {NotificationService} from '../../../services/notification';
+import {Confirmation} from '../../../services/confirmation';
+import {ActivatedRoute, Router} from '@angular/router';
+import {log} from 'node:util';
+
+@Component({
+  selector: 'app-avx-device-detail-logs',
+  imports: [
+    SharedModule,
+    GlobalSerialPipe,
+  ],
+  templateUrl: './avx-device-detail-logs.html',
+  styleUrl: './avx-device-detail-logs.scss'
+})
+export class AvxDeviceDetailLogs implements OnInit {
+
+  totalRecords: number = 0;
+  dataSource: MatTableDataSource<any> = new MatTableDataSource();
+  dataColumns: string[] = ['serial', 'logLevel', 'timestamp', 'message'];
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+  deviceName: any = '';
+  deviceId: any = '';
+
+  constructor(
+    private _avx: AvxService,
+    private _notification: NotificationService,
+    private _route: ActivatedRoute,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+    setTimeout(() => {
+      this.getAVXDeviceLogs();
+    })
+  }
+
+  logSettings: any = {};
+
+  getAVXDeviceLogSettings() {
+    this.dataSource.data = [];
+    this.totalRecords = 0;
+    this._avx.getAVXDeviceLogSettings(this.deviceId).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        this.logSettings = result;
+        this.getAVXDeviceLogs();
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  deviceLogs: any = [];
+  getAVXDeviceLogs() {
+    this.dataSource.data = [];
+    this.deviceLogs = [];
+    this.totalRecords = 0;
+    this._avx.getAVXDeviceLog(this.deviceId).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result?.logbuf) {
+          let logs: any = result?.logbuf.split('\n');
+          logs.forEach((_log: any) => {
+            if (_log.length > 28) {
+              this.deviceLogs.push({
+                logLevel: _log.substring(0, 7),
+                timestamp: _log.substring(8, 28),
+                message: _log.substring(29).replace("&gt;", ">"),
+              });
+            }
+          })
+          this.dataSource.data = this.deviceLogs;
+          this.totalRecords = this.dataSource.data.length;
+          this.dataSource.paginator = this.paginator;
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  logLevel: any = [
+    {label: 'ALL', value: ''},
+    {label: 'EMERGENCY', value: 'emerg'},
+    {label: 'ALERT', value: 'alert'},
+    {label: 'CRITICAL', value: 'crit'},
+    {label: 'ERROR', value: 'err'},
+    {label: 'WARNING', value: 'warning'},
+    {label: 'NOTICE', value: 'notice'},
+    {label: 'INFO', value: 'info'},
+    {label: 'DEBUG', value: 'debug'},
+  ];
+  selectedLogLevel: any = '';
+
+  filterLogs(logLevel: any) {
+    let logs: any=[];
+    this.deviceLogs.forEach((_log: any) => {
+      if (_log.logLevel.replaceAll(' ','').toLowerCase() == logLevel){
+        logs.push(_log);
+      } else if (logLevel === '') {
+        logs = this.deviceLogs;
+      }
+    })
+    this.dataSource.data = logs;
+    this.totalRecords = this.dataSource.data.length;
+    this.dataSource.paginator = this.paginator;
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.html	(working copy)
@@ -0,0 +1,132 @@
+<mat-grid-list cols="3" rowHeight="100px">
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Network Throughput (bps)</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption1" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">CPU Usage (%)</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption2" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Memory Usage (%)</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption3" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+</mat-grid-list>
+<mat-grid-list cols="5" rowHeight="120px">
+  <mat-grid-tile colspan="1" rowspan="1">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row-1">
+          <mat-card-title class="card-title-1">
+            <span class="card-title-text">CPU Threads ({{chartMeta?.cpu}})</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption4" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="1">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row-1">
+          <mat-card-title class="card-title-1">
+            <span class="card-title-text">Memory ({{chartMeta?.memory}})</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption5" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="1">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row-1">
+          <mat-card-title class="card-title-1">
+            <span class="card-title-text">Traffic Interface VF ({{chartMeta?.port}})</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption6" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="1">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row-1">
+          <mat-card-title class="card-title-1">
+            <span class="card-title-text">SSL Card VF ({{chartMeta?.ssl}})</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption7" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="1">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row-1">
+          <mat-card-title class="card-title-1">
+            <span class="card-title-text">Disk Usage({{chartMeta?.disk}})</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption8" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+</mat-grid-list>
+<mat-card class="page-card-1">
+  <mat-card-header>
+    <mat-card-title>System Information</mat-card-title>
+  </mat-card-header>
+  <mat-card-content>
+    <table mat-table [dataSource]="dataSource" class="mat-elevation-z1">
+      <ng-container matColumnDef="key">
+        <td mat-cell *matCellDef="let element"> {{ element.key }}</td>
+      </ng-container>
+      <ng-container matColumnDef="value">
+        <td mat-cell *matCellDef="let element"> {{ element.value }}</td>
+      </ng-container>
+      <tr mat-row *matRowDef="let row; columns: dataColumns;"></tr>
+    </table>
+  </mat-card-content>
+</mat-card>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.scss	(working copy)
@@ -0,0 +1,184 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
+
+.dashboard-card {
+  width: 100%;
+  height: 100%;
+  border-radius: 8px;
+  background-color: inherit;
+}
+
+.card-content-wrapper {
+  margin-top: 2px;
+  padding: 0 !important;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  width: 100%;
+}
+
+.card-header-row {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  margin-bottom: 8px;
+  padding: 0 8px;
+}
+
+.card-header-row-1 {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  margin-bottom: 0;
+  padding: 0 4px;
+}
+
+.metric-icon {
+  color: #3f51b5;
+}
+
+.card-title {
+  font-size: 14px;
+  font-weight: 500;
+  color: #555;
+  margin: 0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+}
+
+.card-title-1 {
+  font-size: 12px;
+  font-weight: 400;
+  color: #555;
+  margin: 0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+}
+
+.metric-value {
+  display: flex;
+  justify-content: center;
+  align-items: flex-end;
+  line-height: 1;
+}
+
+.metric-label {
+  display: flex;
+  justify-content: center;
+  align-items: flex-end;
+  font-size: 0.9rem;
+  color: #777;
+  margin-top: 5px;
+}
+
+.online-count {
+  font-size: 36px;
+  font-weight: 600;
+  color: #333;
+}
+
+.total-count {
+  font-size: 18px;
+  font-weight: 500;
+  color: #888;
+  margin-left: 4px;
+}
+
+.status-details {
+  font-size: 14px;
+  color: #d32f2f;
+  margin: 0;
+  font-weight: 500;
+  text-align: center;
+}
+
+.active,
+.matrics-icon {
+  color: darkgreen;
+}
+
+.chart-flex-container {
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  height: 100%;
+  width: 100%;
+  flex-grow: 1;
+}
+
+.chart-container {
+  width: 100%;
+  height: 100%;
+  max-width: none;
+  max-height: none;
+}
+
+.chart-flex-container .chart-container {
+  width: 100%;
+  height: 100%;
+}
+
+mat-grid-list {
+  height: 100%;
+  width: 100%;
+}
+
+.metrics-container {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 20px;
+}
+
+.card-body-content {
+  flex-grow: 1;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.metrics-horizontal-container {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  gap: 20px;
+  width: 100%;
+}
+
+.metric-item {
+  text-align: center;
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.metric-value {
+  font-size: 1rem;
+  font-weight: 500;
+  color: #333;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxDeviceDetailOverview } from './avx-device-detail-overview';
+
+describe('AvxDeviceDetailOverview', () => {
+  let component: AvxDeviceDetailOverview;
+  let fixture: ComponentFixture<AvxDeviceDetailOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxDeviceDetailOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxDeviceDetailOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-detail-overview/avx-device-detail-overview.ts	(working copy)
@@ -0,0 +1,1424 @@
+import {Component, OnInit} from '@angular/core';
+import {AvxService} from '../../../services/avx-service';
+import {NotificationService} from '../../../services/notification';
+import {ActivatedRoute} from '@angular/router';
+import {take} from 'rxjs/operators';
+import {SharedModule} from '../../../shared/shared-module';
+import {MatTableDataSource} from '@angular/material/table';
+import {UtilsService} from '../../../services/utils-service';
+import {EChartsOption} from 'echarts';
+
+@Component({
+  selector: 'app-avx-device-detail-overview',
+  imports: [SharedModule],
+  templateUrl: './avx-device-detail-overview.html',
+  styleUrl: './avx-device-detail-overview.scss'
+})
+export class AvxDeviceDetailOverview implements OnInit {
+
+  dataColumns: Array<string> = ['key', 'value'];
+  dataSource = new MatTableDataSource([]);
+  deviceName: any = '';
+  deviceId: any = '';
+  chartOption1: EChartsOption = {};
+  chartOption2: EChartsOption = {};
+  chartOption3: EChartsOption = {};
+  chartOption4: EChartsOption = {};
+  chartOption5: EChartsOption = {};
+  chartOption6: EChartsOption = {};
+  chartOption7: EChartsOption = {};
+  chartOption8: EChartsOption = {};
+
+  constructor(
+    private _avx: AvxService,
+    private _notification: NotificationService,
+    private _route: ActivatedRoute,
+    private _utils: UtilsService
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+    setTimeout(() => {
+      this.getAVXDeviceSystemInfoOverview();
+      this.getAVXDeviceResourceOccupation();
+      this.getDeviceStatistics();
+    })
+  }
+
+  getAVXDeviceSystemInfoOverview() {
+    this._avx.getAVXDeviceSystemInfoOverview(this.deviceId).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        this.dataSource = this._utils.processConfigData(result);
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  getAVXDeviceResourceOccupation() {
+    this._avx.getAVXDeviceResourceOccupation(this.deviceId).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result?.result) {
+          this.updateChartOption(result?.result);
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  getDeviceStatistics() {
+    // ToDo: Integrate with APIs once ready.
+    this.updateStatisticsCharts({});
+  }
+
+  convertApiResponseToChartData(apiResponse: any) {
+    return apiResponse.map((item: any) => {
+      const name = item[0];
+      const value = item[1];
+      return {name, value};
+    });
+  }
+
+  chartMeta: any = {};
+
+  updateChartOption(_data: any) {
+
+    _data?.cpu_thread.push(["Reserved", _data?.cpu_left_dedicated])
+    this.chartOption4 = {
+      tooltip: {
+        trigger: 'item'
+      },
+      series: [
+        {
+          type: 'pie',
+          radius: ['40%', '70%'],
+          avoidLabelOverlap: false,
+          label: {
+            show: false,
+            position: 'center'
+          },
+          labelLine: {
+            show: false
+          },
+          itemStyle: {
+            borderColor: '#fff',
+            borderWidth: 2
+          },
+          data: this.convertApiResponseToChartData(_data?.cpu_thread).map((item: any) => {
+            if (item.name === 'Reserved') {
+              return {
+                ...item,
+                itemStyle: {
+                  color: 'orange'
+                }
+              };
+            } else if (item.name === 'Available') {
+              return {
+                ...item,
+                itemStyle: {
+                  color: 'green'
+                }
+              };
+            } else {
+              return {
+                ...item,
+                itemStyle: {
+                  color: '#5470c6'
+                }
+              };
+            }
+          })
+        }
+      ]
+    };
+    this.chartMeta.cpu = `${_data.cpu_used} / ${_data?.cpu_all}`;
+
+    _data?.memory.push(["Reserved", _data?.memory_reserved])
+    _data?.memory.push(["Available", _data?.memory_left])
+    this.chartOption5 = {
+      tooltip: {
+        trigger: 'item'
+      },
+      series: [
+        {
+          type: 'pie',
+          radius: ['40%', '70%'],
+          avoidLabelOverlap: false,
+          label: {
+            show: false,
+            position: 'center'
+          },
+          labelLine: {
+            show: false
+          },
+          itemStyle: {
+            borderColor: '#fff',
+            borderWidth: 2
+          },
+          data: this.convertApiResponseToChartData(_data?.memory).map((item: any) => {
+            if (item.name === 'Reserved') {
+              return {
+                ...item,
+                itemStyle: {
+                  color: 'orange'
+                }
+              };
+            } else if (item.name === 'Available') {
+              return {
+                ...item,
+                itemStyle: {
+                  color: 'green'
+                }
+              };
+            } else {
+              return {
+                ...item,
+                itemStyle: {
+                  color: '#5470c6'
+                }
+              };
+            }
+          })
+        }
+      ]
+    };
+    this.chartMeta.memory = `${_data.memory_used + _data?.memory_reserved} / ${_data?.memory_all}`;
+
+    _data?.port_vf.push(["Available", _data?.port_vf_left])
+    this.chartOption6 = {
+      tooltip: {
+        trigger: 'item'
+      },
+      series: [
+        {
+          type: 'pie',
+          radius: ['40%', '70%'],
+          avoidLabelOverlap: false,
+          label: {
+            show: false,
+            position: 'center'
+          },
+          labelLine: {
+            show: false
+          },
+          itemStyle: {
+            borderColor: '#fff',
+            borderWidth: 2
+          },
+          data: this.convertApiResponseToChartData(_data?.port_vf).map((item: any) => {
+            if (item.name === 'Reserved') {
+              return {
+                ...item,
+                itemStyle: {
+                  color: 'orange'
+                }
+              };
+            } else if (item.name === 'Available') {
+              return {
+                ...item,
+                itemStyle: {
+                  color: 'green'
+                }
+              };
+            } else {
+              return {
+                ...item,
+                itemStyle: {
+                  color: '#5470c6'
+                }
+              };
+            }
+          })
+        }
+      ]
+    };
+    this.chartMeta.port = `${_data.port_vf_used} / ${_data?.port_vf_all}`;
+
+    _data?.ssl_vf.push(["Available", _data?.ssl_vf_left])
+    this.chartOption7 = {
+      tooltip: {
+        trigger: 'item',
+        formatter: (params: any) => {
+          const name = params.name;
+          const value = params.value;
+          const details = _data?.ssl_vf_used_detail[name];
+          if (details) {
+            return `${name} - S: ${details.shared}, D: ${details.dedicated}`;
+          }
+          return `${name}: ${value}`;
+        }
+      },
+      series: [
+        {
+          type: 'pie',
+          radius: ['40%', '70%'],
+          avoidLabelOverlap: false,
+          label: {
+            show: false,
+            position: 'center'
+          },
+          labelLine: {
+            show: false
+          },
+          itemStyle: {
+            borderColor: '#fff',
+            borderWidth: 2
+          },
+          data: this.convertApiResponseToChartData(_data?.ssl_vf).map((item: any) => {
+            if (item.name === 'Reserved') {
+              return {
+                ...item,
+                itemStyle: {
+                  color: 'orange'
+                }
+              };
+            } else if (item.name === 'Available') {
+              return {
+                ...item,
+                itemStyle: {
+                  color: 'green'
+                }
+              };
+            } else {
+              return {
+                ...item,
+                itemStyle: {
+                  color: '#5470c6'
+                }
+              };
+            }
+          })
+        }
+      ]
+    };
+    this.chartMeta.ssl = `${_data.ssl_vf_used} / ${_data?.ssl_vf_all}`;
+
+    this.chartOption8 = {
+      tooltip: {
+        trigger: 'item',
+        formatter: '{b} : {c} GB',
+        textStyle: {
+          fontSize: 12
+        }
+      },
+      series: [
+        {
+          name: 'Disk Usage',
+          type: 'pie',
+          radius: ['40%', '70%'],
+          avoidLabelOverlap: false,
+          label: {
+            show: false,
+            position: 'center'
+          },
+          labelLine: {
+            show: false
+          },
+          data: [
+            {name: 'Available', value: _data?.disk_left},
+            {name: 'Used', value: _data?.disk_used},
+          ]
+        }
+      ]
+    };
+    this.chartMeta.disk = `${_data.disk_used} / ${_data?.disk_total}`;
+  }
+
+  updateStatisticsCharts(_data: any) {
+
+    _data.throughput = {
+      sent: [
+        [
+          "2025-09-01T06:13:20Z",
+          22764.8
+        ],
+        [
+          "2025-09-01T06:13:30Z",
+          91184
+        ],
+        [
+          "2025-09-01T06:13:40Z",
+          30636
+        ],
+        [
+          "2025-09-01T06:13:50Z",
+          77057.6
+        ],
+        [
+          "2025-09-01T06:14:00Z",
+          53998.4
+        ],
+        [
+          "2025-09-01T06:14:10Z",
+          26018.4
+        ],
+        [
+          "2025-09-01T06:14:20Z",
+          39848
+        ],
+        [
+          "2025-09-01T06:14:30Z",
+          85203.2
+        ],
+        [
+          "2025-09-01T06:14:40Z",
+          30274.4
+        ],
+        [
+          "2025-09-01T06:14:50Z",
+          75187.2
+        ],
+        [
+          "2025-09-01T06:15:00Z",
+          53441.6
+        ],
+        [
+          "2025-09-01T06:15:10Z",
+          28653.6
+        ],
+        [
+          "2025-09-01T06:15:20Z",
+          43352
+        ],
+        [
+          "2025-09-01T06:15:30Z",
+          86523.2
+        ],
+        [
+          "2025-09-01T06:15:40Z",
+          29900
+        ],
+        [
+          "2025-09-01T06:15:50Z",
+          74057.6
+        ],
+        [
+          "2025-09-01T06:16:00Z",
+          57915.2
+        ],
+        [
+          "2025-09-01T06:16:10Z",
+          31132
+        ],
+        [
+          "2025-09-01T06:16:20Z",
+          40164.8
+        ],
+        [
+          "2025-09-01T06:16:30Z",
+          87473.6
+        ],
+        [
+          "2025-09-01T06:16:40Z",
+          29352.8
+        ],
+        [
+          "2025-09-01T06:16:50Z",
+          107523.2
+        ],
+        [
+          "2025-09-01T06:17:00Z",
+          80985.6
+        ],
+        [
+          "2025-09-01T06:17:10Z",
+          26631.2
+        ],
+        [
+          "2025-09-01T06:17:20Z",
+          46208
+        ],
+        [
+          "2025-09-01T06:17:30Z",
+          84646.4
+        ],
+        [
+          "2025-09-01T06:17:40Z",
+          28506.4
+        ],
+        [
+          "2025-09-01T06:17:50Z",
+          73884.8
+        ],
+        [
+          "2025-09-01T06:18:00Z",
+          50097.6
+        ],
+        [
+          "2025-09-01T06:18:10Z",
+          27802.4
+        ],
+        [
+          "2025-09-01T06:18:20Z",
+          48852.8
+        ],
+        [
+          "2025-09-01T06:18:30Z",
+          82992
+        ],
+        [
+          "2025-09-01T06:18:40Z",
+          31167.2
+        ],
+        [
+          "2025-09-01T06:18:50Z",
+          81974.4
+        ],
+        [
+          "2025-09-01T06:19:00Z",
+          50172.8
+        ],
+        [
+          "2025-09-01T06:19:10Z",
+          27991.2
+        ],
+        [
+          "2025-09-01T06:19:20Z",
+          44648
+        ],
+        [
+          "2025-09-01T06:19:30Z",
+          81387.2
+        ],
+        [
+          "2025-09-01T06:19:40Z",
+          27821.6
+        ],
+        [
+          "2025-09-01T06:19:50Z",
+          78454.4
+        ],
+        [
+          "2025-09-01T06:20:00Z",
+          52660.8
+        ],
+        [
+          "2025-09-01T06:20:10Z",
+          24552.8
+        ],
+        [
+          "2025-09-01T06:20:20Z",
+          49472
+        ],
+        [
+          "2025-09-01T06:20:30Z",
+          82755.2
+        ],
+        [
+          "2025-09-01T06:20:40Z",
+          30317.6
+        ],
+        [
+          "2025-09-01T06:20:50Z",
+          75843.2
+        ],
+        [
+          "2025-09-01T06:21:00Z",
+          51331.2
+        ],
+        [
+          "2025-09-01T06:21:10Z",
+          29304.8
+        ],
+        [
+          "2025-09-01T06:21:20Z",
+          45600
+        ],
+        [
+          "2025-09-01T06:21:30Z",
+          79865.6
+        ],
+        [
+          "2025-09-01T06:21:40Z",
+          30898.4
+        ],
+        [
+          "2025-09-01T06:21:50Z",
+          83446.4
+        ],
+        [
+          "2025-09-01T06:22:00Z",
+          93699.2
+        ],
+        [
+          "2025-09-01T06:22:10Z",
+          84384.8
+        ],
+        [
+          "2025-09-01T06:22:20Z",
+          78492.8
+        ],
+        [
+          "2025-09-01T06:22:30Z",
+          119888
+        ],
+        [
+          "2025-09-01T06:22:40Z",
+          79095.2
+        ],
+        [
+          "2025-09-01T06:22:50Z",
+          115284.8
+        ],
+        [
+          "2025-09-01T06:23:00Z",
+          72753.6
+        ]
+      ],
+      received: [
+        [
+          "2025-09-01T06:13:20Z",
+          6688
+        ],
+        [
+          "2025-09-01T06:13:30Z",
+          31003.2
+        ],
+        [
+          "2025-09-01T06:13:40Z",
+          9921.6
+        ],
+        [
+          "2025-09-01T06:13:50Z",
+          26492
+        ],
+        [
+          "2025-09-01T06:14:00Z",
+          20560
+        ],
+        [
+          "2025-09-01T06:14:10Z",
+          9872
+        ],
+        [
+          "2025-09-01T06:14:20Z",
+          14263.2
+        ],
+        [
+          "2025-09-01T06:14:30Z",
+          28508.8
+        ],
+        [
+          "2025-09-01T06:14:40Z",
+          10624
+        ],
+        [
+          "2025-09-01T06:14:50Z",
+          24696.8
+        ],
+        [
+          "2025-09-01T06:15:00Z",
+          19360
+        ],
+        [
+          "2025-09-01T06:15:10Z",
+          13137.6
+        ],
+        [
+          "2025-09-01T06:15:20Z",
+          13656.8
+        ],
+        [
+          "2025-09-01T06:15:30Z",
+          30264
+        ],
+        [
+          "2025-09-01T06:15:40Z",
+          10220.8
+        ],
+        [
+          "2025-09-01T06:15:50Z",
+          23640.8
+        ],
+        [
+          "2025-09-01T06:16:00Z",
+          22033.6
+        ],
+        [
+          "2025-09-01T06:16:10Z",
+          12547.2
+        ],
+        [
+          "2025-09-01T06:16:20Z",
+          13597.6
+        ],
+        [
+          "2025-09-01T06:16:30Z",
+          31094.4
+        ],
+        [
+          "2025-09-01T06:16:40Z",
+          8448
+        ],
+        [
+          "2025-09-01T06:16:50Z",
+          36344.8
+        ],
+        [
+          "2025-09-01T06:17:00Z",
+          31547.2
+        ],
+        [
+          "2025-09-01T06:17:10Z",
+          7668.8
+        ],
+        [
+          "2025-09-01T06:17:20Z",
+          16740
+        ],
+        [
+          "2025-09-01T06:17:30Z",
+          28779.2
+        ],
+        [
+          "2025-09-01T06:17:40Z",
+          9577.6
+        ],
+        [
+          "2025-09-01T06:17:50Z",
+          25488.8
+        ],
+        [
+          "2025-09-01T06:18:00Z",
+          17904
+        ],
+        [
+          "2025-09-01T06:18:10Z",
+          11766.4
+        ],
+        [
+          "2025-09-01T06:18:20Z",
+          17048.8
+        ],
+        [
+          "2025-09-01T06:18:30Z",
+          27993.6
+        ],
+        [
+          "2025-09-01T06:18:40Z",
+          11011.2
+        ],
+        [
+          "2025-09-01T06:18:50Z",
+          26893.6
+        ],
+        [
+          "2025-09-01T06:19:00Z",
+          18214.4
+        ],
+        [
+          "2025-09-01T06:19:10Z",
+          12939.2
+        ],
+        [
+          "2025-09-01T06:19:20Z",
+          14156
+        ],
+        [
+          "2025-09-01T06:19:30Z",
+          28691.2
+        ],
+        [
+          "2025-09-01T06:19:40Z",
+          9516.8
+        ],
+        [
+          "2025-09-01T06:19:50Z",
+          25095.2
+        ],
+        [
+          "2025-09-01T06:20:00Z",
+          23022.4
+        ],
+        [
+          "2025-09-01T06:20:10Z",
+          7769.6
+        ],
+        [
+          "2025-09-01T06:20:20Z",
+          16442.4
+        ],
+        [
+          "2025-09-01T06:20:30Z",
+          29521.6
+        ],
+        [
+          "2025-09-01T06:20:40Z",
+          8787.2
+        ],
+        [
+          "2025-09-01T06:20:50Z",
+          26077.6
+        ],
+        [
+          "2025-09-01T06:21:00Z",
+          21510.4
+        ],
+        [
+          "2025-09-01T06:21:10Z",
+          8960
+        ],
+        [
+          "2025-09-01T06:21:20Z",
+          16639.2
+        ],
+        [
+          "2025-09-01T06:21:30Z",
+          27297.6
+        ],
+        [
+          "2025-09-01T06:21:40Z",
+          10097.6
+        ],
+        [
+          "2025-09-01T06:21:50Z",
+          28476
+        ],
+        [
+          "2025-09-01T06:22:00Z",
+          31428.8
+        ],
+        [
+          "2025-09-01T06:22:10Z",
+          30582.4
+        ],
+        [
+          "2025-09-01T06:22:20Z",
+          26656.8
+        ],
+        [
+          "2025-09-01T06:22:30Z",
+          39756.8
+        ],
+        [
+          "2025-09-01T06:22:40Z",
+          26561.6
+        ],
+        [
+          "2025-09-01T06:22:50Z",
+          37727.2
+        ],
+        [
+          "2025-09-01T06:23:00Z",
+          26284.8
+        ]
+      ]
+    }
+    _data.cpu = [
+      [
+        "2025-09-01T06:13:16.592148699Z",
+        7.849999999999994
+      ],
+      [
+        "2025-09-01T06:13:21.585804019Z",
+        9.459999999999994
+      ],
+      [
+        "2025-09-01T06:13:26.588592319Z",
+        7.3799999999999955
+      ],
+      [
+        "2025-09-01T06:13:31.591434597Z",
+        6.709999999999994
+      ],
+      [
+        "2025-09-01T06:13:36.586589723Z",
+        10.060000000000002
+      ],
+      [
+        "2025-09-01T06:13:41.588604239Z",
+        6.230000000000004
+      ],
+      [
+        "2025-09-01T06:13:46.592404576Z",
+        7.200000000000003
+      ],
+      [
+        "2025-09-01T06:13:51.588164479Z",
+        9.560000000000002
+      ],
+      [
+        "2025-09-01T06:13:56.590665664Z",
+        6.280000000000001
+      ],
+      [
+        "2025-09-01T06:14:01.583644421Z",
+        7.180000000000007
+      ],
+      [
+        "2025-09-01T06:14:06.590321668Z",
+        9.980000000000004
+      ],
+      [
+        "2025-09-01T06:14:11.592913228Z",
+        7.170000000000002
+      ],
+      [
+        "2025-09-01T06:14:16.586662482Z",
+        6.829999999999998
+      ],
+      [
+        "2025-09-01T06:14:21.591552921Z",
+        9.310000000000002
+      ],
+      [
+        "2025-09-01T06:14:26.584005273Z",
+        7.469999999999999
+      ],
+      [
+        "2025-09-01T06:14:31.586348195Z",
+        8.099999999999994
+      ],
+      [
+        "2025-09-01T06:14:36.591890166Z",
+        10.239999999999995
+      ],
+      [
+        "2025-09-01T06:14:41.585374456Z",
+        7.200000000000003
+      ],
+      [
+        "2025-09-01T06:14:46.589260204Z",
+        7.269999999999996
+      ],
+      [
+        "2025-09-01T06:14:51.594586339Z",
+        9.120000000000005
+      ],
+      [
+        "2025-09-01T06:14:56.586185042Z",
+        5.939999999999998
+      ],
+      [
+        "2025-09-01T06:15:01.588371252Z",
+        6.959999999999994
+      ],
+      [
+        "2025-09-01T06:15:06.584529005Z",
+        10.11
+      ],
+      [
+        "2025-09-01T06:15:11.586659506Z",
+        6.549999999999997
+      ],
+      [
+        "2025-09-01T06:15:16.590466387Z",
+        6.790000000000006
+      ],
+      [
+        "2025-09-01T06:15:21.584573919Z",
+        8.670000000000002
+      ],
+      [
+        "2025-09-01T06:15:26.586727474Z",
+        7.019999999999996
+      ],
+      [
+        "2025-09-01T06:15:31.590906384Z",
+        6.730000000000004
+      ],
+      [
+        "2025-09-01T06:15:36.585975561Z",
+        9.590000000000003
+      ],
+      [
+        "2025-09-01T06:15:41.588899927Z",
+        6.439999999999998
+      ],
+      [
+        "2025-09-01T06:15:46.592468377Z",
+        8.219999999999999
+      ],
+      [
+        "2025-09-01T06:15:51.587153019Z",
+        10.230000000000004
+      ],
+      [
+        "2025-09-01T06:15:56.589238192Z",
+        6.310000000000002
+      ],
+      [
+        "2025-09-01T06:16:01.593977305Z",
+        6.569999999999993
+      ],
+      [
+        "2025-09-01T06:16:06.589078936Z",
+        9.840000000000003
+      ],
+      [
+        "2025-09-01T06:16:11.590916179Z",
+        6.340000000000003
+      ],
+      [
+        "2025-09-01T06:16:16.585881247Z",
+        7.049999999999997
+      ],
+      [
+        "2025-09-01T06:16:21.590592472Z",
+        9.019999999999996
+      ],
+      [
+        "2025-09-01T06:16:26.584254701Z",
+        5.799999999999997
+      ],
+      [
+        "2025-09-01T06:16:31.588858469Z",
+        6.579999999999998
+      ],
+      [
+        "2025-09-01T06:16:36.584903954Z",
+        9.349999999999994
+      ],
+      [
+        "2025-09-01T06:16:41.586857163Z",
+        6.739999999999995
+      ],
+      [
+        "2025-09-01T06:16:46.591272308Z",
+        7.400000000000006
+      ],
+      [
+        "2025-09-01T06:16:51.58647666Z",
+        8.760000000000005
+      ],
+      [
+        "2025-09-01T06:16:56.590560953Z",
+        6.299999999999997
+      ],
+      [
+        "2025-09-01T06:17:01.584683866Z",
+        7.8700000000000045
+      ],
+      [
+        "2025-09-01T06:17:06.589264331Z",
+        10.950000000000003
+      ],
+      [
+        "2025-09-01T06:17:11.592086144Z",
+        6.200000000000003
+      ],
+      [
+        "2025-09-01T06:17:16.584354386Z",
+        6.670000000000002
+      ],
+      [
+        "2025-09-01T06:17:21.588554123Z",
+        8.730000000000004
+      ],
+      [
+        "2025-09-01T06:17:26.591148288Z",
+        5.75
+      ],
+      [
+        "2025-09-01T06:17:31.584136195Z",
+        6.430000000000007
+      ],
+      [
+        "2025-09-01T06:17:36.589100971Z",
+        9.5
+      ],
+      [
+        "2025-09-01T06:17:41.593692328Z",
+        6.230000000000004
+      ],
+      [
+        "2025-09-01T06:17:46.586095013Z",
+        7.019999999999996
+      ],
+      [
+        "2025-09-01T06:17:51.590335823Z",
+        9
+      ],
+      [
+        "2025-09-01T06:17:56.594540097Z",
+        6.739999999999995
+      ],
+      [
+        "2025-09-01T06:18:01.58855587Z",
+        6.590000000000003
+      ],
+      [
+        "2025-09-01T06:18:06.584003729Z",
+        9.780000000000001
+      ],
+      [
+        "2025-09-01T06:18:11.586997029Z",
+        5.930000000000007
+      ],
+      [
+        "2025-09-01T06:18:16.59067188Z",
+        8.650000000000006
+      ],
+      [
+        "2025-09-01T06:18:21.585339422Z",
+        10.730000000000004
+      ],
+      [
+        "2025-09-01T06:18:26.589049402Z",
+        6.849999999999994
+      ],
+      [
+        "2025-09-01T06:18:31.591983397Z",
+        6.420000000000002
+      ],
+      [
+        "2025-09-01T06:18:36.589033381Z",
+        9.379999999999995
+      ],
+      [
+        "2025-09-01T06:18:41.592569495Z",
+        5.920000000000002
+      ],
+      [
+        "2025-09-01T06:18:46.585097209Z",
+        7.040000000000006
+      ],
+      [
+        "2025-09-01T06:18:51.590326058Z",
+        9.040000000000006
+      ],
+      [
+        "2025-09-01T06:18:56.592207602Z",
+        6.299999999999997
+      ],
+      [
+        "2025-09-01T06:19:01.584566575Z",
+        6.560000000000002
+      ],
+      [
+        "2025-09-01T06:19:06.589809729Z",
+        9.959999999999994
+      ],
+      [
+        "2025-09-01T06:19:11.592770275Z",
+        7.400000000000006
+      ],
+      [
+        "2025-09-01T06:19:16.585981991Z",
+        6.769999999999996
+      ],
+      [
+        "2025-09-01T06:19:21.590752396Z",
+        9.530000000000001
+      ],
+      [
+        "2025-09-01T06:19:26.593223886Z",
+        6
+      ],
+      [
+        "2025-09-01T06:19:31.585968321Z",
+        8.370000000000005
+      ],
+      [
+        "2025-09-01T06:19:36.592431695Z",
+        10.909999999999997
+      ],
+      [
+        "2025-09-01T06:19:41.585500115Z",
+        6.150000000000006
+      ],
+      [
+        "2025-09-01T06:19:46.588459615Z",
+        6.640000000000001
+      ],
+      [
+        "2025-09-01T06:19:51.593573573Z",
+        9.129999999999995
+      ],
+      [
+        "2025-09-01T06:19:56.585916302Z",
+        6.549999999999997
+      ],
+      [
+        "2025-09-01T06:20:01.588468835Z",
+        7.280000000000001
+      ],
+      [
+        "2025-09-01T06:20:06.584967154Z",
+        9.819999999999993
+      ],
+      [
+        "2025-09-01T06:20:11.588088209Z",
+        6.329999999999998
+      ],
+      [
+        "2025-09-01T06:20:16.593030985Z",
+        6.969999999999999
+      ],
+      [
+        "2025-09-01T06:20:21.588333389Z",
+        9.599999999999994
+      ],
+      [
+        "2025-09-01T06:20:26.590695924Z",
+        6.170000000000002
+      ],
+      [
+        "2025-09-01T06:20:31.584413326Z",
+        6.409999999999997
+      ],
+      [
+        "2025-09-01T06:20:36.589163893Z",
+        9.430000000000007
+      ],
+      [
+        "2025-09-01T06:20:41.592667697Z",
+        6.590000000000003
+      ],
+      [
+        "2025-09-01T06:20:46.586573325Z",
+        8.540000000000006
+      ],
+      [
+        "2025-09-01T06:20:51.593027734Z",
+        10.5
+      ],
+      [
+        "2025-09-01T06:20:56.584648984Z",
+        6.219999999999999
+      ],
+      [
+        "2025-09-01T06:21:01.588278068Z",
+        6.8700000000000045
+      ],
+      [
+        "2025-09-01T06:21:06.592307073Z",
+        9.670000000000002
+      ],
+      [
+        "2025-09-01T06:21:11.585052667Z",
+        6.790000000000006
+      ],
+      [
+        "2025-09-01T06:21:16.589069792Z",
+        7.140000000000001
+      ],
+      [
+        "2025-09-01T06:21:21.592870389Z",
+        9.599999999999994
+      ],
+      [
+        "2025-09-01T06:21:26.584360229Z",
+        6.640000000000001
+      ],
+      [
+        "2025-09-01T06:21:31.587982183Z",
+        6.6299999999999955
+      ],
+      [
+        "2025-09-01T06:21:36.592933811Z",
+        10.420000000000002
+      ],
+      [
+        "2025-09-01T06:21:41.585139572Z",
+        6.760000000000005
+      ],
+      [
+        "2025-09-01T06:21:46.589782215Z",
+        7.3799999999999955
+      ],
+      [
+        "2025-09-01T06:21:51.583664873Z",
+        9.75
+      ],
+      [
+        "2025-09-01T06:21:56.586524372Z",
+        6.560000000000002
+      ],
+      [
+        "2025-09-01T06:22:01.589669636Z",
+        9.489999999999995
+      ],
+      [
+        "2025-09-01T06:22:06.585495473Z",
+        11.180000000000007
+      ],
+      [
+        "2025-09-01T06:22:11.589164774Z",
+        7.109999999999999
+      ],
+      [
+        "2025-09-01T06:22:16.591691475Z",
+        7.489999999999995
+      ],
+      [
+        "2025-09-01T06:22:21.58543411Z",
+        9.439999999999998
+      ],
+      [
+        "2025-09-01T06:22:26.588519894Z",
+        6.540000000000006
+      ],
+      [
+        "2025-09-01T06:22:31.59165337Z",
+        7.019999999999996
+      ],
+      [
+        "2025-09-01T06:22:36.585850994Z",
+        9.709999999999994
+      ],
+      [
+        "2025-09-01T06:22:41.589216573Z",
+        6.8799999999999955
+      ],
+      [
+        "2025-09-01T06:22:46.592113922Z",
+        7.609999999999999
+      ],
+      [
+        "2025-09-01T06:22:51.586518959Z",
+        10.11
+      ],
+      [
+        "2025-09-01T06:22:56.589741153Z",
+        6.599999999999994
+      ],
+      [
+        "2025-09-01T06:23:01.584548661Z",
+        9.930000000000007
+      ]
+    ];
+    _data.memory = [["2025-09-01T06:13:16.592260588Z", 70.14117002374628], ["2025-09-01T06:13:21.585926871Z", 70.13421637719414], ["2025-09-01T06:13:26.588698751Z", 70.13383753177565], ["2025-09-01T06:13:31.591537989Z", 70.13893361369524], ["2025-09-01T06:13:36.586724859Z", 70.132004408783], ["2025-09-01T06:13:41.588708867Z", 70.13364199865644], ["2025-09-01T06:13:46.592522086Z", 70.13744267366121], ["2025-09-01T06:13:51.588255454Z", 70.1338008693158], ["2025-09-01T06:13:56.590777328Z", 70.13325704282799], ["2025-09-01T06:14:01.583771527Z", 70.1447568344019], ["2025-09-01T06:14:06.59042958Z", 70.13213883780247], ["2025-09-01T06:14:11.593017008Z", 70.13244435830124], ["2025-09-01T06:14:16.586775697Z", 70.13785818153954], ["2025-09-01T06:14:21.591667785Z", 70.13378864849585], ["2025-09-01T06:14:26.584104046Z", 70.13271321634016], ["2025-09-01T06:14:31.586446167Z", 70.13948355059303], ["2025-09-01T06:14:36.592021702Z", 70.13113673056648], ["2025-09-01T06:14:41.585484213Z", 70.13339758225742], ["2025-09-01T06:14:46.589388717Z", 70.13784596071959], ["2025-09-01T06:14:51.594692242Z", 70.13288430781948], ["2025-09-01T06:14:56.5862942Z", 70.13149724475504], ["2025-09-01T06:15:01.588472744Z", 70.13633668945565], ["2025-09-01T06:15:06.584628942Z", 70.13384975259561], ["2025-09-01T06:15:11.58682366Z", 70.13575009009799], ["2025-09-01T06:15:16.590575154Z", 70.1348763014715], ["2025-09-01T06:15:21.584686753Z", 70.13368477152628], ["2025-09-01T06:15:26.586831273Z", 70.13232215010173], ["2025-09-01T06:15:31.591011705Z", 70.14007626036066], ["2025-09-01T06:15:36.58608956Z", 70.13511460746055], ["2025-09-01T06:15:41.588998234Z", 70.13502295131092], ["2025-09-01T06:15:46.592559186Z", 70.13562788189849], ["2025-09-01T06:15:51.587264363Z", 70.13238936461146], ["2025-09-01T06:15:56.589339233Z", 70.13262767060051], ["2025-09-01T06:16:01.594081723Z", 70.13836534556751], ["2025-09-01T06:16:06.58919583Z", 70.13039126054947], ["2025-09-01T06:16:11.591044558Z", 70.13192497345332], ["2025-09-01T06:16:16.585988474Z", 70.13466243712236], ["2025-09-01T06:16:21.590723008Z", 70.13236492297156], ["2025-09-01T06:16:26.584375318Z", 70.13068456022829], ["2025-09-01T06:16:31.588984337Z", 70.13793761686922], ["2025-09-01T06:16:36.58502312Z", 70.12965801135242], ["2025-09-01T06:16:41.586998811Z", 70.13136892614556], ["2025-09-01T06:16:46.591374391Z", 70.13648944970502], ["2025-09-01T06:16:51.586590188Z", 70.1301101816906], ["2025-09-01T06:16:56.590665075Z", 70.13077010596795], ["2025-09-01T06:17:01.584794612Z", 70.13869530770619], ["2025-09-01T06:17:06.589371201Z", 70.13274987880001], ["2025-09-01T06:17:11.592215164Z", 70.13128949081587], ["2025-09-01T06:17:16.584460056Z", 70.1362205916661], ["2025-09-01T06:17:21.588685686Z", 70.13284764535963], ["2025-09-01T06:17:26.591250963Z", 70.13248102076109], ["2025-09-01T06:17:31.58427035Z", 70.13854865786678], ["2025-09-01T06:17:36.589225288Z", 70.13691106799335], ["2025-09-01T06:17:41.593797443Z", 70.13116728261636], ["2025-09-01T06:17:46.586194625Z", 70.13768709006023], ["2025-09-01T06:17:51.590439979Z", 70.1333548093876], ["2025-09-01T06:17:56.594673312Z", 70.13171721951416], ["2025-09-01T06:18:01.588661948Z", 70.14120057579615], ["2025-09-01T06:18:06.58411037Z", 70.13416138350436], ["2025-09-01T06:18:11.587119244Z", 70.13388030464549], ["2025-09-01T06:18:16.590782293Z", 70.13890306164537], ["2025-09-01T06:18:21.585446534Z", 70.13501073049096], ["2025-09-01T06:18:26.589180107Z", 70.1357745317379], ["2025-09-01T06:18:31.592092116Z", 70.13809037711862], ["2025-09-01T06:18:36.589147797Z", 70.13108784728668], ["2025-09-01T06:18:41.592704314Z", 70.13248102076109], ["2025-09-01T06:18:46.585207504Z", 70.13488241188148], ["2025-09-01T06:18:51.590430315Z", 70.13340980307737], ["2025-09-01T06:18:56.592327191Z", 70.1334525759472], ["2025-09-01T06:19:01.584694975Z", 70.1412616798959], ["2025-09-01T06:19:06.589948681Z", 70.13449745605301], ["2025-09-01T06:19:11.592934332Z", 70.13296374314916], ["2025-09-01T06:19:16.586090094Z", 70.14154275875478], ["2025-09-01T06:19:21.590857961Z", 70.13416138350436], ["2025-09-01T06:19:26.593331073Z", 70.1334036926674], ["2025-09-01T06:19:31.586083334Z", 70.13913525722442], ["2025-09-01T06:19:36.592542087Z", 70.13705771783275], ["2025-09-01T06:19:41.585613885Z", 70.13276821002995], ["2025-09-01T06:19:46.588568998Z", 70.1370454970128], ["2025-09-01T06:19:51.593691669Z", 70.1343263645737], ["2025-09-01T06:19:56.586031833Z", 70.13529791975981], ["2025-09-01T06:20:01.588572724Z", 70.14211713729249], ["2025-09-01T06:20:06.585075479Z", 70.13334258856764], ["2025-09-01T06:20:11.588107574Z", 70.13261544978056], ["2025-09-01T06:20:16.593160488Z", 70.1372226989021], ["2025-09-01T06:20:21.588354889Z", 70.13259711855063], ["2025-09-01T06:20:26.590824087Z", 70.13502295131092], ["2025-09-01T06:20:31.584522876Z", 70.14283205525962], ["2025-09-01T06:20:36.589296898Z", 70.13480908696177], ["2025-09-01T06:20:41.592788834Z", 70.13478464532187], ["2025-09-01T06:20:46.586693592Z", 70.13872585975606], ["2025-09-01T06:20:51.593136846Z", 70.13392307751532], ["2025-09-01T06:20:56.584779718Z", 70.13434469580363], ["2025-09-01T06:21:01.588410698Z", 70.14300314673892], ["2025-09-01T06:21:06.592419466Z", 70.1348763014715], ["2025-09-01T06:21:11.585170492Z", 70.13414916268441], ["2025-09-01T06:21:16.589195824Z", 70.14066897012829], ["2025-09-01T06:21:21.592989107Z", 70.13248713117108], ["2025-09-01T06:21:26.584469706Z", 70.13386808382553], ["2025-09-01T06:21:31.588087395Z", 70.13837756638746], ["2025-09-01T06:21:36.593044502Z", 70.13366032988637], ["2025-09-01T06:21:41.585244124Z", 70.13529180934984], ["2025-09-01T06:21:46.589888196Z", 70.13871363893612], ["2025-09-01T06:21:51.583784509Z", 70.13197385673313], ["2025-09-01T06:21:56.586660784Z", 70.13313483462848], ["2025-09-01T06:22:01.589771206Z", 70.14270373665012], ["2025-09-01T06:22:06.58559842Z", 70.13419804596421], ["2025-09-01T06:22:11.589247604Z", 70.13550567369897], ["2025-09-01T06:22:16.591797549Z", 70.14108447800662], ["2025-09-01T06:22:21.585551585Z", 70.13570731722817], ["2025-09-01T06:22:26.588665672Z", 70.13683163266367], ["2025-09-01T06:22:31.591772094Z", 70.13972185658209], ["2025-09-01T06:22:36.585968421Z", 70.13563399230846], ["2025-09-01T06:22:41.589328654Z", 70.13586618788753], ["2025-09-01T06:22:46.592231576Z", 70.14180550638372], ["2025-09-01T06:22:51.586641896Z", 70.13337925102749], ["2025-09-01T06:22:56.589846282Z", 70.13572564845809], ["2025-09-01T06:23:01.584662533Z", 70.14054676192877]]
+
+    this.chartOption1 = {
+      tooltip: {
+        trigger: 'axis',
+        formatter: function (params: any) {
+          if (Array.isArray(params) && params.length > 0) {
+            const date = new Date(params[0].value[0]);
+            const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;
+
+            let tooltipContent = `${formattedDate}<br/>`;
+            params.forEach(param => {
+              if (param.value && Array.isArray(param.value) && param.value.length === 2) {
+                const valueInKbps = (param.value[1] / 1000).toFixed(1);
+                const dot = `<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${param.color};"></span>`;
+                tooltipContent += `${dot} ${param.seriesName} ${valueInKbps}Kbps<br/>`;
+              }
+            });
+            return tooltipContent;
+          }
+          return '';
+        }
+      },
+      legend: {
+        data: ['Sent', 'Received']
+      },
+      xAxis: {
+        type: 'time',
+        axisLabel: {
+          formatter: '{HH}:{mm}:{ss}'
+        }
+      },
+      yAxis: {
+        type: 'value',
+        name: 'Value (bps)'
+      },
+      series: [
+        {
+          name: 'Sent',
+          data: _data?.throughput?.sent,
+          type: 'line'
+        },
+        {
+          name: 'Received',
+          data: _data?.throughput?.received,
+          type: 'line',
+        }
+      ],
+    }
+
+    this.chartOption2 = {
+      tooltip: {
+        trigger: 'axis',
+        formatter: function (params: any) {
+          if (Array.isArray(params) && params.length > 0) {
+            const date = new Date(params[0].value[0]);
+            const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;
+
+            let tooltipContent = `${formattedDate}<br/>`;
+            params.forEach(param => {
+              if (param.value && Array.isArray(param.value) && param.value.length === 2) {
+                const value = (param.value[1]).toFixed(1);
+                const dot = `<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${param.color};"></span>`;
+                tooltipContent += `${dot} ${param.seriesName} ${value}%<br/>`;
+              }
+            });
+            return tooltipContent;
+          }
+          return '';
+        }
+      },
+      legend: {
+        data: ['CPU']
+      },
+      xAxis: {
+        type: 'time',
+        axisLabel: {
+          formatter: '{HH}:{mm}:{ss}'
+        }
+      },
+      yAxis: {
+        type: 'value',
+        name: 'Value (%)'
+      },
+      series: [
+        {
+          name: 'CPU',
+          data: _data?.cpu,
+          type: 'line'
+        }
+      ],
+    }
+
+    this.chartOption3 = {
+      tooltip: {
+        trigger: 'axis',
+        formatter: function (params: any) {
+          if (Array.isArray(params) && params.length > 0) {
+            const date = new Date(params[0].value[0]);
+            const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;
+
+            let tooltipContent = `${formattedDate}<br/>`;
+            params.forEach(param => {
+              if (param.value && Array.isArray(param.value) && param.value.length === 2) {
+                const value = (param.value[1]).toFixed(1);
+                const dot = `<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${param.color};"></span>`;
+                tooltipContent += `${dot} ${param.seriesName} ${value}%<br/>`;
+              }
+            });
+            return tooltipContent;
+          }
+          return '';
+        }
+      },
+      legend: {
+        data: ['Memory']
+      },
+      xAxis: {
+        type: 'time',
+        axisLabel: {
+          formatter: '{HH}:{mm}:{ss}'
+        }
+      },
+      yAxis: {
+        type: 'value',
+        name: 'Value (%)'
+      },
+      series: [
+        {
+          name: 'Memory',
+          data: _data?.memory,
+          type: 'line'
+        }
+      ],
+    }
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.html	(working copy)
@@ -0,0 +1,42 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <mat-card-title>
+      <a class="back-to-main-page" (click)="navigateToAVXDevices()">
+        <fa-icon [icon]="['far', 'circle-left']"></fa-icon>
+        AVX Devices
+      </a>
+    </mat-card-title>
+  </mat-card-header>
+</mat-card>
+<div class="tab-container">
+  <mat-tab-group animationDuration="0ms" [selectedIndex]="selectedTabIndex" (selectedTabChange)="onTabChange($event)">
+    <mat-tab label="Overview">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-device-detail-overview/>
+        </div>
+      </ng-template>
+    </mat-tab>
+    <mat-tab label="VA Deployments">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-device-detail-deployments/>
+        </div>
+      </ng-template>
+    </mat-tab>
+    <mat-tab label="Configuration">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-device-detail-configuration/>
+        </div>
+      </ng-template>
+    </mat-tab>
+    <mat-tab label="Log">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-device-detail-logs/>
+        </div>
+      </ng-template>
+    </mat-tab>
+  </mat-tab-group>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxDeviceDetails } from './avx-device-details';
+
+describe('AvxDeviceDetails', () => {
+  let component: AvxDeviceDetails;
+  let fixture: ComponentFixture<AvxDeviceDetails>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxDeviceDetails]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxDeviceDetails);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-device-details/avx-device-details.ts	(working copy)
@@ -0,0 +1,78 @@
+import {Component, OnInit} from '@angular/core';
+import {ActivatedRoute, Router} from '@angular/router';
+import {MatTabChangeEvent} from '@angular/material/tabs';
+import {AvxDeviceDetailOverview} from '../avx-device-detail-overview/avx-device-detail-overview';
+import {AvxDeviceDetailDeployments} from '../avx-device-detail-deployments/avx-device-detail-deployments';
+import {AvxDeviceDetailConfiguration} from '../avx-device-detail-configuration/avx-device-detail-configuration';
+import {AvxDeviceDetailLogs} from '../avx-device-detail-logs/avx-device-detail-logs';
+import {SharedModule} from '../../../shared/shared-module';
+
+@Component({
+  selector: 'app-avx-device-details',
+  imports: [
+    SharedModule,
+    AvxDeviceDetailOverview,
+    AvxDeviceDetailDeployments,
+    AvxDeviceDetailConfiguration,
+    AvxDeviceDetailLogs
+  ],
+  templateUrl: './avx-device-details.html',
+  styleUrl: './avx-device-details.scss'
+})
+export class AvxDeviceDetails implements OnInit {
+
+  deviceName: any = '';
+  deviceId: any = '';
+  selectedTabIndex: number = 0;
+  private tabNames: string[] = [
+    'Overview',
+    'VA Deployments',
+    'Configuration',
+    'Log',
+  ];
+
+  constructor(
+    private _route: ActivatedRoute,
+    private _router: Router,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+
+    this._route.queryParams.subscribe(params => {
+      const tabParam = params['tab'];
+      if (tabParam) {
+        const index = this.tabNames.indexOf(tabParam);
+        if (index !== -1) {
+          this.selectedTabIndex = index;
+        } else {
+          this.selectedTabIndex = 0;
+        }
+      } else {
+        this.updateQueryParams(this.selectedTabIndex);
+      }
+    });
+  }
+
+  navigateToAVXDevices() {
+    this._router.navigate(['/avx/devices']);
+  }
+
+  onTabChange(event: MatTabChangeEvent): void {
+    this.selectedTabIndex = event.index;
+    this.updateQueryParams(event.index);
+  }
+
+  private updateQueryParams(tabIndex: number): void {
+    const tabName = this.tabNames[tabIndex];
+    if (tabName) {
+      this._router.navigate([], {
+        relativeTo: this._route,
+        queryParams: {tab: tabName},
+        queryParamsHandling: 'merge'
+      });
+    }
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/add-avx-device.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/add-avx-device.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/add-avx-device.html	(working copy)
@@ -0,0 +1,129 @@
+<h2 mat-dialog-title>Add AVX Device</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+  >
+    <div class="form-field-wrapper">
+      <label for="name" class="form-label">Device name *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="name"
+          formControlName="name"
+          matInput
+          placeholder="Device name"
+          type="text"
+        />
+        @if (configForm.get('name')?.invalid && configForm.get('name')?.touched) {
+          <mat-error>
+            @if (configForm.get('name')?.errors?.['required']) {
+              Device name is required.
+            } @else {
+              Invalid device name format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="ip" class="form-label">IP Address *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="ip"
+          formControlName="ip"
+          matInput
+          placeholder="IP Address"
+          type="text"
+        />
+        @if (configForm.get('ip')?.invalid && configForm.get('ip')?.touched) {
+          <mat-error>
+            @if (configForm.get('ip')?.errors?.['required']) {
+              IPv4 address is required.
+            } @else if (configForm.get('ip')?.errors?.['ipv4']) {
+              Invalid IPv4 address format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="restapi_port" class="form-label">API Port *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="restapi_port"
+          formControlName="restapi_port"
+          matInput
+          placeholder="9997"
+          type="number"
+        />
+        @if (configForm.get('restapi_port')?.invalid && configForm.get('restapi_port')?.touched) {
+          <mat-error>
+            @if (configForm.get('restapi_port')?.errors?.['required']) {
+              API port is required.
+            } @else {
+              Invalid port number format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="restapi_username" class="form-label">API Username *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="restapi_username"
+          formControlName="restapi_username"
+          matInput
+          placeholder="API Username"
+          type="text"
+        />
+        @if (configForm.get('restapi_username')?.invalid && configForm.get('restapi_username')?.touched) {
+          <mat-error>
+            @if (configForm.get('restapi_username')?.errors?.['required']) {
+              Username is required.
+            } @else {
+              Invalid username format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="restapi_password" class="form-label">API Password *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="restapi_password"
+          formControlName="restapi_password"
+          matInput
+          placeholder="API Password"
+          type="password"
+        />
+        @if (configForm.get('restapi_password')?.invalid && configForm.get('restapi_password')?.touched) {
+          <mat-error>
+            @if (configForm.get('restapi_password')?.errors?.['required']) {
+              Password is required.
+            } @else {
+              Invalid password format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <mat-hint>Please make sure that the RESTful API Service is enabled with "https" protocol on the target AVX device.
+    </mat-hint>
+  </form>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+  <button
+    mat-button
+    color="basic"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.html	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.html	(working copy)
@@ -1 +1,104 @@
-<p>avx-devices works!</p>
+<mat-card class="page-card-1" appearance="filled">
+    <mat-card-header>
+      <mat-card-title>AVX Devices</mat-card-title>
+    </mat-card-header>
+  <mat-card-content>
+    <div class="button-container">
+      <button mat-raised-button (click)="addAVXDevice()" matTooltip="Add AVX Device">Add</button>
+    </div>
+    <div class="table-container">
+      <div class="mat-elevation-z0">
+        <table mat-table [dataSource]="dataSource">
+          <ng-container matColumnDef="serial">
+            <th mat-header-cell *matHeaderCellDef>ID</th>
+            <td mat-cell *matCellDef="let element; let i = index;"> {{ i | globalSerial }}</td>
+          </ng-container>
+          <ng-container matColumnDef="deviceName">
+            <th mat-header-cell *matHeaderCellDef>Device Name</th>
+            <td mat-cell *matCellDef="let element">
+              <a class="details-page-link" (click)="goToDetails(element)">{{ element?.name }}</a>
+            </td>
+          </ng-container>
+          <ng-container matColumnDef="ip">
+            <th mat-header-cell *matHeaderCellDef>IP Address</th>
+            <td mat-cell *matCellDef="let element">{{ element?.ip }}</td>
+          </ng-container>
+          <ng-container matColumnDef="mode">
+            <th mat-header-cell *matHeaderCellDef>Model</th>
+            <td mat-cell *matCellDef="let element">{{ element?.model }}</td>
+          </ng-container>
+          <ng-container matColumnDef="va">
+            <th mat-header-cell *matHeaderCellDef>VA Instances</th>
+            <td mat-cell *matCellDef="let element">{{ element?.vm_number }}</td>
+          </ng-container>
+          <ng-container matColumnDef="stats">
+            <th mat-header-cell *matHeaderCellDef> Stats</th>
+            <td mat-cell *matCellDef="let element">
+              <div class="stats-container">
+                <div class="stat-item">
+                  <span>CPU:</span>
+                  <div echarts [options]="getMiniBarOptions(element.cpu_usage)" class="mini-chart"></div>
+                  <span class="progress-number">{{ element.cpu_usage }}%</span>
+                </div>
+
+                <div class="stat-item">
+                  <span>Memory:</span>
+                  <div echarts [options]="getMiniBarOptions(element.memory_usage)" class="mini-chart"></div>
+                  <span class="progress-number">{{ element.memory_usage }}%</span>
+                </div>
+
+                <div class="stat-item">
+                  <span>Disk:</span>
+                  <div echarts [options]="getMiniBarOptions(element.disk_usage)" class="mini-chart"></div>
+                  <span class="progress-number">{{ element.disk_usage }}%</span>
+                </div>
+              </div>
+            </td>
+          </ng-container>
+          <ng-container matColumnDef="status">
+            <th mat-header-cell *matHeaderCellDef>Status</th>
+            <td mat-cell *matCellDef="let element">
+              <div class="row-action a-link">
+                @if (element?.connection?.toLowerCase() === 'connected') {
+                  <fa-icon [icon]="['far', 'check-circle']" matTooltip="Connected" class="success-icon"></fa-icon>
+                } @else {
+                  <fa-icon [icon]="['far', 'xmark-circle']" matTooltip="Disconnected" class="delete-icon"></fa-icon>
+                }
+              </div>
+            </td>
+          </ng-container>
+          <ng-container matColumnDef="uptime">
+            <th mat-header-cell *matHeaderCellDef>System Uptime</th>
+            <td mat-cell *matCellDef="let element">{{ element?.system_up_time }}</td>
+          </ng-container>
+          <ng-container matColumnDef="action">
+            <th mat-header-cell *matHeaderCellDef>Action</th>
+            <td mat-cell *matCellDef="let element">
+              <div class="row-action a-link">
+                <fa-icon [icon]="['fas', 'id-badge']" size="lg" matTooltip="Show License"
+                         (click)="showLicense(element)"></fa-icon>
+                <fa-icon [icon]="['fas', 'tv']" size="lg" matTooltip="Show Web Interface"
+                         (click)="showWebInterface(element)"></fa-icon>
+                <fa-icon [icon]="['fas', 'terminal']" size="lg" matTooltip="Show Web Console"
+                         (click)="showWebConsole(element)"></fa-icon>
+                <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Remove AVX Device"
+                         (click)="deleteAVXDevice(element)"></fa-icon>
+              </div>
+            </td>
+          </ng-container>
+          <tr mat-header-row *matHeaderRowDef="dataColumns"></tr>
+          <tr mat-row *matRowDef="let row; columns: dataColumns;"></tr>
+          <tr class="mat-row table-no-data" *matNoDataRow>
+            <td class="mat-cell" colspan="11">No results found.</td>
+          </tr>
+        </table>
+        <mat-paginator
+          [length]="totalRecords"
+          [pageSize]="10"
+          [pageSizeOptions]="[10, 20, 50]"
+        >
+        </mat-paginator>
+      </div>
+    </div>
+  </mat-card-content>
+</mat-card>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.scss	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.scss	(working copy)
@@ -0,0 +1,47 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
+
+.stats-container {
+  display: flex;
+  flex-direction: column;
+  gap: 4px;
+}
+
+.stat-item {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+}
+
+.mini-chart {
+  width: 80px;
+  height: 14px;
+  line-height: 0;
+  display: flex;
+  align-items: center;
+}
+
+.progress-number {
+  font-size: 12px;
+  min-width: 30px;
+  text-align: right;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.ts	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.ts	(working copy)
@@ -1,11 +1,271 @@
-import { Component } from '@angular/core';
+import {Component, inject, OnInit, ViewChild} from '@angular/core';
+import {SharedModule} from '../../../shared/shared-module';
+import {AvxService} from '../../../services/avx-service';
+import {take} from 'rxjs/operators';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {NotificationService} from '../../../services/notification';
+import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {UtilsService} from '../../../services/utils-service';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+import {CustomValidators} from '../../../utils/custom-validators';
+import {Confirmation} from '../../../services/confirmation';
+import {Router} from '@angular/router';
 
 @Component({
   selector: 'app-avx-devices',
-  imports: [],
+  imports: [SharedModule, GlobalSerialPipe],
   templateUrl: './avx-devices.html',
-  styleUrl: './avx-devices.scss'
+  styleUrl: './avx-devices.scss',
 })
-export class AvxDevices {
+export class AvxDevices implements OnInit {
 
+  totalRecords: number = 0;
+  dataSource: MatTableDataSource<any> = new MatTableDataSource();
+  dataColumns: string[] = ['serial', 'deviceName', 'ip', 'mode', 'va', 'stats', 'status', 'uptime', 'action'];
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+
+  constructor(
+    private _avx: AvxService,
+    private _notification: NotificationService,
+    private _confirmation: Confirmation,
+    private _router: Router,
+  ) {
+  }
+
+  ngOnInit() {
+    setTimeout(() => {
+      this.getAVXDevices();
+    })
+  }
+
+  getAVXDevices() {
+    this.dataSource.data = [];
+    this.totalRecords = 0;
+    this._avx.getAVXDevices().pipe(take(1)).subscribe({
+      next: (result: any) => {
+        this.dataSource.data = result;
+        this.dataSource.paginator = this.paginator;
+        this.totalRecords = this.dataSource.data.length;
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  goToDetails(_device: any) {
+    this._router.navigate(['/avx/devices/details', _device?.name, _device?.id], {
+      state: {}
+    });
+  }
+
+  addAVXDevice() {
+    const dialogRef = this.dialog.open(AddAVXDeviceDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getAVXDevices();
+      }
+    })
+  }
+
+  showLicense(_device: any) {
+    this.dialogConfig.data = {
+      license: {
+        'Model': _device?.model,
+        'Serial Number': _device.serial_number,
+        'LicenseKey': _device?.license_key,
+        'Expiration Date': _device?.license_date,
+      }
+    }
+    const dialogRef = this.dialog.open(ShowAVXDeviceLicenseDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+    })
+  }
+
+  showWebInterface(_device: any) {
+
+  }
+
+  showWebConsole(_device: any) {
+  }
+
+  getMiniBarOptions(value: number) {
+    return {
+      grid: { left: 0, right: 0, top: 0, bottom: 0 },
+
+      // Y-axis is now the category axis
+      yAxis: {
+        type: 'category',
+        show: false,
+        data: [''],
+        axisLine: { show: false }
+      },
+
+      // X-axis is now the value axis
+      xAxis: {
+        type: 'value',
+        show: false,
+        min: 0,
+        max: 100,
+        splitLine: { show: false }
+      },
+
+      series: [
+        {
+          type: 'bar',
+          data: [value],
+          barWidth: 10, // Set the fixed height of the bar in pixels
+          barGap: '-100%',
+          itemStyle: {
+            color: value > 80 ? '#e53935' : value > 50 ? '#fb8c00' : '#43a047'
+          }
+        }
+      ]
+    };
+  }
+
+  deleteAVXDevice(_device: any) {
+    let deviceName = _device?.name;
+    let confirmMsg = `Are you sure you want to permanently delete "${deviceName}"?`
+    this._confirmation.openConfirmDialog({
+      title: `Delete ${deviceName}?`,
+      message: confirmMsg,
+      confirmButtonText: 'Yes, Delete It',
+      cancelButtonText: 'No, Keep It',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe(result => {
+      if (result) {
+        let rawPayload = new FormData();
+        rawPayload.set('pk', JSON.stringify({
+          "id": _device?.id,
+        }));
+        this._avx.deleteAVXDevice(rawPayload)
+          .pipe(take(1))
+          .subscribe({
+            next: (result: any) => {
+              // ToDo: Backend fix required.
+              if (result && result.length > 1) {
+                if (!result[0]) {
+                  this._notification.showError(`${result[1]}`);
+                } else {
+                  this._notification.showSuccess(`${deviceName} deleted successfully!`);
+                  this.getAVXDevices();
+                }
+              }
+            },
+            error: (err: any) => {
+              if (err.status === 200) {
+                // ToDo: Backend fix required.
+                this._notification.showSuccess(`${deviceName} deleted successfully!`);
+                this.getAVXDevices();
+              } else {
+                this._notification.showError('Deletion Failed.');
+              }
+            }
+          })
+      } else {
+        this._notification.showSuccess('Deletion cancelled.');
+      }
+    });
+  }
 }
+
+@Component({
+  selector: 'show-avx-device-license',
+  templateUrl: './show-avx-device-license.html',
+  imports: [SharedModule],
+})
+export class ShowAVXDeviceLicenseDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<ShowAVXDeviceLicenseDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+  dataColumns: Array<string> = ['key', 'value'];
+  dataSource = new MatTableDataSource([]);
+
+  constructor(private _utils: UtilsService) {
+  }
+
+  ngOnInit() {
+    this.dataSource = this._utils.processConfigData(this.data?.license);
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
+
+@Component({
+  selector: 'add-avx-device',
+  templateUrl: './add-avx-device.html',
+  imports: [SharedModule],
+})
+export class AddAVXDeviceDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<AddAVXDeviceDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+  configForm: FormGroup;
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService,
+    private _avx: AvxService,
+  ) {
+    this.configForm = this._fb.group({
+      name: ['', Validators.required],
+      ip: ['', [CustomValidators.ipv4(), Validators.required]],
+      restapi_username: ['', Validators.required],
+      restapi_password: ['', Validators.required],
+      restapi_port: [9997, [Validators.required, Validators.min(0), Validators.max(65535)]],
+    })
+  }
+
+  ngOnInit() {
+
+  }
+
+  onSubmit() {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload: any = {
+      "restapi_port": this.configForm.value?.restapi_port,
+      "name": this.configForm.value?.name,
+      "ip": this.configForm.value?.ip,
+      "restapi_account": {
+        "restapi_username": this.configForm.value?.restapi_username,
+        "restapi_password": this.configForm.value?.restapi_password
+      }
+    };
+    let rawPayload = new FormData();
+    rawPayload.set('post_data', JSON.stringify(payload));
+    this._avx.addAVXDevice(rawPayload)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 1) {
+            if (result[0]) {
+              this._notification.showSuccess(`${payload?.name} added successfully!`);
+              this.dialogRef.close(true);
+            } else {
+              this._notification.showError(`Failed to add the device: ${result[1]}`);
+            }
+          }
+        },
+        error: (error: any) => {
+          console.log(error);
+          this._notification.showError('Failed to add the device!.');
+        }
+      })
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/show-avx-device-license.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/show-avx-device-license.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/show-avx-device-license.html	(working copy)
@@ -0,0 +1,22 @@
+<h2 mat-dialog-title>AVX Device License Info</h2>
+
+<mat-dialog-content>
+  <table mat-table [dataSource]="dataSource" class="mat-elevation-z1">
+    <ng-container matColumnDef="key">
+      <td mat-cell *matCellDef="let element"> {{ element.key }}</td>
+    </ng-container>
+    <ng-container matColumnDef="value">
+      <td mat-cell *matCellDef="let element"> {{ element.value }}</td>
+    </ng-container>
+    <tr mat-row *matRowDef="let row; columns: dataColumns;"></tr>
+  </table>
+</mat-dialog-content>
+
+<mat-dialog-actions align="center">
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.html	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.html	(working copy)
@@ -1 +1,18 @@
-<p>avx-instances-overview works!</p>
+<div class="tab-container">
+  <mat-tab-group animationDuration="0ms" [selectedIndex]="selectedTabIndex" (selectedTabChange)="onTabChange($event)">
+    <mat-tab label="VA Instances">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-va-instances/>
+        </div>
+      </ng-template>
+    </mat-tab>
+    <mat-tab label="VA Backup">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-va-backup/>
+        </div>
+      </ng-template>
+    </mat-tab>
+  </mat-tab-group>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.ts	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.ts	(working copy)
@@ -1,11 +1,56 @@
-import { Component } from '@angular/core';
+import {Component, OnInit} from '@angular/core';
+import {SharedModule} from '../../../shared/shared-module';
+import {ActivatedRoute, Router} from '@angular/router';
+import {MatTabChangeEvent} from '@angular/material/tabs';
+import {AvxVaInstances} from '../avx-va-instances/avx-va-instances';
+import {AvxVaBackup} from '../avx-va-backup/avx-va-backup';
 
 @Component({
   selector: 'app-avx-instances-overview',
-  imports: [],
+  imports: [SharedModule, AvxVaInstances, AvxVaBackup],
   templateUrl: './avx-instances-overview.html',
   styleUrl: './avx-instances-overview.scss'
 })
-export class AvxInstancesOverview {
+export class AvxInstancesOverview implements OnInit {
 
+  selectedTabIndex: number = 0;
+  private tabNames: string[] = [
+    'VA Instances',
+    'VA Backup',
+  ];
+
+  constructor(private route: ActivatedRoute, private router: Router) {
+  }
+
+  ngOnInit(): void {
+    this.route.queryParams.subscribe(params => {
+      const tabParam = params['tab'];
+      if (tabParam) {
+        const index = this.tabNames.indexOf(tabParam);
+        if (index !== -1) {
+          this.selectedTabIndex = index;
+        } else {
+          this.selectedTabIndex = 0;
+        }
+      } else {
+        this.updateQueryParams(this.selectedTabIndex);
+      }
+    });
+  }
+
+  onTabChange(event: MatTabChangeEvent): void {
+    this.selectedTabIndex = event.index;
+    this.updateQueryParams(event.index);
+  }
+
+  private updateQueryParams(tabIndex: number): void {
+    const tabName = this.tabNames[tabIndex];
+    if (tabName) {
+      this.router.navigate([], {
+        relativeTo: this.route,
+        queryParams: {tab: tabName},
+        queryParamsHandling: 'merge'
+      });
+    }
+  }
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.html	(working copy)
@@ -0,0 +1,54 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-content>
+    <div class="button-container">
+      <button mat-raised-button (click)="createVABackup()" matTooltip="Create VA Backup">Create</button> &nbsp;&nbsp;
+      <button mat-raised-button (click)="importVABackup()" matTooltip="Import VA Backup">Import</button>
+    </div>
+    <div class="table-container">
+      <div class="mat-elevation-z0">
+        <table mat-table [dataSource]="dataSource">
+          <ng-container matColumnDef="serial">
+            <th mat-header-cell *matHeaderCellDef>ID</th>
+            <td mat-cell *matCellDef="let element; let i = index;"> {{ i | globalSerial }}</td>
+          </ng-container>
+          <ng-container matColumnDef="backupName">
+            <th mat-header-cell *matHeaderCellDef>Device Name</th>
+            <td mat-cell *matCellDef="let element">{{ element?.backup_name }}</td>
+          </ng-container>
+          <ng-container matColumnDef="avxName">
+            <th mat-header-cell *matHeaderCellDef>IP Address</th>
+            <td mat-cell *matCellDef="let element">{{ element?.avx_name }}</td>
+          </ng-container>
+          <ng-container matColumnDef="vaName">
+            <th mat-header-cell *matHeaderCellDef>VA Name</th>
+            <td mat-cell *matCellDef="let element">{{ element?.va_name }}</td>
+          </ng-container>
+          <ng-container matColumnDef="action">
+            <th mat-header-cell *matHeaderCellDef>Action</th>
+            <td mat-cell *matCellDef="let element">
+              <div class="row-action a-link">
+                <fa-icon [icon]="['fas', 'file-export']" size="lg" matTooltip="Export VA Backup"
+                         (click)="exportBackup(element)"></fa-icon>
+                <fa-icon [icon]="['fas', 'clock-rotate-left']" size="lg" matTooltip="Restore a Backup VA Instance"
+                         (click)="restoreBackup(element)"></fa-icon>
+                <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Remove AVX Device"
+                         (click)="deleteBackup(element)"></fa-icon>
+              </div>
+            </td>
+          </ng-container>
+          <tr mat-header-row *matHeaderRowDef="dataColumns"></tr>
+          <tr mat-row *matRowDef="let row; columns: dataColumns;"></tr>
+          <tr class="mat-row table-no-data" *matNoDataRow>
+            <td class="mat-cell" colspan="11">No results found.</td>
+          </tr>
+        </table>
+        <mat-paginator
+          [length]="totalRecords"
+          [pageSize]="10"
+          [pageSizeOptions]="[10, 20, 50]"
+        >
+        </mat-paginator>
+      </div>
+    </div>
+  </mat-card-content>
+</mat-card>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxVaBackup } from './avx-va-backup';
+
+describe('AvxVaBackup', () => {
+  let component: AvxVaBackup;
+  let fixture: ComponentFixture<AvxVaBackup>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxVaBackup]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxVaBackup);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/avx-va-backup.ts	(working copy)
@@ -0,0 +1,487 @@
+import {Component, inject, OnInit, ViewChild} from '@angular/core';
+import {SharedModule} from '../../../shared/shared-module';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {AvxService} from '../../../services/avx-service';
+import {NotificationService} from '../../../services/notification';
+import {Confirmation} from '../../../services/confirmation';
+import {take} from 'rxjs/operators';
+import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+import {HttpParams} from '@angular/common/http';
+
+@Component({
+  selector: 'app-avx-va-backup',
+  imports: [SharedModule, GlobalSerialPipe],
+  templateUrl: './avx-va-backup.html',
+  styleUrl: './avx-va-backup.scss'
+})
+export class AvxVaBackup implements OnInit {
+
+  totalRecords: number = 0;
+  dataSource: MatTableDataSource<any> = new MatTableDataSource();
+  dataColumns: string[] = ['serial', 'backupName', 'avxName', 'vaName', 'action'];
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+
+  constructor(
+    private _avx: AvxService,
+    private _notification: NotificationService,
+    private _confirmation: Confirmation,
+  ) {
+  }
+
+  ngOnInit() {
+    setTimeout(() => {
+      this.getAVXDevices();
+    })
+  }
+
+  avxDevices: any = [];
+
+  getAVXDevices() {
+    this.dataSource.data = [];
+    this.totalRecords = 0;
+    this.avxDevices = [];
+    this._avx.getAVXDevices().pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          this.avxDevices = result;
+          result.forEach((device: any) => {
+            this.getAVXDeviceBackups(device);
+          })
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  getAVXDeviceBackups(device: any) {
+    this._avx.getAVXVABackups(device?.id).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        console.log(result);
+        if (result && result.length > 0) {
+          result.forEach((backup: any) => {
+            backup.avx_name = device.name;
+            backup.avx_id = device.id;
+            this.dataSource.data.push(backup);
+            this.dataSource.paginator = this.paginator;
+            this.totalRecords = this.dataSource.data.length;
+          })
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  createVABackup() {
+    this.dialogConfig.data = {
+      devices: this.avxDevices
+    }
+    const dialogRef = this.dialog.open(CreateAVXVABackupDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getAVXDevices();
+      }
+    })
+  }
+
+  importVABackup() {
+    this.dialogConfig.data = {
+      devices: this.avxDevices
+    }
+    const dialogRef = this.dialog.open(ImportAVXVABackupDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getAVXDevices();
+      }
+    })
+  }
+
+  exportBackup(_backup: any) {
+    this.dialogConfig.data = {
+      backup: _backup,
+      devices: this.avxDevices
+    }
+    const dialogRef = this.dialog.open(ExportAVXVABackupDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getAVXDevices();
+      }
+    })
+  }
+
+  restoreBackup(_backup: any) {
+    this.dialogConfig.data = {
+      backup: _backup,
+      devices: this.avxDevices
+    }
+    const dialogRef = this.dialog.open(RestoreAVXVABackupDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getAVXDevices();
+      }
+    })
+  }
+
+  deleteBackup(_backup: any) {
+    let backupName: string = _backup?.backup_name;
+    let payload: any = `pk=%7B%22backup_name%22%3A%22${backupName}%22%7D`;
+    let confirmMsg = `Are you sure you want to delete "${backupName}"?`
+    this._confirmation.openConfirmDialog({
+      title: `Delete ${backupName}?`,
+      message: confirmMsg,
+      confirmButtonText: 'Yes, Delete It',
+      cancelButtonText: 'No, Keep It',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe(result => {
+      if (result) {
+        this._avx.deleteAVXVABackup(_backup?.avx_id, payload)
+          .pipe(take(1))
+          .subscribe({
+            next: (result: any) => {
+              if (result && result.length > 1) {
+                if (!result[0]) {
+                  this._notification.showError(`${result[1]}`);
+                } else {
+                  this._notification.showSuccess(`${backupName} deleted successfully!`);
+                  this.getAVXDevices();
+                }
+              }
+            },
+            error: (err: any) => {
+              if (err.status === 200) {
+                // ToDo: Backend fix required.
+                this._notification.showSuccess(`${backupName} deleted successfully!`);
+                this.getAVXDevices();
+              } else {
+                this._notification.showError('Deletion Failed.');
+              }
+            }
+          })
+      } else {
+        this._notification.showSuccess('Deletion cancelled.');
+      }
+    });
+  }
+}
+
+@Component({
+  selector: 'create-avx-va-backup',
+  templateUrl: './create-va-backup.html',
+  imports: [SharedModule],
+})
+export class CreateAVXVABackupDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<CreateAVXVABackupDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+  configForm: FormGroup;
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService,
+    private _avx: AvxService,
+  ) {
+    this.configForm = this._fb.group({
+      avxId: [null, [Validators.required]],
+      va_name: ['', [Validators.required]],
+      backup_name: ['', [Validators.required]],
+      pack_base_image: [false, [Validators.required]],
+    })
+  }
+
+  ngOnInit() {
+    console.log(this.data)
+  }
+
+  avxInstances: any = [];
+
+  getAVXVAInstances() {
+    this.avxInstances = [];
+    this._avx.getAVXVAInstances(this.configForm?.value?.avxId).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          this.avxInstances = result;
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  onSubmit(): void {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let rawPayload: any = `action=Backup&options=%7B%22__pk_list%22%3A%5B%22%7B%5C%22va_name%5C%22%3A%5C%22${this.configForm?.value?.va_name}%5C%22%7D%22%5D%2C%22backup_name%22%3A%22${this.configForm?.value?.backup_name}%22%2C%22enable%22%3A${this.configForm?.value?.pack_base_image}%7D`;
+    this._avx.createAVXVABackup(this.configForm?.value?.avxId, rawPayload)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 1) {
+            if (result[0]) {
+              this._notification.showSuccess(`AVX VA instance backup has been created successfully!`);
+              this.dialogRef.close(true);
+            } else {
+              this._notification.showError(`Failed to create the instance backup: ${result[1]}`);
+            }
+          }
+        },
+        error: () => {
+          this._notification.showError('Failed to create the instance backup.');
+        }
+      })
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
+
+@Component({
+  selector: 'import-backup-va-instance',
+  templateUrl: './import-backup-va-instance.html',
+  imports: [SharedModule],
+})
+export class ImportAVXVABackupDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<ImportAVXVABackupDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+  configForm: FormGroup;
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService,
+    private _avx: AvxService,
+  ) {
+    this.configForm = this._fb.group({
+      avxId: [null, [Validators.required]],
+      url: [null, [Validators.required]],
+      username: [null, [Validators.required]],
+      password: [null, [Validators.required]],
+    })
+  }
+
+  ngOnInit() {
+  }
+
+  onSubmit(): void {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload: any = {
+      "action": "Import",
+      "options": {
+        "url": this.configForm.value?.url,
+        "user_name": this.configForm.value?.user_name,
+        "password": this.configForm.value?.password,
+      }
+    }
+    const optionsJsonString = JSON.stringify(payload.options);
+    let params = new HttpParams()
+      .set('action', payload.action)
+      .set('options', optionsJsonString);
+    this._avx.importAVXVABackup(this.configForm?.value?.avxId, params)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 1) {
+            if (result[0]) {
+              this._notification.showSuccess(`AVX VA instance backup has been imported successfully!`);
+              this.dialogRef.close(true);
+            } else {
+              this._notification.showError(`Failed to import the instance backup: ${result[1]}`);
+            }
+          }
+        },
+        error: () => {
+          this._notification.showError('Failed to import the instance backup.');
+        }
+      })
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
+
+@Component({
+  selector: 'export-backup-va-instance',
+  templateUrl: './export-backup-va-instance.html',
+  imports: [SharedModule],
+})
+export class ExportAVXVABackupDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<ExportAVXVABackupDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+  configForm!: FormGroup;
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService,
+    private _avx: AvxService,
+  ) {
+  }
+
+  ngOnInit() {
+    this.configForm = this._fb.group({
+      backup_name: [{value: this.data?.backup?.backup_name, disabled: true}, [Validators.required]],
+      url: [null, [Validators.required]],
+      username: [null, [Validators.required]],
+      password: [null, [Validators.required]],
+    })
+  }
+
+  onSubmit(): void {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload: any = {
+      "action": "Export",
+      "options": {
+        "__pk_list": [
+          {
+            "backup_name": this.data?.backup?.backup_name,
+          }
+        ],
+        "url": this.configForm?.value?.url,
+        "user_name": this.configForm?.value?.username,
+        "password": this.configForm?.value?.password,
+      }
+    };
+    const optionsJsonString = JSON.stringify(payload.options);
+    let params = new HttpParams()
+      .set('action', payload.action)
+      .set('options', optionsJsonString);
+
+    this._avx.exportAVXVABackup(this.data?.backup?.avx_id, params)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 1) {
+            if (result[0]) {
+              this._notification.showSuccess(`AVX VA instance backup has been exported successfully!`);
+              this.dialogRef.close(true);
+            } else {
+              this._notification.showError(`Failed to export the instance backup: ${result[1]}`);
+            }
+          }
+        },
+        error: () => {
+          this._notification.showError('Failed to export the instance backup.');
+        }
+      })
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
+
+@Component({
+  selector: 'restore-backup-va-instance',
+  templateUrl: './restore-backup-va-instance.html',
+  imports: [SharedModule],
+})
+export class RestoreAVXVABackupDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<RestoreAVXVABackupDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+  configForm!: FormGroup;
+  avxDomains: any = [];
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService,
+    private _avx: AvxService,
+  ) {
+  }
+
+  ngOnInit() {
+    this.configForm = this._fb.group({
+      backup_name: [{value: this.data.backup?.backup_name, disabled: true}, [Validators.required]],
+      domain: [0, [Validators.required]],
+    })
+    setTimeout(()=>{
+      this.getAVXDeviceSystemInfo();
+    })
+  }
+
+  getAVXDeviceSystemInfo() {
+    this.avxDomains = [0];
+    this._avx.getAVXDeviceSystemInfo(this.data?.backup?.avx_id).pipe(take(1)).subscribe({
+      next: (result: any) => {
+
+        if (result && result.data) {
+          result?.data?.domain.forEach((_domain: any) => {
+            this.avxDomains.push(_domain?.id);
+          })
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  onSubmit(): void {
+    // restoreAVXVABackup
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload: any = {
+      "action": "Restore",
+      "options": {
+        "__pk_list": [
+          {
+            "backup_name": this.configForm?.value?.backup_name,
+          }
+        ],
+        "domain": this.configForm?.value?.domain,
+      }
+    }
+    const optionsJsonString = JSON.stringify(payload.options);
+    let params = new HttpParams()
+      .set('action', payload.action)
+      .set('options', optionsJsonString);
+
+    this._avx.restoreAVXVABackup(this.data?.backup?.avx_id, params)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 1) {
+            if (result[0]) {
+              this._notification.showSuccess(`AVX VA instance backup has been restored successfully!`);
+              this.dialogRef.close(true);
+            } else {
+              this._notification.showError(`Failed to restore the instance backup: ${result[1]}`);
+            }
+          }
+        },
+        error: () => {
+          this._notification.showError('Failed to restore the instance backup.');
+        }
+      })
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/create-va-backup.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/create-va-backup.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/create-va-backup.html	(working copy)
@@ -0,0 +1,85 @@
+<h2 mat-dialog-title>Backup VA Instance</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+  >
+    <div class="form-field-wrapper">
+      <label for="avxId" class="form-label">AVX *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="avxId" (selectionChange)="getAVXVAInstances()">
+          @for (_device of data?.devices; track _device) {
+            <mat-option [value]="_device?.id">{{ _device?.name }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('avxId')?.invalid && configForm.get('avxId')?.touched) {
+          <mat-error>
+            @if (configForm.get('avxId')?.errors?.['required']) {
+              Device is required.
+            } @else {
+              Invalid device format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    @if (configForm.value.avxId !== null) {
+      <div class="form-field-wrapper">
+        <label for="va_name" class="form-label">VA Instance *</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <mat-select formControlName="va_name">
+            @for (_instance of avxInstances; track _instance) {
+              <mat-option [value]="_instance?.va_name">{{ _instance?.va_name }}</mat-option>
+            }
+          </mat-select>
+          @if (configForm.get('va_name')?.invalid && configForm.get('va_name')?.touched) {
+            <mat-error>
+              @if (configForm.get('va_name')?.errors?.['required']) {
+                Device is required.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+      <div class="form-field-wrapper">
+        <label for="backup_name" class="form-label">Backup name *</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input
+            id="backup_name"
+            formControlName="backup_name"
+            matInput
+            placeholder="Backup name"
+            type="text"
+          />
+          @if (configForm.get('backup_name')?.invalid && configForm.get('backup_name')?.touched) {
+            <mat-error>
+              @if (configForm.get('backup_name')?.errors?.['required']) {
+                Backup name is required.
+              } @else {
+                Invalid backup name format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+      <div class="form-field-wrapper">
+        <label for="pack_base_image" class="form-label">Pack Base Image</label>
+        <mat-slide-toggle formControlName="pack_base_image"></mat-slide-toggle>
+      </div>
+    }
+  </form>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+  <button
+    mat-button
+    color="basic"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/export-backup-va-instance.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/export-backup-va-instance.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/export-backup-va-instance.html	(working copy)
@@ -0,0 +1,104 @@
+<h2 mat-dialog-title>Export VA Instance</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+  >
+    <div class="form-field-wrapper">
+      <label for="backup_name" class="form-label">Backup</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="backup_name"
+          formControlName="backup_name"
+          matInput
+          placeholder="Backup Name"
+          type="text"
+        />
+        @if (configForm.get('backup_name')?.invalid && configForm.get('backup_name')?.touched) {
+          <mat-error>
+            @if (configForm.get('backup_name')?.errors?.['required']) {
+              Backup file is required.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="url" class="form-label">URL *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="url"
+          formControlName="url"
+          matInput
+          placeholder="scp://ip/path or ftp://ip/path"
+          type="text"
+        />
+        @if (configForm.get('url')?.invalid && configForm.get('url')?.touched) {
+          <mat-error>
+            @if (configForm.get('url')?.errors?.['required']) {
+              URL is required.
+            } @else {
+              Invalid url format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="username" class="form-label">Username *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="username"
+          formControlName="username"
+          matInput
+          placeholder="Username"
+          type="text"
+        />
+        @if (configForm.get('username')?.invalid && configForm.get('username')?.touched) {
+          <mat-error>
+            @if (configForm.get('username')?.errors?.['required']) {
+              Username is required.
+            } @else {
+              Invalid username format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="password" class="form-label">Password *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="password"
+          formControlName="password"
+          matInput
+          placeholder="Password"
+          type="password"
+        />
+        @if (configForm.get('password')?.invalid && configForm.get('password')?.touched) {
+          <mat-error>
+            @if (configForm.get('password')?.errors?.['required']) {
+              Password is required.
+            } @else {
+              Invalid password format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+  </form>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+  <button
+    mat-button
+    color="basic"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/import-backup-va-instance.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/import-backup-va-instance.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/import-backup-va-instance.html	(working copy)
@@ -0,0 +1,106 @@
+<h2 mat-dialog-title>Import VA Instance</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+  >
+    <div class="form-field-wrapper">
+      <label for="avxId" class="form-label">AVX *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="avxId">
+          @for (_device of data?.devices; track _device) {
+            <mat-option [value]="_device?.id">{{ _device?.name }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('avxId')?.invalid && configForm.get('avxId')?.touched) {
+          <mat-error>
+            @if (configForm.get('avxId')?.errors?.['required']) {
+              Device is required.
+            } @else {
+              Invalid device format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    @if (configForm.value.avxId !== null) {
+      <div class="form-field-wrapper">
+        <label for="url" class="form-label">URL *</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input
+            id="url"
+            formControlName="url"
+            matInput
+            placeholder="scp://ip/path or ftp://ip/path"
+            type="text"
+          />
+          @if (configForm.get('url')?.invalid && configForm.get('url')?.touched) {
+            <mat-error>
+              @if (configForm.get('url')?.errors?.['required']) {
+                URL is required.
+              } @else {
+                Invalid url format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+      <div class="form-field-wrapper">
+        <label for="username" class="form-label">Username *</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input
+            id="username"
+            formControlName="username"
+            matInput
+            placeholder="Backup name"
+            type="text"
+          />
+          @if (configForm.get('username')?.invalid && configForm.get('username')?.touched) {
+            <mat-error>
+              @if (configForm.get('username')?.errors?.['required']) {
+                Username is required.
+              } @else {
+                Invalid username format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+      <div class="form-field-wrapper">
+        <label for="password" class="form-label">Password *</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input
+            id="password"
+            formControlName="password"
+            matInput
+            placeholder="Password"
+            type="password"
+          />
+          @if (configForm.get('password')?.invalid && configForm.get('password')?.touched) {
+            <mat-error>
+              @if (configForm.get('password')?.errors?.['required']) {
+                Password is required.
+              } @else {
+                Invalid password format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+    }
+  </form>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+  <button
+    mat-button
+    color="basic"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/restore-backup-va-instance.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/restore-backup-va-instance.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-backup/restore-backup-va-instance.html	(working copy)
@@ -0,0 +1,60 @@
+<h2 mat-dialog-title>Restore VA Instance</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+  >
+    <div class="form-field-wrapper">
+      <label for="backup_name" class="form-label">Backup</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="backup_name"
+          formControlName="backup_name"
+          matInput
+          placeholder="Backup Name"
+          type="text"
+        />
+        @if (configForm.get('backup_name')?.invalid && configForm.get('backup_name')?.touched) {
+          <mat-error>
+            @if (configForm.get('backup_name')?.errors?.['required']) {
+              Backup file is required.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="domain" class="form-label">AVX Domain *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="domain">
+          @for (_domain of avxDomains; track _domain) {
+            <mat-option [value]="_domain">{{ _domain }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('domain')?.invalid && configForm.get('domain')?.touched) {
+          <mat-error>
+            @if (configForm.get('domain')?.errors?.['required']) {
+              Domain is required.
+            } @else {
+              Invalid domain format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+  </form>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+  <button
+    mat-button
+    color="basic"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.html	(working copy)
@@ -0,0 +1,5 @@
+<div class="tab-content">
+  <div class="device-config">
+    <pre class="wrapped-pre">{{ runningConfig }}</pre>
+  </div>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.scss	(working copy)
@@ -0,0 +1,18 @@
+.wrapped-pre {
+  padding: 15px;
+  border: 1px solid #ccc;
+  overflow-x: auto;
+  white-space: pre-wrap;
+  word-break: break-word;
+  font-family: monospace;
+  height: 60vh;
+  max-height: 80vh;
+  overflow-y: auto;
+}
+
+.device-config {
+  padding: 4px;
+  border-radius: 8px;
+  max-width: 90vw;
+  margin: 20px auto;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxVaInstanceConfiguration } from './avx-va-instance-configuration';
+
+describe('AvxVaInstanceConfiguration', () => {
+  let component: AvxVaInstanceConfiguration;
+  let fixture: ComponentFixture<AvxVaInstanceConfiguration>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxVaInstanceConfiguration]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxVaInstanceConfiguration);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-configuration/avx-va-instance-configuration.ts	(working copy)
@@ -0,0 +1,56 @@
+import {Component, OnInit} from '@angular/core';
+import {SharedModule} from '../../../shared/shared-module';
+import {ActivatedRoute, Router} from '@angular/router';
+import {take} from 'rxjs/operators';
+import {AvxService} from '../../../services/avx-service';
+import {NotificationService} from '../../../services/notification';
+
+@Component({
+  selector: 'app-avx-va-instance-configuration',
+  imports: [SharedModule],
+  templateUrl: './avx-va-instance-configuration.html',
+  styleUrl: './avx-va-instance-configuration.scss'
+})
+export class AvxVaInstanceConfiguration implements OnInit {
+
+  deviceName: any = '';
+  instanceName: any = '';
+  deviceId: any = '';
+
+  constructor(
+    private _route: ActivatedRoute,
+    private _router: Router,
+    private _avx: AvxService,
+    private _notification: NotificationService,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+    this.instanceName = this._route.snapshot.paramMap.get('instanceName');
+    setTimeout(() => {
+      this.getAVXInstanceConfiguration();
+    })
+  }
+
+  runningConfig: any = '';
+
+  getAVXInstanceConfiguration() {
+    this._avx.getAVXVAInstanceConfig(this.deviceId, this.instanceName).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          result.forEach((_config: any) => {
+            if (_config?.running) {
+              this.runningConfig = _config?.running;
+            }
+          })
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.html	(working copy)
@@ -0,0 +1,37 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <mat-card-title>
+      <a class="back-to-main-page" (click)="navigateToAVXInstances()">
+        <fa-icon [icon]="['far', 'circle-left']"></fa-icon>
+        AVX Instances
+      </a>
+    </mat-card-title>
+    <mat-card-subtitle>Device:{{ deviceName }} - Instance: {{ instanceName }}</mat-card-subtitle>
+  </mat-card-header>
+</mat-card>
+<div class="tab-container">
+  <mat-tab-group mat-stretch-tabs="false" animationDuration="0ms" [selectedIndex]="selectedTabIndex"
+                 (selectedTabChange)="onTabChange($event)">
+    <mat-tab label="Overview">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-va-instance-overview/>
+        </div>
+      </ng-template>
+    </mat-tab>
+    <mat-tab label="Configuration">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-va-instance-configuration/>
+        </div>
+      </ng-template>
+    </mat-tab>
+    <mat-tab label="Logs">
+      <ng-template matTabContent>
+        <div class="tab-content">
+          <app-avx-va-instance-logs/>
+        </div>
+      </ng-template>
+    </mat-tab>
+  </mat-tab-group>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxVaInstanceDetails } from './avx-va-instance-details';
+
+describe('AvxVaInstanceDetails', () => {
+  let component: AvxVaInstanceDetails;
+  let fixture: ComponentFixture<AvxVaInstanceDetails>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxVaInstanceDetails]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxVaInstanceDetails);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-details/avx-va-instance-details.ts	(working copy)
@@ -0,0 +1,73 @@
+import {Component, OnInit} from '@angular/core';
+import {ActivatedRoute, Router} from '@angular/router';
+import {SharedModule} from '../../../shared/shared-module';
+import {MatTabChangeEvent} from '@angular/material/tabs';
+import {AvxVaInstanceOverview} from '../avx-va-instance-overview/avx-va-instance-overview';
+import {AvxVaInstanceConfiguration} from '../avx-va-instance-configuration/avx-va-instance-configuration';
+import {AvxVaInstanceLogs} from '../avx-va-instance-logs/avx-va-instance-logs';
+
+@Component({
+  selector: 'app-avx-va-instance-details',
+  imports: [SharedModule, AvxVaInstanceOverview, AvxVaInstanceConfiguration, AvxVaInstanceLogs],
+  templateUrl: './avx-va-instance-details.html',
+  styleUrl: './avx-va-instance-details.scss'
+})
+export class AvxVaInstanceDetails implements OnInit {
+
+  deviceName: any = '';
+  instanceName: any = '';
+  deviceId: any = '';
+
+  selectedTabIndex: number = 0;
+  private tabNames: string[] = [
+    'Overview',
+    'Configuration',
+    'Logs',
+  ];
+
+  constructor(
+    private _route: ActivatedRoute,
+    private _router: Router,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+    this.instanceName = this._route.snapshot.paramMap.get('instanceName');
+
+    this._route.queryParams.subscribe(params => {
+      const tabParam = params['tab'];
+      if (tabParam) {
+        const index = this.tabNames.indexOf(tabParam);
+        if (index !== -1) {
+          this.selectedTabIndex = index;
+        } else {
+          this.selectedTabIndex = 0;
+        }
+      } else {
+        this.updateQueryParams(this.selectedTabIndex);
+      }
+    });
+  }
+
+  onTabChange(event: MatTabChangeEvent): void {
+    this.selectedTabIndex = event.index;
+    this.updateQueryParams(event.index);
+  }
+
+  private updateQueryParams(tabIndex: number): void {
+    const tabName = this.tabNames[tabIndex];
+    if (tabName) {
+      this._router.navigate([], {
+        relativeTo: this._route,
+        queryParams: {tab: tabName},
+        queryParamsHandling: 'merge'
+      });
+    }
+  }
+
+  navigateToAVXInstances() {
+    this._router.navigate(['/avx/instances']);
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.html	(working copy)
@@ -0,0 +1 @@
+<p>avx-va-instance-logs works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxVaInstanceLogs } from './avx-va-instance-logs';
+
+describe('AvxVaInstanceLogs', () => {
+  let component: AvxVaInstanceLogs;
+  let fixture: ComponentFixture<AvxVaInstanceLogs>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxVaInstanceLogs]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxVaInstanceLogs);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-logs/avx-va-instance-logs.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-avx-va-instance-logs',
+  imports: [],
+  templateUrl: './avx-va-instance-logs.html',
+  styleUrl: './avx-va-instance-logs.scss'
+})
+export class AvxVaInstanceLogs {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.html	(working copy)
@@ -0,0 +1,181 @@
+@if (loader2 && !isSNMPEnabled) {
+  <br><p class="blue-icon center"><b>Note:</b> To view graph data, please enable the SNMP service first.</p>
+}
+@if (loader1 && !isInstanceActive) {
+  <br><p class="blue-icon center"><b>Note:</b> Note: Lookslike the VA instance ({{instanceName}}) is not running. Please start it first.</p>
+}
+<mat-grid-list cols="3" rowHeight="100px">
+  <mat-grid-tile colspan="2" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Network Throughput (bps)</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption1" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text"> CPU Usage (%)</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption2" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Management IP</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container-1">
+          <span class="card-note">
+            <b>Note:</b> It is recommended to enable DHCP for both AVX and the VA instance. In this case, AVX dynamically
+            assigns an IP address to the management port of the VA instance and therefore is aware of the management IP
+            of the VA instance. AVX then can provide advanced management functions for the VA instance based on the
+            management IP.
+          </span>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Assigned Platform Resources</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container-2">
+          <table mat-table [dataSource]="platformDataSource" class="small-table">
+            <ng-container matColumnDef="key">
+              <td mat-cell *matCellDef="let element"> {{ element.key }}</td>
+            </ng-container>
+            <ng-container matColumnDef="value">
+              <td mat-cell *matCellDef="let element"> {{ element.value }}</td>
+            </ng-container>
+            <tr mat-row *matRowDef="let row; columns: platformDataColumns;"></tr>
+          </table>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Memory Usage (%)</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption3" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="2" rowspan="6">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text"> System Info</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container-2">
+          <table mat-table [dataSource]="configDataSource" class="small-table">
+            <ng-container matColumnDef="key">
+              <td mat-cell *matCellDef="let element"> {{ element.key }}</td>
+            </ng-container>
+            <ng-container matColumnDef="value">
+              <td mat-cell *matCellDef="let element"> {{ element.value }}</td>
+            </ng-container>
+            <tr mat-row *matRowDef="let row; columns: configDataColumns;"></tr>
+          </table>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Disk Usage (%)</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="chartOption4" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="3">
+    <mat-card class="dashboard-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Port Sequence</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container-1">
+          <div class="table-container">
+            <div class="mat-elevation-z0">
+              <table mat-table [dataSource]="portDataSource">
+                <ng-container matColumnDef="serial">
+                  <th mat-header-cell *matHeaderCellDef>ID</th>
+                  <td mat-cell *matCellDef="let element; let i = index;"> {{ i | globalSerial }}</td>
+                </ng-container>
+                <ng-container matColumnDef="resource">
+                  <th mat-header-cell *matHeaderCellDef>Resource</th>
+                  <td mat-cell *matCellDef="let element">
+                    @if(element.resource !== 'mgmt') {
+                      {{ element?.resource }}
+                    } @else {
+                      <a class="details-page-link" (click)="updateManagementVLAN(element)">{{ element?.resource }}</a>
+                    }
+                  </td>
+                </ng-container>
+                <ng-container matColumnDef="mac">
+                  <th mat-header-cell *matHeaderCellDef>Mac</th>
+                  <td mat-cell *matCellDef="let element">{{ element?.mac }}</td>
+                </ng-container>
+                <ng-container matColumnDef="portId">
+                  <th mat-header-cell *matHeaderCellDef>Port Id</th>
+                  <td mat-cell *matCellDef="let element">{{ element?.port_id }}</td>
+                </ng-container>
+                <ng-container matColumnDef="vlanTag">
+                  <th mat-header-cell *matHeaderCellDef>VLAN Tag</th>
+                  <td mat-cell *matCellDef="let element">
+                    @if(element.resource !== 'mgmt') {
+                      {{ element?.vlan_tag }}
+                    }
+                  </td>
+                </ng-container>
+                <tr mat-header-row *matHeaderRowDef="portDataColumns"></tr>
+                <tr mat-row *matRowDef="let row; columns: portDataColumns;"></tr>
+                <tr class="mat-row table-no-data" *matNoDataRow>
+                  <td class="mat-cell" colspan="11">No results found.</td>
+                </tr>
+              </table>
+            </div>
+          </div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+</mat-grid-list>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.scss	(working copy)
@@ -0,0 +1,197 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
+
+.dashboard-card {
+  width: 100%;
+  height: 100%;
+  border-radius: 8px;
+  background-color: inherit;
+}
+
+.card-content-wrapper {
+  margin-top: 2px;
+  padding: 0 !important;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  width: 100%;
+}
+
+.card-header-row {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  margin-bottom: 8px;
+  padding: 0 8px;
+}
+
+.card-header-row-1 {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  margin-bottom: 0;
+  padding: 0 4px;
+}
+
+.metric-icon {
+  color: #3f51b5;
+}
+
+.card-title {
+  font-size: 14px;
+  font-weight: 500;
+  color: #555;
+  margin: 0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+}
+
+.card-title-1 {
+  font-size: 12px;
+  font-weight: 400;
+  color: #555;
+  margin: 0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+}
+
+.metric-value {
+  display: flex;
+  justify-content: center;
+  align-items: flex-end;
+  line-height: 1;
+}
+
+.metric-label {
+  display: flex;
+  justify-content: center;
+  align-items: flex-end;
+  font-size: 0.9rem;
+  color: #777;
+  margin-top: 5px;
+}
+
+.online-count {
+  font-size: 36px;
+  font-weight: 600;
+  color: #333;
+}
+
+.total-count {
+  font-size: 18px;
+  font-weight: 500;
+  color: #888;
+  margin-left: 4px;
+}
+
+.status-details {
+  font-size: 14px;
+  color: #d32f2f;
+  margin: 0;
+  font-weight: 500;
+  text-align: center;
+}
+
+.active,
+.matrics-icon {
+  color: darkgreen;
+}
+
+.chart-flex-container {
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  height: 100%;
+  width: 100%;
+  flex-grow: 1;
+}
+
+.chart-flex-container-2 {
+
+}
+
+.small-table{
+  .mat-mdc-table {
+    background-color: transparent;
+  }
+  .mat-mdc-row {
+    height: 30px;
+  }
+}
+
+.chart-container {
+  width: 100%;
+  height: 100%;
+  max-width: none;
+  max-height: none;
+}
+
+.chart-flex-container .chart-container {
+  width: 100%;
+  height: 100%;
+}
+
+mat-grid-list {
+  height: 100%;
+  width: 100%;
+}
+
+.metrics-container {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 20px;
+}
+
+.card-body-content {
+  flex-grow: 1;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.metrics-horizontal-container {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  gap: 20px;
+  width: 100%;
+}
+
+.metric-item {
+  text-align: center;
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.metric-value {
+  font-size: 1rem;
+  font-weight: 500;
+  color: #333;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxVaInstanceOverview } from './avx-va-instance-overview';
+
+describe('AvxVaInstanceOverview', () => {
+  let component: AvxVaInstanceOverview;
+  let fixture: ComponentFixture<AvxVaInstanceOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxVaInstanceOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxVaInstanceOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instance-overview/avx-va-instance-overview.ts	(working copy)
@@ -0,0 +1,1303 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {MatGridList, MatGridTile} from "@angular/material/grid-list";
+import {MatCard, MatCardContent, MatCardTitle} from '@angular/material/card';
+import {NgxEchartsDirective} from 'ngx-echarts';
+import {SharedModule} from '../../../shared/shared-module';
+import {ActivatedRoute, Router} from '@angular/router';
+import {AvxService} from '../../../services/avx-service';
+import {NotificationService} from '../../../services/notification';
+import {take} from 'rxjs/operators';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {EChartsOption} from 'echarts';
+import {UtilsService} from '../../../services/utils-service';
+
+@Component({
+  selector: 'app-avx-va-instance-overview',
+  imports: [
+    SharedModule,
+    GlobalSerialPipe,
+  ],
+  templateUrl: './avx-va-instance-overview.html',
+  styleUrl: './avx-va-instance-overview.scss'
+})
+export class AvxVaInstanceOverview implements OnInit {
+
+  deviceName: any = '';
+  instanceName: any = '';
+  deviceId: any = '';
+
+  constructor(
+    private _route: ActivatedRoute,
+    private _router: Router,
+    private _avx: AvxService,
+    private _notification: NotificationService,
+    private _utils: UtilsService,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+    this.instanceName = this._route.snapshot.paramMap.get('instanceName');
+    setTimeout(() => {
+      this.getAVXVAInstancePortMapping();
+      this.getAVXVAInstancePlatformResource();
+      this.getDeviceStatistics();
+    })
+  }
+
+
+  vaPortMapping: any = [];
+  portDataSource: MatTableDataSource<any> = new MatTableDataSource();
+  portDataColumns: string[] = ['serial', 'resource', 'mac', 'portId', 'vlanTag'];
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+
+  getAVXVAInstancePortMapping() {
+    this._avx.getAVXVAInstancePortMapping(this.deviceId, this.instanceName).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          this.vaPortMapping = result;
+          // console.log(this.vaPortMapping);
+          this.portDataSource.data = this.vaPortMapping;
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  isInstanceActive: boolean = false;
+  loader1: boolean = false;
+  platformResources: any = {}
+  platformDataColumns: Array<string> = ['key', 'value'];
+  platformDataSource = new MatTableDataSource([]);
+
+  getAVXVAInstancePlatformResource() {
+    this._avx.getAVXVAInstancePlatformResource(this.deviceId, this.instanceName).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        console.log(result);
+        this.platformResources = {
+          'CPU Threads': result?.cpu_thread,
+          'RAM': result?.memory + ' GB',
+          'Traffic Interface VFs': '',
+          'Virtual Ports': '',
+          'Passthrough Ports': '',
+          'SSL VFs': '',
+          'Extra Disks	': '',
+        }
+        this.isInstanceActive = result?.status;
+        this.platformDataSource = this._utils.processConfigData(this.platformResources);
+        this.getAVXVAInstanceBasicConfig(result?.product_name);
+        this.loader1 = true;
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+        this.loader1 = true;
+      }
+    });
+  }
+
+  loader2: boolean = false;
+  isSNMPEnabled: boolean = false;
+  configDataColumns: Array<string> = ['key', 'value'];
+  configDataSource = new MatTableDataSource([]);
+
+  getAVXVAInstanceBasicConfig(productName: string) {
+    let payload: any = `post_data=%7B%22va_name%22%3A%22${this.instanceName}%22%2C%22va_product_name%22%3A%22${productName}%22%7D`;
+    this._avx.getAVXVAInstanceBasicConfig(this.deviceId, payload).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 1) {
+          if (result[1]?.show_version) {
+            console.log(result[1]?.show_version);
+            let show_version = result[1]?.show_version;
+            let selectedValues: any = {
+              'Model': show_version?.model,
+              'Software Build Info': show_version?.build,
+              'Host Name': show_version?.hostname,
+              'System CPU': show_version?.system_cpu,
+              'System RAM': show_version?.system_ram,
+              'System Boot Time': show_version?.boottime,
+              'Current Time': show_version?.curtime,
+              'System Up Time': show_version?.uptime,
+              'Platform Build Date': show_version?.platform_bld_date,
+              'SSL Hardware': show_version?.sslhard,
+              'Compression Hardware': show_version?.compression_hard,
+              'Network Interface': show_version?.net_interface,
+              'Serial Number': show_version?.serial,
+              'Licensed Features': show_version?.licensed_features,
+            }
+            this.configDataSource = this._utils.processConfigData(selectedValues);
+          }
+          if (result[1]?.show_snmp) {
+            this.isSNMPEnabled = result[1]?.show_snmp?.enable_snmp;
+          }
+        }
+        this.loader2 = true;
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+        this.loader2 = true;
+      }
+    });
+  }
+
+  configureManagementIP() {
+
+  }
+
+  updateManagementVLAN(_mgmt: any) {
+
+  }
+
+  chartOption1: EChartsOption = {};
+  chartOption2: EChartsOption = {};
+  chartOption3: EChartsOption = {};
+  chartOption4: EChartsOption = {};
+
+  getDeviceStatistics() {
+    // ToDo: Integrate with APIs once ready.
+    this.updateStatisticsCharts({});
+  }
+
+  updateStatisticsCharts(_data: any) {
+
+    _data.throughput = {
+      sent: [
+        [
+          "2025-09-01T06:13:20Z",
+          22764.8
+        ],
+        [
+          "2025-09-01T06:13:30Z",
+          91184
+        ],
+        [
+          "2025-09-01T06:13:40Z",
+          30636
+        ],
+        [
+          "2025-09-01T06:13:50Z",
+          77057.6
+        ],
+        [
+          "2025-09-01T06:14:00Z",
+          53998.4
+        ],
+        [
+          "2025-09-01T06:14:10Z",
+          26018.4
+        ],
+        [
+          "2025-09-01T06:14:20Z",
+          39848
+        ],
+        [
+          "2025-09-01T06:14:30Z",
+          85203.2
+        ],
+        [
+          "2025-09-01T06:14:40Z",
+          30274.4
+        ],
+        [
+          "2025-09-01T06:14:50Z",
+          75187.2
+        ],
+        [
+          "2025-09-01T06:15:00Z",
+          53441.6
+        ],
+        [
+          "2025-09-01T06:15:10Z",
+          28653.6
+        ],
+        [
+          "2025-09-01T06:15:20Z",
+          43352
+        ],
+        [
+          "2025-09-01T06:15:30Z",
+          86523.2
+        ],
+        [
+          "2025-09-01T06:15:40Z",
+          29900
+        ],
+        [
+          "2025-09-01T06:15:50Z",
+          74057.6
+        ],
+        [
+          "2025-09-01T06:16:00Z",
+          57915.2
+        ],
+        [
+          "2025-09-01T06:16:10Z",
+          31132
+        ],
+        [
+          "2025-09-01T06:16:20Z",
+          40164.8
+        ],
+        [
+          "2025-09-01T06:16:30Z",
+          87473.6
+        ],
+        [
+          "2025-09-01T06:16:40Z",
+          29352.8
+        ],
+        [
+          "2025-09-01T06:16:50Z",
+          107523.2
+        ],
+        [
+          "2025-09-01T06:17:00Z",
+          80985.6
+        ],
+        [
+          "2025-09-01T06:17:10Z",
+          26631.2
+        ],
+        [
+          "2025-09-01T06:17:20Z",
+          46208
+        ],
+        [
+          "2025-09-01T06:17:30Z",
+          84646.4
+        ],
+        [
+          "2025-09-01T06:17:40Z",
+          28506.4
+        ],
+        [
+          "2025-09-01T06:17:50Z",
+          73884.8
+        ],
+        [
+          "2025-09-01T06:18:00Z",
+          50097.6
+        ],
+        [
+          "2025-09-01T06:18:10Z",
+          27802.4
+        ],
+        [
+          "2025-09-01T06:18:20Z",
+          48852.8
+        ],
+        [
+          "2025-09-01T06:18:30Z",
+          82992
+        ],
+        [
+          "2025-09-01T06:18:40Z",
+          31167.2
+        ],
+        [
+          "2025-09-01T06:18:50Z",
+          81974.4
+        ],
+        [
+          "2025-09-01T06:19:00Z",
+          50172.8
+        ],
+        [
+          "2025-09-01T06:19:10Z",
+          27991.2
+        ],
+        [
+          "2025-09-01T06:19:20Z",
+          44648
+        ],
+        [
+          "2025-09-01T06:19:30Z",
+          81387.2
+        ],
+        [
+          "2025-09-01T06:19:40Z",
+          27821.6
+        ],
+        [
+          "2025-09-01T06:19:50Z",
+          78454.4
+        ],
+        [
+          "2025-09-01T06:20:00Z",
+          52660.8
+        ],
+        [
+          "2025-09-01T06:20:10Z",
+          24552.8
+        ],
+        [
+          "2025-09-01T06:20:20Z",
+          49472
+        ],
+        [
+          "2025-09-01T06:20:30Z",
+          82755.2
+        ],
+        [
+          "2025-09-01T06:20:40Z",
+          30317.6
+        ],
+        [
+          "2025-09-01T06:20:50Z",
+          75843.2
+        ],
+        [
+          "2025-09-01T06:21:00Z",
+          51331.2
+        ],
+        [
+          "2025-09-01T06:21:10Z",
+          29304.8
+        ],
+        [
+          "2025-09-01T06:21:20Z",
+          45600
+        ],
+        [
+          "2025-09-01T06:21:30Z",
+          79865.6
+        ],
+        [
+          "2025-09-01T06:21:40Z",
+          30898.4
+        ],
+        [
+          "2025-09-01T06:21:50Z",
+          83446.4
+        ],
+        [
+          "2025-09-01T06:22:00Z",
+          93699.2
+        ],
+        [
+          "2025-09-01T06:22:10Z",
+          84384.8
+        ],
+        [
+          "2025-09-01T06:22:20Z",
+          78492.8
+        ],
+        [
+          "2025-09-01T06:22:30Z",
+          119888
+        ],
+        [
+          "2025-09-01T06:22:40Z",
+          79095.2
+        ],
+        [
+          "2025-09-01T06:22:50Z",
+          115284.8
+        ],
+        [
+          "2025-09-01T06:23:00Z",
+          72753.6
+        ]
+      ],
+      received: [
+        [
+          "2025-09-01T06:13:20Z",
+          6688
+        ],
+        [
+          "2025-09-01T06:13:30Z",
+          31003.2
+        ],
+        [
+          "2025-09-01T06:13:40Z",
+          9921.6
+        ],
+        [
+          "2025-09-01T06:13:50Z",
+          26492
+        ],
+        [
+          "2025-09-01T06:14:00Z",
+          20560
+        ],
+        [
+          "2025-09-01T06:14:10Z",
+          9872
+        ],
+        [
+          "2025-09-01T06:14:20Z",
+          14263.2
+        ],
+        [
+          "2025-09-01T06:14:30Z",
+          28508.8
+        ],
+        [
+          "2025-09-01T06:14:40Z",
+          10624
+        ],
+        [
+          "2025-09-01T06:14:50Z",
+          24696.8
+        ],
+        [
+          "2025-09-01T06:15:00Z",
+          19360
+        ],
+        [
+          "2025-09-01T06:15:10Z",
+          13137.6
+        ],
+        [
+          "2025-09-01T06:15:20Z",
+          13656.8
+        ],
+        [
+          "2025-09-01T06:15:30Z",
+          30264
+        ],
+        [
+          "2025-09-01T06:15:40Z",
+          10220.8
+        ],
+        [
+          "2025-09-01T06:15:50Z",
+          23640.8
+        ],
+        [
+          "2025-09-01T06:16:00Z",
+          22033.6
+        ],
+        [
+          "2025-09-01T06:16:10Z",
+          12547.2
+        ],
+        [
+          "2025-09-01T06:16:20Z",
+          13597.6
+        ],
+        [
+          "2025-09-01T06:16:30Z",
+          31094.4
+        ],
+        [
+          "2025-09-01T06:16:40Z",
+          8448
+        ],
+        [
+          "2025-09-01T06:16:50Z",
+          36344.8
+        ],
+        [
+          "2025-09-01T06:17:00Z",
+          31547.2
+        ],
+        [
+          "2025-09-01T06:17:10Z",
+          7668.8
+        ],
+        [
+          "2025-09-01T06:17:20Z",
+          16740
+        ],
+        [
+          "2025-09-01T06:17:30Z",
+          28779.2
+        ],
+        [
+          "2025-09-01T06:17:40Z",
+          9577.6
+        ],
+        [
+          "2025-09-01T06:17:50Z",
+          25488.8
+        ],
+        [
+          "2025-09-01T06:18:00Z",
+          17904
+        ],
+        [
+          "2025-09-01T06:18:10Z",
+          11766.4
+        ],
+        [
+          "2025-09-01T06:18:20Z",
+          17048.8
+        ],
+        [
+          "2025-09-01T06:18:30Z",
+          27993.6
+        ],
+        [
+          "2025-09-01T06:18:40Z",
+          11011.2
+        ],
+        [
+          "2025-09-01T06:18:50Z",
+          26893.6
+        ],
+        [
+          "2025-09-01T06:19:00Z",
+          18214.4
+        ],
+        [
+          "2025-09-01T06:19:10Z",
+          12939.2
+        ],
+        [
+          "2025-09-01T06:19:20Z",
+          14156
+        ],
+        [
+          "2025-09-01T06:19:30Z",
+          28691.2
+        ],
+        [
+          "2025-09-01T06:19:40Z",
+          9516.8
+        ],
+        [
+          "2025-09-01T06:19:50Z",
+          25095.2
+        ],
+        [
+          "2025-09-01T06:20:00Z",
+          23022.4
+        ],
+        [
+          "2025-09-01T06:20:10Z",
+          7769.6
+        ],
+        [
+          "2025-09-01T06:20:20Z",
+          16442.4
+        ],
+        [
+          "2025-09-01T06:20:30Z",
+          29521.6
+        ],
+        [
+          "2025-09-01T06:20:40Z",
+          8787.2
+        ],
+        [
+          "2025-09-01T06:20:50Z",
+          26077.6
+        ],
+        [
+          "2025-09-01T06:21:00Z",
+          21510.4
+        ],
+        [
+          "2025-09-01T06:21:10Z",
+          8960
+        ],
+        [
+          "2025-09-01T06:21:20Z",
+          16639.2
+        ],
+        [
+          "2025-09-01T06:21:30Z",
+          27297.6
+        ],
+        [
+          "2025-09-01T06:21:40Z",
+          10097.6
+        ],
+        [
+          "2025-09-01T06:21:50Z",
+          28476
+        ],
+        [
+          "2025-09-01T06:22:00Z",
+          31428.8
+        ],
+        [
+          "2025-09-01T06:22:10Z",
+          30582.4
+        ],
+        [
+          "2025-09-01T06:22:20Z",
+          26656.8
+        ],
+        [
+          "2025-09-01T06:22:30Z",
+          39756.8
+        ],
+        [
+          "2025-09-01T06:22:40Z",
+          26561.6
+        ],
+        [
+          "2025-09-01T06:22:50Z",
+          37727.2
+        ],
+        [
+          "2025-09-01T06:23:00Z",
+          26284.8
+        ]
+      ]
+    }
+    _data.cpu = [
+      [
+        "2025-09-01T06:13:16.592148699Z",
+        7.849999999999994
+      ],
+      [
+        "2025-09-01T06:13:21.585804019Z",
+        9.459999999999994
+      ],
+      [
+        "2025-09-01T06:13:26.588592319Z",
+        7.3799999999999955
+      ],
+      [
+        "2025-09-01T06:13:31.591434597Z",
+        6.709999999999994
+      ],
+      [
+        "2025-09-01T06:13:36.586589723Z",
+        10.060000000000002
+      ],
+      [
+        "2025-09-01T06:13:41.588604239Z",
+        6.230000000000004
+      ],
+      [
+        "2025-09-01T06:13:46.592404576Z",
+        7.200000000000003
+      ],
+      [
+        "2025-09-01T06:13:51.588164479Z",
+        9.560000000000002
+      ],
+      [
+        "2025-09-01T06:13:56.590665664Z",
+        6.280000000000001
+      ],
+      [
+        "2025-09-01T06:14:01.583644421Z",
+        7.180000000000007
+      ],
+      [
+        "2025-09-01T06:14:06.590321668Z",
+        9.980000000000004
+      ],
+      [
+        "2025-09-01T06:14:11.592913228Z",
+        7.170000000000002
+      ],
+      [
+        "2025-09-01T06:14:16.586662482Z",
+        6.829999999999998
+      ],
+      [
+        "2025-09-01T06:14:21.591552921Z",
+        9.310000000000002
+      ],
+      [
+        "2025-09-01T06:14:26.584005273Z",
+        7.469999999999999
+      ],
+      [
+        "2025-09-01T06:14:31.586348195Z",
+        8.099999999999994
+      ],
+      [
+        "2025-09-01T06:14:36.591890166Z",
+        10.239999999999995
+      ],
+      [
+        "2025-09-01T06:14:41.585374456Z",
+        7.200000000000003
+      ],
+      [
+        "2025-09-01T06:14:46.589260204Z",
+        7.269999999999996
+      ],
+      [
+        "2025-09-01T06:14:51.594586339Z",
+        9.120000000000005
+      ],
+      [
+        "2025-09-01T06:14:56.586185042Z",
+        5.939999999999998
+      ],
+      [
+        "2025-09-01T06:15:01.588371252Z",
+        6.959999999999994
+      ],
+      [
+        "2025-09-01T06:15:06.584529005Z",
+        10.11
+      ],
+      [
+        "2025-09-01T06:15:11.586659506Z",
+        6.549999999999997
+      ],
+      [
+        "2025-09-01T06:15:16.590466387Z",
+        6.790000000000006
+      ],
+      [
+        "2025-09-01T06:15:21.584573919Z",
+        8.670000000000002
+      ],
+      [
+        "2025-09-01T06:15:26.586727474Z",
+        7.019999999999996
+      ],
+      [
+        "2025-09-01T06:15:31.590906384Z",
+        6.730000000000004
+      ],
+      [
+        "2025-09-01T06:15:36.585975561Z",
+        9.590000000000003
+      ],
+      [
+        "2025-09-01T06:15:41.588899927Z",
+        6.439999999999998
+      ],
+      [
+        "2025-09-01T06:15:46.592468377Z",
+        8.219999999999999
+      ],
+      [
+        "2025-09-01T06:15:51.587153019Z",
+        10.230000000000004
+      ],
+      [
+        "2025-09-01T06:15:56.589238192Z",
+        6.310000000000002
+      ],
+      [
+        "2025-09-01T06:16:01.593977305Z",
+        6.569999999999993
+      ],
+      [
+        "2025-09-01T06:16:06.589078936Z",
+        9.840000000000003
+      ],
+      [
+        "2025-09-01T06:16:11.590916179Z",
+        6.340000000000003
+      ],
+      [
+        "2025-09-01T06:16:16.585881247Z",
+        7.049999999999997
+      ],
+      [
+        "2025-09-01T06:16:21.590592472Z",
+        9.019999999999996
+      ],
+      [
+        "2025-09-01T06:16:26.584254701Z",
+        5.799999999999997
+      ],
+      [
+        "2025-09-01T06:16:31.588858469Z",
+        6.579999999999998
+      ],
+      [
+        "2025-09-01T06:16:36.584903954Z",
+        9.349999999999994
+      ],
+      [
+        "2025-09-01T06:16:41.586857163Z",
+        6.739999999999995
+      ],
+      [
+        "2025-09-01T06:16:46.591272308Z",
+        7.400000000000006
+      ],
+      [
+        "2025-09-01T06:16:51.58647666Z",
+        8.760000000000005
+      ],
+      [
+        "2025-09-01T06:16:56.590560953Z",
+        6.299999999999997
+      ],
+      [
+        "2025-09-01T06:17:01.584683866Z",
+        7.8700000000000045
+      ],
+      [
+        "2025-09-01T06:17:06.589264331Z",
+        10.950000000000003
+      ],
+      [
+        "2025-09-01T06:17:11.592086144Z",
+        6.200000000000003
+      ],
+      [
+        "2025-09-01T06:17:16.584354386Z",
+        6.670000000000002
+      ],
+      [
+        "2025-09-01T06:17:21.588554123Z",
+        8.730000000000004
+      ],
+      [
+        "2025-09-01T06:17:26.591148288Z",
+        5.75
+      ],
+      [
+        "2025-09-01T06:17:31.584136195Z",
+        6.430000000000007
+      ],
+      [
+        "2025-09-01T06:17:36.589100971Z",
+        9.5
+      ],
+      [
+        "2025-09-01T06:17:41.593692328Z",
+        6.230000000000004
+      ],
+      [
+        "2025-09-01T06:17:46.586095013Z",
+        7.019999999999996
+      ],
+      [
+        "2025-09-01T06:17:51.590335823Z",
+        9
+      ],
+      [
+        "2025-09-01T06:17:56.594540097Z",
+        6.739999999999995
+      ],
+      [
+        "2025-09-01T06:18:01.58855587Z",
+        6.590000000000003
+      ],
+      [
+        "2025-09-01T06:18:06.584003729Z",
+        9.780000000000001
+      ],
+      [
+        "2025-09-01T06:18:11.586997029Z",
+        5.930000000000007
+      ],
+      [
+        "2025-09-01T06:18:16.59067188Z",
+        8.650000000000006
+      ],
+      [
+        "2025-09-01T06:18:21.585339422Z",
+        10.730000000000004
+      ],
+      [
+        "2025-09-01T06:18:26.589049402Z",
+        6.849999999999994
+      ],
+      [
+        "2025-09-01T06:18:31.591983397Z",
+        6.420000000000002
+      ],
+      [
+        "2025-09-01T06:18:36.589033381Z",
+        9.379999999999995
+      ],
+      [
+        "2025-09-01T06:18:41.592569495Z",
+        5.920000000000002
+      ],
+      [
+        "2025-09-01T06:18:46.585097209Z",
+        7.040000000000006
+      ],
+      [
+        "2025-09-01T06:18:51.590326058Z",
+        9.040000000000006
+      ],
+      [
+        "2025-09-01T06:18:56.592207602Z",
+        6.299999999999997
+      ],
+      [
+        "2025-09-01T06:19:01.584566575Z",
+        6.560000000000002
+      ],
+      [
+        "2025-09-01T06:19:06.589809729Z",
+        9.959999999999994
+      ],
+      [
+        "2025-09-01T06:19:11.592770275Z",
+        7.400000000000006
+      ],
+      [
+        "2025-09-01T06:19:16.585981991Z",
+        6.769999999999996
+      ],
+      [
+        "2025-09-01T06:19:21.590752396Z",
+        9.530000000000001
+      ],
+      [
+        "2025-09-01T06:19:26.593223886Z",
+        6
+      ],
+      [
+        "2025-09-01T06:19:31.585968321Z",
+        8.370000000000005
+      ],
+      [
+        "2025-09-01T06:19:36.592431695Z",
+        10.909999999999997
+      ],
+      [
+        "2025-09-01T06:19:41.585500115Z",
+        6.150000000000006
+      ],
+      [
+        "2025-09-01T06:19:46.588459615Z",
+        6.640000000000001
+      ],
+      [
+        "2025-09-01T06:19:51.593573573Z",
+        9.129999999999995
+      ],
+      [
+        "2025-09-01T06:19:56.585916302Z",
+        6.549999999999997
+      ],
+      [
+        "2025-09-01T06:20:01.588468835Z",
+        7.280000000000001
+      ],
+      [
+        "2025-09-01T06:20:06.584967154Z",
+        9.819999999999993
+      ],
+      [
+        "2025-09-01T06:20:11.588088209Z",
+        6.329999999999998
+      ],
+      [
+        "2025-09-01T06:20:16.593030985Z",
+        6.969999999999999
+      ],
+      [
+        "2025-09-01T06:20:21.588333389Z",
+        9.599999999999994
+      ],
+      [
+        "2025-09-01T06:20:26.590695924Z",
+        6.170000000000002
+      ],
+      [
+        "2025-09-01T06:20:31.584413326Z",
+        6.409999999999997
+      ],
+      [
+        "2025-09-01T06:20:36.589163893Z",
+        9.430000000000007
+      ],
+      [
+        "2025-09-01T06:20:41.592667697Z",
+        6.590000000000003
+      ],
+      [
+        "2025-09-01T06:20:46.586573325Z",
+        8.540000000000006
+      ],
+      [
+        "2025-09-01T06:20:51.593027734Z",
+        10.5
+      ],
+      [
+        "2025-09-01T06:20:56.584648984Z",
+        6.219999999999999
+      ],
+      [
+        "2025-09-01T06:21:01.588278068Z",
+        6.8700000000000045
+      ],
+      [
+        "2025-09-01T06:21:06.592307073Z",
+        9.670000000000002
+      ],
+      [
+        "2025-09-01T06:21:11.585052667Z",
+        6.790000000000006
+      ],
+      [
+        "2025-09-01T06:21:16.589069792Z",
+        7.140000000000001
+      ],
+      [
+        "2025-09-01T06:21:21.592870389Z",
+        9.599999999999994
+      ],
+      [
+        "2025-09-01T06:21:26.584360229Z",
+        6.640000000000001
+      ],
+      [
+        "2025-09-01T06:21:31.587982183Z",
+        6.6299999999999955
+      ],
+      [
+        "2025-09-01T06:21:36.592933811Z",
+        10.420000000000002
+      ],
+      [
+        "2025-09-01T06:21:41.585139572Z",
+        6.760000000000005
+      ],
+      [
+        "2025-09-01T06:21:46.589782215Z",
+        7.3799999999999955
+      ],
+      [
+        "2025-09-01T06:21:51.583664873Z",
+        9.75
+      ],
+      [
+        "2025-09-01T06:21:56.586524372Z",
+        6.560000000000002
+      ],
+      [
+        "2025-09-01T06:22:01.589669636Z",
+        9.489999999999995
+      ],
+      [
+        "2025-09-01T06:22:06.585495473Z",
+        11.180000000000007
+      ],
+      [
+        "2025-09-01T06:22:11.589164774Z",
+        7.109999999999999
+      ],
+      [
+        "2025-09-01T06:22:16.591691475Z",
+        7.489999999999995
+      ],
+      [
+        "2025-09-01T06:22:21.58543411Z",
+        9.439999999999998
+      ],
+      [
+        "2025-09-01T06:22:26.588519894Z",
+        6.540000000000006
+      ],
+      [
+        "2025-09-01T06:22:31.59165337Z",
+        7.019999999999996
+      ],
+      [
+        "2025-09-01T06:22:36.585850994Z",
+        9.709999999999994
+      ],
+      [
+        "2025-09-01T06:22:41.589216573Z",
+        6.8799999999999955
+      ],
+      [
+        "2025-09-01T06:22:46.592113922Z",
+        7.609999999999999
+      ],
+      [
+        "2025-09-01T06:22:51.586518959Z",
+        10.11
+      ],
+      [
+        "2025-09-01T06:22:56.589741153Z",
+        6.599999999999994
+      ],
+      [
+        "2025-09-01T06:23:01.584548661Z",
+        9.930000000000007
+      ]
+    ];
+    _data.memory = [["2025-09-01T06:13:16.592260588Z", 70.14117002374628], ["2025-09-01T06:13:21.585926871Z", 70.13421637719414], ["2025-09-01T06:13:26.588698751Z", 70.13383753177565], ["2025-09-01T06:13:31.591537989Z", 70.13893361369524], ["2025-09-01T06:13:36.586724859Z", 70.132004408783], ["2025-09-01T06:13:41.588708867Z", 70.13364199865644], ["2025-09-01T06:13:46.592522086Z", 70.13744267366121], ["2025-09-01T06:13:51.588255454Z", 70.1338008693158], ["2025-09-01T06:13:56.590777328Z", 70.13325704282799], ["2025-09-01T06:14:01.583771527Z", 70.1447568344019], ["2025-09-01T06:14:06.59042958Z", 70.13213883780247], ["2025-09-01T06:14:11.593017008Z", 70.13244435830124], ["2025-09-01T06:14:16.586775697Z", 70.13785818153954], ["2025-09-01T06:14:21.591667785Z", 70.13378864849585], ["2025-09-01T06:14:26.584104046Z", 70.13271321634016], ["2025-09-01T06:14:31.586446167Z", 70.13948355059303], ["2025-09-01T06:14:36.592021702Z", 70.13113673056648], ["2025-09-01T06:14:41.585484213Z", 70.13339758225742], ["2025-09-01T06:14:46.589388717Z", 70.13784596071959], ["2025-09-01T06:14:51.594692242Z", 70.13288430781948], ["2025-09-01T06:14:56.5862942Z", 70.13149724475504], ["2025-09-01T06:15:01.588472744Z", 70.13633668945565], ["2025-09-01T06:15:06.584628942Z", 70.13384975259561], ["2025-09-01T06:15:11.58682366Z", 70.13575009009799], ["2025-09-01T06:15:16.590575154Z", 70.1348763014715], ["2025-09-01T06:15:21.584686753Z", 70.13368477152628], ["2025-09-01T06:15:26.586831273Z", 70.13232215010173], ["2025-09-01T06:15:31.591011705Z", 70.14007626036066], ["2025-09-01T06:15:36.58608956Z", 70.13511460746055], ["2025-09-01T06:15:41.588998234Z", 70.13502295131092], ["2025-09-01T06:15:46.592559186Z", 70.13562788189849], ["2025-09-01T06:15:51.587264363Z", 70.13238936461146], ["2025-09-01T06:15:56.589339233Z", 70.13262767060051], ["2025-09-01T06:16:01.594081723Z", 70.13836534556751], ["2025-09-01T06:16:06.58919583Z", 70.13039126054947], ["2025-09-01T06:16:11.591044558Z", 70.13192497345332], ["2025-09-01T06:16:16.585988474Z", 70.13466243712236], ["2025-09-01T06:16:21.590723008Z", 70.13236492297156], ["2025-09-01T06:16:26.584375318Z", 70.13068456022829], ["2025-09-01T06:16:31.588984337Z", 70.13793761686922], ["2025-09-01T06:16:36.58502312Z", 70.12965801135242], ["2025-09-01T06:16:41.586998811Z", 70.13136892614556], ["2025-09-01T06:16:46.591374391Z", 70.13648944970502], ["2025-09-01T06:16:51.586590188Z", 70.1301101816906], ["2025-09-01T06:16:56.590665075Z", 70.13077010596795], ["2025-09-01T06:17:01.584794612Z", 70.13869530770619], ["2025-09-01T06:17:06.589371201Z", 70.13274987880001], ["2025-09-01T06:17:11.592215164Z", 70.13128949081587], ["2025-09-01T06:17:16.584460056Z", 70.1362205916661], ["2025-09-01T06:17:21.588685686Z", 70.13284764535963], ["2025-09-01T06:17:26.591250963Z", 70.13248102076109], ["2025-09-01T06:17:31.58427035Z", 70.13854865786678], ["2025-09-01T06:17:36.589225288Z", 70.13691106799335], ["2025-09-01T06:17:41.593797443Z", 70.13116728261636], ["2025-09-01T06:17:46.586194625Z", 70.13768709006023], ["2025-09-01T06:17:51.590439979Z", 70.1333548093876], ["2025-09-01T06:17:56.594673312Z", 70.13171721951416], ["2025-09-01T06:18:01.588661948Z", 70.14120057579615], ["2025-09-01T06:18:06.58411037Z", 70.13416138350436], ["2025-09-01T06:18:11.587119244Z", 70.13388030464549], ["2025-09-01T06:18:16.590782293Z", 70.13890306164537], ["2025-09-01T06:18:21.585446534Z", 70.13501073049096], ["2025-09-01T06:18:26.589180107Z", 70.1357745317379], ["2025-09-01T06:18:31.592092116Z", 70.13809037711862], ["2025-09-01T06:18:36.589147797Z", 70.13108784728668], ["2025-09-01T06:18:41.592704314Z", 70.13248102076109], ["2025-09-01T06:18:46.585207504Z", 70.13488241188148], ["2025-09-01T06:18:51.590430315Z", 70.13340980307737], ["2025-09-01T06:18:56.592327191Z", 70.1334525759472], ["2025-09-01T06:19:01.584694975Z", 70.1412616798959], ["2025-09-01T06:19:06.589948681Z", 70.13449745605301], ["2025-09-01T06:19:11.592934332Z", 70.13296374314916], ["2025-09-01T06:19:16.586090094Z", 70.14154275875478], ["2025-09-01T06:19:21.590857961Z", 70.13416138350436], ["2025-09-01T06:19:26.593331073Z", 70.1334036926674], ["2025-09-01T06:19:31.586083334Z", 70.13913525722442], ["2025-09-01T06:19:36.592542087Z", 70.13705771783275], ["2025-09-01T06:19:41.585613885Z", 70.13276821002995], ["2025-09-01T06:19:46.588568998Z", 70.1370454970128], ["2025-09-01T06:19:51.593691669Z", 70.1343263645737], ["2025-09-01T06:19:56.586031833Z", 70.13529791975981], ["2025-09-01T06:20:01.588572724Z", 70.14211713729249], ["2025-09-01T06:20:06.585075479Z", 70.13334258856764], ["2025-09-01T06:20:11.588107574Z", 70.13261544978056], ["2025-09-01T06:20:16.593160488Z", 70.1372226989021], ["2025-09-01T06:20:21.588354889Z", 70.13259711855063], ["2025-09-01T06:20:26.590824087Z", 70.13502295131092], ["2025-09-01T06:20:31.584522876Z", 70.14283205525962], ["2025-09-01T06:20:36.589296898Z", 70.13480908696177], ["2025-09-01T06:20:41.592788834Z", 70.13478464532187], ["2025-09-01T06:20:46.586693592Z", 70.13872585975606], ["2025-09-01T06:20:51.593136846Z", 70.13392307751532], ["2025-09-01T06:20:56.584779718Z", 70.13434469580363], ["2025-09-01T06:21:01.588410698Z", 70.14300314673892], ["2025-09-01T06:21:06.592419466Z", 70.1348763014715], ["2025-09-01T06:21:11.585170492Z", 70.13414916268441], ["2025-09-01T06:21:16.589195824Z", 70.14066897012829], ["2025-09-01T06:21:21.592989107Z", 70.13248713117108], ["2025-09-01T06:21:26.584469706Z", 70.13386808382553], ["2025-09-01T06:21:31.588087395Z", 70.13837756638746], ["2025-09-01T06:21:36.593044502Z", 70.13366032988637], ["2025-09-01T06:21:41.585244124Z", 70.13529180934984], ["2025-09-01T06:21:46.589888196Z", 70.13871363893612], ["2025-09-01T06:21:51.583784509Z", 70.13197385673313], ["2025-09-01T06:21:56.586660784Z", 70.13313483462848], ["2025-09-01T06:22:01.589771206Z", 70.14270373665012], ["2025-09-01T06:22:06.58559842Z", 70.13419804596421], ["2025-09-01T06:22:11.589247604Z", 70.13550567369897], ["2025-09-01T06:22:16.591797549Z", 70.14108447800662], ["2025-09-01T06:22:21.585551585Z", 70.13570731722817], ["2025-09-01T06:22:26.588665672Z", 70.13683163266367], ["2025-09-01T06:22:31.591772094Z", 70.13972185658209], ["2025-09-01T06:22:36.585968421Z", 70.13563399230846], ["2025-09-01T06:22:41.589328654Z", 70.13586618788753], ["2025-09-01T06:22:46.592231576Z", 70.14180550638372], ["2025-09-01T06:22:51.586641896Z", 70.13337925102749], ["2025-09-01T06:22:56.589846282Z", 70.13572564845809], ["2025-09-01T06:23:01.584662533Z", 70.14054676192877]]
+    _data.disk = [["2025-09-01T06:13:16.592260588Z", 70.14117002374628], ["2025-09-01T06:13:21.585926871Z", 70.13421637719414], ["2025-09-01T06:13:26.588698751Z", 70.13383753177565], ["2025-09-01T06:13:31.591537989Z", 70.13893361369524], ["2025-09-01T06:13:36.586724859Z", 70.132004408783], ["2025-09-01T06:13:41.588708867Z", 70.13364199865644], ["2025-09-01T06:13:46.592522086Z", 70.13744267366121], ["2025-09-01T06:13:51.588255454Z", 70.1338008693158], ["2025-09-01T06:13:56.590777328Z", 70.13325704282799], ["2025-09-01T06:14:01.583771527Z", 70.1447568344019], ["2025-09-01T06:14:06.59042958Z", 70.13213883780247], ["2025-09-01T06:14:11.593017008Z", 70.13244435830124], ["2025-09-01T06:14:16.586775697Z", 70.13785818153954], ["2025-09-01T06:14:21.591667785Z", 70.13378864849585], ["2025-09-01T06:14:26.584104046Z", 70.13271321634016], ["2025-09-01T06:14:31.586446167Z", 70.13948355059303], ["2025-09-01T06:14:36.592021702Z", 70.13113673056648], ["2025-09-01T06:14:41.585484213Z", 70.13339758225742], ["2025-09-01T06:14:46.589388717Z", 70.13784596071959], ["2025-09-01T06:14:51.594692242Z", 70.13288430781948], ["2025-09-01T06:14:56.5862942Z", 70.13149724475504], ["2025-09-01T06:15:01.588472744Z", 70.13633668945565], ["2025-09-01T06:15:06.584628942Z", 70.13384975259561], ["2025-09-01T06:15:11.58682366Z", 70.13575009009799], ["2025-09-01T06:15:16.590575154Z", 70.1348763014715], ["2025-09-01T06:15:21.584686753Z", 70.13368477152628], ["2025-09-01T06:15:26.586831273Z", 70.13232215010173], ["2025-09-01T06:15:31.591011705Z", 70.14007626036066], ["2025-09-01T06:15:36.58608956Z", 70.13511460746055], ["2025-09-01T06:15:41.588998234Z", 70.13502295131092], ["2025-09-01T06:15:46.592559186Z", 70.13562788189849], ["2025-09-01T06:15:51.587264363Z", 70.13238936461146], ["2025-09-01T06:15:56.589339233Z", 70.13262767060051], ["2025-09-01T06:16:01.594081723Z", 70.13836534556751], ["2025-09-01T06:16:06.58919583Z", 70.13039126054947], ["2025-09-01T06:16:11.591044558Z", 70.13192497345332], ["2025-09-01T06:16:16.585988474Z", 70.13466243712236], ["2025-09-01T06:16:21.590723008Z", 70.13236492297156], ["2025-09-01T06:16:26.584375318Z", 70.13068456022829], ["2025-09-01T06:16:31.588984337Z", 70.13793761686922], ["2025-09-01T06:16:36.58502312Z", 70.12965801135242], ["2025-09-01T06:16:41.586998811Z", 70.13136892614556], ["2025-09-01T06:16:46.591374391Z", 70.13648944970502], ["2025-09-01T06:16:51.586590188Z", 70.1301101816906], ["2025-09-01T06:16:56.590665075Z", 70.13077010596795], ["2025-09-01T06:17:01.584794612Z", 70.13869530770619], ["2025-09-01T06:17:06.589371201Z", 70.13274987880001], ["2025-09-01T06:17:11.592215164Z", 70.13128949081587], ["2025-09-01T06:17:16.584460056Z", 70.1362205916661], ["2025-09-01T06:17:21.588685686Z", 70.13284764535963], ["2025-09-01T06:17:26.591250963Z", 70.13248102076109], ["2025-09-01T06:17:31.58427035Z", 70.13854865786678], ["2025-09-01T06:17:36.589225288Z", 70.13691106799335], ["2025-09-01T06:17:41.593797443Z", 70.13116728261636], ["2025-09-01T06:17:46.586194625Z", 70.13768709006023], ["2025-09-01T06:17:51.590439979Z", 70.1333548093876], ["2025-09-01T06:17:56.594673312Z", 70.13171721951416], ["2025-09-01T06:18:01.588661948Z", 70.14120057579615], ["2025-09-01T06:18:06.58411037Z", 70.13416138350436], ["2025-09-01T06:18:11.587119244Z", 70.13388030464549], ["2025-09-01T06:18:16.590782293Z", 70.13890306164537], ["2025-09-01T06:18:21.585446534Z", 70.13501073049096], ["2025-09-01T06:18:26.589180107Z", 70.1357745317379], ["2025-09-01T06:18:31.592092116Z", 70.13809037711862], ["2025-09-01T06:18:36.589147797Z", 70.13108784728668], ["2025-09-01T06:18:41.592704314Z", 70.13248102076109], ["2025-09-01T06:18:46.585207504Z", 70.13488241188148], ["2025-09-01T06:18:51.590430315Z", 70.13340980307737], ["2025-09-01T06:18:56.592327191Z", 70.1334525759472], ["2025-09-01T06:19:01.584694975Z", 70.1412616798959], ["2025-09-01T06:19:06.589948681Z", 70.13449745605301], ["2025-09-01T06:19:11.592934332Z", 70.13296374314916], ["2025-09-01T06:19:16.586090094Z", 70.14154275875478], ["2025-09-01T06:19:21.590857961Z", 70.13416138350436], ["2025-09-01T06:19:26.593331073Z", 70.1334036926674], ["2025-09-01T06:19:31.586083334Z", 70.13913525722442], ["2025-09-01T06:19:36.592542087Z", 70.13705771783275], ["2025-09-01T06:19:41.585613885Z", 70.13276821002995], ["2025-09-01T06:19:46.588568998Z", 70.1370454970128], ["2025-09-01T06:19:51.593691669Z", 70.1343263645737], ["2025-09-01T06:19:56.586031833Z", 70.13529791975981], ["2025-09-01T06:20:01.588572724Z", 70.14211713729249], ["2025-09-01T06:20:06.585075479Z", 70.13334258856764], ["2025-09-01T06:20:11.588107574Z", 70.13261544978056], ["2025-09-01T06:20:16.593160488Z", 70.1372226989021], ["2025-09-01T06:20:21.588354889Z", 70.13259711855063], ["2025-09-01T06:20:26.590824087Z", 70.13502295131092], ["2025-09-01T06:20:31.584522876Z", 70.14283205525962], ["2025-09-01T06:20:36.589296898Z", 70.13480908696177], ["2025-09-01T06:20:41.592788834Z", 70.13478464532187], ["2025-09-01T06:20:46.586693592Z", 70.13872585975606], ["2025-09-01T06:20:51.593136846Z", 70.13392307751532], ["2025-09-01T06:20:56.584779718Z", 70.13434469580363], ["2025-09-01T06:21:01.588410698Z", 70.14300314673892], ["2025-09-01T06:21:06.592419466Z", 70.1348763014715], ["2025-09-01T06:21:11.585170492Z", 70.13414916268441], ["2025-09-01T06:21:16.589195824Z", 70.14066897012829], ["2025-09-01T06:21:21.592989107Z", 70.13248713117108], ["2025-09-01T06:21:26.584469706Z", 70.13386808382553], ["2025-09-01T06:21:31.588087395Z", 70.13837756638746], ["2025-09-01T06:21:36.593044502Z", 70.13366032988637], ["2025-09-01T06:21:41.585244124Z", 70.13529180934984], ["2025-09-01T06:21:46.589888196Z", 70.13871363893612], ["2025-09-01T06:21:51.583784509Z", 70.13197385673313], ["2025-09-01T06:21:56.586660784Z", 70.13313483462848], ["2025-09-01T06:22:01.589771206Z", 70.14270373665012], ["2025-09-01T06:22:06.58559842Z", 70.13419804596421], ["2025-09-01T06:22:11.589247604Z", 70.13550567369897], ["2025-09-01T06:22:16.591797549Z", 70.14108447800662], ["2025-09-01T06:22:21.585551585Z", 70.13570731722817], ["2025-09-01T06:22:26.588665672Z", 70.13683163266367], ["2025-09-01T06:22:31.591772094Z", 70.13972185658209], ["2025-09-01T06:22:36.585968421Z", 70.13563399230846], ["2025-09-01T06:22:41.589328654Z", 70.13586618788753], ["2025-09-01T06:22:46.592231576Z", 70.14180550638372], ["2025-09-01T06:22:51.586641896Z", 70.13337925102749], ["2025-09-01T06:22:56.589846282Z", 70.13572564845809], ["2025-09-01T06:23:01.584662533Z", 70.14054676192877]]
+
+    this.chartOption1 = {
+      tooltip: {
+        trigger: 'axis',
+        formatter: function (params: any) {
+          if (Array.isArray(params) && params.length > 0) {
+            const date = new Date(params[0].value[0]);
+            const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;
+
+            let tooltipContent = `${formattedDate}<br/>`;
+            params.forEach(param => {
+              if (param.value && Array.isArray(param.value) && param.value.length === 2) {
+                const valueInKbps = (param.value[1] / 1000).toFixed(1);
+                const dot = `<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${param.color};"></span>`;
+                tooltipContent += `${dot} ${param.seriesName} ${valueInKbps}Kbps<br/>`;
+              }
+            });
+            return tooltipContent;
+          }
+          return '';
+        }
+      },
+      legend: {
+        data: ['Sent', 'Received']
+      },
+      xAxis: {
+        type: 'time',
+        axisLabel: {
+          formatter: '{HH}:{mm}:{ss}'
+        }
+      },
+      yAxis: {
+        type: 'value',
+        name: 'Value (bps)'
+      },
+      series: [
+        {
+          name: 'Sent',
+          data: _data?.throughput?.sent,
+          type: 'line'
+        },
+        {
+          name: 'Received',
+          data: _data?.throughput?.received,
+          type: 'line',
+        }
+      ],
+    }
+
+    this.chartOption2 = {
+      tooltip: {
+        trigger: 'axis',
+        formatter: function (params: any) {
+          if (Array.isArray(params) && params.length > 0) {
+            const date = new Date(params[0].value[0]);
+            const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;
+
+            let tooltipContent = `${formattedDate}<br/>`;
+            params.forEach(param => {
+              if (param.value && Array.isArray(param.value) && param.value.length === 2) {
+                const value = (param.value[1]).toFixed(1);
+                const dot = `<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${param.color};"></span>`;
+                tooltipContent += `${dot} ${param.seriesName} ${value}%<br/>`;
+              }
+            });
+            return tooltipContent;
+          }
+          return '';
+        }
+      },
+      legend: {
+        data: ['CPU']
+      },
+      xAxis: {
+        type: 'time',
+        axisLabel: {
+          formatter: '{HH}:{mm}:{ss}'
+        }
+      },
+      yAxis: {
+        type: 'value',
+        name: 'Value (%)'
+      },
+      series: [
+        {
+          name: 'CPU',
+          data: _data?.cpu,
+          type: 'line'
+        }
+      ],
+    }
+
+    this.chartOption3 = {
+      tooltip: {
+        trigger: 'axis',
+        formatter: function (params: any) {
+          if (Array.isArray(params) && params.length > 0) {
+            const date = new Date(params[0].value[0]);
+            const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;
+
+            let tooltipContent = `${formattedDate}<br/>`;
+            params.forEach(param => {
+              if (param.value && Array.isArray(param.value) && param.value.length === 2) {
+                const value = (param.value[1]).toFixed(1);
+                const dot = `<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${param.color};"></span>`;
+                tooltipContent += `${dot} ${param.seriesName} ${value}%<br/>`;
+              }
+            });
+            return tooltipContent;
+          }
+          return '';
+        }
+      },
+      legend: {
+        data: ['Memory']
+      },
+      xAxis: {
+        type: 'time',
+        axisLabel: {
+          formatter: '{HH}:{mm}:{ss}'
+        }
+      },
+      yAxis: {
+        type: 'value',
+        name: 'Value (%)'
+      },
+      series: [
+        {
+          name: 'Memory',
+          data: _data?.memory,
+          type: 'line'
+        }
+      ],
+    }
+
+    this.chartOption4 = {
+      tooltip: {
+        trigger: 'axis',
+        formatter: function (params: any) {
+          if (Array.isArray(params) && params.length > 0) {
+            const date = new Date(params[0].value[0]);
+            const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;
+
+            let tooltipContent = `${formattedDate}<br/>`;
+            params.forEach(param => {
+              if (param.value && Array.isArray(param.value) && param.value.length === 2) {
+                const value = (param.value[1]).toFixed(1);
+                const dot = `<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${param.color};"></span>`;
+                tooltipContent += `${dot} ${param.seriesName} ${value}%<br/>`;
+              }
+            });
+            return tooltipContent;
+          }
+          return '';
+        }
+      },
+      legend: {
+        data: ['Disk']
+      },
+      xAxis: {
+        type: 'time',
+        axisLabel: {
+          formatter: '{HH}:{mm}:{ss}'
+        }
+      },
+      yAxis: {
+        type: 'value',
+        name: 'Value (%)'
+      },
+      series: [
+        {
+          name: 'Disk',
+          data: _data?.disk,
+          type: 'line'
+        }
+      ],
+    }
+  }
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.html	(working copy)
@@ -0,0 +1,90 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-content>
+    <div class="button-container">
+      <button mat-raised-button (click)="createVAInstance()" matTooltip="Create VA Instance">Create</button>
+    </div>
+    <div class="table-container">
+      <div class="mat-elevation-z0">
+        <table mat-table [dataSource]="dataSource">
+          <ng-container matColumnDef="serial">
+            <th mat-header-cell *matHeaderCellDef>ID</th>
+            <td mat-cell *matCellDef="let element; let i = index;"> {{ i | globalSerial }}</td>
+          </ng-container>
+          <ng-container matColumnDef="vaName">
+            <th mat-header-cell *matHeaderCellDef>VA Name</th>
+            <td mat-cell *matCellDef="let element">
+              <a class="details-page-link" (click)="goToDetails(element)">{{ element?.va_name }}</a>
+            </td>
+          </ng-container>
+          <ng-container matColumnDef="avxName">
+            <th mat-header-cell *matHeaderCellDef>AVX Name</th>
+            <td mat-cell *matCellDef="let element">
+              <a class="details-page-link" (click)="openAVXDetails(element)">{{ element?.avx_name }}</a>
+            </td>
+          </ng-container>
+          <ng-container matColumnDef="ip">
+            <th mat-header-cell *matHeaderCellDef>IP Address</th>
+            <td mat-cell *matCellDef="let element">{{ element?.ip }}</td>
+          </ng-container>
+          <ng-container matColumnDef="productName">
+            <th mat-header-cell *matHeaderCellDef>Product Name</th>
+            <td mat-cell *matCellDef="let element">{{ element?.product_name }}</td>
+          </ng-container>
+          <ng-container matColumnDef="image">
+            <th mat-header-cell *matHeaderCellDef>Image</th>
+            <td mat-cell *matCellDef="let element">
+              <a class="details-page-link" (click)="showVAImageDetails(element)">{{ element?.tgt_name }}</a>
+            </td>
+          </ng-container>
+          <ng-container matColumnDef="status">
+            <th mat-header-cell *matHeaderCellDef>Status</th>
+            <td mat-cell *matCellDef="let element">
+              @if (element.status) {
+                <span class="success-icon">
+                  <fa-icon [icon]="['far', 'check-circle']" matTooltip="Running"></fa-icon> Running
+                </span>
+              } @else {
+                <span class="blue-icon">
+                  <fa-icon [icon]="['far', 'xmark-circle']" matTooltip="Shutdown"></fa-icon> Shutdown
+                </span>
+              }
+            </td>
+          </ng-container>
+          <ng-container matColumnDef="action">
+            <th mat-header-cell *matHeaderCellDef>Action</th>
+            <td mat-cell *matCellDef="let element">
+              <div class="row-action a-link">
+                @if (element?.status) {
+                  <fa-icon [icon]="['far', 'stop-circle']" size="lg" matTooltip="Shutdown" class="blue-icon"
+                           (click)="startShutdownVAInstance(element)"></fa-icon>
+                } @else {
+                  <fa-icon [icon]="['far', 'play-circle']" size="lg" matTooltip="Start" class="success-icon"
+                           (click)="startShutdownVAInstance(element)"></fa-icon>
+                }
+                <fa-icon [icon]="['fas', 'id-badge']" size="lg" matTooltip="Show Instance License"
+                         (click)="showVAInstanceLicense(element)"></fa-icon>
+                <fa-icon [icon]="['fas', 'repeat']" size="lg" matTooltip="Create Backup"
+                         (click)="backupVAInstance(element)"></fa-icon>
+                <fa-icon [icon]="['fas', 'terminal']" size="lg" matTooltip="Show VNC Console"
+                         (click)="showVNCConsole(element)"></fa-icon>
+                <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete Instance"
+                         (click)="deleteVAInstance(element)"></fa-icon>
+              </div>
+            </td>
+          </ng-container>
+          <tr mat-header-row *matHeaderRowDef="dataColumns"></tr>
+          <tr mat-row *matRowDef="let row; columns: dataColumns;"></tr>
+          <tr class="mat-row table-no-data" *matNoDataRow>
+            <td class="mat-cell" colspan="11">No results found.</td>
+          </tr>
+        </table>
+        <mat-paginator
+          [length]="totalRecords"
+          [pageSize]="10"
+          [pageSizeOptions]="[10, 20, 50]"
+        >
+        </mat-paginator>
+      </div>
+    </div>
+  </mat-card-content>
+</mat-card>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxVaInstances } from './avx-va-instances';
+
+describe('AvxVaInstances', () => {
+  let component: AvxVaInstances;
+  let fixture: ComponentFixture<AvxVaInstances>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxVaInstances]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxVaInstances);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/avx-va-instances.ts	(working copy)
@@ -0,0 +1,338 @@
+import {Component, inject, OnInit, ViewChild} from '@angular/core';
+import {SharedModule} from '../../../shared/shared-module';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {AvxService} from '../../../services/avx-service';
+import {NotificationService} from '../../../services/notification';
+import {Confirmation} from '../../../services/confirmation';
+import {take} from 'rxjs/operators';
+import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+import {CreateAVXVABackupDialog} from '../avx-va-backup/avx-va-backup';
+import {UtilsService} from '../../../services/utils-service';
+import {Router} from '@angular/router';
+
+@Component({
+  selector: 'app-avx-va-instances',
+  imports: [SharedModule, GlobalSerialPipe],
+  templateUrl: './avx-va-instances.html',
+  styleUrl: './avx-va-instances.scss'
+})
+export class AvxVaInstances implements OnInit {
+
+  totalRecords: number = 0;
+  dataSource: MatTableDataSource<any> = new MatTableDataSource();
+  dataColumns: string[] = ['serial', 'vaName', 'avxName', 'ip', 'productName', 'image', 'status', 'action'];
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+
+  constructor(
+    private _avx: AvxService,
+    private _notification: NotificationService,
+    private _confirmation: Confirmation,
+    private _router: Router,
+  ) {
+  }
+
+  ngOnInit() {
+    setTimeout(() => {
+      this.getAVXDevices();
+    })
+  }
+
+  avxDevices: any = [];
+
+  getAVXDevices() {
+    this.dataSource.data = [];
+    this.totalRecords = 0;
+    this.avxDevices = [];
+    this._avx.getAVXDevices().pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          result.forEach((device: any) => {
+            this.getAVXVAInstances(device);
+          })
+          this.avxDevices = result;
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  getAVXVAInstances(_device: any) {
+    this.dataSource.data = [];
+    this.totalRecords = 0;
+    this._avx.getAVXVAInstances(_device?.id).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          result.forEach((instance: any) => {
+            instance.avx_name = _device?.name;
+            instance.avx_id = _device?.id;
+            this.dataSource.data.push(instance);
+          })
+        }
+        this.dataSource.paginator = this.paginator;
+        this.totalRecords = this.dataSource.data.length;
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  createVAInstance() {
+    this.dialogConfig.data = {
+      devices: this.avxDevices
+    }
+    const dialogRef = this.dialog.open(CreateAVXVAInstanceDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getAVXDevices();
+      }
+    })
+  }
+
+  goToDetails(_instance: any) {
+    this._router.navigate(['/avx/devices/instances/details', _instance?.avx_name, _instance?.avx_id, _instance?.va_name], {
+      state: {}
+    });
+  }
+
+  openAVXDetails(_instance: any) {
+    this._router.navigate(['/avx/devices/details', _instance?.avx_name, _instance?.avx_id], {
+      state: {}
+    });
+  }
+
+  showVAImageDetails(_instance: any) {
+    this.dialogConfig.data = {
+      instance: _instance
+    }
+    const dialogRef = this.dialog.open(ShowVAImageDetailsDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getAVXDevices();
+      }
+    })
+  }
+
+  startShutdownVAInstance(_instance: any) {
+  }
+
+  showVAInstanceLicense(_instance: any) {
+    this.dialogConfig.data = {
+      instance: _instance
+    }
+    const dialogRef = this.dialog.open(ShowVALicenseDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getAVXDevices();
+      }
+    })
+  }
+
+  backupVAInstance(_instance: any) {}
+
+  showVNCConsole(_instance: any) {}
+
+  deleteVAInstance(_instance: any) {}
+
+}
+
+@Component({
+  selector: 'show-va-image-details',
+  templateUrl: './show-va-image-details.html',
+  imports: [SharedModule],
+})
+export class ShowVAImageDetailsDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<ShowVAImageDetailsDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService,
+    private _avx: AvxService,
+    private _utils: UtilsService,
+  ) {
+  }
+
+  ngOnInit() {
+    setTimeout(() => {
+      this.getAVXDeviceImages()
+    })
+  }
+
+  dataColumns: Array<string> = ['key', 'value'];
+  dataSource = new MatTableDataSource([]);
+
+  getAVXDeviceImages() {
+    this._avx.getAVXDeviceImages(this.data?.instance?.avx_id).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          result.forEach((_image: any) => {
+            if (_image?.image_name === this.data?.instance?.tgt_name) {
+              this.dataSource = this._utils.processConfigData(_image);
+            }
+          })
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
+
+@Component({
+  selector: 'show-va-license',
+  templateUrl: './show-va-license.html',
+  imports: [SharedModule],
+})
+export class ShowVALicenseDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<ShowVALicenseDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService,
+    private _avx: AvxService,
+    private _utils: UtilsService,
+  ) {
+  }
+
+  ngOnInit() {
+    setTimeout(() => {
+      this.getAVXVAInstanceShowVersion()
+    })
+  }
+
+  dataColumns: Array<string> = ['key', 'value'];
+  dataSource = new MatTableDataSource([]);
+
+  getAVXVAInstanceShowVersion() {
+    this._avx.getAVXVAInstanceShowVersion(this.data?.instance?.avx_id, this.data?.instance?.va_name).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          let licenseFields: any = {
+            'Serial Number': result[0].serial,
+            'License Type': this.data?.instance?.type,
+            'License Key': result[0].license_key,
+            'License Status': result[0].license_status,
+            'Expiration Date': result[0].validated_date,
+            'Expiry Date': result[0].expired_date,
+            'Licensed Features': result[0].licensed_features,
+          }
+          this.dataSource = this._utils.processConfigData(licenseFields);
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  updateVALicense() {
+
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
+
+@Component({
+  selector: 'create-avx-va-instance',
+  templateUrl: './create-avx-va-instance.html',
+  imports: [SharedModule],
+})
+export class CreateAVXVAInstanceDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<CreateAVXVAInstanceDialog>);
+  readonly data = inject(MAT_DIALOG_DATA);
+  configForm: FormGroup;
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService,
+    private _avx: AvxService,
+    private _utils: UtilsService,
+  ) {
+    this.configForm = this._fb.group({
+      avxId: [null, [Validators.required]],
+      va_name: ['', [Validators.required]],
+      image_name: ['', [Validators.required]],
+      va_size: ['', [Validators.required]],
+      domain: ['', [Validators.required]],
+    })
+  }
+
+  ngOnInit() {
+    setTimeout(() => {
+    })
+  }
+
+  deviceImages: any = [];
+
+  getAVXDeviceImages() {
+    this.getAVXDeviceSystemInfo();
+    this.deviceImages = [];
+    this._avx.getAVXDeviceImages(this.configForm?.value?.avxId).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.length > 0) {
+          console.log(result);
+          this.deviceImages = result;
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  avxDomains: any = [];
+
+  getAVXDeviceSystemInfo() {
+    this.avxDomains = [];
+    this._avx.getAVXDeviceSystemInfo(this.configForm?.value?.avxId).pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result && result.data) {
+          result?.data?.domain.forEach((_domain: any) => {
+            this.avxDomains.push(_domain?.id);
+          })
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message}`);
+        console.log(error);
+      }
+    });
+  }
+
+  vaSizes: any = [];
+
+  getVASizes() {
+    this.vaSizes = this.configForm.value?.image_name?.size.split(',');
+    console.log(this.vaSizes);
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+
+  onSubmit() {
+
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/create-avx-va-instance.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/create-avx-va-instance.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/create-avx-va-instance.html	(working copy)
@@ -0,0 +1,111 @@
+<h2 mat-dialog-title> Create AVX Instance</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+  >
+    <div class="form-field-wrapper">
+      <label for="avxId" class="form-label">AVX *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="avxId" (selectionChange)="getAVXDeviceImages()">
+          @for (_device of data?.devices; track _device) {
+            <mat-option [value]="_device?.id">{{ _device?.name }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('avxId')?.invalid && configForm.get('avxId')?.touched) {
+          <mat-error>
+            @if (configForm.get('avxId')?.errors?.['required']) {
+              Device is required.
+            } @else {
+              Invalid device format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="va_name" class="form-label">VA Name *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="va_name"
+          formControlName="va_name"
+          matInput
+          placeholder="VA Name"
+          type="text"
+        />
+        @if (configForm.get('va_name')?.invalid && configForm.get('va_name')?.touched) {
+          <mat-error>
+            @if (configForm.get('va_name')?.errors?.['required']) {
+              VA Name is required.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="image_name" class="form-label">Image *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="image_name" (selectionChange)="getVASizes()">
+          @for (_image of deviceImages; track _image) {
+            <mat-option [value]="_image">{{ _image?.image_name }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('image_name')?.invalid && configForm.get('image_name')?.touched) {
+          <mat-error>
+            @if (configForm.get('image_name')?.errors?.['required']) {
+              Image is required.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="va_size" class="form-label">VA Size *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="va_size">
+          @for (_size of vaSizes; track _size) {
+            <mat-option [value]="_size">{{ _size }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('va_size')?.invalid && configForm.get('va_size')?.touched) {
+          <mat-error>
+            @if (configForm.get('va_size')?.errors?.['required']) {
+              VA size is required.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="domain" class="form-label">AVX Domain *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="domain">
+          @for (_domain of avxDomains; track _domain) {
+            <mat-option [value]="_domain">{{ _domain }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('domain')?.invalid && configForm.get('domain')?.touched) {
+          <mat-error>
+            @if (configForm.get('domain')?.errors?.['required']) {
+              Domain is required.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+  </form>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+  <button
+    mat-button
+    color="basic"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/show-va-image-details.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/show-va-image-details.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/show-va-image-details.html	(working copy)
@@ -0,0 +1,20 @@
+<h2 mat-dialog-title> AVX Image - {{ data?.instance?.tgt_name }}</h2>
+<mat-dialog-content>
+  <table mat-table [dataSource]="dataSource" class="mat-elevation-z1">
+    <ng-container matColumnDef="key">
+      <td mat-cell *matCellDef="let element"> {{ element.key }}</td>
+    </ng-container>
+    <ng-container matColumnDef="value">
+      <td mat-cell *matCellDef="let element"> {{ element.value }}</td>
+    </ng-container>
+    <tr mat-row *matRowDef="let row; columns: dataColumns;"></tr>
+  </table>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/show-va-license.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/show-va-license.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-va-instances/show-va-license.html	(working copy)
@@ -0,0 +1,28 @@
+<h2 mat-dialog-title> License - {{ data?.instance?.va_name }}</h2>
+<mat-dialog-content>
+  <p>
+    <span class="blue-icon">Note:</span> vAPV-type VA instances can either share a vAPV license package or solely use an individual license.
+  </p>
+  @if (data?.instance?.type.toLowerCase() === 'individual') {
+    <div class="button-container">
+      <button mat-raised-button (click)="updateVALicense()" matTooltip="Update VA License">Update License</button>
+    </div>
+  }
+  <table mat-table [dataSource]="dataSource" class="mat-elevation-z1">
+    <ng-container matColumnDef="key">
+      <td mat-cell *matCellDef="let element"> {{ element.key }}</td>
+    </ng-container>
+    <ng-container matColumnDef="value">
+      <td mat-cell *matCellDef="let element"> {{ element.value }}</td>
+    </ng-container>
+    <tr mat-row *matRowDef="let row; columns: dataColumns;"></tr>
+  </table>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Close
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/dashboard-system-insights/dashboard-system-insights.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/dashboard-system-insights/dashboard-system-insights.scss	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/dashboard-system-insights/dashboard-system-insights.scss	(working copy)
@@ -1,4 +1,3 @@
-/* dashboard-metric-card.component.css */
 .dashboard-card {
   width: 100%;
   height: 100%;
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/constants/api_urls.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/constants/api_urls.ts	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/constants/api_urls.ts	(working copy)
@@ -155,4 +155,28 @@
   GET_SLB_SERVICES_URL: `${PREFIX}/proxy_req_dev/webui_utils/''`,
   GET_REAL_SERVICES_URL: `${PREFIX}/real_service?role_id=0`,
   UPDATE_SLB_REAL_SERVICE_URL: `${PREFIX}/real_service`,
+  // AVX
+  GET_AVX_DEVICES_URL: `${PREFIX}/api/cm/virtualization/Host/_get_list_data`,
+  ADD_AVX_DEVICE_URL: `${PREFIX}/api/cm/virtualization/Host/_add`,
+  DELETE_AVX_DEVICE_URL: `${PREFIX}/api/cm/virtualization/Host/_delete`,
+  GET_AVX_DEVICE_LOG_SETTINGS_URL: `${PREFIX}/proxy_req_dev/api/avx/admintools/log_mgmt/LogGeneral/_field_group?field_group=general`,
+  GET_AVX_DEVICE_LOGS_URL: `${PREFIX}/proxy_req_dev/api/avx/admintools/logbuf/SysLogBuf/_field_group?field_group=stats`,
+  GET_AVX_DEVICE_CONFIG_URL: `${PREFIX}/proxy_req_dev/api/avx/system/config_mgmt/ViewConfig/_fields`,
+  GET_AVX_DEVICE_SYSTEM_INFO_URL: `${PREFIX}/proxy_req_dev/avx/query_system_info`,
+  GET_AVX_DEVICE_RESOURCE_OCCUPATION_URL: `${PREFIX}/proxy_req_dev/sys_resource_occupation`,
+  GET_AVX_DEVICE_SYSTEM_INFO_OVERVIEW_URL: `${PREFIX}/proxy_req_dev/api/avx/system/SystemInfo/_field_group?field_group=status`,
+  GET_AVX_VA_BACKUP_BY_DEVICE_ID_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VABackup/_get_list_data`,
+  GET_AVX_VA_HOST_BY_DEVICE_ID_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VAInstance/_get_list_data?key=[%22tgt_name%22,%22type%22,%22va_name%22,%22ip%22,%22product_category%22,%22va_size%22,%22status%22,%22va_vncport%22,%22product_name%22,%22vendor%22,%22boottime%22,%22type%22]`,
+  CREATE_AVX_BACKUP_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VAInstance/_perform`,
+  SHUTDOWN_AVX_VA_INSTANCE_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VAInstance/_update/va_name`,
+  DELETE_AVX_VA_BACKUP_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VABackup/_delete`,
+  IMPORT_AVX_VA_BACKUP_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VABackup/_perform`,
+  EXPORT_AVX_VA_BACKUP_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VABackup/_perform`,
+  RESTORE_AVX_VA_BACKUP_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VABackup/_perform`,
+  GET_AVX_IMAGES_URL: `${PREFIX}proxy_req_dev/api/avx/va/image/VAImageManagement/_get_list_data`,
+  GET_AVX_INSTANCE_CONFIG_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/ShowVARunningConfig/_get_asso_list_data`,
+  GET_AVX_INSTANCE_PORT_MAPPING_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/ShowVAPortMapping/_get_asso_list_data`,
+  GET_AVX_INSTANCE_PLATFORM_RESOURCES_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VAInstance/_field_group/va_name/`,
+  GET_AVX_VA_INSTANCE_BASIC_CONFIG_URL: `${PREFIX}/proxy_req_dev/va_basic_config_by_va_run`,
+  GET_AVX_VA_INSTANCE_SHOW_VERSION_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/ShowVAVersion/_get_asso_list_data`,
 } as const; // Makes properties readonly
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.spec.ts	(working copy)
@@ -0,0 +1,17 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpInterceptorFn } from '@angular/common/http';
+
+import { authInterceptorInterceptor } from './auth-interceptor-interceptor';
+
+describe('authInterceptorInterceptor', () => {
+  const interceptor: HttpInterceptorFn = (req, next) => 
+    TestBed.runInInjectionContext(() => authInterceptorInterceptor(req, next));
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+  });
+
+  it('should be created', () => {
+    expect(interceptor).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.ts	(working copy)
@@ -0,0 +1,17 @@
+import { HttpInterceptorFn } from '@angular/common/http';
+import { inject } from '@angular/core';
+import { Auth } from '../services/auth';
+import { catchError, throwError } from 'rxjs';
+
+export const authInterceptorFn: HttpInterceptorFn = (req, next) => {
+  const auth = inject(Auth);
+
+  return next(req).pipe(
+    catchError(error => {
+      if (error.status === 401 || error.status === 403) {
+        auth.logout(true, 'expired');
+      }
+      return throwError(() => error);
+    })
+  );
+};
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/avx-service.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/avx-service.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/avx-service.spec.ts	(working copy)
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { AvxService } from './avx-service';
+
+describe('AvxService', () => {
+  let service: AvxService;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(AvxService);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/avx-service.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/avx-service.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/avx-service.ts	(working copy)
@@ -0,0 +1,199 @@
+import {Injectable} from '@angular/core';
+import {URLS} from '../constants/api_urls';
+import {HttpService} from './http';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class AvxService {
+
+  constructor(private http: HttpService) {
+  }
+
+  getAVXDevices() {
+    return this.http.get(URLS.GET_AVX_DEVICES_URL);
+  }
+
+  getAVXDeviceImages(deviceId: any) {
+    return this.http.get(URLS.GET_AVX_IMAGES_URL, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXVAInstances(deviceId: any) {
+    return this.http.get(URLS.GET_AVX_VA_HOST_BY_DEVICE_ID_URL, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXVAInstanceConfig(deviceId: any, vaName: string) {
+    return this.http.get(`${URLS.GET_AVX_INSTANCE_CONFIG_URL}?initial_filter=%7B%22va_name%22%3A%22${vaName}%22%7D`, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXVAInstancePortMapping(deviceId: any, vaName: string) {
+    return this.http.get(`${URLS.GET_AVX_INSTANCE_PORT_MAPPING_URL}?initial_filter=%7B%22va_name%22%3A%22${vaName}%22%7D`, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXVAInstancePlatformResource(deviceId: any, vaName: string) {
+    return this.http.get(`${URLS.GET_AVX_INSTANCE_PLATFORM_RESOURCES_URL}%22${vaName}%22?field_group=default`, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXVAInstanceShowVersion(deviceId: any, vaName: string) {
+    return this.http.get(`${URLS.GET_AVX_VA_INSTANCE_SHOW_VERSION_URL}?initial_filter=%7B%22va_name%22%3A%22${vaName}%22%7D`, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXVAInstanceBasicConfig(deviceId: string | null, rawPayload: any) {
+    return this.http.post(URLS.GET_AVX_VA_INSTANCE_BASIC_CONFIG_URL, rawPayload, {
+        csrf: true,
+        isFormData: false,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceId},
+        {name: 'Cm-Type', value: 'host'}
+      ]
+    );
+  }
+
+  getAVXVABackups(deviceId: any) {
+    return this.http.get(URLS.GET_AVX_VA_BACKUP_BY_DEVICE_ID_URL, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  createAVXVABackup(deviceId: string | null, rawPayload: any) {
+    return this.http.post(URLS.CREATE_AVX_BACKUP_URL, rawPayload, {
+        csrf: true,
+        isFormData: true,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceId},
+        {name: 'Cm-Type', value: 'host'}
+      ]
+    );
+  }
+
+  deleteAVXVABackup(deviceId: string | null, rawPayload: any) {
+    return this.http.post(URLS.DELETE_AVX_VA_BACKUP_URL, rawPayload, {
+        csrf: true,
+        isFormData: true,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceId},
+        {name: 'Cm-Type', value: 'host'}
+      ]
+    );
+  }
+
+  importAVXVABackup(deviceId: string | null, rawPayload: any) {
+    return this.http.post(URLS.IMPORT_AVX_VA_BACKUP_URL, rawPayload, {
+        csrf: true,
+        isFormData: false,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceId},
+        {name: 'Cm-Type', value: 'host'}
+      ]
+    );
+  }
+
+  exportAVXVABackup(deviceId: string | null, rawPayload: any) {
+    return this.http.post(URLS.EXPORT_AVX_VA_BACKUP_URL, rawPayload, {
+        csrf: true,
+        isFormData: false,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceId},
+        {name: 'Cm-Type', value: 'host'}
+      ]
+    );
+  }
+
+  restoreAVXVABackup(deviceId: string | null, rawPayload: any) {
+    console.log(rawPayload, deviceId);
+    return this.http.post(URLS.RESTORE_AVX_VA_BACKUP_URL, rawPayload, {
+        csrf: true,
+        isFormData: false,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceId},
+        {name: 'Cm-Type', value: 'host'}
+      ]
+    );
+  }
+
+//   shutdown
+// /proxy_req_dev/api/avx/va/instance/VAInstance/_update/va_name/%22vAMP_3_6%22
+//   post_data=%7B%22status%22%3Afalse%7D
+  getAVXDeviceLogSettings(deviceId: any) {
+    return this.http.get(URLS.GET_AVX_DEVICE_LOG_SETTINGS_URL, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXDeviceLog(deviceId: any) {
+    return this.http.get(URLS.GET_AVX_DEVICE_LOGS_URL, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXDeviceConfig(deviceId: any, config: string) {
+    return this.http.get(`${URLS.GET_AVX_DEVICE_CONFIG_URL}?fields=[%22${config}%22]`, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXDeviceSystemInfo(deviceId: any) {
+    return this.http.get(URLS.GET_AVX_DEVICE_SYSTEM_INFO_URL, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXDeviceSystemInfoOverview(deviceId: any) {
+    return this.http.get(URLS.GET_AVX_DEVICE_SYSTEM_INFO_OVERVIEW_URL, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  getAVXDeviceResourceOccupation(deviceId: any) {
+    return this.http.get(URLS.GET_AVX_DEVICE_RESOURCE_OCCUPATION_URL, {}, [
+      {name: 'Cm-Data', value: deviceId},
+      {name: 'Cm-Type', value: 'host'}
+    ]);
+  }
+
+  addAVXDevice(rawPayload: any) {
+    return this.http.post(URLS.ADD_AVX_DEVICE_URL, rawPayload, {
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    });
+  }
+
+  deleteAVXDevice(rawPayload: any) {
+    return this.http.post(URLS.DELETE_AVX_DEVICE_URL, rawPayload, {
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    });
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/utils-service.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/utils-service.ts	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/utils-service.ts	(working copy)
@@ -34,7 +34,12 @@
       'vpn_lic_sess': 'number of licensed vpn sessions',
       'waf_num': 'number of licensed waf devices',
       'expiration_data': "expiration_date",
-      'num': 'Number'
+      'num': 'Number',
+      'compressionhard': 'Compression Hardware',
+      'curtime': 'Current Time',
+      'boottime': 'Boot Time',
+      'Blddate': 'Platform Build Date',
+      'sslhard': 'SSL Hardware',
     };
 
     let processedKey = key;
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts	(working copy)
@@ -33,6 +33,9 @@
   faEye,
   faUpRightAndDownLeftFromCenter,
   faExpand,
+  faFileExport,
+  faClockRotateLeft,
+  faRepeat,
 } from '@fortawesome/free-solid-svg-icons';
 import {
   faBell,
@@ -197,6 +200,9 @@
       faEye,
       faUpRightAndDownLeftFromCenter,
       faExpand,
+      faFileExport,
+      faClockRotateLeft,
+      faRepeat,
     );
   }
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/styles.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/styles.scss	(revision 2700)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/styles.scss	(working copy)
@@ -125,6 +125,9 @@
   color: darkred;
 }
 
+.blue-icon {
+  color: $primary-color;
+}
 
 .action-header {
   text-align: center;
@@ -333,3 +336,11 @@
   color: #fff;
   font-weight: 500;
 }
+
+.card-note {
+  font-size: 12px;
+}
+
+.center {
+  text-align: center;
+}
